Version 2.16.0-80.1.beta

Merge '2.16.0-80.0.dev' into beta
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 981de4b..d50d6f5 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2021-10-26T10:20:01.277340",
+  "generated": "2021-11-15T17:34:02.415038",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
@@ -88,7 +88,7 @@
       "name": "analyzer_cli",
       "rootUri": "../pkg/analyzer_cli",
       "packageUri": "lib/",
-      "languageVersion": "2.7"
+      "languageVersion": "2.14"
     },
     {
       "name": "analyzer_plugin",
@@ -124,7 +124,7 @@
       "name": "bazel_worker",
       "rootUri": "../third_party/pkg/bazel_worker",
       "packageUri": "lib/",
-      "languageVersion": "2.12"
+      "languageVersion": "2.14"
     },
     {
       "name": "benchmark_harness",
@@ -659,7 +659,7 @@
       "name": "stream_channel",
       "rootUri": "../third_party/pkg/stream_channel",
       "packageUri": "lib/",
-      "languageVersion": "2.10"
+      "languageVersion": "2.14"
     },
     {
       "name": "string_scanner",
@@ -710,6 +710,11 @@
       "languageVersion": "2.12"
     },
     {
+      "name": "test_package",
+      "rootUri": "../pkg/vm_service/test/test_package",
+      "languageVersion": "2.12"
+    },
+    {
       "name": "test_process",
       "rootUri": "../third_party/pkg/test_process",
       "packageUri": "lib/",
diff --git a/.packages b/.packages
index 568fa66..f5ea5bc 100644
--- a/.packages
+++ b/.packages
@@ -105,6 +105,7 @@
 test_api:third_party/pkg/test/pkgs/test_api/lib
 test_core:third_party/pkg/test/pkgs/test_core/lib
 test_descriptor:third_party/pkg/test_descriptor/lib
+test_package:pkg/vm_service/test/test_package
 test_process:third_party/pkg/test_process/lib
 test_reflective_loader:third_party/pkg/test_reflective_loader/lib
 test_runner:pkg/test_runner/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 68af803..2c48329 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,41 @@
+## 2.16.0
+
+### Core libraries
+
+#### `dart:core`
+
+- **Breaking Change** [#47653](https://github.com/dart-lang/sdk/issues/47653):
+  On Windows, `Directory.rename` will no longer delete a directory if
+  `newPath` specifies one. Instead, a `FileSystemException` will be thrown.
+
+- Add `Error.throwWithStackTrace` which can `throw` an
+  error with an existing stack trace, instead of creating
+  a new stack trace.
+
+### Tools
+
+#### Dart command line
+
+- **Breaking Change** [#46100](https://github.com/dart-lang/sdk/issues/46100):
+  The standalone `dartanalyzer` tool has been
+  marked deprecated as previously announced.
+  Its replacement is the `dart analyze` command.
+  Should you find any issues, or missing features, in the replacement
+  command, kindly file [an issue][].
+
+[an issue]: https://github.com/dart-lang/sdk/issues/new
+
+#### Linter
+
+Updated the Linter to `1.15.0`, which includes changes that
+- adds new lint: `use_decorated_box`.
+- adds new lint: `no_leading_underscores_for_library_prefixes`.
+- adds new lint: `no_leading_underscores_for_local_identifiers`.
+- adds new lint: `secure_pubspec_urls`.
+- adds new lint: `sized_box_shrink_expand`.
+- adds new lint: `avoid_final_parameters`.
+- improves docs for `omit_local_variable_types`.
+
 ## 2.15.0
 
 ### Language
diff --git a/DEPS b/DEPS
index cb395cc..cec2977 100644
--- a/DEPS
+++ b/DEPS
@@ -39,21 +39,22 @@
 
   # Checked-in SDK version. The checked-in SDK is a Dart SDK distribution in a
   # cipd package used to run Dart scripts in the build and test infrastructure.
-  "sdk_tag": "version:2.15.0-82.0.dev",
+  "sdk_tag": "version:2.15.0-268.8.beta",
 
   # co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
-  "co19_rev": "73545b2bf6c7f8e4eb931bb04d86e38d6485deee",
+  "co19_rev": "4ef349830b971c22d8ddb2970c4ba9002806fd85",
   # This line prevents conflicts when both packages are rolled simultaneously.
-  "co19_2_rev": "52d3d2a6d2550ccd69c8facf8a36099be66f1493",
+  "co19_2_rev": "995745937abffe9fc3a6441f9f0db27b2d706e4c",
 
   # The internal benchmarks to use. See go/dart-benchmarks-internal
   "benchmarks_internal_rev": "076df10d9b77af337f2d8029725787155eb1cd52",
   "checkout_benchmarks_internal": False,
 
   # Checkout Android dependencies only on Mac and Linux.
-  "download_android_deps": 'host_os == "mac" or host_os == "linux"',
+  "download_android_deps":
+    "(host_os == mac or host_os == linux) and host_cpu == x64",
 
   # Checkout extra javascript engines for testing or benchmarking.
   # d8, the V8 shell, is always checked out.
@@ -64,8 +65,8 @@
   # The list of revisions for these tools comes from Fuchsia, here:
   # https://fuchsia.googlesource.com/integration/+/HEAD/prebuilts
   # If there are problems with the toolchain, contact fuchsia-toolchain@.
-  "clang_revision": "f37e8b0b831e61d3b6033829fff05d6d193ab735",
-  "gn_revision": "693f9fb87e4febdd4299db9f73d8d2c958e63148",
+  "clang_revision": "e3a7f0e2f9ab566bd9b71fb54fe77e947b061a12",
+  "gn_revision": "b79031308cc878488202beb99883ec1f2efd9a6d",
 
   # Scripts that make 'git cl format' work.
   "clang_format_scripts_rev": "c09c8deeac31f05bd801995c475e7c8070f9ecda",
@@ -75,11 +76,11 @@
   # Revisions of /third_party/* dependencies.
   "args_rev": "3b3f55766af13d895d2020ec001a28e8dc147f91",
   "async_rev": "80886150a5e6c58006c8ae5a6c2aa7108638e2a9",
-  "bazel_worker_rev": "0885637b037979afbf5bcd05fd748b309fd669c0",
+  "bazel_worker_rev": "ceeba0982d4ff40d32371c9d35f3d2dc1868de20",
   "benchmark_harness_rev": "c546dbd9f639f75cd2f75de8df2eb9f8ea15e8e7",
   "boolean_selector_rev": "665e6921ab246569420376f827bff4585dff0b14",
-  "boringssl_gen_rev": "7322fc15cc065d8d2957fccce6b62a509dc4d641",
-  "boringssl_rev" : "1607f54fed72c6589d560254626909a64124f091",
+  "boringssl_gen_rev": "ced85ef0a00bbca77ce5a91261a5f2ae61b1e62f",
+  "boringssl_rev" : "87f316d7748268eb56f2dc147bd593254ae93198",
   "browser-compat-data_tag": "v1.0.22",
   "browser_launcher_rev": "c6cc1025d6901926cf022e144ba109677e3548f1",
   "characters_rev": "6ec389c4dfa8fce14820dc5cbf6e693202e7e052",
@@ -90,7 +91,7 @@
   "collection_rev": "a4c941ab94044d118b2086a3f261c30377604127",
   "convert_rev": "e063fdca4bebffecbb5e6aa5525995120982d9ce",
   "crypto_rev": "b5024e4de2b1c474dd558bef593ddbf0bfade152",
-  "csslib_rev": "6f35da3d93eb56eb25925779d235858d4090ce6f",
+  "csslib_rev": "02abc1ddf93092efef2be365300f15504d23cd23",
 
   # Note: Updates to dart_style have to be coordinated with the infrastructure
   # team so that the internal formatter `tools/sdks/dart-sdk/bin/dart format`
@@ -106,8 +107,8 @@
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
   "dart_style_rev": "08b0294d0a500d5c02168ef57dcb8868d0c3cb48",
 
-  "dartdoc_rev" : "520e64977de7a87b2fd5be56e5c2e1a58d55bdad",
-  "devtools_rev" : "3a2f570813200e6dee141f3e7a9edcae5f31c2e8",
+  "dartdoc_rev" : "ff0d94bdb87f11c04a7e0ddab811bf94211b08a4",
+  "devtools_rev" : "f2ede24a4ea666d4832d78b813c7d4e376aa77d0",
   "jsshell_tag": "version:88.0",
   "ffi_rev": "4dd32429880a57b64edaf54c9d5af8a9fa9a4ffb",
   "fixnum_rev": "16d3890c6dc82ca629659da1934e412292508bba",
@@ -122,11 +123,11 @@
   "intl_tag": "0.17.0-nullsafety",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_rev": "7e00f893440a72de0637970325e4ea44bd1e8c8e",
-  "linter_tag": "1.14.0",
+  "linter_tag": "1.15.0",
   "lints_tag": "f9670df2a66e0ec12eb51554e70c1cbf56c8f5d0",
   "logging_rev": "575781ef196e4fed4fb737e38fb4b73d62727187",
   "markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
-  "markdown_rev": "9c4beaac96d8f008078e00b027915f81b665d2de",
+  "markdown_rev": "7479783f0493f6717e1d7ae31cb37d39a91026b2",
   "matcher_rev": "6ba4a6d68bdfacff3d572c9ea98333dfc66fd6bf",
   "mime_rev": "c931f4bed87221beaece356494b43731445ce7b8",
   "mockito_rev": "d39ac507483b9891165e422ec98d9fb480037c8b",
@@ -139,7 +140,7 @@
   "pool_rev": "7abe634002a1ba8a0928eded086062f1307ccfae",
   "process_rev": "56ece43b53b64c63ae51ec184b76bd5360c28d0b",
   "protobuf_rev": "c1eb6cb51af39ccbaa1a8e19349546586a5c8e31",
-  "pub_rev": "96404e0749864c9fbf8b12e1d424e8078809e00a",
+  "pub_rev": "dcb6abac2d7d43258c03b348be42bf4aab9529b1",
   "pub_semver_rev": "a43ad72fb6b7869607581b5fedcb186d1e74276a",
   "root_certificates_rev": "692f6d6488af68e0121317a9c2c9eb393eb0ee50",
   "rust_revision": "b7856f695d65a8ebc846754f97d15814bcb1c244",
@@ -153,8 +154,8 @@
   "source_maps_rev": "6499ee3adac8d469e2953e2e8ba4bdb4c2fbef90",
   "source_span_rev": "1be3c44045a06dff840d2ed3a13e6082d7a03a23",
   "sse_rev": "9084339389eb441d0c0518cddac211a097e78657",
-  "stack_trace_rev": "6788afc61875079b71b3d1c3e65aeaa6a25cbc2f",
-  "stream_channel_rev": "d7251e61253ec389ee6e045ee1042311bced8f1d",
+  "stack_trace_rev": "5220580872625ddee41e9ca9a5f3364789b2f0f6",
+  "stream_channel_rev": "3fa3e40c75c210d617b8b943b9b8f580e9866a89",
   "string_scanner_rev": "1b63e6e5db5933d7be0a45da6e1129fe00262734",
   "sync_http_rev": "b59c134f2e34d12acac110d4f17f83e5a7db4330",
   "test_descriptor_rev": "ead23c1e7df079ac0f6457a35f7a71432892e527",
@@ -655,6 +656,15 @@
       ],
           "dep_type": "cipd",
   },
+  Var("dart_root") + "/benchmarks/NativeCall/native/out/": {
+      "packages": [
+          {
+              "package": "dart/benchmarks/nativecall",
+              "version": "w1JKzCIHSfDNIjqnioMUPq0moCXKwX67aUfhyrvw4E0C",
+          },
+      ],
+          "dep_type": "cipd",
+  },
   Var("dart_root") + "/third_party/browsers/chrome": {
       "packages": [
           {
diff --git a/benchmarks/FfiAsTypedList/dart/FfiAsTypedList.dart b/benchmarks/FfiAsTypedList/dart/FfiAsTypedList.dart
new file mode 100644
index 0000000..f32f5d0
--- /dev/null
+++ b/benchmarks/FfiAsTypedList/dart/FfiAsTypedList.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Micro-benchmark for creating TypeData lists from Pointers.
+//
+// The FfiMemory benchmark tests accessing memory through TypedData.
+
+import 'dart:ffi';
+
+import 'package:benchmark_harness/benchmark_harness.dart';
+import 'package:ffi/ffi.dart';
+
+//
+// Benchmark fixture.
+//
+
+// Number of repeats: 1000
+const N = 1000;
+
+class FromPointerInt8 extends BenchmarkBase {
+  Pointer<Int8> pointer = nullptr;
+  FromPointerInt8() : super('FfiAsTypedList.FromPointerInt8');
+
+  @override
+  void setup() => pointer = calloc(1);
+  @override
+  void teardown() => calloc.free(pointer);
+
+  @override
+  void run() {
+    for (var i = 0; i < N; i++) {
+      pointer.asTypedList(1);
+    }
+  }
+}
+
+//
+// Main driver.
+//
+
+void main() {
+  final benchmarks = [
+    () => FromPointerInt8(),
+  ];
+  for (final benchmark in benchmarks) {
+    benchmark().report();
+  }
+}
diff --git a/benchmarks/FfiAsTypedList/dart2/FfiAsTypedList.dart b/benchmarks/FfiAsTypedList/dart2/FfiAsTypedList.dart
new file mode 100644
index 0000000..bab621d
--- /dev/null
+++ b/benchmarks/FfiAsTypedList/dart2/FfiAsTypedList.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Micro-benchmark for creating TypeData lists from Pointers.
+//
+// The FfiMemory benchmark tests accessing memory through TypedData.
+
+// @dart=2.9
+
+import 'dart:ffi';
+
+import 'package:benchmark_harness/benchmark_harness.dart';
+import 'package:ffi/ffi.dart';
+
+//
+// Benchmark fixture.
+//
+
+// Number of repeats: 1000
+const N = 1000;
+
+class FromPointerInt8 extends BenchmarkBase {
+  Pointer<Int8> pointer = nullptr;
+  FromPointerInt8() : super('FfiAsTypedList.FromPointerInt8');
+
+  @override
+  void setup() => pointer = calloc(1);
+  @override
+  void teardown() => calloc.free(pointer);
+
+  @override
+  void run() {
+    for (var i = 0; i < N; i++) {
+      pointer.asTypedList(1);
+    }
+  }
+}
+
+//
+// Main driver.
+//
+
+void main() {
+  final benchmarks = [
+    () => FromPointerInt8(),
+  ];
+  for (final benchmark in benchmarks) {
+    benchmark().report();
+  }
+}
diff --git a/benchmarks/IsolateFibonacci/dart/IsolateFibonacci.dart b/benchmarks/IsolateFibonacci/dart/IsolateFibonacci.dart
index 84b7572..4af3028 100644
--- a/benchmarks/IsolateFibonacci/dart/IsolateFibonacci.dart
+++ b/benchmarks/IsolateFibonacci/dart/IsolateFibonacci.dart
@@ -34,8 +34,7 @@
   final rpRun = ReceivePort();
   final int nWarmup = 17; // enough runs to trigger optimized compilation
   final int nWarmupFactorial = 2584;
-  // With --enable-isolate-groups runs for about 8 seconds.
-  // Should not be run witout --enable-isolate-groups as it would be too slow.
+  // Runs for about 8 seconds.
   final int n = 21;
   final int nFactorial = 17711;
   final beforeRss = ProcessInfo.currentRss;
@@ -48,8 +47,7 @@
   final watch = Stopwatch();
   watch.start();
 
-  // For the benefit of enable-isolate-groups configuration, warm up target
-  // isolate code by running couple iterations in the main isolate.
+  // Warm up code by running a couple iterations in the main isolate.
   await Isolate.spawn(fibonacciRecursive, [rpWarmup.sendPort, nWarmup]);
   Expect.equals(nWarmupFactorial, await rpWarmup.first);
 
@@ -60,7 +58,7 @@
 
   final done = watch.elapsedMicroseconds;
 
-  print('IsolateFibonacci_$n.Calculation(RunTimeRaw): ${done-warmup} us.');
-  print('IsolateFibonacci_$n.DeltaPeak(MemoryUse): ${maxRss-beforeRss}');
+  print('IsolateFibonacci_$n.Calculation(RunTimeRaw): ${done - warmup} us.');
+  print('IsolateFibonacci_$n.DeltaPeak(MemoryUse): ${maxRss - beforeRss}');
   rssTimer.cancel();
 }
diff --git a/benchmarks/IsolateFibonacci/dart2/IsolateFibonacci.dart b/benchmarks/IsolateFibonacci/dart2/IsolateFibonacci.dart
index 84b7572..4af3028 100644
--- a/benchmarks/IsolateFibonacci/dart2/IsolateFibonacci.dart
+++ b/benchmarks/IsolateFibonacci/dart2/IsolateFibonacci.dart
@@ -34,8 +34,7 @@
   final rpRun = ReceivePort();
   final int nWarmup = 17; // enough runs to trigger optimized compilation
   final int nWarmupFactorial = 2584;
-  // With --enable-isolate-groups runs for about 8 seconds.
-  // Should not be run witout --enable-isolate-groups as it would be too slow.
+  // Runs for about 8 seconds.
   final int n = 21;
   final int nFactorial = 17711;
   final beforeRss = ProcessInfo.currentRss;
@@ -48,8 +47,7 @@
   final watch = Stopwatch();
   watch.start();
 
-  // For the benefit of enable-isolate-groups configuration, warm up target
-  // isolate code by running couple iterations in the main isolate.
+  // Warm up code by running a couple iterations in the main isolate.
   await Isolate.spawn(fibonacciRecursive, [rpWarmup.sendPort, nWarmup]);
   Expect.equals(nWarmupFactorial, await rpWarmup.first);
 
@@ -60,7 +58,7 @@
 
   final done = watch.elapsedMicroseconds;
 
-  print('IsolateFibonacci_$n.Calculation(RunTimeRaw): ${done-warmup} us.');
-  print('IsolateFibonacci_$n.DeltaPeak(MemoryUse): ${maxRss-beforeRss}');
+  print('IsolateFibonacci_$n.Calculation(RunTimeRaw): ${done - warmup} us.');
+  print('IsolateFibonacci_$n.DeltaPeak(MemoryUse): ${maxRss - beforeRss}');
   rssTimer.cancel();
 }
diff --git a/benchmarks/IsolateSpawnMemory/dart/IsolateSpawnMemory.dart b/benchmarks/IsolateSpawnMemory/dart/IsolateSpawnMemory.dart
index 1f7b009..0160c03 100644
--- a/benchmarks/IsolateSpawnMemory/dart/IsolateSpawnMemory.dart
+++ b/benchmarks/IsolateSpawnMemory/dart/IsolateSpawnMemory.dart
@@ -158,16 +158,6 @@
 }
 
 // Returns the set of isolate groups for which we should count the heap usage.
-//
-// We have two cases
-//
-//   a) --enable-isolate-groups: All isolates will be within the same isolate
-//   group.
-//
-//   b) --no-enable-isolate-groups: All isolates will be within their own,
-//   separate isolate group.
-//
-// In both cases we want to sum up the heap sizes of all isolate groups.
 Future<List<String>> getGroupIds(vm_service.VmService vmService) async {
   final groupIds = <String>{};
   final vm = await vmService.getVM();
diff --git a/benchmarks/IsolateSpawnMemory/dart2/IsolateSpawnMemory.dart b/benchmarks/IsolateSpawnMemory/dart2/IsolateSpawnMemory.dart
index 115e705..28fee38 100644
--- a/benchmarks/IsolateSpawnMemory/dart2/IsolateSpawnMemory.dart
+++ b/benchmarks/IsolateSpawnMemory/dart2/IsolateSpawnMemory.dart
@@ -160,16 +160,6 @@
 }
 
 // Returns the set of isolate groups for which we should count the heap usage.
-//
-// We have two cases
-//
-//   a) --enable-isolate-groups: All isolates will be within the same isolate
-//   group.
-//
-//   b) --no-enable-isolate-groups: All isolates will be within their own,
-//   separate isolate group.
-//
-// In both cases we want to sum up the heap sizes of all isolate groups.
 Future<List<String>> getGroupIds(vm_service.VmService vmService) async {
   final groupIds = <String>{};
   final vm = await vmService.getVM();
diff --git a/benchmarks/NativeCall/dart/NativeCall.dart b/benchmarks/NativeCall/dart/NativeCall.dart
new file mode 100644
index 0000000..c453038
--- /dev/null
+++ b/benchmarks/NativeCall/dart/NativeCall.dart
@@ -0,0 +1,277 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// These micro benchmarks track the speed of native calls.
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:benchmark_harness/benchmark_harness.dart';
+
+import 'dlopen_helper.dart';
+
+// Number of benchmark iterations per function.
+const N = 1000;
+
+// The native library that holds all the native functions being called.
+final nativeFunctionsLib = dlopenPlatformSpecific('native_functions',
+    path: Platform.script.resolve('../native/out/').path);
+
+final getRootLibraryUrl = nativeFunctionsLib
+    .lookupFunction<Handle Function(), Object Function()>('GetRootLibraryUrl');
+
+final setNativeResolverForTest = nativeFunctionsLib.lookupFunction<
+    Void Function(Handle), void Function(Object)>('SetNativeResolverForTest');
+
+//
+// Benchmark fixtures.
+//
+
+abstract class NativeCallBenchmarkBase extends BenchmarkBase {
+  NativeCallBenchmarkBase(String name) : super(name);
+
+  void expectEquals(actual, expected) {
+    if (actual != expected) {
+      throw Exception('$name: Unexpected result: $actual, expected $expected');
+    }
+  }
+
+  void expectApprox(actual, expected) {
+    if (0.999 * expected > actual || actual > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $actual, expected $expected');
+    }
+  }
+
+  void expectIdentical(actual, expected) {
+    if (!identical(actual, expected)) {
+      throw Exception('$name: Unexpected result: $actual, expected $expected');
+    }
+  }
+}
+
+class Uint8x01 extends NativeCallBenchmarkBase {
+  Uint8x01() : super('NativeCall.Uint8x01');
+
+  @pragma('vm:external-name', 'Function1Uint8')
+  external static int f(int a);
+
+  @override
+  void run() {
+    int x = 0;
+    for (int i = 0; i < N; i++) {
+      x += f(17);
+    }
+    expectEquals(x, N * 17 + N * 42);
+  }
+}
+
+class Int64x20 extends NativeCallBenchmarkBase {
+  Int64x20() : super('NativeCall.Int64x20');
+
+  @pragma('vm:external-name', 'Function20Int64')
+  external static int f(
+      int a,
+      int b,
+      int c,
+      int d,
+      int e,
+      int f,
+      int g,
+      int h,
+      int i,
+      int j,
+      int k,
+      int l,
+      int m,
+      int n,
+      int o,
+      int p,
+      int q,
+      int r,
+      int s,
+      int t);
+
+  @override
+  void run() {
+    int x = 0;
+    for (int i = 0; i < N; i++) {
+      x += f(i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i);
+    }
+    expectEquals(x, N * (N - 1) * 20 / 2);
+  }
+}
+
+class Doublex01 extends NativeCallBenchmarkBase {
+  Doublex01() : super('NativeCall.Doublex01');
+
+  @pragma('vm:external-name', 'Function1Double')
+  external static double f(double a);
+
+  @override
+  void run() {
+    double x = 0.0;
+    for (int i = 0; i < N; i++) {
+      x += f(17.0);
+    }
+    final double expected = N * (17.0 + 42.0);
+    expectApprox(x, expected);
+  }
+}
+
+class Doublex20 extends NativeCallBenchmarkBase {
+  Doublex20() : super('NativeCall.Doublex20');
+
+  @pragma('vm:external-name', 'Function20Double')
+  external static double f(
+      double a,
+      double b,
+      double c,
+      double d,
+      double e,
+      double f,
+      double g,
+      double h,
+      double i,
+      double j,
+      double k,
+      double l,
+      double m,
+      double n,
+      double o,
+      double p,
+      double q,
+      double r,
+      double s,
+      double t);
+
+  @override
+  void run() {
+    double x = 0;
+    for (int i = 0; i < N; i++) {
+      x += f(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0,
+          13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0);
+    }
+    final double expected = N *
+        (1.0 +
+            2.0 +
+            3.0 +
+            4.0 +
+            5.0 +
+            6.0 +
+            7.0 +
+            8.0 +
+            9.0 +
+            10.0 +
+            11.0 +
+            12.0 +
+            13.0 +
+            14.0 +
+            15.0 +
+            16.0 +
+            17.0 +
+            18.0 +
+            19.0 +
+            20.0);
+    expectApprox(x, expected);
+  }
+}
+
+class MyClass {
+  int a;
+  MyClass(this.a);
+}
+
+class Handlex01 extends NativeCallBenchmarkBase {
+  Handlex01() : super('NativeCall.Handlex01');
+
+  @pragma('vm:external-name', 'Function1Handle')
+  external static Object f(Object a);
+
+  @override
+  void run() {
+    final p1 = MyClass(123);
+    Object x = p1;
+    for (int i = 0; i < N; i++) {
+      x = f(x);
+    }
+    expectIdentical(x, p1);
+  }
+}
+
+class Handlex20 extends NativeCallBenchmarkBase {
+  Handlex20() : super('NativeCall.Handlex20');
+
+  @pragma('vm:external-name', 'Function20Handle')
+  external static Object f(
+      Object a,
+      Object b,
+      Object c,
+      Object d,
+      Object e,
+      Object f,
+      Object g,
+      Object h,
+      Object i,
+      Object j,
+      Object k,
+      Object l,
+      Object m,
+      Object n,
+      Object o,
+      Object p,
+      Object q,
+      Object r,
+      Object s,
+      Object t);
+
+  @override
+  void run() {
+    final p1 = MyClass(123);
+    final p2 = MyClass(2);
+    final p3 = MyClass(3);
+    final p4 = MyClass(4);
+    final p5 = MyClass(5);
+    final p6 = MyClass(6);
+    final p7 = MyClass(7);
+    final p8 = MyClass(8);
+    final p9 = MyClass(9);
+    final p10 = MyClass(10);
+    final p11 = MyClass(11);
+    final p12 = MyClass(12);
+    final p13 = MyClass(13);
+    final p14 = MyClass(14);
+    final p15 = MyClass(15);
+    final p16 = MyClass(16);
+    final p17 = MyClass(17);
+    final p18 = MyClass(18);
+    final p19 = MyClass(19);
+    final p20 = MyClass(20);
+    Object x = p1;
+    for (int i = 0; i < N; i++) {
+      x = f(x, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15,
+          p16, p17, p18, p19, p20);
+    }
+    expectIdentical(x, p1);
+  }
+}
+
+//
+// Main driver.
+//
+
+void main() {
+  setNativeResolverForTest(getRootLibraryUrl());
+
+  final benchmarks = [
+    () => Uint8x01(),
+    () => Int64x20(),
+    () => Doublex01(),
+    () => Doublex20(),
+    () => Handlex01(),
+    () => Handlex20(),
+  ];
+  for (final benchmark in benchmarks) {
+    benchmark().report();
+  }
+}
diff --git a/benchmarks/NativeCall/dart/dlopen_helper.dart b/benchmarks/NativeCall/dart/dlopen_helper.dart
new file mode 100644
index 0000000..7e6129e
--- /dev/null
+++ b/benchmarks/NativeCall/dart/dlopen_helper.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. 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:ffi';
+import 'dart:io';
+
+const arm = 'arm';
+const arm64 = 'arm64';
+const ia32 = 'ia32';
+const x64 = 'x64';
+
+// https://stackoverflow.com/questions/45125516/possible-values-for-uname-m
+final _unames = {
+  'arm': arm,
+  'aarch64_be': arm64,
+  'aarch64': arm64,
+  'armv8b': arm64,
+  'armv8l': arm64,
+  'i386': ia32,
+  'i686': ia32,
+  'x86_64': x64,
+};
+
+String _checkRunningMode(String architecture) {
+  // Check if we're running in 32bit mode.
+  final int pointerSize = sizeOf<IntPtr>();
+  if (pointerSize == 4 && architecture == x64) return ia32;
+  if (pointerSize == 4 && architecture == arm64) return arm;
+
+  return architecture;
+}
+
+String _architecture() {
+  final String uname = Process.runSync('uname', ['-m']).stdout.trim();
+  final String? architecture = _unames[uname];
+  if (architecture == null) {
+    throw Exception('Unrecognized architecture: "$uname"');
+  }
+
+  // Check if we're running in 32bit mode.
+  return _checkRunningMode(architecture);
+}
+
+String _platformPath(String name, String path) {
+  if (Platform.isMacOS || Platform.isIOS) {
+    return '${path}mac/${_architecture()}/lib$name.dylib';
+  }
+
+  if (Platform.isWindows) {
+    return '${path}win/${_checkRunningMode(x64)}/$name.dll';
+  }
+
+  // Unknown platforms default to Unix implementation.
+  return '${path}linux/${_architecture()}/lib$name.so';
+}
+
+DynamicLibrary dlopenPlatformSpecific(String name, {String path = ''}) {
+  final String fullPath = _platformPath(name, path);
+  return DynamicLibrary.open(fullPath);
+}
diff --git a/benchmarks/NativeCall/dart2/NativeCall.dart b/benchmarks/NativeCall/dart2/NativeCall.dart
new file mode 100644
index 0000000..c2dbf13
--- /dev/null
+++ b/benchmarks/NativeCall/dart2/NativeCall.dart
@@ -0,0 +1,279 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// These micro benchmarks track the speed of native calls.
+
+// @dart=2.9
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:benchmark_harness/benchmark_harness.dart';
+
+import 'dlopen_helper.dart';
+
+// Number of benchmark iterations per function.
+const N = 1000;
+
+// The native library that holds all the native functions being called.
+final nativeFunctionsLib = dlopenPlatformSpecific('native_functions',
+    path: Platform.script.resolve('../native/out/').path);
+
+final getRootLibraryUrl = nativeFunctionsLib
+    .lookupFunction<Handle Function(), Object Function()>('GetRootLibraryUrl');
+
+final setNativeResolverForTest = nativeFunctionsLib.lookupFunction<
+    Void Function(Handle), void Function(Object)>('SetNativeResolverForTest');
+
+//
+// Benchmark fixtures.
+//
+
+abstract class NativeCallBenchmarkBase extends BenchmarkBase {
+  NativeCallBenchmarkBase(String name) : super(name);
+
+  void expectEquals(actual, expected) {
+    if (actual != expected) {
+      throw Exception('$name: Unexpected result: $actual, expected $expected');
+    }
+  }
+
+  void expectApprox(actual, expected) {
+    if (0.999 * expected > actual || actual > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $actual, expected $expected');
+    }
+  }
+
+  void expectIdentical(actual, expected) {
+    if (!identical(actual, expected)) {
+      throw Exception('$name: Unexpected result: $actual, expected $expected');
+    }
+  }
+}
+
+class Uint8x01 extends NativeCallBenchmarkBase {
+  Uint8x01() : super('NativeCall.Uint8x01');
+
+  @pragma('vm:external-name', 'Function1Uint8')
+  external static int f(int a);
+
+  @override
+  void run() {
+    int x = 0;
+    for (int i = 0; i < N; i++) {
+      x += f(17);
+    }
+    expectEquals(x, N * 17 + N * 42);
+  }
+}
+
+class Int64x20 extends NativeCallBenchmarkBase {
+  Int64x20() : super('NativeCall.Int64x20');
+
+  @pragma('vm:external-name', 'Function20Int64')
+  external static int f(
+      int a,
+      int b,
+      int c,
+      int d,
+      int e,
+      int f,
+      int g,
+      int h,
+      int i,
+      int j,
+      int k,
+      int l,
+      int m,
+      int n,
+      int o,
+      int p,
+      int q,
+      int r,
+      int s,
+      int t);
+
+  @override
+  void run() {
+    int x = 0;
+    for (int i = 0; i < N; i++) {
+      x += f(i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i);
+    }
+    expectEquals(x, N * (N - 1) * 20 / 2);
+  }
+}
+
+class Doublex01 extends NativeCallBenchmarkBase {
+  Doublex01() : super('NativeCall.Doublex01');
+
+  @pragma('vm:external-name', 'Function1Double')
+  external static double f(double a);
+
+  @override
+  void run() {
+    double x = 0.0;
+    for (int i = 0; i < N; i++) {
+      x += f(17.0);
+    }
+    final double expected = N * (17.0 + 42.0);
+    expectApprox(x, expected);
+  }
+}
+
+class Doublex20 extends NativeCallBenchmarkBase {
+  Doublex20() : super('NativeCall.Doublex20');
+
+  @pragma('vm:external-name', 'Function20Double')
+  external static double f(
+      double a,
+      double b,
+      double c,
+      double d,
+      double e,
+      double f,
+      double g,
+      double h,
+      double i,
+      double j,
+      double k,
+      double l,
+      double m,
+      double n,
+      double o,
+      double p,
+      double q,
+      double r,
+      double s,
+      double t);
+
+  @override
+  void run() {
+    double x = 0;
+    for (int i = 0; i < N; i++) {
+      x += f(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0,
+          13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0);
+    }
+    final double expected = N *
+        (1.0 +
+            2.0 +
+            3.0 +
+            4.0 +
+            5.0 +
+            6.0 +
+            7.0 +
+            8.0 +
+            9.0 +
+            10.0 +
+            11.0 +
+            12.0 +
+            13.0 +
+            14.0 +
+            15.0 +
+            16.0 +
+            17.0 +
+            18.0 +
+            19.0 +
+            20.0);
+    expectApprox(x, expected);
+  }
+}
+
+class MyClass {
+  int a;
+  MyClass(this.a);
+}
+
+class Handlex01 extends NativeCallBenchmarkBase {
+  Handlex01() : super('NativeCall.Handlex01');
+
+  @pragma('vm:external-name', 'Function1Handle')
+  external static Object f(Object a);
+
+  @override
+  void run() {
+    final p1 = MyClass(123);
+    Object x = p1;
+    for (int i = 0; i < N; i++) {
+      x = f(x);
+    }
+    expectIdentical(x, p1);
+  }
+}
+
+class Handlex20 extends NativeCallBenchmarkBase {
+  Handlex20() : super('NativeCall.Handlex20');
+
+  @pragma('vm:external-name', 'Function20Handle')
+  external static Object f(
+      Object a,
+      Object b,
+      Object c,
+      Object d,
+      Object e,
+      Object f,
+      Object g,
+      Object h,
+      Object i,
+      Object j,
+      Object k,
+      Object l,
+      Object m,
+      Object n,
+      Object o,
+      Object p,
+      Object q,
+      Object r,
+      Object s,
+      Object t);
+
+  @override
+  void run() {
+    final p1 = MyClass(123);
+    final p2 = MyClass(2);
+    final p3 = MyClass(3);
+    final p4 = MyClass(4);
+    final p5 = MyClass(5);
+    final p6 = MyClass(6);
+    final p7 = MyClass(7);
+    final p8 = MyClass(8);
+    final p9 = MyClass(9);
+    final p10 = MyClass(10);
+    final p11 = MyClass(11);
+    final p12 = MyClass(12);
+    final p13 = MyClass(13);
+    final p14 = MyClass(14);
+    final p15 = MyClass(15);
+    final p16 = MyClass(16);
+    final p17 = MyClass(17);
+    final p18 = MyClass(18);
+    final p19 = MyClass(19);
+    final p20 = MyClass(20);
+    Object x = p1;
+    for (int i = 0; i < N; i++) {
+      x = f(x, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15,
+          p16, p17, p18, p19, p20);
+    }
+    expectIdentical(x, p1);
+  }
+}
+
+//
+// Main driver.
+//
+
+void main() {
+  setNativeResolverForTest(getRootLibraryUrl());
+
+  final benchmarks = [
+    () => Uint8x01(),
+    () => Int64x20(),
+    () => Doublex01(),
+    () => Doublex20(),
+    () => Handlex01(),
+    () => Handlex20(),
+  ];
+  for (final benchmark in benchmarks) {
+    benchmark().report();
+  }
+}
diff --git a/benchmarks/NativeCall/dart2/dlopen_helper.dart b/benchmarks/NativeCall/dart2/dlopen_helper.dart
new file mode 100644
index 0000000..e6e3bfa
--- /dev/null
+++ b/benchmarks/NativeCall/dart2/dlopen_helper.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.9
+
+import 'dart:ffi';
+import 'dart:io';
+
+const arm = 'arm';
+const arm64 = 'arm64';
+const ia32 = 'ia32';
+const x64 = 'x64';
+
+// https://stackoverflow.com/questions/45125516/possible-values-for-uname-m
+final _unames = {
+  'arm': arm,
+  'aarch64_be': arm64,
+  'aarch64': arm64,
+  'armv8b': arm64,
+  'armv8l': arm64,
+  'i386': ia32,
+  'i686': ia32,
+  'x86_64': x64,
+};
+
+String _checkRunningMode(String architecture) {
+  // Check if we're running in 32bit mode.
+  final int pointerSize = sizeOf<IntPtr>();
+  if (pointerSize == 4 && architecture == x64) return ia32;
+  if (pointerSize == 4 && architecture == arm64) return arm;
+
+  return architecture;
+}
+
+String _architecture() {
+  final String uname = Process.runSync('uname', ['-m']).stdout.trim();
+  final String architecture = _unames[uname];
+  if (architecture == null) {
+    throw Exception('Unrecognized architecture: "$uname"');
+  }
+
+  // Check if we're running in 32bit mode.
+  return _checkRunningMode(architecture);
+}
+
+String _platformPath(String name, {String path = ''}) {
+  if (Platform.isMacOS || Platform.isIOS) {
+    return '${path}mac/${_architecture()}/lib$name.dylib';
+  }
+
+  if (Platform.isWindows) {
+    return '${path}win/${_checkRunningMode(x64)}/$name.dll';
+  }
+
+  // Unknown platforms default to Unix implementation.
+  return '${path}linux/${_architecture()}/lib$name.so';
+}
+
+DynamicLibrary dlopenPlatformSpecific(String name, {String path}) {
+  final String fullPath = _platformPath(name, path: path);
+  return DynamicLibrary.open(fullPath);
+}
diff --git a/benchmarks/NativeCall/native/.gitignore b/benchmarks/NativeCall/native/.gitignore
new file mode 100644
index 0000000..e778c6f
--- /dev/null
+++ b/benchmarks/NativeCall/native/.gitignore
@@ -0,0 +1,5 @@
+# Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+out/
diff --git a/benchmarks/NativeCall/native/Makefile b/benchmarks/NativeCall/native/Makefile
new file mode 100644
index 0000000..9a2eb44
--- /dev/null
+++ b/benchmarks/NativeCall/native/Makefile
@@ -0,0 +1,57 @@
+# Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+# for 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(37531): Remove this makefile and build with sdk instead when
+# benchmark runner gets support for that.
+
+CC=gcc
+CCARM=arm-linux-gnueabihf-gcc
+CCARM64=aarch64-linux-gnu-gcc
+CFLAGS=-Wall -g -O -fPIC -I../../../runtime/
+
+.PHONY: all clean
+
+all: out/linux/x64/libnative_functions.so out/linux/ia32/libnative_functions.so out/linux/arm64/libnative_functions.so out/linux/arm/libnative_functions.so
+
+cipd:
+	cipd create -name dart/benchmarks/nativecall -in out -install-mode copy
+
+clean:
+	rm -rf *.o *.so out
+
+out/linux/x64:
+	mkdir -p out/linux/x64
+
+out/linux/x64/native_functions.o: native_functions.c | out/linux/x64
+	$(CC) $(CFLAGS) -c -o $@ native_functions.c
+
+out/linux/x64/libnative_functions.so: out/linux/x64/native_functions.o
+	$(CC) $(CFLAGS) -s -shared -o $@ out/linux/x64/native_functions.o
+
+out/linux/ia32:
+	mkdir -p out/linux/ia32
+
+out/linux/ia32/native_functions.o: native_functions.c | out/linux/ia32
+	$(CC) $(CFLAGS) -m32 -c -o $@ native_functions.c
+
+out/linux/ia32/libnative_functions.so: out/linux/ia32/native_functions.o
+	$(CC) $(CFLAGS) -m32 -s -shared -o $@ out/linux/ia32/native_functions.o
+
+out/linux/arm64:
+	mkdir -p out/linux/arm64
+
+out/linux/arm64/native_functions.o: native_functions.c | out/linux/arm64
+	$(CCARM64) $(CFLAGS) -c -o $@ native_functions.c
+
+out/linux/arm64/libnative_functions.so: out/linux/arm64/native_functions.o
+	$(CCARM64) $(CFLAGS) -s -shared -o $@ out/linux/arm64/native_functions.o
+
+out/linux/arm:
+	mkdir -p out/linux/arm
+
+out/linux/arm/native_functions.o: native_functions.c | out/linux/arm
+	$(CCARM) $(CFLAGS) -c -o $@ native_functions.c
+
+out/linux/arm/libnative_functions.so: out/linux/arm/native_functions.o
+	$(CCARM) $(CFLAGS) -s -shared -o $@ out/linux/arm/native_functions.o
diff --git a/benchmarks/NativeCall/native/native_functions.c b/benchmarks/NativeCall/native/native_functions.c
new file mode 100644
index 0000000..c19251d
--- /dev/null
+++ b/benchmarks/NativeCall/native/native_functions.c
@@ -0,0 +1,119 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+// TODO(dartbug.com/40579): This requires static linking to either link
+// dart.exe or dart_precompiled_runtime.exe on Windows.
+// The sample currently fails on Windows in AOT mode.
+#include "include/dart_api.h"
+
+#define ENSURE(X)                                                              \
+  if (!(X)) {                                                                  \
+    fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, "Check failed: " #X);   \
+    exit(1);                                                                   \
+  }
+
+#define ENSURE_VALID(X) ENSURE(!Dart_IsError(X))
+
+//
+// Functions under test.
+//
+
+void Function1Uint8(Dart_NativeArguments args) {
+  int64_t arg = 0;
+  Dart_GetNativeIntegerArgument(args, /*index=*/0, &arg);
+  Dart_SetIntegerReturnValue(args, arg + 42);
+}
+
+void Function20Int64(Dart_NativeArguments args) {
+  int64_t arg = 0;
+  int64_t result = 0;
+  for (int i = 0; i < 20; i++) {
+    Dart_GetNativeIntegerArgument(args, /*index=*/i, &arg);
+    result += arg;
+  }
+  Dart_SetIntegerReturnValue(args, result);
+}
+
+void Function1Double(Dart_NativeArguments args) {
+  double arg = 0.0;
+  Dart_GetNativeDoubleArgument(args, /*index=*/0, &arg);
+  Dart_SetDoubleReturnValue(args, arg + 42.0);
+}
+
+void Function20Double(Dart_NativeArguments args) {
+  double arg = 0;
+  double result = 0;
+  for (int i = 0; i < 20; i++) {
+    Dart_GetNativeDoubleArgument(args, /*index=*/i, &arg);
+    result += arg;
+  }
+  Dart_SetDoubleReturnValue(args, result);
+}
+
+void Function1Handle(Dart_NativeArguments args) {
+  Dart_Handle arg = Dart_GetNativeArgument(args, /*index=*/0);
+  Dart_SetReturnValue(args, arg);
+}
+
+void Function20Handle(Dart_NativeArguments args) {
+  Dart_Handle arg = Dart_GetNativeArgument(args, /*index=*/0);
+  Dart_SetReturnValue(args, arg);
+}
+
+//
+// Test helpers.
+//
+
+DART_EXPORT Dart_Handle GetRootLibraryUrl() {
+  Dart_Handle root_lib = Dart_RootLibrary();
+  Dart_Handle lib_url = Dart_LibraryUrl(root_lib);
+  ENSURE_VALID(lib_url);
+  return lib_url;
+}
+
+Dart_NativeFunction NativeEntryResolver(Dart_Handle name,
+                                        int num_of_arguments,
+                                        bool* auto_setup_scope) {
+  ENSURE(Dart_IsString(name));
+
+  ENSURE(auto_setup_scope != NULL);
+  *auto_setup_scope = true;
+
+  const char* name_str = NULL;
+  ENSURE_VALID(Dart_StringToCString(name, &name_str));
+
+  if (strcmp(name_str, "Function1Uint8") == 0 && num_of_arguments == 1) {
+    return &Function1Uint8;
+  } else if (strcmp(name_str, "Function20Int64") == 0 &&
+             num_of_arguments == 20) {
+    return &Function20Int64;
+  } else if (strcmp(name_str, "Function1Double") == 0 &&
+             num_of_arguments == 1) {
+    return &Function1Double;
+  } else if (strcmp(name_str, "Function20Double") == 0 &&
+             num_of_arguments == 20) {
+    return &Function20Double;
+  } else if (strcmp(name_str, "Function1Handle") == 0 &&
+             num_of_arguments == 1) {
+    return &Function1Handle;
+  } else if (strcmp(name_str, "Function20Handle") == 0 &&
+             num_of_arguments == 20) {
+    return &Function20Handle;
+  }
+
+  // Unreachable in benchmark.
+  ENSURE(false);
+}
+
+DART_EXPORT void SetNativeResolverForTest(Dart_Handle url) {
+  Dart_Handle library = Dart_LookupLibrary(url);
+  ENSURE_VALID(library);
+  Dart_Handle result =
+      Dart_SetNativeResolver(library, &NativeEntryResolver, NULL);
+  ENSURE_VALID(result);
+}
diff --git a/build/mac/find_sdk.py b/build/mac/find_sdk.py
index d2bf424..e28244a 100755
--- a/build/mac/find_sdk.py
+++ b/build/mac/find_sdk.py
@@ -96,19 +96,16 @@
     if job.returncode != 0:
         print(out, file=sys.stderr)
         print(err, file=sys.stderr)
-        raise Exception((
-            'Error %d running xcode-select, you might have to run '
-            '|sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer| '
-            'if you are using Xcode 4.') % job.returncode)
-    # The Developer folder moved in Xcode 4.3.
-    xcode43_sdk_path = os.path.join(out.rstrip(),
-                                    'Platforms/MacOSX.platform/Developer/SDKs')
-    if os.path.isdir(xcode43_sdk_path):
-        sdk_dir = xcode43_sdk_path
-    else:
-        sdk_dir = os.path.join(out.rstrip(), 'SDKs')
+        raise Exception('Error %d running xcode-select' % job.returncode)
+    sdk_dir = os.path.join(out.rstrip(),
+                           'Platforms/MacOSX.platform/Developer/SDKs')
+    if not os.path.isdir(sdk_dir):
+        raise Exception(
+            'Install Xcode, launch it, accept the license ' +
+            'agreement, and run `sudo xcode-select -s /path/to/Xcode.app` ' +
+            'to continue.')
     sdks = [
-        re.findall('^MacOSX(1[01]\.\d+)\.sdk$', s) for s in os.listdir(sdk_dir)
+        re.findall('^MacOSX(\d+\.\d+)\.sdk$', s) for s in os.listdir(sdk_dir)
     ]
     sdks = [s[0] for s in sdks if s]  # [['10.5'], ['10.6']] => ['10.5', '10.6']
     sdks = [
diff --git a/docs/process/breaking-changes.md b/docs/process/breaking-changes.md
index 64a0df4..4ea8bda 100644
--- a/docs/process/breaking-changes.md
+++ b/docs/process/breaking-changes.md
@@ -53,7 +53,8 @@
 
 ### Step 1: Announcement
 
-* Create an issue in the Dart SDK issue tracker labelled
+* Create an issue in the
+  [Dart SDK issue tracker](https://github.com/dart-lang/sdk/issues) labelled
   `breaking-change-request` containing the following:
 
   * The intended change in behavior.
@@ -64,8 +65,6 @@
 
   * Clear steps for mitigating the change.
 
-[TODO: Link to an issue template for this]
-
 * Email Dart Announce (`announce@dartlang.org`):
 
   * Subject: 'Breaking change [bug ID]: [short summary]'
@@ -77,7 +76,7 @@
   * A request that developers may leave comments in the linked issue, if this
     breaking change poses a severe problem.
 
-Once you have sent the announce email, please let @devoncarew know in order
+Once you have sent the announce email, please let devoncarew@ know in order
 to start the review and approval process.
 
 ### Step 2: Approval
@@ -119,7 +118,7 @@
   * The impact of the change was significantly larger than described in the
     breaking change announcement
 
-, then they may file a 'request for roll-back' using the following steps:
+Then they may file a 'request for roll-back' using the following steps:
 
 * Create an issue in the Dart SDK issue tracker labelled
   `roll-back-request` containing the following:
@@ -132,8 +131,6 @@
   * A link to the program that was affected, or another program that illustrated
     the same effect.
 
-[TODO: Link to an issue template for this]
-
 Upon receiving such an issue the Dart SDK team will either:
 
   * Roll-back the change, or
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 5e5e650..7cfb915 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -2768,6 +2768,16 @@
     problemMessage: r"""An enum declaration can't be empty.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeEnumDeclaresFactory = messageEnumDeclaresFactory;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageEnumDeclaresFactory = const MessageCode(
+    "EnumDeclaresFactory",
+    problemMessage: r"""Enums can't declare factory constructors.""",
+    correctionMessage:
+        r"""Try removing the factory constructor declaration.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeEnumInClass = messageEnumInClass;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5661,6 +5671,17 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeInternalProblemOmittedTypeNameInConstructorReference =
+    messageInternalProblemOmittedTypeNameInConstructorReference;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageInternalProblemOmittedTypeNameInConstructorReference =
+    const MessageCode("InternalProblemOmittedTypeNameInConstructorReference",
+        severity: Severity.internalProblem,
+        problemMessage:
+            r"""Unsupported omission of the type name in a constructor reference outside of an enum element declaration.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInternalProblemPreviousTokenNotFound =
     messageInternalProblemPreviousTokenNotFound;
 
@@ -9387,7 +9408,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSuperInitializerNotLast = const MessageCode(
     "SuperInitializerNotLast",
-    analyzerCodes: <String>["INVALID_SUPER_INVOCATION"],
+    analyzerCodes: <String>["SUPER_INVOCATION_NOT_LAST"],
     problemMessage: r"""Can't have initializers after 'super'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/declaration_kind.dart b/pkg/_fe_analyzer_shared/lib/src/parser/declaration_kind.dart
index 7037020..1efc9da 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/declaration_kind.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/declaration_kind.dart
@@ -14,4 +14,7 @@
 
   /// An extension declaration.
   Extension,
+
+  /// An enum.
+  Enum,
 }
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
index 042507d..c60aa80 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
@@ -636,8 +636,66 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
-    listener?.endEnum(enumKeyword, leftBrace, count);
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
+    listener?.endEnum(enumKeyword, leftBrace, memberCount);
+  }
+
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    listener?.endEnumConstructor(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
+  }
+
+  @override
+  void handleEnumElement(Token beginToken) {
+    listener?.handleEnumElement(beginToken);
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    listener?.handleEnumElements(elementsEndToken, elementsCount);
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    listener?.handleEnumHeader(enumKeyword, leftBrace);
+  }
+
+  @override
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    listener?.endEnumFactoryMethod(beginToken, factoryKeyword, endToken);
+  }
+
+  @override
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    listener?.endClassFields(
+        abstractToken,
+        externalToken,
+        staticToken,
+        covariantToken,
+        lateToken,
+        varFinalOrConst,
+        count,
+        beginToken,
+        endToken);
+  }
+
+  @override
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    listener?.endEnumMethod(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
   }
 
   @override
@@ -728,14 +786,22 @@
   @override
   void endFormalParameter(
       Token? thisKeyword,
-      Token? periodAfterThis,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
       Token? initializerStart,
       Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
-    listener?.endFormalParameter(thisKeyword, periodAfterThis, nameToken,
-        initializerStart, initializerEnd, kind, memberKind);
+    listener?.endFormalParameter(
+        thisKeyword,
+        superKeyword,
+        periodAfterThisOrSuper,
+        nameToken,
+        initializerStart,
+        initializerEnd,
+        kind,
+        memberKind);
   }
 
   @override
@@ -1165,9 +1231,13 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    listener?.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
+  void handleEnumNoWithClause() {
+    listener?.handleEnumNoWithClause();
+  }
+
+  @override
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    listener?.handleImplements(implementsKeyword, interfacesCount);
   }
 
   @override
@@ -1183,6 +1253,11 @@
   }
 
   @override
+  void handleEnumWithClause(Token withKeyword) {
+    listener?.handleEnumWithClause(withKeyword);
+  }
+
+  @override
   void handleCommentReference(
       Token? newKeyword, Token? prefix, Token? period, Token token) {
     listener?.handleCommentReference(newKeyword, prefix, period, token);
@@ -1540,6 +1615,11 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    listener?.handleNoTypeNameInConstructorReference(token);
+  }
+
+  @override
   void handleNoTypeVariables(Token token) {
     listener?.handleNoTypeVariables(token);
   }
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
index 63a247f..332225f 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
@@ -137,12 +137,11 @@
     logEvent("ClassExtends");
   }
 
-  /// Handle an implements clause in a class or mixin declaration.
+  /// Handle an implements clause in a class, mixin or enum declaration.
   /// Substructures:
   /// - implemented types
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    logEvent("ClassImplements");
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    logEvent("Implements");
   }
 
   /// Handle a show clause in an extension declaration.
@@ -306,12 +305,55 @@
   void beginEnum(Token enumKeyword) {}
 
   /// Handle the end of an enum declaration.  Substructures:
+  /// - [memberCount] times:
+  ///   - Enum member
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
+    logEvent("Enum");
+  }
+
+  /// Handle the end of an enum constructor declaration.  Substructures:
+  /// - metadata
+  /// - return type
+  /// - method name (identifier, possibly qualified)
+  /// - type variables
+  /// - formal parameters
+  /// - initializers
+  /// - async marker
+  /// - body
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    // TODO(danrubel): push implementation into subclasses
+    endClassMethod(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
+  }
+
+  /// Handle the enum elements. Substructures:
+  /// - [elementsCount] times:
+  ///   - Enum element
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    logEvent("EnumElements");
+  }
+
+  /// Handle the header of an enum declaration.  Substructures:
   /// - Metadata
   /// - Enum name (identifier)
-  /// - [count] times:
-  ///   - Enum value (identifier)
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
-    logEvent("Enum");
+  /// - type variables
+  /// - with clause
+  /// - implemented types
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    logEvent("EnumHeader");
+  }
+
+  /// Handle the enum element. Substructures:
+  /// - Metadata
+  /// - Enum value (identifier)
+  void handleEnumElement(Token beginToken) {
+    logEvent("EnumElement");
+  }
+
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    endClassFactoryMethod(beginToken, factoryKeyword, endToken);
   }
 
   void beginExport(Token token) {}
@@ -363,7 +405,8 @@
 
   void endFormalParameter(
       Token? thisKeyword,
-      Token? periodAfterThis,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
       Token? initializerStart,
       Token? initializerEnd,
@@ -447,6 +490,42 @@
         lateToken, varFinalOrConst, count, beginToken, endToken);
   }
 
+  /// Handle the end of an enum field declaration.  Substructures:
+  /// - Metadata
+  /// - Modifiers
+  /// - Type
+  /// - Variable declarations (count times)
+  ///
+  /// Started by [beginFields].
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    endClassFields(abstractToken, externalToken, staticToken, covariantToken,
+        lateToken, varFinalOrConst, count, beginToken, endToken);
+  }
+
+  /// Handle the end of an enum method declaration.  Substructures:
+  /// - metadata
+  /// - return type
+  /// - method name (identifier, possibly qualified)
+  /// - type variables
+  /// - formal parameters
+  /// - initializers
+  /// - async marker
+  /// - body
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    endClassMethod(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
+  }
+
   /// Marks that the grammar term `forInitializerStatement` has been parsed and
   /// it was an empty statement.
   void handleForInitializerEmptyStatement(Token token) {
@@ -608,18 +687,33 @@
     logEvent("FunctionTypeAlias");
   }
 
-  /// Handle the end of a with clause (e.g. "with B, C").
+  /// Handle the end of a class with clause (e.g. "with B, C").
   /// Substructures:
   /// - mixin types (TypeList)
   void handleClassWithClause(Token withKeyword) {
     logEvent("ClassWithClause");
   }
 
-  /// Handle the absence of a with clause.
+  /// Handle the absence of a class with clause.
   void handleClassNoWithClause() {
     logEvent("ClassNoWithClause");
   }
 
+  /// Handle the end of an enum with clause (e.g. "with B, C").
+  /// Substructures:
+  /// - mixin types (TypeList)
+  ///
+  /// This method is separated from [handleClassWithClause] to simplify
+  /// handling the different objects in the context.
+  void handleEnumWithClause(Token withKeyword) {
+    logEvent("EnumWithClause");
+  }
+
+  /// Handle the absence of an enum with clause.
+  void handleEnumNoWithClause() {
+    logEvent("EnumNoWithClause");
+  }
+
   /// Handle the beginning of a named mixin application.
   /// [beginToken] may be the same as [name], or may point to modifiers
   /// (or extraneous modifiers in the case of recovery) preceding [name].
@@ -1566,6 +1660,10 @@
     logEvent("NoConstructorReferenceContinuationAfterTypeArguments");
   }
 
+  void handleNoTypeNameInConstructorReference(Token token) {
+    logEvent("NoTypeNameInConstructorReference");
+  }
+
   void handleNoType(Token lastConsumed) {
     logEvent("NoType");
   }
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index cb1ef21..fac9391 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -1286,7 +1286,7 @@
     return token;
   }
 
-  Token parseWithClauseOpt(Token token) {
+  Token parseClassWithClauseOpt(Token token) {
     // <mixins> ::= with <typeNotVoidList>
     Token withKeyword = token.next!;
     if (optional('with', withKeyword)) {
@@ -1298,6 +1298,18 @@
     return token;
   }
 
+  Token parseEnumWithClauseOpt(Token token) {
+    // <mixins> ::= with <typeNotVoidList>
+    Token withKeyword = token.next!;
+    if (optional('with', withKeyword)) {
+      token = parseTypeList(withKeyword);
+      listener.handleEnumWithClause(withKeyword);
+    } else {
+      listener.handleEnumNoWithClause();
+    }
+    return token;
+  }
+
   /// Parse the formal parameters of a getter (which shouldn't have parameters)
   /// or function or method.
   Token parseGetterOrFormalParameters(
@@ -1612,13 +1624,19 @@
         parameterKind == FormalParameterKind.optionalNamed;
 
     Token? thisKeyword;
-    Token? periodAfterThis;
+    Token? superKeyword;
+    Token? periodAfterThisOrSuper;
     IdentifierContext nameContext =
         IdentifierContext.formalParameterDeclaration;
 
-    if (!inFunctionType && optional('this', next)) {
+    if (!inFunctionType &&
+        (optional('this', next) || optional('super', next))) {
       Token originalToken = token;
-      thisKeyword = token = next;
+      if (optional('this', next)) {
+        thisKeyword = token = next;
+      } else {
+        superKeyword = token = next;
+      }
       next = token.next!;
       if (!optional('.', next)) {
         if (isOneOf(next, okNextValueInFormalParameter)) {
@@ -1626,7 +1644,7 @@
           // later that it's not an allowed identifier.
           token = originalToken;
           next = token.next!;
-          thisKeyword = null;
+          thisKeyword = superKeyword = null;
         } else {
           // Recover from a missing period by inserting one.
           next = rewriteAndRecover(
@@ -1634,13 +1652,13 @@
               codes.templateExpectedButGot.withArguments('.'),
               new SyntheticToken(TokenType.PERIOD, next.charOffset));
           // These 3 lines are duplicated here and below.
-          periodAfterThis = token = next;
+          periodAfterThisOrSuper = token = next;
           next = token.next!;
           nameContext = IdentifierContext.fieldInitializer;
         }
       } else {
         // These 3 lines are duplicated here and above.
-        periodAfterThis = token = next;
+        periodAfterThisOrSuper = token = next;
         next = token.next!;
         nameContext = IdentifierContext.fieldInitializer;
       }
@@ -1711,8 +1729,8 @@
     }
 
     Token nameToken;
-    if (periodAfterThis != null) {
-      token = periodAfterThis;
+    if (periodAfterThisOrSuper != null) {
+      token = periodAfterThisOrSuper;
     }
     next = token.next!;
     if (inFunctionType &&
@@ -1759,8 +1777,15 @@
     } else {
       listener.handleFormalParameterWithoutValue(next);
     }
-    listener.endFormalParameter(thisKeyword, periodAfterThis, nameToken,
-        initializerStart, initializerEnd, parameterKind, memberKind);
+    listener.endFormalParameter(
+        thisKeyword,
+        superKeyword,
+        periodAfterThisOrSuper,
+        nameToken,
+        initializerStart,
+        initializerEnd,
+        parameterKind,
+        memberKind);
     return token;
   }
 
@@ -1917,35 +1942,45 @@
 
   /// ```
   /// enumType:
-  ///   metadata 'enum' id '{' metadata id [',' metadata id]* [','] '}'
-  /// ;
+  ///   metadata 'enum' id typeParameters? mixins? interfaces? '{'
+  ///      enumEntry (',' enumEntry)* (',')? (';'
+  ///      (metadata classMemberDefinition)*
+  ///      )?
+  ///   '}'
+  ///
+  /// enumEntry:
+  ///     metadata id argumentPart?
+  ///   | metadata id typeArguments? '.' id arguments
   /// ```
   Token parseEnum(Token enumKeyword) {
     assert(optional('enum', enumKeyword));
     listener.beginUncategorizedTopLevelDeclaration(enumKeyword);
-    listener.beginEnum(enumKeyword);
     Token token =
         ensureIdentifier(enumKeyword, IdentifierContext.enumDeclaration);
+    String name = token.lexeme;
+    listener.beginEnum(enumKeyword);
+    token = parseEnumHeaderOpt(token, enumKeyword);
     Token leftBrace = token.next!;
-    int count = 0;
+    int elementCount = 0;
+    int memberCount = 0;
     if (optional('{', leftBrace)) {
+      listener.handleEnumHeader(enumKeyword, leftBrace);
       token = leftBrace;
       while (true) {
         Token next = token.next!;
-        if (optional('}', next)) {
+        if (optional('}', next) || optional(';', next)) {
           token = next;
-          if (count == 0) {
+          if (elementCount == 0) {
             reportRecoverableError(token, codes.messageEnumDeclarationEmpty);
           }
           break;
         }
-        token = parseMetadataStar(token);
-        token = ensureIdentifier(token, IdentifierContext.enumValueDeclaration);
+        token = parseEnumElement(token);
         next = token.next!;
-        count++;
+        elementCount++;
         if (optional(',', next)) {
           token = next;
-        } else if (optional('}', next)) {
+        } else if (optional('}', next) || optional(';', next)) {
           token = next;
           break;
         } else {
@@ -1971,14 +2006,51 @@
           }
         }
       }
+      listener.handleEnumElements(token, elementCount);
+      if (optional(';', token)) {
+        while (notEofOrValue('}', token.next!)) {
+          token = parseClassOrMixinOrExtensionOrEnumMemberImpl(
+              token, DeclarationKind.Enum, name);
+          ++memberCount;
+        }
+        token = token.next!;
+        assert(token.isEof || optional('}', token));
+      }
     } else {
       // TODO(danrubel): merge this error message with missing class/mixin body
       leftBrace = ensureBlock(
           token, codes.templateExpectedEnumBody, /* missingBlockName = */ null);
+      listener.handleEnumHeader(enumKeyword, leftBrace);
+      listener.handleEnumElements(token, elementCount);
       token = leftBrace.endGroup!;
     }
     assert(optional('}', token));
-    listener.endEnum(enumKeyword, leftBrace, count);
+    listener.endEnum(enumKeyword, leftBrace, memberCount);
+    return token;
+  }
+
+  Token parseEnumHeaderOpt(Token token, Token enumKeyword) {
+    token = computeTypeParamOrArg(
+            token, /* inDeclaration = */ true, /* allowsVariance = */ true)
+        .parseVariables(token, this);
+    token = parseEnumWithClauseOpt(token);
+    token = parseClassOrMixinOrEnumImplementsOpt(token);
+    return token;
+  }
+
+  Token parseEnumElement(Token token) {
+    Token beginToken = token;
+    token = parseMetadataStar(token);
+    token = ensureIdentifier(token, IdentifierContext.enumValueDeclaration);
+    token = parseConstructorReference(token, ConstructorReferenceContext.Const,
+        /* typeArg = */ null, /* isImplicitTypeName = */ true);
+    Token next = token.next!;
+    if (optional('(', next) || optional('<', next)) {
+      token = parseConstructorInvocationArguments(token);
+    } else {
+      listener.handleNoArguments(token);
+    }
+    listener.handleEnumElement(beginToken);
     return token;
   }
 
@@ -2047,8 +2119,8 @@
 
   Token parseClassHeaderOpt(Token token, Token begin, Token classKeyword) {
     token = parseClassExtendsOpt(token);
-    token = parseWithClauseOpt(token);
-    token = parseClassOrMixinImplementsOpt(token);
+    token = parseClassWithClauseOpt(token);
+    token = parseClassOrMixinOrEnumImplementsOpt(token);
     Token? nativeToken;
     if (optional('native', token.next!)) {
       nativeToken = token.next!;
@@ -2114,7 +2186,7 @@
         }
       }
 
-      token = parseWithClauseOpt(token);
+      token = parseClassWithClauseOpt(token);
 
       if (recoveryListener.withKeyword != null) {
         if (hasWith) {
@@ -2129,7 +2201,7 @@
         }
       }
 
-      token = parseClassOrMixinImplementsOpt(token);
+      token = parseClassOrMixinOrEnumImplementsOpt(token);
 
       if (recoveryListener.implementsKeyword != null) {
         if (hasImplements) {
@@ -2191,7 +2263,7 @@
   ///   'implements' typeName (',' typeName)*
   /// ;
   /// ```
-  Token parseClassOrMixinImplementsOpt(Token token) {
+  Token parseClassOrMixinOrEnumImplementsOpt(Token token) {
     Token? implementsKeyword;
     int interfacesCount = 0;
     if (optional('implements', token.next!)) {
@@ -2202,7 +2274,7 @@
         ++interfacesCount;
       } while (optional(',', token.next!));
     }
-    listener.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
+    listener.handleImplements(implementsKeyword, interfacesCount);
     return token;
   }
 
@@ -2237,7 +2309,7 @@
 
   Token parseMixinHeaderOpt(Token token, Token mixinKeyword) {
     token = parseMixinOnOpt(token);
-    token = parseClassOrMixinImplementsOpt(token);
+    token = parseClassOrMixinOrEnumImplementsOpt(token);
     listener.handleMixinHeader(mixinKeyword);
     return token;
   }
@@ -2294,7 +2366,7 @@
         }
       }
 
-      token = parseClassOrMixinImplementsOpt(token);
+      token = parseClassOrMixinOrEnumImplementsOpt(token);
 
       if (recoveryListener.implementsKeyword != null) {
         if (hasImplements) {
@@ -2993,6 +3065,18 @@
             beforeStart.next!,
             token);
         break;
+      case DeclarationKind.Enum:
+        listener.endEnumFields(
+            abstractToken,
+            externalToken,
+            staticToken,
+            covariantToken,
+            lateToken,
+            varFinalOrConst,
+            fieldCount,
+            beforeStart.next!,
+            token);
+        break;
     }
     return token;
   }
@@ -3537,7 +3621,7 @@
     listener.beginClassOrMixinOrExtensionBody(kind, token);
     int count = 0;
     while (notEofOrValue('}', token.next!)) {
-      token = parseClassOrMixinOrExtensionMemberImpl(
+      token = parseClassOrMixinOrExtensionOrEnumMemberImpl(
           token, kind, enclosingDeclarationName);
       ++count;
     }
@@ -3559,7 +3643,7 @@
   /// token and returns the token after the last consumed token rather than the
   /// last consumed token.
   Token parseClassMember(Token token, String? className) {
-    return parseClassOrMixinOrExtensionMemberImpl(
+    return parseClassOrMixinOrExtensionOrEnumMemberImpl(
             syntheticPreviousToken(token), DeclarationKind.Class, className)
         .next!;
   }
@@ -3571,7 +3655,7 @@
   /// token and returns the token after the last consumed token rather than the
   /// last consumed token.
   Token parseMixinMember(Token token, String mixinName) {
-    return parseClassOrMixinOrExtensionMemberImpl(
+    return parseClassOrMixinOrExtensionOrEnumMemberImpl(
             syntheticPreviousToken(token), DeclarationKind.Mixin, mixinName)
         .next!;
   }
@@ -3583,8 +3667,10 @@
   /// token and returns the token after the last consumed token rather than the
   /// last consumed token.
   Token parseExtensionMember(Token token, String extensionName) {
-    return parseClassOrMixinOrExtensionMemberImpl(syntheticPreviousToken(token),
-            DeclarationKind.Extension, extensionName)
+    return parseClassOrMixinOrExtensionOrEnumMemberImpl(
+            syntheticPreviousToken(token),
+            DeclarationKind.Extension,
+            extensionName)
         .next!;
   }
 
@@ -3623,7 +3709,7 @@
   ///   methodDeclaration
   /// ;
   /// ```
-  Token parseClassOrMixinOrExtensionMemberImpl(
+  Token parseClassOrMixinOrExtensionOrEnumMemberImpl(
       Token token, DeclarationKind kind, String? enclosingDeclarationName) {
     Token beforeStart = token = parseMetadataStar(token);
 
@@ -4147,6 +4233,10 @@
           break;
         case DeclarationKind.TopLevel:
           throw "Internal error: TopLevel constructor.";
+        case DeclarationKind.Enum:
+          listener.endEnumConstructor(getOrSet, beforeStart.next!,
+              beforeParam.next!, beforeInitializers?.next, token);
+          break;
       }
     } else {
       //
@@ -4176,6 +4266,10 @@
           break;
         case DeclarationKind.TopLevel:
           throw "Internal error: TopLevel method.";
+        case DeclarationKind.Enum:
+          listener.endEnumMethod(getOrSet, beforeStart.next!, beforeParam.next!,
+              beforeInitializers?.next, token);
+          break;
       }
     }
     return token;
@@ -4268,6 +4362,11 @@
         break;
       case DeclarationKind.TopLevel:
         throw "Internal error: TopLevel factory.";
+      case DeclarationKind.Enum:
+        reportRecoverableError(
+            factoryKeyword, codes.messageEnumDeclaresFactory);
+        listener.endEnumFactoryMethod(beforeStart.next!, factoryKeyword, token);
+        break;
     }
     return token;
   }
@@ -4391,12 +4490,19 @@
 
   Token parseConstructorReference(
       Token token, ConstructorReferenceContext constructorReferenceContext,
-      [TypeParamOrArgInfo? typeArg]) {
-    Token start =
-        ensureIdentifier(token, IdentifierContext.constructorReference);
+      [TypeParamOrArgInfo? typeArg, bool isImplicitTypeName = false]) {
+    Token start;
+    if (isImplicitTypeName) {
+      listener.handleNoTypeNameInConstructorReference(token.next!);
+      start = token;
+    } else {
+      start = ensureIdentifier(token, IdentifierContext.constructorReference);
+    }
     listener.beginConstructorReference(start);
-    token = parseQualifiedRestOpt(
-        start, IdentifierContext.constructorReferenceContinuation);
+    if (!isImplicitTypeName) {
+      token = parseQualifiedRestOpt(
+          start, IdentifierContext.constructorReferenceContinuation);
+    }
     typeArg ??= computeTypeParamOrArg(token);
     token = typeArg.parseArguments(token, this);
     Token? period = null;
@@ -6050,8 +6156,8 @@
     }
 
     listener.beginNewExpression(newKeyword);
-    token = parseConstructorReference(
-        newKeyword, ConstructorReferenceContext.New, potentialTypeArg);
+    token = parseConstructorReference(newKeyword,
+        ConstructorReferenceContext.New, /* typeArg = */ potentialTypeArg);
     token = parseConstructorInvocationArguments(token);
     listener.endNewExpression(newKeyword);
     return token;
@@ -6062,7 +6168,7 @@
     Token begin = token.next!; // This is the class name.
     listener.beginImplicitCreationExpression(begin);
     token = parseConstructorReference(
-        token, ConstructorReferenceContext.Implicit, typeArg);
+        token, ConstructorReferenceContext.Implicit, /* typeArg = */ typeArg);
     token = parseConstructorInvocationArguments(token);
     listener.endImplicitCreationExpression(begin, openAngleBracket);
     return token;
@@ -6178,8 +6284,8 @@
       }
     }
     listener.beginConstExpression(constKeyword);
-    token = parseConstructorReference(
-        token, ConstructorReferenceContext.Const, potentialTypeArg);
+    token = parseConstructorReference(token, ConstructorReferenceContext.Const,
+        /* typeArg = */ potentialTypeArg);
     token = parseConstructorInvocationArguments(token);
     listener.endConstExpression(constKeyword);
     return token;
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/recovery_listeners.dart b/pkg/_fe_analyzer_shared/lib/src/parser/recovery_listeners.dart
index 5c24c53..7936de0 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/recovery_listeners.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/recovery_listeners.dart
@@ -24,10 +24,9 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
     this.implementsKeyword = implementsKeyword;
-    super.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
+    super.handleImplements(implementsKeyword, interfacesCount);
   }
 
   @override
@@ -82,10 +81,9 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
     this.implementsKeyword = implementsKeyword;
-    super.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
+    super.handleImplements(implementsKeyword, interfacesCount);
   }
 
   @override
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
index 245bef3..fbc3ab3 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
@@ -37,6 +37,7 @@
   ConditionallySelectedImport,
   ConstructorInitializerSeparator,
   ConstructorInitializers,
+  ConstructorReference,
   ConstructorReferenceContinuationAfterTypeArguments,
   ContinueTarget,
   Deferred,
@@ -346,9 +347,8 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    debugEvent("ClassImplements");
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    debugEvent("Implements");
   }
 
   @override
diff --git a/pkg/_fe_analyzer_shared/pubspec.yaml b/pkg/_fe_analyzer_shared/pubspec.yaml
index 41a87a0..445f314 100644
--- a/pkg/_fe_analyzer_shared/pubspec.yaml
+++ b/pkg/_fe_analyzer_shared/pubspec.yaml
@@ -1,5 +1,5 @@
 name: _fe_analyzer_shared
-version: 30.0.0
+version: 31.0.0
 description: Logic that is shared between the front_end and analyzer packages.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/_fe_analyzer_shared
 
diff --git a/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart b/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
index 2e4f847..4a20a40 100644
--- a/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
+++ b/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
@@ -139,11 +139,10 @@
           VariableGet(function.positionalParameters.first),
           StringLiteral(_getExtensionMemberName(node))
         ], types: [
-          DynamicType()
+          function.returnType
         ]))
       ..fileOffset = node.fileOffset;
-    return ReturnStatement(
-        AsExpression(getPropertyInvocation, function.returnType));
+    return ReturnStatement(getPropertyInvocation);
   }
 
   /// Returns a new function body for the given [node] external setter.
@@ -153,18 +152,18 @@
   ReturnStatement _getExternalSetterBody(Procedure node) {
     var function = node.function;
     assert(function.positionalParameters.length == 2);
+    var value = function.positionalParameters.last;
     var setPropertyInvocation = StaticInvocation(
         _setPropertyTarget,
         Arguments([
           VariableGet(function.positionalParameters.first),
           StringLiteral(_getExtensionMemberName(node)),
-          VariableGet(function.positionalParameters.last)
+          VariableGet(value)
         ], types: [
-          DynamicType()
+          value.type
         ]))
       ..fileOffset = node.fileOffset;
-    return ReturnStatement(AsExpression(
-        _lowerSetProperty(setPropertyInvocation), function.returnType));
+    return ReturnStatement(_lowerSetProperty(setPropertyInvocation));
   }
 
   /// Returns a new function body for the given [node] external method.
@@ -183,11 +182,10 @@
               .map((argument) => VariableGet(argument))
               .toList())
         ], types: [
-          DynamicType()
+          function.returnType
         ]))
       ..fileOffset = node.fileOffset;
-    return ReturnStatement(AsExpression(
-        _lowerCallMethod(callMethodInvocation), function.returnType));
+    return ReturnStatement(_lowerCallMethod(callMethodInvocation));
   }
 
   /// Returns the extension member name.
diff --git a/pkg/analysis_server/analysis_options.yaml b/pkg/analysis_server/analysis_options.yaml
index 90f1d22..e737f27 100644
--- a/pkg/analysis_server/analysis_options.yaml
+++ b/pkg/analysis_server/analysis_options.yaml
@@ -2,6 +2,7 @@
 
 analyzer:
   # This currently finds ~1,200 implicit-casts issues when enabled.
+  # TODO(srawlins): Switch to strict-casts
   # strong-mode:
   #   implicit-casts: false
   exclude:
diff --git a/pkg/analysis_server/benchmark/benchmarks.dart b/pkg/analysis_server/benchmark/benchmarks.dart
index c6b391f..78a1b36 100644
--- a/pkg/analysis_server/benchmark/benchmarks.dart
+++ b/pkg/analysis_server/benchmark/benchmarks.dart
@@ -222,16 +222,20 @@
 
   @override
   Future run() async {
-    if (argResults!.rest.isEmpty) {
+    var args = argResults;
+    if (args == null) {
+      throw StateError('argResults have not been set');
+    }
+    if (args.rest.isEmpty) {
       printUsage();
       exit(1);
     }
 
-    var benchmarkId = argResults!.rest.first;
-    var repeatCount = int.parse(argResults!['repeat'] as String);
-    var flutterRepository = argResults!['flutter-repository'] as String?;
-    var quick = argResults!['quick'];
-    var verbose = argResults!['verbose'];
+    var benchmarkId = args.rest.first;
+    var repeatCount = int.parse(args['repeat'] as String);
+    var flutterRepository = args['flutter-repository'] as String?;
+    var quick = args['quick'] as bool;
+    var verbose = args['verbose'] as bool;
 
     var benchmark =
         benchmarks.firstWhere((b) => b.id == benchmarkId, orElse: () {
@@ -241,8 +245,14 @@
 
     if (benchmark is FlutterBenchmark) {
       if (flutterRepository != null) {
-        (benchmark as FlutterBenchmark).flutterRepositoryPath =
-            flutterRepository;
+        if (path.isAbsolute(flutterRepository) &&
+            path.normalize(flutterRepository) == flutterRepository) {
+          (benchmark as FlutterBenchmark).flutterRepositoryPath =
+              flutterRepository;
+        } else {
+          print('The path must be absolute and normalized: $flutterRepository');
+          exit(1);
+        }
       } else {
         print('The option --flutter-repository is required to '
             "run '$benchmarkId'.");
diff --git a/pkg/analysis_server/benchmark/integration/input_converter.dart b/pkg/analysis_server/benchmark/integration/input_converter.dart
index da47e28..aec8d14 100644
--- a/pkg/analysis_server/benchmark/integration/input_converter.dart
+++ b/pkg/analysis_server/benchmark/integration/input_converter.dart
@@ -62,7 +62,7 @@
 
   /// Return an operation for the notification or `null` if none.
   Operation? convertNotification(Map<String, dynamic> json) {
-    String event = json['event'];
+    var event = json['event'] as String;
     if (event == SERVER_NOTIFICATION_STATUS) {
       // {"event":"server.status","params":{"analysis":{"isAnalyzing":false}}}
       var params = asMap2(json['params']);
@@ -214,21 +214,21 @@
   /// Recursively translate source paths in the specified JSON to reference
   /// the temporary source used during performance measurement rather than
   /// the original source when the instrumentation or log file was generated.
-  dynamic translateSrcPaths(json) {
+  Object? translateSrcPaths(Object? json) {
     if (json is String) {
       return srcPathMap.translate(json);
     }
     if (json is List) {
-      var result = [];
+      var result = <Object?>[];
       for (var i = 0; i < json.length; ++i) {
-        result.add(translateSrcPaths(json[i]));
+        result.add(translateSrcPaths(json[i] as Object?));
       }
       return result;
     }
     if (json is Map) {
       var result = <String, Object?>{};
       json.forEach((origKey, value) {
-        result[translateSrcPaths(origKey)] = translateSrcPaths(value);
+        result[translateSrcPaths(origKey) as String] = translateSrcPaths(value);
       });
       return result;
     }
diff --git a/pkg/analysis_server/benchmark/integration/main.dart b/pkg/analysis_server/benchmark/integration/main.dart
index b63675e..07ce8bb 100644
--- a/pkg/analysis_server/benchmark/integration/main.dart
+++ b/pkg/analysis_server/benchmark/integration/main.dart
@@ -130,8 +130,8 @@
     printHelp();
     exit(1);
   }
-
-  var showHelp = args[HELP_CMDLINE_OPTION] || args.rest.isNotEmpty;
+  var helpArg = args[HELP_CMDLINE_OPTION] as bool;
+  var showHelp = helpArg || args.rest.isNotEmpty;
 
   var inputArg = args[INPUT_CMDLINE_OPTION];
   if (inputArg is! String || inputArg.isEmpty) {
@@ -141,7 +141,8 @@
     perfArgs.inputPath = inputArg;
   }
 
-  for (var pair in args[MAP_OPTION]) {
+  var mapArg = args[MAP_OPTION] as List<Object?>;
+  for (var pair in mapArg) {
     if (pair is String) {
       var index = pair.indexOf(',');
       if (index != -1 && !pair.contains(',', index + 1)) {
@@ -175,9 +176,10 @@
     }
   }
 
-  if (args[VERY_VERBOSE_CMDLINE_OPTION] || rawArgs.contains('-vv')) {
+  var verboseArg = args[VERY_VERBOSE_CMDLINE_OPTION] as bool;
+  if (verboseArg || rawArgs.contains('-vv')) {
     Logger.root.level = Level.FINE;
-  } else if (args[VERBOSE_CMDLINE_OPTION]) {
+  } else if (verboseArg) {
     Logger.root.level = Level.INFO;
   } else {
     Logger.root.level = Level.WARNING;
diff --git a/pkg/analysis_server/benchmark/integration/operation.dart b/pkg/analysis_server/benchmark/integration/operation.dart
index 311e979..db0bfcf 100644
--- a/pkg/analysis_server/benchmark/integration/operation.dart
+++ b/pkg/analysis_server/benchmark/integration/operation.dart
@@ -70,8 +70,8 @@
   @override
   Future<void>? perform(Driver driver) {
     var stopwatch = Stopwatch();
-    String originalId = json['id'];
-    String method = json['method'];
+    var originalId = json['id'] as String;
+    var method = json['method'] as String;
     json['clientRequestTime'] = DateTime.now().millisecondsSinceEpoch;
     driver.logger.log(Level.FINE, 'Sending request: $method\n  $json');
     stopwatch.start();
diff --git a/pkg/analysis_server/benchmark/perf/flutter_completion_benchmark.dart b/pkg/analysis_server/benchmark/perf/flutter_completion_benchmark.dart
index e2bac08..78497cb 100644
--- a/pkg/analysis_server/benchmark/perf/flutter_completion_benchmark.dart
+++ b/pkg/analysis_server/benchmark/perf/flutter_completion_benchmark.dart
@@ -77,8 +77,10 @@
     // time analyzing, and do apply the filter.
     // Total number of suggestions: 2322.
     // Filtered to: 82.
+    // Long name: completion-smallFile-body
+    var name = 'completion-1';
     result.add(
-      'completion-smallFile-body',
+      name,
       BenchMarkResult(
         'micros',
         await _completionTiming(
@@ -86,7 +88,7 @@
           filePath: '$flutterPkgPath/lib/src/material/flutter_logo.dart',
           uniquePrefix: 'Widget build(BuildContext context) {',
           insertStringGenerator: () => 'M',
-          name: 'completion-smallFile-body',
+          name: name,
         ),
       ),
     );
@@ -98,8 +100,10 @@
       // JSON in the server, and deserializing on the client.
       // Total number of suggestions: 2322.
       // Filtered to: 2322.
+      // Long name: completion-smallFile-body-withoutPrefix
+      name = 'completion-2';
       result.add(
-        'completion-smallFile-body-withoutPrefix',
+        name,
         BenchMarkResult(
           'micros',
           await _completionTiming(
@@ -107,7 +111,7 @@
             filePath: '$flutterPkgPath/lib/src/material/flutter_logo.dart',
             uniquePrefix: 'Widget build(BuildContext context) {',
             insertStringGenerator: null,
-            name: 'completion-smallFile-body-withoutPrefix',
+            name: name,
           ),
         ),
       );
@@ -118,8 +122,10 @@
       // The target method body is small, so something could be optimized.
       // Total number of suggestions: 4654.
       // Filtered to: 182.
+      // Long name: completion-smallLibraryCycle-largeFile-smallBody
+      name = 'completion-3';
       result.add(
-        'completion-smallLibraryCycle-largeFile-smallBody',
+        name,
         BenchMarkResult(
           'micros',
           await _completionTiming(
@@ -127,7 +133,7 @@
             filePath: '$flutterPkgPath/test/material/text_field_test.dart',
             uniquePrefix: 'getOpacity(WidgetTester tester, Finder finder) {',
             insertStringGenerator: () => 'M',
-            name: 'completion-smallLibraryCycle-largeFile-smallBody',
+            name: name,
           ),
         ),
       );
@@ -143,8 +149,10 @@
       // TODO(scheglov) Remove the previous sentence when improved.
       // Total number of suggestions: 3429.
       // Filtered to: 133.
+      // Long name: completion-mediumLibraryCycle-mediumFile-smallBody
+      name = 'completion-4';
       result.add(
-        'completion-mediumLibraryCycle-mediumFile-smallBody',
+        name,
         BenchMarkResult(
           'micros',
           await _completionTiming(
@@ -152,7 +160,7 @@
             filePath: '$flutterPkgPath/lib/src/material/app_bar.dart',
             uniquePrefix: 'computeDryLayout(BoxConstraints constraints) {',
             insertStringGenerator: () => 'M',
-            name: 'completion-mediumLibraryCycle-mediumFile-smallBody',
+            name: name,
           ),
         ),
       );
@@ -163,8 +171,10 @@
       // cycle. This is expensive.
       // Total number of suggestions: 1510.
       // Filtered to: 0.
+      // Long name: completion-mediumLibraryCycle-mediumFile-api-parameterType
+      name = 'completion-5';
       result.add(
-        'completion-mediumLibraryCycle-mediumFile-api-parameterType',
+        name,
         BenchMarkResult(
           'micros',
           await _completionTiming(
@@ -172,7 +182,7 @@
             filePath: '$flutterPkgPath/lib/src/material/app_bar.dart',
             uniquePrefix: 'computeDryLayout(BoxConstraints',
             insertStringGenerator: _IncrementingStringGenerator(),
-            name: 'completion-mediumLibraryCycle-mediumFile-api-parameterType',
+            name: name,
           ),
         ),
       );
diff --git a/pkg/analysis_server/benchmark/perf/memory_tests.dart b/pkg/analysis_server/benchmark/perf/memory_tests.dart
index 528f672..1837834 100644
--- a/pkg/analysis_server/benchmark/perf/memory_tests.dart
+++ b/pkg/analysis_server/benchmark/perf/memory_tests.dart
@@ -230,7 +230,7 @@
   Map<String, List<Diagnostic>> currentAnalysisErrors = {};
 
   @override
-  void expect(actual, matcher, {String? reason}) =>
+  void expect(Object? actual, Matcher matcher, {String? reason}) =>
       outOfTestExpect(actual, matcher, reason: reason);
 
   /// The server is automatically started before every test.
@@ -265,8 +265,8 @@
 
     var total = 0;
 
-    List isolateGroupsRefs = vm['isolateGroups'];
-    for (Map isolateGroupRef in isolateGroupsRefs) {
+    var isolateGroupsRefs = vm['isolateGroups'] as List<Object?>;
+    for (var isolateGroupRef in isolateGroupsRefs.cast<Map>()) {
       final heapUsage = await service.call('getIsolateGroupMemoryUsage',
           {'isolateGroupId': isolateGroupRef['id']});
       total += heapUsage['heapUsage'] + heapUsage['externalUsage'] as int;
@@ -312,10 +312,10 @@
     }
 
     try {
-      dynamic json = jsonDecode(message);
+      var json = jsonDecode(message) as Map<Object?, Object?>;
       if (json.containsKey('id')) {
-        dynamic id = json['id'];
-        _completers[id]?.complete(json['result']);
+        var id = json['id'];
+        _completers[id]?.complete(json['result'] as Map<Object?, Object?>);
         _completers.remove(id);
       }
     } catch (e) {
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 c4469ea..c56e634 100644
--- a/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart
+++ b/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart
@@ -15,7 +15,9 @@
   /// Assists with the same relevance are sorted alphabetically.
   static final Comparator<Assist> SORT_BY_RELEVANCE = (Assist a, Assist b) {
     if (a.kind.priority != b.kind.priority) {
-      return a.kind.priority - b.kind.priority;
+      // A higher priority indicates a higher relevance
+      // and should be sorted before a lower priority.
+      return b.kind.priority - a.kind.priority;
     }
     return a.change.message.compareTo(b.change.message);
   };
diff --git a/pkg/analysis_server/lib/protocol/protocol.dart b/pkg/analysis_server/lib/protocol/protocol.dart
index 9d15dac..263083a 100644
--- a/pkg/analysis_server/lib/protocol/protocol.dart
+++ b/pkg/analysis_server/lib/protocol/protocol.dart
@@ -37,7 +37,7 @@
 
   /// Initialize a newly created instance based on the given JSON data.
   factory Notification.fromJson(Map json) {
-    return Notification(json[Notification.EVENT],
+    return Notification(json[Notification.EVENT] as String,
         json[Notification.PARAMS] as Map<String, Object>?);
   }
 
diff --git a/pkg/analysis_server/lib/protocol/protocol_constants.dart b/pkg/analysis_server/lib/protocol/protocol_constants.dart
index 2689506..85a4474 100644
--- a/pkg/analysis_server/lib/protocol/protocol_constants.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_constants.dart
@@ -141,6 +141,7 @@
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_FILE = 'file';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_MAX_RESULTS = 'maxResults';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_OFFSET = 'offset';
+const String COMPLETION_REQUEST_GET_SUGGESTIONS2_TIMEOUT = 'timeout';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS_FILE = 'file';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS_OFFSET = 'offset';
 const String COMPLETION_REQUEST_GET_SUGGESTION_DETAILS =
diff --git a/pkg/analysis_server/lib/protocol/protocol_generated.dart b/pkg/analysis_server/lib/protocol/protocol_generated.dart
index 8cd904d..bfdf408 100644
--- a/pkg/analysis_server/lib/protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_generated.dart
@@ -4698,7 +4698,14 @@
   /// to true.
   int maxResults;
 
-  CompletionGetSuggestions2Params(this.file, this.offset, this.maxResults);
+  /// The approximate time in milliseconds that the server should spend. The
+  /// server will perform some steps anyway, even if it takes longer than the
+  /// specified timeout. This field is intended to be used for benchmarking,
+  /// and usually should not be provided, so that the default timeout is used.
+  int? timeout;
+
+  CompletionGetSuggestions2Params(this.file, this.offset, this.maxResults,
+      {this.timeout});
 
   factory CompletionGetSuggestions2Params.fromJson(
       JsonDecoder jsonDecoder, String jsonPath, Object? json) {
@@ -4723,7 +4730,12 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'maxResults');
       }
-      return CompletionGetSuggestions2Params(file, offset, maxResults);
+      int? timeout;
+      if (json.containsKey('timeout')) {
+        timeout = jsonDecoder.decodeInt(jsonPath + '.timeout', json['timeout']);
+      }
+      return CompletionGetSuggestions2Params(file, offset, maxResults,
+          timeout: timeout);
     } else {
       throw jsonDecoder.mismatch(
           jsonPath, 'completion.getSuggestions2 params', json);
@@ -4741,6 +4753,10 @@
     result['file'] = file;
     result['offset'] = offset;
     result['maxResults'] = maxResults;
+    var timeout = this.timeout;
+    if (timeout != null) {
+      result['timeout'] = timeout;
+    }
     return result;
   }
 
@@ -4757,7 +4773,8 @@
     if (other is CompletionGetSuggestions2Params) {
       return file == other.file &&
           offset == other.offset &&
-          maxResults == other.maxResults;
+          maxResults == other.maxResults &&
+          timeout == other.timeout;
     }
     return false;
   }
@@ -4767,6 +4784,7 @@
         file,
         offset,
         maxResults,
+        timeout,
       );
 }
 
@@ -11547,7 +11565,7 @@
       double? doubleValue;
       if (json.containsKey('doubleValue')) {
         doubleValue = jsonDecoder.decodeDouble(
-            jsonPath + '.doubleValue', json['doubleValue']);
+            jsonPath + '.doubleValue', json['doubleValue'] as Object);
       }
       int? intValue;
       if (json.containsKey('intValue')) {
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index fd9daec..bbe634a 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -33,6 +33,7 @@
 import 'package:analysis_server/src/protocol_server.dart' as server;
 import 'package:analysis_server/src/search/search_domain.dart';
 import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
+import 'package:analysis_server/src/server/debounce_requests.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/server/error_notifier.dart';
@@ -55,6 +56,7 @@
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
 import 'package:analyzer_plugin/utilities/navigation/navigation_dart.dart';
 import 'package:http/http.dart' as http;
+import 'package:meta/meta.dart';
 import 'package:telemetry/crash_reporting.dart';
 import 'package:telemetry/telemetry.dart' as telemetry;
 import 'package:watcher/watcher.dart';
@@ -115,6 +117,12 @@
 
   final DetachableFileSystemManager? detachableFileSystemManager;
 
+  /// The broadcast stream of requests that were discarded because there
+  /// was another request that made this one irrelevant.
+  @visibleForTesting
+  final StreamController<Request> discardedRequests =
+      StreamController.broadcast(sync: true);
+
   /// Initialize a newly created server to receive requests from and send
   /// responses to the given [channel].
   ///
@@ -161,10 +169,14 @@
         performance = performanceAfterStartup = ServerPerformance();
       });
     });
-    var notification =
-        ServerConnectedParams(PROTOCOL_VERSION, io.pid).toNotification();
-    channel.sendNotification(notification);
-    channel.listen(handleRequest, onDone: done, onError: error);
+    channel.sendNotification(
+      ServerConnectedParams(
+        options.reportProtocolVersion ?? PROTOCOL_VERSION,
+        io.pid,
+      ).toNotification(),
+    );
+    debounceRequests(channel, discardedRequests)
+        .listen(handleRequest, onDone: done, onError: error);
     handlers = <server.RequestHandler>[
       ServerDomainHandler(this),
       AnalysisDomainHandler(this),
@@ -635,6 +647,9 @@
 
   /// The set of enabled features.
   FeatureSet featureSet = FeatureSet();
+
+  /// If set, this string will be reported as the protocol version.
+  String? reportProtocolVersion;
 }
 
 class ServerContextManagerCallbacks extends ContextManagerCallbacks {
diff --git a/pkg/analysis_server/lib/src/analysis_server_abstract.dart b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
index 9e758b6..7724107 100644
--- a/pkg/analysis_server/lib/src/analysis_server_abstract.dart
+++ b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
@@ -44,12 +44,14 @@
     show EvictingFileByteStore;
 import 'package:analyzer/src/dart/analysis/file_content_cache.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/results.dart';
 import 'package:analyzer/src/dart/ast/element_locator.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
+import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:collection/collection.dart';
 import 'package:http/http.dart' as http;
 import 'package:meta/meta.dart';
@@ -302,8 +304,14 @@
   }
 
   DartdocDirectiveInfo getDartdocDirectiveInfoFor(ResolvedUnitResult result) {
+    return getDartdocDirectiveInfoForSession(result.session);
+  }
+
+  DartdocDirectiveInfo getDartdocDirectiveInfoForSession(
+    AnalysisSession session,
+  ) {
     return declarationsTracker
-            ?.getContext(result.session.analysisContext)
+            ?.getContext(session.analysisContext)
             ?.dartdocDirectiveInfo ??
         DartdocDirectiveInfo();
   }
@@ -312,7 +320,14 @@
   /// context that produced the [result], or `null` if there is no cache for the
   /// context.
   DocumentationCache? getDocumentationCacheFor(ResolvedUnitResult result) {
-    var context = result.session.analysisContext;
+    return getDocumentationCacheForSession(result.session);
+  }
+
+  /// Return the object used to cache the documentation for elements in the
+  /// context that produced the [session], or `null` if there is no cache for
+  /// the context.
+  DocumentationCache? getDocumentationCacheForSession(AnalysisSession session) {
+    var context = session.analysisContext;
     var tracker = declarationsTracker?.getContext(context);
     if (tracker == null) {
       return null;
@@ -416,7 +431,7 @@
     return driver
         .getResult(path, sendCachedToStream: sendCachedToStream)
         .then((value) => value is ResolvedUnitResult ? value : null)
-        .catchError((e, st) {
+        .catchError((Object e, StackTrace st) {
       instrumentationService.logException(e, st);
       return null;
     });
@@ -462,11 +477,36 @@
     contextManager.refresh();
   }
 
+  ResolvedForCompletionResultImpl? resolveForCompletion({
+    required String path,
+    required int offset,
+    required OperationPerformanceImpl performance,
+  }) {
+    if (!file_paths.isDart(resourceProvider.pathContext, path)) {
+      return null;
+    }
+
+    var driver = getAnalysisDriver(path);
+    if (driver == null) {
+      return null;
+    }
+
+    try {
+      return driver.resolveForCompletion(
+        path: path,
+        offset: offset,
+        performance: performance,
+      );
+    } catch (e, st) {
+      instrumentationService.logException(e, st);
+    }
+  }
+
   /// Sends an error notification to the user.
   void sendServerErrorNotification(
     String message,
-    dynamic exception,
-    /*StackTrace*/ stackTrace, {
+    Object exception,
+    StackTrace? stackTrace, {
     bool fatal = false,
   });
 
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 bfbc6ba..955e547 100644
--- a/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
+++ b/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
@@ -73,7 +73,6 @@
 /// standard input and standard output) to communicate with clients.
 class ByteStreamServerChannel implements ServerCommunicationChannel {
   final Stream _input;
-
   final IOSink _output;
 
   /// The instrumentation service that is to be used by this analysis server.
@@ -88,6 +87,20 @@
   /// True if [close] has been called.
   bool _closeRequested = false;
 
+  @override
+  late final Stream<Request> requests = _input
+      .transform(const Utf8Decoder())
+      .transform(const LineSplitter())
+      .transform(
+        StreamTransformer.fromHandlers(
+          handleData: _readRequest,
+          handleDone: (sink) {
+            close();
+            sink.close();
+          },
+        ),
+      );
+
   ByteStreamServerChannel(
       this._input, this._output, this._instrumentationService,
       {RequestStatisticsHelper? requestStatistics})
@@ -110,17 +123,6 @@
   }
 
   @override
-  void listen(void Function(Request request) onRequest,
-      {Function? onError, void Function()? onDone}) {
-    _input.transform(const Utf8Decoder()).transform(LineSplitter()).listen(
-        (String data) => _readRequest(data, onRequest),
-        onError: onError, onDone: () {
-      close();
-      onDone?.call();
-    });
-  }
-
-  @override
   void sendNotification(Notification notification) {
     // Don't send any further notifications after the communication channel is
     // closed.
@@ -159,7 +161,7 @@
 
   /// Read a request from the given [data] and use the given function to handle
   /// the request.
-  void _readRequest(String data, void Function(Request request) onRequest) {
+  void _readRequest(String data, Sink<Request> sink) {
     // Ignore any further requests after the communication channel is closed.
     if (_closed.isCompleted) {
       return;
@@ -173,6 +175,6 @@
       return;
     }
     _requestStatistics?.addRequest(request);
-    onRequest(request);
+    sink.add(request);
   }
 }
diff --git a/pkg/analysis_server/lib/src/channel/channel.dart b/pkg/analysis_server/lib/src/channel/channel.dart
index 6b5e95f..37a6e86 100644
--- a/pkg/analysis_server/lib/src/channel/channel.dart
+++ b/pkg/analysis_server/lib/src/channel/channel.dart
@@ -98,17 +98,12 @@
 /// objects that allow an [AnalysisServer] to receive [Request]s and to return
 /// both [Response]s and [Notification]s.
 abstract class ServerCommunicationChannel {
+  /// The single-subscription stream of requests.
+  Stream<Request> get requests;
+
   /// Close the communication channel.
   void close();
 
-  /// Listen to the channel for requests. If a request is received, invoke the
-  /// [onRequest] 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 Function(Request request) onRequest,
-      {Function onError, void Function() onDone});
-
   /// Send the given [notification] to the client.
   void sendNotification(Notification notification);
 
diff --git a/pkg/analysis_server/lib/src/cider/completion.dart b/pkg/analysis_server/lib/src/cider/completion.dart
index 17f00da..4f6aaaa3 100644
--- a/pkg/analysis_server/lib/src/cider/completion.dart
+++ b/pkg/analysis_server/lib/src/cider/completion.dart
@@ -70,7 +70,7 @@
       var lineInfo = resolvedUnit.lineInfo;
       var offset = lineInfo.getOffsetOfLine(line) + column;
 
-      _dartCompletionRequest = DartCompletionRequest(
+      _dartCompletionRequest = DartCompletionRequest.forResolvedUnit(
         resolvedUnit: resolvedUnit,
         offset: offset,
       );
diff --git a/pkg/analysis_server/lib/src/cider/rename.dart b/pkg/analysis_server/lib/src/cider/rename.dart
index 6ff6528..4c38533 100644
--- a/pkg/analysis_server/lib/src/cider/rename.dart
+++ b/pkg/analysis_server/lib/src/cider/rename.dart
@@ -14,17 +14,46 @@
 class CanRenameResponse {
   final LineInfo lineInfo;
   final RenameRefactoringElement refactoringElement;
-  final String oldName;
+  final FileResolver _fileResolver;
+  final String filePath;
 
-  CanRenameResponse(this.lineInfo, this.refactoringElement, this.oldName);
+  CanRenameResponse(this.lineInfo, this.refactoringElement, this._fileResolver,
+      this.filePath);
+
+  String get oldName => refactoringElement.element.displayName;
+
+  CheckNameResponse? checkNewName(String name) {
+    var element = refactoringElement.element;
+    RefactoringStatus? status;
+    if (element is LocalVariableElement) {
+      status = validateVariableName(name);
+    } else if (element is ParameterElement) {
+      status = validateParameterName(name);
+    } else if (element is FunctionElement) {
+      status = validateFunctionName(name);
+    }
+    if (status == null) {
+      return null;
+    }
+    return CheckNameResponse(status, this);
+  }
 }
 
 class CheckNameResponse {
-  final LineInfo lineInfo;
   final RefactoringStatus status;
-  final String oldName;
+  final CanRenameResponse canRename;
 
-  CheckNameResponse(this.lineInfo, this.status, this.oldName);
+  CheckNameResponse(this.status, this.canRename);
+
+  LineInfo get lineInfo => canRename.lineInfo;
+
+  String get oldName => canRename.refactoringElement.element.displayName;
+
+  RenameResponse? computeRenameRanges() {
+    var matches = canRename._fileResolver
+        .findReferences(canRename.refactoringElement.element);
+    return RenameResponse(matches, this);
+  }
 }
 
 class CiderRenameComputer {
@@ -45,7 +74,7 @@
     if (node == null || element == null) {
       return null;
     }
-    if (element.source != null && element.source!.isInSystemLibrary) {
+    if (element.source != null && element.source!.uri.isScheme('dart')) {
       return null;
     }
     if (element is MethodElement && element.isOperator) {
@@ -56,11 +85,12 @@
     }
     var refactoring = RenameRefactoring.getElementToRename(node, element);
     if (refactoring != null) {
-      return CanRenameResponse(lineInfo, refactoring, element.displayName);
+      return CanRenameResponse(lineInfo, refactoring, _fileResolver, filePath);
     }
     return null;
   }
 
+  @deprecated
   CheckNameResponse? checkNewName(
       String filePath, int line, int column, String name) {
     var resolvedUnit = _fileResolver.resolve(path: filePath);
@@ -74,6 +104,10 @@
       return null;
     }
 
+    var refactoring = RenameRefactoring.getElementToRename(node, element);
+    if (refactoring == null) {
+      return null;
+    }
     RefactoringStatus? status;
     if (element is LocalVariableElement) {
       status = validateVariableName(name);
@@ -85,7 +119,9 @@
     if (status == null) {
       return null;
     }
-    return CheckNameResponse(lineInfo, status, element.displayName);
+
+    return CheckNameResponse(status,
+        CanRenameResponse(lineInfo, refactoring, _fileResolver, filePath));
   }
 
   bool _canRenameElement(Element element) {
@@ -103,3 +139,10 @@
     return false;
   }
 }
+
+class RenameResponse {
+  final List<CiderSearchMatch> matches;
+  final CheckNameResponse checkName;
+
+  RenameResponse(this.matches, this.checkName);
+}
diff --git a/pkg/analysis_server/lib/src/computer/computer_color.dart b/pkg/analysis_server/lib/src/computer/computer_color.dart
new file mode 100644
index 0000000..56352d1
--- /dev/null
+++ b/pkg/analysis_server/lib/src/computer/computer_color.dart
@@ -0,0 +1,361 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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/utilities/flutter.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/constant/value.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/constant/value.dart' show GenericState;
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
+import 'package:analyzer/src/dart/element/type_system.dart';
+import 'package:analyzer/src/lint/linter.dart';
+import 'package:collection/collection.dart';
+
+/// Computer for dart:ui/Flutter Color references.
+class ColorComputer {
+  final ResolvedUnitResult resolvedUnit;
+  final LinterContext _linterContext;
+  final List<ColorReference> _colors = [];
+  final Flutter _flutter = Flutter.instance;
+
+  ColorComputer(this.resolvedUnit)
+      : _linterContext = LinterContextImpl(
+          [], // unused
+          LinterContextUnit(resolvedUnit.content, resolvedUnit.unit),
+          resolvedUnit.session.declaredVariables,
+          resolvedUnit.typeProvider,
+          resolvedUnit.typeSystem as TypeSystemImpl,
+          InheritanceManager3(), // unused
+          resolvedUnit.session.analysisContext.analysisOptions,
+          null,
+        );
+
+  /// Returns information about the color references in [resolvedUnit].
+  ///
+  /// This method should only be called once for any instance of this class.
+  List<ColorReference> compute() {
+    final visitor = _ColorBuilder(this);
+    resolvedUnit.unit.accept(visitor);
+    return _colors;
+  }
+
+  /// Tries to add a color for the [expression].
+  ///
+  /// If [target] is supplied, will be used instead of [expression] allowing
+  /// a value to be read from the member [memberName] or from a swatch value
+  /// with index [index].
+  bool tryAddColor(
+    Expression expression, {
+    Expression? target,
+    String? memberName,
+    int? index,
+  }) {
+    if (!_isColor(expression.staticType)) return false;
+
+    target ??= expression;
+
+    // Try to evaluate the constant target.
+    final colorConstResult = _linterContext.evaluateConstant(target);
+    var colorConst = colorConstResult.value;
+    if (colorConstResult.errors.isNotEmpty || colorConst == null) return false;
+
+    // If we want a specific member or swatch index, read that.
+    if (memberName != null) {
+      colorConst = _getMember(colorConst, memberName);
+    } else if (index != null) {
+      colorConst = _getSwatchValue(colorConst, index);
+    }
+
+    return _tryRecordColor(expression, colorConst);
+  }
+
+  /// Tries to add a color for the instance creation [expression].
+  ///
+  /// This handles constructor calls that cannot be evaluated (for example
+  /// because they are not const) but are simple well-known dart:ui/Flutter
+  /// color constructors that we can manually parse.
+  bool tryAddKnownColorConstructor(InstanceCreationExpression expression) {
+    if (!_isColor(expression.staticType)) return false;
+
+    final constructor = expression.constructorName;
+    final staticElement = constructor.staticElement;
+    final classElement = staticElement?.enclosingElement;
+    final className = classElement?.name;
+    final constructorName = constructor.name?.name;
+    final constructorArgs = expression.argumentList.arguments
+        .map((e) => e is Literal ? e : null)
+        .toList();
+
+    int? colorValue;
+    if (_isDartUi(classElement) && className == 'Color') {
+      colorValue = _getDartUiColorValue(constructorName, constructorArgs);
+    } else if (_isFlutterPainting(classElement) && className == 'ColorSwatch') {
+      colorValue =
+          _getFlutterSwatchColorValue(constructorName, constructorArgs);
+    } else if (_isFlutterMaterial(classElement) &&
+        className == 'MaterialAccentColor') {
+      colorValue =
+          _getFlutterMaterialAccentColorValue(constructorName, constructorArgs);
+    }
+
+    return _tryRecordColorValue(expression, colorValue);
+  }
+
+  /// Creates a [ColorInformation] by extracting the argb values from
+  /// [value] encoded as 0xAARRGGBB as in the dart:ui Color class.
+  ColorInformation _colorInformationForColorValue(int value) {
+    // Extract color information according to dart:ui Color values.
+    final alpha = (0xff000000 & value) >> 24;
+    final red = (0x00ff0000 & value) >> 16;
+    final blue = (0x000000ff & value) >> 0;
+    final green = (0x0000ff00 & value) >> 8;
+
+    return ColorInformation(alpha, red, green, blue);
+  }
+
+  /// Extracts the integer color value from the dart:ui Color constant [color].
+  int? _colorValueForColorConst(DartObject? color) {
+    if (color == null || color.isNull) return null;
+
+    // If the object has a "color" field, walk down to that, because some colors
+    // like CupertinoColors have a "value=0" with an overridden getter that
+    // would always result in a value representing black.
+    color = color.getFieldFromHierarchy('color') ?? color;
+
+    return color.getFieldFromHierarchy('value')?.toIntValue();
+  }
+
+  /// Converts ARGB values into a single int value as 0xAARRGGBB as used by
+  /// the dart:ui Color class.
+  int _colorValueForComponents(int alpha, int red, int green, int blue) {
+    return (alpha << 24) | (red << 16) | (green << 8) | (blue << 0);
+  }
+
+  /// Extracts the color value from dart:ui Color constructor args.
+  int? _getDartUiColorValue(String? name, List<Literal?> args) {
+    if (name == null && args.length == 1) {
+      final arg0 = args[0];
+      return arg0 is IntegerLiteral ? arg0.value : null;
+    } else if (name == 'fromARGB' && args.length == 4) {
+      final arg0 = args[0];
+      final arg1 = args[1];
+      final arg2 = args[2];
+      final arg3 = args[3];
+
+      final alpha = arg0 is IntegerLiteral ? arg0.value : null;
+      final red = arg1 is IntegerLiteral ? arg1.value : null;
+      final green = arg2 is IntegerLiteral ? arg2.value : null;
+      final blue = arg3 is IntegerLiteral ? arg3.value : null;
+
+      return alpha != null && red != null && green != null && blue != null
+          ? _colorValueForComponents(alpha, red, green, blue)
+          : null;
+    } else if (name == 'fromRGBO' && args.length == 4) {
+      final arg0 = args[0];
+      final arg1 = args[1];
+      final arg2 = args[2];
+      final arg3 = args[3];
+
+      final red = arg0 is IntegerLiteral ? arg0.value : null;
+      final green = arg1 is IntegerLiteral ? arg1.value : null;
+      final blue = arg2 is IntegerLiteral ? arg2.value : null;
+      final opacity = arg3 is IntegerLiteral
+          ? arg3.value
+          : arg3 is DoubleLiteral
+              ? arg3.value
+              : null;
+      final alpha = opacity != null ? (opacity * 255).toInt() : null;
+
+      return alpha != null && red != null && green != null && blue != null
+          ? _colorValueForComponents(alpha, red, green, blue)
+          : null;
+    }
+  }
+
+  /// Extracts the color value from Flutter MaterialAccentColor constructor args.
+  int? _getFlutterMaterialAccentColorValue(String? name, List<Literal?> args) =>
+      // MaterialAccentColor is a subclass of SwatchColor and has the same
+      // constructor.
+      _getFlutterSwatchColorValue(name, args);
+
+  /// Extracts the color value from Flutter ColorSwatch constructor args.
+  int? _getFlutterSwatchColorValue(String? name, List<Literal?> args) {
+    if (name == null && args.isNotEmpty) {
+      final arg0 = args[0];
+      return arg0 is IntegerLiteral ? arg0.value : null;
+    }
+  }
+
+  /// Extracts a named member from a color.
+  ///
+  /// Well-known getters like `shade500` will be mapped onto the swatch value
+  /// with a matching index.
+  DartObject? _getMember(DartObject target, String memberName) {
+    final colorValue = target.getFieldFromHierarchy(memberName);
+    if (colorValue != null) {
+      return colorValue;
+    }
+
+    // If we didn't get a value but it's a getter we know how to read from a
+    // swatch, try that.
+    if (memberName.startsWith('shade')) {
+      final shadeNumber = int.tryParse(memberName.substring(5));
+      if (shadeNumber != null) {
+        return _getSwatchValue(target, shadeNumber);
+      }
+    }
+  }
+
+  /// Extracts a specific shade index from a Flutter SwatchColor.
+  DartObject? _getSwatchValue(DartObject target, int swatchValue) {
+    final swatch = target.getFieldFromHierarchy('_swatch')?.toMapValue();
+    if (swatch == null) return null;
+
+    final key = swatch.keys.firstWhereOrNull(
+      (key) => key?.toIntValue() == swatchValue,
+    );
+    if (key == null) return null;
+
+    return swatch[key];
+  }
+
+  /// Checks whether [type] is - or extends - the dart:ui Color class.
+  bool _isColor(DartType? type) => type != null && _flutter.isColor(type);
+
+  /// Checks whether this elements library is dart:ui.
+  bool _isDartUi(Element? element) => element?.library?.name == 'dart.ui';
+
+  /// Checks whether this elements library is Flutter Material colors.
+  bool _isFlutterMaterial(Element? element) =>
+      element?.library?.identifier ==
+      'package:flutter/src/material/colors.dart';
+
+  /// Checks whether this elements library is Flutter Painting colors.
+  bool _isFlutterPainting(Element? element) =>
+      element?.library?.identifier ==
+      'package:flutter/src/painting/colors.dart';
+
+  /// Tries to record a color value from [colorConst] for [expression].
+  ///
+  /// Returns whether a valid color was found and recorded.
+  bool _tryRecordColor(Expression expression, DartObject? colorConst) =>
+      _tryRecordColorValue(expression, _colorValueForColorConst(colorConst));
+
+  /// Tries to record the [colorValue] for [expression].
+  ///
+  /// Returns whether a valid color was found and recorded.
+  bool _tryRecordColorValue(Expression expression, int? colorValue) {
+    if (colorValue == null) return false;
+
+    // Build color information from the Color value.
+    final color = _colorInformationForColorValue(colorValue);
+
+    // Record the color against the original entire expression.
+    _colors.add(ColorReference(expression.offset, expression.length, color));
+    return true;
+  }
+}
+
+/// Information about a color that is present in a document.
+class ColorInformation {
+  final int alpha;
+  final int red;
+  final int green;
+  final int blue;
+
+  ColorInformation(this.alpha, this.red, this.green, this.blue);
+}
+
+/// Information about a specific known location of a [ColorInformation]
+/// reference in a document.
+class ColorReference {
+  final int offset;
+  final int length;
+  final ColorInformation color;
+
+  ColorReference(this.offset, this.length, this.color);
+}
+
+class _ColorBuilder extends RecursiveAstVisitor<void> {
+  final ColorComputer computer;
+
+  _ColorBuilder(this.computer);
+
+  @override
+  void visitIndexExpression(IndexExpression node) {
+    // Colors.redAccent[500].
+    final index = node.index;
+    final indexValue = index is IntegerLiteral ? index.value : null;
+    if (indexValue != null) {
+      if (computer.tryAddColor(
+        node,
+        target: node.realTarget,
+        index: indexValue,
+      )) {
+        return;
+      }
+    }
+    super.visitIndexExpression(node);
+  }
+
+  @override
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
+    // Usually we return after finding a color, but constructors can
+    // have nested colors in their arguments so we walk all the way down.
+    if (!computer.tryAddColor(node)) {
+      // If we couldn't evaluate the constant, try the well-known color
+      // constructors for dart:ui/Flutter.
+      computer.tryAddKnownColorConstructor(node);
+    }
+
+    super.visitInstanceCreationExpression(node);
+  }
+
+  @override
+  void visitPrefixedIdentifier(PrefixedIdentifier node) {
+    // Try the whole node as a constant (eg. `MyThemeClass.staticField`).
+    if (computer.tryAddColor(node)) {
+      return;
+    }
+
+    // Try a field of a static, (eg. `const MyThemeClass().instanceField`).
+    if (computer.tryAddColor(
+      node,
+      target: node.prefix,
+      memberName: node.identifier.name,
+    )) {
+      return;
+    }
+
+    super.visitPrefixedIdentifier(node);
+  }
+
+  @override
+  void visitPropertyAccess(PropertyAccess node) {
+    // Handle things like CupterinoColors.activeBlue.darkColor where we can't
+    // evaluate the whole expression, but can evaluate CupterinoColors.activeBlue
+    // and read the darkColor.
+    if (computer.tryAddColor(
+      node,
+      target: node.realTarget,
+      memberName: node.propertyName.name,
+    )) {
+      return;
+    }
+
+    super.visitPropertyAccess(node);
+  }
+}
+
+extension _DartObjectExtensions on DartObject {
+  /// Reads the value of the field [field] from this object.
+  ///
+  /// If the field is not found, recurses up the super classes.
+  DartObject? getFieldFromHierarchy(String fieldName) =>
+      getField(fieldName) ??
+      getField(GenericState.SUPERCLASS_FIELD)?.getFieldFromHierarchy(fieldName);
+}
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 1f568f7..b6df480 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -18,7 +18,6 @@
 import 'package:analyzer/src/generated/java_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/lint/linter.dart';
 import 'package:analyzer/src/lint/pub.dart';
 import 'package:analyzer/src/manifest/manifest_validator.dart';
@@ -222,7 +221,7 @@
       this._performanceLog,
       this._scheduler,
       this._instrumentationService,
-      {required enableBazelWatcher})
+      {required bool enableBazelWatcher})
       : pathContext = resourceProvider.pathContext {
     if (enableBazelWatcher) {
       bazelWatcherService = BazelFileWatcherService(_instrumentationService);
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index b1b2b36..60c81b6 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
+import 'dart:collection';
 
 import 'package:analysis_server/protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_constants.dart';
@@ -16,6 +17,7 @@
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/fuzzy_filter_sort.dart';
+import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analysis_server/src/services/completion/yaml/analysis_options_generator.dart';
 import 'package:analysis_server/src/services/completion/yaml/fix_data_generator.dart';
 import 'package:analysis_server/src/services/completion/yaml/pubspec_generator.dart';
@@ -29,6 +31,7 @@
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:collection/collection.dart';
 
 /// Instances of the class [CompletionDomainHandler] implement a
 /// [RequestHandler] that handles requests in the completion domain.
@@ -45,9 +48,6 @@
   /// The next completion response id.
   int _nextCompletionId = 0;
 
-  /// Code completion performance for the last completion operation.
-  CompletionPerformance? performance;
-
   /// A list of code completion performance measurements for the latest
   /// completion operation up to [performanceListMaxLength] measurements.
   final RecentBuffer<CompletionPerformance> performanceList =
@@ -75,7 +75,7 @@
     Set<ElementKind>? includedElementKinds,
     Set<String>? includedElementNames,
     List<IncludedSuggestionRelevanceTag>? includedSuggestionRelevanceTags,
-    List<Uri>? librariesToImport,
+    Map<CompletionSuggestion, Uri>? notImportedSuggestions,
   }) async {
     //
     // Allow plugins to start computing fixes.
@@ -94,7 +94,7 @@
         includedElementKinds: includedElementKinds,
         includedElementNames: includedElementNames,
         includedSuggestionRelevanceTags: includedSuggestionRelevanceTags,
-        librariesToImport: librariesToImport,
+        notImportedSuggestions: notImportedSuggestions,
       );
 
       suggestions.addAll(
@@ -267,16 +267,34 @@
 
   /// Implement the 'completion.getSuggestions2' request.
   void getSuggestions2(Request request) async {
-    var budget = CompletionBudget(budgetDuration);
-
     var params = CompletionGetSuggestions2Params.fromRequest(request);
     var file = params.file;
     var offset = params.offset;
 
+    var timeoutMilliseconds = params.timeout;
+    var budget = CompletionBudget(
+      timeoutMilliseconds != null
+          ? Duration(milliseconds: timeoutMilliseconds)
+          : budgetDuration,
+    );
+
     var provider = server.resourceProvider;
     var pathContext = provider.pathContext;
 
-    // TODO(scheglov) Support non-Dart files.
+    if (file.endsWith('.yaml')) {
+      final suggestions = computeYamlSuggestions(file, offset);
+      server.sendResponse(
+        CompletionGetSuggestions2Result(
+          suggestions.replacementOffset,
+          suggestions.replacementLength,
+          suggestions.suggestions,
+          [],
+          false,
+        ).toResponse(request.id),
+      );
+      return;
+    }
+
     if (!file_paths.isDart(pathContext, file)) {
       server.sendResponse(
         CompletionGetSuggestions2Result(offset, 0, [], [], false)
@@ -285,81 +303,125 @@
       return;
     }
 
-    var resolvedUnit = await server.getResolvedUnit(file);
-    if (resolvedUnit == null) {
-      server.sendResponse(Response.fileNotAnalyzed(request, file));
-      return;
-    }
-
-    server.requestStatistics?.addItemTimeNow(request, 'resolvedUnit');
-
-    if (offset < 0 || offset > resolvedUnit.content.length) {
-      server.sendResponse(Response.invalidParameter(
-          request,
-          'params.offset',
-          'Expected offset between 0 and source length inclusive,'
-              ' but found $offset'));
-      return;
-    }
-
-    final completionPerformance = CompletionPerformance();
-    recordRequest(completionPerformance, file, resolvedUnit.content, offset);
-
-    await completionPerformance.runRequestOperation((performance) async {
-      var completionRequest = DartCompletionRequest(
-        resolvedUnit: resolvedUnit,
-        offset: offset,
-        dartdocDirectiveInfo: server.getDartdocDirectiveInfoFor(
-          resolvedUnit,
-        ),
-        documentationCache: server.getDocumentationCacheFor(resolvedUnit),
-      );
-      setNewRequest(completionRequest);
-
-      var librariesToImport = <Uri>[];
-      var suggestions = <CompletionSuggestion>[];
-      try {
-        suggestions = await computeSuggestions(
-          budget: budget,
-          performance: performance,
-          request: completionRequest,
-          librariesToImport: librariesToImport,
+    var performance = OperationPerformanceImpl('<root>');
+    performance.runAsync(
+      'request',
+      (performance) async {
+        var resolvedUnit = performance.run(
+          'resolveForCompletion',
+          (performance) {
+            return server.resolveForCompletion(
+              path: file,
+              offset: offset,
+              performance: performance,
+            );
+          },
         );
-      } on AbortCompletion {
-        return server.sendResponse(
-          CompletionGetSuggestions2Result(
-            completionRequest.replacementOffset,
-            completionRequest.replacementLength,
-            [],
-            [],
-            true,
-          ).toResponse(request.id),
+        if (resolvedUnit == null) {
+          server.sendResponse(Response.fileNotAnalyzed(request, file));
+          return;
+        }
+
+        if (offset < 0 || offset > resolvedUnit.content.length) {
+          server.sendResponse(Response.invalidParameter(
+              request,
+              'params.offset',
+              'Expected offset between 0 and source length inclusive,'
+                  ' but found $offset'));
+          return;
+        }
+
+        final completionPerformance = CompletionPerformance(
+          operation: performance,
+          path: file,
+          content: resolvedUnit.content,
+          offset: offset,
         );
-      }
+        performanceList.add(completionPerformance);
 
-      performance.run('filter', (performance) {
-        performance.getDataInt('count').add(suggestions.length);
-        suggestions = fuzzyFilterSort(
-          pattern: completionRequest.targetPrefix,
-          suggestions: suggestions,
+        var analysisSession = resolvedUnit.analysisSession;
+        var enclosingNode =
+            resolvedUnit.resolvedNodes.lastOrNull ?? resolvedUnit.parsedUnit;
+
+        var completionRequest = DartCompletionRequest(
+          analysisSession: analysisSession,
+          filePath: resolvedUnit.path,
+          fileContent: resolvedUnit.content,
+          unitElement: resolvedUnit.unitElement,
+          enclosingNode: enclosingNode,
+          offset: offset,
+          dartdocDirectiveInfo:
+              server.getDartdocDirectiveInfoForSession(analysisSession),
+          documentationCache:
+              server.getDocumentationCacheForSession(analysisSession),
         );
-        performance.getDataInt('matchCount').add(suggestions.length);
-      });
+        setNewRequest(completionRequest);
 
-      var lengthRestricted = suggestions.take(params.maxResults).toList();
-      var isIncomplete = lengthRestricted.length < suggestions.length;
-      completionPerformance.suggestionCount = lengthRestricted.length;
+        var notImportedSuggestions =
+            HashMap<CompletionSuggestion, Uri>.identity();
+        var suggestions = <CompletionSuggestion>[];
+        try {
+          suggestions = await computeSuggestions(
+            budget: budget,
+            performance: performance,
+            request: completionRequest,
+            notImportedSuggestions: notImportedSuggestions,
+          );
+        } on AbortCompletion {
+          return server.sendResponse(
+            CompletionGetSuggestions2Result(
+              completionRequest.replacementOffset,
+              completionRequest.replacementLength,
+              [],
+              [],
+              true,
+            ).toResponse(request.id),
+          );
+        }
 
-      server.sendResponse(
-        CompletionGetSuggestions2Result(
-          completionRequest.replacementOffset,
-          completionRequest.replacementLength,
-          lengthRestricted,
-          librariesToImport.map((e) => '$e').toList(),
-          isIncomplete,
-        ).toResponse(request.id),
-      );
-    });
+        performance.run('filter', (performance) {
+          performance.getDataInt('count').add(suggestions.length);
+          suggestions = fuzzyFilterSort(
+            pattern: completionRequest.targetPrefix,
+            suggestions: suggestions,
+          );
+          performance.getDataInt('matchCount').add(suggestions.length);
+        });
+
+        var lengthRestricted = suggestions.take(params.maxResults).toList();
+        var isIncomplete = lengthRestricted.length < suggestions.length;
+        completionPerformance.suggestionCount = lengthRestricted.length;
+
+        // Update `libraryUriToImportIndex` for not yet imported.
+        // Gather referenced unique libraries to import.
+        var librariesToImport = <Uri, int>{};
+        for (var i = 0; i < lengthRestricted.length; i++) {
+          var suggestion = lengthRestricted[i];
+          var libraryToImport = notImportedSuggestions[suggestion];
+          if (libraryToImport != null) {
+            var index = librariesToImport.putIfAbsent(
+              libraryToImport,
+              () => librariesToImport.length,
+            );
+            lengthRestricted[i] = suggestion.copyWith(
+              libraryUriToImportIndex: CopyWithValue(index),
+            );
+          }
+        }
+
+        performance.run('sendResponse', (_) {
+          server.sendResponse(
+            CompletionGetSuggestions2Result(
+              completionRequest.replacementOffset,
+              completionRequest.replacementLength,
+              lengthRestricted,
+              librariesToImport.keys.map((e) => '$e').toList(),
+              isIncomplete,
+            ).toResponse(request.id),
+          );
+        });
+      },
+    );
   }
 
   @override
@@ -410,161 +472,160 @@
   Future<void> processRequest(Request request) async {
     var budget = CompletionBudget(budgetDuration);
 
-    final performance = this.performance = CompletionPerformance();
+    // extract and validate params
+    var params = CompletionGetSuggestionsParams.fromRequest(request);
+    var file = params.file;
+    var offset = params.offset;
 
-    await performance.runRequestOperation((perf) async {
-      // extract and validate params
-      var params = CompletionGetSuggestionsParams.fromRequest(request);
-      var file = params.file;
-      var offset = params.offset;
-
-      if (server.sendResponseErrorIfInvalidFilePath(request, file)) {
-        return;
-      }
-      if (file.endsWith('.yaml')) {
-        // Return the response without results.
-        var completionId = (_nextCompletionId++).toString();
-        server.sendResponse(CompletionGetSuggestionsResult(completionId)
-            .toResponse(request.id));
-        // Send a notification with results.
-        final suggestions = computeYamlSuggestions(file, offset);
-        sendCompletionNotification(
-          completionId,
-          suggestions.replacementOffset,
-          suggestions.replacementLength,
-          suggestions.suggestions,
-          null,
-          null,
-          null,
-          null,
-        );
-        return;
-      } else if (!file.endsWith('.dart')) {
-        // Return the response without results.
-        var completionId = (_nextCompletionId++).toString();
-        server.sendResponse(CompletionGetSuggestionsResult(completionId)
-            .toResponse(request.id));
-        // Send a notification with results.
-        sendCompletionNotification(
-            completionId, offset, 0, [], null, null, null, null);
-        return;
-      }
-
-      var resolvedUnit = await server.getResolvedUnit(file);
-      if (resolvedUnit == null) {
-        server.sendResponse(Response.fileNotAnalyzed(request, 'params.offset'));
-        return;
-      }
-
-      server.requestStatistics?.addItemTimeNow(request, 'resolvedUnit');
-
-      if (offset < 0 || offset > resolvedUnit.content.length) {
-        server.sendResponse(Response.invalidParameter(
-            request,
-            'params.offset',
-            'Expected offset between 0 and source length inclusive,'
-                ' but found $offset'));
-        return;
-      }
-
-      recordRequest(performance, file, resolvedUnit.content, offset);
-
-      var declarationsTracker = server.declarationsTracker;
-      if (declarationsTracker == null) {
-        server.sendResponse(Response.unsupportedFeature(
-            request.id, 'Completion is not enabled.'));
-        return;
-      }
-
-      var completionRequest = DartCompletionRequest(
-        resolvedUnit: resolvedUnit,
-        offset: offset,
-        dartdocDirectiveInfo: server.getDartdocDirectiveInfoFor(
-          resolvedUnit,
-        ),
-        documentationCache: server.getDocumentationCacheFor(resolvedUnit),
-      );
-
-      var completionId = (_nextCompletionId++).toString();
-
-      setNewRequest(completionRequest);
-
-      // initial response without results
-      server.sendResponse(
-          CompletionGetSuggestionsResult(completionId).toResponse(request.id));
-
-      // If the client opted into using available suggestion sets,
-      // create the kinds set, so signal the completion manager about opt-in.
-      Set<ElementKind>? includedElementKinds;
-      Set<String>? includedElementNames;
-      List<IncludedSuggestionRelevanceTag>? includedSuggestionRelevanceTags;
-      if (subscriptions.contains(CompletionService.AVAILABLE_SUGGESTION_SETS)) {
-        includedElementKinds = <ElementKind>{};
-        includedElementNames = <String>{};
-        includedSuggestionRelevanceTags = <IncludedSuggestionRelevanceTag>[];
-      }
-
-      // Compute suggestions in the background
-      try {
-        var suggestions = <CompletionSuggestion>[];
-        try {
-          suggestions = await computeSuggestions(
-            budget: budget,
-            performance: perf,
-            request: completionRequest,
-            includedElementKinds: includedElementKinds,
-            includedElementNames: includedElementNames,
-            includedSuggestionRelevanceTags: includedSuggestionRelevanceTags,
-          );
-        } on AbortCompletion {
-          // Continue with empty suggestions list.
-        }
-        String? libraryFile;
-        var includedSuggestionSets = <IncludedSuggestionSet>[];
-        if (includedElementKinds != null && includedElementNames != null) {
-          libraryFile = resolvedUnit.libraryElement.source.fullName;
-          server.sendNotification(
-            createExistingImportsNotification(resolvedUnit),
-          );
-          computeIncludedSetList(
-            declarationsTracker,
-            resolvedUnit,
-            includedSuggestionSets,
-            includedElementNames,
-          );
-        }
-
-        const SEND_NOTIFICATION_TAG = 'send notification';
-        perf.run(SEND_NOTIFICATION_TAG, (_) {
-          sendCompletionNotification(
-            completionId,
-            completionRequest.replacementOffset,
-            completionRequest.replacementLength,
-            suggestions,
-            libraryFile,
-            includedSuggestionSets,
-            includedElementKinds?.toList(),
-            includedSuggestionRelevanceTags,
-          );
-        });
-
-        performance.suggestionCount = suggestions.length;
-      } finally {
-        ifMatchesRequestClear(completionRequest);
-      }
-    });
-  }
-
-  /// If tracking code completion performance over time, then
-  /// record addition information about the request in the performance record.
-  void recordRequest(CompletionPerformance performance, String path,
-      String content, int offset) {
-    performance.path = path;
-    if (performanceListMaxLength == 0) {
+    if (server.sendResponseErrorIfInvalidFilePath(request, file)) {
       return;
     }
-    performance.setContentsAndOffset(content, offset);
-    performanceList.add(performance);
+
+    var performance = OperationPerformanceImpl('<root>');
+    performance.runAsync(
+      'request',
+      (performance) async {
+        if (file.endsWith('.yaml')) {
+          // Return the response without results.
+          var completionId = (_nextCompletionId++).toString();
+          server.sendResponse(CompletionGetSuggestionsResult(completionId)
+              .toResponse(request.id));
+          // Send a notification with results.
+          final suggestions = computeYamlSuggestions(file, offset);
+          sendCompletionNotification(
+            completionId,
+            suggestions.replacementOffset,
+            suggestions.replacementLength,
+            suggestions.suggestions,
+            null,
+            null,
+            null,
+            null,
+          );
+          return;
+        } else if (!file.endsWith('.dart')) {
+          // Return the response without results.
+          var completionId = (_nextCompletionId++).toString();
+          server.sendResponse(CompletionGetSuggestionsResult(completionId)
+              .toResponse(request.id));
+          // Send a notification with results.
+          sendCompletionNotification(
+              completionId, offset, 0, [], null, null, null, null);
+          return;
+        }
+
+        var resolvedUnit = await server.getResolvedUnit(file);
+        if (resolvedUnit == null) {
+          server
+              .sendResponse(Response.fileNotAnalyzed(request, 'params.offset'));
+          return;
+        }
+
+        server.requestStatistics?.addItemTimeNow(request, 'resolvedUnit');
+
+        if (offset < 0 || offset > resolvedUnit.content.length) {
+          server.sendResponse(Response.invalidParameter(
+              request,
+              'params.offset',
+              'Expected offset between 0 and source length inclusive,'
+                  ' but found $offset'));
+          return;
+        }
+
+        final completionPerformance = CompletionPerformance(
+          operation: performance,
+          path: file,
+          content: resolvedUnit.content,
+          offset: offset,
+        );
+        performanceList.add(completionPerformance);
+
+        var declarationsTracker = server.declarationsTracker;
+        if (declarationsTracker == null) {
+          server.sendResponse(Response.unsupportedFeature(
+              request.id, 'Completion is not enabled.'));
+          return;
+        }
+
+        var completionRequest = DartCompletionRequest.forResolvedUnit(
+          resolvedUnit: resolvedUnit,
+          offset: offset,
+          dartdocDirectiveInfo: server.getDartdocDirectiveInfoFor(
+            resolvedUnit,
+          ),
+          documentationCache: server.getDocumentationCacheFor(resolvedUnit),
+        );
+
+        var completionId = (_nextCompletionId++).toString();
+
+        setNewRequest(completionRequest);
+
+        // initial response without results
+        server.sendResponse(CompletionGetSuggestionsResult(completionId)
+            .toResponse(request.id));
+
+        // If the client opted into using available suggestion sets,
+        // create the kinds set, so signal the completion manager about opt-in.
+        Set<ElementKind>? includedElementKinds;
+        Set<String>? includedElementNames;
+        List<IncludedSuggestionRelevanceTag>? includedSuggestionRelevanceTags;
+        if (subscriptions
+            .contains(CompletionService.AVAILABLE_SUGGESTION_SETS)) {
+          includedElementKinds = <ElementKind>{};
+          includedElementNames = <String>{};
+          includedSuggestionRelevanceTags = <IncludedSuggestionRelevanceTag>[];
+        }
+
+        // Compute suggestions in the background
+        try {
+          var suggestions = <CompletionSuggestion>[];
+          try {
+            suggestions = await computeSuggestions(
+              budget: budget,
+              performance: performance,
+              request: completionRequest,
+              includedElementKinds: includedElementKinds,
+              includedElementNames: includedElementNames,
+              includedSuggestionRelevanceTags: includedSuggestionRelevanceTags,
+            );
+          } on AbortCompletion {
+            // Continue with empty suggestions list.
+          }
+          String? libraryFile;
+          var includedSuggestionSets = <IncludedSuggestionSet>[];
+          if (includedElementKinds != null && includedElementNames != null) {
+            libraryFile = resolvedUnit.libraryElement.source.fullName;
+            server.sendNotification(
+              createExistingImportsNotification(resolvedUnit),
+            );
+            computeIncludedSetList(
+              declarationsTracker,
+              completionRequest,
+              includedSuggestionSets,
+              includedElementNames,
+            );
+          }
+
+          const SEND_NOTIFICATION_TAG = 'send notification';
+          performance.run(SEND_NOTIFICATION_TAG, (_) {
+            sendCompletionNotification(
+              completionId,
+              completionRequest.replacementOffset,
+              completionRequest.replacementLength,
+              suggestions,
+              libraryFile,
+              includedSuggestionSets,
+              includedElementKinds?.toList(),
+              includedSuggestionRelevanceTags,
+            );
+          });
+
+          completionPerformance.suggestionCount = suggestions.length;
+        } finally {
+          ifMatchesRequestClear(completionRequest);
+        }
+      },
+    );
   }
 
   /// Send completion notification results.
@@ -670,11 +731,8 @@
   _RequestToPlugins? _sendRequestToPlugins(
     DartCompletionRequest completionRequest,
   ) {
-    var resolvedUnit = completionRequest.result;
-    var analysisContext = resolvedUnit.session.analysisContext;
-
     var pluginRequestParameters = plugin.CompletionGetSuggestionsParams(
-      resolvedUnit.path,
+      completionRequest.path,
       completionRequest.offset,
     );
 
@@ -683,7 +741,7 @@
       parameters: pluginRequestParameters,
       futures: server.pluginManager.broadcastRequest(
         pluginRequestParameters,
-        contextRoot: analysisContext.contextRoot,
+        contextRoot: completionRequest.analysisContext.contextRoot,
       ),
     );
   }
diff --git a/pkg/analysis_server/lib/src/domain_execution.dart b/pkg/analysis_server/lib/src/domain_execution.dart
index f047af1..5550f0b 100644
--- a/pkg/analysis_server/lib/src/domain_execution.dart
+++ b/pkg/analysis_server/lib/src/domain_execution.dart
@@ -8,7 +8,6 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/generated/source.dart';
 
 /// Instances of the class [ExecutionDomainHandler] implement a [RequestHandler]
 /// that handles requests in the `execution` domain.
@@ -122,10 +121,10 @@
       }
 
       var source = driver.fsState.getFileForPath(file).source;
-      if (source.uriKind != UriKind.FILE_URI) {
+      if (!source.uri.isScheme('file')) {
         uri = source.uri.toString();
       } else {
-        uri = sourceFactory.restoreUri(source).toString();
+        uri = sourceFactory.pathToUri(file).toString();
       }
       return ExecutionMapUriResult(uri: uri).toResponse(request.id);
     } else if (uri != null) {
diff --git a/pkg/analysis_server/lib/src/domain_server.dart b/pkg/analysis_server/lib/src/domain_server.dart
index 5dca197..559f3b8 100644
--- a/pkg/analysis_server/lib/src/domain_server.dart
+++ b/pkg/analysis_server/lib/src/domain_server.dart
@@ -19,7 +19,9 @@
 
   /// Return the version number of the analysis server.
   Response getVersion(Request request) {
-    return ServerGetVersionResult(PROTOCOL_VERSION).toResponse(request.id);
+    return ServerGetVersionResult(
+      server.options.reportProtocolVersion ?? PROTOCOL_VERSION,
+    ).toResponse(request.id);
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart b/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
index 1d4b4b5..e8838ce 100644
--- a/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
+++ b/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
@@ -3,29 +3,29 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 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/services/available_declarations.dart';
 
-/// Compute which suggestion sets should be included into completion inside
-/// the given [resolvedUnit] of a file.  Depending on the file path, it might
+/// Compute which suggestion sets should be included into completion for
+/// the given completion [request].  Depending on the file path, it might
 /// include different sets, e.g. inside the `lib/` directory of a `Pub` package
 /// only regular dependencies can be referenced, but `test/` can reference
 /// both regular and "dev" dependencies.
 void computeIncludedSetList(
   DeclarationsTracker tracker,
-  ResolvedUnitResult resolvedUnit,
+  DartCompletionRequest request,
   List<protocol.IncludedSuggestionSet> includedSetList,
   Set<String> includedElementNames,
 ) {
-  var analysisContext = resolvedUnit.session.analysisContext;
-  var context = tracker.getContext(analysisContext);
+  var context = tracker.getContext(request.analysisContext);
   if (context == null) return;
 
-  var librariesObject = context.getLibraries(resolvedUnit.path);
+  var librariesObject = context.getLibraries(request.path);
 
-  var importedUriSet = resolvedUnit.libraryElement.importedLibraries
+  var importedUriSet = request.libraryElement.importedLibraries
       .map((importedLibrary) => importedLibrary.source.uri)
       .toSet();
 
@@ -48,7 +48,7 @@
       protocol.IncludedSuggestionSet(
         library.id,
         relevance,
-        displayUri: _getRelativeFileUri(resolvedUnit, library.uri),
+        displayUri: _getRelativeFileUri(request, library.uri),
       ),
     );
 
@@ -172,11 +172,11 @@
 }
 
 /// Computes the best URI to import [what] into the [unit] library.
-String? _getRelativeFileUri(ResolvedUnitResult unit, Uri what) {
+String? _getRelativeFileUri(DartCompletionRequest request, Uri what) {
   if (what.scheme == 'file') {
-    var pathContext = unit.session.resourceProvider.pathContext;
+    var pathContext = request.analysisSession.resourceProvider.pathContext;
 
-    var libraryPath = unit.libraryElement.source.fullName;
+    var libraryPath = request.libraryElement.source.fullName;
     var libraryFolder = pathContext.dirname(libraryPath);
 
     var whatPath = pathContext.fromUri(what);
diff --git a/pkg/analysis_server/lib/src/domains/execution/completion.dart b/pkg/analysis_server/lib/src/domains/execution/completion.dart
index a2f6ea6..e0eedc4 100644
--- a/pkg/analysis_server/lib/src/domains/execution/completion.dart
+++ b/pkg/analysis_server/lib/src/domains/execution/completion.dart
@@ -69,7 +69,7 @@
       return RuntimeCompletionResult([], []);
     }
 
-    var dartRequest = DartCompletionRequest(
+    var dartRequest = DartCompletionRequest.forResolvedUnit(
       resolvedUnit: targetResult,
       offset: targetOffset,
     );
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
index ed1ea21..a86e794 100644
--- 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
@@ -80,7 +80,7 @@
       return;
     }
     _instrumentationService.logRequest(data);
-    final Map<String, Object?> json = jsonDecode(data);
+    final json = jsonDecode(data) as Map<String, Object?>;
     if (RequestMessage.canParse(json, nullLspJsonReporter)) {
       onMessage(RequestMessage.fromJson(json));
     } else if (NotificationMessage.canParse(json, nullLspJsonReporter)) {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart
index 20c4d27..4de8bfe 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart
@@ -120,7 +120,7 @@
         final refactor = ExtractMethodRefactoring(
             server.searchEngine, result, offset, length);
 
-        var preferredName = options != null ? options['name'] : null;
+        var preferredName = options != null ? options['name'] as String : null;
         // checkInitialConditions will populate names with suggestions.
         if (preferredName == null) {
           await refactor.checkInitialConditions();
@@ -138,7 +138,7 @@
       case RefactoringKind.EXTRACT_LOCAL_VARIABLE:
         final refactor = ExtractLocalRefactoring(result, offset, length);
 
-        var preferredName = options != null ? options['name'] : null;
+        var preferredName = options != null ? options['name'] as String : null;
         // checkInitialConditions will populate names with suggestions.
         if (preferredName == null) {
           await refactor.checkInitialConditions();
@@ -162,7 +162,7 @@
         // to handle this better.
         // https://github.com/microsoft/language-server-protocol/issues/764
         refactor.name =
-            (options != null ? options['name'] : null) ?? 'NewWidget';
+            options != null ? options['name'] as String : 'NewWidget';
         return success(refactor);
 
       case RefactoringKind.INLINE_LOCAL_VARIABLE:
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
index 9f7152c..ecc14cc 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
@@ -36,10 +36,11 @@
   // CodeAction class).
   final codeActionPriorities = Expando<int>();
 
-  /// A comparator that can be used to sort [CodeActions]s using priorties
-  /// in [codeActionPriorities]. The highest number priority will be sorted
-  /// before lower number priorityies. Items with the same relevance are sorted
-  /// alphabetically by their title.
+  /// A comparator that can be used to sort [CodeActions]s using priorities
+  /// in [codeActionPriorities].
+  ///
+  /// The highest number priority will be sorted before lower number priorities.
+  /// Items with the same priority are sorted alphabetically by their title.
   late final Comparator<CodeAction> _codeActionComparator =
       (CodeAction a, CodeAction b) {
     // We should never be sorting actions without priorities.
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
index 85f3765..10e4cf9 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
@@ -26,6 +26,7 @@
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
+import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
@@ -202,216 +203,223 @@
     String? triggerCharacter,
     CancellationToken token,
   ) async {
-    final performance = CompletionPerformance();
-    performance.path = unit.path;
-    performance.setContentsAndOffset(unit.content, offset);
-    server.performanceStats.completion.add(performance);
-
-    return await performance.runRequestOperation((perf) async {
-      final completionRequest = DartCompletionRequest(
-        resolvedUnit: unit,
-        offset: offset,
-        dartdocDirectiveInfo: server.getDartdocDirectiveInfoFor(unit),
-        completionPreference: CompletionPreference.replace,
-      );
-      final target = completionRequest.target;
-
-      if (triggerCharacter != null) {
-        if (!_triggerCharacterValid(offset, triggerCharacter, target)) {
-          return success([]);
-        }
-      }
-
-      Set<ElementKind>? includedElementKinds;
-      Set<String>? includedElementNames;
-      List<IncludedSuggestionRelevanceTag>? includedSuggestionRelevanceTags;
-      if (includeSuggestionSets) {
-        includedElementKinds = <ElementKind>{};
-        includedElementNames = <String>{};
-        includedSuggestionRelevanceTags = <IncludedSuggestionRelevanceTag>[];
-      }
-
-      try {
-        var contributor = DartCompletionManager(
-          budget: CompletionBudget(CompletionBudget.defaultDuration),
-          includedElementKinds: includedElementKinds,
-          includedElementNames: includedElementNames,
-          includedSuggestionRelevanceTags: includedSuggestionRelevanceTags,
+    var performance = OperationPerformanceImpl('<root>');
+    return await performance.runAsync(
+      'request',
+      (performance) async {
+        final completionPerformance = CompletionPerformance(
+          operation: performance,
+          path: unit.path,
+          content: unit.content,
+          offset: offset,
         );
+        server.performanceStats.completion.add(completionPerformance);
 
-        final serverSuggestions = await contributor.computeSuggestions(
-          completionRequest,
-          perf,
+        final completionRequest = DartCompletionRequest.forResolvedUnit(
+          resolvedUnit: unit,
+          offset: offset,
+          dartdocDirectiveInfo: server.getDartdocDirectiveInfoFor(unit),
+          completionPreference: CompletionPreference.replace,
         );
+        final target = completionRequest.target;
 
-        final insertLength = _computeInsertLength(
-          offset,
-          completionRequest.replacementOffset,
-          completionRequest.replacementLength,
-        );
-
-        if (token.isCancellationRequested) {
-          return cancelled();
+        if (triggerCharacter != null) {
+          if (!_triggerCharacterValid(offset, triggerCharacter, target)) {
+            return success([]);
+          }
         }
 
-        /// completeFunctionCalls should be suppressed if the target is an
-        /// invocation that already has an argument list, otherwise we would
-        /// insert dupes.
-        final completeFunctionCalls = _hasExistingArgList(target.entity)
-            ? false
-            : server.clientConfiguration.global.completeFunctionCalls;
+        Set<ElementKind>? includedElementKinds;
+        Set<String>? includedElementNames;
+        List<IncludedSuggestionRelevanceTag>? includedSuggestionRelevanceTags;
+        if (includeSuggestionSets) {
+          includedElementKinds = <ElementKind>{};
+          includedElementNames = <String>{};
+          includedSuggestionRelevanceTags = <IncludedSuggestionRelevanceTag>[];
+        }
 
-        final results = serverSuggestions.map(
-          (item) {
-            var itemReplacementOffset =
-                item.replacementOffset ?? completionRequest.replacementOffset;
-            var itemReplacementLength =
-                item.replacementLength ?? completionRequest.replacementLength;
-            var itemInsertLength = insertLength;
-
-            // Recompute the insert length if it may be affected by the above.
-            if (item.replacementOffset != null ||
-                item.replacementLength != null) {
-              itemInsertLength = _computeInsertLength(
-                  offset, itemReplacementOffset, itemInsertLength);
-            }
-
-            return toCompletionItem(
-              capabilities,
-              unit.lineInfo,
-              item,
-              itemReplacementOffset,
-              itemInsertLength,
-              itemReplacementLength,
-              // TODO(dantup): Including commit characters in every completion
-              // increases the payload size. The LSP spec is ambigious
-              // about how this should be handled (and VS Code requires it) but
-              // this should be removed (or made conditional based on a capability)
-              // depending on how the spec is updated.
-              // https://github.com/microsoft/vscode-languageserver-node/issues/673
-              includeCommitCharacters:
-                  server.clientConfiguration.global.previewCommitCharacters,
-              completeFunctionCalls: completeFunctionCalls,
-            );
-          },
-        ).toList();
-
-        // Now compute items in suggestion sets.
-        var includedSuggestionSets = <IncludedSuggestionSet>[];
-        final declarationsTracker = server.declarationsTracker;
-        if (declarationsTracker != null &&
-            includedElementKinds != null &&
-            includedElementNames != null &&
-            includedSuggestionRelevanceTags != null) {
-          computeIncludedSetList(
-            declarationsTracker,
-            unit,
-            includedSuggestionSets,
-            includedElementNames,
+        try {
+          var contributor = DartCompletionManager(
+            budget: CompletionBudget(CompletionBudget.defaultDuration),
+            includedElementKinds: includedElementKinds,
+            includedElementNames: includedElementNames,
+            includedSuggestionRelevanceTags: includedSuggestionRelevanceTags,
           );
 
-          // Build a fast lookup for imported symbols so that we can filter out
-          // duplicates.
-          final alreadyImportedSymbols = _buildLookupOfImportedSymbols(unit);
+          final serverSuggestions = await contributor.computeSuggestions(
+            completionRequest,
+            performance,
+          );
 
-          includedSuggestionSets.forEach((includedSet) {
-            final library = declarationsTracker.getLibrary(includedSet.id);
-            if (library == null) {
-              return;
-            }
+          final insertLength = _computeInsertLength(
+            offset,
+            completionRequest.replacementOffset,
+            completionRequest.replacementLength,
+          );
 
-            // Make a fast lookup for tag relevance.
-            final tagBoosts = <String, int>{};
-            includedSuggestionRelevanceTags!
-                .forEach((t) => tagBoosts[t.tag] = t.relevanceBoost);
+          if (token.isCancellationRequested) {
+            return cancelled();
+          }
 
-            // Only specific types of child declarations should be included.
-            // This list matches what's in _protocolAvailableSuggestion in
-            // the DAS implementation.
-            bool shouldIncludeChild(Declaration child) =>
-                child.kind == DeclarationKind.CONSTRUCTOR ||
-                child.kind == DeclarationKind.ENUM_CONSTANT ||
-                (child.kind == DeclarationKind.GETTER && child.isStatic) ||
-                (child.kind == DeclarationKind.FIELD && child.isStatic);
+          /// completeFunctionCalls should be suppressed if the target is an
+          /// invocation that already has an argument list, otherwise we would
+          /// insert dupes.
+          final completeFunctionCalls = _hasExistingArgList(target.entity)
+              ? false
+              : server.clientConfiguration.global.completeFunctionCalls;
 
-            // Collect declarations and their children.
-            final allDeclarations = library.declarations
-                .followedBy(library.declarations
-                    .expand((decl) => decl.children.where(shouldIncludeChild)))
-                .toList();
+          final results = serverSuggestions.map(
+            (item) {
+              var itemReplacementOffset =
+                  item.replacementOffset ?? completionRequest.replacementOffset;
+              var itemReplacementLength =
+                  item.replacementLength ?? completionRequest.replacementLength;
+              var itemInsertLength = insertLength;
 
-            final setResults = allDeclarations
-                // Filter to only the kinds we should return.
-                .where((item) => includedElementKinds!
-                    .contains(protocolElementKind(item.kind)))
-                .where((item) {
-              // Check existing imports to ensure we don't already import
-              // this element (this exact element from its declaring
-              // library, not just something with the same name). If we do
-              // we'll want to skip it.
-              final declaringUri =
-                  item.parent?.locationLibraryUri ?? item.locationLibraryUri!;
+              // Recompute the insert length if it may be affected by the above.
+              if (item.replacementOffset != null ||
+                  item.replacementLength != null) {
+                itemInsertLength = _computeInsertLength(
+                    offset, itemReplacementOffset, itemInsertLength);
+              }
 
-              // For enums and named constructors, only the parent enum/class is in
-              // the list of imported symbols so we use the parents name.
-              final nameKey = item.kind == DeclarationKind.ENUM_CONSTANT ||
-                      item.kind == DeclarationKind.CONSTRUCTOR
-                  ? item.parent!.name
-                  : item.name;
-              final key = _createImportedSymbolKey(nameKey, declaringUri);
-              final importingUris = alreadyImportedSymbols[key];
+              return toCompletionItem(
+                capabilities,
+                unit.lineInfo,
+                item,
+                itemReplacementOffset,
+                itemInsertLength,
+                itemReplacementLength,
+                // TODO(dantup): Including commit characters in every completion
+                // increases the payload size. The LSP spec is ambigious
+                // about how this should be handled (and VS Code requires it) but
+                // this should be removed (or made conditional based on a capability)
+                // depending on how the spec is updated.
+                // https://github.com/microsoft/vscode-languageserver-node/issues/673
+                includeCommitCharacters:
+                    server.clientConfiguration.global.previewCommitCharacters,
+                completeFunctionCalls: completeFunctionCalls,
+              );
+            },
+          ).toList();
 
-              // Keep it only if:
-              // - no existing imports include it
-              //     (in which case all libraries will be offered as
-              //     auto-imports)
-              // - this is the first imported URI that includes it
-              //     (we don't want to repeat it for each imported library that
-              //     includes it)
-              return importingUris == null ||
-                  importingUris.first == '${library.uri}';
-            }).map((item) => declarationToCompletionItem(
-                      capabilities,
-                      unit.path,
-                      offset,
-                      includedSet,
-                      library,
-                      tagBoosts,
-                      unit.lineInfo,
-                      item,
-                      completionRequest.replacementOffset,
-                      insertLength,
-                      completionRequest.replacementLength,
-                      // TODO(dantup): Including commit characters in every completion
-                      // increases the payload size. The LSP spec is ambigious
-                      // about how this should be handled (and VS Code requires it) but
-                      // this should be removed (or made conditional based on a capability)
-                      // depending on how the spec is updated.
-                      // https://github.com/microsoft/vscode-languageserver-node/issues/673
-                      includeCommitCharacters: server
-                          .clientConfiguration.global.previewCommitCharacters,
-                      completeFunctionCalls: completeFunctionCalls,
-                    ));
-            results.addAll(setResults);
-          });
+          // Now compute items in suggestion sets.
+          var includedSuggestionSets = <IncludedSuggestionSet>[];
+          final declarationsTracker = server.declarationsTracker;
+          if (declarationsTracker != null &&
+              includedElementKinds != null &&
+              includedElementNames != null &&
+              includedSuggestionRelevanceTags != null) {
+            computeIncludedSetList(
+              declarationsTracker,
+              completionRequest,
+              includedSuggestionSets,
+              includedElementNames,
+            );
+
+            // Build a fast lookup for imported symbols so that we can filter out
+            // duplicates.
+            final alreadyImportedSymbols = _buildLookupOfImportedSymbols(unit);
+
+            includedSuggestionSets.forEach((includedSet) {
+              final library = declarationsTracker.getLibrary(includedSet.id);
+              if (library == null) {
+                return;
+              }
+
+              // Make a fast lookup for tag relevance.
+              final tagBoosts = <String, int>{};
+              includedSuggestionRelevanceTags!
+                  .forEach((t) => tagBoosts[t.tag] = t.relevanceBoost);
+
+              // Only specific types of child declarations should be included.
+              // This list matches what's in _protocolAvailableSuggestion in
+              // the DAS implementation.
+              bool shouldIncludeChild(Declaration child) =>
+                  child.kind == DeclarationKind.CONSTRUCTOR ||
+                  child.kind == DeclarationKind.ENUM_CONSTANT ||
+                  (child.kind == DeclarationKind.GETTER && child.isStatic) ||
+                  (child.kind == DeclarationKind.FIELD && child.isStatic);
+
+              // Collect declarations and their children.
+              final allDeclarations = library.declarations
+                  .followedBy(library.declarations.expand(
+                      (decl) => decl.children.where(shouldIncludeChild)))
+                  .toList();
+
+              final setResults = allDeclarations
+                  // Filter to only the kinds we should return.
+                  .where((item) => includedElementKinds!
+                      .contains(protocolElementKind(item.kind)))
+                  .where((item) {
+                // Check existing imports to ensure we don't already import
+                // this element (this exact element from its declaring
+                // library, not just something with the same name). If we do
+                // we'll want to skip it.
+                final declaringUri =
+                    item.parent?.locationLibraryUri ?? item.locationLibraryUri!;
+
+                // For enums and named constructors, only the parent enum/class is in
+                // the list of imported symbols so we use the parents name.
+                final nameKey = item.kind == DeclarationKind.ENUM_CONSTANT ||
+                        item.kind == DeclarationKind.CONSTRUCTOR
+                    ? item.parent!.name
+                    : item.name;
+                final key = _createImportedSymbolKey(nameKey, declaringUri);
+                final importingUris = alreadyImportedSymbols[key];
+
+                // Keep it only if:
+                // - no existing imports include it
+                //     (in which case all libraries will be offered as
+                //     auto-imports)
+                // - this is the first imported URI that includes it
+                //     (we don't want to repeat it for each imported library that
+                //     includes it)
+                return importingUris == null ||
+                    importingUris.first == '${library.uri}';
+              }).map((item) => declarationToCompletionItem(
+                        capabilities,
+                        unit.path,
+                        offset,
+                        includedSet,
+                        library,
+                        tagBoosts,
+                        unit.lineInfo,
+                        item,
+                        completionRequest.replacementOffset,
+                        insertLength,
+                        completionRequest.replacementLength,
+                        // TODO(dantup): Including commit characters in every completion
+                        // increases the payload size. The LSP spec is ambigious
+                        // about how this should be handled (and VS Code requires it) but
+                        // this should be removed (or made conditional based on a capability)
+                        // depending on how the spec is updated.
+                        // https://github.com/microsoft/vscode-languageserver-node/issues/673
+                        includeCommitCharacters: server
+                            .clientConfiguration.global.previewCommitCharacters,
+                        completeFunctionCalls: completeFunctionCalls,
+                      ));
+              results.addAll(setResults);
+            });
+          }
+
+          // Perform fuzzy matching based on the identifier in front of the caret to
+          // reduce the size of the payload.
+          final fuzzyPattern = completionRequest.targetPrefix;
+          final fuzzyMatcher =
+              FuzzyMatcher(fuzzyPattern, matchStyle: MatchStyle.TEXT);
+
+          final matchingResults =
+              results.where((e) => fuzzyMatcher.score(e.label) > 0).toList();
+
+          completionPerformance.suggestionCount = results.length;
+
+          return success(matchingResults);
+        } on AbortCompletion {
+          return success([]);
         }
-
-        // Perform fuzzy matching based on the identifier in front of the caret to
-        // reduce the size of the payload.
-        final fuzzyPattern = completionRequest.targetPrefix;
-        final fuzzyMatcher =
-            FuzzyMatcher(fuzzyPattern, matchStyle: MatchStyle.TEXT);
-
-        final matchingResults =
-            results.where((e) => fuzzyMatcher.score(e.label) > 0).toList();
-
-        performance.suggestionCount = results.length;
-
-        return success(matchingResults);
-      } on AbortCompletion {
-        return success([]);
-      }
-    });
+      },
+    );
   }
 
   Future<ErrorOr<List<CompletionItem>>> _getServerYamlItems(
@@ -474,7 +482,9 @@
     return (node is ast.InvocationExpression &&
             !node.argumentList.beginToken.isSynthetic) ||
         (node is ast.InstanceCreationExpression &&
-            !node.argumentList.beginToken.isSynthetic);
+            !node.argumentList.beginToken.isSynthetic) ||
+        // "ClassName.^()" will appear as accessing a property named '('.
+        (node is ast.PropertyAccess && node.propertyName.name.startsWith('('));
   }
 
   Iterable<CompletionItem> _pluginResultsToItems(
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart
index 30935d6..72903a8 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart
@@ -60,11 +60,12 @@
           'Requests not before server is initilized');
     }
 
-    final lineInfo = server.getLineInfo(data.file);
+    final file = data.file;
+    final lineInfo = server.getLineInfo(file);
     if (lineInfo == null) {
       return error(
         ErrorCodes.InternalError,
-        'Line info not available for ${data.file}',
+        'Line info not available for $file',
         null,
       );
     }
@@ -99,7 +100,7 @@
     _latestCompletionItem = item;
     while (item == _latestCompletionItem && timer.elapsed < timeout) {
       try {
-        final analysisDriver = server.getAnalysisDriver(data.file);
+        final analysisDriver = server.getAnalysisDriver(file);
         final session = analysisDriver?.currentSession;
 
         // We shouldn't not get a driver/session, but if we did perhaps the file
@@ -139,7 +140,7 @@
 
         var newInsertText = item.insertText ?? item.label;
         final builder = ChangeBuilder(session: session);
-        await builder.addDartFileEdit(data.file, (builder) {
+        await builder.addDartFileEdit(file, (builder) {
           final result = builder.importLibraryElement(library.uri);
           if (result.prefix != null) {
             newInsertText = '${result.prefix}.$newInsertText';
@@ -152,9 +153,9 @@
 
         final changes = builder.sourceChange;
         final thisFilesChanges =
-            changes.edits.where((e) => e.file == data.file).toList();
+            changes.edits.where((e) => e.file == file).toList();
         final otherFilesChanges =
-            changes.edits.where((e) => e.file != data.file).toList();
+            changes.edits.where((e) => e.file != file).toList();
 
         // If this completion involves editing other files, we'll need to build
         // a command that the client will call to apply those edits later.
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color.dart
new file mode 100644
index 0000000..07bf25b
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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/computer/computer_color.dart'
+    show ColorComputer, ColorReference;
+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';
+
+/// Handles textDocument/documentColor requests.
+///
+/// This request is sent by the client to the server to request the locations
+/// of any colors in the document so that it can render color previews. If the
+/// editor has a color picker, it may also call textDocument/colorPresentation
+/// to obtain the code to insert when a new color is selected (see
+/// [DocumentColorPresentationHandler]).
+class DocumentColorHandler
+    extends MessageHandler<DocumentColorParams, List<ColorInformation>> {
+  DocumentColorHandler(LspAnalysisServer server) : super(server);
+  @override
+  Method get handlesMessage => Method.textDocument_documentColor;
+
+  @override
+  LspJsonHandler<DocumentColorParams> get jsonHandler =>
+      DocumentColorParams.jsonHandler;
+
+  @override
+  Future<ErrorOr<List<ColorInformation>>> handle(
+      DocumentColorParams params, CancellationToken token) async {
+    if (!isDartDocument(params.textDocument)) {
+      return success([]);
+    }
+
+    final path = pathOfDoc(params.textDocument);
+    final unit = await path.mapResult(requireResolvedUnit);
+    return unit.mapResult((unit) => _getColors(unit));
+  }
+
+  ErrorOr<List<ColorInformation>> _getColors(ResolvedUnitResult unit) {
+    ColorInformation _toColorInformation(ColorReference reference) {
+      return ColorInformation(
+        range: toRange(unit.lineInfo, reference.offset, reference.length),
+        color: Color(
+          // LSP colors are decimal in the range 0-1 but our internal references
+          // are 0-255, so divide them.
+          alpha: reference.color.alpha / 255,
+          red: reference.color.red / 255,
+          green: reference.color.green / 255,
+          blue: reference.color.blue / 255,
+        ),
+      );
+    }
+
+    final computer = ColorComputer(unit);
+    final colors = computer.compute();
+    return success(colors.map(_toColorInformation).toList());
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart
new file mode 100644
index 0000000..06fdd44
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart
@@ -0,0 +1,169 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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';
+import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/source/source_range.dart';
+import 'package:analyzer/src/dart/analysis/session_helper.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+
+/// Handles textDocument/colorPresentation.
+///
+/// This request is sent by the client if it allowed the user to pick a color
+/// using a color picker (in a location returned by textDocument/documentColor)
+/// and needs a representation of this color, including the edits to insert it
+/// into the source file.
+class DocumentColorPresentationHandler
+    extends MessageHandler<ColorPresentationParams, List<ColorPresentation>> {
+  DocumentColorPresentationHandler(LspAnalysisServer server) : super(server);
+  @override
+  Method get handlesMessage => Method.textDocument_colorPresentation;
+
+  @override
+  LspJsonHandler<ColorPresentationParams> get jsonHandler =>
+      ColorPresentationParams.jsonHandler;
+
+  @override
+  Future<ErrorOr<List<ColorPresentation>>> handle(
+    ColorPresentationParams params,
+    CancellationToken token,
+  ) async {
+    if (!isDartDocument(params.textDocument)) {
+      return success([]);
+    }
+
+    final path = pathOfDoc(params.textDocument);
+    final unit = await path.mapResult(requireResolvedUnit);
+    return unit.mapResult((unit) => _getPresentations(params, unit));
+  }
+
+  /// Converts individual 0-255 ARGB values into a single int value as
+  /// 0xAARRGGBB as used by the dart:ui Color class.
+  int _colorValueForComponents(int alpha, int red, int green, int blue) {
+    return (alpha << 24) | (red << 16) | (green << 8) | (blue << 0);
+  }
+
+  /// Creates a [ColorPresentation] for inserting code to produce a dart:ui
+  /// or Flutter Color at [editRange].
+  ///
+  /// [colorType] is the Type of the Color class whose constructor will be
+  /// called. This will be replaced into [editRange] and any required import
+  /// statement will produce additional edits.
+  ///
+  /// [label] is the visible label shown to the user and should roughly reflect
+  /// the code that will be inserted.
+  ///
+  /// [invocationString] is written immediately after [colorType] in [editRange].
+  Future<ColorPresentation> _createColorPresentation(
+    ResolvedUnitResult unit,
+    SourceRange editRange,
+    ClassElement colorType,
+    String label,
+    String invocationString,
+  ) async {
+    final builder = ChangeBuilder(session: unit.session);
+    await builder.addDartFileEdit(unit.path, (builder) {
+      builder.addReplacement(editRange, (builder) {
+        builder.writeType(colorType.thisType);
+        builder.write(invocationString);
+      });
+    });
+
+    // We can only apply changes to the same file, so filter any change from the
+    // builder to only include this file, otherwise we may corrupt the users
+    // source (although hopefully we don't produce edits for other files).
+    final editsForThisFile = builder.sourceChange.edits
+        .where((edit) => edit.file == unit.path)
+        .expand((edit) => edit.edits)
+        .toList();
+
+    // LSP requires that we separate the main edit (changing the color code)
+    // from anything else (imports).
+    final mainEdit =
+        editsForThisFile.singleWhere((edit) => edit.offset == editRange.offset);
+    final otherEdits =
+        editsForThisFile.where((edit) => edit.offset != editRange.offset);
+
+    return ColorPresentation(
+      label: label,
+      textEdit: toTextEdit(unit.lineInfo, mainEdit),
+      additionalTextEdits: otherEdits.isNotEmpty
+          ? otherEdits.map((edit) => toTextEdit(unit.lineInfo, edit)).toList()
+          : null,
+    );
+  }
+
+  /// Builds a list of valid color presentations for the requested color.
+  Future<ErrorOr<List<ColorPresentation>>> _getPresentations(
+    ColorPresentationParams params,
+    ResolvedUnitResult unit,
+  ) async {
+    // The values in LSP are decimals 0-1 so should be scaled up to 255 that
+    // we use internally (except for opacity is which 0-1).
+    final alpha = (params.color.alpha * 255).toInt();
+    final red = (params.color.red * 255).toInt();
+    final green = (params.color.green * 255).toInt();
+    final blue = (params.color.blue * 255).toInt();
+    final opacity = params.color.alpha;
+
+    final editStart = toOffset(unit.lineInfo, params.range.start);
+    final editEnd = toOffset(unit.lineInfo, params.range.end);
+
+    if (editStart.isError) return failure(editStart);
+    if (editEnd.isError) return failure(editEnd);
+
+    final editRange =
+        SourceRange(editStart.result, editEnd.result - editStart.result);
+
+    final sessionHelper = AnalysisSessionHelper(unit.session);
+    final flutter = Flutter.instance;
+    final colorType = await sessionHelper.getClass(flutter.widgetsUri, 'Color');
+    if (colorType == null) {
+      // If we can't find the class (perhaps because this isn't a Flutter
+      // project) we will not include any results. In theory the client should
+      // not be calling this request in that case.
+      return success([]);
+    }
+
+    final colorValue = _colorValueForComponents(alpha, red, green, blue);
+    final colorValueHex =
+        '0x${colorValue.toRadixString(16).toUpperCase().padLeft(8, '0')}';
+
+    final colorFromARGB = await _createColorPresentation(
+      unit,
+      editRange,
+      colorType,
+      'Color.fromARGB($alpha, $red, $green, $blue)',
+      '.fromARGB($alpha, $red, $green, $blue)',
+    );
+
+    final colorFromRGBO = await _createColorPresentation(
+      unit,
+      editRange,
+      colorType,
+      'Color.fromRGBO($red, $green, $blue, $opacity)',
+      '.fromRGBO($red, $green, $blue, $opacity)',
+    );
+
+    final colorDefault = await _createColorPresentation(
+      unit,
+      editRange,
+      colorType,
+      'Color($colorValueHex)',
+      '($colorValueHex)',
+    );
+
+    return success([
+      colorFromARGB,
+      colorFromRGBO,
+      colorDefault,
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
index c0e413d..0d9eb19 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
@@ -15,6 +15,8 @@
 import 'package:analysis_server/src/lsp/handlers/handler_completion.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_completion_resolve.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_definition.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_document_color.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_document_color_presentation.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';
@@ -77,6 +79,8 @@
       server,
       server.initializationOptions.suggestFromUnimportedLibraries,
     ));
+    registerHandler(DocumentColorHandler(server));
+    registerHandler(DocumentColorPresentationHandler(server));
     registerHandler(CompletionResolveHandler(server));
     registerHandler(SignatureHelpHandler(server));
     registerHandler(DefinitionHandler(server));
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart
index 96a2cae..435013c 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart
@@ -7,7 +7,7 @@
 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/search/workspace_symbols.dart' as search;
+import 'package:analyzer/src/dart/analysis/search.dart' as search;
 
 class WorkspaceSymbolHandler
     extends MessageHandler<WorkspaceSymbolParams, List<SymbolInformation>> {
@@ -52,24 +52,19 @@
     // huge numbers on large projects.
     var remainingResults = 500;
 
-    final filePathsHashSet = <String>{};
-    final tracker = server.declarationsTracker!;
-    final declarations = search.WorkspaceSymbols(tracker).declarations(
-      regex,
-      remainingResults,
-      filePathsHashSet,
-    );
-
-    // Convert the file paths to something we can quickly index into since
-    // we'll be looking things up by index a lot.
-    final filePaths = filePathsHashSet.toList();
+    var workspaceSymbols = search.WorkspaceSymbols();
+    var analysisDrivers = server.driverMap.values.toList();
+    for (var analysisDriver in analysisDrivers) {
+      await analysisDriver.search
+          .declarations(workspaceSymbols, regex, remainingResults);
+    }
 
     // Map the results to SymbolInformations and flatten the list of lists.
-    final symbols = declarations
+    final symbols = workspaceSymbols.declarations
         .map((declaration) => _asSymbolInformation(
               declaration,
               supportedSymbolKinds,
-              filePaths,
+              workspaceSymbols.files,
             ))
         .toList();
 
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart b/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
index 6b87d05..6b2ed52 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
@@ -134,7 +134,8 @@
   FutureOr<ErrorOr<R>> handleMessage(
       IncomingMessage message, CancellationToken token) {
     final reporter = LspJsonReporter('params');
-    if (!jsonHandler.validateParams(message.params, reporter)) {
+    final paramsJson = message.params as Map<String, Object?>?;
+    if (!jsonHandler.validateParams(paramsJson, reporter)) {
       return error(
         ErrorCodes.InvalidParams,
         'Invalid params for ${message.method}:\n'
@@ -144,9 +145,8 @@
       );
     }
 
-    final params = message.params != null
-        ? jsonHandler.convertParams(message.params)
-        : null as P;
+    final params =
+        paramsJson != null ? jsonHandler.convertParams(paramsJson) : null as P;
     return handle(params, token);
   }
 }
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index d33a96e..cf22460 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -374,17 +374,18 @@
 
   /// Logs an exception by sending it to the client (window/logMessage) and
   /// recording it in a buffer on the server for diagnostics.
-  void logException(String message, exception, stackTrace) {
+  void logException(String message, Object exception, StackTrace? stackTrace) {
     var fullMessage = message;
     if (exception is CaughtException) {
       stackTrace ??= exception.stackTrace;
       fullMessage = '$fullMessage: ${exception.exception}';
-    } else if (exception != null) {
+    } else {
       fullMessage = '$fullMessage: $exception';
     }
 
     final fullError =
         stackTrace == null ? fullMessage : '$fullMessage\n$stackTrace';
+    stackTrace ??= StackTrace.current;
 
     // Log the full message since showMessage above may be truncated or
     // formatted badly (eg. VS Code takes the newlines out).
@@ -394,7 +395,7 @@
     exceptions.add(ServerException(
       message,
       exception,
-      stackTrace is StackTrace ? stackTrace : StackTrace.current,
+      stackTrace,
       false,
     ));
 
@@ -550,9 +551,10 @@
   }
 
   @override
-  void sendServerErrorNotification(String message, exception, stackTrace,
+  void sendServerErrorNotification(
+      String message, Object exception, StackTrace? stackTrace,
       {bool fatal = false}) {
-    message = exception == null ? message : '$message: $exception';
+    message = '$message: $exception';
 
     // Show message (without stack) to the user.
     showErrorMessageToUser(message);
@@ -652,9 +654,9 @@
 
   /// There was an error related to the socket from which messages are being
   /// read.
-  void socketError(error, stack) {
+  void socketError(Object error, StackTrace? stackTrace) {
     // Don't send to instrumentation service; not an internal error.
-    sendServerErrorNotification('Socket error', error, stack);
+    sendServerErrorNotification('Socket error', error, stackTrace);
   }
 
   Future<void> updateWorkspaceFolders(
@@ -670,7 +672,7 @@
     _refreshAnalysisRoots();
   }
 
-  void _afterOverlayChanged(String path, dynamic changeForPlugins) {
+  void _afterOverlayChanged(String path, plugin.HasToJson changeForPlugins) {
     driverMap.values.forEach((driver) => driver.changeFile(path));
     pluginManager.setAnalysisUpdateContentParams(
       plugin.AnalysisUpdateContentParams({path: changeForPlugins}),
diff --git a/pkg/analysis_server/lib/src/lsp/mapping.dart b/pkg/analysis_server/lib/src/lsp/mapping.dart
index 3a3e421..ffabd19 100644
--- a/pkg/analysis_server/lib/src/lsp/mapping.dart
+++ b/pkg/analysis_server/lib/src/lsp/mapping.dart
@@ -20,12 +20,12 @@
 import 'package:analysis_server/src/lsp/source_edits.dart';
 import 'package:analysis_server/src/protocol_server.dart' as server
     hide AnalysisError;
-import 'package:analysis_server/src/search/workspace_symbols.dart' as server
-    show DeclarationKind;
 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/source/source_range.dart' as server;
+import 'package:analyzer/src/dart/analysis/search.dart' as server
+    show DeclarationKind;
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
 import 'package:analyzer/src/services/available_declarations.dart' as dec;
@@ -1225,12 +1225,12 @@
 ErrorOr<int> toOffset(
   server.LineInfo lineInfo,
   lsp.Position pos, {
-  failureIsCritial = false,
+  bool failureIsCritical = false,
 }) {
   // line is zero-based so cannot equal lineCount
   if (pos.line >= lineInfo.lineCount) {
     return ErrorOr<int>.error(lsp.ResponseError(
-        code: failureIsCritial
+        code: failureIsCritical
             ? lsp.ServerErrorCodes.ClientServerInconsistentState
             : lsp.ServerErrorCodes.InvalidFileLineCol,
         message: 'Invalid line number',
diff --git a/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
index 36bff9b..5a009f5 100644
--- a/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
+++ b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
@@ -30,6 +30,7 @@
     Method.textDocument_signatureHelp,
     Method.textDocument_references,
     Method.textDocument_documentHighlight,
+    Method.textDocument_documentColor,
     Method.textDocument_formatting,
     Method.textDocument_onTypeFormatting,
     Method.textDocument_rangeFormatting,
@@ -52,6 +53,9 @@
   bool get codeActions =>
       _capabilities.textDocument?.foldingRange?.dynamicRegistration ?? false;
 
+  bool get colorProvider =>
+      _capabilities.textDocument?.colorProvider?.dynamicRegistration ?? false;
+
   bool get completion =>
       _capabilities.textDocument?.completion?.dynamicRegistration ?? false;
 
@@ -130,8 +134,15 @@
   Set<Registration> currentRegistrations = {};
   var _lastRegistrationId = 0;
 
-  ServerCapabilitiesComputer(this._server);
+  final dartFiles = DocumentFilter(language: 'dart', scheme: 'file');
+  final pubspecFile = DocumentFilter(
+      language: 'yaml', scheme: 'file', pattern: '**/pubspec.yaml');
+  final analysisOptionsFile = DocumentFilter(
+      language: 'yaml', scheme: 'file', pattern: '**/analysis_options.yaml');
+  final fixDataFile = DocumentFilter(
+      language: 'yaml', scheme: 'file', pattern: '**/lib/fix_data.yaml');
 
+  ServerCapabilitiesComputer(this._server);
   ServerCapabilities computeServerCapabilities(
       LspClientCapabilities clientCapabilities) {
     final codeActionLiteralSupport = clientCapabilities.literalCodeActions;
@@ -210,6 +221,11 @@
                   codeActionKinds: DartCodeActionKind.serverSupportedKinds,
                 ))
               : Either2<bool, CodeActionOptions>.t1(true),
+      colorProvider: dynamicRegistrations.colorProvider
+          ? null
+          : Either3<bool, DocumentColorOptions,
+                  DocumentColorRegistrationOptions>.t3(
+              DocumentColorRegistrationOptions(documentSelector: [dartFiles])),
       documentFormattingProvider: dynamicRegistrations.formatting
           ? null
           : Either2<bool, DocumentFormattingOptions>.t1(enableFormatter),
@@ -279,14 +295,6 @@
   /// support and it will be up to them to decide which file types they will
   /// send requests for.
   Future<void> performDynamicRegistration() async {
-    final dartFiles = DocumentFilter(language: 'dart', scheme: 'file');
-    final pubspecFile = DocumentFilter(
-        language: 'yaml', scheme: 'file', pattern: '**/pubspec.yaml');
-    final analysisOptionsFile = DocumentFilter(
-        language: 'yaml', scheme: 'file', pattern: '**/analysis_options.yaml');
-    final fixDataFile = DocumentFilter(
-        language: 'yaml', scheme: 'file', pattern: '**/lib/fix_data.yaml');
-
     final pluginTypes = _server.pluginManager.plugins
         .expand((plugin) => plugin.currentSession?.interestingFiles ?? const [])
         // All published plugins use something like `*.extension` as
@@ -410,6 +418,12 @@
       TextDocumentRegistrationOptions(documentSelector: fullySupportedTypes),
     );
     register(
+      dynamicRegistrations.colorProvider,
+      // This registration covers both documentColor and colorPresentation.
+      Method.textDocument_documentColor,
+      DocumentColorRegistrationOptions(documentSelector: [dartFiles]),
+    );
+    register(
       enableFormatter && dynamicRegistrations.formatting,
       Method.textDocument_formatting,
       TextDocumentRegistrationOptions(documentSelector: fullySupportedTypes),
diff --git a/pkg/analysis_server/lib/src/lsp/source_edits.dart b/pkg/analysis_server/lib/src/lsp/source_edits.dart
index 2a5834e..1e2b464 100644
--- a/pkg/analysis_server/lib/src/lsp/source_edits.dart
+++ b/pkg/analysis_server/lib/src/lsp/source_edits.dart
@@ -31,7 +31,7 @@
           Either2<TextDocumentContentChangeEvent1,
               TextDocumentContentChangeEvent2>>
       changes, {
-  failureIsCritical = false,
+  bool failureIsCritical = false,
 }) {
   var newContent = oldContent;
   final serverEdits = <server.SourceEdit>[];
@@ -45,9 +45,9 @@
       (change) {
         final lines = LineInfo.fromContent(newContent);
         final offsetStart = toOffset(lines, change.range.start,
-            failureIsCritial: failureIsCritical);
+            failureIsCritical: failureIsCritical);
         final offsetEnd = toOffset(lines, change.range.end,
-            failureIsCritial: failureIsCritical);
+            failureIsCritical: failureIsCritical);
         if (offsetStart.isError) {
           return ErrorOr.error(offsetStart.error);
         }
@@ -180,7 +180,10 @@
       // To handle this, if both unformatted/formatted contain at least one
       // newline, split this change into two around the last newline so that the
       // final part (likely leading whitespace) can be included without
-      // including the whole change.
+      // including the whole change. This cannot be done if the newline is at
+      // the end of the source whitespace though, as this would create a split
+      // where the first part is the same and the second part is empty,
+      // resulting in an infinite loop/stack overflow.
       //
       // Without this, functionality like VS Code's "format modified lines"
       // (which uses Git status to know which lines are edited) may appear to
@@ -188,7 +191,8 @@
       if (unformattedStart < rangeStart.result &&
           unformattedEnd > rangeStart.result &&
           unformattedWhitespace.contains('\n') &&
-          formattedWhitespace.contains('\n')) {
+          formattedWhitespace.contains('\n') &&
+          !unformattedWhitespace.endsWith('\n')) {
         // Find the offsets of the character after the last newlines.
         final unformattedOffset = unformattedWhitespace.lastIndexOf('\n') + 1;
         final formattedOffset = formattedWhitespace.lastIndexOf('\n') + 1;
diff --git a/pkg/analysis_server/lib/src/search/search_domain.dart b/pkg/analysis_server/lib/src/search/search_domain.dart
index 632f7f8..04542a8 100644
--- a/pkg/analysis_server/lib/src/search/search_domain.dart
+++ b/pkg/analysis_server/lib/src/search/search_domain.dart
@@ -5,12 +5,14 @@
 import 'package:analysis_server/protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/protocol/protocol_internal.dart'
+    show ResponseResult;
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analysis_server/src/search/element_references.dart';
 import 'package:analysis_server/src/search/type_hierarchy.dart';
-import 'package:analysis_server/src/search/workspace_symbols.dart' as search;
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/analysis/search.dart' as search;
 
 /// Instances of the class [SearchDomainHandler] implement a [RequestHandler]
 /// that handles requests in the search domain.
@@ -161,21 +163,21 @@
       }
     }
 
-    var tracker = server.declarationsTracker;
-    if (tracker == null) {
+    if (!server.options.featureSet.completion) {
       server.sendResponse(Response.unsupportedFeature(
           request.id, 'Completion is not enabled.'));
       return;
     }
-    var files = <String>{};
-    var remainingMaxResults = params.maxResults;
-    var declarations = search.WorkspaceSymbols(tracker).declarations(
-      regExp,
-      remainingMaxResults,
-      files,
-      onlyForFile: params.file,
-    );
 
+    var workspaceSymbols = search.WorkspaceSymbols();
+    var analysisDrivers = server.driverMap.values.toList();
+    for (var analysisDriver in analysisDrivers) {
+      await analysisDriver.search.declarations(
+          workspaceSymbols, regExp, params.maxResults,
+          onlyForFile: params.file);
+    }
+
+    var declarations = workspaceSymbols.declarations;
     var elementDeclarations = declarations.map((declaration) {
       return protocol.ElementDeclaration(
           declaration.name,
@@ -192,7 +194,7 @@
     }).toList();
 
     server.sendResponse(protocol.SearchGetElementDeclarationsResult(
-            elementDeclarations, files.toList())
+            elementDeclarations, workspaceSymbols.files)
         .toResponse(request.id));
   }
 
@@ -262,8 +264,8 @@
   }
 
   /// Send a search response with the given [result] to the given [request].
-  void _sendSearchResult(protocol.Request request, result) {
-    protocol.Response response = result.toResponse(request.id);
+  void _sendSearchResult(protocol.Request request, ResponseResult result) {
+    var response = result.toResponse(request.id);
     server.sendResponse(response);
   }
 
diff --git a/pkg/analysis_server/lib/src/search/workspace_symbols.dart b/pkg/analysis_server/lib/src/search/workspace_symbols.dart
deleted file mode 100644
index bbcf5ac..0000000
--- a/pkg/analysis_server/lib/src/search/workspace_symbols.dart
+++ /dev/null
@@ -1,203 +0,0 @@
-// 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/source/line_info.dart';
-import 'package:analyzer/src/services/available_declarations.dart';
-import 'package:analyzer/src/services/available_declarations.dart' as ad;
-
-class Declaration {
-  final int fileIndex;
-  final LineInfo lineInfo;
-  final String name;
-  final DeclarationKind kind;
-  final int offset;
-  final int line;
-  final int column;
-  final int codeOffset;
-  final int codeLength;
-  final String? className;
-  final String? mixinName;
-  final String? parameters;
-
-  Declaration(
-    this.fileIndex,
-    this.lineInfo,
-    this.name,
-    this.kind,
-    this.offset,
-    this.line,
-    this.column,
-    this.codeOffset,
-    this.codeLength,
-    this.className,
-    this.mixinName,
-    this.parameters,
-  );
-}
-
-enum DeclarationKind {
-  CLASS,
-  CLASS_TYPE_ALIAS,
-  CONSTRUCTOR,
-  ENUM,
-  ENUM_CONSTANT,
-  EXTENSION,
-  FIELD,
-  FUNCTION,
-  FUNCTION_TYPE_ALIAS,
-  GETTER,
-  METHOD,
-  MIXIN,
-  SETTER,
-  TYPE_ALIAS,
-  VARIABLE
-}
-
-class WorkspaceSymbols {
-  final DeclarationsTracker tracker;
-
-  WorkspaceSymbols(this.tracker);
-
-  List<Declaration> declarations(
-      RegExp? regExp, int? maxResults, Set<String> files,
-      {String? onlyForFile}) {
-    _doTrackerWork();
-
-    var declarations = <Declaration>[];
-
-    var pathToIndex = <String, int>{};
-
-    int getPathIndex(String path) {
-      var index = pathToIndex[path];
-      if (index == null) {
-        index = files.length;
-        files.add(path);
-        pathToIndex[path] = index;
-      }
-      return index;
-    }
-
-    if (maxResults != null && declarations.length >= maxResults) {
-      throw const _MaxNumberOfDeclarationsError();
-    }
-
-    void addDeclaration(ad.Declaration declaration) {
-      if (maxResults != null && declarations.length >= maxResults) {
-        throw const _MaxNumberOfDeclarationsError();
-      }
-
-      var path = declaration.locationPath;
-      if (onlyForFile != null && path != onlyForFile) {
-        return;
-      }
-
-      declaration.children.forEach(addDeclaration);
-
-      var name = declaration.name;
-      if (name.isEmpty) {
-        return;
-      }
-      if (name.endsWith('=')) {
-        name = name.substring(0, name.length - 1);
-      }
-      if (regExp != null && !regExp.hasMatch(name)) {
-        return;
-      }
-
-      var parent = declaration.parent;
-
-      String? className;
-      if (parent != null && parent.kind == ad.DeclarationKind.CLASS) {
-        className = parent.name;
-      }
-
-      String? mixinName;
-      if (parent != null && parent.kind == ad.DeclarationKind.MIXIN) {
-        mixinName = parent.name;
-      }
-
-      var topKind = _getTopKind(declaration.kind);
-      if (topKind == null) {
-        return;
-      }
-
-      declarations.add(
-        Declaration(
-          getPathIndex(path),
-          declaration.lineInfo,
-          name,
-          topKind,
-          declaration.locationOffset,
-          declaration.locationStartLine,
-          declaration.locationStartColumn,
-          declaration.codeOffset,
-          declaration.codeLength,
-          className,
-          mixinName,
-          declaration.parameters,
-        ),
-      );
-    }
-
-    var libraries = tracker.allLibraries;
-    try {
-      for (var library in libraries) {
-        library.declarations.forEach(addDeclaration);
-      }
-    } on _MaxNumberOfDeclarationsError {
-      // Uses an exception to short circuit the recursion when there are too
-      // many declarations.
-    }
-
-    return declarations;
-  }
-
-  void _doTrackerWork() {
-    while (tracker.hasWork) {
-      tracker.doWork();
-    }
-  }
-
-  static DeclarationKind? _getTopKind(ad.DeclarationKind kind) {
-    switch (kind) {
-      case ad.DeclarationKind.CLASS:
-        return DeclarationKind.CLASS;
-      case ad.DeclarationKind.CLASS_TYPE_ALIAS:
-        return DeclarationKind.CLASS_TYPE_ALIAS;
-      case ad.DeclarationKind.CONSTRUCTOR:
-        return DeclarationKind.CONSTRUCTOR;
-      case ad.DeclarationKind.ENUM:
-        return DeclarationKind.ENUM;
-      case ad.DeclarationKind.ENUM_CONSTANT:
-        return DeclarationKind.ENUM_CONSTANT;
-      case ad.DeclarationKind.EXTENSION:
-        return DeclarationKind.EXTENSION;
-      case ad.DeclarationKind.FIELD:
-        return DeclarationKind.FIELD;
-      case ad.DeclarationKind.FUNCTION_TYPE_ALIAS:
-        return DeclarationKind.FUNCTION_TYPE_ALIAS;
-      case ad.DeclarationKind.METHOD:
-        return DeclarationKind.METHOD;
-      case ad.DeclarationKind.MIXIN:
-        return DeclarationKind.MIXIN;
-      case ad.DeclarationKind.FUNCTION:
-        return DeclarationKind.FUNCTION;
-      case ad.DeclarationKind.GETTER:
-        return DeclarationKind.GETTER;
-      case ad.DeclarationKind.SETTER:
-        return DeclarationKind.SETTER;
-      case ad.DeclarationKind.TYPE_ALIAS:
-        return DeclarationKind.TYPE_ALIAS;
-      case ad.DeclarationKind.VARIABLE:
-        return DeclarationKind.VARIABLE;
-      default:
-        return null;
-    }
-  }
-}
-
-/// The marker class that is thrown to stop adding declarations.
-class _MaxNumberOfDeclarationsError {
-  const _MaxNumberOfDeclarationsError();
-}
diff --git a/pkg/analysis_server/lib/src/server/debounce_requests.dart b/pkg/analysis_server/lib/src/server/debounce_requests.dart
new file mode 100644
index 0000000..4ee01d6
--- /dev/null
+++ b/pkg/analysis_server/lib/src/server/debounce_requests.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. 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';
+import 'package:analysis_server/src/channel/channel.dart';
+
+/// Return the stream of requests that is filtered to exclude requests for
+/// which the client does not need actual responses.
+///
+/// If there is one completion request, and then another completion request,
+/// then most probably the user continued typing, and there is no need to
+/// compute results for the first request. But we will have to respond, an
+/// empty response is enough.
+///
+/// Discarded requests are reported into [discardedRequests].
+Stream<Request> debounceRequests(
+  ServerCommunicationChannel channel,
+  StreamController<Request> discardedRequests,
+) {
+  return _DebounceRequests(channel, discardedRequests).requests;
+}
+
+class _DebounceRequests {
+  final ServerCommunicationChannel channel;
+  final StreamController<Request> discardedRequests;
+  late final Stream<Request> requests;
+
+  _DebounceRequests(this.channel, this.discardedRequests) {
+    var buffer = <Request>[];
+    Timer? timer;
+
+    requests = channel.requests.transform(
+      StreamTransformer.fromHandlers(
+        handleData: (request, sink) {
+          buffer.add(request);
+          // Accumulate requests for a short period of time.
+          // When we were busy processing a request, the client could put
+          // multiple requests into the event queue. So, when we look, we will
+          // quickly get all of them. So, even 1 ms should be enough.
+          timer ??= Timer(const Duration(milliseconds: 1), () {
+            timer = null;
+            var filtered = _filterCompletion(buffer);
+            buffer = [];
+            for (var request in filtered) {
+              sink.add(request);
+            }
+          });
+        },
+      ),
+    );
+  }
+
+  List<Request> _filterCompletion(List<Request> requests) {
+    var reversed = <Request>[];
+    var abortCompletionRequests = false;
+    for (var request in requests.reversed) {
+      if (request.method == ANALYSIS_REQUEST_UPDATE_CONTENT) {
+        abortCompletionRequests = true;
+      }
+      if (request.method == COMPLETION_REQUEST_GET_SUGGESTIONS2) {
+        if (abortCompletionRequests) {
+          discardedRequests.add(request);
+          var params = CompletionGetSuggestions2Params.fromRequest(request);
+          var offset = params.offset;
+          channel.sendResponse(
+            CompletionGetSuggestions2Result(offset, 0, [], [], true)
+                .toResponse(request.id),
+          );
+          continue;
+        } else {
+          abortCompletionRequests = true;
+        }
+      }
+      reversed.add(request);
+    }
+    return reversed.reversed.toList();
+  }
+}
diff --git a/pkg/analysis_server/lib/src/server/dev_server.dart b/pkg/analysis_server/lib/src/server/dev_server.dart
index 62886da6..b11c418 100644
--- a/pkg/analysis_server/lib/src/server/dev_server.dart
+++ b/pkg/analysis_server/lib/src/server/dev_server.dart
@@ -165,21 +165,11 @@
   Stream<Notification> get onNotification => _notificationController.stream;
 
   @override
-  void close() {
-    _notificationController.close();
-  }
+  Stream<Request> get requests => _requestController.stream;
 
   @override
-  void listen(
-    void Function(Request request) onRequest, {
-    Function? onError,
-    void Function()? onDone,
-  }) {
-    _requestController.stream.listen(
-      onRequest,
-      onError: onError,
-      onDone: onDone,
-    );
+  void close() {
+    _notificationController.close();
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 025eb5b..5016f76 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -101,6 +101,9 @@
   /// The path to the package config file override.
   static const String PACKAGES_FILE = 'packages';
 
+  /// The forced protocol version that the server will report to the client.
+  static const String REPORT_PROTOCOL_VERSION = 'report-protocol-version';
+
   /// The name of the flag specifying the server protocol to use.
   static const String SERVER_PROTOCOL = 'protocol';
   static const String PROTOCOL_ANALYZER = 'analyzer';
@@ -160,6 +163,8 @@
     analysisServerOptions.clientVersion = results[CLIENT_VERSION];
     analysisServerOptions.cacheFolder = results[CACHE_FOLDER];
     analysisServerOptions.packagesFile = results[PACKAGES_FILE];
+    analysisServerOptions.reportProtocolVersion =
+        results[REPORT_PROTOCOL_VERSION];
 
     // Read in any per-SDK overrides specified in <sdk>/config/settings.json.
     var sdkConfig = SdkConfiguration.readFromSdk();
@@ -688,6 +693,14 @@
         defaultsTo: false,
         negatable: false,
         hide: true);
+    parser.addOption(
+      REPORT_PROTOCOL_VERSION,
+      valueHelp: 'version',
+      help: 'The protocol version that the server will report to the client, '
+          'can be used to temporary enabling features that we expect to be '
+          'available in future versions.',
+      hide: true,
+    );
 
     //
     // Hidden; these are deprecated and no longer read from.
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 b0c2ac4..7815def 100644
--- a/pkg/analysis_server/lib/src/services/completion/completion_performance.dart
+++ b/pkg/analysis_server/lib/src/services/completion/completion_performance.dart
@@ -35,16 +35,19 @@
 
 /// Overall performance of a code completion operation.
 class CompletionPerformance {
-  String? path;
-  String snippet = '';
+  final OperationPerformance operation;
+  final String path;
+  final String snippet;
   int suggestionCount = -1;
-  OperationPerformance? _operation;
+
+  CompletionPerformance({
+    required this.operation,
+    required this.path,
+    required String content,
+    required int offset,
+  }) : snippet = _computeCompletionSnippet(content, offset);
 
   int get elapsedInMilliseconds {
-    var operation = _operation;
-    if (operation == null) {
-      throw StateError('Access of elapsed time before the operation is run');
-    }
     return operation.elapsed.inMilliseconds;
   }
 
@@ -52,21 +55,4 @@
     if (suggestionCount < 1) return '';
     return '$suggestionCount';
   }
-
-  Future<T> runRequestOperation<T>(
-    Future<T> Function(OperationPerformanceImpl) operation,
-  ) async {
-    var rootOperation = OperationPerformanceImpl('<root>');
-    try {
-      return rootOperation.runAsync('<request>', (performance) async {
-        return await operation(performance);
-      });
-    } finally {
-      _operation = rootOperation.children.first;
-    }
-  }
-
-  void setContentsAndOffset(String contents, int offset) {
-    snippet = _computeCompletionSnippet(contents, offset);
-  }
 }
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 78fef2f..90da0ef 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
@@ -37,6 +37,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
+import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
@@ -90,10 +91,11 @@
   /// suggestions, or `null` if no notification should occur.
   final SuggestionListener? listener;
 
-  /// If specified, will be filled with URIs of libraries that are not yet
-  /// imported, but could be imported into the requested target. Corresponding
-  /// [CompletionSuggestion] will have the import index into this list.
-  final List<Uri>? librariesToImport;
+  /// If specified, will be filled with suggestions and URIs from libraries
+  /// that are not yet imported, but could be imported into the requested
+  /// target. It is up to the client to make copies of [CompletionSuggestion]s
+  /// with the import index property updated.
+  final Map<protocol.CompletionSuggestion, Uri>? notImportedSuggestions;
 
   /// Initialize a newly created completion manager. The parameters
   /// [includedElementKinds], [includedElementNames], and
@@ -105,7 +107,7 @@
     this.includedElementNames,
     this.includedSuggestionRelevanceTags,
     this.listener,
-    this.librariesToImport,
+    this.notImportedSuggestions,
   }) : assert((includedElementKinds != null &&
                 includedElementNames != null &&
                 includedSuggestionRelevanceTags != null) ||
@@ -121,7 +123,7 @@
   }) async {
     request.checkAborted();
     var pathContext = request.resourceProvider.pathContext;
-    if (!file_paths.isDart(pathContext, request.result.path)) {
+    if (!file_paths.isDart(pathContext, request.path)) {
       return const <CompletionSuggestion>[];
     }
 
@@ -163,10 +165,11 @@
       );
     }
 
-    final librariesToImport = this.librariesToImport;
-    if (librariesToImport != null) {
+    final notImportedSuggestions = this.notImportedSuggestions;
+    if (notImportedSuggestions != null) {
       contributors.add(
-        NotImportedContributor(request, builder, budget, librariesToImport),
+        NotImportedContributor(
+            request, builder, budget, notImportedSuggestions),
       );
     }
 
@@ -274,8 +277,14 @@
 
 /// The information about a requested list of completions within a Dart file.
 class DartCompletionRequest {
+  /// The analysis session that produced the elements of the request.
+  final AnalysisSessionImpl analysisSession;
+
   final CompletionPreference completionPreference;
 
+  /// The content of the file in which completion is requested.
+  final String content;
+
   /// Return the type imposed on the target's `containingNode` based on its
   /// context, or `null` if the context does not impose any type.
   final DartType? contextType;
@@ -289,6 +298,9 @@
   /// compute relevance scores for suggestions.
   final FeatureComputer featureComputer;
 
+  /// The library element of the file in which completion is requested.
+  final LibraryElement libraryElement;
+
   /// Return the offset within the source at which the completion is being
   /// requested.
   final int offset;
@@ -297,14 +309,13 @@
   /// request.
   final OpType opType;
 
+  /// The absolute path of the file where completion is requested.
+  final String path;
+
   /// The source range that represents the region of text that should be
   /// replaced when a suggestion is selected.
   final SourceRange replacementRange;
 
-  /// The analysis result for the file in which the completion is being
-  /// requested.
-  final ResolvedUnitResult result;
-
   /// Return the source in which the completion is being requested.
   final Source source;
 
@@ -317,17 +328,22 @@
   bool _aborted = false;
 
   factory DartCompletionRequest({
-    required ResolvedUnitResult resolvedUnit,
+    required AnalysisSession analysisSession,
+    required String filePath,
+    required String fileContent,
+    required CompilationUnitElement unitElement,
+    required AstNode enclosingNode,
     required int offset,
     DartdocDirectiveInfo? dartdocDirectiveInfo,
     CompletionPreference completionPreference = CompletionPreference.insert,
     DocumentationCache? documentationCache,
   }) {
-    var target = CompletionTarget.forOffset(resolvedUnit.unit, offset);
+    var target = CompletionTarget.forOffset(enclosingNode, offset);
 
+    var libraryElement = unitElement.library;
     var featureComputer = FeatureComputer(
-      resolvedUnit.typeSystem,
-      resolvedUnit.typeProvider,
+      libraryElement.typeSystem,
+      libraryElement.typeProvider,
     );
 
     var contextType = featureComputer.computeContextType(
@@ -341,34 +357,65 @@
     }
 
     return DartCompletionRequest._(
+      analysisSession: analysisSession as AnalysisSessionImpl,
       completionPreference: completionPreference,
+      content: fileContent,
       contextType: contextType,
       dartdocDirectiveInfo: dartdocDirectiveInfo ?? DartdocDirectiveInfo(),
       documentationCache: documentationCache,
       featureComputer: featureComputer,
+      libraryElement: libraryElement,
       offset: offset,
       opType: opType,
+      path: filePath,
       replacementRange: target.computeReplacementRange(offset),
-      result: resolvedUnit,
-      source: resolvedUnit.unit.declaredElement!.source,
+      source: unitElement.source,
       target: target,
     );
   }
 
+  factory DartCompletionRequest.forResolvedUnit({
+    required ResolvedUnitResult resolvedUnit,
+    required int offset,
+    DartdocDirectiveInfo? dartdocDirectiveInfo,
+    CompletionPreference completionPreference = CompletionPreference.insert,
+    DocumentationCache? documentationCache,
+  }) {
+    return DartCompletionRequest(
+      analysisSession: resolvedUnit.session,
+      filePath: resolvedUnit.path,
+      fileContent: resolvedUnit.content,
+      unitElement: resolvedUnit.unit.declaredElement!,
+      enclosingNode: resolvedUnit.unit,
+      offset: offset,
+      dartdocDirectiveInfo: dartdocDirectiveInfo,
+      completionPreference: completionPreference,
+      documentationCache: documentationCache,
+    );
+  }
+
   DartCompletionRequest._({
+    required this.analysisSession,
     required this.completionPreference,
+    required this.content,
     required this.contextType,
     required this.dartdocDirectiveInfo,
     required this.documentationCache,
     required this.featureComputer,
+    required this.libraryElement,
     required this.offset,
     required this.opType,
+    required this.path,
     required this.replacementRange,
-    required this.result,
     required this.source,
     required this.target,
   });
 
+  DriverBasedAnalysisContext get analysisContext {
+    var analysisContext = analysisSession.analysisContext;
+    return analysisContext as DriverBasedAnalysisContext;
+  }
+
   /// Return the feature set that was used to analyze the compilation unit in
   /// which suggestions are being made.
   FeatureSet get featureSet => libraryElement.featureSet;
@@ -384,10 +431,6 @@
     return entity is Expression && entity.inConstantContext;
   }
 
-  /// Return the library element which contains the unit in which the completion
-  /// is occurring.
-  LibraryElement get libraryElement => result.libraryElement;
-
   /// Answer the [DartType] for Object in dart:core
   DartType get objectType => libraryElement.typeProvider.objectType;
 
@@ -406,16 +449,11 @@
   int get replacementOffset => replacementRange.offset;
 
   /// Return the resource provider associated with this request.
-  ResourceProvider get resourceProvider => result.session.resourceProvider;
-
-  /// Return the content of the [source] in which the completion is being
-  /// requested, or `null` if the content could not be accessed.
-  String? get sourceContents => result.content;
+  ResourceProvider get resourceProvider => analysisSession.resourceProvider;
 
   /// Return the [SourceFactory] of the request.
   SourceFactory get sourceFactory {
-    var context = result.session.analysisContext as DriverBasedAnalysisContext;
-    return context.driver.sourceFactory;
+    return analysisContext.driver.sourceFactory;
   }
 
   /// Return prefix that already exists in the document for [target] or empty
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 734a36e..2441362 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
@@ -163,13 +163,8 @@
       return;
     }
 
-    var libraryUnits = request.result.unit.declaredElement?.library.units;
-    if (libraryUnits == null) {
-      return;
-    }
-
     var visitor = LibraryElementSuggestionBuilder(request, builder);
-    for (var unit in libraryUnits) {
+    for (var unit in request.libraryElement.units) {
       if (unit.source != request.source) {
         unit.accept(visitor);
       }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/not_imported_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/not_imported_contributor.dart
index 629fe475..53550d8 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/not_imported_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/not_imported_contributor.dart
@@ -4,40 +4,33 @@
 
 import 'dart:async';
 
+import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/extension_member_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/local_library_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
-import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
-import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/lint/pub.dart';
 import 'package:analyzer/src/workspace/pub.dart';
 import 'package:collection/collection.dart';
-import 'package:meta/meta.dart';
 
 /// A contributor of suggestions from not yet imported libraries.
 class NotImportedContributor extends DartCompletionContributor {
-  /// Tests set this function to abort the current request.
-  @visibleForTesting
-  static void Function(FileState)? onFile;
-
   final CompletionBudget budget;
-  final List<Uri> librariesToImport;
+  final Map<protocol.CompletionSuggestion, Uri> notImportedSuggestions;
 
   NotImportedContributor(
     DartCompletionRequest request,
     SuggestionBuilder builder,
     this.budget,
-    this.librariesToImport,
+    this.notImportedSuggestions,
   ) : super(request, builder);
 
   @override
   Future<void> computeSuggestions() async {
-    var session = request.result.session as AnalysisSessionImpl;
-    var analysisDriver = session.getDriver(); // ignore: deprecated_member_use
+    var analysisDriver = request.analysisContext.driver;
 
     var fsState = analysisDriver.fsState;
     var filter = _buildFilter(fsState);
@@ -53,9 +46,6 @@
 
     var knownFiles = fsState.knownFiles.toList();
     for (var file in knownFiles) {
-      onFile?.call(file);
-      request.checkAborted();
-
       if (budget.isEmpty) {
         return;
       }
@@ -64,15 +54,18 @@
         continue;
       }
 
-      var elementResult = await session.getLibraryByUri(file.uriStr);
-      if (elementResult is! LibraryElementResult) {
+      var element = analysisDriver.getLibraryByFile(file);
+      if (element == null) {
         continue;
       }
 
-      var exportNamespace = elementResult.element.exportNamespace;
+      var exportNamespace = element.exportNamespace;
       var exportElements = exportNamespace.definedNames.values.toList();
 
-      var newSuggestions = builder.markSuggestions();
+      builder.laterReplacesEarlier = false;
+      builder.suggestionAdded = (suggestion) {
+        notImportedSuggestions[suggestion] = file.uri;
+      };
 
       if (request.includeIdentifiers) {
         _buildSuggestions(exportElements);
@@ -81,16 +74,14 @@
       extensionContributor.addExtensions(
         exportElements.whereType<ExtensionElement>().toList(),
       );
-
-      newSuggestions.setLibraryUriToImportIndex(() {
-        librariesToImport.add(file.uri);
-        return librariesToImport.length - 1;
-      });
     }
+
+    builder.laterReplacesEarlier = true;
+    builder.suggestionAdded = null;
   }
 
   _Filter _buildFilter(FileSystemState fsState) {
-    var file = fsState.getFileForPath(request.result.path);
+    var file = fsState.getFileForPath(request.path);
     var workspacePackage = file.workspacePackage;
     if (workspacePackage is PubWorkspacePackage) {
       return _PubFilter(workspacePackage, file.path);
@@ -154,14 +145,15 @@
 
   @override
   bool shouldInclude(FileState file) {
-    var uri = file.uri;
-    if (uri.isScheme('dart')) {
+    var uri = file.uriProperties;
+    if (uri.isDart) {
       return true;
     }
 
     // Normally only package URIs are available.
     // But outside of lib/ we allow any files of this package.
-    if (!uri.isScheme('package')) {
+    var packageName = uri.packageName;
+    if (packageName == null) {
       if (targetInLib) {
         return false;
       } else {
@@ -171,20 +163,13 @@
       }
     }
 
-    // Sanity check.
-    var uriPathSegments = uri.pathSegments;
-    if (uriPathSegments.length < 2) {
-      return false;
-    }
-
     // Any `package:` library from the same package.
-    var packageName = uriPathSegments[0];
     if (packageName == targetPackageName) {
       return true;
     }
 
     // If not the same package, must be public.
-    if (uriPathSegments[1] == 'src') {
+    if (uri.isSrc) {
       return false;
     }
 
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 7de9949..8ffc7d4 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
@@ -25,6 +25,16 @@
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
+/// Wrapper around a potentially nullable value.
+///
+/// When the wrapper instance is provided for a property, the property
+/// value is replaced, even if the value to set is `null` itself.
+class CopyWithValue<T> {
+  final T value;
+
+  CopyWithValue(this.value);
+}
+
 /// This class provides suggestions based upon the visible instance members in
 /// an interface type.
 class MemberSuggestionBuilder {
@@ -138,54 +148,6 @@
   }
 }
 
-class NewSuggestionsProcessor {
-  final SuggestionBuilder _builder;
-  final Set<protocol.CompletionSuggestion> _current = Set.identity();
-
-  NewSuggestionsProcessor._(this._builder) {
-    _current.addAll(_builder._suggestionMap.values);
-  }
-
-  /// Update suggestions added since this marker was created.
-  void setLibraryUriToImportIndex(int Function() produce) {
-    int? libraryUriToImportIndex;
-    var suggestionMap = _builder._suggestionMap;
-    for (var entry in suggestionMap.entries.toList()) {
-      var suggestion = entry.value;
-      if (!_current.contains(suggestion)) {
-        libraryUriToImportIndex ??= produce();
-        suggestionMap[entry.key] = protocol.CompletionSuggestion(
-          suggestion.kind,
-          suggestion.relevance,
-          suggestion.completion,
-          suggestion.selectionOffset,
-          suggestion.selectionLength,
-          suggestion.isDeprecated,
-          suggestion.isPotential,
-          displayText: suggestion.displayText,
-          replacementOffset: suggestion.replacementOffset,
-          replacementLength: suggestion.replacementLength,
-          docSummary: suggestion.docSummary,
-          docComplete: suggestion.docComplete,
-          declaringType: suggestion.declaringType,
-          defaultArgumentListString: suggestion.defaultArgumentListString,
-          defaultArgumentListTextRanges:
-              suggestion.defaultArgumentListTextRanges,
-          element: suggestion.element,
-          returnType: suggestion.returnType,
-          parameterNames: suggestion.parameterNames,
-          parameterTypes: suggestion.parameterTypes,
-          requiredParameterCount: suggestion.requiredParameterCount,
-          hasNamedParameters: suggestion.hasNamedParameters,
-          parameterName: suggestion.parameterName,
-          parameterType: suggestion.parameterType,
-          libraryUriToImportIndex: libraryUriToImportIndex,
-        );
-      }
-    }
-  }
-}
-
 /// An object used to build a list of suggestions in response to a single
 /// completion request.
 class SuggestionBuilder {
@@ -212,6 +174,9 @@
   /// suggestions, or `null` if no notification should occur.
   final SuggestionListener? listener;
 
+  /// The function to be invoked when a new suggestion is added.
+  void Function(protocol.CompletionSuggestion)? suggestionAdded;
+
   /// A map from a completion identifier to a completion suggestion.
   final Map<String, CompletionSuggestion> _suggestionMap =
       <String, CompletionSuggestion>{};
@@ -264,11 +229,6 @@
   bool get _isNonNullableByDefault =>
       request.libraryElement.isNonNullableByDefault;
 
-  /// Return an object that knows which suggestions exist, and which are new.
-  NewSuggestionsProcessor markSuggestions() {
-    return NewSuggestionsProcessor._(this);
-  }
-
   /// Add a suggestion for an [accessor] declared within a class or extension.
   /// If the accessor is being invoked with a target of `super`, then the
   /// [containingMemberName] should be the name of the member containing the
@@ -778,8 +738,8 @@
   Future<void> suggestOverride(SimpleIdentifier targetId,
       ExecutableElement element, bool invokeSuper) async {
     var displayTextBuffer = StringBuffer();
-    var builder = ChangeBuilder(session: request.result.session);
-    await builder.addDartFileEdit(request.result.path, (builder) {
+    var builder = ChangeBuilder(session: request.analysisSession);
+    await builder.addDartFileEdit(request.path, (builder) {
       builder.addReplacement(range.node(targetId), (builder) {
         builder.writeOverride(
           element,
@@ -979,10 +939,9 @@
         key = '$key()';
       }
       listener?.builtSuggestion(suggestion);
-      if (laterReplacesEarlier) {
+      if (laterReplacesEarlier || !_suggestionMap.containsKey(key)) {
         _suggestionMap[key] = suggestion;
-      } else {
-        _suggestionMap.putIfAbsent(key, () => suggestion);
+        suggestionAdded?.call(suggestion);
       }
     }
   }
@@ -1314,3 +1273,45 @@
         other.prefix == prefix;
   }
 }
+
+extension CompletionSuggestionExtension on CompletionSuggestion {
+  CompletionSuggestion copyWith({
+    CopyWithValue<int?>? libraryUriToImportIndex,
+  }) {
+    return protocol.CompletionSuggestion(
+      kind,
+      relevance,
+      completion,
+      selectionOffset,
+      selectionLength,
+      isDeprecated,
+      isPotential,
+      displayText: displayText,
+      replacementOffset: replacementOffset,
+      replacementLength: replacementLength,
+      docSummary: docSummary,
+      docComplete: docComplete,
+      declaringType: declaringType,
+      defaultArgumentListString: defaultArgumentListString,
+      defaultArgumentListTextRanges: defaultArgumentListTextRanges,
+      element: element,
+      returnType: returnType,
+      parameterNames: parameterNames,
+      parameterTypes: parameterTypes,
+      requiredParameterCount: requiredParameterCount,
+      hasNamedParameters: hasNamedParameters,
+      parameterName: parameterName,
+      parameterType: parameterType,
+      libraryUriToImportIndex: libraryUriToImportIndex.orElse(
+        this.libraryUriToImportIndex,
+      ),
+    );
+  }
+}
+
+extension _CopyWithValueExtension<T> on CopyWithValue<T>? {
+  T orElse(T defaultValue) {
+    final self = this;
+    return self != null ? self.value : defaultValue;
+  }
+}
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 703acf8..4a11a87 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
@@ -57,7 +57,7 @@
             // Quoted empty string
             visitSimpleStringLiteral(uri);
           } else {
-            var data = request.sourceContents!;
+            var data = request.content;
             if (end == data.length) {
               var ch = data[end - 1];
               if (ch != '"' && ch != "'") {
@@ -69,7 +69,7 @@
           }
         }
       } else if (offset == start && offset == end) {
-        var data = request.sourceContents!;
+        var data = request.content;
         if (end == data.length) {
           var ch = data[end - 1];
           if (ch == '"' || ch == "'") {
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 19d86b0..33d20fe 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
@@ -197,7 +197,7 @@
 }
 
 String getRequestLineIndent(DartCompletionRequest request) {
-  var content = request.result.content;
+  var content = request.content;
   var lineStartOffset = request.offset;
   var notWhitespaceOffset = request.offset;
   for (; lineStartOffset > 0; lineStartOffset--) {
diff --git a/pkg/analysis_server/lib/src/services/completion/yaml/fix_data_generator.dart b/pkg/analysis_server/lib/src/services/completion/yaml/fix_data_generator.dart
index 15ef594..d57592a 100644
--- a/pkg/analysis_server/lib/src/services/completion/yaml/fix_data_generator.dart
+++ b/pkg/analysis_server/lib/src/services/completion/yaml/fix_data_generator.dart
@@ -16,27 +16,7 @@
       'title': EmptyProducer(),
       'date': EmptyProducer(),
       'bulkApply': BooleanProducer(),
-      'element': MapProducer({
-        // TODO(brianwilkerson) Support suggesting uris.
-        'uris': EmptyProducer(),
-        'class': EmptyProducer(),
-        'constant': EmptyProducer(),
-        'constructor': EmptyProducer(),
-        'enum': EmptyProducer(),
-        'extension': EmptyProducer(),
-        'field': EmptyProducer(),
-        'function': EmptyProducer(),
-        'getter': EmptyProducer(),
-        'method': EmptyProducer(),
-        'mixin': EmptyProducer(),
-        'setter': EmptyProducer(),
-        'typedef': EmptyProducer(),
-        'variable': EmptyProducer(),
-        'inClass': EmptyProducer(),
-        'inEnum': EmptyProducer(),
-        'inExtension': EmptyProducer(),
-        'inMixin': EmptyProducer(),
-      }),
+      'element': _elementProducer,
       'changes': _changesProducer,
       'oneOf': ListProducer(MapProducer({
         'if': EmptyProducer(),
@@ -56,6 +36,7 @@
       'removeParameter',
       'rename',
       'renameParameter',
+      'replacedBy',
     ]),
     'index': EmptyProducer(),
     'name': EmptyProducer(),
@@ -69,8 +50,32 @@
     'extends': EmptyProducer(),
     'oldName': EmptyProducer(),
     'newName': EmptyProducer(),
+    'newElement': _elementProducer,
   }));
 
+  /// The producer representing the known valid structure of an element.
+  static const MapProducer _elementProducer = MapProducer({
+    // TODO(brianwilkerson) Support suggesting uris.
+    'uris': EmptyProducer(),
+    'class': EmptyProducer(),
+    'constant': EmptyProducer(),
+    'constructor': EmptyProducer(),
+    'enum': EmptyProducer(),
+    'extension': EmptyProducer(),
+    'field': EmptyProducer(),
+    'function': EmptyProducer(),
+    'getter': EmptyProducer(),
+    'method': EmptyProducer(),
+    'mixin': EmptyProducer(),
+    'setter': EmptyProducer(),
+    'typedef': EmptyProducer(),
+    'variable': EmptyProducer(),
+    'inClass': EmptyProducer(),
+    'inEnum': EmptyProducer(),
+    'inExtension': EmptyProducer(),
+    'inMixin': EmptyProducer(),
+  });
+
   /// Initialize a newly created suggestion generator for fix data files.
   FixDataGenerator(ResourceProvider resourceProvider)
       : super(resourceProvider, null);
diff --git a/pkg/analysis_server/lib/src/services/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
index 47624e2..c7233ba 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -73,7 +73,7 @@
   );
   static const CONVERT_INTO_ASYNC_BODY = AssistKind(
     'dart.assist.convert.bodyToAsync',
-    29,
+    31,
     'Convert to async function body',
   );
   static const CONVERT_INTO_BLOCK_BODY = AssistKind(
@@ -222,77 +222,77 @@
   // Flutter wrap specific assists
   static const FLUTTER_WRAP_GENERIC = AssistKind(
     'dart.assist.flutter.wrap.generic',
-    31,
+    29,
     'Wrap with widget...',
   );
 
   static const FLUTTER_WRAP_BUILDER = AssistKind(
     'dart.assist.flutter.wrap.builder',
-    32,
+    28,
     'Wrap with Builder',
   );
   static const FLUTTER_WRAP_CENTER = AssistKind(
     'dart.assist.flutter.wrap.center',
-    32,
+    28,
     'Wrap with Center',
   );
   static const FLUTTER_WRAP_COLUMN = AssistKind(
     'dart.assist.flutter.wrap.column',
-    32,
+    28,
     'Wrap with Column',
   );
   static const FLUTTER_WRAP_CONTAINER = AssistKind(
     'dart.assist.flutter.wrap.container',
-    32,
+    28,
     'Wrap with Container',
   );
   static const FLUTTER_WRAP_PADDING = AssistKind(
     'dart.assist.flutter.wrap.padding',
-    32,
+    28,
     'Wrap with Padding',
   );
   static const FLUTTER_WRAP_ROW = AssistKind(
     'dart.assist.flutter.wrap.row',
-    32,
+    28,
     'Wrap with Row',
   );
   static const FLUTTER_WRAP_SIZED_BOX = AssistKind(
     'dart.assist.flutter.wrap.sizedBox',
-    32,
+    28,
     'Wrap with SizedBox',
   );
   static const FLUTTER_WRAP_STREAM_BUILDER = AssistKind(
     'dart.assist.flutter.wrap.streamBuilder',
-    32,
+    28,
     'Wrap with StreamBuilder',
   );
 
   // Flutter re-order assists
   static const FLUTTER_SWAP_WITH_CHILD = AssistKind(
     'dart.assist.flutter.swap.withChild',
-    33,
+    27,
     'Swap with child',
   );
   static const FLUTTER_SWAP_WITH_PARENT = AssistKind(
     'dart.assist.flutter.swap.withParent',
-    33,
+    27,
     'Swap with parent',
   );
   static const FLUTTER_MOVE_DOWN = AssistKind(
     'dart.assist.flutter.move.down',
-    34,
+    26,
     'Move widget down',
   );
   static const FLUTTER_MOVE_UP = AssistKind(
     'dart.assist.flutter.move.up',
-    34,
+    26,
     'Move widget up',
   );
 
   // Flutter remove assist
   static const FLUTTER_REMOVE_WIDGET = AssistKind(
     'dart.assist.flutter.removeWidget',
-    35,
+    25,
     'Remove this widget',
   );
 
@@ -334,7 +334,7 @@
   static const REMOVE_TYPE_ANNOTATION = AssistKind(
     // todo (pq): unify w/ fix
     'dart.assist.remove.typeAnnotation',
-    29,
+    31,
     'Remove type annotation',
   );
   static const REPLACE_CONDITIONAL_WITH_IF_ELSE = AssistKind(
@@ -374,47 +374,47 @@
   );
   static const SURROUND_WITH_BLOCK = AssistKind(
     'dart.assist.surround.block',
-    22,
+    38,
     'Surround with block',
   );
   static const SURROUND_WITH_DO_WHILE = AssistKind(
     'dart.assist.surround.doWhile',
-    27,
+    33,
     "Surround with 'do-while'",
   );
   static const SURROUND_WITH_FOR = AssistKind(
     'dart.assist.surround.forEach',
-    26,
+    34,
     "Surround with 'for'",
   );
   static const SURROUND_WITH_FOR_IN = AssistKind(
     'dart.assist.surround.forIn',
-    25,
+    35,
     "Surround with 'for-in'",
   );
   static const SURROUND_WITH_IF = AssistKind(
     'dart.assist.surround.if',
-    23,
+    37,
     "Surround with 'if'",
   );
   static const SURROUND_WITH_SET_STATE = AssistKind(
     'dart.assist.surround.setState',
-    27,
+    33,
     "Surround with 'setState'",
   );
   static const SURROUND_WITH_TRY_CATCH = AssistKind(
     'dart.assist.surround.tryCatch',
-    28,
+    32,
     "Surround with 'try-catch'",
   );
   static const SURROUND_WITH_TRY_FINALLY = AssistKind(
     'dart.assist.surround.tryFinally',
-    29,
+    31,
     "Surround with 'try-finally'",
   );
   static const SURROUND_WITH_WHILE = AssistKind(
     'dart.assist.surround.while',
-    24,
+    36,
     "Surround with 'while'",
   );
   static const USE_CURLY_BRACES = AssistKind(
diff --git a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
index a09c3b7..0b6145c 100644
--- a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
@@ -7,10 +7,13 @@
 import 'package:analysis_server/src/services/correction/change_workspace.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/dart/data_driven.dart';
+import 'package:analysis_server/src/services/correction/dart/organize_imports.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_unused_import.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_override_set.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_override_set_parser.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer/dart/analysis/analysis_context.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/error/error.dart';
@@ -226,28 +229,109 @@
     return builder;
   }
 
+  Future<void> _applyProducer(
+      CorrectionProducerContext context, CorrectionProducer producer) async {
+    producer.configure(context);
+    try {
+      var localBuilder = builder.copy();
+      await producer.compute(localBuilder);
+      builder = localBuilder;
+    } on ConflictingEditException {
+      // If a conflicting edit was added in [compute], then the [localBuilder]
+      // is discarded and we revert to the previous state of the builder.
+    }
+  }
+
   /// Use the change [builder] to create fixes for the diagnostics in the
   /// library associated with the analysis [result].
   Future<void> _fixErrorsInLibrary(ResolvedLibraryResult result) async {
     var analysisOptions = result.session.analysisContext.analysisOptions;
-    for (var unitResult in result.units) {
-      var overrideSet = _readOverrideSet(unitResult);
 
-      var errors = List.from(unitResult.errors, growable: false);
+    Iterable<AnalysisError> filteredErrors(ResolvedUnitResult result) sync* {
+      var errors = result.errors.toList();
       errors.sort((a, b) => a.offset.compareTo(b.offset));
-
+      // Only fix errors not filtered out in analysis options.
       for (var error in errors) {
         var processor = ErrorProcessor.getProcessor(analysisOptions, error);
-        // Only fix errors not filtered out in analysis options.
         if (processor == null || processor.severity != null) {
-          final fixContext = DartFixContextImpl(
-            instrumentationService,
-            workspace,
-            unitResult,
-            error,
-            (name) => [],
-          );
-          await _fixSingleError(fixContext, unitResult, error, overrideSet);
+          yield error;
+        }
+      }
+    }
+
+    DartFixContextImpl fixContext(
+        ResolvedUnitResult result, AnalysisError diagnostic) {
+      return DartFixContextImpl(
+        instrumentationService,
+        workspace,
+        result,
+        diagnostic,
+        (name) => [],
+      );
+    }
+
+    CorrectionProducerContext? correctionContext(
+        ResolvedUnitResult result, AnalysisError diagnostic) {
+      var overrideSet = _readOverrideSet(result);
+      return CorrectionProducerContext.create(
+        applyingBulkFixes: true,
+        dartFixContext: fixContext(result, diagnostic),
+        diagnostic: diagnostic,
+        overrideSet: overrideSet,
+        resolvedResult: result,
+        selectionOffset: diagnostic.offset,
+        selectionLength: diagnostic.length,
+        workspace: workspace,
+      );
+    }
+
+    //
+    // Attempt to apply the fixes that aren't related to directives.
+    //
+    for (var unitResult in result.units) {
+      var overrideSet = _readOverrideSet(unitResult);
+      for (var error in filteredErrors(unitResult)) {
+        await _fixSingleError(
+            fixContext(unitResult, error), unitResult, error, overrideSet);
+      }
+    }
+    //
+    // If there are no such fixes in the defining compilation unit, then apply
+    // the fixes related to directives.
+    //
+    var definingUnit = result.units[0];
+    AnalysisError? directivesOrderingError;
+    var unusedImportErrors = <AnalysisError>[];
+    if (!builder.hasEditsFor(definingUnit.path)) {
+      for (var error in filteredErrors(definingUnit)) {
+        var errorCode = error.errorCode;
+        if (errorCode is LintCode) {
+          var lintName = errorCode.name;
+          if (lintName == LintNames.directives_ordering) {
+            directivesOrderingError = error;
+            break;
+          }
+        } else if (errorCode == HintCode.DUPLICATE_IMPORT ||
+            errorCode == HintCode.UNNECESSARY_IMPORT ||
+            errorCode == HintCode.UNUSED_IMPORT) {
+          unusedImportErrors.add(error);
+        }
+      }
+      if (directivesOrderingError != null) {
+        // `OrganizeImports` will also remove some of the unused imports, so we
+        // apply it first.
+        var context = correctionContext(definingUnit, directivesOrderingError);
+        if (context != null) {
+          await _generateFix(context, OrganizeImports.newInstance(),
+              directivesOrderingError.errorCode.name);
+        }
+      } else {
+        for (var error in unusedImportErrors) {
+          var context = correctionContext(definingUnit, error);
+          if (context != null) {
+            await _generateFix(context, RemoveUnusedImport.newInstance(),
+                error.errorCode.name);
+          }
         }
       }
     }
@@ -275,44 +359,21 @@
       return;
     }
 
-    Future<void> compute(CorrectionProducer producer) async {
-      producer.configure(context);
-      try {
-        var localBuilder = builder.copy();
-        await producer.compute(localBuilder);
-        builder = localBuilder;
-      } on ConflictingEditException {
-        // If a conflicting edit was added in [compute], then the [localBuilder]
-        // is discarded and we revert to the previous state of the builder.
-      }
-    }
-
-    int computeChangeHash() => (builder as ChangeBuilderImpl).changeHash;
-
-    Future<void> generate(CorrectionProducer producer, String code) async {
-      var oldHash = computeChangeHash();
-      await compute(producer);
-      var newHash = computeChangeHash();
-      if (newHash != oldHash) {
-        changeMap.add(result.path, code);
-      }
-    }
-
     Future<void> bulkApply(
         List<ProducerGenerator> generators, String codeName) async {
       for (var generator in generators) {
         var producer = generator();
         if (producer.canBeAppliedInBulk) {
-          await generate(producer, codeName);
+          await _generateFix(context, producer, codeName);
         }
       }
     }
 
     var errorCode = diagnostic.errorCode;
+    var codeName = errorCode.name;
     try {
-      var codeName = errorCode.name;
       if (errorCode is LintCode) {
-        var generators = FixProcessor.lintProducerMap[errorCode.name] ?? [];
+        var generators = FixProcessor.lintProducerMap[codeName] ?? [];
         await bulkApply(generators, codeName);
       } else {
         var generators = FixProcessor.nonLintProducerMap[errorCode] ?? [];
@@ -323,16 +384,26 @@
             var multiProducer = multiGenerator();
             multiProducer.configure(context);
             for (var producer in multiProducer.producers) {
-              await generate(producer, codeName);
+              await _generateFix(context, producer, codeName);
             }
           }
         }
       }
     } catch (e, s) {
       throw CaughtException.withMessage(
-          'Exception generating fix for ${errorCode.name} in ${result.path}',
-          e,
-          s);
+          'Exception generating fix for $codeName in ${result.path}', e, s);
+    }
+  }
+
+  Future<void> _generateFix(CorrectionProducerContext context,
+      CorrectionProducer producer, String code) async {
+    int computeChangeHash() => (builder as ChangeBuilderImpl).changeHash;
+
+    var oldHash = computeChangeHash();
+    await _applyProducer(context, producer);
+    var newHash = computeChangeHash();
+    if (newHash != oldHash) {
+      changeMap.add(context.resolvedResult.path, code.toLowerCase());
     }
   }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart
index ec42942..3073989 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart
@@ -96,7 +96,7 @@
     if (targetClassElement == null) {
       return;
     }
-    if (targetClassElement.librarySource.isInSystemLibrary) {
+    if (targetClassElement.librarySource.uri.isScheme('dart')) {
       return;
     }
     utils.targetClassElement = targetClassElement;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
index 3c9c661..cdc8339 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
@@ -74,7 +74,7 @@
       return;
     }
     var targetSource = targetElement.source;
-    if (targetSource == null || targetSource.isInSystemLibrary) {
+    if (targetSource == null || targetSource.uri.isScheme('dart')) {
       return;
     }
     // prepare target declaration
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
index 9009561..1774efe 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
@@ -139,7 +139,7 @@
         return;
       }
       targetElement = targetClassElement;
-      if (targetClassElement.librarySource.isInSystemLibrary) {
+      if (targetClassElement.librarySource.uri.isScheme('dart')) {
         return;
       }
       // prepare target ClassDeclaration
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart
index 8958731..569e134 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart
@@ -73,7 +73,7 @@
       return;
     }
     var targetSource = targetElement.source;
-    if (targetSource == null || targetSource.isInSystemLibrary) {
+    if (targetSource == null || targetSource.uri.isScheme('dart')) {
       return;
     }
     // prepare target declaration
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart b/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
index 415f155..4a949c4 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
@@ -16,6 +16,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/src/utilities/library.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -150,22 +151,6 @@
     return false;
   }
 
-  /// Returns the relative URI from the passed [library] to the given [path].
-  ///
-  /// If the [path] is not in the [library]'s directory, `null` is returned.
-  String? _getRelativeUriFromLibrary(LibraryElement library, String path) {
-    var librarySource = library.librarySource;
-    var pathContext = resourceProvider.pathContext;
-    var libraryDirectory = pathContext.dirname(librarySource.fullName);
-    var sourceDirectory = pathContext.dirname(path);
-    if (pathContext.isWithin(libraryDirectory, path) ||
-        pathContext.isWithin(sourceDirectory, libraryDirectory)) {
-      var relativeFile = pathContext.relative(path, from: libraryDirectory);
-      return pathContext.split(relativeFile).join('/');
-    }
-    return null;
-  }
-
   Iterable<CorrectionProducer> _importExtensionInLibrary(
       Uri uri, DartType targetType, String memberName) sync* {
     // Look to see whether the library at the [uri] is already imported. If it
@@ -207,25 +192,28 @@
 
   /// Returns a list of one or two import corrections.
   ///
-  /// If [relativeUri] is `null`, only one correction, with an absolute import
-  /// path, is returned. Otherwise, a correction with an absolute import path
-  /// and a correction with a relative path are returned. If the
+  /// If [includeRelativeFix] is `false`, only one correction, with an absolute
+  /// import path, is returned. Otherwise, a correction with an absolute import
+  /// path and a correction with a relative path are returned. If the
   /// `prefer_relative_imports` lint rule is enabled, the relative path is
   /// returned first.
-  Iterable<CorrectionProducer> _importLibrary(FixKind fixKind, Uri library,
-      [String? relativeUri]) {
-    if (relativeUri == null || relativeUri.isEmpty) {
+  Iterable<CorrectionProducer> _importLibrary(
+    FixKind fixKind,
+    Uri library, {
+    bool includeRelativeFix = false,
+  }) {
+    if (!includeRelativeFix) {
       return [_ImportAbsoluteLibrary(fixKind, library)];
     }
     if (isLintEnabled(LintNames.prefer_relative_imports)) {
       return [
-        _ImportRelativeLibrary(fixKind, relativeUri),
+        _ImportRelativeLibrary(fixKind, library),
         _ImportAbsoluteLibrary(fixKind, library),
       ];
     } else {
       return [
         _ImportAbsoluteLibrary(fixKind, library),
-        _ImportRelativeLibrary(fixKind, relativeUri),
+        _ImportRelativeLibrary(fixKind, library),
       ];
     }
   }
@@ -312,10 +300,13 @@
         // Good: direct declaration.
         fixKind = DartFixKind.IMPORT_LIBRARY_PROJECT1;
       }
-      // Add the fix.
-      var relativeUri =
-          _getRelativeUriFromLibrary(libraryElement, declaration.path);
-      yield* _importLibrary(fixKind, declaration.uri, relativeUri);
+      // If both files are in the same package's lib folder, also include a
+      // relative import.
+      var includeRelativeUri = canBeRelativeImport(
+          declaration.uri, libraryElement.librarySource.uri);
+      // Add the fix(es).
+      yield* _importLibrary(fixKind, declaration.uri,
+          includeRelativeFix: includeRelativeUri);
     }
   }
 
@@ -415,7 +406,9 @@
   @override
   Future<void> compute(ChangeBuilder builder) async {
     await builder.addDartFileEdit(file, (builder) {
-      _uriText = builder.importLibrary(_library);
+      if (builder is DartFileEditBuilderImpl) {
+        _uriText = builder.importLibraryWithAbsoluteUri(_library);
+      }
     });
   }
 }
@@ -532,12 +525,14 @@
 class _ImportRelativeLibrary extends CorrectionProducer {
   final FixKind _fixKind;
 
-  final String _relativeURI;
+  final Uri _library;
 
-  _ImportRelativeLibrary(this._fixKind, this._relativeURI);
+  String _uriText = '';
+
+  _ImportRelativeLibrary(this._fixKind, this._library);
 
   @override
-  List<Object> get fixArguments => [_relativeURI];
+  List<Object> get fixArguments => [_uriText];
 
   @override
   FixKind get fixKind => _fixKind;
@@ -546,7 +541,7 @@
   Future<void> compute(ChangeBuilder builder) async {
     await builder.addDartFileEdit(file, (builder) {
       if (builder is DartFileEditBuilderImpl) {
-        builder.importLibraryWithRelativeUri(_relativeURI);
+        _uriText = builder.importLibraryWithRelativeUri(_library);
       }
     });
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/organize_imports.dart b/pkg/analysis_server/lib/src/services/correction/dart/organize_imports.dart
index d5cf7c0..d655cc3 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/organize_imports.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/organize_imports.dart
@@ -11,7 +11,8 @@
 
 class OrganizeImports extends CorrectionProducer {
   @override
-  bool get canBeAppliedInBulk => true;
+  // Bulk application is supported by a distinct import cleanup fix phase.
+  bool get canBeAppliedInBulk => false;
 
   @override
   // The fix is to sort all the directives, which will already fix all of the
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_kind.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_kind.dart
index a3fb8b1..4da8683 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_kind.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_kind.dart
@@ -20,6 +20,38 @@
 }
 
 extension ElementKindUtilities on ElementKind {
+  /// Return a human readable name for the kind.
+  String get displayName {
+    switch (this) {
+      case ElementKind.classKind:
+        return 'class';
+      case ElementKind.constantKind:
+        return 'constant';
+      case ElementKind.constructorKind:
+        return 'constructor';
+      case ElementKind.enumKind:
+        return 'enum';
+      case ElementKind.extensionKind:
+        return 'extension';
+      case ElementKind.fieldKind:
+        return 'field';
+      case ElementKind.functionKind:
+        return 'function';
+      case ElementKind.getterKind:
+        return 'getter';
+      case ElementKind.methodKind:
+        return 'method';
+      case ElementKind.mixinKind:
+        return 'mixin';
+      case ElementKind.setterKind:
+        return 'setter';
+      case ElementKind.typedefKind:
+        return 'typedef';
+      case ElementKind.variableKind:
+        return 'variable';
+    }
+  }
+
   /// Return the element kind corresponding to the given [name].
   static ElementKind? fromName(String name) {
     for (var kind in ElementKind.values) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart
index 49751f1..837025a 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart
@@ -342,20 +342,27 @@
           // If the old class has been removed then this might have been a
           // constructor invocation.
           ElementKind.constructorKind,
+          ElementKind.functionKind, // tear-off
           ElementKind.getterKind,
           ElementKind.setterKind,
           ElementKind.variableKind
         ];
       }
       return const [
+        ElementKind.constantKind,
         ElementKind.fieldKind,
+        ElementKind.functionKind, // tear-off
         ElementKind.getterKind,
+        ElementKind.methodKind, // tear-off
         ElementKind.setterKind
       ];
     } else if (node is PropertyAccess) {
       return const [
+        ElementKind.constantKind,
         ElementKind.fieldKind,
+        ElementKind.functionKind, // tear-off, prefixed
         ElementKind.getterKind,
+        ElementKind.methodKind, // tear-off, prefixed
         ElementKind.setterKind
       ];
     } else if (node is SimpleIdentifier) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/replaced_by.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/replaced_by.dart
new file mode 100644
index 0000000..92e23b9
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/replaced_by.dart
@@ -0,0 +1,140 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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/dart/data_driven.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/change.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/element_descriptor.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/source/source_range.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+/// The data related to an element that has been replaced by another element.
+class ReplacedBy extends Change<_Data> {
+  /// The replacing element.
+  final ElementDescriptor newElement;
+
+  /// Initialize a newly created transform to describe a replacement of an old
+  /// element by a [newElement].
+  ReplacedBy({required this.newElement});
+
+  @override
+  void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
+    var referenceRange = data.referenceRange;
+    builder.addSimpleReplacement(referenceRange, _referenceTo(newElement));
+  }
+
+  @override
+  _Data? validate(DataDrivenFix fix) {
+    var node = fix.node;
+    if (node is SimpleIdentifier) {
+      var components = fix.element.components;
+      if (components.isEmpty) {
+        return null;
+      } else if (components.length == 1) {
+        if (components[0] != node.name) {
+          return null;
+        }
+        // We have an '<element>' pattern, so we replace the name.
+        return _Data(range.node(node));
+      }
+      // The element being replaced is a member in a top-level element.
+      var containerName = components[1];
+      if (components[0].isEmpty && containerName == node.name) {
+        // We have a '<className>()' pattern, so we replace the class name.
+        return _Data(range.node(node));
+      }
+      var parent = node.parent;
+      if (parent is MethodInvocation) {
+        var target = parent.target;
+        if (target == null) {
+          // We have a '<member>()' pattern, so we replace the member name.
+          return _Data(range.node(node));
+        } else if (target is SimpleIdentifier && target.name == containerName) {
+          // We have a '<container>.<member>()' pattern, so we replace both parts.
+          return _Data(range.startEnd(target, node));
+        } else if (target is PrefixedIdentifier) {
+          if (target.prefix.staticElement is PrefixElement &&
+              target.identifier.name == containerName) {
+            // We have a '<prefix>.<container>.<member>()' pattern so we leave
+            // the prefix while replacing the rest.
+            return _Data(range.startEnd(target.identifier, node));
+          }
+          // We shouldn't get here.
+          return null;
+        }
+      } else if (parent is PrefixedIdentifier) {
+        if (parent.prefix.staticElement is PrefixElement) {
+          // We have a '<prefix>.<topLevel>' pattern so we leave the prefix
+          // while replacing the rest.
+          return _Data(range.node(node));
+        }
+        // We have a '<container>.<member>' pattern so we replace both parts.
+        return _Data(range.node(parent));
+      } else if (parent is PropertyAccess) {
+        var target = parent.target;
+        if (target is PrefixedIdentifier) {
+          // We have a '<prefix>.<container>.<member>' pattern so we leave the
+          // prefix while replacing the rest.
+          return _Data(range.startEnd(target.identifier, node));
+        }
+        // We have a '<container>.<member>' pattern so we replace both parts.
+        return _Data(range.node(parent));
+      }
+      // We have a '<member>' pattern so we replace the member name.
+      return _Data(range.node(node));
+    } else if (node is PrefixedIdentifier) {
+      var parent = node.parent;
+      if (parent is NamedType) {
+        var identifier = node.identifier;
+        var components = fix.element.components;
+        if (components.length > 1 &&
+            components[0].isEmpty &&
+            components[1] == identifier.name) {
+          // We have a '<prefix>.<className>' pattern, so we replace only the
+          // class name.
+          return _Data(range.node(identifier));
+        }
+      }
+    } else if (node is ConstructorName) {
+      var typeName = node.type2.name;
+      SimpleIdentifier classNameNode;
+      if (typeName is SimpleIdentifier) {
+        classNameNode = typeName;
+      } else if (typeName is PrefixedIdentifier) {
+        classNameNode = typeName.identifier;
+      } else {
+        return null;
+      }
+      var constructorNameNode = node.name;
+      var constructorName = constructorNameNode?.name ?? '';
+      var components = fix.element.components;
+      if (components.length == 2 &&
+          constructorName == components[0] &&
+          classNameNode.name == components[1]) {
+        if (constructorNameNode != null) {
+          return _Data(range.startEnd(classNameNode, constructorNameNode));
+        }
+        return _Data(range.node(classNameNode));
+      }
+    }
+    return null;
+  }
+
+  String _referenceTo(ElementDescriptor element) {
+    var components = element.components;
+    if (components[0].isEmpty) {
+      return components[1];
+    }
+    return components.reversed.join('.');
+  }
+}
+
+/// The data about a reference to an element that's been replaced.
+class _Data {
+  final SourceRange referenceRange;
+
+  _Data(this.referenceRange);
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_error_code.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_error_code.dart
index 1c992e0..42aeba2 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_error_code.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_error_code.dart
@@ -25,6 +25,26 @@
 
   /**
    * Parameters:
+   * 0: the old kind
+   * 1: the new kind
+   */
+  static const TransformSetErrorCode incompatibleElementKind =
+      TransformSetErrorCode(
+          'incompatible_element_kind',
+          "An element of kind '{0}' can't be replaced by "
+              "an element of kind '{1}'.");
+
+  /**
+   * Parameters:
+   * 0: the change kind that is invalid
+   * 1: the element kind for the transform
+   */
+  static const TransformSetErrorCode invalidChangeForKind =
+      TransformSetErrorCode('invalid_change_for_kind',
+          "A change of type '{0}' can't be used for an element of kind '{1}'.");
+
+  /**
+   * Parameters:
    * 0: the character that is invalid
    */
   static const TransformSetErrorCode invalidCharacter =
@@ -136,6 +156,14 @@
   /**
    * No parameters.
    */
+  static const TransformSetErrorCode unsupportedUriChange = TransformSetErrorCode(
+      'unsupported_uri_change',
+      "The set of URIs for the replacement element must match the transformed "
+          "element.");
+
+  /**
+   * No parameters.
+   */
   static const TransformSetErrorCode unsupportedVersion = TransformSetErrorCode(
       'unsupported_version', "Only version '1' is supported at this time.");
 
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
index 4605bd6..dc8184c 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
@@ -14,6 +14,7 @@
 import 'package:analysis_server/src/services/correction/fix/data_driven/parameter_reference.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/rename.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/rename_parameter.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/replaced_by.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_error_code.dart';
@@ -64,6 +65,7 @@
   static const String _methodKey = 'method';
   static const String _mixinKey = 'mixin';
   static const String _nameKey = 'name';
+  static const String _newElementKey = 'newElement';
   static const String _newNameKey = 'newName';
   static const String _oldNameKey = 'oldName';
   static const String _oneOfKey = 'oneOf';
@@ -97,6 +99,7 @@
   static const String _removeParameterKind = 'removeParameter';
   static const String _renameKind = 'rename';
   static const String _renameParameterKind = 'renameParameter';
+  static const String _replacedByKind = 'replacedBy';
 
   /// The valid values for the [_styleKey] in an [_addParameterKind] change.
   static const List<String> validStyles = [
@@ -106,6 +109,11 @@
     'required_positional'
   ];
 
+  /// A table mapping the kinds of elements that can be replaced by a different
+  /// element to a set of the kinds of elements with which they can be replaced.
+  static final Map<ElementKind, Set<ElementKind>> compatibleReplacementTypes =
+      _createCompatibleReplacementTypes();
+
   static const String _openComponent = '{%';
   static const String _closeComponent = '%}';
 
@@ -125,6 +133,12 @@
   /// found.
   final String packageName;
 
+  /// The description of the element that is being transformed by the current
+  /// transformation, or `null` if we are not in the process of parsing a
+  /// transformation or if the element associated with the transformation is not
+  /// valid.
+  ElementDescriptor? elementBeingTransformed;
+
   /// The variable scope defined for the current transform.
   VariableScope transformVariableScope = VariableScope.empty;
 
@@ -147,6 +161,13 @@
     return _translateTransformSet(map);
   }
 
+  bool _equalUris(List<Uri> oldUris, List<Uri> newUris) {
+    var oldSet = oldUris.toSet();
+    var newSet = newUris.toSet();
+    return oldSet.difference(newSet).isEmpty &&
+        newSet.difference(oldSet).isEmpty;
+  }
+
   /// Convert the given [template] into a list of components. Variable
   /// references in the template are looked up in the map of [generators].
   List<TemplateComponent> _extractTemplateComponents(
@@ -446,6 +467,8 @@
         return _translateRenameChange(node);
       } else if (kind == _renameParameterKind) {
         return _translateRenameParameterChange(node);
+      } else if (kind == _replacedByKind) {
+        return _translateReplacedByChange(node);
       }
       return _reportInvalidValueOneOf(kindNode, kindContext, [
         _addParameterKind,
@@ -453,6 +476,7 @@
         _removeParameterKind,
         _renameKind,
         _renameParameterKind,
+        _replacedByKind,
       ]);
     } else {
       return _reportInvalidValue(node, context, 'Map');
@@ -821,6 +845,41 @@
     return RenameParameter(newName: newName, oldName: oldName);
   }
 
+  /// Translate the [node] into a replaced_by change. Return the resulting
+  /// change, or `null` if the [node] does not represent a valid replaced_by
+  /// change.
+  ReplacedBy? _translateReplacedByChange(YamlMap node) {
+    _reportUnsupportedKeys(node, const {_kindKey, _newElementKey});
+    var newElement = _translateElement(node.valueAt(_newElementKey),
+        ErrorContext(key: _newElementKey, parentNode: node));
+    if (newElement == null) {
+      // The error has already been reported.
+      return null;
+    }
+    var oldElement = elementBeingTransformed;
+    if (oldElement != null) {
+      if (!_equalUris(oldElement.libraryUris, newElement.libraryUris)) {
+        _reportError(TransformSetErrorCode.unsupportedUriChange,
+            (node.valueAt(_newElementKey) as YamlMap).valueAt(_urisKey)!);
+      }
+      var compatibleTypes = compatibleReplacementTypes[oldElement.kind];
+      if (compatibleTypes == null) {
+        _reportError(
+            TransformSetErrorCode.invalidChangeForKind,
+            node.valueAt(_newElementKey)!,
+            [_replacedByKind, oldElement.kind.displayName]);
+        return null;
+      } else if (!compatibleTypes.contains(newElement.kind)) {
+        _reportError(
+            TransformSetErrorCode.incompatibleElementKind,
+            node.valueAt(_newElementKey)!,
+            [oldElement.kind.displayName, newElement.kind.displayName]);
+        return null;
+      }
+    }
+    return ReplacedBy(newElement: newElement);
+  }
+
   /// Translate the [node] into a string. Return the resulting string, or `null`
   /// if the [node] doesn't represent a valid string. If the [node] isn't valid,
   /// use the [context] to report the error. If the [node] doesn't exist and
@@ -893,6 +952,7 @@
           true;
       var element = _translateElement(node.valueAt(_elementKey),
           ErrorContext(key: _elementKey, parentNode: node));
+      elementBeingTransformed = element;
       transformVariableScope = _translateTemplateVariables(
           node.valueAt(_variablesKey),
           ErrorContext(key: _variablesKey, parentNode: node));
@@ -1032,4 +1092,43 @@
       return _reportInvalidValue(node, context, 'Map');
     }
   }
+
+  static Map<ElementKind, Set<ElementKind>>
+      _createCompatibleReplacementTypes() {
+    var types = <ElementKind, Set<ElementKind>>{};
+
+    void addSet(Set<ElementKind> set) {
+      for (var kind in set) {
+        types.putIfAbsent(kind, () => {}).addAll(set);
+      }
+    }
+
+    // Constructors can replace constructors.
+    addSet({
+      ElementKind.constructorKind,
+    });
+    // Static methods and top-level functions can replace each other.
+    addSet({
+      ElementKind.functionKind,
+      ElementKind.methodKind,
+    });
+    // Static getters and getter-inducing elements can replace each other.
+    addSet({
+      ElementKind.constantKind,
+      ElementKind.fieldKind,
+      ElementKind.getterKind,
+      ElementKind.variableKind,
+    });
+    // Static setters and setter-inducing elements can replace each other.
+    // TODO(brianwilkerson) We can't currently distinguish between final and
+    //  non-final elements, but we don't support replacing setters with final
+    //  elements, nor vice versa. We need a way to distinguish these cases if we
+    //  want to be able to report an error.
+    addSet({
+      ElementKind.fieldKind,
+      ElementKind.setterKind,
+      ElementKind.variableKind,
+    });
+    return types;
+  }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/organize_imports.dart b/pkg/analysis_server/lib/src/services/correction/organize_imports.dart
index 3708b48..e4438f2 100644
--- a/pkg/analysis_server/lib/src/services/correction/organize_imports.dart
+++ b/pkg/analysis_server/lib/src/services/correction/organize_imports.dart
@@ -2,15 +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.
 
+import 'dart:math' as math;
+
 import 'package:analysis_server/src/utilities/strings.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/dart/element/extensions.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/ignore_comments/ignore_info.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     hide AnalysisError, Element;
+import 'package:collection/collection.dart';
+import 'package:meta/meta_meta.dart';
 
 /// Organizer of imports (and other directives) in the [unit].
 class ImportOrganizer {
@@ -67,6 +72,13 @@
     var lineInfo = unit.lineInfo ?? LineInfo.fromContent(code);
     var hasLibraryDirective = false;
     var directives = <_DirectiveInfo>[];
+    // Track the end offset of any library-level comment/annotations that should
+    // remain at the top of the file regardless of whether it was attached to a
+    // directive that's moved/removed.
+    // Code up to this offset will be excluded from the comment/docs/annotation
+    // text for the computed DirectiveInfo and also its range for replacement
+    // in the document.
+    int? libraryDocsAndAnnotationsEndOffset;
     for (var directive in unit.directives) {
       if (directive is LibraryDirective) {
         hasLibraryDirective = true;
@@ -77,15 +89,60 @@
           var offset = directive.offset;
           var end = directive.end;
 
-          final leadingComment = getLeadingComment(unit, directive, lineInfo);
-          final trailingComment =
-              getTrailingComment(unit, directive, lineInfo, end);
+          final isPsuedoLibraryDirective = directive == unit.directives.first;
+          Annotation? lastLibraryAnnotation;
+          if (isPsuedoLibraryDirective) {
+            // Find the last library-level annotation that does not come
+            // after any non-library annotation. If there are already
+            // non-library annotations before library annotations, we will not
+            // try to correct those.
+            lastLibraryAnnotation = directive.metadata
+                .takeWhile(_isLibraryTargetAnnotation)
+                .lastOrNull;
+            if (lastLibraryAnnotation != null) {
+              libraryDocsAndAnnotationsEndOffset =
+                  lineInfo.getOffsetOfLineAfter(lastLibraryAnnotation.end);
+              // In the case of a blank line after the last library annotation
+              // we should include that in the library part. Otherwise it will
+              // be included in the top of the following directive and may
+              // result in an extra blank line in the annotation block if it
+              // is moved.
+              final nextLineOffset = lineInfo
+                  .getOffsetOfLineAfter(libraryDocsAndAnnotationsEndOffset);
+              if (code
+                  .substring(libraryDocsAndAnnotationsEndOffset, nextLineOffset)
+                  .trim()
+                  .isEmpty) {
+                libraryDocsAndAnnotationsEndOffset = nextLineOffset;
+              }
+            }
+          }
+
+          // Usually we look for leading comments on the directive. However if
+          // some library annotations were trimmed off, those comments are part
+          // of that and should not also be included here.
+          final leadingToken =
+              lastLibraryAnnotation == null ? directive.beginToken : null;
+          final leadingComment = leadingToken != null
+              ? getLeadingComment(unit, leadingToken, lineInfo)
+              : null;
+          final trailingComment = getTrailingComment(unit, directive, lineInfo);
+
+          /// Computes the offset to use for the start of directive-specific
+          /// code below taking into account code already included by
+          /// [libraryDocsAndAnnotationsEndOffset].
+          final clampedOffset = libraryDocsAndAnnotationsEndOffset == null
+              ? (int offset) => offset
+              : (int offset) =>
+                  math.max(libraryDocsAndAnnotationsEndOffset!, offset);
 
           String? leadingCommentText;
-          if (leadingComment != null) {
-            leadingCommentText =
-                code.substring(leadingComment.offset, directive.offset);
-            offset = leadingComment.offset;
+          if (leadingComment != null && leadingToken != null) {
+            offset = clampedOffset(leadingComment.offset);
+            leadingCommentText = code.substring(
+              offset,
+              clampedOffset(leadingToken.offset),
+            );
           }
           String? trailingCommentText;
           if (trailingComment != null) {
@@ -97,13 +154,33 @@
           var documentationComment = directive.documentationComment;
           if (documentationComment != null) {
             documentationText = code.substring(
-                documentationComment.offset, documentationComment.end);
+              clampedOffset(documentationComment.offset),
+              clampedOffset(documentationComment.end),
+            );
           }
           String? annotationText;
+          String? postAnnotationCommentText;
           var beginToken = directive.metadata.beginToken;
           var endToken = directive.metadata.endToken;
           if (beginToken != null && endToken != null) {
-            annotationText = code.substring(beginToken.offset, endToken.end);
+            var annotationOffset = clampedOffset(beginToken.offset);
+            var annotationEnd = clampedOffset(endToken.end);
+            if (annotationOffset != annotationEnd) {
+              annotationText = code.substring(
+                annotationOffset,
+                annotationEnd,
+              );
+            }
+            // Capture text between the end of the annotation and the directive
+            // text as there may be end-of line or line comments between.
+            // If not, this will capture the newline between the two, as it
+            // cannot be assumed there is a newline after annotationText because
+            // of the possibility of comments.
+            if (annotationEnd <
+                directive.firstTokenAfterCommentAndMetadata.offset) {
+              postAnnotationCommentText = code.substring(annotationEnd,
+                  directive.firstTokenAfterCommentAndMetadata.offset);
+            }
           }
           var text = code.substring(
               directive.firstTokenAfterCommentAndMetadata.offset,
@@ -116,9 +193,12 @@
               leadingCommentText,
               documentationText,
               annotationText,
+              postAnnotationCommentText,
               uriContent,
               trailingCommentText,
-              offset,
+              isPsuedoLibraryDirective
+                  ? (libraryDocsAndAnnotationsEndOffset ?? offset)
+                  : offset,
               end,
               text,
             ),
@@ -151,7 +231,7 @@
         sb.write(libraryDocumentationDirective.documentationText);
         sb.write(endOfLine);
       }
-      var currentPriority = directives.first.priority;
+      _DirectivePriority? currentPriority;
       for (var directiveInfo in directives) {
         if (!hasUnresolvedIdentifierError) {
           var directive = directiveInfo.directive;
@@ -160,7 +240,9 @@
           }
         }
         if (currentPriority != directiveInfo.priority) {
-          sb.write(endOfLine);
+          if (currentPriority != null) {
+            sb.write(endOfLine);
+          }
           currentPriority = directiveInfo.priority;
         }
         if (directiveInfo.leadingCommentText != null) {
@@ -173,7 +255,9 @@
         }
         if (directiveInfo.annotationText != null) {
           sb.write(directiveInfo.annotationText);
-          sb.write(endOfLine);
+        }
+        if (directiveInfo.postAnnotationCommentText != null) {
+          sb.write(directiveInfo.postAnnotationCommentText);
         }
         sb.write(directiveInfo.text);
         if (directiveInfo.trailingCommentText != null) {
@@ -230,7 +314,7 @@
   }
 
   /// Gets the first comment token considered to be the leading comment for this
-  /// directive.
+  /// token.
   ///
   /// Leading comments for the first directive in a file are considered library
   /// comments and not returned unless they contain blank lines, in which case
@@ -239,12 +323,12 @@
   /// '// ignore:' comment which should always be treated as attached to the
   /// import.
   static Token? getLeadingComment(
-      CompilationUnit unit, UriBasedDirective directive, LineInfo lineInfo) {
-    if (directive.beginToken.precedingComments == null) {
+      CompilationUnit unit, Token beginToken, LineInfo lineInfo) {
+    if (beginToken.precedingComments == null) {
       return null;
     }
 
-    Token? firstComment = directive.beginToken.precedingComments;
+    Token? firstComment = beginToken.precedingComments;
     var comment = firstComment;
     var nextComment = comment?.next;
     // Don't connect comments that have a blank line between them
@@ -274,7 +358,7 @@
     // Skip over any comments on the same line as the previous directive
     // as they will be attached to the end of it.
     var previousDirectiveLine =
-        lineInfo.getLocation(directive.beginToken.previous!.end).lineNumber;
+        lineInfo.getLocation(beginToken.previous!.end).lineNumber;
     comment = firstComment;
     while (comment != null &&
         previousDirectiveLine ==
@@ -289,9 +373,9 @@
   ///
   /// To be considered a trailing comment, the comment must be on the same line
   /// as the directive.
-  static Token? getTrailingComment(CompilationUnit unit,
-      UriBasedDirective directive, LineInfo lineInfo, int end) {
-    var line = lineInfo.getLocation(end).lineNumber;
+  static Token? getTrailingComment(
+      CompilationUnit unit, UriBasedDirective directive, LineInfo lineInfo) {
+    var line = lineInfo.getLocation(directive.end).lineNumber;
     Token? comment = directive.endToken.next!.precedingComments;
     while (comment != null) {
       if (lineInfo.getLocation(comment.offset).lineNumber == line) {
@@ -306,6 +390,10 @@
   /// '// ignore_for_file:' comment).
   static bool _isIgnoreComment(Token token) =>
       IgnoreInfo.IGNORE_MATCHER.matchAsPrefix(token.lexeme) != null;
+
+  static bool _isLibraryTargetAnnotation(Annotation annotation) =>
+      annotation.elementAnnotation?.targetKinds.contains(TargetKind.library) ??
+      false;
 }
 
 class _DirectiveInfo implements Comparable<_DirectiveInfo> {
@@ -314,6 +402,7 @@
   final String? leadingCommentText;
   final String? documentationText;
   final String? annotationText;
+  final String? postAnnotationCommentText;
   final String uri;
   final String? trailingCommentText;
 
@@ -332,6 +421,7 @@
     this.leadingCommentText,
     this.documentationText,
     this.annotationText,
+    this.postAnnotationCommentText,
     this.uri,
     this.trailingCommentText,
     this.offset,
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 6e97072..f3cae42 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
@@ -158,9 +158,7 @@
     var refDir = pathContext.dirname(reference.file);
     // Try to keep package: URI
     if (_isPackageReference(reference)) {
-      Source newSource =
-          NonExistingSource(newFile, pathos.toUri(newFile), UriKind.FILE_URI);
-      var restoredUri = driver.sourceFactory.restoreUri(newSource);
+      var restoredUri = driver.sourceFactory.pathToUri(newFile);
       // If the new URI is not a package: URI, fall back to computing a relative
       // URI below.
       if (restoredUri?.isScheme('package') ?? false) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename.dart b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
index 3ca9d77..8fbe15a 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
@@ -73,7 +73,7 @@
   @override
   Future<RefactoringStatus> checkInitialConditions() {
     var result = RefactoringStatus();
-    if (element.source!.isInSystemLibrary) {
+    if (element.source!.uri.isScheme('dart')) {
       var message = format(
           "The {0} '{1}' is defined in the SDK, so cannot be renamed.",
           getElementKindName(element),
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index 59cafe6..8e938ef 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -62,7 +62,7 @@
       var error = RequestError(
           RequestErrorCode.SERVER_ALREADY_STARTED, 'Server already started');
       serverChannel.sendResponse(Response('', error: error));
-      serverChannel.listen((Request request) {
+      serverChannel.requests.listen((Request request) {
         serverChannel.sendResponse(Response(request.id, error: error));
       });
       return;
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index 0d4629c..5ab8cff 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -206,7 +206,7 @@
     buf.writeln(
         '<tr><th>Time</th><th>Results</th><th>Source</th><th>Snippet</th></tr>');
     for (var completion in completions) {
-      var shortName = pathContext.basename(completion.path ?? '<missing path>');
+      var shortName = pathContext.basename(completion.path);
       buf.writeln('<tr>'
           '<td class="pre right">${printMilliseconds(completion.elapsedInMilliseconds)}</td>'
           '<td class="right">${completion.suggestionCountStr}</td>'
diff --git a/pkg/analysis_server/lib/src/utilities/mocks.dart b/pkg/analysis_server/lib/src/utilities/mocks.dart
index 9c581cd..bef5102 100644
--- a/pkg/analysis_server/lib/src/utilities/mocks.dart
+++ b/pkg/analysis_server/lib/src/utilities/mocks.dart
@@ -36,6 +36,9 @@
   MockServerChannel();
 
   @override
+  Stream<Request> get requests => requestController.stream;
+
+  @override
   void close() {
     _closed = true;
   }
@@ -46,13 +49,6 @@
   }
 
   @override
-  void listen(void Function(Request request) onRequest,
-      {Function? onError, void Function()? onDone}) {
-    requestController.stream
-        .listen(onRequest, onError: onError, onDone: onDone);
-  }
-
-  @override
   void sendNotification(Notification notification) {
     // Don't deliver notifications after the connection is closed.
     if (_closed) {
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index d727774..09fdeee 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -5,8 +5,6 @@
 import 'package:analyzer/dart/analysis/analysis_context.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.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/src/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
@@ -23,24 +21,6 @@
 
 import 'src/utilities/mock_packages.dart';
 
-/// Finds an [Element] with the given [name].
-Element? findChildElement(Element root, String name, [ElementKind? kind]) {
-  Element? result;
-  root.accept(_ElementVisitorFunctionWrapper((Element element) {
-    if (element.name != name) {
-      return;
-    }
-    if (kind != null && element.kind != kind) {
-      return;
-    }
-    result = element;
-  }));
-  return result;
-}
-
-/// A function to be called for every [Element].
-typedef _ElementVisitorFunction = void Function(Element element);
-
 class AbstractContextTest with ResourceProviderMixin {
   static bool _lintRulesAreRegistered = false;
 
@@ -65,6 +45,13 @@
     throw 0;
   }
 
+  /// Return a list of the experiments that are to be enabled for tests in this
+  /// class, an empty list if there are no experiments that should be enabled.
+  List<String> get experiments => [
+        EnableString.constructor_tearoffs,
+        EnableString.named_arguments_anywhere,
+      ];
+
   String get latestLanguageVersion =>
       '${ExperimentStatus.currentVersion.major}.'
       '${ExperimentStatus.currentVersion.minor}';
@@ -192,6 +179,10 @@
     );
 
     writeTestPackageConfig();
+
+    createAnalysisOptionsFile(
+      experiments: experiments,
+    );
   }
 
   void setupResourceProvider() {}
@@ -302,16 +293,3 @@
     verifyCreatedCollection();
   }
 }
-
-/// Wraps the given [_ElementVisitorFunction] into an instance of
-/// [engine.GeneralizingElementVisitor].
-class _ElementVisitorFunctionWrapper extends GeneralizingElementVisitor<void> {
-  final _ElementVisitorFunction function;
-  _ElementVisitorFunctionWrapper(this.function);
-
-  @override
-  void visitElement(Element element) {
-    function(element);
-    super.visitElement(element);
-  }
-}
diff --git a/pkg/analysis_server/test/abstract_single_unit.dart b/pkg/analysis_server/test/abstract_single_unit.dart
index b18416c..67aa683 100644
--- a/pkg/analysis_server/test/abstract_single_unit.dart
+++ b/pkg/analysis_server/test/abstract_single_unit.dart
@@ -94,6 +94,6 @@
   @override
   void setUp() {
     super.setUp();
-    testFile = convertPath('/home/test/lib/test.dart');
+    testFile = convertPath('$testPackageLibPath/test.dart');
   }
 }
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 0724bfe..d89741d 100644
--- a/pkg/analysis_server/test/channel/byte_stream_channel_test.dart
+++ b/pkg/analysis_server/test/channel/byte_stream_channel_test.dart
@@ -135,7 +135,7 @@
     errorStream = errorStreamController.stream;
     var doneCompleter = Completer();
     doneFuture = doneCompleter.future;
-    channel.listen((Request request) {
+    channel.requests.listen((Request request) {
       requestStreamController.add(request);
     }, onError: (error) {
       errorStreamController.add(error);
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index 8ea43c3..317cc59 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -18,6 +18,8 @@
 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:analyzer_plugin/src/protocol/protocol_internal.dart'
+    show HasToJson;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -1580,7 +1582,7 @@
   }
 
   /// Send an `updateContent` request for [testFile].
-  void sendContentChange(dynamic contentChange) {
+  void sendContentChange(HasToJson contentChange) {
     var request =
         AnalysisUpdateContentParams({testFile: contentChange}).toRequest('0');
     handleSuccessfulRequest(request);
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 2a46330..c3ec9c3 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -11,7 +11,6 @@
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
-import 'package:analysis_server/src/services/completion/dart/not_imported_contributor.dart';
 import 'package:analysis_server/src/utilities/mocks.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/instrumentation/service.dart';
@@ -21,12 +20,15 @@
 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;
+import 'package:analyzer_utilities/check/check.dart';
+import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'domain_completion_util.dart';
 import 'mocks.dart';
 import 'src/plugin/plugin_manager_test.dart';
+import 'utils/change_check.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -42,30 +44,31 @@
   Future<void> test_alreadyImported() async {
     await _configureWithWorkspaceRoot();
 
-    var validator = await _getTestCodeDetails('''
+    var details = await _getTestCodeDetails('''
 import 'dart:math';
 void f() {
   Rand^
 }
 ''', completion: 'Random', libraryUri: 'dart:math');
-    validator
-      ..hasCompletion('Random')
-      ..hasChange().assertNoFileEdits();
+    check(details)
+      ..completion.isEqualTo('Random')
+      ..change.edits.isEmpty;
   }
 
   Future<void> test_import_dart() async {
     await _configureWithWorkspaceRoot();
 
-    var validator = await _getTestCodeDetails('''
+    var details = await _getTestCodeDetails('''
 void f() {
   R^
 }
 ''', completion: 'Random', libraryUri: 'dart:math');
-    validator
-      ..hasCompletion('Random')
-      ..hasChange()
+    check(details)
+      ..completion.isEqualTo('Random')
+      ..change
           .hasFileEdit(testFilePathPlatform)
-          .whenApplied(testFileContent, r'''
+          .appliedTo(testFileContent)
+          .isEqualTo(r'''
 import 'dart:math';
 
 void f() {
@@ -75,8 +78,7 @@
   }
 
   Future<void> test_import_package_dependencies() async {
-    // TODO(scheglov) Switch to PubspecYamlFileConfig
-    newPubspecYamlFile(testPackageRootPath, r'''
+    writeTestPackagePubspecYamlFile(r'''
 name: test
 dependencies:
   aaa: any
@@ -94,16 +96,17 @@
 
     await _configureWithWorkspaceRoot();
 
-    var validator = await _getTestCodeDetails('''
+    var details = await _getTestCodeDetails('''
 void f() {
   T^
 }
 ''', completion: 'Test', libraryUri: 'package:aaa/a.dart');
-    validator
-      ..hasCompletion('Test')
-      ..hasChange()
+    check(details)
+      ..completion.isEqualTo('Test')
+      ..change
           .hasFileEdit(testFilePathPlatform)
-          .whenApplied(testFileContent, r'''
+          .appliedTo(testFileContent)
+          .isEqualTo(r'''
 import 'package:aaa/a.dart';
 
 void f() {
@@ -119,16 +122,17 @@
 
     await _configureWithWorkspaceRoot();
 
-    var validator = await _getTestCodeDetails('''
+    var details = await _getTestCodeDetails('''
 void f() {
   T^
 }
 ''', completion: 'Test', libraryUri: 'package:test/a.dart');
-    validator
-      ..hasCompletion('Test')
-      ..hasChange()
+    check(details)
+      ..completion.isEqualTo('Test')
+      ..change
           .hasFileEdit(testFilePathPlatform)
-          .whenApplied(testFileContent, r'''
+          .appliedTo(testFileContent)
+          .isEqualTo(r'''
 import 'package:test/a.dart';
 
 void f() {
@@ -160,7 +164,7 @@
     expect(response.error?.code, RequestErrorCode.INVALID_FILE_PATH_FORMAT);
   }
 
-  Future<GetSuggestionDetails2Validator> _getCodeDetails({
+  Future<CompletionGetSuggestionDetails2Result> _getCodeDetails({
     required String path,
     required String content,
     required String completion,
@@ -184,7 +188,7 @@
     );
   }
 
-  Future<GetSuggestionDetails2Validator> _getDetails({
+  Future<CompletionGetSuggestionDetails2Result> _getDetails({
     required String path,
     required int completionOffset,
     required String completion,
@@ -198,11 +202,10 @@
     ).toRequest('0');
 
     var response = await _handleSuccessfulRequest(request);
-    var result = CompletionGetSuggestionDetails2Result.fromResponse(response);
-    return GetSuggestionDetails2Validator(result);
+    return CompletionGetSuggestionDetails2Result.fromResponse(response);
   }
 
-  Future<GetSuggestionDetails2Validator> _getTestCodeDetails(
+  Future<CompletionGetSuggestionDetails2Result> _getTestCodeDetails(
     String content, {
     required String completion,
     required String libraryUri,
@@ -225,24 +228,75 @@
     completionDomain.budgetDuration = const Duration(seconds: 30);
   }
 
-  void tearDown() {
-    NotImportedContributor.onFile = null;
-  }
+  Future<void> test_abort_onAnotherCompletionRequest() async {
+    var abortedIdSet = <String>{};
+    server.discardedRequests.stream.listen((request) {
+      abortedIdSet.add(request.id);
+    });
 
-  Future<void> test_notImported_abort() async {
+    newFile(testFilePath, content: '');
+
     await _configureWithWorkspaceRoot();
 
-    NotImportedContributor.onFile = (file) {
-      if (file.uriStr == 'dart:math') {
-        unawaited(
-          _getSuggestions(
-            path: convertPath(testFilePath),
-            completionOffset: 0,
-            maxResults: 100,
-          ),
-        );
-      }
-    };
+    // Send three requests, the first two should be aborted.
+    var response0 = _sendTestCompletionRequest('0', 0);
+    var response1 = _sendTestCompletionRequest('1', 0);
+    var response2 = _sendTestCompletionRequest('2', 0);
+
+    // Wait for all three.
+    var validator0 = await response0.toResult();
+    var validator1 = await response1.toResult();
+    var validator2 = await response2.toResult();
+
+    // The first two should be aborted.
+    expect(abortedIdSet, {'0', '1'});
+
+    validator0
+      ..assertIncomplete()
+      ..suggestions.assertEmpty();
+
+    validator1
+      ..assertIncomplete()
+      ..suggestions.assertEmpty();
+
+    validator2
+      ..assertComplete()
+      ..suggestions.assertCompletionsContainsAll(
+        ['int', 'double', 'Future', 'Directory'],
+      );
+  }
+
+  Future<void> test_abort_onUpdateContent() async {
+    var abortedIdSet = <String>{};
+    server.discardedRequests.stream.listen((request) {
+      abortedIdSet.add(request.id);
+    });
+
+    newFile(testFilePath, content: '');
+
+    await _configureWithWorkspaceRoot();
+
+    // Schedule a completion request.
+    var response = _sendTestCompletionRequest('0', 0);
+
+    // Simulate typing in the IDE.
+    await _handleSuccessfulRequest(
+      AnalysisUpdateContentParams({
+        testFilePathPlatform: AddContentOverlay('void f() {}'),
+      }).toRequest('1'),
+    );
+
+    // The request should be aborted.
+    var validator = await response.toResult();
+    expect(abortedIdSet, {'0'});
+
+    validator
+      ..assertIncomplete()
+      ..suggestions.assertEmpty();
+  }
+
+  Future<void> test_notImported_dart() async {
+    await _configureWithWorkspaceRoot();
 
     var responseValidator = await _getTestCodeSuggestions('''
 void f() {
@@ -251,14 +305,21 @@
 ''');
 
     responseValidator
-      ..assertIncomplete()
+      ..assertComplete()
       ..assertReplacementBack(4)
-      ..assertLibrariesToImport(includes: [], excludes: [
-        'dart:core',
+      ..assertLibrariesToImport(includes: [
         'dart:math',
+      ], excludes: [
+        'dart:async',
+        'dart:core',
+        'package:test/test.dart',
       ]);
 
-    responseValidator.suggestions.assertEmpty();
+    var classes = responseValidator.suggestions.withElementClass();
+    classes.assertCompletions(['Random']);
+    classes.withCompletion('Random').assertSingle()
+      ..assertClass()
+      ..assertLibraryToImport('dart:math');
   }
 
   Future<void> test_notImported_emptyBudget() async {
@@ -285,8 +346,7 @@
   }
 
   Future<void> test_notImported_pub_dependencies_inLib() async {
-    // TODO(scheglov) Switch to PubspecYamlFileConfig
-    newPubspecYamlFile(testPackageRootPath, r'''
+    writeTestPackagePubspecYamlFile(r'''
 name: test
 dependencies:
   aaa: any
@@ -343,8 +403,7 @@
   }
 
   Future<void> test_notImported_pub_dependencies_inTest() async {
-    // TODO(scheglov) Switch to PubspecYamlFileConfig
-    newPubspecYamlFile(testPackageRootPath, r'''
+    writeTestPackagePubspecYamlFile(r'''
 name: test
 dependencies:
   aaa: any
@@ -407,8 +466,6 @@
       ..assertLibraryToImport('package:bbb/f.dart');
   }
 
-  /// TODO(scheglov) Only lib/ libraries in lib/, no test/.
-  /// TODO(scheglov) Suggestions from available Pub packages.
   Future<void> test_notImported_pub_this() async {
     newFile('$testPackageLibPath/a.dart', content: '''
 class A01 {}
@@ -430,12 +487,12 @@
       ..assertComplete()
       ..assertReplacementBack(2)
       ..assertLibrariesToImport(includes: [
-        'dart:async',
-        'dart:math',
         'package:test/a.dart',
         'package:test/b.dart',
       ], excludes: [
+        'dart:async',
         'dart:core',
+        'dart:math',
         'package:test/test.dart',
       ]);
 
@@ -473,11 +530,11 @@
       ..assertComplete()
       ..assertReplacementBack(2)
       ..assertLibrariesToImport(includes: [
-        'dart:async',
-        'dart:math',
         'package:test/b.dart',
       ], excludes: [
+        'dart:async',
         'dart:core',
+        'dart:math',
         'package:test/a.dart',
         'package:test/test.dart',
       ]);
@@ -519,12 +576,12 @@
       ..assertComplete()
       ..assertReplacementBack(2)
       ..assertLibrariesToImport(includes: [
-        'dart:async',
-        'dart:math',
         'package:test/a.dart',
         'package:test/b.dart',
       ], excludes: [
+        'dart:async',
         'dart:core',
+        'dart:math',
         'package:test/test.dart',
       ]);
 
@@ -542,8 +599,7 @@
   }
 
   Future<void> test_notImported_pub_this_inLib_excludesTest() async {
-    // TODO(scheglov) Switch to PubspecYamlFileConfig
-    newPubspecYamlFile(testPackageRootPath, r'''
+    writeTestPackagePubspecYamlFile(r'''
 name: test
 ''');
 
@@ -582,8 +638,7 @@
   }
 
   Future<void> test_notImported_pub_this_inLib_includesThisSrc() async {
-    // TODO(scheglov) Switch to PubspecYamlFileConfig
-    newPubspecYamlFile(testPackageRootPath, r'''
+    writeTestPackagePubspecYamlFile(r'''
 name: test
 ''');
 
@@ -625,8 +680,7 @@
   }
 
   Future<void> test_notImported_pub_this_inTest_includesTest() async {
-    // TODO(scheglov) Switch to PubspecYamlFileConfig
-    newPubspecYamlFile(testPackageRootPath, r'''
+    writeTestPackagePubspecYamlFile(r'''
 name: test
 ''');
 
@@ -673,8 +727,7 @@
   }
 
   Future<void> test_notImported_pub_this_inTest_includesThisSrc() async {
-    // TODO(scheglov) Switch to PubspecYamlFileConfig
-    newPubspecYamlFile(testPackageRootPath, r'''
+    writeTestPackagePubspecYamlFile(r'''
 name: test
 ''');
 
@@ -1398,6 +1451,71 @@
     suggestionsValidator.assertCompletions(['foo02', 'foo01']);
   }
 
+  Future<void> test_yaml_analysisOptions_root() async {
+    await _configureWithWorkspaceRoot();
+
+    var path = convertPath('$testPackageRootPath/analysis_options.yaml');
+    var responseValidator = await _getCodeSuggestions(
+      path: path,
+      content: '^',
+    );
+
+    responseValidator
+      ..assertComplete()
+      ..assertEmptyReplacement();
+
+    responseValidator.suggestions
+        .withKindIdentifier()
+        .assertCompletionsContainsAll([
+      'analyzer: ',
+      'include: ',
+      'linter: ',
+    ]);
+  }
+
+  Future<void> test_yaml_fixData_root() async {
+    await _configureWithWorkspaceRoot();
+
+    var path = convertPath('$testPackageRootPath/fix_data.yaml');
+    var responseValidator = await _getCodeSuggestions(
+      path: path,
+      content: '^',
+    );
+
+    responseValidator
+      ..assertComplete()
+      ..assertEmptyReplacement();
+
+    responseValidator.suggestions
+        .withKindIdentifier()
+        .assertCompletionsContainsAll([
+      'version: ',
+      'transforms:',
+    ]);
+  }
+
+  Future<void> test_yaml_pubspec_root() async {
+    await _configureWithWorkspaceRoot();
+
+    var path = convertPath('$testPackageRootPath/pubspec.yaml');
+    var responseValidator = await _getCodeSuggestions(
+      path: path,
+      content: '^',
+    );
+
+    responseValidator
+      ..assertComplete()
+      ..assertEmptyReplacement();
+
+    responseValidator.suggestions
+        .withKindIdentifier()
+        .assertCompletionsContainsAll([
+      'name: ',
+      'dependencies: ',
+      'dev_dependencies: ',
+    ]);
+  }
+
   Future<CompletionGetSuggestions2ResponseValidator> _getCodeSuggestions({
     required String path,
     required String content,
@@ -1446,6 +1564,16 @@
       maxResults: maxResults,
     );
   }
+
+  RequestWithFutureResponse _sendTestCompletionRequest(String id, int offset) {
+    var request = CompletionGetSuggestions2Params(
+      testFilePathPlatform,
+      0,
+      1 << 10,
+    ).toRequest(id);
+    var futureResponse = _handleRequest(request);
+    return RequestWithFutureResponse(offset, request, futureResponse);
+  }
 }
 
 @reflectiveTest
@@ -2387,20 +2515,6 @@
   }
 }
 
-class GetSuggestionDetails2Validator {
-  final CompletionGetSuggestionDetails2Result result;
-
-  GetSuggestionDetails2Validator(this.result);
-
-  SourceChangeValidator hasChange() {
-    return SourceChangeValidator(result.change);
-  }
-
-  void hasCompletion(Object completion) {
-    expect(result.completion, completion);
-  }
-}
-
 class PubPackageAnalysisServerTest with ResourceProviderMixin {
   late final MockServerChannel serverChannel;
   late final AnalysisServer server;
@@ -2493,6 +2607,10 @@
     writePackageConfig(testPackageRoot, config);
   }
 
+  void writeTestPackagePubspecYamlFile(String content) {
+    newPubspecYamlFile(testPackageRootPath, content);
+  }
+
   Future<void> _configureWithWorkspaceRoot() async {
     await setRoots(included: [workspaceRootPath], excluded: []);
     await server.onAnalysisComplete;
@@ -2510,6 +2628,21 @@
   }
 }
 
+class RequestWithFutureResponse {
+  final int offset;
+  final Request request;
+  final Future<Response> futureResponse;
+
+  RequestWithFutureResponse(this.offset, this.request, this.futureResponse);
+
+  Future<CompletionGetSuggestions2ResponseValidator> toResult() async {
+    var response = await futureResponse;
+    expect(response, isResponseSuccess(request.id));
+    var result = CompletionGetSuggestions2Result.fromResponse(response);
+    return CompletionGetSuggestions2ResponseValidator(offset, result);
+  }
+}
+
 class SingleSuggestionValidator {
   final CompletionSuggestion suggestion;
   final List<String>? libraryUrisToImport;
@@ -2559,32 +2692,6 @@
   }
 }
 
-class SourceChangeValidator {
-  final SourceChange change;
-
-  SourceChangeValidator(this.change);
-
-  void assertNoFileEdits() {
-    expect(change.edits, isEmpty);
-  }
-
-  SourceFileEditValidator hasFileEdit(String path) {
-    var edit = change.edits.singleWhere((e) => e.file == path);
-    return SourceFileEditValidator(edit);
-  }
-}
-
-class SourceFileEditValidator {
-  final SourceFileEdit edit;
-
-  SourceFileEditValidator(this.edit);
-
-  void whenApplied(String applyTo, Object expected) {
-    var actual = SourceEdit.applySequence(applyTo, edit.edits);
-    expect(actual, expected);
-  }
-}
-
 class SuggestionsValidator {
   final List<CompletionSuggestion> suggestions;
   final List<String>? libraryUrisToImport;
@@ -2605,8 +2712,17 @@
     expect(actual, completions);
   }
 
+  /// Assert that this has suggestions with all [expected] completions.
+  /// There might be more suggestions, with other completions.
+  ///
+  /// Does not check the order, kinds, elements, etc.
+  void assertCompletionsContainsAll(Iterable<String> expected) {
+    var actual = suggestions.map((e) => e.completion).toSet();
+    expect(actual, containsAll(expected));
+  }
+
   void assertEmpty() {
-    expect(suggestions, isEmpty);
+    check(suggestions).isEmpty;
   }
 
   void assertLength(Object matcher) {
@@ -2650,4 +2766,35 @@
       libraryUrisToImport: libraryUrisToImport,
     );
   }
+
+  SuggestionsValidator withKind(CompletionSuggestionKind kind) {
+    return SuggestionsValidator(
+      suggestions.where((suggestion) {
+        return suggestion.kind == kind;
+      }).toList(),
+      libraryUrisToImport: libraryUrisToImport,
+    );
+  }
+
+  SuggestionsValidator withKindIdentifier() {
+    return withKind(CompletionSuggestionKind.IDENTIFIER);
+  }
+}
+
+extension on CheckTarget<CompletionGetSuggestionDetails2Result> {
+  @useResult
+  CheckTarget<String> get completion {
+    return nest(
+      value.completion,
+      (selected) => 'has completion ${valueStr(selected)}',
+    );
+  }
+
+  @useResult
+  CheckTarget<SourceChange> get change {
+    return nest(
+      value.change,
+      (selected) => 'has change ${valueStr(selected)}',
+    );
+  }
 }
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 9a707cf..aa0d470 100644
--- a/pkg/analysis_server/test/integration/support/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
@@ -1020,9 +1020,11 @@
   ///   True if the number of suggestions after filtering was greater than the
   ///   requested maxResults.
   Future<CompletionGetSuggestions2Result> sendCompletionGetSuggestions2(
-      String file, int offset, int maxResults) async {
-    var params =
-        CompletionGetSuggestions2Params(file, offset, maxResults).toJson();
+      String file, int offset, int maxResults,
+      {int? timeout}) async {
+    var params = CompletionGetSuggestions2Params(file, offset, maxResults,
+            timeout: timeout)
+        .toJson();
     var result = await server.send('completion.getSuggestions2', params);
     var decoder = ResponseDecoder(null);
     return CompletionGetSuggestions2Result.fromJson(decoder, 'result', result);
diff --git a/pkg/analysis_server/test/integration/support/integration_tests.dart b/pkg/analysis_server/test/integration/support/integration_tests.dart
index 6ca048e..3ef73c2 100644
--- a/pkg/analysis_server/test/integration/support/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/support/integration_tests.dart
@@ -41,7 +41,7 @@
 Matcher isOneOf(List<Matcher> choiceMatchers) => _OneOf(choiceMatchers);
 
 /// Assert that [actual] matches [matcher].
-void outOfTestExpect(actual, Matcher matcher,
+void outOfTestExpect(Object? actual, Matcher matcher,
     {String? reason, skip, bool verbose = false}) {
   var matchState = {};
   try {
@@ -377,8 +377,8 @@
       description.add(this.description);
 
   @override
-  void populateMismatches(item, List<MismatchDescriber> mismatches) {
-    if (item is! Map) {
+  void populateMismatches(Object? item, List<MismatchDescriber> mismatches) {
+    if (item is! Map<String, Object?>) {
       mismatches.add(simpleDescription('is not a map'));
       return;
     }
@@ -535,7 +535,7 @@
       _recordStdio('<== $trimmedLine');
       Map message;
       try {
-        message = json.decoder.convert(trimmedLine);
+        message = json.decoder.convert(trimmedLine) as Map<Object?, Object?>;
       } catch (exception) {
         _badDataFromServer('JSON decode failure: $exception');
         return;
@@ -543,7 +543,7 @@
       outOfTestExpect(message, isMap);
       if (message.containsKey('id')) {
         outOfTestExpect(message['id'], isString);
-        String id = message['id'];
+        var id = message['id'] as String;
         var completer = _pendingCommands[id];
         if (completer == null) {
           fail('Unexpected response from server: id=$id');
@@ -553,7 +553,7 @@
         if (message.containsKey('error')) {
           completer.completeError(ServerErrorMessage(message));
         } else {
-          completer.complete(message['result']);
+          completer.complete(message['result'] as Map<String, Object?>?);
         }
         // Check that the message is well-formed.  We do this after calling
         // completer.complete() or completer.completeError() so that we don't
@@ -564,7 +564,8 @@
         // params.
         outOfTestExpect(message, contains('event'));
         outOfTestExpect(message['event'], isString);
-        notificationProcessor(message['event'], message['params']);
+        notificationProcessor(message['event'] as String,
+            message['params'] as Map<Object?, Object?>);
         // Check that the message is well-formed.  We do this after calling
         // notificationController.add() so that we don't stall the test in the
         // event of an error.
diff --git a/pkg/analysis_server/test/integration/support/protocol_matchers.dart b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
index 5fd8c3c..70848d4 100644
--- a/pkg/analysis_server/test/integration/support/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
@@ -2139,7 +2139,8 @@
 /// }
 final Matcher isCompletionGetSuggestions2Params = LazyMatcher(() =>
     MatchesJsonObject('completion.getSuggestions2 params',
-        {'file': isFilePath, 'offset': isInt, 'maxResults': isInt}));
+        {'file': isFilePath, 'offset': isInt, 'maxResults': isInt},
+        optionalFields: {'timeout': isInt}));
 
 /// completion.getSuggestions2 result
 ///
diff --git a/pkg/analysis_server/test/lsp/code_actions_assists_test.dart b/pkg/analysis_server/test/lsp/code_actions_assists_test.dart
index 2797109..cf67637f 100644
--- a/pkg/analysis_server/test/lsp/code_actions_assists_test.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_assists_test.dart
@@ -393,6 +393,39 @@
     }
   }
 
+  Future<void> test_sort() async {
+    const content = '''
+    import 'package:flutter/widgets.dart';
+
+    build() => Contai^ner(child: Container());
+    ''';
+
+    newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize(
+      textDocumentCapabilities: withCodeActionKinds(
+          emptyTextDocumentClientCapabilities, [CodeActionKind.Refactor]),
+      workspaceCapabilities:
+          withDocumentChangesSupport(emptyWorkspaceClientCapabilities),
+    );
+
+    final codeActions = await getCodeActions(mainFileUri.toString(),
+        position: positionFromMarker(content));
+    final names = codeActions.map(
+      (e) => e.map((command) => command.title, (action) => action.title),
+    );
+
+    expect(
+      names,
+      containsAllInOrder([
+        // Check the ordering for two well-known assists that should always be
+        // sorted this way.
+        // https://github.com/Dart-Code/Dart-Code/issues/3646
+        'Wrap with widget...',
+        'Remove this widget',
+      ]),
+    );
+  }
+
   List<TextDocumentEdit> _extractTextDocumentEdits(
           Either2<
                   List<TextDocumentEdit>,
@@ -424,5 +457,5 @@
   _RawParams(this._json);
 
   @override
-  Object toJson() => jsonDecode(_json);
+  Object toJson() => jsonDecode(_json) as Object;
 }
diff --git a/pkg/analysis_server/test/lsp/completion_dart_test.dart b/pkg/analysis_server/test/lsp/completion_dart_test.dart
index 9ccf020..cbacc55 100644
--- a/pkg/analysis_server/test/lsp/completion_dart_test.dart
+++ b/pkg/analysis_server/test/lsp/completion_dart_test.dart
@@ -4,9 +4,11 @@
 
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:collection/collection.dart';
+import 'package:linter/src/rules.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -234,6 +236,21 @@
         insertText: 'myFunction',
       );
 
+  Future<void> test_completeFunctionCalls_existingArgList_member_noPrefix() =>
+      // https://github.com/Dart-Code/Dart-Code/issues/3672
+      checkCompleteFunctionCallInsertText(
+        '''
+        class Aaaaa {
+          static foo(int a) {}
+        }
+        void f() {
+          Aaaaa.[[^]]()
+        }
+        ''',
+        'foo(…)',
+        insertText: 'foo',
+      );
+
   Future<void> test_completeFunctionCalls_existingArgList_namedConstructor() =>
       checkCompleteFunctionCallInsertText(
         '''
@@ -1606,6 +1623,36 @@
     expect(resolved.detail, isNull);
   }
 
+  Future<void> test_suggestionSets_importsPackageUri() async {
+    newFile(
+      join(projectFolderPath, 'lib', 'my_class.dart'),
+      content: 'class MyClass {}',
+    );
+
+    final content = '''
+void f() {
+  MyClas^
+}
+    ''';
+
+    final expectedContent = '''
+import 'package:test/my_class.dart';
+
+void f() {
+  MyClass
+}
+    ''';
+
+    final completionLabel = 'MyClass';
+
+    await _checkCompletionEdits(
+      mainFileUri,
+      content,
+      completionLabel,
+      expectedContent,
+    );
+  }
+
   Future<void>
       test_suggestionSets_includesReexportedSymbolsForEachFile() async {
     newFile(
@@ -2003,6 +2050,78 @@
     '''));
   }
 
+  Future<void> test_suggestionSets_preferRelativeImportsLib_insideLib() async {
+    _enableLints([LintNames.prefer_relative_imports]);
+    final importingFilePath =
+        join(projectFolderPath, 'lib', 'nested1', 'main.dart');
+    final importingFileUri = Uri.file(importingFilePath);
+    final importedFilePath =
+        join(projectFolderPath, 'lib', 'nested2', 'imported.dart');
+
+    // Create a file that will be auto-imported from completion.
+    newFile(importedFilePath, content: 'class MyClass {}');
+
+    final content = '''
+void f() {
+  MyClas^
+}
+    ''';
+
+    final expectedContent = '''
+import '../nested2/imported.dart';
+
+void f() {
+  MyClass
+}
+    ''';
+
+    final completionLabel = 'MyClass';
+
+    await _checkCompletionEdits(
+      importingFileUri,
+      content,
+      completionLabel,
+      expectedContent,
+    );
+  }
+
+  Future<void> test_suggestionSets_preferRelativeImportsLib_outsideLib() async {
+    // Files outside of the lib folder should still get absolute imports to
+    // files inside lib, even with the lint enabled.
+    _enableLints([LintNames.prefer_relative_imports]);
+    final importingFilePath =
+        join(projectFolderPath, 'bin', 'nested1', 'main.dart');
+    final importingFileUri = Uri.file(importingFilePath);
+    final importedFilePath =
+        join(projectFolderPath, 'lib', 'nested2', 'imported.dart');
+
+    // Create a file that will be auto-imported from completion.
+    newFile(importedFilePath, content: 'class MyClass {}');
+
+    final content = '''
+void f() {
+  MyClas^
+}
+    ''';
+
+    final expectedContent = '''
+import 'package:test/nested2/imported.dart';
+
+void f() {
+  MyClass
+}
+    ''';
+
+    final completionLabel = 'MyClass';
+
+    await _checkCompletionEdits(
+      importingFileUri,
+      content,
+      completionLabel,
+      expectedContent,
+    );
+  }
+
   Future<void> test_suggestionSets_unavailableIfDisabled() async {
     newFile(
       join(projectFolderPath, 'other_file.dart'),
@@ -2085,6 +2204,39 @@
     expect(updated, contains('a.abcdefghij'));
   }
 
+  /// Sets up the server with a file containing [content] and checks that
+  /// accepting a specific completion produces [expectedContent].
+  ///
+  /// [content] should contain a `^` at the location where completion should be
+  /// invoked/accepted.
+  Future<void> _checkCompletionEdits(
+    Uri fileUri,
+    String content,
+    String completionLabel,
+    String expectedContent,
+  ) async {
+    final initialAnalysis = waitForAnalysisComplete();
+    await initialize(
+        workspaceCapabilities:
+            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await openFile(fileUri, withoutMarkers(content));
+    await initialAnalysis;
+    final res = await getCompletion(fileUri, positionFromMarker(content));
+
+    final completion = res.where((c) => c.label == completionLabel).single;
+    final resolvedCompletion = await resolveCompletion(completion);
+
+    // Apply both the main completion edit and the additionalTextEdits atomically.
+    final newContent = applyTextEdits(
+      withoutMarkers(content),
+      [toTextEdit(resolvedCompletion.textEdit!)]
+          .followedBy(resolvedCompletion.additionalTextEdits!)
+          .toList(),
+    );
+
+    expect(newContent, equals(expectedContent));
+  }
+
   Future<void> _checkResultsForTriggerCharacters(String content,
       List<String> triggerCharacters, Matcher expectedResults) async {
     await initialize();
@@ -2099,6 +2251,16 @@
       expect(res, expectedResults);
     }
   }
+
+  void _enableLints(List<String> lintNames) {
+    registerLintRules();
+    final lintsYaml = lintNames.map((name) => '    - $name\n').join();
+    newFile(analysisOptionsPath, content: '''
+linter:
+  rules:
+$lintsYaml
+''');
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/analysis_server/test/lsp/diagnostic_test.dart b/pkg/analysis_server/test/lsp/diagnostic_test.dart
index fc6dffe..3b7fc18 100644
--- a/pkg/analysis_server/test/lsp/diagnostic_test.dart
+++ b/pkg/analysis_server/test/lsp/diagnostic_test.dart
@@ -88,7 +88,7 @@
 linter:
   rules:
     - invalid_lint_rule_name
-''').path;
+''');
 
     final firstDiagnosticsUpdate = waitForDiagnostics(analysisOptionsUri);
     await initialize();
@@ -102,7 +102,7 @@
   Future<void> test_analysisOptionsFile_packageInclude() async {
     newFile(analysisOptionsPath, content: '''
 include: package:pedantic/analysis_options.yaml
-''').path;
+''');
 
     // Verify there's an error for the import.
     final firstDiagnosticsUpdate = waitForDiagnostics(analysisOptionsUri);
diff --git a/pkg/analysis_server/test/lsp/document_color_test.dart b/pkg/analysis_server/test/lsp/document_color_test.dart
new file mode 100644
index 0000000..55dbf74
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/document_color_test.dart
@@ -0,0 +1,158 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DocumentColorTest);
+    defineReflectiveTests(DocumentColorPresentationTest);
+  });
+}
+
+@reflectiveTest
+class DocumentColorPresentationTest extends AbstractLspAnalysisServerTest {
+  late Range colorRange, importRange;
+  final uiImportUri = 'package:ui/ui.dart';
+
+  @override
+  void setUp() {
+    super.setUp();
+    writePackageConfig(projectFolderPath, flutter: true);
+  }
+
+  Future<void> test_includesImportEdit() async {
+    // Create a file that doesn't already import the required library.
+    //
+    // We don't need a real color reference in the file right now, as we're
+    // calling colorPresentation directly to get the new code (and not fetching
+    // colors already in the file).
+    const content = '''
+[[]]const white = [[]];
+''';
+
+    final ranges = rangesFromMarkers(content);
+    importRange = ranges[0];
+    colorRange = ranges[1];
+
+    newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize();
+
+    final colorPresentations = await getColorPresentation(
+      mainFileUri.toString(),
+      colorRange,
+      Color(alpha: 1, red: 1, green: 1, blue: 1),
+    );
+
+    expect(
+      colorPresentations,
+      equals([
+        _color('Color.fromARGB(255, 255, 255, 255)', importUri: uiImportUri),
+        _color('Color.fromRGBO(255, 255, 255, 1)', importUri: uiImportUri),
+        _color('Color(0xFFFFFFFF)', importUri: uiImportUri),
+      ]),
+    );
+  }
+
+  Future<void> test_nonDartFile() async {
+    newFile(pubspecFilePath, content: simplePubspecContent);
+    await initialize();
+
+    final colors = await getColorPresentation(
+      pubspecFileUri.toString(),
+      startOfDocRange,
+      Color(alpha: 1, red: 1, green: 1, blue: 1),
+    );
+    expect(colors, isEmpty);
+  }
+
+  Future<void> test_simpleColor() async {
+    const content = '''
+    import 'package:flutter/material.dart';
+
+    const white = [[Color(0xFFFFFFFF)]];
+    ''';
+    colorRange = rangeFromMarkers(content);
+
+    newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize();
+
+    final colorPresentations = await getColorPresentation(
+      mainFileUri.toString(),
+      colorRange,
+      // Send a different color to what's in the source to simulate the user
+      // having changed in the color picker. This is the one that we should be
+      // creating a presentation for, not the one in the source.
+      Color(alpha: 1, red: 1, green: 0, blue: 0),
+    );
+
+    expect(
+      colorPresentations,
+      equals([
+        _color('Color.fromARGB(255, 255, 0, 0)'),
+        _color('Color.fromRGBO(255, 0, 0, 1)'),
+        _color('Color(0xFFFF0000)'),
+      ]),
+    );
+  }
+
+  /// Creates a [ColorPresentation] for comparing against actual results.
+  ColorPresentation _color(
+    String label, {
+    String? colorCode,
+    String? importUri,
+  }) {
+    final edit = TextEdit(range: colorRange, newText: colorCode ?? label);
+    final additionalEdits = importUri != null
+        ? [TextEdit(range: importRange, newText: "import '$importUri';\n\n")]
+        : null;
+
+    return ColorPresentation(
+      label: label,
+      textEdit: edit,
+      additionalTextEdits: additionalEdits,
+    );
+  }
+}
+
+@reflectiveTest
+class DocumentColorTest extends AbstractLspAnalysisServerTest {
+  @override
+  void setUp() {
+    super.setUp();
+    writePackageConfig(projectFolderPath, flutter: true);
+  }
+
+  Future<void> test_nonDartFile() async {
+    newFile(pubspecFilePath, content: simplePubspecContent);
+    await initialize();
+
+    final colors = await getDocumentColors(pubspecFileUri.toString());
+    expect(colors, isEmpty);
+  }
+
+  Future<void> test_simpleColor() async {
+    const content = '''
+    import 'package:flutter/material.dart';
+
+    const red = [[Colors.red]];
+    ''';
+    newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize();
+
+    final colors = await getDocumentColors(mainFileUri.toString());
+    expect(colors, hasLength(1));
+
+    final color = colors[0];
+    expect(color.range, rangeFromMarkers(content));
+    expect(color.color.alpha, equals(1));
+    expect(color.color.red, equals(1));
+    expect(color.color.green, equals(0));
+    expect(color.color.blue, equals(0));
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/format_test.dart b/pkg/analysis_server/test/lsp/format_test.dart
index 61bac2e..7ffff8a 100644
--- a/pkg/analysis_server/test/lsp/format_test.dart
+++ b/pkg/analysis_server/test/lsp/format_test.dart
@@ -295,6 +295,26 @@
     await expectRangeFormattedContents(mainFileUri, contents, expected);
   }
 
+  Future<void> test_formatRange_trailingNewline_47702() async {
+    // Check we complete when a formatted block ends with a newline.
+    // https://github.com/dart-lang/sdk/issues/47702
+    const contents = '''
+int a;
+[[
+    int b;
+]]
+''';
+    final expected = '''
+int a;
+
+int b;
+
+''';
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(contents));
+    await expectRangeFormattedContents(mainFileUri, contents, expected);
+  }
+
   Future<void> test_invalidSyntax() async {
     const contents = '''void f(((( {
   print('test');
diff --git a/pkg/analysis_server/test/lsp/initialization_test.dart b/pkg/analysis_server/test/lsp/initialization_test.dart
index b6bbc58..4d006be 100644
--- a/pkg/analysis_server/test/lsp/initialization_test.dart
+++ b/pkg/analysis_server/test/lsp/initialization_test.dart
@@ -230,6 +230,7 @@
     expect(initResult.capabilities.hoverProvider, isNotNull);
     expect(initResult.capabilities.signatureHelpProvider, isNotNull);
     expect(initResult.capabilities.referencesProvider, isNotNull);
+    expect(initResult.capabilities.colorProvider, isNotNull);
     expect(initResult.capabilities.documentHighlightProvider, isNotNull);
     expect(initResult.capabilities.documentFormattingProvider, isNotNull);
     expect(initResult.capabilities.documentOnTypeFormattingProvider, isNotNull);
@@ -289,6 +290,7 @@
     expect(initResult.capabilities.hoverProvider, isNull);
     expect(initResult.capabilities.signatureHelpProvider, isNull);
     expect(initResult.capabilities.referencesProvider, isNull);
+    expect(initResult.capabilities.colorProvider, isNull);
     expect(initResult.capabilities.documentHighlightProvider, isNull);
     expect(initResult.capabilities.documentFormattingProvider, isNull);
     expect(initResult.capabilities.documentOnTypeFormattingProvider, isNull);
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
index 6b8ba52..851966e 100644
--- a/pkg/analysis_server/test/lsp/server_abstract.dart
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -261,9 +261,11 @@
 
   void mergeJson(Map<String, dynamic> source, Map<String, dynamic> dest) {
     source.keys.forEach((key) {
-      if (source[key] is Map<String, dynamic> &&
-          dest[key] is Map<String, dynamic>) {
-        mergeJson(source[key], dest[key]);
+      var sourceValue = source[key];
+      var destValue = dest[key];
+      if (sourceValue is Map<String, dynamic> &&
+          destValue is Map<String, dynamic>) {
+        mergeJson(sourceValue, destValue);
       } else {
         dest[key] = source[key];
       }
@@ -284,6 +286,7 @@
       'references': {'dynamicRegistration': true},
       'documentHighlight': {'dynamicRegistration': true},
       'documentSymbol': {'dynamicRegistration': true},
+      'colorProvider': {'dynamicRegistration': true},
       'formatting': {'dynamicRegistration': true},
       'onTypeFormatting': {'dynamicRegistration': true},
       'rangeFormatting': {'dynamicRegistration': true},
@@ -877,7 +880,7 @@
     return expectSuccessfulResponseTo(request, (result) => result);
   }
 
-  void expect(actual, matcher, {String? reason}) =>
+  void expect(Object? actual, Matcher matcher, {String? reason}) =>
       test.expect(actual, matcher, reason: reason);
 
   void expectDocumentVersion(
@@ -1035,6 +1038,22 @@
     );
   }
 
+  Future<List<ColorPresentation>> getColorPresentation(
+      String fileUri, Range range, Color color) {
+    final request = makeRequest(
+      Method.textDocument_colorPresentation,
+      ColorPresentationParams(
+        textDocument: TextDocumentIdentifier(uri: fileUri),
+        range: range,
+        color: color,
+      ),
+    );
+    return expectSuccessfulResponseTo(
+      request,
+      _fromJsonList(ColorPresentation.fromJson),
+    );
+  }
+
   Future<List<CompletionItem>> getCompletion(Uri uri, Position pos,
       {CompletionContext? context}) {
     final request = makeRequest(
@@ -1093,6 +1112,19 @@
     return expectSuccessfulResponseTo(request, DartDiagnosticServer.fromJson);
   }
 
+  Future<List<ColorInformation>> getDocumentColors(String fileUri) {
+    final request = makeRequest(
+      Method.textDocument_documentColor,
+      DocumentColorParams(
+        textDocument: TextDocumentIdentifier(uri: fileUri),
+      ),
+    );
+    return expectSuccessfulResponseTo(
+      request,
+      _fromJsonList(ColorInformation.fromJson),
+    );
+  }
+
   Future<List<DocumentHighlight>?> getDocumentHighlights(
       Uri uri, Position pos) {
     final request = makeRequest(
@@ -1164,7 +1196,7 @@
   Future<List<Location>> getReferences(
     Uri uri,
     Position pos, {
-    includeDeclarations = false,
+    bool includeDeclarations = false,
   }) {
     final request = makeRequest(
       Method.textDocument_references,
diff --git a/pkg/analysis_server/test/lsp/test_all.dart b/pkg/analysis_server/test/lsp/test_all.dart
index 752d3f1..bd22081 100644
--- a/pkg/analysis_server/test/lsp/test_all.dart
+++ b/pkg/analysis_server/test/lsp/test_all.dart
@@ -20,6 +20,7 @@
 import 'definition_test.dart' as definition;
 import 'diagnostic_test.dart' as diagnostic;
 import 'document_changes_test.dart' as document_changes;
+import 'document_color_test.dart' as document_color;
 import 'document_highlights_test.dart' as document_highlights;
 import 'document_symbols_test.dart' as document_symbols;
 import 'file_modification_test.dart' as file_modification;
@@ -63,6 +64,7 @@
     document_changes.main();
     document_highlights.main();
     document_symbols.main();
+    document_color.main();
     file_modification.main();
     flutter_outline.main();
     folding.main();
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/cupertino.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/cupertino.dart
new file mode 100644
index 0000000..828a456
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/cupertino.dart
@@ -0,0 +1,5 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+export 'src/cupertino/colors.dart';
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/material.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/material.dart
index 466ed8e..a1cecbd 100644
--- a/pkg/analysis_server/test/mock_packages/flutter/lib/material.dart
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/material.dart
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 export 'src/material/app_bar.dart';
+export 'src/material/colors.dart';
 export 'src/material/icons.dart';
 export 'src/material/scaffold.dart';
 export 'widgets.dart';
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/painting.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/painting.dart
index a3323f6..6eec7c5 100644
--- a/pkg/analysis_server/test/mock_packages/flutter/lib/painting.dart
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/painting.dart
@@ -5,6 +5,7 @@
 export 'src/painting/alignment.dart';
 export 'src/painting/basic_types.dart';
 export 'src/painting/box_decoration.dart';
+export 'src/painting/colors.dart';
 export 'src/painting/decoration.dart';
 export 'src/painting/edge_insets.dart';
 export 'src/painting/text_painter.dart';
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/cupertino/colors.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/cupertino/colors.dart
new file mode 100644
index 0000000..62356d5
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/cupertino/colors.dart
@@ -0,0 +1,102 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter/painting.dart';
+
+class CupertinoColors {
+  CupertinoColors._();
+
+  static const CupertinoDynamicColor activeBlue = systemBlue;
+
+  static const Color black = Color(0xFF000000);
+  static const Color white = Color(0xFFFFFFFF);
+
+  static const CupertinoDynamicColor systemBlue =
+      CupertinoDynamicColor.withBrightnessAndContrast(
+    color: Color.fromARGB(255, 0, 0, 0xFF),
+    darkColor: Color.fromARGB(255, 0, 0, 0x99),
+    highContrastColor: Color.fromARGB(255, 0, 0, 0x66),
+    darkHighContrastColor: Color.fromARGB(255, 0, 0, 0x33),
+  );
+}
+
+class CupertinoDynamicColor extends Color {
+  const CupertinoDynamicColor({
+    Color color,
+    Color darkColor,
+    Color highContrastColor,
+    Color darkHighContrastColor,
+    Color elevatedColor,
+    Color darkElevatedColor,
+    Color highContrastElevatedColor,
+    Color darkHighContrastElevatedColor,
+  }) : this._(
+          color,
+          color,
+          darkColor,
+          highContrastColor,
+          darkHighContrastColor,
+          elevatedColor,
+          darkElevatedColor,
+          highContrastElevatedColor,
+          darkHighContrastElevatedColor,
+          null,
+        );
+
+  const CupertinoDynamicColor.withBrightnessAndContrast({
+    Color color,
+    Color darkColor,
+    Color highContrastColor,
+    Color darkHighContrastColor,
+  }) : this(
+          color: color,
+          darkColor: darkColor,
+          highContrastColor: highContrastColor,
+          darkHighContrastColor: darkHighContrastColor,
+          elevatedColor: color,
+          darkElevatedColor: darkColor,
+          highContrastElevatedColor: highContrastColor,
+          darkHighContrastElevatedColor: darkHighContrastColor,
+        );
+
+  const CupertinoDynamicColor.withBrightness({
+    Color color,
+    Color darkColor,
+  }) : this(
+          color: color,
+          darkColor: darkColor,
+          highContrastColor: color,
+          darkHighContrastColor: darkColor,
+          elevatedColor: color,
+          darkElevatedColor: darkColor,
+          highContrastElevatedColor: color,
+          darkHighContrastElevatedColor: darkColor,
+        );
+
+  const CupertinoDynamicColor._(
+    this._effectiveColor,
+    this.color,
+    this.darkColor,
+    this.highContrastColor,
+    this.darkHighContrastColor,
+    this.elevatedColor,
+    this.darkElevatedColor,
+    this.highContrastElevatedColor,
+    this.darkHighContrastElevatedColor,
+  ) : super(0);
+
+  final Color _effectiveColor;
+
+  @override
+  int get value => _effectiveColor.value;
+
+  final Color color;
+  final Color darkColor;
+  final Color highContrastColor;
+  final Color darkHighContrastColor;
+  final Color elevatedColor;
+  final Color darkElevatedColor;
+  final Color highContrastElevatedColor;
+  final Color darkHighContrastElevatedColor;
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/colors.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/colors.dart
new file mode 100644
index 0000000..803f7a5
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/colors.dart
@@ -0,0 +1,71 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter/painting.dart';
+
+class MaterialColor extends ColorSwatch<int> {
+  const MaterialColor(int primary, Map<int, Color> swatch)
+      : super(primary, swatch);
+
+  Color get shade100 => this[100];
+  Color get shade200 => this[200];
+  Color get shade300 => this[300];
+  Color get shade400 => this[400];
+  Color get shade50 => this[50];
+  Color get shade500 => this[500];
+  Color get shade600 => this[600];
+  Color get shade700 => this[700];
+  Color get shade800 => this[800];
+  Color get shade900 => this[900];
+}
+
+class MaterialAccentColor extends ColorSwatch<int> {
+  const MaterialAccentColor(int primary, Map<int, Color> swatch)
+      : super(primary, swatch);
+
+  Color get shade50 => this[50];
+  Color get shade100 => this[100];
+  Color get shade200 => this[200];
+  Color get shade400 => this[400];
+  Color get shade700 => this[700];
+}
+
+class Colors {
+  Colors._();
+
+  static const Color black = Color(0xFF000000);
+  static const Color white = Color(0xFFFFFFFF);
+
+  static const MaterialColor red = MaterialColor(
+    _redPrimaryValue,
+    <int, Color>{
+      // For simpler testing, these values are not the real Flutter values
+      // but just varying alphas on a primary value.
+      50: Color(0x05FF0000),
+      100: Color(0x10FF0000),
+      200: Color(0x20FF0000),
+      300: Color(0x30FF0000),
+      400: Color(0x40FF0000),
+      500: Color(0x50FF0000),
+      600: Color(0x60FF0000),
+      700: Color(0x70FF0000),
+      800: Color(0x80FF0000),
+      900: Color(0x90FF0000),
+    },
+  );
+  static const int _redPrimaryValue = 0xFFFF0000;
+
+  static const MaterialAccentColor redAccent = MaterialAccentColor(
+    _redAccentValue,
+    <int, Color>{
+      // For simpler testing, these values are not the real Flutter values
+      // but just varying alphas on a primary value.
+      100: Color(0x10FFAA00),
+      200: Color(0x20FFAA00),
+      400: Color(0x40FFAA00),
+      700: Color(0x70FFAA00),
+    },
+  );
+  static const int _redAccentValue = 0xFFFFAA00;
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/colors.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/colors.dart
new file mode 100644
index 0000000..f0dbfae
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/colors.dart
@@ -0,0 +1,16 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter/foundation.dart';
+import 'package:flutter/painting.dart';
+
+@immutable
+class ColorSwatch<T> extends Color {
+  const ColorSwatch(int primary, this._swatch) : super(primary);
+
+  @protected
+  final Map<T, Color> _swatch;
+
+  Color operator [](T index) => _swatch[index];
+}
diff --git a/pkg/analysis_server/test/mock_packages/meta/lib/meta_meta.dart b/pkg/analysis_server/test/mock_packages/meta/lib/meta_meta.dart
new file mode 100644
index 0000000..18902be
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/meta/lib/meta_meta.dart
@@ -0,0 +1,123 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Annotations that describe the intended use of other annotations.
+library meta_meta;
+
+/// An annotation used on classes that are intended to be used as annotations
+/// to indicate the kinds of declarations and directives for which the
+/// annotation is appropriate.
+///
+/// The kinds are represented by the constants defined in [TargetKind].
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with anything other than a class, where the
+///   class must be usable as an annotation (that is, contain at least one
+///   `const` constructor).
+/// * the annotated annotation is associated with anything other than the kinds
+///   of declarations listed as valid targets.
+@Target({TargetKind.classType})
+class Target {
+  /// The kinds of declarations with which the annotated annotation can be
+  /// associated.
+  final Set<TargetKind> kinds;
+
+  const Target(this.kinds);
+}
+
+/// An enumeration of the kinds of targets to which an annotation can be
+/// applied.
+enum TargetKind {
+  /// Indicates that an annotation is valid on any class declaration.
+  classType,
+
+  /// Indicates that an annotation is valid on any enum declaration.
+  enumType,
+
+  /// Indicates that an annotation is valid on any extension declaration.
+  extension,
+
+  /// Indicates that an annotation is valid on any field declaration, both
+  /// instance and static fields, whether it's in a class, mixin or extension.
+  field,
+
+  /// Indicates that an annotation is valid on any top-level function
+  /// declaration.
+  function,
+
+  /// Indicates that an annotation is valid on the first directive in a library,
+  /// whether that's a `library`, `import`, `export` or `part` directive. This
+  /// doesn't include the `part of` directive in a part file.
+  library,
+
+  /// Indicates that an annotation is valid on any getter declaration, both
+  /// instance or static getters, whether it's in a class, mixin, extension, or
+  /// at the top-level of a library.
+  getter,
+
+  /// Indicates that an annotation is valid on any method declaration, both
+  /// instance and static methods, whether it's in a class, mixin or extension.
+  method,
+
+  /// Indicates that an annotation is valid on any mixin declaration.
+  mixinType,
+
+  /// Indicates that an annotation is valid on any formal parameter declaration,
+  /// whether it's in a function, method, constructor, or closure.
+  parameter,
+
+  /// Indicates that an annotation is valid on any setter declaration, both
+  /// instance or static setters, whether it's in a class, mixin, extension, or
+  /// at the top-level of a library.
+  setter,
+
+  /// Indicates that an annotation is valid on any top-level variable
+  /// declaration.
+  topLevelVariable,
+
+  /// Indicates that an annotation is valid on any declaration that introduces a
+  /// type. This includes classes, enums, mixins and typedefs, but does not
+  /// include extensions because extensions don't introduce a type.
+  type,
+
+  /// Indicates that an annotation is valid on any typedef declaration.
+  typedefType,
+}
+
+extension TargetKindExtension on TargetKind {
+  /// Return a user visible string used to describe this target kind.
+  String get displayString {
+    switch (this) {
+      case TargetKind.classType:
+        return 'classes';
+      case TargetKind.enumType:
+        return 'enums';
+      case TargetKind.extension:
+        return 'extensions';
+      case TargetKind.field:
+        return 'fields';
+      case TargetKind.function:
+        return 'top-level functions';
+      case TargetKind.library:
+        return 'libraries';
+      case TargetKind.getter:
+        return 'getters';
+      case TargetKind.method:
+        return 'methods';
+      case TargetKind.mixinType:
+        return 'mixins';
+      case TargetKind.parameter:
+        return 'parameters';
+      case TargetKind.setter:
+        return 'setters';
+      case TargetKind.topLevelVariable:
+        return 'top-level variables';
+      case TargetKind.type:
+        return 'types (classes, enums, mixins, or typedefs)';
+      case TargetKind.typedefType:
+        return 'typedefs';
+    }
+  }
+}
diff --git a/pkg/analysis_server/test/search/declarations_test.dart b/pkg/analysis_server/test/search/declarations_test.dart
index 3d64012..3c0a02f 100644
--- a/pkg/analysis_server/test/search/declarations_test.dart
+++ b/pkg/analysis_server/test/search/declarations_test.dart
@@ -208,8 +208,8 @@
     assertHas('s', ElementKind.SETTER);
     assertHas('f', ElementKind.FUNCTION);
     assertHas('v', ElementKind.TOP_LEVEL_VARIABLE);
-    assertHas('tf1', ElementKind.FUNCTION_TYPE_ALIAS);
-    assertHas('tf2', ElementKind.FUNCTION_TYPE_ALIAS);
+    assertHas('tf1', ElementKind.TYPE_ALIAS);
+    assertHas('tf2', ElementKind.TYPE_ALIAS);
     assertHas('td3', ElementKind.TYPE_ALIAS);
   }
 
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 690b251..4c2e182 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
@@ -123,7 +123,7 @@
 class ArgListContributorTest extends DartCompletionContributorTest
     with ArgListContributorMixin {
   Future<void> test_Annotation_imported_constructor_named_param() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library libA; class A { const A({int one, String two: 'defaultValue'}); }''');
     addTestSource('import "a.dart"; @A(^) main() { }');
     await computeSuggestions();
@@ -132,7 +132,7 @@
   }
 
   Future<void> test_Annotation_importedConstructor_prefixed() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   const A({int value});
 }
@@ -581,7 +581,8 @@
 
   Future<void> test_ArgumentList_imported_constructor_named_param() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement
-    addSource('/home/test/lib/a.dart', 'library libA; class A{A({int one}); }');
+    addSource(
+        '$testPackageLibPath/a.dart', 'library libA; class A{A({int one}); }');
     addTestSource('import "a.dart"; main() { new A(^);}');
     await computeSuggestions();
     assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
@@ -589,8 +590,8 @@
 
   Future<void> test_ArgumentList_imported_constructor_named_param2() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement
-    addSource(
-        '/home/test/lib/a.dart', 'library libA; class A{A.foo({int one}); }');
+    addSource('$testPackageLibPath/a.dart',
+        'library libA; class A{A.foo({int one}); }');
     addTestSource('import "a.dart"; main() { new A.foo(^);}');
     await computeSuggestions();
     assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
@@ -599,7 +600,7 @@
   Future<void>
       test_ArgumentList_imported_constructor_named_typed_param() async {
     // ArgumentList  InstanceCreationExpression  VariableDeclaration
-    addSource('/home/test/lib/a.dart',
+    addSource('$testPackageLibPath/a.dart',
         'library libA; class A { A({int i, String s, d}) {} }}');
     addTestSource('import "a.dart"; main() { var a = new A(^);}');
     await computeSuggestions();
@@ -609,7 +610,7 @@
 
   Future<void> test_ArgumentList_imported_factory_named_param() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement
-    addSource('/home/test/lib/a.dart',
+    addSource('$testPackageLibPath/a.dart',
         'library libA; class A{factory A({int one}) => throw 0;}');
     addTestSource('import "a.dart"; main() { new A(^);}');
     await computeSuggestions();
@@ -618,7 +619,7 @@
 
   Future<void> test_ArgumentList_imported_factory_named_param2() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement
-    addSource('/home/test/lib/a.dart',
+    addSource('$testPackageLibPath/a.dart',
         'library libA; abstract class A{factory A.foo({int one});}');
     addTestSource('import "a.dart"; main() { new A.foo(^);}');
     await computeSuggestions();
@@ -627,7 +628,7 @@
 
   Future<void> test_ArgumentList_imported_factory_named_typed_param() async {
     // ArgumentList  InstanceCreationExpression  VariableDeclaration
-    addSource('/home/test/lib/a.dart',
+    addSource('$testPackageLibPath/a.dart',
         'library libA; class A {factory A({int i, String s, d}) {} }}');
     addTestSource('import "a.dart"; main() { var a = new A(^);}');
     await computeSuggestions();
@@ -637,7 +638,7 @@
 
   Future<void> test_ArgumentList_imported_function_0() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
       library A;
       bool hasLength(int expected) { }
       expect() { }
@@ -653,7 +654,7 @@
 
   Future<void> test_ArgumentList_imported_function_3a() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
       library A;
       bool hasLength(int expected) { }
       expect(String arg1, int arg2, {bool arg3}) { }
@@ -669,7 +670,7 @@
 
   Future<void> test_ArgumentList_imported_function_3b() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
       library A;
       bool hasLength(int expected) { }
       expect(String arg1, int arg2, {bool arg3}) { }
@@ -685,7 +686,7 @@
 
   Future<void> test_ArgumentList_imported_function_3c() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
       library A;
       bool hasLength(int expected) { }
       expect(String arg1, int arg2, {bool arg3}) { }
@@ -701,7 +702,7 @@
 
   Future<void> test_ArgumentList_imported_function_3d() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
       library A;
       bool hasLength(int expected) { }
       expect(String arg1, int arg2, {bool arg3}) { }
@@ -1084,7 +1085,7 @@
 
   Future<void> test_ArgumentList_local_method_0() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
       library A;
       bool hasLength(int expected) { }
       void baz() { }''');
@@ -1111,7 +1112,7 @@
   }
 
   Future<void> test_ArgumentList_nnbd_function_named_param_imported() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 f({int? nullable, int nonnullable}) {}''');
     createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
     addTestSource(r'''
@@ -1126,7 +1127,7 @@
   }
 
   Future<void> test_ArgumentList_nnbd_function_named_param_legacy() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 // @dart = 2.8
 f({int named}) {}''');
     addTestSource(r'''
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 3099fcf..a04f0be 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
@@ -41,17 +41,17 @@
 
   Future<void> test_Combinator_hide() async {
     // SimpleIdentifier  HideCombinator  ImportDirective
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
       library libAB;
       part "ab_part.dart";
       class A { }
       class B { }''');
-    addSource('/home/test/lib/ab_part.dart', '''
+    addSource('$testPackageLibPath/ab_part.dart', '''
       part of libAB;
       var T1;
       PB F1() => new PB();
       class PB { }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
       class C { }
       class D { }''');
     addTestSource('''
@@ -81,20 +81,20 @@
 
   Future<void> test_Combinator_show() async {
     // SimpleIdentifier  HideCombinator  ImportDirective
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
       library libAB;
       part "ab_part.dart";
       class A { }
       class B { }
       class _AB''');
-    addSource('/home/test/lib/ab_part.dart', '''
+    addSource('$testPackageLibPath/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('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
       class C { }
       class D { }''');
     addTestSource('''
@@ -129,11 +129,11 @@
   }
 
   Future<void> test_Combinator_show_export_withShow() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {}
 class B {}
 ''');
-    addSource('/home/test/lib/b.dart', r'''
+    addSource('$testPackageLibPath/b.dart', r'''
 export 'a.dart' show A;
 ''');
     addTestSource(r'''
@@ -152,10 +152,10 @@
   }
 
   Future<void> test_Combinator_show_recursive() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {}
 ''');
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 export 'a.dart';
 export 'b.dart';
 class B {}
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 4926490..a8c7e39 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
@@ -5,7 +5,6 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
-import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart'
     show DartCompletionRequest;
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
@@ -530,24 +529,21 @@
 
   Future computeSuggestions({int times = 200}) async {
     result = await session.getResolvedUnit(testFile) as ResolvedUnitResult;
-    return await CompletionPerformance().runRequestOperation(
-      (performance) async {
-        // Build the request
-        var request = DartCompletionRequest(
-          resolvedUnit: result,
-          offset: completionOffset,
-          dartdocDirectiveInfo: dartdocInfo,
-        );
 
-        var range = request.target.computeReplacementRange(request.offset);
-        replacementOffset = range.offset;
-        replacementLength = range.length;
-
-        // Request completions
-        suggestions = await computeContributedSuggestions(request);
-        expect(suggestions, isNotNull, reason: 'expected suggestions');
-      },
+    // Build the request
+    var request = DartCompletionRequest.forResolvedUnit(
+      resolvedUnit: result,
+      offset: completionOffset,
+      dartdocDirectiveInfo: dartdocInfo,
     );
+
+    var range = request.target.computeReplacementRange(request.offset);
+    replacementOffset = range.offset;
+    replacementLength = range.length;
+
+    // Request completions
+    suggestions = await computeContributedSuggestions(request);
+    expect(suggestions, isNotNull, reason: 'expected suggestions');
   }
 
   Never failedCompletion(String message,
@@ -613,7 +609,7 @@
   @override
   void setUp() {
     super.setUp();
-    testFile = convertPath('/home/test/lib/test.dart');
+    testFile = convertPath('$testPackageLibPath/test.dart');
   }
 
   CompletionSuggestion suggestionWith(
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 972198c..be920e7 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
@@ -52,12 +52,12 @@
     // Build the request
     var resolvedUnit =
         await session.getResolvedUnit(testFile) as ResolvedUnitResult;
-    request = DartCompletionRequest(
+    request = DartCompletionRequest.forResolvedUnit(
       resolvedUnit: resolvedUnit,
       offset: completionOffset,
     );
 
-    var directives = request.target.unit.directives;
+    var directives = resolvedUnit.unit.directives;
 
     var imports = request.libraryElement.imports;
     expect(imports, hasLength(directives.length + 1));
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 6f277c3..534635b 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
@@ -36,7 +36,7 @@
 class ImportedReferenceContributorTest extends DartCompletionContributorTest
     with ImportedReferenceContributorMixin {
   Future<void> test_Annotation_typeArguments() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class C {}
 typedef T1 = void Function();
 typedef T2 = List<int>;
@@ -67,7 +67,7 @@
   Future<void> test_ArgDefaults_function_with_required_named() async {
     writeTestPackageConfig(meta: true);
 
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
 lib B;
 import 'package:meta/meta.dart';
 
@@ -85,7 +85,7 @@
 
   Future<void> test_ArgumentList() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
@@ -110,7 +110,7 @@
 
   Future<void> test_ArgumentList_imported_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         expect(arg) { }
@@ -137,7 +137,7 @@
   Future<void>
       test_ArgumentList_InstanceCreationExpression_functionalArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
@@ -167,7 +167,7 @@
 
   Future<void> test_ArgumentList_InstanceCreationExpression_typedefArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         typedef Funct();
         class A { A(Funct f) { } }
@@ -198,7 +198,7 @@
 
   Future<void> test_ArgumentList_local_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
@@ -224,7 +224,7 @@
 
   Future<void> test_ArgumentList_local_method() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
@@ -250,7 +250,7 @@
 
   Future<void> test_ArgumentList_MethodInvocation_functionalArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
@@ -280,7 +280,7 @@
 
   Future<void> test_ArgumentList_MethodInvocation_methodArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
@@ -309,7 +309,7 @@
   Future<void> test_ArgumentList_namedParam() async {
     // SimpleIdentifier  NamedExpression  ArgumentList  MethodInvocation
     // ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }''');
     addTestSource('''
@@ -331,7 +331,7 @@
   }
 
   Future<void> test_AsExpression() async {
-    // SimpleIdentifier  TypeName  AsExpression
+    // SimpleIdentifier  NamedType  AsExpression
     addTestSource('''
         class A {var b; X _c; foo() {var a; (a as ^).foo();}''');
 
@@ -351,8 +351,8 @@
     // suggesting types. We ought to do so because there's no reason to cast a
     // value to the type it already has.
 
-    // SimpleIdentifier  TypeName  AsExpression  IfStatement
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  AsExpression  IfStatement
+    addSource('$testPackageLibPath/b.dart', '''
           foo() { }
           class A {} class B extends A {} class C extends B {}
           class X {X.c(); X._d(); z() {}}''');
@@ -378,8 +378,8 @@
     // suggesting types. We ought to do so because there's no reason to cast a
     // value to the type it already has.
 
-    // SimpleIdentifier  TypeName  AsExpression  IfStatement
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  AsExpression  IfStatement
+    addSource('$testPackageLibPath/b.dart', '''
           foo() { }
           class A {} class B implements A {} class C implements B {}
           class X {X.c(); X._d(); z() {}}''');
@@ -423,7 +423,7 @@
   }
 
   Future<void> test_AssignmentExpression_type() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
         class A {} void f() {
@@ -446,7 +446,7 @@
   }
 
   Future<void> test_AssignmentExpression_type_newline() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
         class A {} void f() {
@@ -468,7 +468,7 @@
   }
 
   Future<void> test_AssignmentExpression_type_partial() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
         class A {} void f() {
@@ -491,7 +491,7 @@
   }
 
   Future<void> test_AssignmentExpression_type_partial_newline() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
         class A {} void f() {
@@ -528,7 +528,7 @@
   }
 
   Future<void> test_AwaitExpression_function() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 Future y() async {return 0;}
 ''');
     addTestSource('''
@@ -548,7 +548,7 @@
 
   Future<void> test_AwaitExpression_inherited() async {
     // SimpleIdentifier  AwaitExpression  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib libB;
 class A {
   Future y() async { return 0; }
@@ -602,21 +602,21 @@
 
   Future<void> test_Block() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
         class EE { }
         class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
         class H { }
         int T3;
         var _T4;'''); // not imported
@@ -657,7 +657,7 @@
     assertNotSuggested('x');
     assertNotSuggested('partT8');
 
-    assertSuggestClass('A', elemFile: '/home/test/lib/ab.dart');
+    assertSuggestClass('A', elemFile: '$testPackageLibPath/ab.dart');
     if (suggestConstructorsWithoutNew) {
       assertSuggestConstructor('A');
     }
@@ -705,21 +705,21 @@
 
   Future<void> test_Block_final() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
         class EE { }
         class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
         class H { }
         int T3;
         var _T4;'''); // not imported
@@ -818,21 +818,21 @@
 
   Future<void> test_Block_final_final() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
         class EE { }
         class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
         class H { }
         int T3;
         var _T4;'''); // not imported
@@ -919,21 +919,21 @@
 
   Future<void> test_Block_final_var() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
         class EE { }
         class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
         class H { }
         int T3;
         var _T4;'''); // not imported
@@ -1017,21 +1017,21 @@
   }
 
   Future<void> test_Block_identifier_partial() async {
-    resolveSource('/home/test/lib/ab.dart', '''
+    resolveSource('$testPackageLibPath/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B { }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
         class EE { }
         class DF { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
         class H { }
         class D3 { }
         int T3;
@@ -1094,7 +1094,7 @@
 
   Future<void> test_Block_inherited_imported() async {
     // Block  BlockFunctionBody  MethodDeclaration  ClassDeclaration
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; }
         class E extends F { var e1; e2() { } }
@@ -1148,21 +1148,21 @@
   }
 
   Future<void> test_Block_local_function() async {
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
         class EE { }
         class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
         class H { }
         int T3;
         var _T4;'''); // not imported
@@ -1200,21 +1200,21 @@
 
   Future<void> test_Block_partial_results() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B { }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
         class EE { }
         class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
         class H { }
         int T3;
         var _T4;'''); // not imported
@@ -1252,7 +1252,7 @@
 
   Future<void> test_CascadeExpression_selector1() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import 'b.dart';
@@ -1277,7 +1277,7 @@
 
   Future<void> test_CascadeExpression_selector2() async {
     // SimpleIdentifier  PropertyAccess  CascadeExpression  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import 'b.dart';
@@ -1300,7 +1300,7 @@
 
   Future<void> test_CascadeExpression_selector2_withTrailingReturn() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import 'b.dart';
@@ -1342,7 +1342,7 @@
   }
 
   Future<void> test_CatchClause_onType() async {
-    // TypeName  CatchClause  TryStatement
+    // NamedType  CatchClause  TryStatement
     addTestSource('class A {a() {try{var x;} on ^ {}}}');
 
     await computeSuggestions();
@@ -1355,7 +1355,7 @@
   }
 
   Future<void> test_CatchClause_onType_noBrackets() async {
-    // TypeName  CatchClause  TryStatement
+    // NamedType  CatchClause  TryStatement
     addTestSource('class A {a() {try{var x;} on ^}}');
 
     await computeSuggestions();
@@ -1395,7 +1395,7 @@
 
   Future<void> test_ClassDeclaration_body() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1420,7 +1420,7 @@
 
   Future<void> test_ClassDeclaration_body_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1441,7 +1441,7 @@
 
   Future<void> test_ClassDeclaration_body_final_field() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1462,7 +1462,7 @@
 
   Future<void> test_ClassDeclaration_body_final_field2() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as Soo;
@@ -1483,7 +1483,7 @@
 
   Future<void> test_ClassDeclaration_body_final_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1504,7 +1504,7 @@
 
   Future<void> test_ClassDeclaration_body_final_var() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1525,7 +1525,7 @@
 
   Future<void> test_Combinator_hide() async {
     // SimpleIdentifier  HideCombinator  ImportDirective
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
         library libAB;
         part 'partAB.dart';
         class A { }
@@ -1535,7 +1535,7 @@
         var T1;
         PB F1() => new PB();
         class PB { }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
         class C { }
         class D { }''');
     addTestSource('''
@@ -1549,7 +1549,7 @@
 
   Future<void> test_Combinator_show() async {
     // SimpleIdentifier  HideCombinator  ImportDirective
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
         library libAB;
         part 'partAB.dart';
         class A { }
@@ -1561,7 +1561,7 @@
         typedef PB2 F2(int blat);
         class Clz = Object with Object;
         class PB { }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
         class C { }
         class D { }''');
     addTestSource('''
@@ -1575,7 +1575,7 @@
 
   Future<void> test_ConditionalExpression_elseExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1595,7 +1595,7 @@
 
   Future<void> test_ConditionalExpression_elseExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1624,7 +1624,7 @@
 
   Future<void> test_ConditionalExpression_partial_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1644,7 +1644,7 @@
 
   Future<void> test_ConditionalExpression_partial_thenExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1673,7 +1673,7 @@
 
   Future<void> test_ConditionalExpression_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1692,9 +1692,9 @@
   }
 
   Future<void> test_ConstructorName_importedClass() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
@@ -1717,9 +1717,9 @@
   }
 
   Future<void> test_ConstructorName_importedFactory() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
@@ -1742,7 +1742,7 @@
   }
 
   Future<void> test_ConstructorName_importedFactory2() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         void f() {new String.fr^omCharCodes([]);}''');
@@ -1760,7 +1760,7 @@
   }
 
   Future<void> test_ConstructorName_localClass() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         int T1;
@@ -1781,7 +1781,7 @@
   }
 
   Future<void> test_ConstructorName_localFactory() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         int T1;
@@ -1820,7 +1820,7 @@
   }
 
   Future<void> test_doc_class() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 library A;
 /// My class.
 /// Short description.
@@ -1842,7 +1842,7 @@
   }
 
   Future<void> test_doc_function() async {
-    resolveSource('/home/test/lib/a.dart', r'''
+    resolveSource('$testPackageLibPath/a.dart', r'''
 library A;
 /// My function.
 /// Short description.
@@ -1861,7 +1861,7 @@
   }
 
   Future<void> test_doc_function_c_style() async {
-    resolveSource('/home/test/lib/a.dart', r'''
+    resolveSource('$testPackageLibPath/a.dart', r'''
 library A;
 /**
  * My function.
@@ -1882,7 +1882,7 @@
   }
 
   Future<void> test_enum() async {
-    addSource('/home/test/lib/a.dart', 'library A; enum E { one, two }');
+    addSource('$testPackageLibPath/a.dart', 'library A; enum E { one, two }');
     addTestSource('import "a.dart"; void f() {^}');
     await computeSuggestions();
     assertSuggestEnum('E');
@@ -1891,8 +1891,8 @@
   }
 
   Future<void> test_enum_deprecated() async {
-    addSource(
-        '/home/test/lib/a.dart', 'library A; @deprecated enum E { one, two }');
+    addSource('$testPackageLibPath/a.dart',
+        'library A; @deprecated enum E { one, two }');
     addTestSource('import "a.dart"; void f() {^}');
     await computeSuggestions();
     // TODO(danrube) investigate why suggestion/element is not deprecated
@@ -1903,7 +1903,7 @@
   }
 
   Future<void> test_enum_filter() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 enum E { one, two }
 enum F { three, four }
 ''');
@@ -1929,7 +1929,7 @@
 
   Future<void> test_ExpressionStatement_identifier() async {
     // SimpleIdentifier  ExpressionStatement  Block
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         _B F1() { }
         class A {int x;}
         class _B { }''');
@@ -1959,7 +1959,7 @@
 
   Future<void> test_ExpressionStatement_name() async {
     // ExpressionStatement  Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         B T1;
         class B{}''');
     addTestSource('''
@@ -1971,7 +1971,7 @@
   }
 
   Future<void> test_ExtendsClause() async {
-    newFile('/home/test/lib/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
     addTestSource('''
 import 'a.dart';
 
@@ -1982,7 +1982,7 @@
   }
 
   Future<void> test_ExtensionDeclaration_extendedType() async {
-    newFile('/home/test/lib/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
     addTestSource('''
 import 'a.dart';
 
@@ -1994,7 +1994,7 @@
   }
 
   Future<void> test_ExtensionDeclaration_extendedType2() async {
-    newFile('/home/test/lib/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
     addTestSource('''
 import 'a.dart';
 
@@ -2006,7 +2006,7 @@
   }
 
   Future<void> test_ExtensionDeclaration_member() async {
-    newFile('/home/test/lib/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
     addTestSource('''
 import 'a.dart';
 
@@ -2019,7 +2019,7 @@
   Future<void> test_FieldDeclaration_name_typed() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         class C {A ^}''');
@@ -2031,7 +2031,7 @@
   Future<void> test_FieldDeclaration_name_var() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         class C {var ^}''');
@@ -2043,7 +2043,7 @@
   Future<void> test_FieldDeclaration_type() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         class C {^ foo;) ''');
@@ -2056,7 +2056,7 @@
   Future<void> test_FieldDeclaration_type_after_comment1() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         class C {
@@ -2072,7 +2072,7 @@
   Future<void> test_FieldDeclaration_type_after_comment2() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         class C {
@@ -2088,7 +2088,7 @@
   Future<void> test_FieldDeclaration_type_after_comment3() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         class C {
@@ -2104,7 +2104,7 @@
   Future<void> test_FieldDeclaration_type_without_semicolon() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         class C {^ foo} ''');
@@ -2287,7 +2287,7 @@
   }
 
   Future<void> test_function_parameters_mixed_required_and_named() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 int m(x, {int y}) {}
 ''');
     addTestSource('''
@@ -2310,7 +2310,7 @@
   }
 
   Future<void> test_function_parameters_mixed_required_and_positional() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m(x, [int y]) {}
 ''');
     addTestSource('''
@@ -2333,7 +2333,7 @@
   }
 
   Future<void> test_function_parameters_named() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m({x, int y}) {}
 ''');
     addTestSource('''
@@ -2357,7 +2357,7 @@
 
   Future<void> test_function_parameters_nnbd_required() async {
     createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m(int? nullable, int nonNullable) {}
 ''');
     addTestSource('''
@@ -2380,7 +2380,7 @@
 
   Future<void> test_function_parameters_nnbd_required_into_legacy() async {
     createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m(int? nullable, int nonNullable) {}
 ''');
     addTestSource('''
@@ -2404,7 +2404,7 @@
 
   Future<void> test_function_parameters_nnbd_required_legacy() async {
     createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 // @dart = 2.8
 void m(int param) {}
 ''');
@@ -2425,7 +2425,7 @@
   }
 
   Future<void> test_function_parameters_none() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m() {}
 ''');
     addTestSource('''
@@ -2444,7 +2444,7 @@
   }
 
   Future<void> test_function_parameters_positional() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m([x, int y]) {}
 ''');
     addTestSource('''
@@ -2467,7 +2467,7 @@
   }
 
   Future<void> test_function_parameters_required() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m(x, int y) {}
 ''');
     addTestSource('''
@@ -2491,7 +2491,7 @@
 
   Future<void> test_FunctionDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2522,7 +2522,7 @@
 
   Future<void> test_FunctionDeclaration_returnType_afterComment2() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2553,7 +2553,7 @@
 
   Future<void> test_FunctionDeclaration_returnType_afterComment3() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2600,7 +2600,7 @@
   }
 
   Future<void> test_functionTypeAlias_genericTypeAlias() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 typedef F = void Function();
 ''');
     addTestSource(r'''
@@ -2616,7 +2616,7 @@
   }
 
   Future<void> test_functionTypeAlias_old() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 typedef void F();
 ''');
     addTestSource(r'''
@@ -2697,7 +2697,7 @@
   }
 
   Future<void> test_implementsClause() async {
-    newFile('/home/test/lib/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
     addTestSource('''
 import 'a.dart';
 
@@ -2708,7 +2708,7 @@
   }
 
   Future<void> test_implicitCreation() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   A.a1();
   A.a2();
@@ -2748,7 +2748,7 @@
 
   Future<void> test_IndexExpression() async {
     // ExpressionStatement  Block
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -2777,7 +2777,7 @@
 
   Future<void> test_IndexExpression2() async {
     // SimpleIdentifier IndexExpression ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -2796,7 +2796,7 @@
   }
 
   Future<void> test_InstanceCreationExpression() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/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}) { } }''');
@@ -2850,7 +2850,7 @@
   }
 
   Future<void> test_InstanceCreationExpression_abstractClass() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 abstract class A {
   A();
   A.generative();
@@ -2873,7 +2873,7 @@
 
   Future<void>
       test_InstanceCreationExpression_abstractClass_implicitConstructor() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 abstract class A {}
 ''');
     addTestSource('''
@@ -2889,7 +2889,7 @@
   }
 
   Future<void> test_InstanceCreationExpression_filter() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {}
 class B extends A {}
 class C implements A {}
@@ -2911,8 +2911,8 @@
   }
 
   Future<void> test_InstanceCreationExpression_imported() async {
-    // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
-    addSource('/home/test/lib/a.dart', '''
+    // SimpleIdentifier  NamedType  ConstructorName  InstanceCreationExpression
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {A(this.x) { } int x;}''');
@@ -2954,8 +2954,8 @@
   }
 
   Future<void> test_InstanceCreationExpression_unimported() async {
-    // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
-    addSource('/home/test/lib/ab.dart', 'class Clip { }');
+    // SimpleIdentifier  NamedType  ConstructorName  InstanceCreationExpression
+    addSource('$testPackageLibPath/ab.dart', 'class Clip { }');
     addTestSource('class A {foo(){new C^}}');
 
     await computeSuggestions();
@@ -2979,7 +2979,7 @@
 
   Future<void> test_InterpolationExpression() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3013,7 +3013,7 @@
 
   Future<void> test_InterpolationExpression_block() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3087,8 +3087,8 @@
   }
 
   Future<void> test_IsExpression() async {
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         foo() { }
         class X {X.c(); X._d(); z() {}}''');
@@ -3127,7 +3127,7 @@
   }
 
   Future<void> test_IsExpression_type() async {
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
     addTestSource('''
         class A {int x; int y() => 0;}
         void f(){var a; if (a is ^)}''');
@@ -3142,7 +3142,7 @@
   }
 
   Future<void> test_IsExpression_type_partial() async {
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
     addTestSource('''
         class A {int x; int y() => 0;}
         void f(){var a; if (a is Obj^)}''');
@@ -3162,8 +3162,8 @@
     // suggesting types. We ought to do so because there's no reason to cast a
     // value to the type it already has.
 
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
+    addSource('$testPackageLibPath/b.dart', '''
         foo() { }
         class A {} class B extends A {} class C extends B {}
         class X {X.c(); X._d(); z() {}}''');
@@ -3189,8 +3189,8 @@
     // suggesting types. We ought to do so because there's no reason to cast a
     // value to the type it already has.
 
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
+    addSource('$testPackageLibPath/b.dart', '''
         foo() { }
         class A {} class B implements A {} class C implements B {}
         class X {X.c(); X._d(); z() {}}''');
@@ -3211,7 +3211,7 @@
   }
 
   Future<void> test_keyword() async {
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
         lib B;
         int newT1;
         int T1;
@@ -3272,7 +3272,7 @@
 
   Future<void> test_MapLiteralEntry() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3310,7 +3310,7 @@
 
   Future<void> test_MapLiteralEntry1() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3337,7 +3337,7 @@
 
   Future<void> test_MapLiteralEntry2() async {
     // SimpleIdentifier  MapLiteralEntry  MapLiteral  VariableDeclaration
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3358,7 +3358,7 @@
   }
 
   Future<void> test_method_parameters_mixed_required_and_named() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m(x, {int y}) {}
 ''');
     addTestSource('''
@@ -3381,7 +3381,7 @@
   }
 
   Future<void> test_method_parameters_mixed_required_and_positional() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m(x, [int y]) {}
 ''');
     addTestSource('''
@@ -3404,7 +3404,7 @@
   }
 
   Future<void> test_method_parameters_named() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m({x, int y}) {}
 ''');
     addTestSource('''
@@ -3427,7 +3427,7 @@
   }
 
   Future<void> test_method_parameters_none() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m() {}
 ''');
     addTestSource('''
@@ -3446,7 +3446,7 @@
   }
 
   Future<void> test_method_parameters_positional() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m([x, int y]) {}
 ''');
     addTestSource('''
@@ -3469,7 +3469,7 @@
   }
 
   Future<void> test_method_parameters_required() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m(x, int y) {}
 ''');
     addTestSource('''
@@ -3505,7 +3505,7 @@
 
   Future<void> test_MethodDeclaration_body_static() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/c.dart', '''
+    addSource('$testPackageLibPath/c.dart', '''
         class C {
           c1() {}
           var c2;
@@ -3591,7 +3591,7 @@
 
   Future<void> test_MethodDeclaration_returnType() async {
     // ClassDeclaration  CompilationUnit
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3621,7 +3621,7 @@
 
   Future<void> test_MethodDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3651,7 +3651,7 @@
 
   Future<void> test_MethodDeclaration_returnType_afterComment2() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3681,7 +3681,7 @@
 
   Future<void> test_MethodDeclaration_returnType_afterComment3() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3745,7 +3745,7 @@
   }
 
   Future<void> test_MethodTypeArgumentList() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {}
 class B {}
 ''');
@@ -3786,7 +3786,7 @@
   }
 
   Future<void> test_mixin_ordering() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class B {}
 class M1 {
   void m() {}
@@ -3820,7 +3820,7 @@
   }
 
   Future<void> test_no_parameters_field() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int x;
 ''');
     addTestSource('''
@@ -3835,7 +3835,7 @@
   }
 
   Future<void> test_no_parameters_getter() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 int get x => null;
 ''');
     addTestSource('''
@@ -3850,7 +3850,7 @@
   }
 
   Future<void> test_no_parameters_setter() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 set x(int value) {};
 ''');
     addTestSource('''
@@ -3872,7 +3872,7 @@
   }
 
   Future<void> test_partFile_TypeName() async {
-    // SimpleIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  NamedType  ConstructorName
     addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
@@ -3909,13 +3909,13 @@
   }
 
   Future<void> test_partFile_TypeName2() async {
-    // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  ConstructorName
+    addSource('$testPackageLibPath/b.dart', '''
         lib libB;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         part of libA;
         class B { }''');
     addTestSource('''
@@ -3945,7 +3945,7 @@
 
   Future<void> test_PrefixedIdentifier_class_const() async {
     // SimpleIdentifier PrefixedIdentifier ExpressionStatement Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         class I {
           static const scI = 'boo';
@@ -3992,7 +3992,7 @@
 
   Future<void> test_PrefixedIdentifier_class_imported() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         class I {X get f => new A();get _g => new A();}
         class A implements I {
@@ -4071,7 +4071,7 @@
 
   Future<void> test_PrefixedIdentifier_library() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         var T1;
         class X { }
@@ -4097,8 +4097,8 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_typesOnly() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  PrefixedIdentifier  NamedType
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         var T1;
         class X { }
@@ -4124,8 +4124,8 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_typesOnly2() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  PrefixedIdentifier  NamedType
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         var T1;
         class X { }
@@ -4152,7 +4152,7 @@
 
   Future<void> test_PrefixedIdentifier_parameter() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         class _W {M y; var _z;}
         class X extends _W {}
@@ -4171,7 +4171,7 @@
 
   Future<void> test_PrefixedIdentifier_prefix() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         class A {static int bar = 10;}
         _B() {}''');
     addTestSource('''
@@ -4317,7 +4317,7 @@
 
   Future<void> test_PropertyAccess_noTarget() async {
     // SimpleIdentifier  PropertyAccess  ExpressionStatement
-    addSource('/home/test/lib/ab.dart', 'class Foo { }');
+    addSource('$testPackageLibPath/ab.dart', 'class Foo { }');
     addTestSource('class C {foo(){.^}}');
 
     await computeSuggestions();
@@ -4326,7 +4326,7 @@
 
   Future<void> test_PropertyAccess_noTarget2() async {
     // SimpleIdentifier  PropertyAccess  ExpressionStatement
-    addSource('/home/test/lib/ab.dart', 'class Foo { }');
+    addSource('$testPackageLibPath/ab.dart', 'class Foo { }');
     addTestSource('void f() {.^}');
 
     await computeSuggestions();
@@ -4598,7 +4598,7 @@
   Future<void> test_TopLevelVariableDeclaration_type() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // TopLevelVariableDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         ^ foo; ''');
@@ -4611,7 +4611,7 @@
   Future<void> test_TopLevelVariableDeclaration_type_after_comment1() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // TopLevelVariableDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         // comment
@@ -4625,7 +4625,7 @@
   Future<void> test_TopLevelVariableDeclaration_type_after_comment2() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // TopLevelVariableDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         /* comment */
@@ -4639,7 +4639,7 @@
   Future<void> test_TopLevelVariableDeclaration_type_after_comment3() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // TopLevelVariableDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         /// some dartdoc
@@ -4653,7 +4653,7 @@
   Future<void> test_TopLevelVariableDeclaration_type_without_semicolon() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // TopLevelVariableDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         ^ foo ''');
@@ -4730,7 +4730,7 @@
 
   Future<void> test_TypeArgumentList() async {
     // SimpleIdentifier  BinaryExpression  ExpressionStatement
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         class C1 {int x;}
         F1() => 0;
         typedef String T1(int blat);''');
@@ -4756,8 +4756,8 @@
   }
 
   Future<void> test_TypeArgumentList2() async {
-    // TypeName  TypeArgumentList  TypeName
-    addSource('/home/test/lib/a.dart', '''
+    // NamedType  TypeArgumentList  NamedType
+    addSource('$testPackageLibPath/a.dart', '''
         class C1 {int x;}
         F1() => 0;
         typedef String T1(int blat);''');
@@ -4795,10 +4795,10 @@
   }
 
   Future<void> test_TypeArgumentList_recursive() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {}
 ''');
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
 export 'a.dart';
 export 'b.dart';
 class B {}
@@ -4817,7 +4817,7 @@
   Future<void> test_VariableDeclaration_name() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         foo() { }
         class _B { }
@@ -4844,7 +4844,7 @@
   Future<void> test_VariableDeclarationStatement_RHS() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         foo() { }
         class _B { }
@@ -4869,7 +4869,7 @@
   Future<void> test_VariableDeclarationStatement_RHS_missing_semicolon() async {
     // VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
         lib B;
         foo1() { }
         void bar1() { }
@@ -4898,7 +4898,7 @@
   }
 
   Future<void> test_withClause_mixin() async {
-    newFile('/home/test/lib/a.dart', content: 'mixin M {}');
+    newFile('$testPackageLibPath/a.dart', content: 'mixin M {}');
     addTestSource('''
 import 'a.dart';
 
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 5c1db88..d9dc05e 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
@@ -29,7 +29,7 @@
 
   Future<void> test_extension() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 extension MyExt on int {}
 ''');
     addTestSource('''
@@ -134,7 +134,7 @@
 
   Future<void> test_PrefixedIdentifier_library() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         var T1;
         class X { }
@@ -158,11 +158,11 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_export_withShow() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {}
 class B {}
 ''');
-    addSource('/home/test/lib/b.dart', r'''
+    addSource('$testPackageLibPath/b.dart', r'''
 export 'a.dart' show A;
 ''');
     addTestSource(r'''
@@ -177,7 +177,7 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_import_withShow() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {}
 class B {}
 ''');
@@ -224,7 +224,7 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_typesOnly() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType
     newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         var T1;
@@ -257,7 +257,7 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_typesOnly2() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType
     newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         var T1;
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 aa2e6a2..34904db 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
@@ -45,21 +45,21 @@
 
   Future<void> test_Block() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
 class H { }
 int T3;
 var _T4;'''); // not imported
@@ -186,7 +186,7 @@
 
   Future<void> test_ClassDeclaration_body() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -201,7 +201,7 @@
 
   Future<void> test_ClassDeclaration_body_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -216,7 +216,7 @@
 
   Future<void> test_ClassDeclaration_body_final_field() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -231,7 +231,7 @@
 
   Future<void> test_ClassDeclaration_body_final_field2() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as Soo;
@@ -246,7 +246,7 @@
 
   Future<void> test_ClassDeclaration_body_final_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -261,7 +261,7 @@
 
   Future<void> test_ClassDeclaration_body_final_var() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -275,7 +275,7 @@
   }
 
   Future<void> test_InstanceCreationExpression() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/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}) { } }''');
@@ -294,11 +294,11 @@
   }
 
   Future<void> test_InstanceCreationExpression_inPart() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/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('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 library testB;
 import "a.dart" as t;
 import "dart:math" as math;
@@ -313,11 +313,11 @@
   }
 
   Future<void> test_InstanceCreationExpression_inPart_detached() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/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('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 library testB;
 import "a.dart" as t;
 import "dart:math" as math;
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 3a6fa56..52c6b90 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
@@ -28,7 +28,7 @@
   }
 
   Future<void> test_partFile_Constructor() async {
-    // SimpleIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  NamedType  ConstructorName
     newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         int T1;
@@ -63,7 +63,7 @@
   }
 
   Future<void> test_partFile_Constructor2() async {
-    // SimpleIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  NamedType  ConstructorName
     newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         int T1;
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 6e7253d..804bc3a 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
@@ -81,7 +81,7 @@
 
   Future<void> test_ArgDefaults_inherited_method_with_required_named() async {
     writeTestPackageConfig(meta: true);
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
 import 'package:meta/meta.dart';
 
 lib libB;
@@ -120,7 +120,7 @@
 
   Future<void> test_ArgumentList() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 bool hasLength(int expected) { }
 void baz() { }''');
@@ -145,7 +145,7 @@
 
   Future<void> test_ArgumentList_imported_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 bool hasLength(int expected) { }
 expect(arg) { }
@@ -172,7 +172,7 @@
   Future<void>
       test_ArgumentList_InstanceCreationExpression_functionalArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 class A { A(f()) { } }
 bool hasLength(int expected) { }
@@ -201,7 +201,7 @@
 
   Future<void> test_ArgumentList_InstanceCreationExpression_typedefArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 typedef Funct();
 class A { A(Funct f) { } }
@@ -231,7 +231,7 @@
 
   Future<void> test_ArgumentList_local_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 bool hasLength(int expected) { }
 void baz() { }''');
@@ -257,7 +257,7 @@
 
   Future<void> test_ArgumentList_local_method() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 bool hasLength(int expected) { }
 void baz() { }''');
@@ -283,7 +283,7 @@
 
   Future<void> test_ArgumentList_MethodInvocation_functionalArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 class A { A(f()) { } }
 bool hasLength(int expected) { }
@@ -314,7 +314,7 @@
 
   Future<void> test_ArgumentList_MethodInvocation_functionalArg2() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 class A { A(f()) { } }
 bool hasLength(int expected) { }
@@ -350,7 +350,7 @@
 
   Future<void> test_ArgumentList_MethodInvocation_methodArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 class A { A(f()) { } }
 bool hasLength(int expected) { }
@@ -375,7 +375,7 @@
   }
 
   Future<void> test_ArgumentList_namedFieldParam_tear_off() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 typedef void VoidCallback();
 
 class Button {
@@ -406,7 +406,7 @@
   Future<void> test_ArgumentList_namedParam() async {
     // SimpleIdentifier  NamedExpression  ArgumentList  MethodInvocation
     // ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 bool hasLength(int expected) { }''');
     addTestSource('''
@@ -452,7 +452,7 @@
   }
 
   Future<void> test_ArgumentList_namedParam_tear_off() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 typedef void VoidCallback();
 
 class Button {
@@ -480,7 +480,7 @@
   }
 
   Future<void> test_ArgumentList_namedParam_tear_off_1() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 typedef void VoidCallback();
 
 class Button {
@@ -508,7 +508,7 @@
   }
 
   Future<void> test_ArgumentList_namedParam_tear_off_2() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 typedef void VoidCallback();
 
 class Button {
@@ -536,7 +536,7 @@
   }
 
   Future<void> test_AsExpression_type() async {
-    // SimpleIdentifier  TypeName  AsExpression
+    // SimpleIdentifier  NamedType  AsExpression
     addTestSource('''
         class A {var b; X _c; foo() {var a; (a as ^).foo();}''');
     await computeSuggestions();
@@ -556,7 +556,7 @@
     // suggesting types. We ought to do so because there's no reason to cast a
     // value to the type it already has.
 
-    // SimpleIdentifier  TypeName  AsExpression
+    // SimpleIdentifier  NamedType  AsExpression
     addTestSource('''
 class A {} class B extends A {} class C extends A {} class D {}
 f(A a){ (a as ^) }''');
@@ -577,7 +577,7 @@
     // suggesting types. We ought to do so because there's no reason to cast a
     // value to the type it already has.
 
-    // SimpleIdentifier  TypeName  AsExpression
+    // SimpleIdentifier  NamedType  AsExpression
     addTestSource('''
 class A {} class B implements A {} class C implements A {} class D {}
 f(A a){ (a as ^) }''');
@@ -593,7 +593,7 @@
   }
 
   Future<void> test_AsExpression_type_filter_undefined_type() async {
-    // SimpleIdentifier  TypeName  AsExpression
+    // SimpleIdentifier  NamedType  AsExpression
     addTestSource('''
 class A {}
 f(U u){ (u as ^) }''');
@@ -628,7 +628,7 @@
   }
 
   Future<void> test_AssignmentExpression_type() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
 class A {} void f() {
@@ -652,7 +652,7 @@
   }
 
   Future<void> test_AssignmentExpression_type_newline() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
 class A {} void f() {
@@ -675,7 +675,7 @@
   }
 
   Future<void> test_AssignmentExpression_type_partial() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
 class A {} void f() {
@@ -699,7 +699,7 @@
   }
 
   Future<void> test_AssignmentExpression_type_partial_newline() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
 class A {} void f() {
@@ -755,7 +755,7 @@
 
   Future<void> test_AwaitExpression_inherited() async {
     // SimpleIdentifier  AwaitExpression  ExpressionStatement
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
 lib libB;
 class A {
   Future y() async {return 0;}
@@ -812,21 +812,21 @@
 
   Future<void> test_Block() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
 class H { }
 int T3;
 var _T4;'''); // not imported
@@ -905,21 +905,21 @@
 
   Future<void> test_Block_final() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
 class H { }
 int T3;
 var _T4;'''); // not imported
@@ -1018,21 +1018,21 @@
 
   Future<void> test_Block_final_final() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
 class H { }
 int T3;
 var _T4;'''); // not imported
@@ -1117,21 +1117,21 @@
 
   Future<void> test_Block_final_var() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
 class H { }
 int T3;
 var _T4;'''); // not imported
@@ -1215,21 +1215,21 @@
   }
 
   Future<void> test_Block_identifier_partial() async {
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B { }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
 class H { }
 class D3 { }
 int T3;
@@ -1294,7 +1294,7 @@
 
   Future<void> test_Block_inherited_imported() async {
     // Block  BlockFunctionBody  MethodDeclaration  ClassDeclaration
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
 lib B;
 class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; }
 class E extends F { var e1; e2() { } }
@@ -1322,7 +1322,7 @@
 
   Future<void> test_Block_inherited_imported_from_constructor() async {
     // Block  BlockFunctionBody  ConstructorDeclaration  ClassDeclaration
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
       lib B;
       class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; }
       class E extends F { var e1; e2() { } }
@@ -1349,7 +1349,7 @@
 
   Future<void> test_Block_inherited_imported_from_method() async {
     // Block  BlockFunctionBody  MethodDeclaration  ClassDeclaration
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
       lib B;
       class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; }
       class E extends F { var e1; e2() { } }
@@ -1448,21 +1448,21 @@
   }
 
   Future<void> test_Block_local_function() async {
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
 class H { }
 int T3;
 var _T4;'''); // not imported
@@ -1526,7 +1526,7 @@
 
   Future<void> test_CascadeExpression_selector1() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart";
@@ -1551,7 +1551,7 @@
 
   Future<void> test_CascadeExpression_selector2() async {
     // SimpleIdentifier  PropertyAccess  CascadeExpression  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart";
@@ -1574,7 +1574,7 @@
 
   Future<void> test_CascadeExpression_selector2_withTrailingReturn() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart";
@@ -1616,7 +1616,7 @@
   }
 
   Future<void> test_CatchClause_onType() async {
-    // TypeName  CatchClause  TryStatement
+    // NamedType  CatchClause  TryStatement
     addTestSource('class A {a() {try{var x;} on ^ {}}}');
     await computeSuggestions();
 
@@ -1629,7 +1629,7 @@
   }
 
   Future<void> test_CatchClause_onType_noBrackets() async {
-    // TypeName  CatchClause  TryStatement
+    // NamedType  CatchClause  TryStatement
     addTestSource('class A {a() {try{var x;} on ^}}');
     await computeSuggestions();
 
@@ -1680,7 +1680,7 @@
 
   Future<void> test_ClassDeclaration_body() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -1709,7 +1709,7 @@
 
   Future<void> test_ClassDeclaration_body_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -1730,7 +1730,7 @@
 
   Future<void> test_ClassDeclaration_body_final_field() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -1751,7 +1751,7 @@
 
   Future<void> test_ClassDeclaration_body_final_field2() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as Soo;
@@ -1772,7 +1772,7 @@
 
   Future<void> test_ClassDeclaration_body_final_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -1793,7 +1793,7 @@
 
   Future<void> test_ClassDeclaration_body_final_var() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -1839,7 +1839,7 @@
 
   Future<void> test_Combinator_hide() async {
     // SimpleIdentifier  HideCombinator  ImportDirective
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
 library libAB;
 part 'partAB.dart';
 class A { }
@@ -1849,7 +1849,7 @@
 var T1;
 PB F1() => new PB();
 class PB { }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
 class C { }
 class D { }''');
     addTestSource('''
@@ -1863,7 +1863,7 @@
 
   Future<void> test_Combinator_show() async {
     // SimpleIdentifier  HideCombinator  ImportDirective
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
 library libAB;
 part 'partAB.dart';
 class A { }
@@ -1875,7 +1875,7 @@
 typedef PB2 F2(int blat);
 class Clz = Object with Object;
 class PB { }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
 class C { }
 class D { }''');
     addTestSource('''
@@ -1889,7 +1889,7 @@
 
   Future<void> test_ConditionalExpression_elseExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
@@ -1909,7 +1909,7 @@
 
   Future<void> test_ConditionalExpression_elseExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
@@ -1935,7 +1935,7 @@
 
   Future<void> test_ConditionalExpression_partial_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
@@ -1955,7 +1955,7 @@
 
   Future<void> test_ConditionalExpression_partial_thenExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
@@ -1981,7 +1981,7 @@
 
   Future<void> test_ConditionalExpression_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
@@ -2066,9 +2066,9 @@
   }
 
   Future<void> test_ConstructorName_importedClass() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 int T1;
 F1() { }
@@ -2091,9 +2091,9 @@
   }
 
   Future<void> test_ConstructorName_importedFactory() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 int T1;
 F1() { }
@@ -2116,7 +2116,7 @@
   }
 
   Future<void> test_ConstructorName_importedFactory2() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         void f() {new String.fr^omCharCodes([]);}''');
@@ -2134,7 +2134,7 @@
   }
 
   Future<void> test_ConstructorName_localClass() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
 int T1;
@@ -2155,7 +2155,7 @@
   }
 
   Future<void> test_ConstructorName_localFactory() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
 int T1;
@@ -2572,7 +2572,7 @@
 
   Future<void> test_ExpressionStatement_identifier() async {
     // SimpleIdentifier  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 _B F1() { }
 class A {int x;}
 class _B { }''');
@@ -2600,7 +2600,7 @@
 
   Future<void> test_ExpressionStatement_name() async {
     // ExpressionStatement  Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         B T1;
         class B{}''');
     addTestSource('''
@@ -2670,7 +2670,7 @@
 
   Future<void> test_extensionDeclaration_notInBody() async {
     // ExtensionDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -2723,7 +2723,7 @@
   Future<void> test_FieldDeclaration_name_typed() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import "a.dart";
         class C {A ^}''');
@@ -2735,7 +2735,7 @@
   Future<void> test_FieldDeclaration_name_var() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import "a.dart";
         class C {var ^}''');
@@ -3232,7 +3232,7 @@
 
   Future<void> test_FunctionDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -3263,7 +3263,7 @@
 
   Future<void> test_FunctionDeclaration_returnType_afterComment2() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -3294,7 +3294,7 @@
 
   Future<void> test_FunctionDeclaration_returnType_afterComment3() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -3560,7 +3560,7 @@
 
   Future<void> test_IndexExpression() async {
     // ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
@@ -3586,7 +3586,7 @@
 
   Future<void> test_IndexExpression2() async {
     // SimpleIdentifier IndexExpression ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
@@ -3611,7 +3611,7 @@
   }
 
   Future<void> test_inherited() async {
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
 lib libB;
 class A2 {
   int x;
@@ -3762,8 +3762,8 @@
   }
 
   Future<void> test_InstanceCreationExpression_imported() async {
-    // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
-    addSource('/home/test/lib/a.dart', '''
+    // SimpleIdentifier  NamedType  ConstructorName  InstanceCreationExpression
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 class A {A(this.x) { } int x;}''');
@@ -3822,7 +3822,7 @@
   }
 
   Future<void> test_InstanceCreationExpression_unimported() async {
-    // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
+    // SimpleIdentifier  NamedType  ConstructorName  InstanceCreationExpression
     addSource('/testAB.dart', 'class Foo { }');
     addTestSource('class C {foo(){new F^}}');
     await computeSuggestions();
@@ -3865,7 +3865,7 @@
 
   Future<void> test_InterpolationExpression_block() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -3937,8 +3937,8 @@
   }
 
   Future<void> test_IsExpression() async {
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 foo() { }
 class X {X.c(); X._d(); z() {}}''');
@@ -3977,7 +3977,7 @@
   }
 
   Future<void> test_IsExpression_type() async {
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
     addTestSource('''
 class A {int x; int y() => 0;}
 void f(){var a; if (a is ^)}''');
@@ -3997,7 +3997,7 @@
     // suggesting types. We ought to do so because there's no reason to cast a
     // value to the type it already has.
 
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
     addTestSource('''
 class A {} class B extends A {} class C extends A {} class D {}
 f(A a){ if (a is ^) {}}''');
@@ -4018,7 +4018,7 @@
     // suggesting types. We ought to do so because there's no reason to cast a
     // value to the type it already has.
 
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
     addTestSource('''
 class A {} class B implements A {} class C implements A {} class D {}
 f(A a){ if (a is ^) {}}''');
@@ -4034,7 +4034,7 @@
   }
 
   Future<void> test_IsExpression_type_filter_undefined_type() async {
-    // SimpleIdentifier  TypeName  AsExpression
+    // SimpleIdentifier  NamedType  AsExpression
     addTestSource('''
 class A {}
 f(U u){ (u as ^) }''');
@@ -4046,7 +4046,7 @@
   }
 
   Future<void> test_IsExpression_type_partial() async {
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
     addTestSource('''
 class A {int x; int y() => 0;}
 void f(){var a; if (a is Obj^)}''');
@@ -4061,7 +4061,7 @@
   }
 
   Future<void> test_keyword() async {
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 int newT1;
 int T1;
@@ -4214,7 +4214,7 @@
 
   Future<void> test_MapLiteralEntry() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -4244,7 +4244,7 @@
 
   Future<void> test_MapLiteralEntry1() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -4266,7 +4266,7 @@
 
   Future<void> test_MapLiteralEntry2() async {
     // SimpleIdentifier  MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -4322,7 +4322,7 @@
   }
 
   Future<void> test_method_parameters_mixed_required_and_named() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {
   void m(x, {int y}) {}
 }
@@ -4369,7 +4369,7 @@
   }
 
   Future<void> test_method_parameters_mixed_required_and_positional() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {
   void m(x, [int y]) {}
 }
@@ -4417,7 +4417,7 @@
   }
 
   Future<void> test_method_parameters_named() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {
   void m({x, int y}) {}
 }
@@ -4464,7 +4464,7 @@
   }
 
   Future<void> test_method_parameters_none() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {
   void m() {}
 }
@@ -4501,7 +4501,7 @@
   }
 
   Future<void> test_method_parameters_positional() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {
   void m([x, int y]) {}
 }
@@ -4548,7 +4548,7 @@
   }
 
   Future<void> test_method_parameters_required() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {
   void m(x, int y) {}
 }
@@ -4607,7 +4607,7 @@
 
   Future<void> test_MethodDeclaration_body_static() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/c.dart', '''
+    addSource('$testPackageLibPath/c.dart', '''
 class C {
   c1() {}
   var c2;
@@ -4784,7 +4784,7 @@
 
   Future<void> test_MethodDeclaration_returnType() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -4814,7 +4814,7 @@
 
   Future<void> test_MethodDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -4844,7 +4844,7 @@
 
   Future<void> test_MethodDeclaration_returnType_afterComment2() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -4874,7 +4874,7 @@
 
   Future<void> test_MethodDeclaration_returnType_afterComment3() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -5008,7 +5008,7 @@
   }
 
   Future<void> test_mixin_ordering() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class B {}
 class M1 {
   void m() {}
@@ -5031,7 +5031,7 @@
 
   Future<void> test_MixinDeclaration_body() async {
     // MixinDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -5115,7 +5115,7 @@
   }
 
   Future<void> test_no_parameters_field() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {
   int x;
 }
@@ -5132,7 +5132,7 @@
   }
 
   Future<void> test_no_parameters_getter() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {
   int get x => null;
 }
@@ -5149,7 +5149,7 @@
   }
 
   Future<void> test_no_parameters_setter() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {
   set x(int value) {};
 }
@@ -5166,7 +5166,7 @@
   }
 
   Future<void> test_outside_class() async {
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
 lib libB;
 class A2 {
   int x;
@@ -5253,7 +5253,7 @@
 
   Future<void> test_PrefixedIdentifier_class_const() async {
     // SimpleIdentifier PrefixedIdentifier ExpressionStatement Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 class I {
   static const scI = 'boo';
@@ -5300,7 +5300,7 @@
 
   Future<void> test_PrefixedIdentifier_class_imported() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 class I {X get f => new A();get _g => new A();}
 class A implements I {
@@ -5379,7 +5379,7 @@
 
   Future<void> test_PrefixedIdentifier_library() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 var T1;
 class X { }
@@ -5405,8 +5405,8 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_typesOnly() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  PrefixedIdentifier  NamedType
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 var T1;
 class X { }
@@ -5432,8 +5432,8 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_typesOnly2() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  PrefixedIdentifier  NamedType
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 var T1;
 class X { }
@@ -5460,7 +5460,7 @@
 
   Future<void> test_PrefixedIdentifier_parameter() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 class _W {M y; var _z;}
 class X extends _W {}
@@ -5479,7 +5479,7 @@
 
   Future<void> test_PrefixedIdentifier_prefix() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {static int bar = 10;}
 _B() {}''');
     addTestSource('''
@@ -5643,7 +5643,7 @@
 
   Future<void> test_PropertyAccess_noTarget() async {
     // SimpleIdentifier  PropertyAccess  ExpressionStatement
-    addSource('/home/test/lib/ab.dart', 'class Foo { }');
+    addSource('$testPackageLibPath/ab.dart', 'class Foo { }');
     addTestSource('class C {foo(){.^}}');
     await computeSuggestions();
 
@@ -5652,7 +5652,7 @@
 
   Future<void> test_PropertyAccess_noTarget2() async {
     // SimpleIdentifier  PropertyAccess  ExpressionStatement
-    addSource('/home/test/lib/ab.dart', 'class Foo { }');
+    addSource('$testPackageLibPath/ab.dart', 'class Foo { }');
     addTestSource('void f() {.^}');
     await computeSuggestions();
 
@@ -5680,7 +5680,7 @@
   }
 
   Future<void> test_static_field() async {
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
 lib libB;
 class A2 {
   int x;
@@ -5722,7 +5722,7 @@
   }
 
   Future<void> test_static_method() async {
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
 lib libB;
 class A2 {
   int x;
@@ -6107,7 +6107,7 @@
 
   Future<void> test_TypeArgumentList() async {
     // SimpleIdentifier  BinaryExpression  ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class C1 {int x;}
 F1() => 0;
 typedef String T1(int blat);''');
@@ -6133,8 +6133,8 @@
   }
 
   Future<void> test_TypeArgumentList2() async {
-    // TypeName  TypeArgumentList  TypeName
-    addSource('/home/test/lib/a.dart', '''
+    // NamedType  TypeArgumentList  NamedType
+    addSource('$testPackageLibPath/a.dart', '''
 class C1 {int x;}
 F1() => 0;
 typedef String T1(int blat);''');
@@ -6198,7 +6198,7 @@
   Future<void> test_VariableDeclaration_name() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 foo() { }
 class _B { }
@@ -6225,7 +6225,7 @@
   Future<void> test_VariableDeclarationStatement_RHS() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 foo() { }
 class _B { }
@@ -6250,7 +6250,7 @@
   Future<void> test_VariableDeclarationStatement_RHS_missing_semicolon() async {
     // VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 foo1() { }
 void bar1() { }
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 a671eeb..7c9b3d8 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
@@ -290,9 +290,9 @@
   }
 
   Future<void> test_ConstructorName_importedClass() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
@@ -318,9 +318,9 @@
   }
 
   Future<void> test_ConstructorName_importedClass_unresolved() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
@@ -347,9 +347,9 @@
   }
 
   Future<void> test_ConstructorName_importedFactory() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
@@ -375,7 +375,7 @@
   }
 
   Future<void> test_ConstructorName_importedFactory2() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         main() {new String.fr^omCharCodes([]);}''');
@@ -395,7 +395,7 @@
   }
 
   Future<void> test_ConstructorName_localClass() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         int T1;
@@ -422,7 +422,7 @@
   }
 
   Future<void> test_ConstructorName_localFactory() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         int T1;
@@ -450,7 +450,7 @@
 
   Future<void>
       test_importPrefix_className_typeArguments_period_nothing_functionTypeContext_matchingReturnType() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A<T> {
   A.named();
   A.new();
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 e8eff71..0e65414 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
@@ -153,7 +153,7 @@
   }
 
   Future<void> test_fromPart() async {
-    addSource('/home/test/lib/myLib.dart', '''
+    addSource('$testPackageLibPath/myLib.dart', '''
 library myLib;
 part 'test.dart';
 part 'otherPart.dart';
@@ -162,7 +162,7 @@
   B suggested2(String y) => null;
 }
 ''');
-    addSource('/home/test/lib/otherPart.dart', '''
+    addSource('$testPackageLibPath/otherPart.dart', '''
 part of myLib;
 class B extends A {
   B suggested2(String y) => null;
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 e4bc0d3..7c2a610 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
@@ -28,7 +28,7 @@
   }
 
   Future<void> test_class_static_notPrivate() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   static int _f;
   static String get _g => '';
@@ -138,7 +138,7 @@
   }
 
   Future<void> test_extension_static_notPrivate() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 extension E {
   static int _f;
   static String get _g => '';
@@ -160,7 +160,7 @@
   }
 
   Future<void> test_implicitCreation() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   A.foo();
   A.bar();
@@ -181,7 +181,7 @@
 
   Future<void>
       test_implicitCreation_functionContextType_matchingReturnType() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   A.foo();
   A.bar();
@@ -202,7 +202,7 @@
 
   Future<void>
       test_implicitCreation_functionContextType_notMatchingReturnType() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   A.foo();
   A.bar();
@@ -365,7 +365,7 @@
 
   Future<void> test_PrefixedIdentifier_class_const() async {
     // SimpleIdentifier PrefixedIdentifier ExpressionStatement Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         class I {
           static const scI = 'boo';
@@ -409,7 +409,7 @@
   }
 
   Future<void> test_simpleIdentifier_typeAlias_interfaceType_class() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   static int _privateField = 0;
   static int get _privateGetter => 0;
@@ -451,7 +451,7 @@
   }
 
   Future<void> test_simpleIdentifier_typeAlias_interfaceType_enum() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 enum E {
   aaa,
   _bbb,
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 c7f9a18..47000b2 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
@@ -114,7 +114,7 @@
 
   Future<void> test_ArgumentList() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
@@ -138,7 +138,7 @@
 
   Future<void> test_ArgumentList_imported_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         expect(arg) { }
@@ -164,7 +164,7 @@
   Future<void>
       test_ArgumentList_InstanceCreationExpression_functionalArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
@@ -191,7 +191,7 @@
 
   Future<void> test_ArgumentList_InstanceCreationExpression_typedefArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         typedef Funct();
         class A { A(Funct f) { } }
@@ -219,7 +219,7 @@
 
   Future<void> test_ArgumentList_local_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
@@ -244,7 +244,7 @@
 
   Future<void> test_ArgumentList_local_method() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
@@ -269,7 +269,7 @@
 
   Future<void> test_ArgumentList_MethodInvocation_functionalArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
@@ -296,7 +296,7 @@
 
   Future<void> test_ArgumentList_MethodInvocation_methodArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
@@ -322,7 +322,7 @@
   Future<void> test_ArgumentList_namedParam() async {
     // SimpleIdentifier  NamedExpression  ArgumentList  MethodInvocation
     // ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }''');
     addTestSource('''
@@ -338,7 +338,7 @@
   }
 
   Future<void> test_AsExpression() async {
-    // SimpleIdentifier  TypeName  AsExpression
+    // SimpleIdentifier  NamedType  AsExpression
     addTestSource('''
         class A {var b; X _c; foo() {var a; (a as ^).foo();}''');
     await computeSuggestions();
@@ -373,7 +373,7 @@
   }
 
   Future<void> test_AssignmentExpression_type() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
         class A {} void f() {
@@ -395,7 +395,7 @@
   }
 
   Future<void> test_AssignmentExpression_type_newline() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
         class A {} void f() {
@@ -416,7 +416,7 @@
   }
 
   Future<void> test_AssignmentExpression_type_partial() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
         class A {} void f() {
@@ -438,7 +438,7 @@
   }
 
   Future<void> test_AssignmentExpression_type_partial_newline() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
         class A {} void f() {
@@ -977,7 +977,7 @@
 
   Future<void> test_Block_inherited_imported() async {
     // Block  BlockFunctionBody  MethodDeclaration  ClassDeclaration
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; }
         class E extends F { var e1; e2() { } }
@@ -1093,7 +1093,7 @@
 
   Future<void> test_CascadeExpression_method1() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart";
@@ -1117,7 +1117,7 @@
 
   Future<void> test_CascadeExpression_selector1() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart";
@@ -1141,7 +1141,7 @@
 
   Future<void> test_CascadeExpression_selector2() async {
     // SimpleIdentifier  PropertyAccess  CascadeExpression  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart";
@@ -1163,7 +1163,7 @@
 
   Future<void> test_CascadeExpression_selector2_withTrailingReturn() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart";
@@ -1203,7 +1203,7 @@
   }
 
   Future<void> test_CatchClause_onType() async {
-    // TypeName  CatchClause  TryStatement
+    // NamedType  CatchClause  TryStatement
     addTestSource('class A {a() {try{var x;} on ^ {}}}');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -1215,7 +1215,7 @@
   }
 
   Future<void> test_CatchClause_onType_noBrackets() async {
-    // TypeName  CatchClause  TryStatement
+    // NamedType  CatchClause  TryStatement
     addTestSource('class A {a() {try{var x;} on ^}}');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -1252,7 +1252,7 @@
 
   Future<void> test_ClassDeclaration_body() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1271,7 +1271,7 @@
 
   Future<void> test_ClassDeclaration_body_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1290,7 +1290,7 @@
 
   Future<void> test_ClassDeclaration_body_final_field() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1309,7 +1309,7 @@
 
   Future<void> test_ClassDeclaration_body_final_field2() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as Soo;
@@ -1328,7 +1328,7 @@
 
   Future<void> test_ClassDeclaration_body_final_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1347,7 +1347,7 @@
 
   Future<void> test_ClassDeclaration_body_final_var() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1414,7 +1414,7 @@
 
   Future<void> test_ConditionalExpression_elseExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1433,7 +1433,7 @@
 
   Future<void> test_ConditionalExpression_elseExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1458,7 +1458,7 @@
 
   Future<void> test_ConditionalExpression_partial_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1477,7 +1477,7 @@
 
   Future<void> test_ConditionalExpression_partial_thenExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1502,7 +1502,7 @@
 
   Future<void> test_ConditionalExpression_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1520,9 +1520,9 @@
   }
 
   Future<void> test_ConstructorName_importedClass() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
@@ -1544,9 +1544,9 @@
   }
 
   Future<void> test_ConstructorName_importedFactory() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
@@ -1568,7 +1568,7 @@
   }
 
   Future<void> test_ConstructorName_importedFactory2() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         void f() {new String.fr^omCharCodes([]);}''');
@@ -1585,7 +1585,7 @@
   }
 
   Future<void> test_ConstructorName_localClass() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         int T1;
@@ -1605,7 +1605,7 @@
   }
 
   Future<void> test_ConstructorName_localFactory() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         int T1;
@@ -1706,7 +1706,7 @@
 
   Future<void> test_ExpressionStatement_identifier() async {
     // SimpleIdentifier  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         _B F1() { }
         class A {int x;}
         class _B { }''');
@@ -1732,7 +1732,7 @@
 
   Future<void> test_ExpressionStatement_name() async {
     // ExpressionStatement  Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         B T1;
         class B{}''');
     addTestSource('''
@@ -1759,7 +1759,7 @@
   Future<void> test_FieldDeclaration_name_typed() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import "a.dart";
         class C {A ^}''');
@@ -1770,7 +1770,7 @@
   Future<void> test_FieldDeclaration_name_var() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import "a.dart";
         class C {var ^}''');
@@ -1922,7 +1922,7 @@
 
   Future<void> test_FunctionDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -1951,7 +1951,7 @@
 
   Future<void> test_FunctionDeclaration_returnType_afterComment2() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -1980,7 +1980,7 @@
 
   Future<void> test_FunctionDeclaration_returnType_afterComment3() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2174,7 +2174,7 @@
 
   Future<void> test_IndexExpression() async {
     // ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -2199,7 +2199,7 @@
 
   Future<void> test_IndexExpression2() async {
     // SimpleIdentifier IndexExpression ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -2217,8 +2217,8 @@
   }
 
   Future<void> test_InstanceCreationExpression_imported() async {
-    // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
-    addSource('/home/test/lib/a.dart', '''
+    // SimpleIdentifier  NamedType  ConstructorName  InstanceCreationExpression
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {A(this.x) { } int x;}''');
@@ -2247,7 +2247,7 @@
   }
 
   Future<void> test_InstanceCreationExpression_unimported() async {
-    // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
+    // SimpleIdentifier  NamedType  ConstructorName  InstanceCreationExpression
     addSource('/testAB.dart', 'class Foo { }');
     addTestSource('class C {foo(){new F^}}');
     await computeSuggestions();
@@ -2304,7 +2304,7 @@
 
   Future<void> test_InterpolationExpression() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2333,7 +2333,7 @@
 
   Future<void> test_InterpolationExpression_block() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2398,8 +2398,8 @@
   }
 
   Future<void> test_IsExpression() async {
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         foo() { }
         class X {X.c(); X._d(); z() {}}''');
@@ -2436,7 +2436,7 @@
   }
 
   Future<void> test_IsExpression_type() async {
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
     addTestSource('''
         class A {int x; int y() => 0;}
         void f(){var a; if (a is ^)}''');
@@ -2450,7 +2450,7 @@
   }
 
   Future<void> test_IsExpression_type_partial() async {
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
     addTestSource('''
         class A {int x; int y() => 0;}
         void f(){var a; if (a is Obj^)}''');
@@ -2472,7 +2472,7 @@
   }
 
   Future<void> test_keyword2() async {
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int newT1;
         int T1;
@@ -2532,8 +2532,8 @@
   }
 
   Future<void> test_libraryPrefix_with_exports() async {
-    addSource('/home/test/lib/a.dart', 'class A { }');
-    addSource('/home/test/lib/b.dart', 'export "a.dart"; class B { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/b.dart', 'export "a.dart"; class B { }');
     addTestSource('import "b.dart" as foo; void f() {foo.^} class C { }');
     await computeSuggestions();
     // Suggested by LibraryMemberContributor
@@ -2591,7 +2591,7 @@
 
   Future<void> test_MapLiteralEntry() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2618,7 +2618,7 @@
 
   Future<void> test_MapLiteralEntry1() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2638,7 +2638,7 @@
 
   Future<void> test_MapLiteralEntry2() async {
     // SimpleIdentifier  MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2937,7 +2937,7 @@
 
   Future<void> test_MethodDeclaration_returnType() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2965,7 +2965,7 @@
 
   Future<void> test_MethodDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2993,7 +2993,7 @@
 
   Future<void> test_MethodDeclaration_returnType_afterComment2() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3021,7 +3021,7 @@
 
   Future<void> test_MethodDeclaration_returnType_afterComment3() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3267,13 +3267,13 @@
   }
 
   Future<void> test_partFile_TypeName() async {
-    // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  ConstructorName
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library libA;
         import "b.dart";
         part "${resourceProvider.pathContext.basename(testFile)}";
@@ -3299,13 +3299,13 @@
   }
 
   Future<void> test_partFile_TypeName2() async {
-    // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  ConstructorName
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         part of libA;
         class B { }''');
     addTestSource('''
@@ -3332,7 +3332,7 @@
 
   Future<void> test_PrefixedIdentifier_class_const() async {
     // SimpleIdentifier PrefixedIdentifier ExpressionStatement Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         class I {
           static const scI = 'boo';
@@ -3378,7 +3378,7 @@
 
   Future<void> test_PrefixedIdentifier_class_imported() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         class I {X get f => new A();get _g => new A();}
         class A implements I {
@@ -3454,7 +3454,7 @@
 
   Future<void> test_PrefixedIdentifier_library() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         var T1;
         class X { }
@@ -3479,8 +3479,8 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_typesOnly() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  PrefixedIdentifier  NamedType
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         var T1;
         class X { }
@@ -3505,8 +3505,8 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_typesOnly2() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  PrefixedIdentifier  NamedType
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         var T1;
         class X { }
@@ -3532,7 +3532,7 @@
 
   Future<void> test_PrefixedIdentifier_parameter() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         class _W {M y; var _z;}
         class X extends _W {}
@@ -3550,7 +3550,7 @@
 
   Future<void> test_PrefixedIdentifier_prefix() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         class A {static int bar = 10;}
         _B() {}''');
     addTestSource('''
@@ -4149,7 +4149,7 @@
 
   Future<void> test_TypeArgumentList() async {
     // SimpleIdentifier  BinaryExpression  ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         class C1 {int x;}
         F1() => 0;
         typedef String T1(int blat);''');
@@ -4173,8 +4173,8 @@
   }
 
   Future<void> test_TypeArgumentList2() async {
-    // TypeName  TypeArgumentList  TypeName
-    addSource('/home/test/lib/a.dart', '''
+    // NamedType  TypeArgumentList  NamedType
+    addSource('$testPackageLibPath/a.dart', '''
         class C1 {int x;}
         F1() => 0;
         typedef String T1(int blat);''');
@@ -4218,7 +4218,7 @@
   Future<void> test_VariableDeclaration_name() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         foo() { }
         class _B { }
@@ -4243,7 +4243,7 @@
   Future<void> test_VariableDeclarationStatement_RHS() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         foo() { }
         class _B { }
@@ -4267,7 +4267,7 @@
   Future<void> test_VariableDeclarationStatement_RHS_missing_semicolon() async {
     // VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         foo1() { }
         void bar1() { }
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 5e73ef0..dfc309c 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
@@ -738,7 +738,7 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_into_legacy() async {
-    newFile('/home/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 String? x;
 ''');
     await _prepareCompletion('.tryon', '''
@@ -762,7 +762,7 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_into_legacy_nested() async {
-    newFile('/home/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 List<String?> x;
 ''');
     await _prepareCompletion('.tryon', '''
@@ -786,7 +786,7 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_legacy() async {
-    newFile('/home/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 // @dart = 2.8
 String x;
 ''');
@@ -809,7 +809,7 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_legacy_nested() async {
-    newFile('/home/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 // @dart = 2.8
 List<String> x;
 ''');
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 f28613f..8ecae36 100644
--- a/pkg/analysis_server/test/services/correction/organize_directives_test.dart
+++ b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
@@ -22,6 +22,12 @@
 class OrganizeDirectivesTest extends AbstractSingleUnitTest {
   late List<AnalysisError> testErrors;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(meta: true);
+  }
+
   Future<void> test_docComment_beforeDirective_hasUnresolvedIdentifier() async {
     await _computeUnitAndErrors(r'''
 /// Library documentation comment A
@@ -682,6 +688,219 @@
 import 'package:b/a.dart';''');
   }
 
+  Future<void> test_sort_libraryAnnotation_movedDirective() async {
+    await _addAnnotationsFile();
+    await _computeUnitAndErrors(r'''
+@libraryAnnotation
+@LibraryAnnotation()
+
+// annotations
+import 'annotations.dart';
+
+// io
+import 'dart:io';
+''');
+    // Validate annotation is not moved with import.
+    _assertOrganize(r'''
+@libraryAnnotation
+@LibraryAnnotation()
+
+// io
+import 'dart:io';
+
+// annotations
+import 'annotations.dart';
+''');
+  }
+
+  Future<void> test_sort_libraryAnnotation_removedDirective() async {
+    await _addAnnotationsFile();
+    await _computeUnitAndErrors(r'''
+@libraryAnnotation
+@LibraryAnnotation()
+
+// io
+import 'dart:io'; // unused
+// annotations
+import 'annotations.dart'; // used
+''');
+    // Validate annotation is not removed with import.
+    _assertOrganize(r'''
+@libraryAnnotation
+@LibraryAnnotation()
+
+// annotations
+import 'annotations.dart'; // used
+''', removeUnused: true);
+  }
+
+  Future<void> test_sort_multipleAnnotation_movedDirective() async {
+    await _addAnnotationsFile();
+    await _computeUnitAndErrors(r'''
+@libraryAnnotation
+@LibraryAnnotation()
+
+@nonLibraryAnnotation
+import 'annotations.dart';
+@nonLibraryAnnotation
+import 'dart:io';
+''');
+    // Validate only the non-library annotation is moved with import.
+    _assertOrganize(r'''
+@libraryAnnotation
+@LibraryAnnotation()
+
+@nonLibraryAnnotation
+import 'dart:io';
+
+@nonLibraryAnnotation
+import 'annotations.dart';
+''');
+  }
+
+  Future<void> test_sort_multipleAnnotation_removedDirective() async {
+    await _addAnnotationsFile();
+    await _computeUnitAndErrors(r'''
+@libraryAnnotation
+@LibraryAnnotation()
+
+@nonLibraryAnnotation
+import 'dart:io';
+@nonLibraryAnnotation
+import 'annotations.dart';
+''');
+    // Validate only the non-library annotation is removed with import.
+    _assertOrganize(r'''
+@libraryAnnotation
+@LibraryAnnotation()
+
+@nonLibraryAnnotation
+import 'annotations.dart';
+''', removeUnused: true);
+  }
+
+  Future<void> test_sort_multipleAnnotationWithComments_movedDirective() async {
+    await _addAnnotationsFile();
+    await _computeUnitAndErrors(r'''
+// lib1
+@libraryAnnotation // lib1
+// lib2
+@LibraryAnnotation() // lib2
+
+// nonLib on annotations import
+@nonLibraryAnnotation // nonLib on annotations import
+// annotations import
+import 'annotations.dart'; // annotations import
+// nonLib on io import
+@nonLibraryAnnotation // nonLib on io import
+// io import
+import 'dart:io'; // io import
+''');
+    // Validate only the non-library annotation is moved with import.
+    _assertOrganize(r'''
+// lib1
+@libraryAnnotation // lib1
+// lib2
+@LibraryAnnotation() // lib2
+
+// nonLib on io import
+@nonLibraryAnnotation // nonLib on io import
+// io import
+import 'dart:io'; // io import
+
+// nonLib on annotations import
+@nonLibraryAnnotation // nonLib on annotations import
+// annotations import
+import 'annotations.dart'; // annotations import
+''');
+  }
+
+  Future<void>
+      test_sort_multipleAnnotationWithComments_removedDirective() async {
+    await _addAnnotationsFile();
+    await _computeUnitAndErrors(r'''
+// lib1
+@libraryAnnotation // lib1
+// lib2
+@LibraryAnnotation() // lib2
+
+// nonLib on io import
+@nonLibraryAnnotation // nonLib on io import
+// io import
+import 'dart:io'; // io import
+// nonLib on annotations import
+@nonLibraryAnnotation // nonLib on annotations import
+// annotations import
+import 'annotations.dart'; // annotations import
+''');
+    // Validate only the non-library annotation is removed with import.
+    _assertOrganize(r'''
+// lib1
+@libraryAnnotation // lib1
+// lib2
+@LibraryAnnotation() // lib2
+
+// nonLib on annotations import
+@nonLibraryAnnotation // nonLib on annotations import
+// annotations import
+import 'annotations.dart'; // annotations import
+''', removeUnused: true);
+  }
+
+  Future<void> test_sort_nonLibraryAnnotation_movedDirective() async {
+    await _addAnnotationsFile();
+    await _computeUnitAndErrors(r'''
+@nonLibraryAnnotation
+import 'annotations.dart';
+
+import 'dart:io';
+''');
+    // Validate annotation is moved with import.
+    _assertOrganize(r'''
+import 'dart:io';
+
+@nonLibraryAnnotation
+import 'annotations.dart';
+''');
+  }
+
+  Future<void> test_sort_nonLibraryAnnotation_removedDirective() async {
+    await _addAnnotationsFile();
+    await _computeUnitAndErrors(r'''
+@nonLibraryAnnotation
+// io
+import 'dart:io'; // unused
+// annotations
+import 'annotations.dart'; // used
+''');
+    // Validate annotation is removed with import.
+    _assertOrganize(r'''
+// annotations
+import 'annotations.dart'; // used
+''', removeUnused: true);
+  }
+
+  Future<void> _addAnnotationsFile() async {
+    final annotationsFile = convertPath('$testPackageLibPath/annotations.dart');
+    const annotationsContent = '''
+import 'package:meta/meta_meta.dart';
+
+const libraryAnnotation = LibraryAnnotation();
+const nonLibraryAnnotation = NonLibraryAnnotation();
+
+@Target({TargetKind.library})
+class LibraryAnnotation {
+  const LibraryAnnotation();
+}
+
+@Target({TargetKind.classType})
+class NonLibraryAnnotation {
+  const NonLibraryAnnotation();
+}
+    ''';
+    addSource(annotationsFile, annotationsContent);
+  }
+
   void _assertOrganize(String expectedCode, {bool removeUnused = false}) {
     var organizer = ImportOrganizer(testCode, testUnit, testErrors,
         removeUnused: removeUnused);
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 b8cc8eb..8b090db 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
@@ -89,7 +89,7 @@
   }
 
   Future<void> test_change_multipleFiles() async {
-    await indexUnit('/home/test/lib/other.dart', r'''
+    await indexUnit('$testPackageLibPath/other.dart', r'''
 class A {
   int get test => 1;
 }
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 c95f9e0..58aea84 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
@@ -88,7 +88,7 @@
   }
 
   Future<void> test_change_multipleFiles() async {
-    await indexUnit('/home/test/lib/other.dart', r'''
+    await indexUnit('$testPackageLibPath/other.dart', r'''
 class A {
   int test() => 1;
 }
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 527b60f..98584b89 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
@@ -2871,7 +2871,7 @@
   }
 
   void _addLibraryReturningAsync() {
-    addSource('/home/test/lib/asyncLib.dart', r'''
+    addSource('$testPackageLibPath/asyncLib.dart', r'''
 import 'dart:async';
 
 Completer<int> newCompleter() => null;
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 5094b24..52fe0df 100644
--- a/pkg/analysis_server/test/services/refactoring/move_file_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
@@ -57,7 +57,7 @@
   }
 
   Future<void> test_file_imported_with_package_uri_down() async {
-    var file = newFile('/home/test/lib/old_name.dart', content: '');
+    var file = newFile('$testPackageLibPath/old_name.dart', content: '');
     addTestSource(r'''
 import 'package:test/old_name.dart';
 ''');
@@ -69,7 +69,8 @@
     testAnalysisResult =
         await session.getResolvedUnit(file.path) as ResolvedUnitResult;
 
-    _createRefactoring('/home/test/lib/222/new_name.dart', oldFile: file.path);
+    _createRefactoring('$testPackageLibPath/222/new_name.dart',
+        oldFile: file.path);
     await _assertSuccessfulRefactoring();
 
     assertFileChangeResult(testFile, '''
@@ -150,7 +151,7 @@
   }
 
   Future<void> test_file_imported_with_package_uri_sideways() async {
-    var file = newFile('/home/test/lib/111/old_name.dart', content: '');
+    var file = newFile('$testPackageLibPath/111/old_name.dart', content: '');
     addTestSource(r'''
 import 'package:test/111/old_name.dart';
 ''');
@@ -162,7 +163,8 @@
     testAnalysisResult =
         await session.getResolvedUnit(file.path) as ResolvedUnitResult;
 
-    _createRefactoring('/home/test/lib/222/new_name.dart', oldFile: file.path);
+    _createRefactoring('$testPackageLibPath/222/new_name.dart',
+        oldFile: file.path);
     await _assertSuccessfulRefactoring();
 
     assertFileChangeResult(testFile, '''
@@ -171,7 +173,7 @@
   }
 
   Future<void> test_file_imported_with_package_uri_up() async {
-    var file = newFile('/home/test/lib/222/old_name.dart', content: '');
+    var file = newFile('$testPackageLibPath/222/old_name.dart', content: '');
     addTestSource(r'''
 import 'package:test/222/old_name.dart';
 ''');
@@ -183,7 +185,7 @@
     testAnalysisResult =
         await session.getResolvedUnit(file.path) as ResolvedUnitResult;
 
-    _createRefactoring('/home/test/lib/new_name.dart', oldFile: file.path);
+    _createRefactoring('$testPackageLibPath/new_name.dart', oldFile: file.path);
     await _assertSuccessfulRefactoring();
 
     assertFileChangeResult(testFile, '''
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 872fe9d..af8c5b5 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
@@ -157,7 +157,7 @@
   test() {}
 }
 ''');
-    await indexUnit('/home/test/lib/lib.dart', '''
+    await indexUnit('$testPackageLibPath/lib.dart', '''
 library my.lib;
 import 'test.dart';
 
@@ -181,7 +181,7 @@
   var foo = 1;
 }
 ''');
-    await indexUnit('/home/test/lib/lib.dart', '''
+    await indexUnit('$testPackageLibPath/lib.dart', '''
 import 'test.dart';
 
 void f(A a) {
@@ -387,7 +387,7 @@
   newName() {} // marker
 }
 ''';
-    await indexUnit('/home/test/lib/lib.dart', libCode);
+    await indexUnit('$testPackageLibPath/lib.dart', libCode);
     await indexTestUnit('''
 import 'lib.dart';
 class B extends A {
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 2f37e06..0b6b03c 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
@@ -35,7 +35,7 @@
   }
 
   Future<void> test_createChange() async {
-    addSource('/home/test/lib/part.dart', '''
+    addSource('$testPackageLibPath/part.dart', '''
 part of my.app;
 ''');
     await indexTestUnit('''
@@ -52,13 +52,13 @@
 library the.new.name;
 part 'part.dart';
 ''');
-    assertFileChangeResult('/home/test/lib/part.dart', '''
+    assertFileChangeResult('$testPackageLibPath/part.dart', '''
 part of the.new.name;
 ''');
   }
 
   Future<void> test_createChange_hasWhitespaces() async {
-    addSource('/home/test/lib/part.dart', '''
+    addSource('$testPackageLibPath/part.dart', '''
 part of my .  app;
 ''');
     await indexTestUnit('''
@@ -75,7 +75,7 @@
 library the.new.name;
 part 'part.dart';
 ''');
-    assertFileChangeResult('/home/test/lib/part.dart', '''
+    assertFileChangeResult('$testPackageLibPath/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 5c43032..5b42916 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
@@ -442,9 +442,38 @@
 ''');
   }
 
+  Future<void> test_createChange_parameter_named_anywhere() async {
+    await indexTestUnit('''
+myFunction(int a, int b, {required int test}) {
+  test = 1;
+  test += 2;
+  print(test);
+}
+void f() {
+  myFunction(0, test: 2, 1);
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test}) {');
+    expect(refactoring.refactoringName, 'Rename Parameter');
+    expect(refactoring.elementKindName, 'parameter');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRefactoring('''
+myFunction(int a, int b, {required int newName}) {
+  newName = 1;
+  newName += 2;
+  print(newName);
+}
+void f() {
+  myFunction(0, newName: 2, 1);
+}
+''');
+  }
+
   Future<void> test_createChange_parameter_named_inOtherFile() async {
-    var a = convertPath('/home/test/lib/a.dart');
-    var b = convertPath('/home/test/lib/b.dart');
+    var a = convertPath('$testPackageLibPath/a.dart');
+    var b = convertPath('$testPackageLibPath/b.dart');
 
     newFile(a, content: r'''
 class A {
@@ -537,7 +566,7 @@
   }
 
   Future<void> test_createChange_parameter_named_updateHierarchy() async {
-    await indexUnit('/home/test/lib/test2.dart', '''
+    await indexUnit('$testPackageLibPath/test2.dart', '''
 library test2;
 class A {
   void foo({int? test}) {
@@ -581,7 +610,7 @@
   }
 }
 ''');
-    assertFileChangeResult('/home/test/lib/test2.dart', '''
+    assertFileChangeResult('$testPackageLibPath/test2.dart', '''
 library test2;
 class A {
   void foo({int? newName}) {
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 a65f922..e0ebb09 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
@@ -71,7 +71,7 @@
     await indexTestUnit('''
 class Test {}
 ''');
-    await indexUnit('/home/test/lib/lib.dart', '''
+    await indexUnit('$testPackageLibPath/lib.dart', '''
 library my.lib;
 import 'test.dart';
 
@@ -112,7 +112,7 @@
     await indexTestUnit('''
 class Test {}
 ''');
-    await indexUnit('/home/test/lib/lib.dart', '''
+    await indexUnit('$testPackageLibPath/lib.dart', '''
 library my.lib;
 import 'test.dart';
 class A {
@@ -610,7 +610,7 @@
   }
 
   Future<void> test_createChange_FunctionElement_imported() async {
-    await indexUnit('/home/test/lib/foo.dart', r'''
+    await indexUnit('$testPackageLibPath/foo.dart', r'''
 test() {}
 foo() {}
 ''');
@@ -637,7 +637,7 @@
   foo();
 }
 ''');
-    assertFileChangeResult('/home/test/lib/foo.dart', '''
+    assertFileChangeResult('$testPackageLibPath/foo.dart', '''
 newName() {}
 foo() {}
 ''');
diff --git a/pkg/analysis_server/test/src/cider/rename_test.dart b/pkg/analysis_server/test/src/cider/rename_test.dart
index 028aaea..626135f 100644
--- a/pkg/analysis_server/test/src/cider/rename_test.dart
+++ b/pkg/analysis_server/test/src/cider/rename_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/cider/rename.dart';
 import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/dart/micro/resolve_file.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -29,7 +30,6 @@
 }
 ''');
 
-    expect(refactor, isNotNull);
     expect(refactor!.refactoringElement.element.name, 'bar');
     expect(refactor.refactoringElement.offset, _correctionContext.offset);
   }
@@ -40,7 +40,6 @@
 }
 ''');
 
-    expect(refactor, isNotNull);
     expect(refactor!.refactoringElement.element.name, 'foo');
     expect(refactor.refactoringElement.offset, _correctionContext.offset);
   }
@@ -68,7 +67,6 @@
 }
 ''');
 
-    expect(refactor, isNotNull);
     expect(refactor!.refactoringElement.element.name, 'a');
     expect(refactor.refactoringElement.offset, _correctionContext.offset);
   }
@@ -80,7 +78,6 @@
 }
 ''');
 
-    expect(refactor, isNotNull);
     expect(refactor!.refactoringElement.element.name, 'foo');
     expect(refactor.refactoringElement.offset, _correctionContext.offset);
   }
@@ -112,9 +109,8 @@
 int ^foo() => 2;
 ''', 'bar');
 
-    expect(result, isNotNull);
-    expect(result?.status.problems.length, 0);
-    expect(result?.oldName, 'foo');
+    expect(result!.status.problems.length, 0);
+    expect(result.oldName, 'foo');
   }
 
   void test_checkName_local() {
@@ -124,9 +120,8 @@
 }
 ''', 'bar');
 
-    expect(result, isNotNull);
-    expect(result?.status.problems.length, 0);
-    expect(result?.oldName, 'a');
+    expect(result!.status.problems.length, 0);
+    expect(result.oldName, 'a');
   }
 
   void test_checkName_local_invalid() {
@@ -136,9 +131,8 @@
 }
 ''', 'Aa');
 
-    expect(result, isNotNull);
-    expect(result?.status.problems.length, 1);
-    expect(result?.oldName, 'a');
+    expect(result!.status.problems.length, 1);
+    expect(result.oldName, 'a');
   }
 
   void test_checkName_parameter() {
@@ -148,9 +142,57 @@
 }
 ''', 'bar');
 
-    expect(result, isNotNull);
-    expect(result?.status.problems.length, 0);
-    expect(result?.oldName, 'a');
+    expect(result!.status.problems.length, 0);
+    expect(result.oldName, 'a');
+  }
+
+  void test_rename_local() {
+    var result = _rename(r'''
+void foo() {
+  var ^a = 0; var b = a + 1;
+}
+''', 'bar');
+
+    expect(result!.matches.length, 1);
+    expect(
+        result.matches[0],
+        CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'),
+            [CharacterLocation(2, 7), CharacterLocation(2, 22)]));
+  }
+
+  void test_rename_method() {
+    var a = newFile('/workspace/dart/test/lib/a.dart', content: r'''
+void foo() {
+  a;
+}
+''');
+    fileResolver.resolve(path: a.path);
+
+    var result = _rename(r'''
+import 'a.dart';
+
+main() {
+^foo();
+}
+''', 'bar');
+
+    expect(result!.matches.length, 2);
+    expect(result.matches, [
+      CiderSearchMatch(convertPath('/workspace/dart/test/lib/a.dart'),
+          [CharacterLocation(1, 6)]),
+      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'),
+          [CharacterLocation(4, 1)])
+    ]);
+  }
+
+  void test_rename_parameter() {
+    var result = _rename(r'''
+void foo(String ^a) {
+  var b = a + 1;
+}
+''', 'bar');
+    expect(result!.matches.length, 1);
+    expect(result.checkName.oldName, 'a');
   }
 
   CheckNameResponse? _checkName(String content, String newName) {
@@ -158,12 +200,13 @@
 
     return CiderRenameComputer(
       fileResolver,
-    ).checkNewName(
-      convertPath(testPath),
-      _correctionContext.line,
-      _correctionContext.character,
-      newName,
-    );
+    )
+        .canRename(
+          convertPath(testPath),
+          _correctionContext.line,
+          _correctionContext.character,
+        )
+        ?.checkNewName(newName);
   }
 
   CanRenameResponse? _compute(String content) {
@@ -178,6 +221,21 @@
     );
   }
 
+  RenameResponse? _rename(String content, newName) {
+    _updateFile(content);
+
+    return CiderRenameComputer(
+      fileResolver,
+    )
+        .canRename(
+          convertPath(testPath),
+          _correctionContext.line,
+          _correctionContext.character,
+        )
+        ?.checkNewName(newName)
+        ?.computeRenameRanges();
+  }
+
   void _updateFile(String content) {
     var offset = content.indexOf('^');
     expect(offset, isPositive, reason: 'Expected to find ^');
diff --git a/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart b/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart
index 83a9954..3c99d77 100644
--- a/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart
@@ -23,7 +23,7 @@
   @override
   void setUp() {
     super.setUp();
-    sourcePath = convertPath('/home/test/lib/test.dart');
+    sourcePath = convertPath('$testPackageLibPath/test.dart');
   }
 
   Future<void> test_adjacentLinesExcluded() async {
diff --git a/pkg/analysis_server/test/src/computer/color_computer_test.dart b/pkg/analysis_server/test/src/computer/color_computer_test.dart
new file mode 100644
index 0000000..1178812
--- /dev/null
+++ b/pkg/analysis_server/test/src/computer/color_computer_test.dart
@@ -0,0 +1,343 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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/computer/computer_color.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/diagnostic/diagnostic.dart';
+import 'package:collection/collection.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../abstract_context.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ColorComputerTest);
+  });
+}
+
+@reflectiveTest
+class ColorComputerTest extends AbstractContextTest {
+  /// A map of Dart source code that represents different types/formats
+  /// that are valid in const contexts.
+  ///
+  /// Values are the color that should be discovered (in 0xAARRGGBB format).
+  ///
+  /// Color values may not match the actual Flutter framework but are
+  /// values that are more identifyable for ease of testing. They are
+  /// defined in:
+  ///  - test/mock_packages/flutter/lib/src/material/colors.dart.
+  ///  - test/mock_packages/flutter/lib/src/cupertino/colors.dart.
+  ///
+  /// These values will be iterated in tests and inserted into various
+  /// code snippets for testing.
+  static const colorCodesConst = {
+    // dart:ui Colors
+    'Colors.white': 0xFFFFFFFF,
+    'Color(0xFF0000FF)': 0xFF0000FF,
+    'Color.fromARGB(255, 0, 0, 255)': 0xFF0000FF,
+    'Color.fromRGBO(0, 0, 255, 1)': 0xFF0000FF,
+    // Flutter Painting
+    'ColorSwatch(0xFF89ABCD, {})': 0xFF89ABCD,
+    // Flutter Material
+    'Colors.red': 0xFFFF0000,
+    'Colors.redAccent': 0xFFFFAA00,
+    'MaterialAccentColor(0xFF89ABCD, {})': 0xFF89ABCD,
+    // Flutter Cupertino
+    'CupertinoColors.black': 0xFF000000,
+    'CupertinoColors.systemBlue': 0xFF0000FF,
+    'CupertinoColors.activeBlue': 0xFF0000FF,
+  };
+
+  /// A map of Dart source code that represents different types/formats
+  /// that are not valid in const contexts.
+  ///
+  /// Values are the color that should be discovered (in 0xAARRGGBB format).
+  static const colorCodesNonConst = {
+    // Flutter Material
+    'Colors.red.shade100': 0x10FF0000,
+    'Colors.red[100]': 0x10FF0000,
+    // Flutter Cupertino
+    'CupertinoColors.systemBlue.color': 0xFF0000FF,
+    'CupertinoColors.systemBlue.darkColor': 0xFF000099,
+    'CupertinoColors.activeBlue.color': 0xFF0000FF,
+    'CupertinoColors.activeBlue.darkColor': 0xFF000099,
+    'CupertinoColors.activeBlue.highContrastColor': 0xFF000066,
+    'CupertinoColors.activeBlue.darkHighContrastColor': 0xFF000033,
+    'CupertinoColors.activeBlue.elevatedColor': 0xFF0000FF,
+    'CupertinoColors.activeBlue.darkElevatedColor': 0xFF000099,
+  };
+
+  /// A map of Dart source code that creates multiple nested color references.
+  ///
+  /// The key is the source code, and the value is a map of the expressions and
+  /// colors that should be produced (where the null key represents the
+  /// entire expression).
+  static const colorCodesNested = {
+    // TODO(dantup): Remove this "const" when we can evaluate constructors
+    // in non-const contexts.
+    'const CupertinoDynamicColor.withBrightness(color: CupertinoColors.white, darkColor: CupertinoColors.black)':
+        {
+      null: 0xFFFFFFFF,
+      'CupertinoColors.white': 0xFFFFFFFF,
+      'CupertinoColors.black': 0xFF000000,
+    },
+  };
+
+  late String testPath;
+  late String otherPath;
+
+  late ColorComputer computer;
+
+  /// Tests that all of the known color codes replaced into [code] produce the
+  /// expected nested color values.
+  ///
+  /// If [onlyConst] is `true`, only the test values that are const will be
+  /// tested.
+  Future<void> checkAllColors(String code, {bool onlyConst = false}) async {
+    // Combine the flat and nested colours into the same format.
+    final allColorCodes = <String, Map<String?, int>>{
+      ...colorCodesConst.map((key, value) => MapEntry(key, {key: value})),
+      if (!onlyConst)
+        ...colorCodesNonConst.map((key, value) => MapEntry(key, {key: value})),
+      ...colorCodesNested,
+    };
+
+    for (final entry in allColorCodes.entries) {
+      final colorDartCode = entry.key;
+      final expectedColorValues = entry.value.map(
+        // A null key means we should expect the full code.
+        (key, value) => MapEntry(key ?? colorDartCode, value),
+      );
+
+      await expectColors(
+        code.replaceAll('[[COLOR]]', colorDartCode),
+        expectedColorValues,
+      );
+    }
+  }
+
+  /// Checks that all of [expectedColorValues] are produced for [dartCode].
+  Future<void> expectColors(
+    String dartCode,
+    Map<String, int> expectedColorValues, {
+    String? otherCode,
+  }) async {
+    dartCode = _withCommonImports(dartCode);
+    otherCode = otherCode != null ? _withCommonImports(otherCode) : null;
+
+    newFile(testPath, content: dartCode);
+    if (otherCode != null) {
+      newFile(otherPath, content: otherCode);
+      final otherResult =
+          await session.getResolvedUnit(otherPath) as ResolvedUnitResult;
+      expectNoErrors(otherResult);
+    }
+    final result =
+        await session.getResolvedUnit(testPath) as ResolvedUnitResult;
+    expectNoErrors(result);
+
+    computer = ColorComputer(result);
+    final colors = computer.compute();
+
+    expect(
+      colors,
+      hasLength(expectedColorValues.length),
+      reason: '${expectedColorValues.length} colors should be detected in:\n'
+          '$dartCode',
+    );
+
+    expectedColorValues.entries.forEachIndexed((i, expectedColor) {
+      final color = colors[i];
+      final expectedColorCode = expectedColor.key;
+      final expectedColorValue = expectedColor.value;
+      final expectedAlpha = (0xff000000 & expectedColorValue) >> 24;
+      final expectedRed = (0x00ff0000 & expectedColorValue) >> 16;
+      final expectedGreen = (0x0000ff00 & expectedColorValue) >> 8;
+      final expectedBlue = (0x000000ff & expectedColorValue) >> 0;
+
+      final regionText =
+          dartCode.substring(color.offset, color.offset + color.length);
+      expect(
+        regionText,
+        equals(expectedColorCode),
+        reason: 'Color $i expected $expectedColorCode but was $regionText',
+      );
+
+      void expectComponent(int actual, int expected, String name) => expect(
+            actual,
+            expected,
+            reason: '$name value for $expectedColorCode is not correct',
+          );
+
+      expectComponent(color.color.alpha, expectedAlpha, 'Alpha');
+      expectComponent(color.color.red, expectedRed, 'Red');
+      expectComponent(color.color.green, expectedGreen, 'Green');
+      expectComponent(color.color.blue, expectedBlue, 'Blue');
+    });
+  }
+
+  void expectNoErrors(ResolvedUnitResult result) {
+    // If the test code has errors, generate a suitable failure to help debug.
+    final errors = result.errors
+        .where((error) => error.severity == Severity.error)
+        .toList();
+    if (errors.isNotEmpty) {
+      throw 'Code has errors: $errors\n\n${result.content}';
+    }
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(flutter: true);
+    testPath = convertPath('$testPackageLibPath/test.dart');
+    otherPath = convertPath('$testPackageLibPath/other_file.dart');
+  }
+
+  Future<void> test_collectionLiteral_const() async {
+    const testCode = '''
+main() {
+  const colors = [
+    [[COLOR]],
+  ];
+}
+''';
+    await checkAllColors(testCode, onlyConst: true);
+  }
+
+  Future<void> test_collectionLiteral_nonConst() async {
+    const testCode = '''
+main() {
+  final colors = [
+    [[COLOR]],
+  ];
+}
+''';
+    await checkAllColors(testCode);
+  }
+
+  Future<void> test_customClass() async {
+    const testCode = '''
+import 'other_file.dart';
+
+void main() {
+  final a1 = MyTheme.staticWhite;
+  final a2 = MyTheme.staticMaterialRedAccent;
+  const theme = MyTheme();
+  final b1 = theme.instanceWhite;
+  final b2 = theme.instanceMaterialRedAccent;
+}
+''';
+
+    const otherCode = '''
+class MyTheme {
+  static const Color staticWhite = Colors.white;
+  static const MaterialAccentColor staticMaterialRedAccent = Colors.redAccent;
+
+  final Color instanceWhite;
+  final MaterialAccentColor instanceMaterialRedAccent;
+
+  const MyTheme()
+      : instanceWhite = Colors.white,
+        instanceMaterialRedAccent = Colors.redAccent;
+}
+''';
+    await expectColors(
+      testCode,
+      {
+        'MyTheme.staticWhite': 0xFFFFFFFF,
+        'MyTheme.staticMaterialRedAccent': 0xFFFFAA00,
+        'theme.instanceWhite': 0xFFFFFFFF,
+        'theme.instanceMaterialRedAccent': 0xFFFFAA00,
+      },
+      otherCode: otherCode,
+    );
+  }
+
+  Future<void> test_local_const() async {
+    const testCode = '''
+main() {
+  const a = [[COLOR]];
+}
+''';
+    await checkAllColors(testCode, onlyConst: true);
+  }
+
+  Future<void> test_local_nonConst() async {
+    const testCode = '''
+main() {
+  final a = [[COLOR]];
+}
+''';
+    await checkAllColors(testCode);
+  }
+
+  Future<void> test_namedParameter_const() async {
+    const testCode = '''
+main() {
+  const w = Widget(color: [[COLOR]]);
+}
+
+class Widget {
+  final Color? color;
+  const Widget({this.color});
+}
+''';
+    await checkAllColors(testCode, onlyConst: true);
+  }
+
+  Future<void> test_namedParameter_nonConst() async {
+    const testCode = '''
+main() {
+  final w = Widget(color: [[COLOR]]);
+}
+
+class Widget {
+  final Color? color;
+  Widget({this.color});
+}
+''';
+    await checkAllColors(testCode);
+  }
+
+  Future<void> test_nested_const() async {
+    const testCode = '''
+main() {
+  const a = [[COLOR]];
+}
+''';
+    await checkAllColors(testCode, onlyConst: true);
+  }
+
+  Future<void> test_nested_nonConst() async {
+    const testCode = '''
+main() {
+  final a = [[COLOR]];
+}
+''';
+    await checkAllColors(testCode);
+  }
+
+  Future<void> test_topLevel_const() async {
+    const testCode = '''
+const a = [[COLOR]];
+''';
+    await checkAllColors(testCode, onlyConst: true);
+  }
+
+  Future<void> test_topLevel_nonConst() async {
+    const testCode = '''
+final a = [[COLOR]];
+''';
+    await checkAllColors(testCode);
+  }
+
+  String _withCommonImports(String code) => '''
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/painting.dart';
+import 'package:flutter/material.dart';
+
+$code''';
+}
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 f63607d..bba4d0b 100644
--- a/pkg/analysis_server/test/src/computer/folding_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/folding_computer_test.dart
@@ -29,7 +29,7 @@
   @override
   void setUp() {
     super.setUp();
-    sourcePath = convertPath('/home/test/lib/test.dart');
+    sourcePath = convertPath('$testPackageLibPath/test.dart');
   }
 
   Future<void> test_annotations() async {
diff --git a/pkg/analysis_server/test/src/computer/highlights_computer_test.dart b/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
index 46a6c44..d1a90d3 100644
--- a/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
@@ -25,7 +25,7 @@
   @override
   void setUp() {
     super.setUp();
-    sourcePath = convertPath('/home/test/lib/test.dart');
+    sourcePath = convertPath('$testPackageLibPath/test.dart');
   }
 
   Future<void> test_comment() async {
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 fed52b7..133ab24 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
@@ -57,7 +57,7 @@
   @override
   void setUp() {
     super.setUp();
-    path = convertPath('/home/test/lib/test.dart');
+    path = convertPath('$testPackageLibPath/test.dart');
   }
 
   Future<void> test_createEdits_addImport_noDirectives() async {
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 a63d9bc..cf1cf9a 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
@@ -46,7 +46,7 @@
   @override
   void setUp() {
     super.setUp();
-    sourcePath = convertPath('/home/test/lib/test.dart');
+    sourcePath = convertPath('$testPackageLibPath/test.dart');
   }
 
   Future<void> test_dartAsync_noPrefix() async {
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 185338f..7a0837e 100644
--- a/pkg/analysis_server/test/src/computer/outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
@@ -24,7 +24,7 @@
   @override
   void setUp() {
     super.setUp();
-    testPath = convertPath('/home/test/lib/test.dart');
+    testPath = convertPath('$testPackageLibPath/test.dart');
   }
 
   Future<Outline> _computeOutline(String code) async {
diff --git a/pkg/analysis_server/test/src/computer/selection_range_computer_test.dart b/pkg/analysis_server/test/src/computer/selection_range_computer_test.dart
index 27e9e7f..ee07e86 100644
--- a/pkg/analysis_server/test/src/computer/selection_range_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/selection_range_computer_test.dart
@@ -22,7 +22,7 @@
   @override
   void setUp() {
     super.setUp();
-    sourcePath = convertPath('/home/test/lib/test.dart');
+    sourcePath = convertPath('$testPackageLibPath/test.dart');
   }
 
   Future<void> test_arguments() async {
diff --git a/pkg/analysis_server/test/src/computer/test_all.dart b/pkg/analysis_server/test/src/computer/test_all.dart
index 6f67c7a..af15c51 100644
--- a/pkg/analysis_server/test/src/computer/test_all.dart
+++ b/pkg/analysis_server/test/src/computer/test_all.dart
@@ -5,6 +5,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'closing_labels_computer_test.dart' as closing_labels_computer;
+import 'color_computer_test.dart' as color_computer;
 import 'folding_computer_test.dart' as folding_computer;
 import 'highlights_computer_test.dart' as highlights_computer;
 import 'import_elements_computer_test.dart' as import_elements_computer;
@@ -15,6 +16,7 @@
 void main() {
   defineReflectiveSuite(() {
     closing_labels_computer.main();
+    color_computer.main();
     folding_computer.main();
     highlights_computer.main();
     import_elements_computer.main();
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 81d2594..4f3af62 100644
--- a/pkg/analysis_server/test/src/domains/execution/completion_test.dart
+++ b/pkg/analysis_server/test/src/domains/execution/completion_test.dart
@@ -25,7 +25,7 @@
   late RuntimeCompletionResult result;
 
   void addContextFile(String content) {
-    contextFile = convertPath('/home/test/lib/context.dart');
+    contextFile = convertPath('$testPackageLibPath/context.dart');
     addSource(contextFile, content);
 
     contextOffset = content.indexOf('// context line');
@@ -120,13 +120,13 @@
 
   @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_inPart() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 part 'b.dart';
 part 'context.dart';
 
 int a;
 ''');
-    addSource('/home/test/lib/b.dart', r'''
+    addSource('$testPackageLibPath/b.dart', r'''
 part of 'a.dart';
 
 double b;
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 c224c12..e55c554 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
@@ -27,7 +27,7 @@
   void setUp() {
     super.setUp();
     writeTestPackageConfig(flutter: true);
-    testPath = convertPath('/home/test/lib/test.dart');
+    testPath = convertPath('$testPackageLibPath/test.dart');
   }
 
   Future<void> test_attribute_namedExpression() async {
@@ -234,7 +234,7 @@
   }
 
   Future<void> test_children_closure_blockBody() async {
-    newFile('/home/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 import 'package:flutter/widgets.dart';
 
 class WidgetA extends StatelessWidget {
@@ -270,7 +270,7 @@
   }
 
   Future<void> test_children_closure_expressionBody() async {
-    newFile('/home/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 import 'package:flutter/widgets.dart';
 
 class WidgetA extends StatelessWidget {
@@ -443,7 +443,7 @@
   }
 
   Future<void> test_parentAssociationLabel() async {
-    newFile('/home/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 import 'package:flutter/widgets.dart';
 
 class WidgetA extends StatelessWidget {
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 0f7483d..5504afb 100644
--- a/pkg/analysis_server/test/src/plugin/notification_manager_test.dart
+++ b/pkg/analysis_server/test/src/plugin/notification_manager_test.dart
@@ -468,23 +468,10 @@
   server.Notification? sentNotification;
 
   @override
-  void close() {
-    fail('Unexpected invocation of close');
-  }
-
-  @override
-  void listen(void Function(server.Request) onRequest,
-      {Function? onError, void Function()? onDone}) {
-    fail('Unexpected invocation of listen');
-  }
+  dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 
   @override
   void sendNotification(server.Notification notification) {
     sentNotification = notification;
   }
-
-  @override
-  void sendResponse(server.Response response) {
-    fail('Unexpected invocation of sendResponse');
-  }
 }
diff --git a/pkg/analysis_server/test/src/services/completion/dart/suggestion_builder_test.dart b/pkg/analysis_server/test/src/services/completion/dart/suggestion_builder_test.dart
index 8c8bc43..9f66816 100644
--- a/pkg/analysis_server/test/src/services/completion/dart/suggestion_builder_test.dart
+++ b/pkg/analysis_server/test/src/services/completion/dart/suggestion_builder_test.dart
@@ -27,7 +27,7 @@
   }
 
   Future<CompletionSuggestion> forTopLevelFunction(String functionName) async {
-    var request = DartCompletionRequest(
+    var request = DartCompletionRequest.forResolvedUnit(
       resolvedUnit: testAnalysisResult,
       offset: 0,
     );
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
index a12a654..c9d3b7f 100644
--- 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
@@ -84,7 +84,7 @@
   }
 
   Future<void> test_declaredIdentifier_addImport_dartUri() async {
-    addSource('/home/test/lib/my_lib.dart', r'''
+    addSource('$testPackageLibPath/my_lib.dart', r'''
 import 'dart:collection';
 List<HashMap<String, int>> getMap() => null;
 ''');
@@ -173,7 +173,7 @@
   }
 
   Future<void> test_local_addImport_dartUri() async {
-    addSource('/home/test/lib/my_lib.dart', r'''
+    addSource('$testPackageLibPath/my_lib.dart', r'''
 import 'dart:collection';
 HashMap<String, int> getMap() => null;
 ''');
@@ -194,7 +194,7 @@
   }
 
   Future<void> test_local_addImport_notLibraryUnit() async {
-    addSource('/home/test/lib/my_lib.dart', r'''
+    addSource('$testPackageLibPath/my_lib.dart', r'''
 import 'dart:collection';
 HashMap<String, int> getMap() => null;
 ''');
@@ -211,7 +211,7 @@
 }
 ''');
 
-    var appPath = convertPath('/home/test/lib/app.dart');
+    var appPath = convertPath('$testPackageLibPath/app.dart');
     addSource(appPath, appCode);
     await analyzeTestPackageFiles();
     await resolveTestFile();
@@ -646,7 +646,7 @@
   }
 
   Future<void> test_privateType_closureParameter() async {
-    addSource('/home/test/lib/my_lib.dart', '''
+    addSource('$testPackageLibPath/my_lib.dart', '''
 library my_lib;
 class A {}
 class _B extends A {}
@@ -662,7 +662,7 @@
   }
 
   Future<void> test_privateType_declaredIdentifier() async {
-    addSource('/home/test/lib/my_lib.dart', '''
+    addSource('$testPackageLibPath/my_lib.dart', '''
 library my_lib;
 class A {}
 class _B extends A {}
@@ -683,7 +683,7 @@
   Future<void> 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', '''
+    addSource('$testPackageLibPath/my_lib.dart', '''
 library my_lib;
 class A {}
 class _B extends A {}
@@ -721,7 +721,7 @@
   }
 
   Future<void> test_privateType_variable() async {
-    addSource('/home/test/lib/my_lib.dart', '''
+    addSource('$testPackageLibPath/my_lib.dart', '''
 library my_lib;
 class A {}
 class _B extends A {}
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
index 4f99ef9..37f3d66 100644
--- 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
@@ -20,12 +20,12 @@
   AssistKind get kind => DartAssistKind.CONVERT_PART_OF_TO_URI;
 
   Future<void> test_nonSibling() async {
-    addSource('/home/test/lib/foo.dart', '''
+    addSource('$testPackageLibPath/foo.dart', '''
 library foo;
 part 'src/bar.dart';
 ''');
 
-    testFile = convertPath('/home/test/lib/src/bar.dart');
+    testFile = convertPath('$testPackageLibPath/src/bar.dart');
     addTestSource('''
 part of foo;
 ''');
@@ -38,12 +38,12 @@
   }
 
   Future<void> test_sibling() async {
-    addSource('/home/test/lib/foo.dart', '''
+    addSource('$testPackageLibPath/foo.dart', '''
 library foo;
 part 'bar.dart';
 ''');
 
-    testFile = convertPath('/home/test/lib/bar.dart');
+    testFile = convertPath('$testPackageLibPath/bar.dart');
     addTestSource('''
 part of foo;
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_package_import_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_package_import_test.dart
index 1fe3d84..3665770 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_package_import_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_package_import_test.dart
@@ -21,7 +21,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_TO_PACKAGE_IMPORT;
 
   Future<void> test_fileName_onImport() async {
-    addSource('/home/test/lib/foo.dart', '');
+    addSource('$testPackageLibPath/foo.dart', '');
 
     await resolveTestCode('''
 import 'foo.dart';
@@ -33,7 +33,7 @@
   }
 
   Future<void> test_fileName_onUri() async {
-    addSource('/home/test/lib/foo.dart', '');
+    addSource('$testPackageLibPath/foo.dart', '');
 
     await resolveTestCode('''
 import 'foo.dart';
@@ -52,8 +52,8 @@
   }
 
   Future<void> test_nonPackage_Uri() async {
-    addSource('/home/test/lib/foo.dart', '');
-    testFile = convertPath('/home/test/lib/src/test.dart');
+    addSource('$testPackageLibPath/foo.dart', '');
+    testFile = convertPath('$testPackageLibPath/src/test.dart');
     await resolveTestCode('''
 import 'dart:core';
 ''');
@@ -63,7 +63,7 @@
   }
 
   Future<void> test_packageUri() async {
-    addSource('/home/test/lib/foo.dart', '');
+    addSource('$testPackageLibPath/foo.dart', '');
 
     await resolveTestCode('''
 import 'package:test/foo.dart';
@@ -73,9 +73,9 @@
   }
 
   Future<void> test_path() async {
-    addSource('/home/test/lib/foo/bar.dart', '');
+    addSource('$testPackageLibPath/foo/bar.dart', '');
 
-    testFile = convertPath('/home/test/lib/src/test.dart');
+    testFile = convertPath('$testPackageLibPath/src/test.dart');
 
     await resolveTestCode('''
 import '../foo/bar.dart';
@@ -89,7 +89,7 @@
   Future<void> test_relativeImport_noAssistWithLint() async {
     createAnalysisOptionsFile(lints: [LintNames.avoid_relative_lib_imports]);
     verifyNoTestUnitErrors = false;
-    addSource('/home/test/lib/foo.dart', '');
+    addSource('$testPackageLibPath/foo.dart', '');
 
     await resolveTestCode('''
 import '../lib/foo.dart';
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
index 58b527a..320890d 100644
--- 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
@@ -85,7 +85,7 @@
   }
 
   Future<void> test_setterOnDirective() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 void set setter(int i) {}
 ''');
     await resolveTestCode('''
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
index 4fb3e72..b02dad3 100644
--- 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
@@ -120,7 +120,7 @@
   }
 
   Future<void> test_privateType() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   _B b => _B();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart
index 8ff04db..6cc2306 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart
@@ -40,7 +40,7 @@
   FixKind get kind => DartFixKind.ADD_LATE;
 
   Future<void> test_changeInImportedLib() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class C {
   final String s;
 }
@@ -56,11 +56,11 @@
 class C {
   late final String s;
 }
-''', target: '/home/test/lib/a.dart');
+''', target: '$testPackageLibPath/a.dart');
   }
 
   Future<void> test_changeInPart() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 part 'test.dart';
 
 class C {
@@ -80,7 +80,7 @@
 class C {
   late final String s;
 }
-''', target: '/home/test/lib/a.dart');
+''', target: '$testPackageLibPath/a.dart');
   }
 
   Future<void> test_withFinal() async {
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
index dc08b79..798725d 100644
--- 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
@@ -102,7 +102,7 @@
   }
 
   Future<void> test_constructor_single() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {
   A({required int a}) {}
 }
@@ -126,7 +126,7 @@
   }
 
   Future<void> test_constructor_single_closure() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 typedef void VoidCallback();
 
 class A {
@@ -152,7 +152,7 @@
   }
 
   Future<void> test_constructor_single_closure2() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 typedef void Callback(e);
 
 class A {
@@ -178,7 +178,7 @@
   }
 
   Future<void> test_constructor_single_closure3() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 typedef void Callback(a,b,c);
 
 class A {
@@ -204,7 +204,7 @@
   }
 
   Future<void> test_constructor_single_closure4() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 typedef int Callback(int a, String b,c);
 
 class A {
@@ -230,7 +230,7 @@
   }
 
   Future<void> test_constructor_single_closure_nnbd() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 typedef int Callback(int? a);
 
 class A {
@@ -256,7 +256,7 @@
   }
 
   Future<void> test_constructor_single_closure_nnbd_from_legacy() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 // @dart = 2.8
 import 'package:meta/meta.dart';
 
@@ -287,7 +287,7 @@
   }
 
   Future<void> test_constructor_single_closure_nnbd_into_legacy() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 typedef int Callback(int? a);
 
 class A {
@@ -315,7 +315,7 @@
   }
 
   Future<void> test_constructor_single_list() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {
   A({required List<String> names}) {}
 }
@@ -338,6 +338,28 @@
 ''');
   }
 
+  Future<void> test_constructor_single_namedAnywhere() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class A {
+  A(int a, int b, {int? c, required int d}) {}
+}
+''');
+    await resolveTestCode('''
+import 'package:test/a.dart';
+
+void f() {
+  A(0, c: 1, 2);
+}
+''');
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+void f() {
+  A(0, c: 1, 2, d: null);
+}
+''');
+  }
+
   Future<void> test_multiple() async {
     await resolveTestCode('''
 test({required int a, required int bcd}) {}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_null_check_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_null_check_test.dart
index 5cb45e5..65b56f4 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_null_check_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_null_check_test.dart
@@ -363,7 +363,7 @@
 }
 ''',
         errorFilter: (AnalysisError error) =>
-            error.errorCode != CompileTimeErrorCode.YIELD_OF_INVALID_TYPE);
+            error.errorCode != CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE);
   }
 
   Future<void> test_yieldEach_localFunction() async {
@@ -402,7 +402,7 @@
 }
 ''',
         errorFilter: (AnalysisError error) =>
-            error.errorCode != CompileTimeErrorCode.YIELD_OF_INVALID_TYPE);
+            error.errorCode != CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE);
   }
 
   Future<void> test_yieldEach_topLevel() async {
@@ -417,6 +417,6 @@
 }
 ''',
         errorFilter: (AnalysisError error) =>
-            error.errorCode != CompileTimeErrorCode.YIELD_OF_INVALID_TYPE);
+            error.errorCode != CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE);
   }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_return_type_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_return_type_test.dart
index 1a40007..e00bd37 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_return_type_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_return_type_test.dart
@@ -179,7 +179,7 @@
   }
 
   Future<void> test_privateType() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   _B b => _B();
 }
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
index 63abb76..12c14cf3 100644
--- 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
@@ -58,12 +58,12 @@
   }
 
   Future<void> test_method_importType() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {
   static foo() {}
 }
 ''');
-    addSource('/home/test/lib/b.dart', r'''
+    addSource('$testPackageLibPath/b.dart', r'''
 import 'package:test/a.dart';
 
 class B extends A {}
@@ -142,12 +142,12 @@
   }
 
   Future<void> test_property_importType() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {
   static get foo => null;
 }
 ''');
-    addSource('/home/test/lib/b.dart', r'''
+    addSource('$testPackageLibPath/b.dart', r'''
 import 'package:test/a.dart';
 
 class B extends A {}
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
index ca26deb..9db4307 100644
--- 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
@@ -57,7 +57,7 @@
   }
 
   Future<void> test_privateType() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   _B b => _B();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_package_import_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_package_import_test.dart
index e4952f3..c59880a 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_package_import_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_package_import_test.dart
@@ -24,7 +24,7 @@
   @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44673')
   Future<void> test_singleFile() async {
     writeTestPackageConfig(config: PackageConfigFileBuilder());
-    addSource('/home/test/lib/bar.dart', 'class Bar {}');
+    addSource('$testPackageLibPath/bar.dart', 'class Bar {}');
 
     testFile = convertPath('/home/test/tool/test.dart');
 
@@ -55,7 +55,7 @@
     // This test fails because any attempt to specify a relative path that
     // includes 'lib' (which the lint requires) results in a malformed URI when
     // trying to resolve the import.
-    newFile('/home/test/lib/foo/bar.dart', content: '''
+    newFile('$testPackageLibPath/foo/bar.dart', content: '''
 class C {}
 ''');
     await resolveTestCode('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_relative_import_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_relative_import_test.dart
index 260d20f..dfd5961 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_relative_import_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_relative_import_test.dart
@@ -23,13 +23,13 @@
   String get lintCode => LintNames.prefer_relative_imports;
 
   Future<void> test_singleFile() async {
-    addSource('/home/test/lib/foo.dart', '''
+    addSource('$testPackageLibPath/foo.dart', '''
 class C {}
 ''');
-    addSource('/home/test/lib/bar.dart', '''
+    addSource('$testPackageLibPath/bar.dart', '''
 class D {}
 ''');
-    testFile = convertPath('/home/test/lib/src/test.dart');
+    testFile = convertPath('$testPackageLibPath/src/test.dart');
 
     await resolveTestCode('''
 import 'package:test/bar.dart';
@@ -55,10 +55,10 @@
   String get lintCode => LintNames.prefer_relative_imports;
 
   Future<void> test_relativeImport() async {
-    addSource('/home/test/lib/foo.dart', '''
+    addSource('$testPackageLibPath/foo.dart', '''
 class C {}
 ''');
-    testFile = convertPath('/home/test/lib/src/test.dart');
+    testFile = convertPath('$testPackageLibPath/src/test.dart');
     await resolveTestCode('''
 import 'package:test/foo.dart';
 C? c;
@@ -82,8 +82,8 @@
   }
 
   Future<void> test_relativeImportGarbledUri() async {
-    addSource('/home/test/lib/foo.dart', '');
-    testFile = convertPath('/home/test/lib/bar.dart');
+    addSource('$testPackageLibPath/foo.dart', '');
+    testFile = convertPath('$testPackageLibPath/bar.dart');
     await resolveTestCode('''
 import 'package:test/foo';
 ''');
@@ -96,10 +96,10 @@
   }
 
   Future<void> test_relativeImportRespectQuoteStyle() async {
-    addSource('/home/test/lib/foo.dart', '''
+    addSource('$testPackageLibPath/foo.dart', '''
 class C {}
 ''');
-    testFile = convertPath('/home/test/lib/bar.dart');
+    testFile = convertPath('$testPackageLibPath/bar.dart');
     await resolveTestCode('''
 import "package:test/foo.dart";
 C? c;
@@ -112,10 +112,10 @@
   }
 
   Future<void> test_relativeImportSameDirectory() async {
-    addSource('/home/test/lib/foo.dart', '''
+    addSource('$testPackageLibPath/foo.dart', '''
 class C {}
 ''');
-    testFile = convertPath('/home/test/lib/bar.dart');
+    testFile = convertPath('$testPackageLibPath/bar.dart');
     await resolveTestCode('''
 import 'package:test/foo.dart';
 C? c;
@@ -128,10 +128,10 @@
   }
 
   Future<void> test_relativeImportSubDirectory() async {
-    addSource('/home/test/lib/baz/foo.dart', '''
+    addSource('$testPackageLibPath/baz/foo.dart', '''
 class C {}
 ''');
-    testFile = convertPath('/home/test/lib/test.dart');
+    testFile = convertPath('$testPackageLibPath/test.dart');
     await resolveTestCode('''
 import 'package:test/baz/foo.dart';
 C? c;
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
index b8df672..976bef5 100644
--- 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
@@ -73,7 +73,7 @@
   }
 
   Future<void> test_inLibraryOfPrefix() async {
-    addSource('/home/test/lib/lib.dart', r'''
+    addSource('$testPackageLibPath/lib.dart', r'''
 class A {}
 ''');
 
@@ -92,7 +92,7 @@
 
 class Test {
 }
-''', target: '/home/test/lib/lib.dart');
+''', target: '$testPackageLibPath/lib.dart');
     expect(change.linkedEditGroups, hasLength(1));
   }
 
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
index 4831635..5a61202 100644
--- 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
@@ -50,10 +50,10 @@
   }
 
   Future<void> test_importType() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {}
 ''');
-    addSource('/home/test/lib/b.dart', r'''
+    addSource('$testPackageLibPath/b.dart', r'''
 import 'package:test/a.dart';
 
 class B {
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
index 8b98fb5..96d0f22 100644
--- 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
@@ -41,7 +41,7 @@
   FixKind get kind => DartFixKind.CREATE_CONSTRUCTOR;
 
   Future<void> test_inLibrary_insteadOfSyntheticDefault() async {
-    var a = newFile('/home/test/lib/a.dart', content: '''
+    var a = newFile('$testPackageLibPath/a.dart', content: '''
 /// $_text200
 class A {}
 ''').path;
@@ -61,7 +61,7 @@
   }
 
   Future<void> test_inLibrary_named() async {
-    var a = newFile('/home/test/lib/a.dart', content: '''
+    var a = newFile('$testPackageLibPath/a.dart', content: '''
 /// $_text200
 class A {}
 ''').path;
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
index 1e0b056..af26bc4 100644
--- 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
@@ -131,7 +131,7 @@
   }
 
   Future<void> test_getter_qualified_instance_differentLibrary() async {
-    addSource('/home/test/lib/other.dart', '''
+    addSource('$testPackageLibPath/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
@@ -161,7 +161,7 @@
 class A {
   int test;
 }
-''', target: '/home/test/lib/other.dart');
+''', target: '$testPackageLibPath/other.dart');
   }
 
   Future<void> test_getter_qualified_instance_dynamicType() async {
@@ -317,11 +317,11 @@
   }
 
   Future<void> test_importType() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {}
 ''');
 
-    addSource('/home/test/lib/b.dart', r'''
+    addSource('$testPackageLibPath/b.dart', r'''
 import 'package:test/a.dart';
 
 A getA() => null;
@@ -365,7 +365,7 @@
   }
 
   Future<void> test_inPart_imported() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 part of lib;
 class A {}
 ''');
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
index 988c679..f9e4644 100644
--- 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
@@ -29,7 +29,7 @@
     var fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
     var fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/home/test/lib/my_file.dart'));
+    expect(fileEdit.file, convertPath('$testPackageLibPath/my_file.dart'));
     expect(fileEdit.fileStamp, -1);
     expect(fileEdit.edits, hasLength(1));
     expect(
@@ -47,7 +47,7 @@
     var fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
     var fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/home/test/lib/my_file.dart'));
+    expect(fileEdit.file, convertPath('$testPackageLibPath/my_file.dart'));
     expect(fileEdit.fileStamp, -1);
     expect(fileEdit.edits, hasLength(1));
     expect(
@@ -72,7 +72,7 @@
     var fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
     var fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/home/test/lib/a/bb/my_lib.dart'));
+    expect(fileEdit.file, convertPath('$testPackageLibPath/a/bb/my_lib.dart'));
     expect(fileEdit.fileStamp, -1);
     expect(fileEdit.edits, hasLength(1));
     expect(
@@ -110,7 +110,7 @@
     var fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
     var fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/home/test/lib/my_part.dart'));
+    expect(fileEdit.file, convertPath('$testPackageLibPath/my_part.dart'));
     expect(fileEdit.fileStamp, -1);
     expect(fileEdit.edits, hasLength(1));
     expect(fileEdit.edits[0].replacement, contains("part of 'test.dart';"));
@@ -125,7 +125,7 @@
     var fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
     var fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/home/test/lib/foo/my_part.dart'));
+    expect(fileEdit.file, convertPath('$testPackageLibPath/foo/my_part.dart'));
     expect(fileEdit.fileStamp, -1);
     expect(fileEdit.edits, hasLength(1));
     expect(fileEdit.edits[0].replacement, contains("part of '../test.dart';"));
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
index 2d663fc..1018a76 100644
--- 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
@@ -259,10 +259,10 @@
   }
 
   Future<void> test_functionType_importType() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {}
 ''');
-    addSource('/home/test/lib/b.dart', r'''
+    addSource('$testPackageLibPath/b.dart', r'''
 import 'package:test/a.dart';
 
 useFunction(int g(A a)) {}
@@ -348,7 +348,7 @@
   }
 
   Future<void> test_importType() async {
-    addSource('/home/test/lib/lib.dart', r'''
+    addSource('$testPackageLibPath/lib.dart', r'''
 library lib;
 import 'dart:async';
 Future getFuture() => null;
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
index 7c382e6..7566168 100644
--- 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
@@ -249,7 +249,7 @@
   }
 
   Future<void> test_qualified_instance_differentLibrary() async {
-    addSource('/home/test/lib/other.dart', '''
+    addSource('$testPackageLibPath/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
@@ -279,7 +279,7 @@
 class A {
   int get test => null;
 }
-''', target: '/home/test/lib/other.dart');
+''', target: '$testPackageLibPath/other.dart');
   }
 
   Future<void> test_qualified_instance_dynamicType() async {
@@ -307,7 +307,7 @@
   }
 
   Future<void> test_qualified_instance_inPart_imported() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 part of lib;
 
 class A {}
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
index 185784b..dbfcc51 100644
--- 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
@@ -834,8 +834,8 @@
 }
 ''';
 
-    addSource('/home/test/lib/test2.dart', code2);
-    addSource('/home/test/lib/test3.dart', r'''
+    addSource('$testPackageLibPath/test2.dart', code2);
+    addSource('$testPackageLibPath/test3.dart', r'''
 library test3;
 class E {}
 ''');
@@ -855,11 +855,11 @@
 class D {
   void foo(bbb.E e) {}
 }
-''', target: '/home/test/lib/test2.dart');
+''', target: '$testPackageLibPath/test2.dart');
   }
 
   Future<void> test_parameterType_inTargetUnit() async {
-    addSource('/home/test/lib/test2.dart', r'''
+    addSource('$testPackageLibPath/test2.dart', r'''
 class D {
 }
 
@@ -880,7 +880,7 @@
 }
 
 class E {}
-''', target: '/home/test/lib/test2.dart');
+''', target: '$testPackageLibPath/test2.dart');
   }
 
   Future<void> test_static() async {
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
index b0871a1..fb68eca 100644
--- 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
@@ -35,7 +35,7 @@
     var libCode = r'''
 class A {}
 ''';
-    addSource('/home/test/lib/lib.dart', libCode);
+    addSource('$testPackageLibPath/lib.dart', libCode);
     await resolveTestCode('''
 import 'lib.dart' as lib;
 
@@ -50,7 +50,7 @@
 
 mixin Test {
 }
-''', target: '/home/test/lib/lib.dart');
+''', target: '$testPackageLibPath/lib.dart');
     expect(change.linkedEditGroups, hasLength(1));
   }
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart
index 4534817..fea7674 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart
@@ -245,7 +245,7 @@
   }
 
   Future<void> test_qualified_instance_differentLibrary() async {
-    addSource('/home/test/lib/other.dart', '''
+    addSource('$testPackageLibPath/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
@@ -274,7 +274,7 @@
 class A {
   set test(int test) {}
 }
-''', target: '/home/test/lib/other.dart');
+''', target: '$testPackageLibPath/other.dart');
   }
 
   Future<void> test_qualified_instance_dynamicType() async {
@@ -302,7 +302,7 @@
   }
 
   Future<void> test_qualified_instance_inPart_imported() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 part of lib;
 
 class A {}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test.dart
index cb280c7..82353b0 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test.dart
@@ -1134,7 +1134,7 @@
     - kind: 'rename'
       newName: 'New'
 ''');
-    addSource('/home/test/lib/test.config', '''
+    addSource('$testPackageLibPath/test.config', '''
 'Rename to New':
   bulkApply: true
 ''');
@@ -1169,7 +1169,9 @@
 import '$importUri';
 void f(Old p) {}
 ''');
-    await assertNoFix();
+    await assertHasFix('''
+void f(Old p) {}
+''');
   }
 }
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/incompatible_element_kind_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/incompatible_element_kind_test.dart
new file mode 100644
index 0000000..4561ddd
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/incompatible_element_kind_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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/data_driven/transform_set_error_code.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../transform_set_parser_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(IncompatibleElementKindTest);
+  });
+}
+
+@reflectiveTest
+class IncompatibleElementKindTest extends AbstractTransformSetParserTest {
+  void test_integer() {
+    assertErrors('''
+version: 1
+transforms:
+- title: 'Replace'
+  date: 2021-11-30
+  element:
+    uris: ['test.dart']
+    method: 'm'
+    inClass: 'C'
+  changes:
+    - kind: 'replacedBy'
+      newElement:
+        uris: ['test.dart']
+        variable: 'v'
+''', [
+      error(TransformSetErrorCode.incompatibleElementKind, 191, 42),
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_change_for_kind_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_change_for_kind_test.dart
new file mode 100644
index 0000000..ee118e9
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_change_for_kind_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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/data_driven/transform_set_error_code.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../transform_set_parser_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidChangeForKindTest);
+  });
+}
+
+@reflectiveTest
+class InvalidChangeForKindTest extends AbstractTransformSetParserTest {
+  void test_integer() {
+    assertErrors('''
+version: 1
+transforms:
+- title: 'Replace'
+  date: 2021-11-30
+  element:
+    uris: ['test.dart']
+    class: 'C'
+  changes:
+    - kind: 'replacedBy'
+      newElement:
+        uris: ['test.dart']
+        class: 'D'
+''', [
+      error(TransformSetErrorCode.invalidChangeForKind, 173, 39),
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/test_all.dart
index bb2464ae..375c983 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/test_all.dart
@@ -6,6 +6,8 @@
 
 import 'conflicting_key_test.dart' as conflicting_key;
 import 'expected_primary_test.dart' as expected_primary;
+import 'incompatible_element_kind_test.dart' as incompatible_element_kind;
+import 'invalid_change_for_kind_test.dart' as invalid_change_for_kind;
 import 'invalid_character_test.dart' as invalid_character;
 import 'invalid_key_test.dart' as invalid_key;
 import 'invalid_parameter_style_test.dart' as invalid_parameter_style;
@@ -21,6 +23,7 @@
 import 'unexpected_token_test.dart' as unexpected_token;
 import 'unknown_accessor_test.dart' as unknown_accessor;
 import 'unsupported_key_test.dart' as unsupported_key;
+import 'unsupported_uri_change_test.dart' as unsupported_uri_change;
 import 'unsupported_version_test.dart' as unsupported_version;
 import 'wrong_token_test.dart' as wrong_token;
 import 'yaml_syntax_error_test.dart' as yaml_syntax_error;
@@ -29,6 +32,8 @@
   defineReflectiveSuite(() {
     conflicting_key.main();
     expected_primary.main();
+    incompatible_element_kind.main();
+    invalid_change_for_kind.main();
     invalid_character.main();
     invalid_key.main();
     invalid_parameter_style.main();
@@ -44,6 +49,7 @@
     unexpected_token.main();
     unknown_accessor.main();
     unsupported_key.main();
+    unsupported_uri_change.main();
     unsupported_version.main();
     wrong_token.main();
     yaml_syntax_error.main();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/unsupported_uri_change_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/unsupported_uri_change_test.dart
new file mode 100644
index 0000000..ecc493a
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/unsupported_uri_change_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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/data_driven/transform_set_error_code.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../transform_set_parser_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UnsupportedUriChangeTest);
+  });
+}
+
+@reflectiveTest
+class UnsupportedUriChangeTest extends AbstractTransformSetParserTest {
+  void test_integer() {
+    assertErrors('''
+version: 1
+transforms:
+- title: 'Replace'
+  date: 2021-11-30
+  element:
+    uris: ['test.dart']
+    function: 'f'
+  changes:
+    - kind: 'replacedBy'
+      newElement:
+        uris: ['other.dart']
+        function: 'g'
+''', [
+      error(TransformSetErrorCode.unsupportedUriChange, 182, 14),
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/element_matcher_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/element_matcher_test.dart
index e9e0363..16ec4ae 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/element_matcher_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/element_matcher_test.dart
@@ -41,8 +41,11 @@
 class ElementMatcherComponentAndKindTest extends AbstractElementMatcherTest {
   /// The kinds that are expected where a getter or setter is allowed.
   static List<ElementKind> accessorKinds = [
+    ElementKind.constantKind,
     ElementKind.fieldKind,
+    ElementKind.functionKind, // tear-off
     ElementKind.getterKind,
+    ElementKind.methodKind, // tear-off
     ElementKind.setterKind,
   ];
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/replaced_by_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/replaced_by_test.dart
new file mode 100644
index 0000000..03d89fe
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/replaced_by_test.dart
@@ -0,0 +1,1069 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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/data_driven/changes_selector.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/element_descriptor.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/element_kind.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/replaced_by.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'data_driven_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReplacedByTest);
+  });
+}
+
+@reflectiveTest
+class ReplacedByTest extends DataDrivenFixProcessorTest {
+  Future<void> test_defaultConstructor_defaultConstructor() async {
+    await _assertReplacement(
+      _Element.defaultConstructor(isDeprecated: true, isOld: true),
+      _Element.defaultConstructor(),
+      isInvocation: true,
+    );
+  }
+
+  Future<void> test_defaultConstructor_defaultConstructor_prefixed() async {
+    await _assertReplacement(
+      _Element.defaultConstructor(isDeprecated: true, isOld: true),
+      _Element.defaultConstructor(),
+      isInvocation: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_defaultConstructor_namedConstructor() async {
+    await _assertReplacement(
+      _Element.defaultConstructor(isDeprecated: true, isOld: true),
+      _Element.namedConstructor(),
+      isInvocation: true,
+    );
+  }
+
+  Future<void> test_defaultConstructor_namedConstructor_prefixed() async {
+    await _assertReplacement(
+      _Element.defaultConstructor(isDeprecated: true, isOld: true),
+      _Element.namedConstructor(),
+      isInvocation: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_enumConstant_enumConstant() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.constant(),
+    );
+  }
+
+  Future<void> test_enumConstant_enumConstant_prefixed() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.constant(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_enumConstant_staticField() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.field(isStatic: true),
+    );
+  }
+
+  Future<void> test_enumConstant_staticField_prefixed() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.field(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_enumConstant_staticGetter() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.getter(isStatic: true),
+    );
+  }
+
+  Future<void> test_enumConstant_staticGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.getter(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_enumConstant_topLevelGetter() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.topLevelGetter(),
+    );
+  }
+
+  Future<void> test_enumConstant_topLevelGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.topLevelGetter(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_enumConstant_topLevelVariable() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.topLevelVariable(),
+    );
+  }
+
+  Future<void> test_enumConstant_topLevelVariable_prefixed() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.topLevelVariable(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_function_function_invocation() async {
+    await _assertReplacement(
+      _Element.topLevelFunction(isDeprecated: true, isOld: true),
+      _Element.topLevelFunction(),
+      isInvocation: true,
+    );
+  }
+
+  Future<void> test_function_function_invocation_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelFunction(isDeprecated: true, isOld: true),
+      _Element.topLevelFunction(),
+      isInvocation: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_function_function_tearoff() async {
+    await _assertReplacement(
+      _Element.topLevelFunction(isDeprecated: true, isOld: true),
+      _Element.topLevelFunction(),
+    );
+  }
+
+  Future<void> test_function_function_tearoff_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelFunction(isDeprecated: true, isOld: true),
+      _Element.topLevelFunction(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_function_staticMethod_invocation() async {
+    await _assertReplacement(
+      _Element.topLevelFunction(isDeprecated: true, isOld: true),
+      _Element.method(isStatic: true),
+      isInvocation: true,
+    );
+  }
+
+  Future<void> test_function_staticMethod_invocation_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelFunction(isDeprecated: true, isOld: true),
+      _Element.method(isStatic: true),
+      isInvocation: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_function_staticMethod_tearoff() async {
+    await _assertReplacement(
+      _Element.topLevelFunction(isDeprecated: true, isOld: true),
+      _Element.method(isStatic: true),
+    );
+  }
+
+  Future<void> test_function_staticMethod_tearoff_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelFunction(isDeprecated: true, isOld: true),
+      _Element.method(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_namedConstructor_defaultConstructor() async {
+    await _assertReplacement(
+      _Element.namedConstructor(isDeprecated: true, isOld: true),
+      _Element.defaultConstructor(),
+      isInvocation: true,
+    );
+  }
+
+  Future<void> test_namedConstructor_defaultConstructor_prefixed() async {
+    await _assertReplacement(
+      _Element.namedConstructor(isDeprecated: true, isOld: true),
+      _Element.defaultConstructor(),
+      isInvocation: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_namedConstructor_namedConstructor() async {
+    await _assertReplacement(
+      _Element.namedConstructor(isDeprecated: true, isOld: true),
+      _Element.namedConstructor(),
+      isInvocation: true,
+    );
+  }
+
+  Future<void> test_namedConstructor_namedConstructor_prefixed() async {
+    await _assertReplacement(
+      _Element.namedConstructor(isDeprecated: true, isOld: true),
+      _Element.namedConstructor(),
+      isInvocation: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticField_enumConstant() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.constant(),
+    );
+  }
+
+  Future<void> test_staticField_enumConstant_prefixed() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.constant(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticField_staticField() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.field(isStatic: true),
+    );
+  }
+
+  Future<void> test_staticField_staticField_prefixed() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.field(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticField_staticGetter() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.getter(isStatic: true),
+    );
+  }
+
+  Future<void> test_staticField_staticGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.getter(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticField_staticSetter() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.setter(isStatic: true),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_staticField_staticSetter_prefixed() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.setter(isStatic: true),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticField_topLevelGetter() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelGetter(),
+    );
+  }
+
+  Future<void> test_staticField_topLevelGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelGetter(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticField_topLevelSetter() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelSetter(),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_staticField_topLevelSetter_prefixed() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelSetter(),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticField_topLevelVariable() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelVariable(),
+    );
+  }
+
+  Future<void> test_staticField_topLevelVariable_prefixed() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelVariable(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticGetter_enumConstant() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.constant(),
+    );
+  }
+
+  Future<void> test_staticGetter_enumConstant_prefixed() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.constant(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticGetter_staticField() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.field(isStatic: true),
+    );
+  }
+
+  Future<void> test_staticGetter_staticField_prefixed() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.field(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticGetter_staticGetter() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.getter(isStatic: true),
+    );
+  }
+
+  Future<void> test_staticGetter_staticGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.getter(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticGetter_topLevelGetter() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelGetter(),
+    );
+  }
+
+  Future<void> test_staticGetter_topLevelGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelGetter(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticGetter_topLevelVariable() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelVariable(),
+    );
+  }
+
+  Future<void> test_staticGetter_topLevelVariable_prefixed() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelVariable(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticMethod_function_invocation() async {
+    await _assertReplacement(
+      _Element.method(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelFunction(),
+      isInvocation: true,
+    );
+  }
+
+  Future<void> test_staticMethod_function_invocation_prefixed() async {
+    await _assertReplacement(
+      _Element.method(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelFunction(),
+      isInvocation: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticMethod_function_tearoff() async {
+    await _assertReplacement(
+      _Element.method(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelFunction(),
+    );
+  }
+
+  Future<void> test_staticMethod_function_tearoff_prefixed() async {
+    await _assertReplacement(
+      _Element.method(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelFunction(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticMethod_staticMethod_invocation() async {
+    await _assertReplacement(
+      _Element.method(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.method(isStatic: true),
+      isInvocation: true,
+    );
+  }
+
+  Future<void> test_staticMethod_staticMethod_invocation_prefixed() async {
+    await _assertReplacement(
+      _Element.method(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.method(isStatic: true),
+      isInvocation: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticMethod_staticMethod_tearoff() async {
+    await _assertReplacement(
+      _Element.method(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.method(isStatic: true),
+    );
+  }
+
+  Future<void> test_staticMethod_staticMethod_tearoff_prefixed() async {
+    await _assertReplacement(
+      _Element.method(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.method(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticSetter_staticField() async {
+    await _assertReplacement(
+      _Element.setter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.field(isStatic: true),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_staticSetter_staticField_prefixed() async {
+    await _assertReplacement(
+      _Element.setter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.field(isStatic: true),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticSetter_staticSetter() async {
+    await _assertReplacement(
+      _Element.setter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.setter(isStatic: true),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_staticSetter_staticSetter_prefixed() async {
+    await _assertReplacement(
+      _Element.setter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.setter(isStatic: true),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticSetter_topLevelSetter() async {
+    await _assertReplacement(
+      _Element.setter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelSetter(),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_staticSetter_topLevelSetter_prefixed() async {
+    await _assertReplacement(
+      _Element.setter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelSetter(),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticSetter_topLevelVariable() async {
+    await _assertReplacement(
+      _Element.setter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelVariable(),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_staticSetter_topLevelVariable_prefixed() async {
+    await _assertReplacement(
+      _Element.setter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelVariable(),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelGetter_enumConstant() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.constant(),
+    );
+  }
+
+  Future<void> test_topLevelGetter_enumConstant_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.constant(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelGetter_staticField() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.field(isStatic: true),
+    );
+  }
+
+  Future<void> test_topLevelGetter_staticField_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.field(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelGetter_staticGetter() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.getter(isStatic: true),
+    );
+  }
+
+  Future<void> test_topLevelGetter_staticGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.getter(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelGetter_topLevelGetter() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.topLevelGetter(),
+    );
+  }
+
+  Future<void> test_topLevelGetter_topLevelGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.topLevelGetter(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelGetter_topLevelVariable() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.topLevelVariable(),
+    );
+  }
+
+  Future<void> test_topLevelGetter_topLevelVariable_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.topLevelVariable(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelSetter_staticField() async {
+    await _assertReplacement(
+      _Element.topLevelSetter(isDeprecated: true, isOld: true),
+      _Element.field(isStatic: true),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_topLevelSetter_staticField_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelSetter(isDeprecated: true, isOld: true),
+      _Element.field(isStatic: true),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelSetter_staticSetter() async {
+    await _assertReplacement(
+      _Element.topLevelSetter(isDeprecated: true, isOld: true),
+      _Element.setter(isStatic: true),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_topLevelSetter_staticSetter_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelSetter(isDeprecated: true, isOld: true),
+      _Element.setter(isStatic: true),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelSetter_topLevelSetter() async {
+    await _assertReplacement(
+      _Element.topLevelSetter(isDeprecated: true, isOld: true),
+      _Element.topLevelSetter(),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_topLevelSetter_topLevelSetter_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelSetter(isDeprecated: true, isOld: true),
+      _Element.topLevelSetter(),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelSetter_topLevelVariable() async {
+    await _assertReplacement(
+      _Element.topLevelSetter(isDeprecated: true, isOld: true),
+      _Element.topLevelVariable(),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_topLevelSetter_topLevelVariable_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelSetter(isDeprecated: true, isOld: true),
+      _Element.topLevelVariable(),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelVariable_enumConstant() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.constant(),
+    );
+  }
+
+  Future<void> test_topLevelVariable_enumConstant_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.constant(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelVariable_staticField() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.field(isStatic: true),
+    );
+  }
+
+  Future<void> test_topLevelVariable_staticField_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.field(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelVariable_staticGetter() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.getter(isStatic: true),
+    );
+  }
+
+  Future<void> test_topLevelVariable_staticGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.getter(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelVariable_staticSetter() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.setter(isStatic: true),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_topLevelVariable_staticSetter_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.setter(isStatic: true),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelVariable_topLevelGetter() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.topLevelGetter(),
+    );
+  }
+
+  Future<void> test_topLevelVariable_topLevelGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.topLevelGetter(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelVariable_topLevelSetter() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.topLevelSetter(),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_topLevelVariable_topLevelSetter_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.topLevelSetter(),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelVariable_topLevelVariable() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.topLevelVariable(),
+    );
+  }
+
+  Future<void> test_topLevelVariable_topLevelVariable_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.topLevelVariable(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> _assertReplacement(_Element oldElement, _Element newElement,
+      {bool isAssignment = false,
+      bool isInvocation = false,
+      bool isPrefixed = false}) async {
+    assert(!(isAssignment && isInvocation));
+    setPackageContent('''
+${oldElement.declaration}
+${newElement.declaration}
+''');
+    setPackageData(_replacedBy(oldElement.kind, oldElement.components,
+        newElement.kind, newElement.components));
+    var prefixDeclaration = isPrefixed ? ' as p' : '';
+    var prefixReference = isPrefixed ? 'p.' : '';
+    var invocation = isInvocation ? '()' : '';
+    if (isAssignment) {
+      await resolveTestCode('''
+import '$importUri'$prefixDeclaration;
+
+void g() {
+  $prefixReference${oldElement.reference} = 0;
+}
+''');
+      await assertHasFix('''
+import '$importUri'$prefixDeclaration;
+
+void g() {
+  $prefixReference${newElement.reference} = 0;
+}
+''');
+      return;
+    }
+    await resolveTestCode('''
+import '$importUri'$prefixDeclaration;
+
+var x = $prefixReference${oldElement.reference}$invocation;
+''');
+    await assertHasFix('''
+import '$importUri'$prefixDeclaration;
+
+var x = $prefixReference${newElement.reference}$invocation;
+''');
+  }
+
+  Transform _replacedBy(ElementKind oldKind, List<String> oldComponents,
+      ElementKind newKind, List<String> newComponents) {
+    var uris = [Uri.parse(importUri)];
+    var oldElement = ElementDescriptor(
+        libraryUris: uris, kind: oldKind, components: oldComponents);
+    var newElement2 = ElementDescriptor(
+        libraryUris: uris, kind: newKind, components: newComponents);
+    return Transform(
+        title: 'title',
+        date: DateTime.now(),
+        element: oldElement,
+        bulkApply: true,
+        changesSelector: UnconditionalChangesSelector([
+          ReplacedBy(newElement: newElement2),
+        ]));
+  }
+}
+
+class _Element {
+  final ElementKind kind;
+  final List<String> components;
+  final String declaration;
+
+  _Element(this.kind, this.components, this.declaration);
+
+  // ignore: unused_element
+  factory _Element.class_({bool isDeprecated = false, bool isOld = false}) {
+    var name = isOld ? 'C_old' : 'C_new';
+    var annotation = _annotation(isDeprecated: isDeprecated, isTopLevel: true);
+    return _Element(
+      ElementKind.classKind,
+      [name],
+      '''
+${annotation}class $name {}''',
+    );
+  }
+
+  factory _Element.constant({bool isDeprecated = false, bool isOld = false}) {
+    var enumName = isOld ? 'E_old' : 'E_new';
+    var constantName = isOld ? 'c_old' : 'c_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    return _Element(
+      ElementKind.constantKind,
+      [constantName, enumName],
+      '''
+enum $enumName {
+  $annotation$constantName
+}''',
+    );
+  }
+
+  factory _Element.defaultConstructor(
+      {bool isDeprecated = false, bool isOld = false}) {
+    var className = isOld ? 'C_old' : 'C_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    return _Element(
+      ElementKind.constructorKind,
+      ['', className],
+      '''
+class $className {
+  $annotation$className();
+}''',
+    );
+  }
+
+  // ignore: unused_element
+  factory _Element.enum_({bool isDeprecated = false, bool isOld = false}) {
+    var enumName = isOld ? 'E_old' : 'E_new';
+    var constantName = isOld ? 'c_old' : 'c_new';
+    var annotation = _annotation(isDeprecated: isDeprecated, isTopLevel: true);
+    return _Element(
+      ElementKind.enumKind,
+      [enumName],
+      '''
+${annotation}enum $enumName { $constantName }''',
+    );
+  }
+
+  factory _Element.field(
+      {bool isDeprecated = false, bool isOld = false, bool isStatic = false}) {
+    var fieldName = isOld ? 'sf_old' : 'sf_new';
+    var className = isOld ? 'C_old' : 'C_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    var keyword = isStatic ? 'static ' : '';
+    return _Element(
+      ElementKind.fieldKind,
+      [fieldName, className],
+      '''
+class $className {
+  $annotation${keyword}int $fieldName = 0;
+}''',
+    );
+  }
+
+  factory _Element.getter(
+      {bool isDeprecated = false, bool isOld = false, bool isStatic = false}) {
+    var getterName = isOld ? 'g_old' : 'g_new';
+    var className = isOld ? 'C_old' : 'C_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    var keyword = isStatic ? 'static ' : '';
+    return _Element(
+      ElementKind.getterKind,
+      [getterName, className],
+      '''
+class $className {
+  $annotation${keyword}int get $getterName => 0;
+}''',
+    );
+  }
+
+  factory _Element.method(
+      {bool isDeprecated = false, bool isOld = false, bool isStatic = false}) {
+    var methodName = isOld ? 'm_old' : 'm_new';
+    var className = isOld ? 'C_old' : 'C_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    var keyword = isStatic ? 'static ' : '';
+    return _Element(
+      ElementKind.methodKind,
+      [methodName, className],
+      '''
+class $className {
+  $annotation${keyword}int $methodName() => 0;
+}''',
+    );
+  }
+
+  factory _Element.namedConstructor(
+      {bool isDeprecated = false, bool isOld = false}) {
+    var constructorName = isOld ? 'c_old' : 'c_new';
+    var className = isOld ? 'C_old' : 'C_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    return _Element(
+      ElementKind.constructorKind,
+      [constructorName, className],
+      '''
+class $className {
+  $annotation$className.$constructorName();
+}''',
+    );
+  }
+
+  factory _Element.setter(
+      {bool isDeprecated = false, bool isOld = false, bool isStatic = false}) {
+    var setterName = isOld ? 's_old' : 's_new';
+    var className = isOld ? 'C_old' : 'C_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    var keyword = isStatic ? 'static ' : '';
+    return _Element(
+      ElementKind.setterKind,
+      [setterName, className],
+      '''
+class $className {
+  $annotation${keyword}set $setterName(int v) {}
+}''',
+    );
+  }
+
+  factory _Element.topLevelFunction(
+      {bool isDeprecated = false, bool isOld = false}) {
+    var name = isOld ? 'f_old' : 'f_new';
+    var annotation = _annotation(isDeprecated: isDeprecated, isTopLevel: true);
+    return _Element(
+      ElementKind.functionKind,
+      [name],
+      '''
+${annotation}int $name() => 0;''',
+    );
+  }
+
+  factory _Element.topLevelGetter(
+      {bool isDeprecated = false, bool isOld = false}) {
+    var getterName = isOld ? 'g_old' : 'g_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    return _Element(
+      ElementKind.getterKind,
+      [getterName],
+      '''
+${annotation}int get $getterName => 0;''',
+    );
+  }
+
+  factory _Element.topLevelSetter(
+      {bool isDeprecated = false, bool isOld = false}) {
+    var setterName = isOld ? 's_old' : 's_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    return _Element(
+      ElementKind.setterKind,
+      [setterName],
+      '''
+${annotation}set $setterName(int v) {}''',
+    );
+  }
+
+  factory _Element.topLevelVariable(
+      {bool isDeprecated = false, bool isOld = false}) {
+    var name = isOld ? 'v_old' : 'v_new';
+    var annotation = _annotation(isDeprecated: isDeprecated, isTopLevel: true);
+    return _Element(
+      ElementKind.variableKind,
+      [name],
+      '''
+${annotation}int $name = 0;''',
+    );
+  }
+
+  // ignore: unused_element
+  factory _Element.typedef({bool isDeprecated = false, bool isOld = false}) {
+    var name = isOld ? 'T_old' : 'T_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    return _Element(
+      ElementKind.typedefKind,
+      [name],
+      '''
+${annotation}typedef $name = int Function();''',
+    );
+  }
+
+  String get reference {
+    if (components[0].isEmpty) {
+      return components[1];
+    }
+    return components.reversed.join('.');
+  }
+
+  static String _annotation(
+      {required bool isDeprecated, bool isTopLevel = false}) {
+    var indent = isTopLevel ? '' : '  ';
+    return isDeprecated ? '@deprecated\n$indent' : '';
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
index 64cffa2..544f27c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
@@ -15,6 +15,7 @@
 import 'modify_parameters_test.dart' as modify_parameters;
 import 'rename_parameter_test.dart' as rename_parameter;
 import 'rename_test.dart' as rename;
+import 'replaced_by_test.dart' as replaced_by;
 import 'sdk_fix_test.dart' as sdk_fix;
 import 'transform_override_set_parser_test.dart'
     as transform_override_set_parser;
@@ -34,6 +35,7 @@
     modify_parameters.main();
     rename_parameter.main();
     rename.main();
+    replaced_by.main();
     sdk_fix.main();
     transform_override_set_parser.main();
     transform_set_manager.main();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
index 42d762b..4205071 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
@@ -33,7 +33,7 @@
 
     addSource('/home/test/pubspec.yaml', '');
 
-    var testFile = convertPath('/home/test/lib/test.dart');
+    var testFile = convertPath('$testPackageLibPath/test.dart');
     addSource(testFile, '');
     var result = await session.getResolvedLibraryValid(testFile);
     var sets = manager.forLibrary(result.element);
@@ -44,7 +44,7 @@
     // addTestPackageDependency('p1', '/.pub-cache/p1');
     // addTestPackageDependency('p2', '/.pub-cache/p2');
     addSource('/home/test/pubspec.yaml', '');
-    var testFile = convertPath('/home/test/lib/test.dart');
+    var testFile = convertPath('$testPackageLibPath/test.dart');
     addSource(testFile, '');
     var result = await session.getResolvedLibraryValid(testFile);
     var sets = manager.forLibrary(result.element);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
index 08c69d5..51421b4 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
@@ -7,11 +7,13 @@
 import 'package:analysis_server/src/services/correction/fix/data_driven/change.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/changes_selector.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/code_template.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/element_kind.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/element_matcher.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/expression.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/modify_parameters.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/parameter_reference.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/rename.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/replaced_by.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_error_code.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/value_generator.dart';
@@ -673,6 +675,34 @@
     expect(rename.newName, 'B');
   }
 
+  void test_replacedBy() {
+    assertNoErrors('''
+version: 1
+transforms:
+- title: 'Replace'
+  date: 2021-11-30
+  element:
+    uris: ['test.dart']
+    function: 'f'
+  changes:
+    - kind: 'replacedBy'
+      newElement:
+        uris: ['test.dart']
+        method: 'm'
+        inClass: 'C'
+''');
+    var transforms = _transforms('f');
+    expect(transforms, hasLength(1));
+    var transform = transforms[0];
+    expect(transform.title, 'Replace');
+    var changes = _changes(transform);
+    expect(changes, hasLength(1));
+    var change = changes[0] as ReplacedBy;
+    var newElement = change.newElement;
+    expect(newElement.kind, ElementKind.methodKind);
+    expect(newElement.components, ['m', 'C']);
+  }
+
   void test_requiredIf() {
     assertNoErrors('''
 version: 1
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
index 00f2730..50411cb 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
@@ -87,9 +87,11 @@
   /// neither [assertHasFix] nor [assertHasFixAllFix] has been invoked.
   late String resultCode;
 
-  /// Return a list of the experiments that are to be enabled for tests in this
-  /// class, or `null` if there are no experiments that should be enabled.
-  List<String>? get experiments => null;
+  /// The processor used to compute bulk fixes.
+  late BulkFixProcessor processor;
+
+  @override
+  List<String> get experiments => const [];
 
   /// Return the lint code being tested.
   String? get lintCode => null;
@@ -140,7 +142,7 @@
 
   /// Returns the source change for computed fixes in the specified [testUnit].
   Future<SourceChange> _computeSourceChange() async {
-    var processor = await computeFixes();
+    processor = await computeFixes();
     return processor.builder.sourceChange;
   }
 
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
index 9630237..8779367 100644
--- 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
@@ -39,7 +39,7 @@
   }
 
   Future<void> test_withExtension() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class C {}
 extension E on int {
   static String m() => '';
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
index 5173579..a677f3a 100644
--- 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
@@ -24,7 +24,7 @@
   FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT1;
 
   Future<void> test_alreadyImported_package() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class A {}
 class B {}
 ''');
@@ -40,14 +40,14 @@
   }
 
   Future<void> test_extension_notImported_field_onThisType_fromClass() async {
-    addUnimportedFile('/home/test/lib/lib2.dart', '''
+    addUnimportedFile('$testPackageLibPath/lib2.dart', '''
 import 'package:test/lib1.dart';
 
 extension E on C {
   int m() => 0;
 }
 ''');
-    addSource('/home/test/lib/lib1.dart', '''
+    addSource('$testPackageLibPath/lib1.dart', '''
 class C {}
 ''');
     await resolveTestCode('''
@@ -68,7 +68,7 @@
   }
 
   Future<void> test_extension_notImported_getter() async {
-    addUnimportedFile('/home/test/lib/lib.dart', '''
+    addUnimportedFile('$testPackageLibPath/lib.dart', '''
 extension E on String {
   int get m => 0;
 }
@@ -88,7 +88,7 @@
   }
 
   Future<void> test_extension_notImported_method() async {
-    addUnimportedFile('/home/test/lib/lib.dart', '''
+    addUnimportedFile('$testPackageLibPath/lib.dart', '''
 extension E on String {
   void m() {}
 }
@@ -108,7 +108,7 @@
   }
 
   Future<void> test_extension_notImported_method_extendsGeneric() async {
-    addUnimportedFile('/home/test/lib/lib.dart', '''
+    addUnimportedFile('$testPackageLibPath/lib.dart', '''
 import 'package:test/lib1.dart';
 
 extension E<T extends num> on List<T> {
@@ -130,14 +130,14 @@
   }
 
   Future<void> test_extension_notImported_method_onThisType_fromClass() async {
-    addUnimportedFile('/home/test/lib/lib2.dart', '''
+    addUnimportedFile('$testPackageLibPath/lib2.dart', '''
 import 'package:test/lib1.dart';
 
 extension E on C {
   void m() {}
 }
 ''');
-    addSource('/home/test/lib/lib1.dart', '''
+    addSource('$testPackageLibPath/lib1.dart', '''
 class C {}
 ''');
     await resolveTestCode('''
@@ -163,14 +163,14 @@
 
   Future<void>
       test_extension_notImported_method_onThisType_fromExtension() async {
-    addUnimportedFile('/home/test/lib/lib2.dart', '''
+    addUnimportedFile('$testPackageLibPath/lib2.dart', '''
 import 'package:test/lib1.dart';
 
 extension E on C {
   void m() {}
 }
 ''');
-    addSource('/home/test/lib/lib1.dart', '''
+    addSource('$testPackageLibPath/lib1.dart', '''
 class C {}
 ''');
     await resolveTestCode('''
@@ -195,7 +195,7 @@
   }
 
   Future<void> test_extension_notImported_operator() async {
-    addUnimportedFile('/home/test/lib/lib.dart', '''
+    addUnimportedFile('$testPackageLibPath/lib.dart', '''
 extension E on String {
   String operator -(String other) => this;
 }
@@ -215,7 +215,7 @@
   }
 
   Future<void> test_extension_notImported_setter() async {
-    addUnimportedFile('/home/test/lib/lib.dart', '''
+    addUnimportedFile('$testPackageLibPath/lib.dart', '''
 extension E on String {
   set m(int v) {}
 }
@@ -235,7 +235,7 @@
   }
 
   Future<void> test_invalidUri_interpolation() async {
-    addSource('/home/test/lib/lib.dart', r'''
+    addSource('$testPackageLibPath/lib.dart', r'''
 class Test {
   const Test();
 }
@@ -355,7 +355,7 @@
   }
 
   Future<void> test_relativeDirective() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class Foo {}
 ''');
     await resolveTestCode('''
@@ -377,7 +377,7 @@
   }
 
   Future<void> test_relativeDirective_downOneDirectory() async {
-    addSource('/home/test/lib/dir/a.dart', '''
+    addSource('$testPackageLibPath/dir/a.dart', '''
 class Foo {}
 ''');
     await resolveTestCode('''
@@ -394,7 +394,7 @@
 
   Future<void> test_relativeDirective_preferRelativeImports() async {
     createAnalysisOptionsFile(lints: [LintNames.prefer_relative_imports]);
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class Foo {}
 ''');
     await resolveTestCode('''
@@ -416,10 +416,10 @@
   }
 
   Future<void> test_relativeDirective_upOneDirectory() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class Foo {}
 ''');
-    testFile = convertPath('/home/test/lib/dir/test.dart');
+    testFile = convertPath('$testPackageLibPath/dir/test.dart');
     await resolveTestCode('''
 main() { new Foo(); }
 ''');
@@ -433,7 +433,7 @@
   }
 
   Future<void> test_withClass_annotation() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 library lib;
 class Test {
   const Test(int p);
@@ -454,7 +454,7 @@
   }
 
   Future<void> test_withClass_catchClause() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class Test {}
 ''');
     await resolveTestCode('''
@@ -480,11 +480,11 @@
   }
 
   Future<void> test_withClass_hasOtherLibraryWithPrefix() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library a;
 class One {}
 ''');
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 library b;
 class One {}
 class Two {}
@@ -573,7 +573,7 @@
   }
 
   Future<void> test_withClass_instanceCreation_const() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class Test {
   const Test();
 }
@@ -593,7 +593,7 @@
   }
 
   Future<void> test_withClass_instanceCreation_const_namedConstructor() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class Test {
   const Test.named();
 }
@@ -613,7 +613,7 @@
   }
 
   Future<void> test_withClass_instanceCreation_implicit() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class Test {
   const Test();
 }
@@ -633,7 +633,7 @@
   }
 
   Future<void> test_withClass_instanceCreation_new() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class Test {
   const Test();
 }
@@ -653,7 +653,7 @@
   }
 
   Future<void> test_withClass_instanceCreation_new_namedConstructor() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class Test {
   Test.named();
 }
@@ -673,7 +673,7 @@
   }
 
   Future<void> test_withFunction() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 library lib;
 myFunction() {}
 ''');
@@ -692,7 +692,7 @@
   }
 
   Future<void> test_withFunction_functionTopLevelVariable() async {
-    addSource('/home/test/lib/lib.dart', 'var myFunction = () {};');
+    addSource('$testPackageLibPath/lib.dart', 'var myFunction = () {};');
     await resolveTestCode('''
 main() {
   myFunction();
@@ -708,7 +708,7 @@
   }
 
   Future<void> test_withFunction_functionTopLevelVariableIdentifier() async {
-    addSource('/home/test/lib/lib.dart', 'var myFunction = () {};');
+    addSource('$testPackageLibPath/lib.dart', 'var myFunction = () {};');
     await resolveTestCode('''
 main() {
   myFunction;
@@ -724,7 +724,7 @@
   }
 
   Future<void> test_withFunction_identifier() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 library lib;
 myFunction() {}
 ''');
@@ -744,7 +744,7 @@
 
   @failingTest
   Future<void> test_withFunction_nonFunctionType() async {
-    addSource('/home/test/lib/lib.dart', 'int zero = 0;');
+    addSource('$testPackageLibPath/lib.dart', 'int zero = 0;');
     await resolveTestCode('''
 main() {
   zero();
@@ -754,7 +754,7 @@
   }
 
   Future<void> test_withFunction_unresolvedMethod() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 library lib;
 myFunction() {}
 ''');
@@ -777,7 +777,7 @@
   }
 
   Future<void> test_withFunctionTypeAlias() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 library lib;
 typedef MyFunction();
 ''');
@@ -798,7 +798,7 @@
   }
 
   Future<void> test_withMixin() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 mixin Test {}
 ''');
     await resolveTestCode('''
@@ -812,7 +812,7 @@
   }
 
   Future<void> test_withTopLevelVariable() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 library lib;
 int MY_VAR = 42;
 ''');
@@ -955,7 +955,7 @@
   }
 
   Future<void> test_inLibSrc_thisContextRoot() async {
-    addSource('/home/test/lib/src/lib.dart', 'class Test {}');
+    addSource('$testPackageLibPath/src/lib.dart', 'class Test {}');
     await resolveTestCode('''
 main() {
   Test t;
@@ -973,7 +973,7 @@
   }
 
   Future<void> test_inLibSrc_thisContextRoot_extension() async {
-    addSource('/home/test/lib/src/lib.dart', '''
+    addSource('$testPackageLibPath/src/lib.dart', '''
 extension E on int {
   static String m() => '';
 }
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
index 05ba8ce..7c57f67 100644
--- 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
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.IMPORT_LIBRARY_SHOW;
 
   Future<void> test_extension_notShown_getter() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class C {}
 extension E on String {
   int get m => 0;
@@ -43,7 +43,7 @@
   }
 
   Future<void> test_extension_notShown_method() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class C {}
 extension E on String {
   void m() {}
@@ -66,7 +66,7 @@
   }
 
   Future<void> test_extension_notShown_operator() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class C {}
 extension E on String {
   String operator -(String other) => this;
@@ -89,7 +89,7 @@
   }
 
   Future<void> test_extension_notShown_setter() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class C {}
 extension E on String {
   set m(int v) {}
@@ -112,7 +112,7 @@
   }
 
   Future<void> test_override_samePackage() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class A {}
 extension E on int {
   String m() => '';
@@ -133,7 +133,7 @@
   }
 
   Future<void> test_package() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class A {}
 class B {}
 ''');
@@ -175,7 +175,7 @@
   }
 
   Future<void> test_static_samePackage() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class A {}
 extension E on int {
   static String m() => '';
diff --git a/pkg/analysis_server/test/src/services/correction/fix/organize_imports_test.dart b/pkg/analysis_server/test/src/services/correction/fix/organize_imports_test.dart
index 4a54aa0..8d5d664 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/organize_imports_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/organize_imports_test.dart
@@ -42,12 +42,12 @@
   }
 
   Future<void> test_organizePathImports() async {
-    newFile('/home/test/lib/a.dart', content: '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 class A {
   static void m() {}
 }
 ''');
-    newFile('/home/test/lib/a/b.dart', content: '''
+    newFile('$testPackageLibPath/a/b.dart', content: '''
 class B {
   static void m() {}
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/qualify_reference_test.dart b/pkg/analysis_server/test/src/services/correction/fix/qualify_reference_test.dart
index 5c92c08..6d3cf03 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/qualify_reference_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/qualify_reference_test.dart
@@ -43,7 +43,7 @@
   }
 
   Future<void> test_class_imported() async {
-    newFile('/home/test/lib/a.dart', content: '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 class A {
   static void m() {}
 }
@@ -60,7 +60,7 @@
   }
 
   Future<void> test_class_importedWithPrefix() async {
-    newFile('/home/test/lib/a.dart', content: '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 class A {
   static void m() {}
 }
@@ -104,12 +104,12 @@
   }
 
   Future<void> test_class_notImported() async {
-    newFile('/home/test/lib/a.dart', content: '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 class A {
   static void m() {}
 }
 ''');
-    newFile('/home/test/lib/b.dart', content: '''
+    newFile('$testPackageLibPath/b.dart', content: '''
 import 'a.dart';
 class B extends A {}
 ''');
@@ -148,7 +148,7 @@
   }
 
   Future<void> test_extension_imported() async {
-    newFile('/home/test/lib/a.dart', content: '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 class A {
   static void m() {}
 }
@@ -165,7 +165,7 @@
   }
 
   Future<void> test_extension_importedWithPrefix() async {
-    newFile('/home/test/lib/a.dart', content: '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 class A {
   static void m() {}
 }
@@ -209,12 +209,12 @@
   }
 
   Future<void> test_extension_notImported() async {
-    newFile('/home/test/lib/a.dart', content: '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 class A {
   static void m() {}
 }
 ''');
-    newFile('/home/test/lib/b.dart', content: '''
+    newFile('$testPackageLibPath/b.dart', content: '''
 import 'a.dart';
 class B extends A {}
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart
index 736da8c..9d27944 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart
@@ -21,7 +21,7 @@
   @override
   String get lintCode => LintNames.avoid_redundant_argument_values;
 
-  Future<void> test_singleFile() async {
+  Future<void> test_independentInvocations() async {
     await resolveTestCode('''
 void f({bool valWithDefault = true, bool val}) {}
 void f2({bool valWithDefault = true, bool val}) {}
@@ -41,6 +41,45 @@
 }
 ''');
   }
+
+  Future<void> test_multipleInSingleInvocation_actual() async {
+    await resolveTestCode('''
+void f() {
+  g(a: 0, b: 1, c: 2);
+}
+
+void g({int a = 0, int b = 1, int c = 2}) {}
+''');
+    await assertHasFix('''
+void f() {
+  g(b: 1);
+}
+
+void g({int a = 0, int b = 1, int c = 2}) {}
+''');
+  }
+
+  @failingTest
+  Future<void> test_multipleInSingleInvocation_ideal() async {
+    // The edits currently conflict with each other because they're overlapping,
+    // so one of them isn't applied. This only impacts the fix-all-in-file case
+    // because the bulk-fix case catches the remaining argument on the second
+    // pass.
+    await resolveTestCode('''
+void f() {
+  g(a: 0, b: 1, c: 2);
+}
+
+void g({int a = 0, int b = 1, int c = 2}) {}
+''');
+    await assertHasFix('''
+void f() {
+  g();
+}
+
+void g({int a = 0, int b = 1, int c = 2}) {}
+''');
+  }
 }
 
 @reflectiveTest
@@ -51,7 +90,7 @@
   @override
   String get lintCode => LintNames.avoid_redundant_argument_values;
 
-  Future<void> test_named_param() async {
+  Future<void> test_named() async {
     await resolveTestCode('''
 void f({bool valWithDefault = true, bool? val}) {}
 
@@ -68,7 +107,27 @@
 ''');
   }
 
-  Future<void> test_named_param_2() async {
+  @FailingTest(
+    issue: 'https://github.com/dart-lang/linter/issues/3082',
+  )
+  Future<void> test_named_betweenRequiredPositional() async {
+    await resolveTestCode('''
+void foo(int a, int b, {bool c = true}) {}
+
+void f() {
+  foo(0, c: true, 1);
+}
+''');
+    await assertHasFix('''
+void foo(int a, int b, {bool c = true}) {}
+
+void f() {
+  foo(0, 1);
+}
+''');
+  }
+
+  Future<void> test_named_hasOtherNamed() async {
     await resolveTestCode('''
 void f({bool valWithDefault = true, bool? val}) {}
 
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
index 33821d3..4dec631 100644
--- 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
@@ -126,7 +126,7 @@
   @FailingTest(issue: 'https://github.com/dart-lang/linter/issues/1997')
   Future<void> test_method_nullSafety_optIn_fromOptOut() async {
     createAnalysisOptionsFile(lints: [lintCode]);
-    newFile('/home/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   int foo() => 0;
 }
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
index 6fbc9d8..0dd8430 100644
--- 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
@@ -5,40 +5,97 @@
 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';
 
 void main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(RemoveUnusedImportTest);
+    defineReflectiveTests(RemoveUnusedImportBulkTest);
     defineReflectiveTests(RemoveUnusedImportMultiTest);
+    defineReflectiveTests(RemoveUnusedImportTest);
   });
 }
 
 @reflectiveTest
+class RemoveUnusedImportBulkTest extends BulkFixProcessorTest {
+  @FailingTest(reason: 'multiple deletions conflict')
+  Future<void> test_multipleOnSingleLine() async {
+    // TODO(brianwilkerson) Remove test_multipleOnSingleLine_temporary when this
+    //  test starts to pass.
+    await resolveTestCode('''
+import 'dart:collection'; import 'dart:math'; import 'dart:async';
+void f() {}
+''');
+    await assertHasFix('''
+
+void f() {}
+''');
+  }
+
+  Future<void> test_multipleOnSingleLine_temporary() async {
+    await resolveTestCode('''
+import 'dart:collection'; import 'dart:math'; import 'dart:async';
+void f() {}
+''');
+    await assertHasFix('''
+import 'dart:math';
+void f() {}
+''');
+  }
+
+  Future<void> test_multipleUnused() async {
+    await resolveTestCode('''
+import 'dart:collection';
+import 'dart:math';
+import 'dart:async';
+void f() {}
+''');
+    await assertHasFix('''
+void f() {}
+''');
+    var details = processor.fixDetails;
+    expect(details, hasLength(1));
+    var fixes = details[0].fixes;
+    expect(fixes, hasLength(1));
+    expect(fixes[0].occurrences, 3);
+  }
+
+  Future<void> test_usedAndUnused() async {
+    await resolveTestCode('''
+import 'dart:async';
+import 'dart:math' as math;
+import 'dart:async';
+
+var tau = math.pi * 2;
+
+void f() {}
+''');
+    await assertHasFix('''
+import 'dart:math' as math;
+
+var tau = math.pi * 2;
+
+void f() {}
+''');
+  }
+}
+
+@reflectiveTest
 class RemoveUnusedImportMultiTest extends FixProcessorTest {
   @override
   FixKind get kind => DartFixKind.REMOVE_UNUSED_IMPORT_MULTI;
 
-  @override
-  void setUp() {
-    super.setUp();
-    // TODO(dantup): Get these tests passing with either line ending.
-    useLineEndingsForPlatform = false;
-  }
-
   Future<void> test_all_diverseImports() async {
     await resolveTestCode('''
 import 'dart:math';
 import 'dart:math';
 import 'dart:async';
-main() {
-}
+void f() {}
 ''');
     await assertHasFixAllFix(HintCode.UNUSED_IMPORT, '''
-main() {
-}
+void f() {}
 ''');
   }
 
@@ -50,29 +107,39 @@
 
 var tau = math.pi * 2;
 
-main() {
-}
+void f() {}
 ''');
     await assertHasFixAllFix(HintCode.UNUSED_IMPORT, '''
 import 'dart:math' as math;
 
 var tau = math.pi * 2;
 
-main() {
-}
+void f() {}
 ''');
   }
 
-  @FailingTest(reason: 'one unused import remains unremoved')
+  @FailingTest(reason: 'multiple deletions conflict')
   Future<void> test_all_singleLine() async {
+    // TODO(brianwilkerson) Remove test_multipleOnSingleLine_temporary when this
+    //  test starts to pass.
     await resolveTestCode('''
 import 'dart:math'; import 'dart:math'; import 'dart:math';
-main() {
-}
+void f() {}
 ''');
     await assertHasFixAllFix(HintCode.UNUSED_IMPORT, '''
-main() {
-}
+
+void f() {}
+''');
+  }
+
+  Future<void> test_all_singleLine_temporary() async {
+    await resolveTestCode('''
+import 'dart:math'; import 'dart:math'; import 'dart:math';
+void f() {}
+''');
+    await assertHasFixAllFix(HintCode.UNUSED_IMPORT, '''
+import 'dart:math';
+void f() {}
 ''');
   }
 
@@ -81,12 +148,10 @@
 import 'dart:math';
 import 'dart:math';
 import 'dart:math';
-main() {
-}
+void f() {}
 ''');
     await assertHasFixAllFix(HintCode.UNUSED_IMPORT, '''
-main() {
-}
+void f() {}
 ''');
   }
 }
@@ -96,13 +161,6 @@
   @override
   FixKind get kind => DartFixKind.REMOVE_UNUSED_IMPORT;
 
-  @override
-  void setUp() {
-    super.setUp();
-    // TODO(dantup): Get these tests passing with either line ending.
-    useLineEndingsForPlatform = false;
-  }
-
   Future<void> test_anotherImportOnLine() async {
     await resolveTestCode('''
 import 'dart:math'; import 'dart:async';
@@ -125,14 +183,14 @@
 import 'dart:math';
 import 'dart:math';
 
-main() {
+void f() {
   print(min(0, 1));
 }
 ''');
     await assertHasFix('''
 import 'dart:math';
 
-main() {
+void f() {
   print(min(0, 1));
 }
 ''');
@@ -142,11 +200,11 @@
     await resolveTestCode('''
 import
   'dart:math';
-main() {
+void f() {
 }
 ''');
     await assertHasFix('''
-main() {
+void f() {
 }
 ''');
   }
@@ -154,11 +212,11 @@
   Future<void> test_single() async {
     await resolveTestCode('''
 import 'dart:math';
-main() {
+void f() {
 }
 ''');
     await assertHasFix('''
-main() {
+void f() {
 }
 ''');
   }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_test.dart
index da085a6..ac72607 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_test.dart
@@ -172,7 +172,7 @@
   }
 
   Future<void> test_privateType() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   _B b => _B();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_extension_name_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_extension_name_test.dart
index 0bf4a84..eaf03e1 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_extension_name_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_extension_name_test.dart
@@ -62,7 +62,7 @@
   }
 
   Future<void> test_qualified() async {
-    newFile('/home/test/lib/ext.dart', content: '''
+    newFile('$testPackageLibPath/ext.dart', content: '''
 extension E on String {
   static int m() => 0;
 }
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
index 49f9041..e3245f3 100644
--- 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
@@ -82,7 +82,6 @@
 ''');
   }
 
-  // @soloTest
   Future<void> test_constructorTearOff_nameUnnamed() async {
     await resolveTestCode('''
 class C {
diff --git a/pkg/analysis_server/test/stress/completion/completion_runner.dart b/pkg/analysis_server/test/stress/completion/completion_runner.dart
index 136684a..2f7a688 100644
--- a/pkg/analysis_server/test/stress/completion/completion_runner.dart
+++ b/pkg/analysis_server/test/stress/completion/completion_runner.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:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/utilities/null_string_sink.dart';
 import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
@@ -11,6 +10,7 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/file_system/overlay_file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 
 /// A runner that can request code completion at the location of each identifier
@@ -60,7 +60,6 @@
     var contributor = DartCompletionManager(
       budget: CompletionBudget(const Duration(seconds: 30)),
     );
-    var statistics = CompletionPerformance();
     var stamp = 1;
 
     var fileCount = 0;
@@ -100,17 +99,13 @@
           }
 
           timer.start();
-          var dartRequest = DartCompletionRequest(
+          var dartRequest = DartCompletionRequest.forResolvedUnit(
             resolvedUnit: result,
             offset: offset,
           );
-          var suggestions = await statistics.runRequestOperation(
-            (performance) async {
-              return await contributor.computeSuggestions(
-                dartRequest,
-                performance,
-              );
-            },
+          var suggestions = await contributor.computeSuggestions(
+            dartRequest,
+            OperationPerformanceImpl('<root>'),
           );
           timer.stop();
 
diff --git a/pkg/analysis_server/test/utils/change_check.dart b/pkg/analysis_server/test/utils/change_check.dart
new file mode 100644
index 0000000..3cd3e2b
--- /dev/null
+++ b/pkg/analysis_server/test/utils/change_check.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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:analyzer_utilities/check/check.dart';
+import 'package:meta/meta.dart';
+
+extension SourceChangeExtension on CheckTarget<SourceChange> {
+  @useResult
+  CheckTarget<List<SourceFileEdit>> get edits {
+    return nest(value.edits, (value) => 'has edits ${valueStr(value)}');
+  }
+
+  CheckTarget<SourceFileEdit> hasFileEdit(String path) {
+    return nest(
+      value.edits.singleWhere((e) => e.file == path),
+      (selected) => 'has edit ${valueStr(selected)}',
+    );
+  }
+}
+
+extension SourceFileEditExtension on CheckTarget<SourceFileEdit> {
+  @useResult
+  CheckTarget<String> appliedTo(String applyTo) {
+    var actual = SourceEdit.applySequence(applyTo, value.edits);
+    return nest(
+      actual,
+      (selected) => 'produces ${valueStr(selected)}',
+    );
+  }
+}
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics.dart b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
index c7a90fc..a6a9b85 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
@@ -10,7 +10,6 @@
 import 'package:analysis_server/src/domains/completion/available_suggestions.dart';
 import 'package:analysis_server/src/protocol/protocol_internal.dart';
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
-import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/documentation_cache.dart';
 import 'package:analysis_server/src/services/completion/dart/feature_computer.dart';
@@ -1227,7 +1226,7 @@
         listener: listener,
       ).computeSuggestions(dartRequest, performance);
 
-      computeIncludedSetList(declarationsTracker, dartRequest.result,
+      computeIncludedSetList(declarationsTracker, dartRequest,
           includedSuggestionSetList, includedElementNames);
 
       var includedSuggestionSetMap = {
@@ -1369,27 +1368,19 @@
             {required MetricsSuggestionListener listener,
             required CompletionMetrics metrics}) async {
           var stopwatch = Stopwatch()..start();
-          var request = DartCompletionRequest(
+          var request = DartCompletionRequest.forResolvedUnit(
             resolvedUnit: resolvedUnitResult,
             offset: expectedCompletion.offset,
             documentationCache: documentationCache,
           );
 
-          late OpType opType;
-          late List<protocol.CompletionSuggestion> suggestions;
-          await CompletionPerformance().runRequestOperation(
-            (performance) async {
-              opType = OpType.forCompletion(request.target, request.offset);
-              suggestions = await _computeCompletionSuggestions(
-                listener,
-                performance,
-                request,
-                metrics.availableSuggestions ? declarationsTracker : null,
-                metrics.availableSuggestions
-                    ? availableSuggestionsParams
-                    : null,
-              );
-            },
+          var opType = OpType.forCompletion(request.target, request.offset);
+          var suggestions = await _computeCompletionSuggestions(
+            listener,
+            OperationPerformanceImpl('<root>'),
+            request,
+            metrics.availableSuggestions ? declarationsTracker : null,
+            metrics.availableSuggestions ? availableSuggestionsParams : null,
           );
           stopwatch.stop();
 
diff --git a/pkg/analysis_server/tool/lsp_spec/README.md b/pkg/analysis_server/tool/lsp_spec/README.md
index cc61b66..ccf6e8a 100644
--- a/pkg/analysis_server/tool/lsp_spec/README.md
+++ b/pkg/analysis_server/tool/lsp_spec/README.md
@@ -9,10 +9,10 @@
 
 ## Running the Server
 
-The analysis server snapshot is included in the `bin/snapshots` folder of the Dart SDK. Pass the `--lsp` flag to start the server in LSP mode and the `--client-id` and `--client-version` flags to identify your editor/plugin and version:
+Start the language server using the `dart language-server` command. Pass the `--client-id` and `--client-version` flags to identify your editor/plugin and version:
 
 ```
-dart bin/snapshots/analysis_server.dart.snapshot --lsp --client-id my-editor.my-plugin --client-version 1.2
+dart language-server --client-id my-editor.my-plugin --client-version 1.2
 ```
 
 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).
@@ -101,8 +101,8 @@
 | codeLens/resolve | | | | | |
 | textDocument/documentLink | | | | | |
 | documentLink/resolve | | | | | |
-| textDocument/documentColor | | | | | |
-| textDocument/colorPresentation | | | | | |
+| textDocument/documentColor | ✅ | ✅ | | ✅ | ✅ |
+| textDocument/colorPresentation | ✅ | ✅ | | ✅ | ✅ |
 | textDocument/formatting | ✅ | ✅ | | ✅ | ✅ |
 | textDocument/rangeFormatting | ✅ | ✅ | | ✅ | ✅ |
 | textDocument/onTypeFormatting | ✅ | ✅ | | ✅ | ✅ |
diff --git a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
index 0339409..d6935bf 100644
--- a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
+++ b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
@@ -934,7 +934,8 @@
           case 'bool':
             return FromJsonFunction('jsonDecoder.decodeBool');
           case 'double':
-            return FromJsonFunction('jsonDecoder.decodeDouble');
+            return FromJsonFunction('jsonDecoder.decodeDouble',
+                castType: 'Object');
           case 'int':
           case 'long':
             return FromJsonFunction('jsonDecoder.decodeInt');
@@ -1120,14 +1121,17 @@
   @override
   final String asClosure;
 
-  FromJsonFunction(this.asClosure);
+  final String? castType;
+
+  FromJsonFunction(this.asClosure, {this.castType});
 
   @override
   bool get isIdentity => false;
 
   @override
-  String asSnippet(String jsonPath, String json) =>
-      '$asClosure($jsonPath, $json)';
+  String asSnippet(String jsonPath, String json) => castType == null
+      ? '$asClosure($jsonPath, $json)'
+      : '$asClosure($jsonPath, $json as $castType)';
 }
 
 /// Representation of FromJsonCode for the identity transformation.
diff --git a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
index 9f7e268..2108516 100644
--- a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
+++ b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
@@ -441,8 +441,12 @@
    * @param offset The offset within the file at which suggestions are to be made.
    * @param maxResults The maximum number of suggestions to return. If the number of suggestions
    *         after filtering is greater than the maxResults, then isIncomplete is set to true.
+   * @param timeout The approximate time in milliseconds that the server should spend. The server
+   *         will perform some steps anyway, even if it takes longer than the specified timeout. This
+   *         field is intended to be used for benchmarking, and usually should not be provided, so
+   *         that the default timeout is used.
    */
-  public void completion_getSuggestions2(String file, int offset, int maxResults, GetSuggestions2Consumer consumer);
+  public void completion_getSuggestions2(String file, int offset, int maxResults, int timeout, GetSuggestions2Consumer consumer);
 
   /**
    * {@code completion.registerLibraryPaths}
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index aa08d74..d89a44b 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -1482,6 +1482,16 @@
           then <tt>isIncomplete</tt> is set to <tt>true</tt>.
         </p>
       </field>
+      <field name="timeout" experimental="true" optional="true">
+        <ref>int</ref>
+        <p>
+          The approximate time in milliseconds that the server should spend.
+          The server will perform some steps anyway, even if it takes longer
+          than the specified timeout. This field is intended to be used for
+          benchmarking, and usually should not be  provided, so that the
+          default timeout is used.
+        </p>
+      </field>
     </params>
     <result>
       <field name="replacementOffset">
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 2689506..85a4474 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
@@ -141,6 +141,7 @@
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_FILE = 'file';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_MAX_RESULTS = 'maxResults';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_OFFSET = 'offset';
+const String COMPLETION_REQUEST_GET_SUGGESTIONS2_TIMEOUT = 'timeout';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS_FILE = 'file';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS_OFFSET = 'offset';
 const String COMPLETION_REQUEST_GET_SUGGESTION_DETAILS =
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 2dcbd32..7bb9c83 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
@@ -4698,7 +4698,14 @@
   /// to true.
   int maxResults;
 
-  CompletionGetSuggestions2Params(this.file, this.offset, this.maxResults);
+  /// The approximate time in milliseconds that the server should spend. The
+  /// server will perform some steps anyway, even if it takes longer than the
+  /// specified timeout. This field is intended to be used for benchmarking,
+  /// and usually should not be provided, so that the default timeout is used.
+  int? timeout;
+
+  CompletionGetSuggestions2Params(this.file, this.offset, this.maxResults,
+      {this.timeout});
 
   factory CompletionGetSuggestions2Params.fromJson(
       JsonDecoder jsonDecoder, String jsonPath, Object? json) {
@@ -4723,7 +4730,12 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'maxResults');
       }
-      return CompletionGetSuggestions2Params(file, offset, maxResults);
+      int? timeout;
+      if (json.containsKey('timeout')) {
+        timeout = jsonDecoder.decodeInt(jsonPath + '.timeout', json['timeout']);
+      }
+      return CompletionGetSuggestions2Params(file, offset, maxResults,
+          timeout: timeout);
     } else {
       throw jsonDecoder.mismatch(
           jsonPath, 'completion.getSuggestions2 params', json);
@@ -4741,6 +4753,10 @@
     result['file'] = file;
     result['offset'] = offset;
     result['maxResults'] = maxResults;
+    var timeout = this.timeout;
+    if (timeout != null) {
+      result['timeout'] = timeout;
+    }
     return result;
   }
 
@@ -4757,7 +4773,8 @@
     if (other is CompletionGetSuggestions2Params) {
       return file == other.file &&
           offset == other.offset &&
-          maxResults == other.maxResults;
+          maxResults == other.maxResults &&
+          timeout == other.timeout;
     }
     return false;
   }
@@ -4767,6 +4784,7 @@
         file,
         offset,
         maxResults,
+        timeout,
       );
 }
 
@@ -11547,7 +11565,7 @@
       double? doubleValue;
       if (json.containsKey('doubleValue')) {
         doubleValue = jsonDecoder.decodeDouble(
-            jsonPath + '.doubleValue', json['doubleValue']);
+            jsonPath + '.doubleValue', json['doubleValue'] as Object);
       }
       int? intValue;
       if (json.containsKey('intValue')) {
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index d672ae5..a0dc0ba 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,7 +1,13 @@
-## 2.8.0-dev
+## 2.8.0
 * Deprecations and renames for `getXyz` methods in `AnalysisDriver`.
 * Removed uppercase named constants from `double` in mock SDK.
 * Deprecated `path` and `uri` from `AnalysisResult`.
+* Deprecated `UriResolver.restoreAbsolute`, use `pathToUri` instead.
+* Deprecated `SourceFactory.restoreAbsolute`, use `pathToUri` instead.
+* Deprecated `UriKind` and `Source.uriKind`.
+* Deprecated `Source.modificationStamp`.
+* Deprecated `Source.isInSystemLibrary`, use `uri.isScheme('dart')` instead.
+* Fixed #47715.
 
 ## 2.7.0
 * Updated `ConstructorElement.displayName` to either `Class` or `Class.constructor`.
diff --git a/pkg/analyzer/lib/dart/analysis/features.dart b/pkg/analyzer/lib/dart/analysis/features.dart
index 9264322..91c3a30 100644
--- a/pkg/analyzer/lib/dart/analysis/features.dart
+++ b/pkg/analyzer/lib/dart/analysis/features.dart
@@ -23,6 +23,9 @@
   static final control_flow_collections =
       ExperimentalFeatures.control_flow_collections;
 
+  /// Feature information for enhanced enums.
+  static final enhanced_enums = ExperimentalFeatures.enhanced_enums;
+
   /// Feature information for extension methods.
   static final extension_methods = ExperimentalFeatures.extension_methods;
 
@@ -38,6 +41,9 @@
   /// Feature information for set literals.
   static final set_literals = ExperimentalFeatures.set_literals;
 
+  /// Feature information for super parameters.
+  static final super_parameters = ExperimentalFeatures.super_parameters;
+
   /// Feature information for the triple-shift operator.
   static final triple_shift = ExperimentalFeatures.triple_shift;
 
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index ba209b7..a376881 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -570,6 +570,8 @@
 
   R? visitSuperExpression(SuperExpression node);
 
+  R? visitSuperFormalParameter(SuperFormalParameter node);
+
   R? visitSwitchCase(SwitchCase node);
 
   R? visitSwitchDefault(SwitchDefault node);
@@ -1591,6 +1593,9 @@
   /// Return the left curly bracket.
   Token get leftBracket;
 
+  /// Return the members declared by the enumeration.
+  NodeList<ClassMember> get members;
+
   @override
   SimpleIdentifier get name;
 
@@ -2200,6 +2205,7 @@
 ///        [BlockFunctionBody]
 ///      | [EmptyFunctionBody]
 ///      | [ExpressionFunctionBody]
+///      | [NativeFunctionBody]
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class FunctionBody implements AstNode {
@@ -4058,6 +4064,48 @@
   Token get superKeyword;
 }
 
+/// A super-initializer formal parameter.
+///
+///    superFormalParameter ::=
+///        ('final' [TypeAnnotation] | 'const' [TypeAnnotation] | 'var' | [TypeAnnotation])?
+///        'super' '.' [SimpleIdentifier] ([TypeParameterList]? [FormalParameterList])?
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class SuperFormalParameter implements NormalFormalParameter {
+  @override
+  SimpleIdentifier get identifier;
+
+  /// Return the token representing either the 'final', 'const' or 'var'
+  /// keyword, or `null` if no keyword was used.
+  Token? get keyword;
+
+  /// Return the parameters of the function-typed parameter, or `null` if this
+  /// is not a function-typed field formal parameter.
+  FormalParameterList? get parameters;
+
+  /// Return the token representing the period.
+  Token get period;
+
+  /// If the parameter is function-typed, and has the question mark, then its
+  /// function type is nullable. Having a nullable function type means that the
+  /// parameter can be null.
+  Token? get question;
+
+  /// Return the token representing the 'super' keyword.
+  Token get superKeyword;
+
+  /// Return the declared type of the parameter, or `null` if the parameter does
+  /// not have a declared type.
+  ///
+  /// Note that if this is a function-typed field formal parameter this is the
+  /// return type of the function.
+  TypeAnnotation? get type;
+
+  /// Return the type parameters associated with this method, or `null` if this
+  /// method is not a generic method.
+  TypeParameterList? get typeParameters;
+}
+
 /// A case in a switch statement.
 ///
 ///    switchCase ::=
diff --git a/pkg/analyzer/lib/dart/ast/ast_factory.dart b/pkg/analyzer/lib/dart/ast/ast_factory.dart
index 8a714a8..f4c31cb 100644
--- a/pkg/analyzer/lib/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/dart/ast/ast_factory.dart
@@ -308,6 +308,7 @@
       SimpleIdentifier name,
       Token leftBracket,
       List<EnumConstantDeclaration> constants,
+      List<ClassMember> members,
       Token rightBracket);
 
   /// Returns a newly created export directive. Either or both of the
@@ -872,6 +873,26 @@
   /// Returns a newly created super expression.
   SuperExpression superExpression(Token superKeyword);
 
+  /// Returns a newly created super-initializer parameter. Either or both of
+  /// the [comment] and [metadata] can be `null` if the parameter does not have
+  /// the corresponding attribute. The [keyword] can be `null` if there is a
+  /// type. The [type] must be `null` if the keyword is 'var'. The [parameters]
+  /// can be `null` if this is not a function-typed super-initializer
+  /// parameter.
+  SuperFormalParameter superFormalParameter(
+      {Comment? comment,
+      List<Annotation>? metadata,
+      Token? covariantKeyword,
+      Token? requiredKeyword,
+      Token? keyword,
+      TypeAnnotation? type,
+      required Token superKeyword,
+      required Token period,
+      required SimpleIdentifier identifier,
+      TypeParameterList? typeParameters,
+      FormalParameterList? parameters,
+      Token? question});
+
   /// Returns a newly created switch case. The list of [labels] can be `null`
   /// if there are no labels.
   SwitchCase switchCase(List<Label> labels, Token keyword,
diff --git a/pkg/analyzer/lib/dart/ast/visitor.dart b/pkg/analyzer/lib/dart/ast/visitor.dart
index 5d3dda9..65551ac 100644
--- a/pkg/analyzer/lib/dart/ast/visitor.dart
+++ b/pkg/analyzer/lib/dart/ast/visitor.dart
@@ -561,6 +561,10 @@
   R? visitSuperExpression(SuperExpression node) => visitExpression(node);
 
   @override
+  R? visitSuperFormalParameter(SuperFormalParameter node) =>
+      visitNormalFormalParameter(node);
+
+  @override
   R? visitSwitchCase(SwitchCase node) => visitSwitchMember(node);
 
   @override
@@ -1309,6 +1313,12 @@
   }
 
   @override
+  R? visitSuperFormalParameter(SuperFormalParameter node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
   R? visitSwitchCase(SwitchCase node) {
     node.visitChildren(this);
     return null;
@@ -1771,6 +1781,9 @@
   R? visitSuperExpression(SuperExpression node) => null;
 
   @override
+  R? visitSuperFormalParameter(SuperFormalParameter node) => null;
+
+  @override
   R? visitSwitchCase(SwitchCase node) => null;
 
   @override
@@ -2184,6 +2197,9 @@
   R? visitSuperExpression(SuperExpression node) => _throw(node);
 
   @override
+  R? visitSuperFormalParameter(SuperFormalParameter node) => _throw(node);
+
+  @override
   R? visitSwitchCase(SwitchCase node) => _throw(node);
 
   @override
@@ -3145,6 +3161,14 @@
   }
 
   @override
+  T? visitSuperFormalParameter(SuperFormalParameter node) {
+    stopwatch.start();
+    T? result = _baseVisitor.visitSuperFormalParameter(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
   T? visitSwitchCase(SwitchCase node) {
     stopwatch.start();
     T? result = _baseVisitor.visitSwitchCase(node);
@@ -3668,6 +3692,9 @@
   R? visitSuperExpression(SuperExpression node) => visitNode(node);
 
   @override
+  R? visitSuperFormalParameter(SuperFormalParameter node) => visitNode(node);
+
+  @override
   R? visitSwitchCase(SwitchCase node) => visitNode(node);
 
   @override
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 0bc425e..b4924ce 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -256,7 +256,6 @@
   CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER,
   CompileTimeErrorCode.INVALID_OVERRIDE,
   CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS,
-  CompileTimeErrorCode.INVALID_SUPER_INVOCATION,
   CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST,
   CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP,
   CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_SET,
@@ -407,6 +406,7 @@
   CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT,
   CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR,
   CompileTimeErrorCode.SUPER_INITIALIZER_IN_OBJECT,
+  CompileTimeErrorCode.SUPER_INVOCATION_NOT_LAST,
   CompileTimeErrorCode.SWITCH_CASE_COMPLETES_NORMALLY,
   CompileTimeErrorCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE,
   CompileTimeErrorCode.TEAROFF_OF_GENERATIVE_CONSTRUCTOR_OF_ABSTRACT_CLASS,
@@ -475,7 +475,11 @@
   CompileTimeErrorCode.WRONG_TYPE_PARAMETER_VARIANCE_POSITION,
   CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR,
   CompileTimeErrorCode.YIELD_IN_NON_GENERATOR,
+  CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE,
   CompileTimeErrorCode.YIELD_OF_INVALID_TYPE,
+  FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_EXTRA,
+  FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_MISSING,
+  FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_UNSUPPORTED,
   FfiCode.ANNOTATION_ON_POINTER_FIELD,
   FfiCode.ARGUMENT_MUST_BE_A_CONSTANT,
   FfiCode.CREATION_OF_STRUCT_OR_UNION,
@@ -1134,8 +1138,7 @@
     return errors.toList();
   }
 
-  static List<Object?>? _translateNamedArguments(
-      Map<String, dynamic> arguments) {
+  static Null _translateNamedArguments(Map<String, dynamic> arguments) {
     // All analyzer errors now use positional arguments, so if this method is
     // being called, either no arguments were provided to the
     // AnalysisError.withNamedArguments constructor, or the client was
diff --git a/pkg/analyzer/lib/error/listener.dart b/pkg/analyzer/lib/error/listener.dart
index ba45f03..6209775 100644
--- a/pkg/analyzer/lib/error/listener.dart
+++ b/pkg/analyzer/lib/error/listener.dart
@@ -165,6 +165,12 @@
         arguments[i] = argument.getDisplayString(
           withNullability: isNonNullableByDefault,
         );
+      } else if (!(argument is String ||
+          argument is DartType ||
+          argument is int ||
+          argument is Uri)) {
+        throw ArgumentError(
+            'Tried to format an error using ${argument.runtimeType}');
       }
     }
   }
diff --git a/pkg/analyzer/lib/file_system/memory_file_system.dart b/pkg/analyzer/lib/file_system/memory_file_system.dart
index f6d3b10..ce09cee 100644
--- a/pkg/analyzer/lib/file_system/memory_file_system.dart
+++ b/pkg/analyzer/lib/file_system/memory_file_system.dart
@@ -7,7 +7,7 @@
 import 'dart:typed_data';
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/source_resource.dart';
 import 'package:path/path.dart' as pathos;
 import 'package:watcher/watcher.dart';
diff --git a/pkg/analyzer/lib/file_system/overlay_file_system.dart b/pkg/analyzer/lib/file_system/overlay_file_system.dart
index dbac07b..559d80e 100644
--- a/pkg/analyzer/lib/file_system/overlay_file_system.dart
+++ b/pkg/analyzer/lib/file_system/overlay_file_system.dart
@@ -6,7 +6,7 @@
 import 'dart:typed_data';
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/source_resource.dart';
 import 'package:path/path.dart' as pathos;
 import 'package:watcher/watcher.dart';
diff --git a/pkg/analyzer/lib/file_system/physical_file_system.dart b/pkg/analyzer/lib/file_system/physical_file_system.dart
index 9824499..3f16df1 100644
--- a/pkg/analyzer/lib/file_system/physical_file_system.dart
+++ b/pkg/analyzer/lib/file_system/physical_file_system.dart
@@ -6,7 +6,7 @@
 import 'dart:typed_data';
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/source_resource.dart';
 import 'package:path/path.dart';
 import 'package:watcher/watcher.dart';
diff --git a/pkg/analyzer/lib/source/line_info.dart b/pkg/analyzer/lib/source/line_info.dart
index 1867017..b552a35 100644
--- a/pkg/analyzer/lib/source/line_info.dart
+++ b/pkg/analyzer/lib/source/line_info.dart
@@ -17,6 +17,12 @@
   CharacterLocation(this.lineNumber, this.columnNumber);
 
   @override
+  bool operator ==(Object object) =>
+      object is CharacterLocation &&
+      lineNumber == object.lineNumber &&
+      columnNumber == object.columnNumber;
+
+  @override
   String toString() => '$lineNumber:$columnNumber';
 }
 
diff --git a/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart b/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
index efb2263..4269e6b 100644
--- a/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
+++ b/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
@@ -35,7 +35,7 @@
   /// Return the analysis options file from which options should be read, or
   /// `null` if there is no analysis options file for code in the given [root].
   ///
-  /// The given [root] directory will be searched first. If no file is found ,
+  /// The given [root] directory will be searched first. If no file is found,
   /// then enclosing directories will be searched.
   File? getOptionsFile(Folder root) {
     for (var current in root.withAncestors) {
@@ -44,6 +44,7 @@
         return file;
       }
     }
+    return null;
   }
 
   /// Provide the options found in [file].
diff --git a/pkg/analyzer/lib/src/context/source.dart b/pkg/analyzer/lib/src/context/source.dart
index 554eb1a..b603111 100644
--- a/pkg/analyzer/lib/src/context/source.dart
+++ b/pkg/analyzer/lib/src/context/source.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart' as utils;
 import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer/src/workspace/package_build.dart';
 
@@ -63,14 +64,6 @@
   }
 
   @override
-  void clearCache() {
-    _absoluteUriToSourceCache.clear();
-    for (var resolver in resolvers) {
-      resolver.clearCache();
-    }
-  }
-
-  @override
   Source? forUri(String absoluteUri) {
     try {
       Uri uri;
@@ -109,6 +102,17 @@
   }
 
   @override
+  Uri? pathToUri(String path) {
+    for (var resolver in resolvers) {
+      var uri = resolver.pathToUri(path);
+      if (uri != null) {
+        return uri;
+      }
+    }
+    return null;
+  }
+
+  @override
   Source? resolveUri(Source? containingSource, String? containedUri) {
     if (containedUri == null) {
       return null;
@@ -135,18 +139,13 @@
     }
   }
 
+  @Deprecated('Use pathToUri() instead')
   @override
   Uri? restoreUri(Source source) {
-    for (UriResolver resolver in resolvers) {
-      // First see if a resolver can restore the URI.
-      Uri? uri = resolver.restoreAbsolute(source);
-
-      if (uri != null) {
-        return uri;
-      }
+    if (source is InSummarySource) {
+      return source.uri;
     }
-
-    return null;
+    return pathToUri(source.fullName);
   }
 
   /// Return a source object representing the URI that results from resolving
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
index d8131da..db6b26d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
@@ -198,6 +198,7 @@
         return file;
       }
     }
+    return null;
   }
 
   /// Return the analysis options that should be used to analyze code in the
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
index 38d0316..245db3d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
@@ -420,6 +420,7 @@
         return file;
       }
     }
+    return null;
   }
 
   /// Return the analysis options file to be used to analyze files in the given
@@ -432,6 +433,7 @@
         return file;
       }
     }
+    return null;
   }
 
   /// Return the packages file to be used to analyze files in the given
@@ -444,6 +446,7 @@
         return _PackagesFile(current, file);
       }
     }
+    return null;
   }
 
   /// Return a list containing the glob patterns used to exclude files from the
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 32ea11f..f632148 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/dart/analysis/declared_variables.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/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/exception/exception.dart';
@@ -29,6 +30,7 @@
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/analysis/status.dart';
 import 'package:analyzer/src/dart/analysis/testing_data.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/diagnostic/diagnostic.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/exception/exception.dart';
@@ -42,6 +44,7 @@
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary2/ast_binary_flags.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
+import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:meta/meta.dart';
 
 /// This class computes [AnalysisResult]s for Dart files.
@@ -80,7 +83,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 190;
+  static const int DATA_VERSION = 191;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
@@ -686,6 +689,22 @@
     return completer.future;
   }
 
+  /// Return [LibraryElementResult] for the given [file], or `null` if the
+  /// file is a part.
+  LibraryElement? getLibraryByFile(FileState file) {
+    if (file.isPart) {
+      return null;
+    }
+
+    var element = libraryContext.getLibraryElementIfReady(file.uriStr);
+    if (element != null) {
+      return element;
+    }
+
+    libraryContext.load2(file);
+    return libraryContext.getLibraryElement(file.uri);
+  }
+
   /// Return a [Future] that completes with [LibraryElementResult] 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.
@@ -1274,6 +1293,7 @@
       return;
     }
     if (file_paths.isDart(resourceProvider.pathContext, path)) {
+      _lastProducedSignatures.remove(path);
       _priorityResults.clear();
       _removePotentiallyAffectedLibraries(path);
       _fileTracker.removeFile(path);
@@ -1281,6 +1301,63 @@
     }
   }
 
+  ResolvedForCompletionResultImpl? resolveForCompletion({
+    required String path,
+    required int offset,
+    required OperationPerformanceImpl performance,
+  }) {
+    if (!_isAbsolutePath(path)) {
+      return null;
+    }
+
+    if (!_fsState.hasUri(path)) {
+      return null;
+    }
+
+    // Process pending changes.
+    while (_fileTracker.verifyChangedFilesIfNeeded()) {}
+
+    var file = _fsState.getFileForPath(path);
+
+    var library = file.isPart ? file.library : file;
+    if (library == null) {
+      return null;
+    }
+
+    libraryContext.load2(library);
+    var unitElement = libraryContext.computeUnitElement(library, file)
+        as CompilationUnitElementImpl;
+
+    var analyzer = LibraryAnalyzer(
+        analysisOptions as AnalysisOptionsImpl,
+        declaredVariables,
+        sourceFactory,
+        libraryContext.analysisContext,
+        libraryContext.elementFactory.libraryOfUri2(library.uriStr),
+        libraryContext.analysisSession.inheritanceManager,
+        library,
+        testingData: testingData);
+
+    var analysisResult = analyzer.analyzeForCompletion(
+      file: file,
+      offset: offset,
+      unitElement: unitElement,
+      performance: performance,
+    );
+
+    return ResolvedForCompletionResultImpl(
+      analysisSession: currentSession,
+      path: path,
+      uri: file.uri,
+      exists: file.exists,
+      content: file.content,
+      lineInfo: file.lineInfo,
+      parsedUnit: analysisResult.parsedUnit,
+      unitElement: unitElement,
+      resolvedNodes: analysisResult.resolvedNodes,
+    );
+  }
+
   void _addDeclaredVariablesToSignature(ApiSignature buffer) {
     var variableNames = declaredVariables.variableNames;
     buffer.addInt(variableNames.length);
@@ -1705,15 +1782,16 @@
   }
 
   void _removePotentiallyAffectedLibraries(String path) {
-    _logger.run('Invalidate affected by $path.', () {
-      _logger.writeln('Work in $name');
-      var affected = <FileState>{};
-      _fsState.collectAffected(path, affected);
-      _logger.writeln('Remove ${affected.length} libraries.');
-      _libraryContext?.elementFactory.removeLibraries(
-        affected.map((e) => e.uriStr).toSet(),
-      );
-    });
+    var affected = <FileState>{};
+    _fsState.collectAffected(path, affected);
+
+    for (var file in affected) {
+      file.invalidateLibraryCycle();
+    }
+
+    _libraryContext?.elementFactory.removeLibraries(
+      affected.map((e) => e.uriStr).toSet(),
+    );
   }
 
   void _reportException(String path, Object exception, StackTrace stackTrace) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
index ce99ad0..9d06f65 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
@@ -8,7 +8,7 @@
 
 /// The current version of the Dart language (or, for non-stable releases, the
 /// version of the language currently in the process of being developed).
-const _currentVersion = '2.15.0';
+const _currentVersion = '2.16.0';
 
 /// A map containing information about all known experimental flags.
 final _knownFeatures = <String, ExperimentalFeature>{
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index f0f35eb..532447a 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -35,6 +35,7 @@
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary2/informative_data.dart';
 import 'package:analyzer/src/util/either.dart';
+import 'package:analyzer/src/util/uri.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
 import 'package:collection/collection.dart';
 import 'package:convert/convert.dart';
@@ -94,6 +95,9 @@
   /// The absolute URI of the file.
   final Uri uri;
 
+  /// Properties of the [uri].
+  final FileUriProperties uriProperties;
+
   /// The [Source] of the file with the [uri].
   final Source source;
 
@@ -126,6 +130,9 @@
 
   UnlinkedUnit? _unlinked2;
 
+  /// Files that reference this file.
+  final List<FileState> referencingFiles = [];
+
   List<FileState?>? _importedFiles;
   List<FileState?>? _exportedFiles;
   List<FileState?>? _partedFiles;
@@ -148,7 +155,7 @@
     this.workspacePackage,
     this._contextFeatureSet,
     this.packageLanguageVersion,
-  );
+  ) : uriProperties = FileUriProperties(uri);
 
   /// The unlinked API signature of the file.
   Uint8List get apiSignature => _apiSignature!;
@@ -196,7 +203,10 @@
     return _exportedFiles ??= _unlinked2!.exports.map((directive) {
       var uri = _selectRelativeUri(directive);
       return _fileForRelativeUri(uri).map(
-        (file) => file,
+        (file) {
+          file?.referencingFiles.add(this);
+          return file;
+        },
         (_) => null,
       );
     }).toList();
@@ -210,7 +220,10 @@
     return _importedFiles ??= _unlinked2!.imports.map((directive) {
       var uri = _selectRelativeUri(directive);
       return _fileForRelativeUri(uri).map(
-        (file) => file,
+        (file) {
+          file?.referencingFiles.add(this);
+          return file;
+        },
         (_) => null,
       );
     }).toList();
@@ -276,6 +289,7 @@
       return _fileForRelativeUri(uri).map(
         (file) {
           if (file != null) {
+            file.referencingFiles.add(this);
             _fsState._partToLibraries
                 .putIfAbsent(file, () => <FileState>[])
                 .add(this);
@@ -338,6 +352,11 @@
     _libraryCycle = cycle;
   }
 
+  void invalidateLibraryCycle() {
+    _libraryCycle?.invalidate();
+    _libraryCycle = null;
+  }
+
   /// Return a new parsed unresolved [CompilationUnit].
   CompilationUnitImpl parse([AnalysisErrorListener? errorListener]) {
     errorListener ??= AnalysisErrorListener.NULL_LISTENER;
@@ -420,6 +439,9 @@
       }
     }
 
+    // It is possible that this file does not reference these files.
+    _stopReferencingByThisFile();
+
     // Read imports/exports on demand.
     _importedFiles = null;
     _exportedFiles = null;
@@ -559,6 +581,20 @@
     return directive.uri;
   }
 
+  void _stopReferencingByThisFile() {
+    void removeForOne(List<FileState?>? referencedFiles) {
+      if (referencedFiles != null) {
+        for (var referenced in referencedFiles) {
+          referenced?.referencingFiles.remove(this);
+        }
+      }
+    }
+
+    removeForOne(_importedFiles);
+    removeForOne(_exportedFiles);
+    removeForOne(_partedFiles);
+  }
+
   static UnlinkedUnit serializeAstUnlinked2(CompilationUnit unit) {
     var exports = <UnlinkedNamespaceDirective>[];
     var imports = <UnlinkedNamespaceDirective>[];
@@ -686,11 +722,8 @@
   /// Mapping from a path to the flag whether there is a URI for the path.
   final Map<String, bool> _hasUriForPath = {};
 
-  /// Mapping from a path to the corresponding [FileState]s, canonical or not.
-  final Map<String, List<FileState>> _pathToFiles = {};
-
-  /// Mapping from a path to the corresponding canonical [FileState].
-  final Map<String, FileState> _pathToCanonicalFile = {};
+  /// Mapping from a path to the corresponding [FileState].
+  final Map<String, FileState> _pathToFile = {};
 
   /// We don't read parts until requested, but if we need to know the
   /// library for a file, we need to read parts of every file to know
@@ -737,28 +770,24 @@
   /// Collected files that transitively reference a file with the [path].
   /// These files are potentially affected by the change.
   void collectAffected(String path, Set<FileState> affected) {
-    final knownFiles = this.knownFiles.toList();
-
-    final fileToReferences = <FileState, List<FileState>>{};
-    for (var file in knownFiles) {
-      for (var referenced in file.directReferencedFiles) {
-        var references = fileToReferences[referenced] ??= [];
-        references.add(file);
-      }
+    // TODO(scheglov) This should not be necessary.
+    // We use affected files to remove library elements, and we can only get
+    // these library elements when we link or load them, using library cycles.
+    // And we get library cycles by asking `directReferencedFiles`.
+    for (var file in knownFiles.toList()) {
+      file.directReferencedFiles;
     }
 
     collectAffected(FileState file) {
       if (affected.add(file)) {
-        var references = fileToReferences[file];
-        if (references != null) {
-          for (var other in references) {
-            collectAffected(other);
-          }
+        for (var other in file.referencingFiles) {
+          collectAffected(other);
         }
       }
     }
 
-    for (var file in _pathToFiles[path] ?? <FileState>[]) {
+    var file = _pathToFile[path];
+    if (file != null) {
       collectAffected(file);
     }
   }
@@ -791,36 +820,14 @@
     return featureSetProvider.getLanguageVersion(path, uri);
   }
 
-  /// Return the canonical [FileState] for the given absolute [path]. The
-  /// returned file has the last known state since if was last refreshed.
-  ///
-  /// Here "canonical" means that if the [path] is in a package `lib` then the
-  /// returned file will have the `package:` style URI.
+  /// Return the [FileState] for the given absolute [path]. The returned file
+  /// has the last known state since if was last refreshed.
   FileState getFileForPath(String path) {
-    FileState? file = _pathToCanonicalFile[path];
+    var file = _pathToFile[path];
     if (file == null) {
       File resource = _resourceProvider.getFile(path);
-      Source fileSource = resource.createSource();
-      Uri? uri = _sourceFactory.restoreUri(fileSource);
-      // Try to get the existing instance.
-      file = _uriToFile[uri];
-      // If we have a file, call it the canonical one and return it.
-      if (file != null) {
-        _pathToCanonicalFile[path] = file;
-        return file;
-      }
-      // Create a new file.
-      FileSource uriSource = FileSource(resource, uri!);
-      WorkspacePackage? workspacePackage = _workspace?.findPackageFor(path);
-      FeatureSet featureSet = contextFeatureSet(path, uri, workspacePackage);
-      Version packageLanguageVersion =
-          contextLanguageVersion(path, uri, workspacePackage);
-      file = FileState._(this, path, uri, uriSource, workspacePackage,
-          featureSet, packageLanguageVersion);
-      _uriToFile[uri] = file;
-      _addFileWithPath(path, file);
-      _pathToCanonicalFile[path] = file;
-      file.refresh();
+      Uri uri = _sourceFactory.pathToUri(path)!;
+      file = _newFile(resource, path, uri);
     }
     return file;
   }
@@ -847,7 +854,7 @@
 
     FileState? file = _uriToFile[uri];
     if (file == null) {
-      Source? uriSource = _sourceFactory.resolveUri(null, uri.toString());
+      Source? uriSource = _sourceFactory.forUri2(uri);
 
       // If the URI cannot be resolved, for example because the factory
       // does not understand the scheme, return the unresolved file instance.
@@ -856,34 +863,26 @@
       }
 
       String path = uriSource.fullName;
+
+      // Check if already resolved to this path via different URI.
+      // That different URI must be the canonical one.
+      file = _pathToFile[path];
+      if (file != null) {
+        return Either2.t1(file);
+      }
+
       File resource = _resourceProvider.getFile(path);
-      FileSource source = FileSource(resource, uri);
-      WorkspacePackage? workspacePackage = _workspace?.findPackageFor(path);
-      FeatureSet featureSet = contextFeatureSet(path, uri, workspacePackage);
-      Version packageLanguageVersion =
-          contextLanguageVersion(path, uri, workspacePackage);
-      file = FileState._(this, path, uri, source, workspacePackage, featureSet,
-          packageLanguageVersion);
-      _uriToFile[uri] = file;
-      _addFileWithPath(path, file);
-      file.refresh();
+
+      var rewrittenUri = rewriteFileToPackageUri(_sourceFactory, uri);
+      if (rewrittenUri == null) {
+        return Either2.t1(null);
+      }
+
+      file = _newFile(resource, path, rewrittenUri);
     }
     return Either2.t1(file);
   }
 
-  /// Return the list of all [FileState]s corresponding to the given [path]. The
-  /// list has at least one item, and the first item is the canonical file.
-  List<FileState> getFilesForPath(String path) {
-    FileState canonicalFile = getFileForPath(path);
-    List<FileState> allFiles = _pathToFiles[path]!.toList();
-    if (allFiles.length == 1) {
-      return allFiles;
-    }
-    return allFiles
-      ..remove(canonicalFile)
-      ..insert(0, canonicalFile);
-  }
-
   /// Return files where the given [name] is subtyped, i.e. used in `extends`,
   /// `with` or `implements` clauses.
   Set<FileState>? getFilesSubtypingName(String name) {
@@ -898,10 +897,8 @@
   bool hasUri(String path) {
     bool? flag = _hasUriForPath[path];
     if (flag == null) {
-      File resource = _resourceProvider.getFile(path);
-      Source fileSource = resource.createSource();
-      Uri? uri = _sourceFactory.restoreUri(fileSource);
-      Source? uriSource = _sourceFactory.forUri2(uri!);
+      Uri uri = _sourceFactory.pathToUri(path)!;
+      Source? uriSource = _sourceFactory.forUri2(uri);
       flag = uriSource?.fullName == path;
       _hasUriForPath[path] = flag;
     }
@@ -933,30 +930,34 @@
     _clearFiles();
   }
 
-  void _addFileWithPath(String path, FileState file) {
-    var files = _pathToFiles[path];
-    if (files == null) {
-      knownFilePaths.add(path);
-      knownFiles.add(file);
-      files = <FileState>[];
-      _pathToFiles[path] = files;
-      fileStamp++;
-    }
-    files.add(file);
-  }
-
   /// Clear all [FileState] data - all maps from path or URI, etc.
   void _clearFiles() {
     _uriToFile.clear();
     knownFilePaths.clear();
     knownFiles.clear();
     _hasUriForPath.clear();
-    _pathToFiles.clear();
-    _pathToCanonicalFile.clear();
+    _pathToFile.clear();
     _librariesWithoutPartsRead.clear();
     _partToLibraries.clear();
     _subtypedNameToFiles.clear();
   }
+
+  FileState _newFile(File resource, String path, Uri uri) {
+    FileSource uriSource = FileSource(resource, uri);
+    WorkspacePackage? workspacePackage = _workspace?.findPackageFor(path);
+    FeatureSet featureSet = contextFeatureSet(path, uri, workspacePackage);
+    Version packageLanguageVersion =
+        contextLanguageVersion(path, uri, workspacePackage);
+    var file = FileState._(this, path, uri, uriSource, workspacePackage,
+        featureSet, packageLanguageVersion);
+    _pathToFile[path] = file;
+    _uriToFile[uri] = file;
+    knownFilePaths.add(path);
+    knownFiles.add(file);
+    fileStamp++;
+    file.refresh();
+    return file;
+  }
 }
 
 @visibleForTesting
@@ -971,3 +972,46 @@
         .toSet();
   }
 }
+
+/// Precomputed properties of a file URI, used because [Uri] is relatively
+/// expensive to work with, if we do this thousand times.
+class FileUriProperties {
+  static const int _isDart = 1 << 0;
+  static const int _isSrc = 1 << 1;
+
+  final int _flags;
+  final String? packageName;
+
+  factory FileUriProperties(Uri uri) {
+    if (uri.isScheme('dart')) {
+      return const FileUriProperties._dart();
+    } else if (uri.isScheme('package')) {
+      var segments = uri.pathSegments;
+      if (segments.length >= 2) {
+        return FileUriProperties._package(
+          packageName: segments[0],
+          isSrc: segments[1] == 'src',
+        );
+      }
+    }
+    return const FileUriProperties._unknown();
+  }
+
+  const FileUriProperties._dart()
+      : _flags = _isDart,
+        packageName = null;
+
+  FileUriProperties._package({
+    required String packageName,
+    required bool isSrc,
+  })  : _flags = isSrc ? _isSrc : 0,
+        packageName = packageName;
+
+  const FileUriProperties._unknown()
+      : _flags = 0,
+        packageName = null;
+
+  bool get isDart => (_flags & _isDart) != 0;
+
+  bool get isSrc => (_flags & _isSrc) != 0;
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart b/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
index d183ecc..887f450 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
@@ -166,15 +166,9 @@
     return _logger.run('Verify API signature of $path', () {
       _logger.writeln('Work in ${_fsState.contextName}');
 
-      bool anyApiChanged = false;
-      List<FileState> files = _fsState.getFilesForPath(path);
-      for (FileState file in files) {
-        bool apiChanged = file.refresh();
-        if (apiChanged) {
-          anyApiChanged = true;
-        }
-      }
-      if (anyApiChanged) {
+      var file = _fsState.getFileForPath(path);
+      var apiChanged = file.refresh();
+      if (apiChanged) {
         _logger.writeln('API signatures mismatch found.');
         // TODO(scheglov) schedule analysis of only affected files
         var pendingChangedFiles = <String>{};
@@ -190,10 +184,8 @@
         // Add files that directly import the changed file.
         for (String addedPath in addedFiles) {
           FileState addedFile = _fsState.getFileForPath(addedPath);
-          for (FileState changedFile in files) {
-            if (addedFile.importedFiles.contains(changedFile)) {
-              pendingImportFiles.add(addedPath);
-            }
+          if (addedFile.importedFiles.contains(file)) {
+            pendingImportFiles.add(addedPath);
           }
         }
 
@@ -220,7 +212,7 @@
         _pendingErrorFiles = pendingErrorFiles;
         _pendingFiles = pendingFiles;
       }
-      return files[0];
+      return file;
     });
   }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index f6a39e8..beabb03 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -41,6 +41,7 @@
 import 'package:analyzer/src/generated/ffi_verifier.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/hint/sdk_constraint_verifier.dart';
 import 'package:analyzer/src/ignore_comments/ignore_info.dart';
 import 'package:analyzer/src/lint/linter.dart';
@@ -48,6 +49,8 @@
 import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/task/strong/checker.dart';
+import 'package:analyzer/src/util/performance/operation_performance.dart';
+import 'package:analyzer/src/util/uri.dart';
 import 'package:pub_semver/pub_semver.dart';
 
 var timerLibraryAnalyzer = Stopwatch();
@@ -57,6 +60,16 @@
 var timerLibraryAnalyzerSplicer = Stopwatch();
 var timerLibraryAnalyzerVerify = Stopwatch();
 
+class AnalysisForCompletionResult {
+  final CompilationUnit parsedUnit;
+  final List<AstNode> resolvedNodes;
+
+  AnalysisForCompletionResult({
+    required this.parsedUnit,
+    required this.resolvedNodes,
+  });
+}
+
 /// Analyzer of a single library.
 class LibraryAnalyzer {
   /// A marker object used to prevent the initialization of
@@ -192,6 +205,84 @@
     return results;
   }
 
+  AnalysisForCompletionResult analyzeForCompletion({
+    required FileState file,
+    required int offset,
+    required CompilationUnitElementImpl unitElement,
+    required OperationPerformanceImpl performance,
+  }) {
+    var parsedUnit = performance.run('parse', (performance) {
+      return _parse(file);
+    });
+
+    var node = NodeLocator(offset).searchWithin(parsedUnit);
+
+    if (_hasEmptyCompletionContext(node)) {
+      return AnalysisForCompletionResult(
+        parsedUnit: parsedUnit,
+        resolvedNodes: [],
+      );
+    }
+
+    var errorListener = RecordingErrorListener();
+
+    return performance.run('resolve', (performance) {
+      // TODO(scheglov) We don't need to do this for the whole unit.
+      parsedUnit.accept(
+        ResolutionVisitor(
+          unitElement: unitElement,
+          errorListener: errorListener,
+          featureSet: _libraryElement.featureSet,
+          nameScope: _libraryElement.scope,
+          elementWalker: ElementWalker.forCompilationUnit(
+            unitElement,
+            libraryFilePath: _library.path,
+            unitFilePath: file.path,
+          ),
+        ),
+      );
+
+      // TODO(scheglov) We don't need to do this for the whole unit.
+      parsedUnit.accept(ScopeResolverVisitor(
+          _libraryElement, file.source, _typeProvider, errorListener,
+          nameScope: _libraryElement.scope));
+
+      FlowAnalysisHelper flowAnalysisHelper = FlowAnalysisHelper(
+          _typeSystem, _testingData != null, _libraryElement.featureSet);
+      _testingData?.recordFlowAnalysisDataForTesting(
+          file.uri, flowAnalysisHelper.dataForTesting!);
+
+      var resolverVisitor = ResolverVisitor(_inheritance, _libraryElement,
+          file.source, _typeProvider, errorListener,
+          featureSet: _libraryElement.featureSet,
+          flowAnalysisHelper: flowAnalysisHelper);
+
+      var nodeToResolve = node?.thisOrAncestorMatching((e) {
+        return e.parent is ClassDeclaration ||
+            e.parent is CompilationUnit ||
+            e.parent is ExtensionDeclaration ||
+            e.parent is MixinDeclaration;
+      });
+      if (nodeToResolve != null) {
+        var can = resolverVisitor.prepareForResolving(nodeToResolve);
+        if (can) {
+          nodeToResolve.accept(resolverVisitor);
+          return AnalysisForCompletionResult(
+            parsedUnit: parsedUnit,
+            resolvedNodes: [nodeToResolve],
+          );
+        }
+      }
+
+      var resolvedUnits = analyze();
+      var resolvedUnit = resolvedUnits[file]!;
+      return AnalysisForCompletionResult(
+        parsedUnit: resolvedUnit.unit,
+        resolvedNodes: [resolvedUnit.unit],
+      );
+    });
+  }
+
   void _checkForInconsistentLanguageVersionOverride(
     Map<FileState, CompilationUnit> units,
   ) {
@@ -244,7 +335,7 @@
   /// Compute [_constants] in all units.
   void _computeConstants() {
     computeConstants(_typeProvider, _typeSystem, _declaredVariables,
-        _constants.toList(), _analysisOptions.experimentStatus);
+        _constants.toList(), _libraryElement.featureSet);
   }
 
   void _computeHints(FileState file, CompilationUnit unit) {
@@ -683,6 +774,18 @@
         featureSet: unit.featureSet, flowAnalysisHelper: flowAnalysisHelper));
   }
 
+  Uri? _resolveRelativeUri(String relativeUriStr) {
+    Uri relativeUri;
+    try {
+      relativeUri = Uri.parse(relativeUriStr);
+    } on FormatException {
+      return null;
+    }
+
+    var absoluteUri = resolveRelativeUri(_library.uri, relativeUri);
+    return rewriteFileToPackageUri(_sourceFactory, absoluteUri);
+  }
+
   /// Return the result of resolve the given [uriContent], reporting errors
   /// against the [uriLiteral].
   Source? _resolveUri(FileState file, bool isImport, StringLiteral uriLiteral,
@@ -724,12 +827,12 @@
         directive.uriSource = defaultSource;
       }
       if (directive is NamespaceDirectiveImpl) {
-        var relativeUri = _selectRelativeUri(directive);
-        directive.selectedUriContent = relativeUri;
-        directive.selectedSource = _sourceFactory.resolveUri(
-          _library.source,
-          relativeUri,
-        );
+        var relativeUriStr = _selectRelativeUri(directive);
+        directive.selectedUriContent = relativeUriStr;
+        var absoluteUri = _resolveRelativeUri(relativeUriStr);
+        if (absoluteUri != null) {
+          directive.selectedSource = _sourceFactory.forUri2(absoluteUri);
+        }
         for (var configuration in directive.configurations) {
           configuration as ConfigurationImpl;
           var uriLiteral = configuration.uri;
@@ -816,6 +919,54 @@
       }
     }
   }
+
+  static bool _hasEmptyCompletionContext(AstNode? node) {
+    if (node is DoubleLiteral || node is IntegerLiteral) {
+      return true;
+    }
+
+    if (node is SimpleIdentifier) {
+      var parent = node.parent;
+
+      if (parent is ConstructorDeclaration && parent.name == node) {
+        return true;
+      }
+
+      if (parent is ConstructorFieldInitializer && parent.fieldName == node) {
+        return true;
+      }
+
+      // We have a contributor that looks at the type, but it is syntactic.
+      if (parent is FormalParameter && parent.identifier == node) {
+        return true;
+      }
+
+      if (parent is FunctionDeclaration && parent.name == node) {
+        return true;
+      }
+
+      if (parent is MethodDeclaration && parent.name == node) {
+        return true;
+      }
+
+      // The name of a NamedType does not provide any context.
+      // So, we don't need to resolve anything.
+      if (parent is NamedType) {
+        return true;
+      }
+
+      if (parent is TypeParameter && parent.name == node) {
+        return true;
+      }
+
+      // We have a contributor that looks at the type, but it is syntactic.
+      if (parent is VariableDeclaration && parent.name == node) {
+        return true;
+      }
+    }
+
+    return false;
+  }
 }
 
 /// Analysis result for single file.
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index dbdb140..4795da1 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
@@ -81,6 +81,11 @@
     return elementFactory.libraryOfUri2('$uri');
   }
 
+  /// Return [LibraryElement] if it is ready.
+  LibraryElement? getLibraryElementIfReady(String uriStr) {
+    return elementFactory.libraryOfUriIfReady(uriStr);
+  }
+
   /// We are about to discard this context, mark all libraries invalid.
   void invalidAllLibraries() {
     elementFactory.invalidateAllLibraries();
diff --git a/pkg/analyzer/lib/src/dart/analysis/results.dart b/pkg/analyzer/lib/src/dart/analysis/results.dart
index 4856a55..a8184db 100644
--- a/pkg/analyzer/lib/src/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/results.dart
@@ -167,6 +167,48 @@
   LineInfo get lineInfo => unit.lineInfo!;
 }
 
+class ResolvedForCompletionResultImpl {
+  final AnalysisSession analysisSession;
+  final String path;
+  final Uri uri;
+  final bool exists;
+  final String content;
+  final LineInfo lineInfo;
+
+  /// The full parsed unit.
+  final CompilationUnit parsedUnit;
+
+  /// The full element for the unit.
+  final CompilationUnitElement unitElement;
+
+  /// Nodes from [parsedUnit] that were resolved to provide enough context
+  /// to perform completion. How much is enough depends on the location
+  /// where resolution for completion was requested, and our knowledge
+  /// how completion contributors work and what information they expect.
+  ///
+  /// This is usually a small subset of the whole unit - a method, a field.
+  /// It could be even empty if the location does not provide any context
+  /// information for any completion contributor, e.g. a type annotation.
+  /// But it could be the whole unit as well, if the location is not something
+  /// we have an optimization for.
+  ///
+  /// If this list is not empty, then the last node contains the requested
+  /// offset. Other nodes are provided mostly FYI.
+  final List<AstNode> resolvedNodes;
+
+  ResolvedForCompletionResultImpl({
+    required this.analysisSession,
+    required this.path,
+    required this.uri,
+    required this.exists,
+    required this.content,
+    required this.lineInfo,
+    required this.parsedUnit,
+    required this.unitElement,
+    required this.resolvedNodes,
+  });
+}
+
 class ResolvedLibraryResultImpl extends AnalysisResultImpl
     implements ResolvedLibraryResult {
   @override
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index 4e0449b..651e0f9 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/visitor.dart';
+import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/index.dart';
@@ -28,6 +29,102 @@
   return element;
 }
 
+DeclarationKind? _getSearchElementKind(Element element) {
+  if (element is ClassElement) {
+    if (element.isEnum) {
+      return DeclarationKind.ENUM;
+    }
+    if (element.isMixin) return DeclarationKind.MIXIN;
+    if (element.isMixinApplication) return DeclarationKind.CLASS_TYPE_ALIAS;
+    return DeclarationKind.CLASS;
+  }
+
+  if (element is ConstructorElement) {
+    return DeclarationKind.CONSTRUCTOR;
+  }
+
+  if (element is ExtensionElement) {
+    return DeclarationKind.EXTENSION;
+  }
+
+  if (element is FieldElement) {
+    if (element.isEnumConstant) return DeclarationKind.ENUM_CONSTANT;
+    return DeclarationKind.FIELD;
+  }
+
+  if (element is FunctionElement) {
+    return DeclarationKind.FUNCTION;
+  }
+
+  if (element is MethodElement) {
+    return DeclarationKind.METHOD;
+  }
+
+  if (element is PropertyAccessorElement) {
+    return element.isGetter ? DeclarationKind.GETTER : DeclarationKind.SETTER;
+  }
+
+  if (element is TypeAliasElement) {
+    return DeclarationKind.TYPE_ALIAS;
+  }
+
+  if (element is VariableElement) {
+    return DeclarationKind.VARIABLE;
+  }
+
+  return null;
+}
+
+/// An element declaration.
+class Declaration {
+  final int fileIndex;
+  final LineInfo lineInfo;
+  final String name;
+  final DeclarationKind kind;
+  final int offset;
+  final int line;
+  final int column;
+  final int codeOffset;
+  final int codeLength;
+  final String? className;
+  final String? mixinName;
+  final String? parameters;
+
+  Declaration(
+    this.fileIndex,
+    this.lineInfo,
+    this.name,
+    this.kind,
+    this.offset,
+    this.line,
+    this.column,
+    this.codeOffset,
+    this.codeLength,
+    this.className,
+    this.mixinName,
+    this.parameters,
+  );
+}
+
+/// The kind of a [Declaration].
+enum DeclarationKind {
+  CLASS,
+  CLASS_TYPE_ALIAS,
+  CONSTRUCTOR,
+  ENUM,
+  ENUM_CONSTANT,
+  EXTENSION,
+  FIELD,
+  FUNCTION,
+  FUNCTION_TYPE_ALIAS,
+  GETTER,
+  METHOD,
+  MIXIN,
+  SETTER,
+  TYPE_ALIAS,
+  VARIABLE
+}
+
 /// Search support for an [AnalysisDriver].
 class Search {
   final AnalysisDriver _driver;
@@ -64,6 +161,114 @@
     return elements;
   }
 
+  /// Add matching declarations to the [result].
+  Future<void> declarations(
+      WorkspaceSymbols result, RegExp? regExp, int? maxResults,
+      {String? onlyForFile}) async {
+    if (result.hasMoreDeclarationsThan(maxResults)) {
+      return;
+    }
+
+    void addDeclaration(LineInfo lineInfo, Element element) {
+      if (result.hasMoreDeclarationsThan(maxResults)) {
+        throw const _MaxNumberOfDeclarationsError();
+      }
+
+      if (element.isSynthetic) {
+        return;
+      }
+
+      var source = element.source;
+      if (source == null) {
+        return;
+      }
+
+      var path = source.fullName;
+      if (onlyForFile != null && path != onlyForFile) {
+        return;
+      }
+
+      var name = element.name;
+      if (name == null || name.isEmpty) {
+        return;
+      }
+      if (name.endsWith('=')) {
+        name = name.substring(0, name.length - 1);
+      }
+      if (regExp != null && !regExp.hasMatch(name)) {
+        return;
+      }
+
+      var enclosing = element.enclosingElement;
+
+      String? className;
+      String? mixinName;
+      if (enclosing is ClassElement) {
+        if (enclosing.isEnum) {
+          // skip
+        } else if (enclosing.isMixin) {
+          mixinName = enclosing.name;
+        } else {
+          className = enclosing.name;
+        }
+      }
+
+      var kind = _getSearchElementKind(element);
+      if (kind == null) {
+        return;
+      }
+
+      String? parameters;
+      if (element is ExecutableElement) {
+        var displayString = element.getDisplayString(withNullability: true);
+        var parameterIndex = displayString.indexOf('(');
+        if (parameterIndex > 0) {
+          parameters = displayString.substring(parameterIndex);
+        }
+      }
+
+      element as ElementImpl; // to access codeOffset/codeLength
+      var locationOffset = element.nameOffset;
+      var locationStart = lineInfo.getLocation(locationOffset);
+
+      result.declarations.add(
+        Declaration(
+          result._getPathIndex(path),
+          lineInfo,
+          name,
+          kind,
+          locationOffset,
+          locationStart.lineNumber,
+          locationStart.columnNumber,
+          element.codeOffset ?? 0,
+          element.codeLength ?? 0,
+          className,
+          mixinName,
+          parameters,
+        ),
+      );
+    }
+
+    await _driver.discoverAvailableFiles();
+    var knownFiles = _driver.fsState.knownFiles.toList();
+    for (var file in knownFiles) {
+      var libraryElement = _driver.getLibraryByFile(file);
+      if (libraryElement != null) {
+        for (var unitElement in libraryElement.units) {
+          try {
+            unitElement.accept(
+              _FunctionElementVisitor((element) {
+                addDeclaration(unitElement.lineInfo!, element);
+              }),
+            );
+          } on _MaxNumberOfDeclarationsError {
+            return;
+          }
+        }
+      }
+    }
+  }
+
   /// Returns references to the [element].
   Future<List<SearchResult>> references(
       Element? element, SearchedFiles searchedFiles) async {
@@ -604,6 +809,26 @@
   String toString() => id;
 }
 
+class WorkspaceSymbols {
+  final List<Declaration> declarations = [];
+  final List<String> files = [];
+  final Map<String, int> _pathToIndex = {};
+
+  bool hasMoreDeclarationsThan(int? maxResults) {
+    return maxResults != null && declarations.length >= maxResults;
+  }
+
+  int _getPathIndex(String path) {
+    var index = _pathToIndex[path];
+    if (index == null) {
+      index = files.length;
+      files.add(path);
+      _pathToIndex[path] = index;
+    }
+    return index;
+  }
+}
+
 /// A visitor that finds the deep-most [Element] that contains the [offset].
 class _ContainingElementFinder extends GeneralizingElementVisitor<void> {
   final int offset;
@@ -624,6 +849,19 @@
   }
 }
 
+/// A visitor that handles any element with a function.
+class _FunctionElementVisitor extends GeneralizingElementVisitor<void> {
+  final void Function(Element element) process;
+
+  _FunctionElementVisitor(this.process);
+
+  @override
+  void visitElement(Element element) {
+    process(element);
+    super.visitElement(element);
+  }
+}
+
 /// Visitor that adds [SearchResult]s for references to the [importElement].
 class _ImportElementReferencesVisitor extends RecursiveAstVisitor<void> {
   final List<SearchResult> results = <SearchResult>[];
@@ -950,3 +1188,8 @@
         enclosingElement, kind, node.offset, node.length, true, isQualified));
   }
 }
+
+/// The marker class that is thrown to stop adding declarations.
+class _MaxNumberOfDeclarationsError {
+  const _MaxNumberOfDeclarationsError();
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/session.dart b/pkg/analyzer/lib/src/dart/analysis/session.dart
index 319ddc6..6376bc1 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session.dart
@@ -221,11 +221,13 @@
 
     _typeSystemLegacy?.updateOptions(
       implicitCasts: analysisOptions.implicitCasts,
+      strictCasts: analysisOptions.strictCasts,
       strictInference: analysisOptions.strictInference,
     );
 
     _typeSystemNonNullableByDefault?.updateOptions(
       implicitCasts: analysisOptions.implicitCasts,
+      strictCasts: analysisOptions.strictCasts,
       strictInference: analysisOptions.strictInference,
     );
   }
@@ -268,6 +270,7 @@
     _typeSystemLegacy = TypeSystemImpl(
       implicitCasts: _analysisOptions.implicitCasts,
       isNonNullableByDefault: false,
+      strictCasts: _analysisOptions.strictCasts,
       strictInference: _analysisOptions.strictInference,
       typeProvider: legacy,
     );
@@ -275,6 +278,7 @@
     _typeSystemNonNullableByDefault = TypeSystemImpl(
       implicitCasts: _analysisOptions.implicitCasts,
       isNonNullableByDefault: true,
+      strictCasts: _analysisOptions.strictCasts,
       strictInference: _analysisOptions.strictInference,
       typeProvider: nonNullableByDefault,
     );
diff --git a/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart b/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart
index 9e6bf4a..bda06b6 100644
--- a/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart
@@ -5,7 +5,6 @@
 import 'package:analyzer/dart/analysis/uri_converter.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:path/src/context.dart';
 
 /// An implementation of a URI converter based on an analysis driver.
@@ -32,8 +31,7 @@
         }
       }
     }
-    Source source = provider.getFile(path).createSource();
-    return driver.sourceFactory.restoreUri(source);
+    return driver.sourceFactory.pathToUri(path);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 24e1241..3ab0730 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -3301,6 +3301,9 @@
   /// The enumeration constants being declared.
   final NodeListImpl<EnumConstantDeclaration> _constants = NodeListImpl._();
 
+  /// The members defined by the enum.
+  final NodeListImpl<ClassMember> _members = NodeListImpl._();
+
   /// The right curly bracket.
   @override
   Token rightBracket;
@@ -3316,9 +3319,11 @@
       SimpleIdentifierImpl name,
       this.leftBracket,
       List<EnumConstantDeclaration> constants,
+      List<ClassMember> members,
       this.rightBracket)
       : super(comment, metadata, name) {
     _constants._initialize(this, constants);
+    _members._initialize(this, members);
   }
 
   @override
@@ -3328,6 +3333,7 @@
     ..add(_name)
     ..add(leftBracket)
     ..addAll(_constants)
+    ..addAll(_members)
     ..add(rightBracket);
 
   @override
@@ -3343,6 +3349,9 @@
   Token get firstTokenAfterCommentAndMetadata => enumKeyword;
 
   @override
+  NodeListImpl<ClassMember> get members => _members;
+
+  @override
   E? accept<E>(AstVisitor<E> visitor) => visitor.visitEnumDeclaration(this);
 
   @override
@@ -3350,6 +3359,7 @@
     super.visitChildren(visitor);
     _name.accept(visitor);
     _constants.accept(visitor);
+    _members.accept(visitor);
   }
 }
 
@@ -9751,6 +9761,144 @@
   }
 }
 
+/// A super-initializer formal parameter.
+///
+///    fieldFormalParameter ::=
+///        ('final' [TypeName] | 'const' [TypeName] | 'var' | [TypeName])?
+///        'super' '.' [SimpleIdentifier]
+///        ([TypeParameterList]? [FormalParameterList])?
+class SuperFormalParameterImpl extends NormalFormalParameterImpl
+    implements SuperFormalParameter {
+  /// The token representing either the 'final', 'const' or 'var' keyword, or
+  /// `null` if no keyword was used.
+  @override
+  Token? keyword;
+
+  /// The name of the declared type of the parameter, or `null` if the parameter
+  /// does not have a declared type.
+  TypeAnnotationImpl? _type;
+
+  /// The token representing the 'super' keyword.
+  @override
+  Token superKeyword;
+
+  /// The token representing the period.
+  @override
+  Token period;
+
+  /// The type parameters associated with the method, or `null` if the method is
+  /// not a generic method.
+  TypeParameterListImpl? _typeParameters;
+
+  /// The parameters of the function-typed parameter, or `null` if this is not a
+  /// function-typed field formal parameter.
+  FormalParameterListImpl? _parameters;
+
+  @override
+  Token? question;
+
+  /// Initialize a newly created formal parameter. Either or both of the
+  /// [comment] and [metadata] can be `null` if the parameter does not have the
+  /// corresponding attribute. The [keyword] can be `null` if there is a type.
+  /// The [type] must be `null` if the keyword is 'var'. The [thisKeyword] and
+  /// [period] can be `null` if the keyword 'this' was not provided.  The
+  /// [parameters] can be `null` if this is not a function-typed field formal
+  /// parameter.
+  SuperFormalParameterImpl(
+      CommentImpl? comment,
+      List<Annotation>? metadata,
+      Token? covariantKeyword,
+      Token? requiredKeyword,
+      this.keyword,
+      this._type,
+      this.superKeyword,
+      this.period,
+      SimpleIdentifierImpl identifier,
+      this._typeParameters,
+      this._parameters,
+      this.question)
+      : super(
+            comment, metadata, covariantKeyword, requiredKeyword, identifier) {
+    _becomeParentOf(_type);
+    _becomeParentOf(_typeParameters);
+    _becomeParentOf(_parameters);
+  }
+
+  @override
+  Token get beginToken {
+    final metadata = this.metadata;
+    if (metadata.isNotEmpty) {
+      return metadata.beginToken!;
+    } else if (requiredKeyword != null) {
+      return requiredKeyword!;
+    } else if (covariantKeyword != null) {
+      return covariantKeyword!;
+    } else if (keyword != null) {
+      return keyword!;
+    } else if (_type != null) {
+      return _type!.beginToken;
+    }
+    return superKeyword;
+  }
+
+  @override
+  Iterable<SyntacticEntity> get childEntities => super._childEntities
+    ..add(keyword)
+    ..add(_type)
+    ..add(superKeyword)
+    ..add(period)
+    ..add(identifier)
+    ..add(_parameters);
+
+  @override
+  Token get endToken {
+    return question ?? _parameters?.endToken ?? identifier.endToken;
+  }
+
+  @override
+  SimpleIdentifierImpl get identifier => super.identifier!;
+
+  @override
+  bool get isConst => keyword?.keyword == Keyword.CONST;
+
+  @override
+  bool get isFinal => keyword?.keyword == Keyword.FINAL;
+
+  @override
+  FormalParameterListImpl? get parameters => _parameters;
+
+  set parameters(FormalParameterList? parameters) {
+    _parameters = _becomeParentOf(parameters as FormalParameterListImpl?);
+  }
+
+  @override
+  TypeAnnotationImpl? get type => _type;
+
+  set type(TypeAnnotation? type) {
+    _type = _becomeParentOf(type as TypeAnnotationImpl);
+  }
+
+  @override
+  TypeParameterListImpl? get typeParameters => _typeParameters;
+
+  set typeParameters(TypeParameterList? typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl?);
+  }
+
+  @override
+  E? accept<E>(AstVisitor<E> visitor) =>
+      visitor.visitSuperFormalParameter(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _type?.accept(visitor);
+    identifier.accept(visitor);
+    _typeParameters?.accept(visitor);
+    _parameters?.accept(visitor);
+  }
+}
+
 /// A case in a switch statement.
 ///
 ///    switchCase ::=
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index 23b899cdf..b7a9b76 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -391,9 +391,17 @@
           SimpleIdentifier name,
           Token leftBracket,
           List<EnumConstantDeclaration> constants,
+          List<ClassMember> members,
           Token rightBracket) =>
-      EnumDeclarationImpl(comment as CommentImpl?, metadata, enumKeyword,
-          name as SimpleIdentifierImpl, leftBracket, constants, rightBracket);
+      EnumDeclarationImpl(
+          comment as CommentImpl?,
+          metadata,
+          enumKeyword,
+          name as SimpleIdentifierImpl,
+          leftBracket,
+          constants,
+          members,
+          rightBracket);
 
   @override
   ExportDirectiveImpl exportDirective(
@@ -1185,6 +1193,34 @@
       SuperExpressionImpl(superKeyword);
 
   @override
+  SuperFormalParameterImpl superFormalParameter(
+          {Comment? comment,
+          List<Annotation>? metadata,
+          Token? covariantKeyword,
+          Token? requiredKeyword,
+          Token? keyword,
+          TypeAnnotation? type,
+          required Token superKeyword,
+          required Token period,
+          required SimpleIdentifier identifier,
+          TypeParameterList? typeParameters,
+          FormalParameterList? parameters,
+          Token? question}) =>
+      SuperFormalParameterImpl(
+          comment as CommentImpl?,
+          metadata,
+          covariantKeyword,
+          requiredKeyword,
+          keyword,
+          type as TypeAnnotationImpl?,
+          superKeyword,
+          period,
+          identifier as SimpleIdentifierImpl,
+          typeParameters as TypeParameterListImpl?,
+          parameters as FormalParameterListImpl?,
+          question);
+
+  @override
   SwitchCaseImpl switchCase(List<Label> labels, Token keyword,
           Expression expression, Token colon, List<Statement> statements) =>
       SwitchCaseImpl(
diff --git a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
index f9ac572..49dff85 100644
--- a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
@@ -953,6 +953,19 @@
   }
 
   @override
+  void visitSuperFormalParameter(SuperFormalParameter node) {
+    _visitNodeList(node.metadata, separator: ' ', suffix: ' ');
+    _visitToken(node.requiredKeyword, suffix: ' ');
+    _visitToken(node.covariantKeyword, suffix: ' ');
+    _visitToken(node.keyword, suffix: ' ');
+    _visitNode(node.type, suffix: ' ');
+    sink.write('super.');
+    _visitNode(node.identifier);
+    _visitNode(node.typeParameters);
+    _visitNode(node.parameters);
+  }
+
+  @override
   void visitSwitchCase(SwitchCase node) {
     _visitNodeList(node.labels, separator: ' ', suffix: ' ');
     sink.write('case ');
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 1b2249a..3bbe4f6 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -1103,6 +1103,19 @@
   }
 
   @override
+  bool visitSuperFormalParameter(SuperFormalParameter node) {
+    SuperFormalParameter other = _other as SuperFormalParameter;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.keyword, other.keyword) &&
+        isEqualNodes(node.type, other.type) &&
+        isEqualTokens(node.superKeyword, other.superKeyword) &&
+        isEqualTokens(node.period, other.period) &&
+        isEqualNodes(node.identifier, other.identifier);
+  }
+
+  @override
   bool visitSwitchCase(SwitchCase node) {
     SwitchCase other = _other as SwitchCase;
     return _isEqualNodeLists(node.labels, other.labels) &&
@@ -1735,6 +1748,9 @@
     } else if (identical(node.stackTraceParameter, _oldNode)) {
       node.stackTraceParameter = _newNode as SimpleIdentifier;
       return true;
+    } else if (identical(node.body, _oldNode)) {
+      node.body = _newNode as Block;
+      return true;
     }
     return visitNode(node);
   }
@@ -2793,6 +2809,21 @@
       visitNode(node);
 
   @override
+  bool visitSuperFormalParameter(covariant SuperFormalParameterImpl node) {
+    if (identical(node.type, _oldNode)) {
+      node.type = _newNode as TypeAnnotation;
+      return true;
+    } else if (identical(node.typeParameters, _oldNode)) {
+      node.typeParameters = _newNode as TypeParameterList;
+      return true;
+    } else if (identical(node.parameters, _oldNode)) {
+      node.parameters = _newNode as FormalParameterList;
+      return true;
+    }
+    return visitNormalFormalParameter(node);
+  }
+
+  @override
   bool visitSwitchCase(covariant SwitchCaseImpl node) {
     if (identical(node.expression, _oldNode)) {
       node.expression = _newNode as Expression;
diff --git a/pkg/analyzer/lib/src/dart/constant/compute.dart b/pkg/analyzer/lib/src/dart/constant/compute.dart
index 295c41c..cb56ffe 100644
--- a/pkg/analyzer/lib/src/dart/constant/compute.dart
+++ b/pkg/analyzer/lib/src/dart/constant/compute.dart
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/element/type_provider.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/dart/element/type_system.dart';
@@ -17,8 +17,8 @@
     TypeSystemImpl typeSystem,
     DeclaredVariables declaredVariables,
     List<ConstantEvaluationTarget> constants,
-    ExperimentStatus experimentStatus) {
-  var walker = _ConstantWalker(declaredVariables, experimentStatus);
+    FeatureSet featureSet) {
+  var walker = _ConstantWalker(declaredVariables, featureSet);
 
   for (var constant in constants) {
     var node = walker._getNode(constant);
@@ -47,10 +47,10 @@
 /// [graph.DependencyWalker] for computing constants and detecting cycles.
 class _ConstantWalker extends graph.DependencyWalker<_ConstantNode> {
   final DeclaredVariables declaredVariables;
-  final ExperimentStatus experimentStatus;
+  final FeatureSet featureSet;
   final Map<ConstantEvaluationTarget, _ConstantNode> nodeMap = {};
 
-  _ConstantWalker(this.declaredVariables, this.experimentStatus);
+  _ConstantWalker(this.declaredVariables, this.featureSet);
 
   @override
   void evaluate(_ConstantNode node) {
@@ -79,7 +79,7 @@
   ConstantEvaluationEngine _getEvaluationEngine(_ConstantNode node) {
     return ConstantEvaluationEngine(
       declaredVariables: declaredVariables,
-      isNonNullableByDefault: experimentStatus.non_nullable,
+      isNonNullableByDefault: featureSet.isEnabled(Feature.non_nullable),
     );
   }
 
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index ac9fbb1..3e230c6 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -643,7 +643,7 @@
     TypeAliasElement? viaTypeAlias;
     if (typeElement is TypeAliasElementImpl) {
       if (constructorFunctionType.typeFormals.isNotEmpty &&
-          !typeElement.isProperRename()) {
+          !typeElement.isProperRename) {
         // The type alias is not a proper rename of the aliased class, so
         // the constructor tear-off is distinct from the associated
         // constructor function of the aliased class.
diff --git a/pkg/analyzer/lib/src/dart/constant/value.dart b/pkg/analyzer/lib/src/dart/constant/value.dart
index 094b8b6..313caf6 100644
--- a/pkg/analyzer/lib/src/dart/constant/value.dart
+++ b/pkg/analyzer/lib/src/dart/constant/value.dart
@@ -518,6 +518,7 @@
     var typeSystem = TypeSystemImpl(
       implicitCasts: false,
       isNonNullableByDefault: false,
+      strictCasts: false,
       strictInference: false,
       typeProvider: typeProvider,
     );
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index d5bc77f..d491590 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -34,8 +34,7 @@
     show Namespace, NamespaceBuilder;
 import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:analyzer/src/generated/element_type_provider.dart';
-import 'package:analyzer/src/generated/engine.dart'
-    show AnalysisContext, AnalysisOptionsImpl;
+import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
 import 'package:analyzer/src/generated/source.dart';
@@ -1572,9 +1571,8 @@
   /// of formal parameters, are evaluated.
   void computeConstantDependencies() {
     if (!isConstantEvaluated) {
-      var analysisOptions = context.analysisOptions as AnalysisOptionsImpl;
       computeConstants(library.typeProvider, library.typeSystem,
-          context.declaredVariables, [this], analysisOptions.experimentStatus);
+          context.declaredVariables, [this], library.featureSet);
     }
   }
 }
@@ -1650,9 +1648,8 @@
   /// of this variable could not be computed because of errors.
   DartObject? computeConstantValue() {
     if (evaluationResult == null) {
-      var analysisOptions = context.analysisOptions as AnalysisOptionsImpl;
       computeConstants(library!.typeProvider, library!.typeSystem,
-          context.declaredVariables, [this], analysisOptions.experimentStatus);
+          context.declaredVariables, [this], library!.featureSet);
     }
     return evaluationResult?.value;
   }
@@ -1982,10 +1979,9 @@
   @override
   DartObject? computeConstantValue() {
     if (evaluationResult == null) {
-      var analysisOptions = context.analysisOptions as AnalysisOptionsImpl;
       var library = compilationUnit.library;
       computeConstants(library.typeProvider, library.typeSystem,
-          context.declaredVariables, [this], analysisOptions.experimentStatus);
+          context.declaredVariables, [this], library.featureSet);
     }
     return evaluationResult?.value;
   }
@@ -2033,6 +2029,10 @@
 
 /// A base class for concrete implementations of an [Element].
 abstract class ElementImpl implements Element {
+  static const _metadataFlag_isReady = 1 << 0;
+  static const _metadataFlag_hasDeprecated = 1 << 1;
+  static const _metadataFlag_hasOverride = 1 << 2;
+
   /// An Unicode right arrow.
   @deprecated
   static final String RIGHT_ARROW = " \u2192 ";
@@ -2061,6 +2061,9 @@
   /// A list containing all of the metadata associated with this element.
   List<ElementAnnotation> _metadata = const [];
 
+  /// Cached flags denoting presence of specific annotations in [_metadata].
+  int _metadataFlags = 0;
+
   /// A cached copy of the calculated hashCode for this element.
   int? _cachedHashCode;
 
@@ -2138,14 +2141,7 @@
 
   @override
   bool get hasDeprecated {
-    final metadata = this.metadata;
-    for (var i = 0; i < metadata.length; i++) {
-      var annotation = metadata[i];
-      if (annotation.isDeprecated) {
-        return true;
-      }
-    }
-    return false;
+    return (_getMetadataFlags() & _metadataFlag_hasDeprecated) != 0;
   }
 
   @override
@@ -2277,14 +2273,7 @@
 
   @override
   bool get hasOverride {
-    final metadata = this.metadata;
-    for (var i = 0; i < metadata.length; i++) {
-      var annotation = metadata[i];
-      if (annotation.isOverride) {
-        return true;
-      }
-    }
-    return false;
+    return (_getMetadataFlags() & _metadataFlag_hasOverride) != 0;
   }
 
   /// Return `true` if this element has an annotation of the form
@@ -2587,6 +2576,29 @@
   void visitChildren(ElementVisitor visitor) {
     // There are no children to visit
   }
+
+  /// Return flags that denote presence of a few specific annotations.
+  int _getMetadataFlags() {
+    var result = _metadataFlags;
+
+    // Has at least `_metadataFlag_isReady`.
+    if (result != 0) {
+      return result;
+    }
+
+    final metadata = this.metadata;
+    for (var i = 0; i < metadata.length; i++) {
+      var annotation = metadata[i];
+      if (annotation.isDeprecated) {
+        result |= _metadataFlag_hasDeprecated;
+      } else if (annotation.isOverride) {
+        result |= _metadataFlag_hasOverride;
+      }
+    }
+
+    result |= _metadataFlag_isReady;
+    return _metadataFlags = result;
+  }
 }
 
 /// Abstract base class for elements whose type is guaranteed to be a function
@@ -5482,6 +5494,34 @@
   CompilationUnitElement get enclosingElement =>
       super.enclosingElement as CompilationUnitElement;
 
+  /// Returns whether this alias is a "proper rename" of [aliasedClass], as
+  /// defined in the constructor-tearoffs specification.
+  bool get isProperRename {
+    var aliasedType_ = aliasedType;
+    if (aliasedType_ is! InterfaceType) {
+      return false;
+    }
+    var aliasedClass = aliasedType_.element;
+    var typeArguments = aliasedType_.typeArguments;
+    var typeParameterCount = typeParameters.length;
+    if (typeParameterCount != aliasedClass.typeParameters.length) {
+      return false;
+    }
+    for (var i = 0; i < typeParameterCount; i++) {
+      var bound = typeParameters[i].bound ?? library.typeProvider.dynamicType;
+      var aliasedBound = aliasedClass.typeParameters[i].bound ??
+          library.typeProvider.dynamicType;
+      if (!library.typeSystem.isSubtypeOf(bound, aliasedBound) ||
+          !library.typeSystem.isSubtypeOf(aliasedBound, bound)) {
+        return false;
+      }
+      if (typeParameters[i] != typeArguments[i].element) {
+        return false;
+      }
+    }
+    return true;
+  }
+
   @override
   ElementKind get kind {
     if (isNonFunctionTypeAliasesEnabled) {
@@ -5582,37 +5622,6 @@
     }
   }
 
-  /// Returns whether this alias is a "proper rename" of [aliasedClass], as
-  /// defined in the constructor-tearoffs specification.
-  bool isProperRename() {
-    var aliasedType_ = aliasedType;
-    if (aliasedType_ is! InterfaceType) {
-      return false;
-    }
-    var aliasedClass = aliasedType_.element;
-    var typeArguments = aliasedType_.typeArguments;
-    var typeParameterCount = typeParameters.length;
-    if (typeParameterCount != aliasedClass.typeParameters.length) {
-      return false;
-    }
-    if (typeParameterCount != typeArguments.length) {
-      return false;
-    }
-    for (var i = 0; i < typeParameterCount; i++) {
-      var bound = typeParameters[i].bound ?? library.typeProvider.dynamicType;
-      var aliasedBound = aliasedClass.typeParameters[i].bound ??
-          library.typeProvider.dynamicType;
-      if (!library.typeSystem.isSubtypeOf(bound, aliasedBound) ||
-          !library.typeSystem.isSubtypeOf(aliasedBound, bound)) {
-        return false;
-      }
-      if (typeParameters[i] != typeArguments[i].element) {
-        return false;
-      }
-    }
-    return true;
-  }
-
   void setLinkedData(Reference reference, ElementLinkedData linkedData) {
     this.reference = reference;
     reference.element = this;
diff --git a/pkg/analyzer/lib/src/dart/element/extensions.dart b/pkg/analyzer/lib/src/dart/element/extensions.dart
index 6eaa94a..7037407 100644
--- a/pkg/analyzer/lib/src/dart/element/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/element/extensions.dart
@@ -6,6 +6,58 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:meta/meta_meta.dart';
+
+extension ElementAnnotationExtensions on ElementAnnotation {
+  static final Map<String, TargetKind> _targetKindsByName = {
+    for (final kind in TargetKind.values) kind.toString(): kind,
+  };
+
+  /// Return the target kinds defined for this [ElementAnnotation].
+  Set<TargetKind> get targetKinds {
+    final element = this.element;
+    ClassElement? classElement;
+    if (element is PropertyAccessorElement) {
+      if (element.isGetter) {
+        var type = element.returnType;
+        if (type is InterfaceType) {
+          classElement = type.element;
+        }
+      }
+    } else if (element is ConstructorElement) {
+      classElement = element.enclosingElement;
+    }
+    if (classElement == null) {
+      return const <TargetKind>{};
+    }
+    for (var annotation in classElement.metadata) {
+      if (annotation.isTarget) {
+        var value = annotation.computeConstantValue()!;
+        var kinds = <TargetKind>{};
+
+        for (var kindObject in value.getField('kinds')!.toSetValue()!) {
+          // We can't directly translate the index from the analyzed TargetKind
+          // constant to TargetKinds.values because the analyzer from the SDK
+          // may have been compiled with a different version of pkg:meta.
+          var index = kindObject.getField('index')!.toIntValue()!;
+          var targetKindClass =
+              (kindObject.type as InterfaceType).element as EnumElementImpl;
+          // Instead, map constants to their TargetKind by comparing getter
+          // names.
+          var getter = targetKindClass.constants[index];
+          var name = 'TargetKind.${getter.name}';
+
+          var foundTargetKind = _targetKindsByName[name];
+          if (foundTargetKind != null) {
+            kinds.add(foundTargetKind);
+          }
+        }
+        return kinds;
+      }
+    }
+    return const <TargetKind>{};
+  }
+}
 
 extension ElementExtension on Element {
   /// Return `true` if this element is an instance member of a class or mixin.
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
index cf52a23..168cc9a 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -401,7 +401,9 @@
       }
     }
 
-    if (getter != null && method != null) {
+    if (getter == null || method == null) {
+      return null;
+    } else {
       return GetterMethodConflict(name: name, getter: getter, method: method);
     }
   }
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 7561115..bb33038 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -20,27 +20,6 @@
 import 'package:analyzer/src/generated/element_type_provider.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 
-/// Transforms the given [list] by applying [transform] to all its elements.
-///
-/// If no changes are made (i.e. the return value of [transform] is identical
-/// to its parameter each time it is invoked), the original list is returned.
-List<T> _transformOrShare<T>(List<T> list, T Function(T) transform) {
-  var length = list.length;
-  for (int i = 0; i < length; i++) {
-    var item = list[i];
-    var transformed = transform(item);
-    if (!identical(item, transformed)) {
-      var newList = list.toList();
-      newList[i] = transformed;
-      for (i++; i < length; i++) {
-        newList[i] = transform(list[i]);
-      }
-      return newList;
-    }
-  }
-  return list;
-}
-
 /// The [Type] representing the type `dynamic`.
 class DynamicTypeImpl extends TypeImpl implements DynamicType {
   /// The unique instance of this class.
@@ -247,16 +226,12 @@
 
     var substitution = Substitution.fromPairs(typeFormals, argumentTypes);
 
-    ParameterElement transformParameter(ParameterElement p) {
-      return p.copyWith(
-        type: substitution.substituteType(p.type),
-      );
-    }
-
     return FunctionTypeImpl(
       returnType: substitution.substituteType(returnType),
       typeFormals: const [],
-      parameters: _transformOrShare(parameters, transformParameter),
+      parameters: parameters
+          .map((p) => p.copyWith(type: substitution.substituteType(p.type)))
+          .toList(),
       nullabilitySuffix: nullabilitySuffix,
     );
   }
diff --git a/pkg/analyzer/lib/src/dart/element/type_algebra.dart b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
index 1ffe3d4..5e1389e 100644
--- a/pkg/analyzer/lib/src/dart/element/type_algebra.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
@@ -567,12 +567,13 @@
   InstantiatedTypeAliasElementImpl? _mapAlias(
     InstantiatedTypeAliasElement? alias,
   ) {
-    if (alias != null) {
-      return InstantiatedTypeAliasElementImpl(
-        element: alias.element,
-        typeArguments: _mapList(alias.typeArguments),
-      );
+    if (alias == null) {
+      return null;
     }
+    return InstantiatedTypeAliasElementImpl(
+      element: alias.element,
+      typeArguments: _mapList(alias.typeArguments),
+    );
   }
 
   List<DartType> _mapList(List<DartType> types) {
diff --git a/pkg/analyzer/lib/src/dart/element/type_system.dart b/pkg/analyzer/lib/src/dart/element/type_system.dart
index ef329f4..b38a654 100644
--- a/pkg/analyzer/lib/src/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_system.dart
@@ -45,6 +45,11 @@
   /// This affects the behavior of [isAssignableTo].
   bool implicitCasts;
 
+  /// True if "strict casts" should be enforced.
+  ///
+  /// This affects the behavior of [isAssignableTo].
+  bool strictCasts;
+
   /// A flag indicating whether inference failures are allowed, off by default.
   ///
   /// This option is experimental and subject to change.
@@ -71,6 +76,7 @@
   TypeSystemImpl({
     required this.implicitCasts,
     required this.isNonNullableByDefault,
+    required this.strictCasts,
     required this.strictInference,
     required TypeProvider typeProvider,
   }) : typeProvider = typeProvider as TypeProviderImpl {
@@ -699,9 +705,10 @@
       }
     }
 
-    // First make sure --no-implicit-casts disables all downcasts, including
-    // dynamic casts.
-    if (!implicitCasts) {
+    // First make sure that the static analysis options, `implicit-casts: false`
+    // and `strict-casts: true` disable all downcasts, including casts from
+    // `dynamic`.
+    if (!implicitCasts || strictCasts) {
       return false;
     }
 
@@ -1537,9 +1544,11 @@
 
   void updateOptions({
     required bool implicitCasts,
+    required bool strictCasts,
     required bool strictInference,
   }) {
     this.implicitCasts = implicitCasts;
+    this.strictCasts = strictCasts;
     this.strictInference = strictInference;
   }
 
diff --git a/pkg/analyzer/lib/src/dart/error/ffi_code.g.dart b/pkg/analyzer/lib/src/dart/error/ffi_code.g.dart
index 4264f45..e794a9b 100644
--- a/pkg/analyzer/lib/src/dart/error/ffi_code.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/ffi_code.g.dart
@@ -18,6 +18,34 @@
   /**
    * No parameters.
    */
+  static const FfiCode ABI_SPECIFIC_INTEGER_MAPPING_EXTRA = FfiCode(
+    'ABI_SPECIFIC_INTEGER_MAPPING_EXTRA',
+    "Classes extending 'AbiSpecificInteger' must have exactly one 'AbiSpecificIntegerMapping' annotation specifying the mapping from ABI to a 'NativeType' integer with a fixed size.",
+    correctionMessage: "Try removing the extra annotation.",
+  );
+
+  /**
+   * No parameters.
+   */
+  static const FfiCode ABI_SPECIFIC_INTEGER_MAPPING_MISSING = FfiCode(
+    'ABI_SPECIFIC_INTEGER_MAPPING_MISSING',
+    "Classes extending 'AbiSpecificInteger' must have exactly one 'AbiSpecificIntegerMapping' annotation specifying the mapping from ABI to a 'NativeType' integer with a fixed size.",
+    correctionMessage: "Try adding an annotation.",
+  );
+
+  /**
+   * No parameters.
+   */
+  static const FfiCode ABI_SPECIFIC_INTEGER_MAPPING_UNSUPPORTED = FfiCode(
+    'ABI_SPECIFIC_INTEGER_MAPPING_UNSUPPORTED',
+    "Only mappings to 'Int8', 'Int16', 'Int32', 'Int64', 'Uint8', 'Uint16', 'UInt32', and 'Uint64' are supported.",
+    correctionMessage:
+        "Try changing the value to 'Int8', 'Int16', 'Int32', 'Int64', 'Uint8', 'Uint16', 'UInt32', or 'Uint64'.",
+  );
+
+  /**
+   * No parameters.
+   */
   static const FfiCode ANNOTATION_ON_POINTER_FIELD = FfiCode(
     'ANNOTATION_ON_POINTER_FIELD',
     "Fields in a struct class whose type is 'Pointer' should not have any annotations.",
@@ -302,9 +330,9 @@
    */
   static const FfiCode NON_SIZED_TYPE_ARGUMENT = FfiCode(
     'NON_SIZED_TYPE_ARGUMENT',
-    "Type arguments to '{0}' can't have the type '{1}'. They can only be declared as native integer, 'Float', 'Double', 'Pointer', or subtype of 'Struct' or 'Union'.",
+    "Type arguments to '{0}' can't have the type '{1}'. They can only be declared as native integer, 'Float', 'Double', 'Pointer', or subtype of 'Struct', 'Union', or 'AbiSpecificInteger'.",
     correctionMessage:
-        "Try using a native integer, 'Float', 'Double', 'Pointer', or subtype of 'Struct' or 'Union'.",
+        "Try using a native integer, 'Float', 'Double', 'Pointer', or subtype of 'Struct', 'Union', or 'AbiSpecificInteger'.",
   );
 
   /**
diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart
index ecb67b1..fae4e5e 100644
--- a/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart
@@ -3140,7 +3140,7 @@
   // ```
   static const HintCode UNDEFINED_REFERENCED_PARAMETER = HintCode(
     'UNDEFINED_REFERENCED_PARAMETER',
-    "The parameter '{0}' is not defined by '{1}'.",
+    "The parameter '{0}' isn't defined by '{1}'.",
     hasPublishedDocs: true,
   );
 
diff --git a/pkg/analyzer/lib/src/dart/micro/analysis_context.dart b/pkg/analyzer/lib/src/dart/micro/analysis_context.dart
index ef663ca..10b3313 100644
--- a/pkg/analyzer/lib/src/dart/micro/analysis_context.dart
+++ b/pkg/analyzer/lib/src/dart/micro/analysis_context.dart
@@ -208,9 +208,7 @@
 
   @override
   Uri? pathToUri(String path, {String? containingPath}) {
-    var fileUri = resourceProvider.pathContext.toUri(path);
-    var fileSource = sourceFactory.forUri2(fileUri)!;
-    return sourceFactory.restoreUri(fileSource);
+    return sourceFactory.pathToUri(path);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
index e904ee0..0b096be 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
@@ -197,7 +197,7 @@
   /// Compute [_constants] in all units.
   void _computeConstants() {
     computeConstants(_typeProvider, _typeSystem, _declaredVariables,
-        _constants.toList(), _analysisOptions.experimentStatus);
+        _constants.toList(), _libraryElement.featureSet);
   }
 
   void _computeDiagnostics({
diff --git a/pkg/analyzer/lib/src/dart/micro/library_graph.dart b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
index 7bd4630..80357fb 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_graph.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
@@ -335,10 +335,7 @@
       return file;
     }
 
-    var fileUri = _resourceProvider.pathContext.toUri(path);
-    var uri = _sourceFactory.restoreUri(
-      _FakeSource(path, fileUri),
-    );
+    var uri = _sourceFactory.pathToUri(path);
     if (uri == null) {
       throw StateError('Unable to convert path to URI: $path');
     }
@@ -428,11 +425,7 @@
   }
 
   String? getPathForUri(Uri uri) {
-    var source = _sourceFactory.forUri2(uri);
-    if (source == null) {
-      return null;
-    }
-    return source.fullName;
+    return _sourceFactory.forUri2(uri)?.fullName;
   }
 
   /// Computes the set of [FileState]'s used/not used to analyze the given
@@ -593,19 +586,6 @@
   });
 }
 
-class _FakeSource implements Source {
-  @override
-  final String fullName;
-
-  @override
-  final Uri uri;
-
-  _FakeSource(this.fullName, this.uri);
-
-  @override
-  dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
 class _FileStateFiles {
   final List<FileState> imported = [];
   final List<FileState> exported = [];
@@ -712,19 +692,28 @@
     return _fsState._resourceProvider.getFile(path);
   }
 
+  Uri? resolveRelativeUriStr(String relativeUriStr) {
+    if (relativeUriStr.isEmpty) {
+      return null;
+    }
+
+    Uri relativeUri;
+    try {
+      relativeUri = Uri.parse(relativeUriStr);
+    } on FormatException {
+      return null;
+    }
+
+    return resolveRelativeUri(uri, relativeUri);
+  }
+
   FileState? _fileForRelativeUri({
     FileState? containingLibrary,
     required String relativeUri,
     required OperationPerformanceImpl performance,
   }) {
-    if (relativeUri.isEmpty) {
-      return null;
-    }
-
-    Uri absoluteUri;
-    try {
-      absoluteUri = resolveRelativeUri(uri, Uri.parse(relativeUri));
-    } on FormatException {
+    var absoluteUri = resolveRelativeUriStr(relativeUri);
+    if (absoluteUri == null) {
       return null;
     }
 
@@ -760,6 +749,7 @@
         }
       }
     }
+    return null;
   }
 
   _ContentWithDigest _getContent() {
@@ -890,51 +880,46 @@
     }
 
     var libraryUri = unlinked.unit.partOfUri;
-    if (libraryUri != null) {
-      location._fsState.testView.partsDiscoveredLibraries.add(location.path);
-      return _partOfLibrary = location._fileForRelativeUri(
-        relativeUri: libraryUri,
-        performance: performance,
-      );
+    if (libraryUri == null) {
+      return null;
     }
+    location._fsState.testView.partsDiscoveredLibraries.add(location.path);
+    return _partOfLibrary = location._fileForRelativeUri(
+      relativeUri: libraryUri,
+      performance: performance,
+    );
   }
 
   void _prefetchDirectReferences() {
-    if (location._fsState.prefetchFiles == null) {
+    var prefetchFiles = location._fsState.prefetchFiles;
+    if (prefetchFiles == null) {
       return;
     }
 
     var paths = <String>{};
 
-    /// TODO(scheglov) This is duplicate.
-    void findPathForUri(String relativeUri) {
-      if (relativeUri.isEmpty) {
-        return;
-      }
-      Uri absoluteUri;
-      try {
-        absoluteUri = resolveRelativeUri(location.uri, Uri.parse(relativeUri));
-      } on FormatException {
-        return;
-      }
-      var p = location._fsState.getPathForUri(absoluteUri);
-      if (p != null) {
-        paths.add(p);
+    void addRelativeUri(String relativeUri) {
+      var absoluteUri = location.resolveRelativeUriStr(relativeUri);
+      if (absoluteUri != null) {
+        var path = location._fsState.getPathForUri(absoluteUri);
+        if (path != null) {
+          paths.add(path);
+        }
       }
     }
 
     var unlinkedUnit = unlinked.unit;
     for (var directive in unlinkedUnit.imports) {
-      findPathForUri(directive.uri);
+      addRelativeUri(directive.uri);
     }
     for (var directive in unlinkedUnit.exports) {
-      findPathForUri(directive.uri);
+      addRelativeUri(directive.uri);
     }
     for (var uri in unlinkedUnit.parts) {
-      findPathForUri(uri);
+      addRelativeUri(uri);
     }
 
-    location._fsState.prefetchFiles!(paths.toList());
+    prefetchFiles(paths.toList());
   }
 
   static CompilationUnitImpl parse(AnalysisErrorListener errorListener,
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index 89c1fe0..e9eec90 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
 import 'package:analyzer/src/context/packages.dart';
 import 'package:analyzer/src/dart/analysis/context_root.dart';
@@ -17,7 +18,6 @@
 import 'package:analyzer/src/dart/analysis/feature_set_provider.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/analysis/results.dart';
-import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/micro/analysis_context.dart';
 import 'package:analyzer/src/dart/micro/cider_byte_store.dart';
 import 'package:analyzer/src/dart/micro/library_analyzer.dart';
@@ -46,19 +46,20 @@
 
 class CiderSearchMatch {
   final String path;
-  final List<int> offsets;
+  final List<CharacterLocation?> startPositions;
 
-  CiderSearchMatch(this.path, this.offsets);
+  CiderSearchMatch(this.path, this.startPositions);
 
   @override
   bool operator ==(Object object) =>
       object is CiderSearchMatch &&
       path == object.path &&
-      const ListEquality<int>().equals(offsets, object.offsets);
+      const ListEquality<CharacterLocation?>()
+          .equals(startPositions, object.startPositions);
 
   @override
   String toString() {
-    return '($path, $offsets)';
+    return '($path, $startPositions)';
   }
 }
 
@@ -184,29 +185,46 @@
     removedCacheIds.addAll(libraryContext!.collectSharedDataIdentifiers());
   }
 
-  /// Looks for references to the Element at the given offset and path. All the
-  /// files currently cached by the resolver are searched, generated files are
-  /// ignored.
-  List<CiderSearchMatch> findReferences(int offset, String path,
+  /// Looks for references to the given Element. All the files currently
+  ///  cached by the resolver are searched, generated files are ignored.
+  List<CiderSearchMatch> findReferences(Element element,
       {OperationPerformanceImpl? performance}) {
-    var references = <CiderSearchMatch>[];
-    var unit = resolve(path: path);
-    var node = NodeLocator(offset).searchWithin(unit.unit);
-    var element = getElementOfNode(node);
-    if (element != null) {
+    return logger.run('findReferences for ${element.name}', () {
+      var references = <CiderSearchMatch>[];
+
+      void collectReferences(
+          String path, OperationPerformanceImpl performance) {
+        performance.run('collectReferences', (_) {
+          var resolved = resolve(path: path);
+          var collector = ReferencesCollector(element);
+          resolved.unit.accept(collector);
+          var offsets = collector.offsets;
+          if (offsets.isNotEmpty) {
+            var lineInfo = resolved.unit.lineInfo;
+            references.add(CiderSearchMatch(
+                path,
+                offsets
+                    .map((offset) => lineInfo?.getLocation(offset))
+                    .toList()));
+          }
+        });
+      }
+
+      performance ??= OperationPerformanceImpl('<default>');
       // TODO(keertip): check if element is named constructor.
-      var result = fsState!.getFilesContaining(element.displayName);
-      result.forEach((filePath) {
-        var resolved = resolve(path: filePath);
-        var collector = ReferencesCollector(element);
-        resolved.unit.accept(collector);
-        var offsets = collector.offsets;
-        if (offsets.isNotEmpty) {
-          references.add(CiderSearchMatch(filePath, offsets));
-        }
-      });
-    }
-    return references;
+      if (element is LocalVariableElement ||
+          (element is ParameterElement && !element.isNamed)) {
+        collectReferences(element.source!.fullName, performance!);
+      } else {
+        var result = performance!.run('getFilesContaining', (performance) {
+          return fsState!.getFilesContaining(element.displayName);
+        });
+        result.forEach((filePath) {
+          collectReferences(filePath, performance!);
+        });
+      }
+      return references;
+    });
   }
 
   ErrorsResult getErrors({
@@ -635,6 +653,7 @@
         return file;
       }
     }
+    return null;
   }
 
   /// Return the analysis options.
diff --git a/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
index aa594c5..0391099 100644
--- a/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
@@ -263,6 +263,19 @@
     _visitArguments(node, whyNotPromotedList);
   }
 
+  void _localVariable(
+    AnnotationImpl node,
+    VariableElement element,
+    List<WhyNotPromotedGetter> whyNotPromotedList,
+  ) {
+    if (!element.isConst || node.arguments != null) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.INVALID_ANNOTATION, node);
+    }
+
+    _visitArguments(node, whyNotPromotedList);
+  }
+
   void _propertyAccessorElement(
     AnnotationImpl node,
     SimpleIdentifierImpl name,
@@ -393,8 +406,8 @@
       return;
     }
 
-    // TODO(scheglov) Must be const.
     if (element1 is VariableElement) {
+      _localVariable(node, element1, whyNotPromotedList);
       return;
     }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
index da8742a..dedb7b5 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
@@ -40,7 +40,7 @@
 
   ErrorReporter get _errorReporter => _resolver.errorReporter;
 
-  NullabilitySuffix get _nullabilitySuffixForTypeNames =>
+  NullabilitySuffix get _nullabilitySuffix =>
       _isNonNullableByDefault ? NullabilitySuffix.none : NullabilitySuffix.star;
 
   void resolve(FunctionReferenceImpl node) {
@@ -64,7 +64,10 @@
         _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
           typeArguments,
-          [function.constructorName.type2.name, function.constructorName.name!],
+          [
+            function.constructorName.type2.name.toSource(),
+            function.constructorName.name!.name
+          ],
         );
         _resolve(node: node, rawType: function.staticType);
       }
@@ -310,7 +313,7 @@
     );
     var type = element.instantiate(
       typeArguments: typeArguments,
-      nullabilitySuffix: _nullabilitySuffixForTypeNames,
+      nullabilitySuffix: _nullabilitySuffix,
     );
     _resolveTypeLiteral(node: node, instantiatedType: type, name: name);
   }
@@ -783,8 +786,9 @@
       CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS,
     );
     var type = element.instantiate(
-        typeArguments: typeArguments,
-        nullabilitySuffix: _nullabilitySuffixForTypeNames);
+      typeArguments: typeArguments,
+      nullabilitySuffix: _nullabilitySuffix,
+    );
     _resolveTypeLiteral(node: node, instantiatedType: type, name: typeAlias);
   }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart b/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
index 36357aa..d7a8fd2 100644
--- a/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
@@ -129,10 +129,11 @@
       }
     }
 
-    if (typeParameters != null && rawElement != null) {
-      rawElement = _resolver.toLegacyElement(rawElement);
-      return ConstructorElementToInfer(typeParameters, rawElement);
+    if (typeParameters == null || rawElement == null) {
+      return null;
     }
+    rawElement = _resolver.toLegacyElement(rawElement);
+    return ConstructorElementToInfer(typeParameters, rawElement);
   }
 
   FunctionType? inferArgumentTypesForGeneric(AstNode inferenceNode,
diff --git a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
index 157ba4c..d0f35da 100644
--- a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
@@ -240,7 +240,7 @@
         node: node,
         requested: writeElementRequested,
         recovery: writeElementRecovery,
-        receiverTypeObject: null,
+        receiverType: null,
       );
     }
 
@@ -469,7 +469,7 @@
           node: propertyName,
           requested: null,
           recovery: result.getter,
-          receiverTypeObject: targetType,
+          receiverType: targetType,
         );
       }
     }
@@ -543,7 +543,7 @@
           node: propertyName,
           requested: null,
           recovery: writeElementRecovery,
-          receiverTypeObject: typeReference.displayName,
+          receiverType: typeReference.thisType,
         );
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 0fb4f74..2e361ad 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -63,7 +63,7 @@
   final bool _isNonNullableByDefault;
   final ErrorReporter _errorReporter;
   final AstRewriter _astRewriter;
-  final NamedTypeResolver _typeNameResolver;
+  final NamedTypeResolver _namedTypeResolver;
 
   /// This index is incremented every time we visit a [LibraryDirective].
   /// There is just one [LibraryElement], so we can support only one node.
@@ -103,7 +103,7 @@
       isNonNullableByDefault: isNonNullableByDefault,
     );
 
-    var typeNameResolver = NamedTypeResolver(
+    var namedTypeResolver = NamedTypeResolver(
       libraryElement,
       typeProvider,
       isNonNullableByDefault,
@@ -117,7 +117,7 @@
       isNonNullableByDefault,
       errorReporter,
       AstRewriter(errorReporter, typeProvider),
-      typeNameResolver,
+      namedTypeResolver,
       nameScope,
       elementWalker,
       ElementHolder(unitElement),
@@ -131,7 +131,7 @@
     this._isNonNullableByDefault,
     this._errorReporter,
     this._astRewriter,
-    this._typeNameResolver,
+    this._namedTypeResolver,
     this._nameScope,
     this._elementWalker,
     this._elementHolder,
@@ -218,7 +218,7 @@
   void visitClassDeclaration(covariant ClassDeclarationImpl node) {
     ClassElementImpl element = _elementWalker!.getClass();
     node.name.staticElement = element;
-    _typeNameResolver.enclosingClass = element;
+    _namedTypeResolver.enclosingClass = element;
 
     node.metadata.accept(this);
     _setElementAnnotations(node.metadata, element.metadata);
@@ -247,14 +247,14 @@
       });
     });
 
-    _typeNameResolver.enclosingClass = null;
+    _namedTypeResolver.enclosingClass = null;
   }
 
   @override
   void visitClassTypeAlias(covariant ClassTypeAliasImpl node) {
     ClassElementImpl element = _elementWalker!.getClass();
     node.name.staticElement = element;
-    _typeNameResolver.enclosingClass = element;
+    _namedTypeResolver.enclosingClass = element;
 
     node.metadata.accept(this);
     _setElementAnnotations(node.metadata, element.metadata);
@@ -275,7 +275,7 @@
       });
     });
 
-    _typeNameResolver.enclosingClass = null;
+    _namedTypeResolver.enclosingClass = null;
   }
 
   @override
@@ -885,11 +885,11 @@
   void visitNamedType(covariant NamedTypeImpl node) {
     node.typeArguments?.accept(this);
 
-    _typeNameResolver.nameScope = _nameScope;
-    _typeNameResolver.resolve(node);
+    _namedTypeResolver.nameScope = _nameScope;
+    _namedTypeResolver.resolve(node);
 
-    if (_typeNameResolver.rewriteResult != null) {
-      _typeNameResolver.rewriteResult!.accept(this);
+    if (_namedTypeResolver.rewriteResult != null) {
+      _namedTypeResolver.rewriteResult!.accept(this);
     }
   }
 
@@ -1242,11 +1242,11 @@
     if (redirectedConstructor == null) return;
 
     var namedType = redirectedConstructor.type2;
-    _typeNameResolver.redirectedConstructor_namedType = namedType;
+    _namedTypeResolver.redirectedConstructor_namedType = namedType;
 
     redirectedConstructor.accept(this);
 
-    _typeNameResolver.redirectedConstructor_namedType = null;
+    _namedTypeResolver.redirectedConstructor_namedType = null;
   }
 
   /// Return the [InterfaceType] of the given [namedType].
@@ -1258,11 +1258,11 @@
   /// classes).
   void _resolveType(NamedTypeImpl namedType, ErrorCode errorCode,
       {bool asClass = false}) {
-    _typeNameResolver.classHierarchy_namedType = namedType;
+    _namedTypeResolver.classHierarchy_namedType = namedType;
     visitNamedType(namedType);
-    _typeNameResolver.classHierarchy_namedType = null;
+    _namedTypeResolver.classHierarchy_namedType = null;
 
-    if (_typeNameResolver.hasErrorReported) {
+    if (_namedTypeResolver.hasErrorReported) {
       return;
     }
 
@@ -1303,12 +1303,12 @@
     if (clause == null) return;
 
     for (var namedType in clause.mixinTypes2) {
-      _typeNameResolver.withClause_namedType = namedType;
+      _namedTypeResolver.withClause_namedType = namedType;
       _resolveType(
         namedType as NamedTypeImpl,
         CompileTimeErrorCode.MIXIN_OF_NON_CLASS,
       );
-      _typeNameResolver.withClause_namedType = null;
+      _namedTypeResolver.withClause_namedType = null;
     }
   }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
index 6e47fa5..0016d66 100644
--- a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
@@ -70,9 +70,9 @@
   /// This method should only be called in generator functions.
   void _checkForYieldOfInvalidType(
     BodyInferenceContext bodyContext,
-    YieldStatement node,
-    bool isYieldEach,
-  ) {
+    YieldStatement node, {
+    required bool isYieldEach,
+  }) {
     var expression = node.expression;
     var expressionType = expression.typeOrThrow;
 
@@ -88,11 +88,27 @@
     var imposedReturnType = bodyContext.imposedType;
     if (imposedReturnType != null &&
         !_typeSystem.isAssignableTo(impliedReturnType, imposedReturnType)) {
-      _errorReporter.reportErrorForNode(
-        CompileTimeErrorCode.YIELD_OF_INVALID_TYPE,
-        expression,
-        [impliedReturnType, imposedReturnType],
+      if (isYieldEach) {
+        _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE,
+          expression,
+          [impliedReturnType, imposedReturnType],
+        );
+        return;
+      }
+      var imposedSequenceType = imposedReturnType.asInstanceOf(
+        bodyContext.isSynchronous
+            ? _typeProvider.iterableElement
+            : _typeProvider.streamElement,
       );
+      if (imposedSequenceType != null) {
+        var imposedValueType = imposedSequenceType.typeArguments[0];
+        _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.YIELD_OF_INVALID_TYPE,
+          expression,
+          [expressionType, imposedValueType],
+        );
+      }
       return;
     }
 
@@ -109,7 +125,7 @@
 
       if (!_typeSystem.isAssignableTo(impliedReturnType, requiredReturnType)) {
         _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.YIELD_OF_INVALID_TYPE,
+          CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE,
           expression,
           [impliedReturnType, requiredReturnType],
         );
@@ -134,7 +150,8 @@
 
     bodyContext.addYield(node);
 
-    _checkForYieldOfInvalidType(bodyContext, node, node.star != null);
+    _checkForYieldOfInvalidType(bodyContext, node,
+        isYieldEach: node.star != null);
     _checkForUseOfVoidResult(node.expression);
   }
 
diff --git a/pkg/analyzer/lib/src/dart/sdk/sdk.dart b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
index 35fb194..60cfa66 100644
--- a/pkg/analyzer/lib/src/dart/sdk/sdk.dart
+++ b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
@@ -13,7 +13,7 @@
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine_io.dart';
 import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:pub_semver/pub_semver.dart';
 import 'package:yaml/yaml.dart';
 
@@ -46,17 +46,6 @@
   @override
   List<String> get uris => libraryMap.uris;
 
-  /// Add the extensions from one or more sdk extension files to this sdk. The
-  /// [extensions] should be a table mapping the names of extensions to the
-  /// paths where those extensions can be found.
-  void addExtensions(Map<String, String> extensions) {
-    extensions.forEach((String uri, String path) {
-      SdkLibraryImpl library = SdkLibraryImpl(uri);
-      library.path = path;
-      libraryMap.setLibrary(uri, library);
-    });
-  }
-
   /// Return info for debugging https://github.com/dart-lang/sdk/issues/35226.
   Map<String, Object> debugInfo() {
     return <String, Object>{
@@ -139,6 +128,23 @@
     return source;
   }
 
+  @override
+  Uri? pathToUri(String path) {
+    var file = resourceProvider.getFile(path);
+
+    var uriStr = _getPath(file);
+    if (uriStr == null) {
+      return null;
+    }
+
+    try {
+      return Uri.parse(uriStr);
+    } on FormatException {
+      return null;
+    }
+  }
+
+  /// TODO(scheglov) This name is misleading, returns `dart:foo/bar.dart`.
   String? _getPath(File file) {
     List<SdkLibrary> libraries = libraryMap.sdkLibraries;
     int length = libraries.length;
diff --git a/pkg/analyzer/lib/src/error/assignment_verifier.dart b/pkg/analyzer/lib/src/error/assignment_verifier.dart
index a995629..97cbefd 100644
--- a/pkg/analyzer/lib/src/error/assignment_verifier.dart
+++ b/pkg/analyzer/lib/src/error/assignment_verifier.dart
@@ -25,14 +25,14 @@
   /// element, which is definitely not a valid write target. We want to report
   /// a good error about this.
   ///
-  /// The [receiverTypeObject] might be a [DartType] or [String], and when
-  /// it is not `null`, we report [CompileTimeErrorCode.UNDEFINED_SETTER]
-  /// instead of a more generic [CompileTimeErrorCode.UNDEFINED_IDENTIFIER].
+  /// When the [receiverType] is not `null`, we report
+  /// [CompileTimeErrorCode.UNDEFINED_SETTER] instead of a more generic
+  /// [CompileTimeErrorCode.UNDEFINED_IDENTIFIER].
   void verify({
     required SimpleIdentifier node,
     required Element? requested,
     required Element? recovery,
-    required Object? receiverTypeObject,
+    required DartType? receiverType,
   }) {
     if (requested != null) {
       if (requested is VariableElement) {
@@ -106,11 +106,11 @@
       if (node.isSynthetic) {
         return;
       }
-      if (receiverTypeObject != null) {
+      if (receiverType != null) {
         _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.UNDEFINED_SETTER,
           node,
-          [node.name, receiverTypeObject],
+          [node.name, receiverType],
         );
       } else {
         _errorReporter.reportErrorForNode(
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 85441dc..45dce24 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -42,11 +42,7 @@
 /// Instances of the class `BestPracticesVerifier` traverse an AST structure
 /// looking for violations of Dart best practices.
 class BestPracticesVerifier extends RecursiveAstVisitor<void> {
-  static const String _TO_INT_METHOD_NAME = "toInt";
-
-  static final Map<String, TargetKind> _targetKindsByName = {
-    for (final kind in TargetKind.values) kind.toString(): kind,
-  };
+  static const String toIntMethodName = "toInt";
 
   /// The class containing the AST nodes being visited, or `null` if we are not
   /// in the scope of a class.
@@ -85,7 +81,7 @@
   final WorkspacePackage? _workspacePackage;
 
   /// The [LinterContext] used for possible const calculations.
-  late final LinterContext _linterContext;
+  final LinterContext _linterContext;
 
   /// Is `true` if the library being analyzed is non-nullable by default.
   final bool _isNonNullableByDefault;
@@ -93,9 +89,10 @@
   /// True if inference failures should be reported, otherwise false.
   final bool _strictInference;
 
-  /// Create a new instance of the [BestPracticesVerifier].
-  ///
-  /// @param errorReporter the error reporter
+  /// Whether [_currentLibrary] is part of its containing package's public API.
+  late final bool _inPublicPackageApi = _workspacePackage != null &&
+      _workspacePackage!.sourceIsInPublicApi(_currentLibrary.source);
+
   BestPracticesVerifier(
     this._errorReporter,
     TypeProviderImpl typeProvider,
@@ -121,28 +118,22 @@
         _errorHandlerVerifier =
             ErrorHandlerVerifier(_errorReporter, typeProvider, typeSystem),
         _nullSafeApiVerifier = NullSafeApiVerifier(_errorReporter, typeSystem),
-        _workspacePackage = workspacePackage {
+        _workspacePackage = workspacePackage,
+        _linterContext = LinterContextImpl(
+          [],
+          LinterContextUnit(content, unit),
+          declaredVariables,
+          typeProvider,
+          typeSystem,
+          inheritanceManager,
+          analysisOptions,
+          workspacePackage,
+        ) {
     _deprecatedVerifier.pushInDeprecatedValue(_currentLibrary.hasDeprecated);
     _inDoNotStoreMember = _currentLibrary.hasDoNotStore;
-
-    _linterContext = LinterContextImpl(
-      [],
-      LinterContextUnit(content, unit),
-      declaredVariables,
-      typeProvider,
-      _typeSystem,
-      _inheritanceManager,
-      analysisOptions,
-      _workspacePackage,
-    );
     _invalidAccessVerifier._inTestDirectory = _linterContext.inTestDir(unit);
   }
 
-  bool get _inPublicPackageApi {
-    return _workspacePackage != null &&
-        _workspacePackage!.sourceIsInPublicApi(_currentLibrary.source);
-  }
-
   @override
   void visitAnnotation(Annotation node) {
     var element = node.elementAnnotation;
@@ -305,7 +296,7 @@
       }
     }
 
-    var kinds = _targetKindsFor(element);
+    var kinds = element.targetKinds;
     if (kinds.isNotEmpty) {
       if (!_isValidTarget(parent, kinds)) {
         var invokedElement = element.element!;
@@ -407,7 +398,7 @@
   @override
   void visitConstructorDeclaration(ConstructorDeclaration node) {
     var element = node.declaredElement as ConstructorElementImpl;
-    if (!_isNonNullableByDefault && node.declaredElement!.isFactory) {
+    if (!_isNonNullableByDefault && element.isFactory) {
       if (node.body is BlockFunctionBody) {
         // Check the block for a return statement, if not, create the hint.
         if (!ExitDetector.exits(node.body)) {
@@ -482,9 +473,10 @@
           // always named, so we can safely assume
           // `overriddenElement.enclosingElement.name` is non-`null`.
           _errorReporter.reportErrorForNode(
-              HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER,
-              field.name,
-              [field.name, overriddenElement.enclosingElement.name!]);
+              HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, field.name, [
+            field.name.name,
+            overriddenElement.enclosingElement.displayName
+          ]);
         }
         if (!_invalidAccessVerifier._inTestDirectory) {
           _checkForAssignmentOfDoNotStore(field.initializer);
@@ -671,7 +663,7 @@
         _errorReporter.reportErrorForNode(
             HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER,
             node.name,
-            [node.name, overriddenElement.enclosingElement.name!]);
+            [node.name.name, overriddenElement.enclosingElement.displayName]);
       }
 
       super.visitMethodDeclaration(node);
@@ -907,7 +899,7 @@
           _wrapParenthesizedExpression(parent);
       var grandParent = parenthesizedExpression.parent;
       if (grandParent is MethodInvocation) {
-        if (_TO_INT_METHOD_NAME == grandParent.methodName.name &&
+        if (toIntMethodName == grandParent.methodName.name &&
             grandParent.argumentList.arguments.isEmpty) {
           _errorReporter.reportErrorForNode(
               HintCode.DIVISION_OPTIMIZATION, grandParent);
@@ -987,8 +979,6 @@
       return false;
     }
 
-    /// Return `true` if the given class [element] defines a non-final instance
-    /// field.
     Iterable<String> nonFinalInstanceFields(ClassElement element) {
       return element.fields
           .where((FieldElement field) =>
@@ -996,8 +986,6 @@
           .map((FieldElement field) => '${element.name}.${field.name}');
     }
 
-    /// Return `true` if the given class [element] defines or inherits a
-    /// non-final field.
     Iterable<String> definedOrInheritedNonFinalInstanceFields(
         ClassElement element, HashSet<ClassElement> visited) {
       Iterable<String> nonFinalFields = [];
@@ -1716,51 +1704,6 @@
     return false;
   }
 
-  /// Return the target kinds defined for the given [annotation].
-  Set<TargetKind> _targetKindsFor(ElementAnnotation annotation) {
-    var element = annotation.element;
-    ClassElement? classElement;
-    if (element is PropertyAccessorElement) {
-      if (element.isGetter) {
-        var type = element.returnType;
-        if (type is InterfaceType) {
-          classElement = type.element;
-        }
-      }
-    } else if (element is ConstructorElement) {
-      classElement = element.enclosingElement;
-    }
-    if (classElement == null) {
-      return const <TargetKind>{};
-    }
-    for (var annotation in classElement.metadata) {
-      if (annotation.isTarget) {
-        var value = annotation.computeConstantValue()!;
-        var kinds = <TargetKind>{};
-
-        for (var kindObject in value.getField('kinds')!.toSetValue()!) {
-          // We can't directly translate the index from the analyzed TargetKind
-          // constant to TargetKinds.values because the analyzer from the SDK
-          // may have been compiled with a different version of pkg:meta.
-          var index = kindObject.getField('index')!.toIntValue()!;
-          var targetKindClass =
-              (kindObject.type as InterfaceType).element as EnumElementImpl;
-          // Instead, map constants to their TargetKind by comparing getter
-          // names.
-          var getter = targetKindClass.constants[index];
-          var name = 'TargetKind.${getter.name}';
-
-          var foundTargetKind = _targetKindsByName[name];
-          if (foundTargetKind != null) {
-            kinds.add(foundTargetKind);
-          }
-        }
-        return kinds;
-      }
-    }
-    return const <TargetKind>{};
-  }
-
   /// Checks for the passed as expression for the [HintCode.UNNECESSARY_CAST]
   /// hint code.
   ///
@@ -1856,16 +1799,15 @@
   final LibraryElement _library;
   final WorkspacePackage? _workspacePackage;
 
-  late final bool _inTemplateSource;
+  final bool _inTemplateSource;
   late final bool _inTestDirectory;
 
   ClassElement? _enclosingClass;
 
   _InvalidAccessVerifier(
-      this._errorReporter, this._library, this._workspacePackage) {
-    var path = _library.source.fullName;
-    _inTemplateSource = path.contains(_templateExtension);
-  }
+      this._errorReporter, this._library, this._workspacePackage)
+      : _inTemplateSource =
+            _library.source.fullName.contains(_templateExtension);
 
   /// Produces a hint if [identifier] is accessed from an invalid location.
   ///
diff --git a/pkg/analyzer/lib/src/error/bool_expression_verifier.dart b/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
index 108cc22..6d06e03 100644
--- a/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
+++ b/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
@@ -62,6 +62,17 @@
       } else {
         _errorReporter.reportErrorForNode(errorCode, expression, arguments);
       }
+    } else if (!_resolver.definingLibrary.isNonNullableByDefault) {
+      if (expression is InstanceCreationExpression) {
+        // In pre-null safety code, an implicit cast from a supertype is allowed
+        // unless the expression is an explicit instance creation expression,
+        // with the idea that the cast would likely fail at runtime.
+        var constructor = expression.constructorName.staticElement;
+        if (constructor == null || !constructor.isFactory) {
+          _errorReporter.reportErrorForNode(errorCode, expression, arguments);
+          return;
+        }
+      }
     }
   }
 
diff --git a/pkg/analyzer/lib/src/error/codes.g.dart b/pkg/analyzer/lib/src/error/codes.g.dart
index cd94929..be02c3e4 100644
--- a/pkg/analyzer/lib/src/error/codes.g.dart
+++ b/pkg/analyzer/lib/src/error/codes.g.dart
@@ -7381,51 +7381,6 @@
   );
 
   /**
-   * No parameters.
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when the initializer list of a
-  // constructor contains an invocation of a constructor in the superclass, but
-  // the invocation isn't the last item in the initializer list.
-  //
-  // #### Example
-  //
-  // The following code produces this diagnostic because the invocation of the
-  // superclass' constructor isn't the last item in the initializer list:
-  //
-  // ```dart
-  // class A {
-  //   A(int x);
-  // }
-  //
-  // class B extends A {
-  //   B(int x) : [!super!](x), assert(x >= 0);
-  // }
-  // ```
-  //
-  // #### Common fixes
-  //
-  // Move the invocation of the superclass' constructor to the end of the
-  // initializer list:
-  //
-  // ```dart
-  // class A {
-  //   A(int x);
-  // }
-  //
-  // class B extends A {
-  //   B(int x) : assert(x >= 0), super(x);
-  // }
-  // ```
-  static const CompileTimeErrorCode INVALID_SUPER_INVOCATION =
-      CompileTimeErrorCode(
-    'INVALID_SUPER_INVOCATION',
-    "The superclass call must be last in an initializer list: '{0}'.",
-    hasPublishedDocs: true,
-  );
-
-  /**
    * Parameters:
    * 0: the name of the type parameter
    */
@@ -12892,6 +12847,52 @@
   );
 
   /**
+   * Parameters:
+   * 0: the superinitializer
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when the initializer list of a
+  // constructor contains an invocation of a constructor in the superclass, but
+  // the invocation isn't the last item in the initializer list.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because the invocation of the
+  // superclass' constructor isn't the last item in the initializer list:
+  //
+  // ```dart
+  // class A {
+  //   A(int x);
+  // }
+  //
+  // class B extends A {
+  //   B(int x) : [!super!](x), assert(x >= 0);
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Move the invocation of the superclass' constructor to the end of the
+  // initializer list:
+  //
+  // ```dart
+  // class A {
+  //   A(int x);
+  // }
+  //
+  // class B extends A {
+  //   B(int x) : assert(x >= 0), super(x);
+  // }
+  // ```
+  static const CompileTimeErrorCode SUPER_INVOCATION_NOT_LAST =
+      CompileTimeErrorCode(
+    'SUPER_INVOCATION_NOT_LAST',
+    "The superconstructor call must be last in an initializer list: '{0}'.",
+    hasPublishedDocs: true,
+  );
+
+  /**
    * No parameters.
    */
   // #### Description
@@ -15614,6 +15615,19 @@
   );
 
   /**
+   * Parameters:
+   * 0: the type of the expression after `yield*`
+   * 1: the return type of the function containing the `yield*`
+   */
+  static const CompileTimeErrorCode YIELD_EACH_OF_INVALID_TYPE =
+      CompileTimeErrorCode(
+    'YIELD_OF_INVALID_TYPE',
+    "The type '{0}' implied by the 'yield*' expression must be assignable to '{1}'.",
+    hasPublishedDocs: true,
+    uniqueName: 'YIELD_EACH_OF_INVALID_TYPE',
+  );
+
+  /**
    * ?? Yield: It is a compile-time error if a yield statement appears in a
    * function that is not a generator function.
    *
@@ -15635,10 +15649,11 @@
    */
   // #### Description
   //
-  // The analyzer produces this diagnostic when the type of object produced by a
-  // `yield` expression doesn't match the type of objects that are to be
-  // returned from the `Iterable` or `Stream` types that are returned from a
-  // generator (a function or method marked with either `sync*` or `async*`).
+  // The analyzer produces this diagnostic when the type of object produced by
+  // a `yield` or `yield*` expression doesn't match the type of objects that
+  // are to be returned from the `Iterable` or `Stream` types that are returned
+  // from a generator (a function or method marked with either `sync*` or
+  // `async*`).
   //
   // #### Example
   //
@@ -15674,7 +15689,7 @@
   static const CompileTimeErrorCode YIELD_OF_INVALID_TYPE =
       CompileTimeErrorCode(
     'YIELD_OF_INVALID_TYPE',
-    "The type '{0}' implied by the 'yield' expression must be assignable to '{1}'.",
+    "A yielded value of type '{0}' must be assignable to '{1}'.",
     hasPublishedDocs: true,
   );
 
@@ -15923,7 +15938,7 @@
   // `isEven` if `s` is `null`. In other words, if `s` is `null`, then neither
   // `length` nor `isEven` will be invoked, and if `s` is non-`null`, then
   // `length` can't return a `null` value. Either way, `isEven` can't be invoked
-  // on a `null` value, so the null-aware operator is not necessary. See
+  // on a `null` value, so the null-aware operator isn't necessary. See
   // [Understanding null safety](/null-safety/understanding-null-safety#smarter-null-aware-methods)
   // for more details.
   //
diff --git a/pkg/analyzer/lib/src/error/imports_verifier.dart b/pkg/analyzer/lib/src/error/imports_verifier.dart
index 88d8a87..0ec6f98 100644
--- a/pkg/analyzer/lib/src/error/imports_verifier.dart
+++ b/pkg/analyzer/lib/src/error/imports_verifier.dart
@@ -790,6 +790,6 @@
     if (source2 == null) {
       return false;
     }
-    return !source1.isInSystemLibrary && source2.isInSystemLibrary;
+    return !source1.uri.isScheme('dart') && source2.uri.isScheme('dart');
   }
 }
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index 9977e73..b6d1951 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -327,7 +327,7 @@
 
     // The SDK implementation may implement disallowed types. For example,
     // JSNumber in dart2js and _Smi in Dart VM both implement int.
-    if (library.source.isInSystemLibrary) {
+    if (library.source.uri.isScheme('dart')) {
       return false;
     }
 
diff --git a/pkg/analyzer/lib/src/error/literal_element_verifier.dart b/pkg/analyzer/lib/src/error/literal_element_verifier.dart
index a6962f4..05ee001 100644
--- a/pkg/analyzer/lib/src/error/literal_element_verifier.dart
+++ b/pkg/analyzer/lib/src/error/literal_element_verifier.dart
@@ -138,7 +138,15 @@
   /// assigned to the [elementType] of the enclosing collection.
   void _verifySpreadForListOrSet(bool isNullAware, Expression expression) {
     var expressionType = expression.typeOrThrow;
-    if (expressionType.isDynamic) return;
+    if (expressionType.isDynamic) {
+      if (typeSystem.strictCasts) {
+        return errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.NOT_ITERABLE_SPREAD,
+          expression,
+        );
+      }
+      return;
+    }
 
     if (typeSystem.isNonNullableByDefault) {
       if (typeSystem.isSubtypeOf(expressionType, NeverTypeImpl.instance)) {
@@ -224,7 +232,15 @@
   /// its key and values are assignable to [mapKeyType] and [mapValueType].
   void _verifySpreadForMap(bool isNullAware, Expression expression) {
     var expressionType = expression.typeOrThrow;
-    if (expressionType.isDynamic) return;
+    if (expressionType.isDynamic) {
+      if (typeSystem.strictCasts) {
+        return errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.NOT_MAP_SPREAD,
+          expression,
+        );
+      }
+      return;
+    }
 
     if (typeSystem.isNonNullableByDefault) {
       if (typeSystem.isSubtypeOf(expressionType, NeverTypeImpl.instance)) {
diff --git a/pkg/analyzer/lib/src/error/return_type_verifier.dart b/pkg/analyzer/lib/src/error/return_type_verifier.dart
index 06ef0ed..2ae92c7 100644
--- a/pkg/analyzer/lib/src/error/return_type_verifier.dart
+++ b/pkg/analyzer/lib/src/error/return_type_verifier.dart
@@ -134,6 +134,12 @@
       return;
     }
 
+    if (enclosingExecutable.isGenerator) {
+      // [CompileTimeErrorCode.RETURN_IN_GENERATOR] has already been reported;
+      // do not report a duplicate error.
+      return;
+    }
+
     if (_typeSystem.isNonNullableByDefault) {
       _checkReturnExpression_nullSafety(expression);
     } else {
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
index c2f2f09..9db6af2 100644
--- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
+++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -499,7 +499,8 @@
       NodeList<TypeAnnotation> arguments, ErrorCode errorCode) {
     for (TypeAnnotation type in arguments) {
       if (type is NamedType && type.type is TypeParameterType) {
-        _errorReporter.reportErrorForNode(errorCode, type, [type.name]);
+        _errorReporter
+            .reportErrorForNode(errorCode, type, [type.name.toSource()]);
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 4a50a3c..6cfd05b 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -62,6 +62,8 @@
     show
         ClassDeclarationImpl,
         CompilationUnitImpl,
+        ConstructorNameImpl,
+        EnumDeclarationImpl,
         ExtensionDeclarationImpl,
         ImportDirectiveImpl,
         MethodInvocationImpl,
@@ -104,6 +106,9 @@
   /// The extension currently being parsed, or `null` if none.
   ExtensionDeclarationImpl? extensionDeclaration;
 
+  /// The enum currently being parsed, or `null` if none.
+  EnumDeclarationImpl? enumDeclaration;
+
   /// If true, this is building a full AST. Otherwise, only create method
   /// bodies.
   final bool isFullAst;
@@ -150,6 +155,12 @@
   /// `true` if named arguments anywhere are enabled
   final bool enableNamedArgumentsAnywhere;
 
+  /// `true` if super parameters are enabled
+  final bool enableSuperParameters;
+
+  /// `true` if enhanced enums are enabled
+  final bool enableEnhancedEnums;
+
   final FeatureSet _featureSet;
 
   AstBuilder(ErrorReporter? errorReporter, this.fileUri, this.isFullAst,
@@ -170,6 +181,8 @@
         enableExtensionTypes = _featureSet.isEnabled(Feature.extension_types),
         enableNamedArgumentsAnywhere =
             _featureSet.isEnabled(Feature.named_arguments_anywhere),
+        enableSuperParameters = _featureSet.isEnabled(Feature.super_parameters),
+        enableEnhancedEnums = _featureSet.isEnabled(Feature.enhanced_enums),
         uri = uri ?? fileUri;
 
   NodeList<ClassMember> get currentDeclarationMembers {
@@ -177,8 +190,10 @@
       return classDeclaration!.members;
     } else if (mixinDeclaration != null) {
       return mixinDeclaration!.members;
-    } else {
+    } else if (extensionDeclaration != null) {
       return extensionDeclaration!.members;
+    } else {
+      return enumDeclaration!.members;
     }
   }
 
@@ -187,8 +202,10 @@
       return classDeclaration!.name;
     } else if (mixinDeclaration != null) {
       return mixinDeclaration!.name;
-    } else {
+    } else if (extensionDeclaration != null) {
       return extensionDeclaration!.name;
+    } else {
+      return enumDeclaration!.name;
     }
   }
 
@@ -236,6 +253,9 @@
   }
 
   @override
+  void beginEnum(Token enumKeyword) {}
+
+  @override
   void beginExtensionDeclaration(Token extensionKeyword, Token? nameToken) {
     assert(optional('extension', extensionKeyword));
     assert(classDeclaration == null &&
@@ -330,11 +350,7 @@
     }
     if (staticToken != null) {
       assert(staticToken.isModifier);
-      String? className = classDeclaration != null
-          ? classDeclaration!.name.name
-          : (mixinDeclaration != null
-              ? mixinDeclaration!.name.name
-              : extensionDeclaration!.name?.name);
+      String? className = currentDeclarationName?.name;
       if (name.lexeme != className || getOrSet != null) {
         modifiers.staticKeyword = staticToken;
       }
@@ -1173,17 +1189,18 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
     assert(optional('enum', enumKeyword));
     assert(optional('{', leftBrace));
     debugEvent("Enum");
+  }
 
-    var constants = popTypedList2<EnumConstantDeclaration>(count);
-    var name = pop() as SimpleIdentifier;
-    var metadata = pop() as List<Annotation>?;
-    var comment = _findComment(metadata, enumKeyword);
-    declarations.add(ast.enumDeclaration(comment, metadata, enumKeyword, name,
-        leftBrace, constants, leftBrace.endGroup!));
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    debugEvent("endEnumConstructor");
+    endClassConstructor(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
   }
 
   @override
@@ -1412,18 +1429,32 @@
   @override
   void endFormalParameter(
       Token? thisKeyword,
-      Token? periodAfterThis,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
       Token? initializerStart,
       Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
     assert(optionalOrNull('this', thisKeyword));
-    assert(thisKeyword == null
-        ? periodAfterThis == null
-        : optional('.', periodAfterThis!));
+    assert(optionalOrNull('super', superKeyword));
+    assert(thisKeyword == null && superKeyword == null
+        ? periodAfterThisOrSuper == null
+        : optional('.', periodAfterThisOrSuper!));
     debugEvent("FormalParameter");
 
+    if (superKeyword != null && !enableSuperParameters) {
+      var feature = ExperimentalFeatures.super_parameters;
+      handleRecoverableError(
+        templateExperimentNotEnabled.withArguments(
+          feature.enableString,
+          _versionAsString(ExperimentStatus.currentVersion),
+        ),
+        superKeyword,
+        superKeyword,
+      );
+    }
+
     var defaultValue = pop() as _ParameterDefaultValue?;
     var name = pop() as SimpleIdentifier?;
     var typeOrFunctionTypedParameter = pop() as AstNode?;
@@ -1443,7 +1474,7 @@
       // This is a temporary AST node that was constructed in
       // [endFunctionTypedFormalParameter]. We now deconstruct it and create
       // the final AST node.
-      if (thisKeyword == null) {
+      if (thisKeyword == null && superKeyword == null) {
         node = ast.functionTypedFormalParameter2(
             identifier: name!,
             comment: comment,
@@ -1454,7 +1485,9 @@
             typeParameters: typeOrFunctionTypedParameter.typeParameters,
             parameters: typeOrFunctionTypedParameter.parameters,
             question: typeOrFunctionTypedParameter.question);
-      } else {
+      } else if (thisKeyword != null) {
+        assert(superKeyword == null,
+            "Can't have both 'this' and 'super' in a parameter.");
         node = ast.fieldFormalParameter2(
             identifier: name!,
             comment: comment,
@@ -1463,7 +1496,21 @@
             requiredKeyword: requiredKeyword,
             type: typeOrFunctionTypedParameter.returnType,
             thisKeyword: thisKeyword,
-            period: periodAfterThis!,
+            period: periodAfterThisOrSuper!,
+            typeParameters: typeOrFunctionTypedParameter.typeParameters,
+            parameters: typeOrFunctionTypedParameter.parameters,
+            question: typeOrFunctionTypedParameter.question);
+      } else {
+        assert(superKeyword != null && thisKeyword == null);
+        node = ast.superFormalParameter(
+            identifier: name!,
+            comment: comment,
+            metadata: metadata,
+            covariantKeyword: covariantKeyword,
+            requiredKeyword: requiredKeyword,
+            type: typeOrFunctionTypedParameter.returnType,
+            superKeyword: superKeyword!,
+            period: periodAfterThisOrSuper!,
             typeParameters: typeOrFunctionTypedParameter.typeParameters,
             parameters: typeOrFunctionTypedParameter.parameters,
             question: typeOrFunctionTypedParameter.question);
@@ -2613,20 +2660,6 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    assert(optionalOrNull('implements', implementsKeyword));
-    debugEvent("ClassImplements");
-
-    if (implementsKeyword != null) {
-      var interfaces = popTypedList2<NamedType>(interfacesCount);
-      push(ast.implementsClause(implementsKeyword, interfaces));
-    } else {
-      push(NullValue.IdentifierList);
-    }
-  }
-
-  @override
   void handleClassWithClause(Token withKeyword) {
     assert(optional('with', withKeyword));
     var mixinTypes = pop() as List<NamedType>;
@@ -2702,6 +2735,101 @@
   }
 
   @override
+  void handleEnumElement(Token beginToken) {
+    debugEvent("EnumElement");
+    var arguments = pop() as MethodInvocationImpl?;
+    var constructorName = pop() as ConstructorNameImpl?;
+
+    if (!enableEnhancedEnums &&
+        (arguments != null ||
+            constructorName != null &&
+                (constructorName.type2.typeArguments != null ||
+                    constructorName.name != null))) {
+      Token token = arguments != null
+          ? arguments.argumentList.beginToken
+          : constructorName!.beginToken;
+      var feature = ExperimentalFeatures.enhanced_enums;
+      handleRecoverableError(
+        templateExperimentNotEnabled.withArguments(
+          feature.enableString,
+          _versionAsString(ExperimentStatus.currentVersion),
+        ),
+        token,
+        token,
+      );
+    }
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    debugEvent("EnumElements");
+
+    var constants = popTypedList2<EnumConstantDeclaration>(elementsCount);
+    enumDeclaration!.constants.addAll(constants);
+
+    if (!enableEnhancedEnums && optional(';', elementsEndToken)) {
+      var feature = ExperimentalFeatures.enhanced_enums;
+      handleRecoverableError(
+        templateExperimentNotEnabled.withArguments(
+          feature.enableString,
+          _versionAsString(ExperimentStatus.currentVersion),
+        ),
+        elementsEndToken,
+        elementsEndToken,
+      );
+    }
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    assert(optional('enum', enumKeyword));
+    assert(optional('{', leftBrace));
+    debugEvent("EnumHeader");
+
+    var implementsClause = pop(NullValue.IdentifierList) as ImplementsClause?;
+    var withClause = pop(NullValue.WithClause) as WithClause?;
+    var typeParameters = pop() as TypeParameterList?;
+    var name = pop() as SimpleIdentifier;
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, enumKeyword);
+
+    if (!enableEnhancedEnums &&
+        (withClause != null ||
+            implementsClause != null ||
+            typeParameters != null)) {
+      var token = withClause != null
+          ? withClause.withKeyword
+          : implementsClause != null
+              ? implementsClause.implementsKeyword
+              : typeParameters!.beginToken;
+      var feature = ExperimentalFeatures.enhanced_enums;
+      handleRecoverableError(
+        templateExperimentNotEnabled.withArguments(
+          feature.enableString,
+          _versionAsString(ExperimentStatus.currentVersion),
+        ),
+        token,
+        token,
+      );
+    }
+
+    declarations.add(enumDeclaration = ast.enumDeclaration(comment, metadata,
+        enumKeyword, name, leftBrace, [], [], leftBrace.endGroup!));
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    push(NullValue.WithClause);
+  }
+
+  @override
+  void handleEnumWithClause(Token withKeyword) {
+    assert(optional('with', withKeyword));
+    var mixinTypes = pop() as List<NamedType>;
+    push(ast.withClause(withKeyword, mixinTypes));
+  }
+
+  @override
   void handleErrorToken(ErrorToken token) {
     translateErrorToken(token, errorReporter.reportScannerError);
   }
@@ -2929,6 +3057,19 @@
   }
 
   @override
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    assert(optionalOrNull('implements', implementsKeyword));
+    debugEvent("Implements");
+
+    if (implementsKeyword != null) {
+      var interfaces = popTypedList2<NamedType>(interfacesCount);
+      push(ast.implementsClause(implementsKeyword, interfaces));
+    } else {
+      push(NullValue.IdentifierList);
+    }
+  }
+
+  @override
   void handleImportPrefix(Token? deferredKeyword, Token? asKeyword) {
     assert(optionalOrNull('deferred', deferredKeyword));
     assert(optionalOrNull('as', asKeyword));
@@ -3371,6 +3512,14 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    debugEvent("NoTypeNameInConstructorReference");
+    assert(enumDeclaration != null);
+
+    push(ast.simpleIdentifier(enumDeclaration!.name.token));
+  }
+
+  @override
   void handleNoVariableInitializer(Token token) {
     debugEvent("NoVariableInitializer");
   }
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index 0159195..6ce8f76 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -191,10 +191,6 @@
         _reportByCode(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, message,
             offset, length);
         return;
-      case "INVALID_SUPER_INVOCATION":
-        errorReporter?.reportErrorForOffset(
-            CompileTimeErrorCode.INVALID_SUPER_INVOCATION, offset, length);
-        return;
       case "MISSING_DIGIT":
         errorReporter?.reportErrorForOffset(
             ScannerErrorCode.MISSING_DIGIT, offset, length);
@@ -265,6 +261,10 @@
         errorReporter?.reportErrorForOffset(
             CompileTimeErrorCode.RETURN_IN_GENERATOR, offset, length);
         return;
+      case "SUPER_INVOCATION_NOT_LAST":
+        errorReporter?.reportErrorForOffset(
+            CompileTimeErrorCode.SUPER_INVOCATION_NOT_LAST, offset, length);
+        return;
       case "SUPER_IN_REDIRECTING_CONSTRUCTOR":
         errorReporter?.reportErrorForOffset(
             CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR,
diff --git a/pkg/analyzer/lib/src/file_system/file_system.dart b/pkg/analyzer/lib/src/file_system/file_system.dart
index 16c7b2a..b7b4655 100644
--- a/pkg/analyzer/lib/src/file_system/file_system.dart
+++ b/pkg/analyzer/lib/src/file_system/file_system.dart
@@ -18,6 +18,11 @@
   ResourceProvider get provider => _provider;
 
   @override
+  Uri pathToUri(String path) {
+    return _provider.pathContext.toUri(path);
+  }
+
+  @override
   Source? resolveAbsolute(Uri uri) {
     if (!isFileUri(uri)) {
       return null;
@@ -27,9 +32,9 @@
     return file.createSource(uri);
   }
 
+  @Deprecated('Use pathToUri() instead')
   @override
-  Uri restoreAbsolute(Source source) =>
-      _provider.pathContext.toUri(source.fullName);
+  Uri restoreAbsolute(Source source) => pathToUri(source.fullName);
 
   /// Return `true` if the given [uri] is a `file` URI.
   static bool isFileUri(Uri uri) => uri.scheme == FILE_SCHEME;
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 717940b..e64547d 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -438,7 +438,7 @@
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER,
             node,
-            [superType, name]);
+            [superType, name.name]);
       } else {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT,
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index c678842..86b03d0 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -285,6 +285,9 @@
   /// re-throwing them)
   bool propagateLinterExceptions = false;
 
+  /// Whether implicit casts should be reported as potential problems.
+  bool strictCasts = false;
+
   /// A flag indicating whether inference failures are allowed, off by default.
   ///
   /// This option is experimental and subject to change.
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index b53caa5..115365f 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -260,7 +260,7 @@
         _requiredParametersVerifier = RequiredParametersVerifier(errorReporter),
         _duplicateDefinitionVerifier =
             DuplicateDefinitionVerifier(_currentLibrary, errorReporter) {
-    _isInSystemLibrary = _currentLibrary.source.isInSystemLibrary;
+    _isInSystemLibrary = _currentLibrary.source.uri.isScheme('dart');
     _isInCatchClause = false;
     _isInStaticVariableDeclaration = false;
     _isInConstructorInitializer = false;
@@ -517,7 +517,7 @@
       }
       _constructorFieldsVerifier.verify(node);
       _checkForRedirectingConstructorErrorCodes(node);
-      _checkForMultipleSuperInitializers(node);
+      _checkForConflictingInitializerErrorCodes(node);
       _checkForRecursiveConstructorRedirect(node, element);
       if (!_checkForRecursiveFactoryRedirect(node, element)) {
         _checkForAllRedirectConstructorErrorCodes(node);
@@ -795,7 +795,7 @@
         if (parameterType is FunctionType &&
             parameterType.returnType.isDynamic) {
           errorReporter.reportErrorForNode(LanguageCode.IMPLICIT_DYNAMIC_RETURN,
-              node.identifier, [node.identifier]);
+              node.identifier, [node.identifier.name]);
         }
       }
 
@@ -1848,6 +1848,99 @@
     }
   }
 
+  /// Check that the given constructor [declaration] has a valid combination of
+  /// redirecting constructor invocation(s), super constructor invocation(s),
+  /// field initializers, and assert initializers.
+  void _checkForConflictingInitializerErrorCodes(
+      ConstructorDeclaration declaration) {
+    // Count and check each redirecting initializer.
+    var redirectingInitializerCount = 0;
+    var superInitializerCount = 0;
+    late SuperConstructorInvocation superInitializer;
+    for (ConstructorInitializer initializer in declaration.initializers) {
+      if (initializer is RedirectingConstructorInvocation) {
+        if (redirectingInitializerCount > 0) {
+          errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS,
+              initializer);
+        }
+        if (declaration.factoryKeyword == null) {
+          RedirectingConstructorInvocation invocation = initializer;
+          var redirectingElement = invocation.staticElement;
+          if (redirectingElement == null) {
+            String enclosingNamedType = _enclosingClass!.displayName;
+            String constructorStrName = enclosingNamedType;
+            if (invocation.constructorName != null) {
+              constructorStrName += ".${invocation.constructorName!.name}";
+            }
+            errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR,
+                invocation,
+                [constructorStrName, enclosingNamedType]);
+          } else {
+            if (redirectingElement.isFactory) {
+              errorReporter.reportErrorForNode(
+                  CompileTimeErrorCode
+                      .REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR,
+                  initializer);
+            }
+          }
+        }
+        // [declaration] is a redirecting constructor via a redirecting
+        // initializer.
+        _checkForRedirectToNonConstConstructor(
+          declaration.declaredElement!,
+          initializer.staticElement,
+          initializer.constructorName ?? initializer.thisKeyword,
+        );
+        redirectingInitializerCount++;
+      } else if (initializer is SuperConstructorInvocation) {
+        if (superInitializerCount == 1) {
+          // Only report the second (first illegal) superinitializer.
+          errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS, initializer);
+        }
+        superInitializer = initializer;
+        superInitializerCount++;
+      }
+    }
+    // Check for initializers which are illegal when alongside a redirecting
+    // initializer.
+    if (redirectingInitializerCount > 0) {
+      for (ConstructorInitializer initializer in declaration.initializers) {
+        if (initializer is SuperConstructorInvocation) {
+          errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR,
+              initializer);
+        }
+        if (initializer is ConstructorFieldInitializer) {
+          errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR,
+              initializer);
+        }
+        if (initializer is AssertInitializer) {
+          errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.ASSERT_IN_REDIRECTING_CONSTRUCTOR,
+              initializer);
+        }
+      }
+    }
+    if (redirectingInitializerCount == 0 &&
+        superInitializerCount == 1 &&
+        superInitializer != declaration.initializers.last) {
+      var superNamedType = _enclosingClass!.supertype!.element.displayName;
+      var constructorStrName = superNamedType;
+      var constructorName = superInitializer.constructorName;
+      if (constructorName != null) {
+        constructorStrName += '.${constructorName.name}';
+      }
+      errorReporter.reportErrorForToken(
+          CompileTimeErrorCode.SUPER_INVOCATION_NOT_LAST,
+          superInitializer.superKeyword,
+          [constructorStrName]);
+    }
+  }
+
   /// Verify that if the given [constructor] declaration is 'const' then there
   /// are no invocations of non-'const' super constructors, and that there are
   /// no instance variables mixed in.
@@ -2089,12 +2182,12 @@
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR,
           name,
-          [className, name]);
+          [className.toSource(), name.name]);
     } else {
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
           constructorName,
-          [className]);
+          [className.toSource()]);
     }
   }
 
@@ -2166,6 +2259,26 @@
 
     DartType iterableType = node.iterable.typeOrThrow;
 
+    Token? awaitKeyword;
+    var parent = node.parent;
+    if (parent is ForStatement) {
+      awaitKeyword = parent.awaitKeyword;
+    } else if (parent is ForElement) {
+      awaitKeyword = parent.awaitKeyword;
+    }
+
+    // Use an explicit string instead of [loopType] to remove the "<E>".
+    String loopNamedType = awaitKeyword != null ? 'Stream' : 'Iterable';
+
+    if (iterableType.isDynamic && typeSystem.strictCasts) {
+      errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE,
+        node.iterable,
+        [iterableType, loopNamedType],
+      );
+      return false;
+    }
+
     // TODO(scheglov) use NullableDereferenceVerifier
     if (_isNonNullableByDefault) {
       if (typeSystem.isNullable(iterableType)) {
@@ -2182,14 +2295,6 @@
       return false;
     }
 
-    Token? awaitKeyword;
-    var parent = node.parent;
-    if (parent is ForStatement) {
-      awaitKeyword = parent.awaitKeyword;
-    } else if (parent is ForElement) {
-      awaitKeyword = parent.awaitKeyword;
-    }
-
     // The object being iterated has to implement Iterable<T> for some T that
     // is assignable to the variable's type.
     // TODO(rnystrom): Move this into mostSpecificTypeArgument()?
@@ -2204,8 +2309,6 @@
     }
 
     if (!typeSystem.isAssignableTo(iterableType, requiredSequenceType)) {
-      // Use an explicit string instead of [loopType] to remove the "<E>".
-      String loopNamedType = awaitKeyword != null ? 'Stream' : 'Iterable';
       errorReporter.reportErrorForNode(
         CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE,
         node.iterable,
@@ -2403,7 +2506,7 @@
     }
     // The SDK implementation may implement disallowed types. For example,
     // JSNumber in dart2js and _Smi in Dart VM both implement int.
-    if (_currentLibrary.source.isInSystemLibrary) {
+    if (_currentLibrary.source.uri.isScheme('dart')) {
       return false;
     }
     var type = namedType.type;
@@ -2593,7 +2696,7 @@
       }
       // Parameters associated with a variable always have a name, so we can
       // safely rely on [id] being non-`null`.
-      errorReporter.reportErrorForNode(errorCode, node, [id!]);
+      errorReporter.reportErrorForNode(errorCode, node, [id!.toSource()]);
     }
   }
 
@@ -2739,18 +2842,18 @@
         errorReporter.reportErrorForNode(
             CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD,
             initializer,
-            [fieldName]);
+            [fieldName.name]);
       } else if (staticElement.isStatic) {
         errorReporter.reportErrorForNode(
             CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD,
             initializer,
-            [fieldName]);
+            [fieldName.name]);
       }
     } else {
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD,
           initializer,
-          [fieldName]);
+          [fieldName.name]);
       return;
     }
   }
@@ -3270,22 +3373,6 @@
     }
   }
 
-  /// Verify that the given [constructor] has at most one 'super' initializer.
-  ///
-  /// See [CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS].
-  void _checkForMultipleSuperInitializers(ConstructorDeclaration constructor) {
-    bool hasSuperInitializer = false;
-    for (ConstructorInitializer initializer in constructor.initializers) {
-      if (initializer is SuperConstructorInvocation) {
-        if (hasSuperInitializer) {
-          errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS, initializer);
-        }
-        hasSuperInitializer = true;
-      }
-    }
-  }
-
   /// Checks to ensure that the given native function [body] is in SDK code.
   ///
   /// See [ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE].
@@ -3328,12 +3415,12 @@
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR,
           name,
-          [className, name]);
+          [className.toSource(), name.name]);
     } else {
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
           constructorName,
-          [className]);
+          [className.toSource()]);
     }
   }
 
@@ -3651,8 +3738,9 @@
 
       if (treatedAsDouble) {
         // Suggest the nearest valid double (as a BigInt for printing reasons).
-        extraErrorArgs
-            .add(BigInt.from(IntegerLiteralImpl.nearestValidDouble(lexeme)));
+        extraErrorArgs.add(
+            BigInt.from(IntegerLiteralImpl.nearestValidDouble(lexeme))
+                .toString());
       }
 
       errorReporter.reportErrorForNode(
@@ -3727,112 +3815,44 @@
     return true;
   }
 
-  /// Check that the given constructor [declaration] has a valid combination of
-  /// redirected constructor invocation(s), super constructor invocations and
-  /// field initializers.
-  ///
-  /// See [CompileTimeErrorCode.ASSERT_IN_REDIRECTING_CONSTRUCTOR],
-  /// [CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR],
-  /// [CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR],
-  /// [CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS],
-  /// [CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR], and
-  /// [CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR].
+  /// Check that the given constructor [declaration] has a valid redirected
+  /// constructor.
   void _checkForRedirectingConstructorErrorCodes(
       ConstructorDeclaration declaration) {
-    // Check for default values in the parameters
+    // Check for default values in the parameters.
     var redirectedConstructor = declaration.redirectedConstructor;
-    if (redirectedConstructor != null) {
-      for (FormalParameter parameter in declaration.parameters.parameters) {
-        if (parameter is DefaultFormalParameter &&
-            parameter.defaultValue != null) {
-          errorReporter.reportErrorForNode(
-              CompileTimeErrorCode
-                  .DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR,
-              parameter.identifier!);
-        }
-      }
-      var redirectedElement = redirectedConstructor.staticElement;
-      _checkForRedirectToNonConstConstructor(
-        declaration.declaredElement!,
-        redirectedElement,
-        redirectedConstructor,
-      );
-      var redirectedClass = redirectedElement?.enclosingElement;
-      if (redirectedClass is ClassElement &&
-          redirectedClass.isAbstract &&
-          redirectedElement != null &&
-          !redirectedElement.isFactory) {
-        String enclosingNamedType = _enclosingClass!.displayName;
-        String constructorStrName = enclosingNamedType;
-        if (declaration.name != null) {
-          constructorStrName += ".${declaration.name!.name}";
-        }
+    if (redirectedConstructor == null) {
+      return;
+    }
+    for (FormalParameter parameter in declaration.parameters.parameters) {
+      if (parameter is DefaultFormalParameter &&
+          parameter.defaultValue != null) {
         errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.REDIRECT_TO_ABSTRACT_CLASS_CONSTRUCTOR,
-            redirectedConstructor,
-            [constructorStrName, redirectedClass.name]);
+            CompileTimeErrorCode
+                .DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR,
+            parameter.identifier!);
       }
     }
-    // check if there are redirected invocations
-    int numRedirections = 0;
-    for (ConstructorInitializer initializer in declaration.initializers) {
-      if (initializer is RedirectingConstructorInvocation) {
-        if (numRedirections > 0) {
-          errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS,
-              initializer);
-        }
-        if (declaration.factoryKeyword == null) {
-          RedirectingConstructorInvocation invocation = initializer;
-          var redirectingElement = invocation.staticElement;
-          if (redirectingElement == null) {
-            String enclosingNamedType = _enclosingClass!.displayName;
-            String constructorStrName = enclosingNamedType;
-            if (invocation.constructorName != null) {
-              constructorStrName += ".${invocation.constructorName!.name}";
-            }
-            errorReporter.reportErrorForNode(
-                CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR,
-                invocation,
-                [constructorStrName, enclosingNamedType]);
-          } else {
-            if (redirectingElement.isFactory) {
-              errorReporter.reportErrorForNode(
-                  CompileTimeErrorCode
-                      .REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR,
-                  initializer);
-            }
-          }
-        }
-        // [declaration] is a redirecting constructor via a redirecting
-        // initializer.
-        _checkForRedirectToNonConstConstructor(
-          declaration.declaredElement!,
-          initializer.staticElement,
-          initializer.constructorName ?? initializer.thisKeyword,
-        );
-        numRedirections++;
+    var redirectedElement = redirectedConstructor.staticElement;
+    _checkForRedirectToNonConstConstructor(
+      declaration.declaredElement!,
+      redirectedElement,
+      redirectedConstructor,
+    );
+    var redirectedClass = redirectedElement?.enclosingElement;
+    if (redirectedClass is ClassElement &&
+        redirectedClass.isAbstract &&
+        redirectedElement != null &&
+        !redirectedElement.isFactory) {
+      String enclosingNamedType = _enclosingClass!.displayName;
+      String constructorStrName = enclosingNamedType;
+      if (declaration.name != null) {
+        constructorStrName += ".${declaration.name!.name}";
       }
-    }
-    // check for other initializers
-    if (numRedirections > 0) {
-      for (ConstructorInitializer initializer in declaration.initializers) {
-        if (initializer is SuperConstructorInvocation) {
-          errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR,
-              initializer);
-        }
-        if (initializer is ConstructorFieldInitializer) {
-          errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR,
-              initializer);
-        }
-        if (initializer is AssertInitializer) {
-          errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.ASSERT_IN_REDIRECTING_CONSTRUCTOR,
-              initializer);
-        }
-      }
+      errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.REDIRECT_TO_ABSTRACT_CLASS_CONSTRUCTOR,
+          redirectedConstructor,
+          [constructorStrName, redirectedClass.name]);
     }
   }
 
@@ -4063,7 +4083,7 @@
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.TYPE_ANNOTATION_DEFERRED_CLASS,
           type,
-          [type.name]);
+          [type.name.toSource()]);
     }
   }
 
@@ -4750,12 +4770,27 @@
 
   void _checkUseOfCovariantInParameters(FormalParameterList node) {
     var parent = node.parent;
-    if (_enclosingClass != null &&
-        parent is MethodDeclaration &&
-        !parent.isStatic) {
+    if (_enclosingClass != null && parent is MethodDeclaration) {
+      // Either [parent] is a static method, in which case `EXTRANEOUS_MODIFIER`
+      // is reported by the parser, or [parent] is an instance method, in which
+      // case any use of `covariant` is legal.
       return;
     }
 
+    if (_enclosingExtension != null) {
+      // `INVALID_USE_OF_COVARIANT_IN_EXTENSION` is reported by the parser.
+      return;
+    }
+
+    if (parent is FunctionExpression) {
+      var parent2 = parent.parent;
+      if (parent2 is FunctionDeclaration && parent2.parent is CompilationUnit) {
+        // `EXTRANEOUS_MODIFIER` is reported by the parser, for library-level
+        // functions.
+        return;
+      }
+    }
+
     NodeList<FormalParameter> parameters = node.parameters;
     int length = parameters.length;
     for (int i = 0; i < length; i++) {
@@ -4765,14 +4800,10 @@
       }
       var keyword = parameter.covariantKeyword;
       if (keyword != null) {
-        if (_enclosingExtension != null) {
-          // Reported by the parser.
-        } else {
-          errorReporter.reportErrorForToken(
-            CompileTimeErrorCode.INVALID_USE_OF_COVARIANT,
-            keyword,
-          );
-        }
+        errorReporter.reportErrorForToken(
+          CompileTimeErrorCode.INVALID_USE_OF_COVARIANT,
+          keyword,
+        );
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
index 4d6223c..69b37a5 100644
--- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
@@ -16,6 +16,9 @@
 /// used. See 'pkg/vm/lib/transformations/ffi_checks.md' for the specification
 /// of the desired hints.
 class FfiVerifier extends RecursiveAstVisitor<void> {
+  static const _abiSpecificIntegerClassName = 'AbiSpecificInteger';
+  static const _abiSpecificIntegerMappingClassName =
+      'AbiSpecificIntegerMapping';
   static const _allocatorClassName = 'Allocator';
   static const _allocateExtensionMethodName = 'call';
   static const _allocatorExtensionName = 'AllocatorAlloc';
@@ -25,7 +28,7 @@
   static const _opaqueClassName = 'Opaque';
   static const _ffiNativeName = 'FfiNative';
 
-  static const List<String> _primitiveIntegerNativeTypes = [
+  static const Set<String> _primitiveIntegerNativeTypesFixedSize = {
     'Int8',
     'Int16',
     'Int32',
@@ -34,13 +37,16 @@
     'Uint16',
     'Uint32',
     'Uint64',
+  };
+  static const Set<String> _primitiveIntegerNativeTypes = {
+    ..._primitiveIntegerNativeTypesFixedSize,
     'IntPtr'
-  ];
+  };
 
-  static const List<String> _primitiveDoubleNativeTypes = [
+  static const Set<String> _primitiveDoubleNativeTypes = {
     'Float',
     'Double',
-  ];
+  };
 
   static const _primitiveBoolNativeType = 'Bool';
 
@@ -85,8 +91,12 @@
           if (className == _structClassName) {
             _validatePackedAnnotation(node.metadata);
           }
+        } else if (className == _abiSpecificIntegerClassName) {
+          _validateAbiSpecificIntegerMappingAnnotation(
+              node.name, node.metadata);
         } else if (className != _allocatorClassName &&
-            className != _opaqueClassName) {
+            className != _opaqueClassName &&
+            className != _abiSpecificIntegerClassName) {
           _errorReporter.reportErrorForNode(
               FfiCode.SUBTYPE_OF_FFI_CLASS_IN_EXTENDS,
               superclass.name,
@@ -108,11 +118,11 @@
         return;
       }
       if (typename.ffiClass != null) {
-        _errorReporter.reportErrorForNode(
-            subtypeOfFfiCode, typename, [node.name, typename.name]);
+        _errorReporter.reportErrorForNode(subtypeOfFfiCode, typename,
+            [node.name.name, typename.name.toSource()]);
       } else if (typename.isCompoundSubtype) {
-        _errorReporter.reportErrorForNode(
-            subtypeOfStructCode, typename, [node.name, typename.name]);
+        _errorReporter.reportErrorForNode(subtypeOfStructCode, typename,
+            [node.name.name, typename.name.toSource()]);
       }
     }
 
@@ -133,7 +143,7 @@
 
     if (inCompound && node.declaredElement!.typeParameters.isNotEmpty) {
       _errorReporter.reportErrorForNode(
-          FfiCode.GENERIC_STRUCT_SUBCLASS, node.name, [node.name]);
+          FfiCode.GENERIC_STRUCT_SUBCLASS, node.name, [node.name.name]);
     }
     super.visitClassDeclaration(node);
   }
@@ -452,6 +462,9 @@
     if (nativeType.isArray) {
       return true;
     }
+    if (nativeType.isAbiSpecificIntegerSubtype) {
+      return true;
+    }
     return false;
   }
 
@@ -523,6 +536,9 @@
       if (nativeType.isOpaqueSubtype) {
         return true;
       }
+      if (nativeType.isAbiSpecificIntegerSubtype) {
+        return true;
+      }
       if (allowArray && nativeType.isArray) {
         return _isValidFfiNativeType(nativeType.typeArguments.single,
             allowVoid: false, allowEmptyStruct: false);
@@ -591,10 +607,51 @@
       } else if (_primitiveBoolNativeType == name) {
         return _PrimitiveDartType.bool;
       }
+      if (element.type.returnType.isAbiSpecificIntegerSubtype) {
+        return _PrimitiveDartType.int;
+      }
     }
     return _PrimitiveDartType.none;
   }
 
+  /// Validate that the [annotations] include at most one mapping annotation.
+  void _validateAbiSpecificIntegerMappingAnnotation(
+      AstNode errorNode, NodeList<Annotation> annotations) {
+    final ffiPackedAnnotations = annotations
+        .where((annotation) => annotation.isAbiSpecificIntegerMapping)
+        .toList();
+
+    if (ffiPackedAnnotations.isEmpty) {
+      _errorReporter.reportErrorForNode(
+          FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_MISSING, errorNode);
+      return;
+    }
+
+    if (ffiPackedAnnotations.length > 1) {
+      final extraAnnotations = ffiPackedAnnotations.skip(1);
+      for (final annotation in extraAnnotations) {
+        _errorReporter.reportErrorForNode(
+            FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_EXTRA, annotation.name);
+      }
+    }
+
+    final annotationConstant =
+        ffiPackedAnnotations.first.elementAnnotation?.computeConstantValue();
+    final mappingValues = annotationConstant?.getField('mapping')?.toMapValue();
+    if (mappingValues == null) {
+      return;
+    }
+    for (final nativeType in mappingValues.values) {
+      final nativeTypeName = nativeType?.type?.element?.name;
+      if (nativeTypeName != null &&
+          !_primitiveIntegerNativeTypesFixedSize.contains(nativeTypeName)) {
+        _errorReporter.reportErrorForNode(
+            FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_UNSUPPORTED,
+            ffiPackedAnnotations.first.name);
+      }
+    }
+  }
+
   void _validateAllocate(FunctionExpressionInvocation node) {
     final typeArgumentTypes = node.typeArgumentTypes;
     if (typeArgumentTypes == null || typeArgumentTypes.length != 1) {
@@ -619,7 +676,9 @@
     bool requiredFound = false;
     List<Annotation> extraAnnotations = [];
     for (Annotation annotation in annotations) {
-      if (annotation.element.ffiClass != null) {
+      if (annotation.element.ffiClass != null ||
+          annotation.element?.enclosingElement.isAbiSpecificIntegerSubclass ==
+              true) {
         if (requiredFound) {
           extraAnnotations.add(annotation);
         } else {
@@ -744,7 +803,10 @@
   bool _validateCompatibleNativeType(
       DartType dartType, DartType nativeType, bool checkCovariance) {
     final nativeReturnType = _primitiveNativeType(nativeType);
-    if (nativeReturnType == _PrimitiveDartType.int) {
+    if (nativeReturnType == _PrimitiveDartType.int ||
+        (nativeType is InterfaceType &&
+            nativeType.superclass?.element.name ==
+                _abiSpecificIntegerClassName)) {
       return dartType.isDartCoreInt;
     } else if (nativeReturnType == _PrimitiveDartType.double) {
       return dartType.isDartCoreDouble;
@@ -1197,6 +1259,14 @@
         element.ffiClass != null &&
         element.enclosingElement.name == 'Packed';
   }
+
+  bool get isAbiSpecificIntegerMapping {
+    final element = this.element;
+    return element is ConstructorElement &&
+        element.ffiClass != null &&
+        element.enclosingElement.name ==
+            FfiVerifier._abiSpecificIntegerMappingClassName;
+  }
 }
 
 extension on ElementAnnotation {
@@ -1332,6 +1402,21 @@
     return element is ClassElement && element.supertype.isUnion;
   }
 
+  /// Return `true` if this represents the class `AbiSpecificInteger`.
+  bool get isAbiSpecificInteger {
+    final element = this;
+    return element is ClassElement &&
+        element.name == FfiVerifier._abiSpecificIntegerClassName &&
+        element.isFfiClass;
+  }
+
+  /// Return `true` if this represents a subclass of the class
+  /// `AbiSpecificInteger`.
+  bool get isAbiSpecificIntegerSubclass {
+    final element = this;
+    return element is ClassElement && element.supertype.isAbiSpecificInteger;
+  }
+
   /// If this is a class element from `dart:ffi`, return it.
   ClassElement? get ffiClass {
     var element = this;
@@ -1398,6 +1483,11 @@
     final self = this;
     return self is InterfaceType && self.element.isUnion;
   }
+
+  bool get isAbiSpecificInteger {
+    final self = this;
+    return self is InterfaceType && self.element.isAbiSpecificInteger;
+  }
 }
 
 extension on DartType {
@@ -1467,6 +1557,22 @@
     return false;
   }
 
+  /// Returns `true` iff this is an Abi-specific integer type,
+  /// i.e. a subtype of `AbiSpecificInteger`.
+  bool get isAbiSpecificIntegerSubtype {
+    final self = this;
+    if (self is InterfaceType) {
+      final superType = self.element.supertype;
+      if (superType != null) {
+        final superClassElement = superType.element;
+        return superClassElement.name ==
+                FfiVerifier._abiSpecificIntegerClassName &&
+            superClassElement.isFfiClass;
+      }
+    }
+    return false;
+  }
+
   /// Returns `true` iff this is a opaque type, i.e. a subtype of `Opaque`.
   bool get isOpaqueSubtype {
     final self = this;
@@ -1516,13 +1622,7 @@
   bool get isCompoundSubtype {
     var element = name.staticElement;
     if (element is ClassElement) {
-      bool isCompound(InterfaceType? type) {
-        return type != null && type.isCompound;
-      }
-
-      return isCompound(element.supertype) ||
-          element.interfaces.any(isCompound) ||
-          element.mixins.any(isCompound);
+      return element.allSupertypes.any((e) => e.isCompound);
     }
     return false;
   }
diff --git a/pkg/analyzer/lib/src/generated/java_engine_io.dart b/pkg/analyzer/lib/src/generated/java_engine_io.dart
index 5ee3c34..96e9e51 100644
--- a/pkg/analyzer/lib/src/generated/java_engine_io.dart
+++ b/pkg/analyzer/lib/src/generated/java_engine_io.dart
@@ -4,14 +4,6 @@
 
 import "dart:io";
 
-import "package:analyzer/src/generated/java_io.dart";
-
-class FileUtilities2 {
-  static JavaFile createFile(String path) {
-    return JavaFile(path).getAbsoluteFile();
-  }
-}
-
 class OSUtilities {
   static String LINE_SEPARATOR = isWindows() ? '\r\n' : '\n';
   static bool isMac() => Platform.operatingSystem == 'macos';
diff --git a/pkg/analyzer/lib/src/generated/java_io.dart b/pkg/analyzer/lib/src/generated/java_io.dart
index 3ab4863..4751bc4 100644
--- a/pkg/analyzer/lib/src/generated/java_io.dart
+++ b/pkg/analyzer/lib/src/generated/java_io.dart
@@ -6,6 +6,7 @@
 
 import 'package:path/path.dart' as path;
 
+@Deprecated('Use ResourceProvider and path context instead.')
 class JavaFile {
   @deprecated
   static path.Context pathContext = path.context;
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 5f87d47..80eebe3 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -800,8 +800,10 @@
 
     if (parent is CompilationUnit) {
       return node is ClassDeclaration ||
+          node is Directive ||
           node is ExtensionDeclaration ||
-          node is FunctionDeclaration;
+          node is FunctionDeclaration ||
+          node is TopLevelVariableDeclaration;
     }
 
     void forClassElement(ClassElement parentElement) {
@@ -813,6 +815,11 @@
       return true;
     }
 
+    if (parent is ExtensionDeclaration) {
+      enclosingExtension = parent.declaredElement!;
+      return true;
+    }
+
     if (parent is MixinDeclaration) {
       forClassElement(parent.declaredElement!);
       return true;
@@ -1038,20 +1045,16 @@
     var callerType = InferenceContext.getContext(node);
     NodeList<Expression> arguments = node.arguments;
     if (callerType is FunctionType) {
-      Map<String, DartType> namedParameterTypes =
-          callerType.namedParameterTypes;
-      List<DartType> normalParameterTypes = callerType.normalParameterTypes;
-      List<DartType> optionalParameterTypes = callerType.optionalParameterTypes;
-      int normalCount = normalParameterTypes.length;
-      int optionalCount = optionalParameterTypes.length;
+      var parameters = callerType.parameters;
 
-      Iterable<Expression> positional =
-          arguments.takeWhile((l) => l is! NamedExpression);
-      Iterable<Expression> required = positional.take(normalCount);
-      Iterable<Expression> optional =
-          positional.skip(normalCount).take(optionalCount);
-      Iterable<Expression> named =
-          arguments.skipWhile((l) => l is! NamedExpression);
+      var namedParameters = <String, ParameterElement>{};
+      for (var i = 0; i < parameters.length; i++) {
+        var parameter = parameters[i];
+        if (parameter.isNamed) {
+          namedParameters[parameter.name] = parameter;
+        }
+      }
+
       var parent = node.parent;
       DartType? targetType;
       Element? methodElement;
@@ -1065,28 +1068,29 @@
       //TODO(leafp): Consider using the parameter elements here instead.
       //TODO(leafp): Make sure that the parameter elements are getting
       // setup correctly with inference.
-      int index = 0;
-      for (Expression argument in required) {
-        var parameterType = normalParameterTypes[index++];
-        if (targetType != null) {
-          InferenceContext.setType(
-              argument,
-              typeSystem.refineNumericInvocationContext(
-                  targetType, methodElement, invocationContext, parameterType));
-        } else {
-          InferenceContext.setType(argument, parameterType);
-        }
-      }
-      index = 0;
-      for (Expression argument in optional) {
-        InferenceContext.setType(argument, optionalParameterTypes[index++]);
-      }
-
-      for (Expression argument in named) {
+      var positionalParameterIndex = 0;
+      for (var i = 0; i < arguments.length; i++) {
+        var argument = arguments[i];
+        ParameterElement? parameter;
         if (argument is NamedExpression) {
-          var type = namedParameterTypes[argument.name.label.name];
-          if (type != null) {
-            InferenceContext.setType(argument, type);
+          parameter = namedParameters[argument.name.label.name];
+        } else {
+          while (positionalParameterIndex < parameters.length) {
+            parameter = parameters[positionalParameterIndex++];
+            if (!parameter.isNamed) {
+              break;
+            }
+          }
+        }
+        if (parameter != null) {
+          var parameterType = parameter.type;
+          if (targetType != null) {
+            InferenceContext.setType(
+                argument,
+                typeSystem.refineNumericInvocationContext(targetType,
+                    methodElement, invocationContext, parameterType));
+          } else {
+            InferenceContext.setType(argument, parameterType);
           }
         }
       }
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index 1fd1ec8..265ce79 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -59,6 +59,10 @@
   /// Return the source representing the library with the given 'dart:' [uri],
   /// or `null` if the given URI does not denote a library in this SDK.
   Source? mapDartUri(String uri);
+
+  /// Return the `dart` URI representing the given [path] if the file is in
+  /// this SDK, or `null` if the file is not in this SDK.
+  Uri? pathToUri(String path);
 }
 
 /// Manages the DartSdk's that have been created. Clients need to create
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index f134a33..ed375ff 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -6,16 +6,11 @@
 import 'package:analyzer/src/context/source.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
-import 'package:analyzer/src/task/api/model.dart';
 import 'package:path/path.dart' as pathos;
 
 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 ContentCacheVisitor = void Function(
-    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 {
@@ -24,6 +19,7 @@
 
   BasicSource(this.uri);
 
+  @Deprecated('Not used anymore')
   @override
   String get encoding => uri.toString();
 
@@ -33,6 +29,7 @@
   @override
   int get hashCode => uri.hashCode;
 
+  @Deprecated('Use uri.isScheme("dart") instead')
   @override
   bool get isInSystemLibrary => uri.scheme == 'dart';
 
@@ -61,6 +58,11 @@
   DartSdk get dartSdk => _sdk;
 
   @override
+  Uri? pathToUri(String path) {
+    return _sdk.pathToUri(path);
+  }
+
+  @override
   Source? resolveAbsolute(Uri uri) {
     if (!isDartUri(uri)) {
       return null;
@@ -68,12 +70,6 @@
     return _sdk.mapDartUri(uri.toString());
   }
 
-  @override
-  Uri? restoreAbsolute(Source source) {
-    var dartSource = _sdk.fromFileUri(source.uri);
-    return dartSource?.uri;
-  }
-
   /// Return `true` if the given URI is a `dart:` URI.
   ///
   /// @param uri the URI being tested
@@ -84,7 +80,9 @@
 /// An implementation of an non-existing [Source].
 class NonExistingSource extends Source {
   static final unknown = NonExistingSource(
-      '/unknown.dart', pathos.toUri('/unknown.dart'), UriKind.FILE_URI);
+    '/unknown.dart',
+    pathos.toUri('/unknown.dart'),
+  );
 
   @override
   final String fullName;
@@ -92,35 +90,41 @@
   @override
   final Uri uri;
 
-  @override
-  final UriKind uriKind;
-
-  NonExistingSource(this.fullName, this.uri, this.uriKind);
+  NonExistingSource(this.fullName, this.uri);
 
   @override
   TimestampedData<String> get contents {
     throw UnsupportedError('$fullName does not exist.');
   }
 
+  @Deprecated('Not used anymore')
   @override
   String get encoding => uri.toString();
 
   @override
   int get hashCode => fullName.hashCode;
 
+  @Deprecated('Use uri.isScheme("dart") instead')
   @override
   bool get isInSystemLibrary => false;
 
+  @Deprecated('Not used anymore')
   @override
   int get modificationStamp => -1;
 
   @override
   String get shortName => pathos.basename(fullName);
 
+  @Deprecated('Use Source.uri instead')
+  @override
+  UriKind get uriKind {
+    return UriKind.FILE_URI;
+  }
+
   @override
   bool operator ==(Object other) {
     if (other is NonExistingSource) {
-      return other.uriKind == uriKind && other.fullName == fullName;
+      return other.uri == uri && other.fullName == fullName;
     }
     return false;
   }
@@ -154,7 +158,7 @@
 /// represent non-existent files must also be retained so that if those files
 /// are created at a later date the long-lived sources representing those files
 /// will know that they now exist.
-abstract class Source implements AnalysisTarget {
+abstract class Source {
   /// Get the contents and timestamp of this source.
   ///
   /// Clients should consider using the method [AnalysisContext.getContents]
@@ -170,7 +174,7 @@
   ///
   /// @return an encoded representation of this source
   /// See [SourceFactory.fromEncoding].
-  @deprecated
+  @Deprecated('Not used anymore')
   String get encoding;
 
   /// Return the full (long) version of the name that can be displayed to the
@@ -190,11 +194,9 @@
   /// Return `true` if this source is in one of the system libraries.
   ///
   /// @return `true` if this is in a system library
+  @Deprecated('Use uri.isScheme("dart") instead')
   bool get isInSystemLibrary;
 
-  @override
-  Source get librarySource => throw UnimplementedError();
-
   /// Return the modification stamp for this source, or a negative value if the
   /// source does not exist. A modification stamp is a non-negative integer with
   /// the property that if the contents of the source have not been modified
@@ -206,6 +208,7 @@
   /// Clients should consider using the method
   /// [AnalysisContext.getModificationStamp] because contexts can have local
   /// overrides of the content of a source that the source is not aware of.
+  @Deprecated('Not used anymore')
   int get modificationStamp;
 
   /// Return a short version of the name that can be displayed to the user to
@@ -215,9 +218,6 @@
   /// @return a name that can be displayed to the user to denote this source
   String get shortName;
 
-  @override
-  Source get source => this;
-
   /// Return the URI from which this source was originally derived.
   ///
   /// @return the URI from which this source was originally derived
@@ -230,6 +230,7 @@
   /// against which the relative URI was resolved.
   ///
   /// @return the kind of URI from which this source was originally derived
+  @Deprecated('Use Source.uri instead')
   UriKind get uriKind;
 
   /// Return `true` if the given object is a source that represents the same
@@ -271,10 +272,6 @@
   /// the package (or [null] if there is no registered package URI resolver).
   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 object representing the given absolute URI, or `null` if
   /// the URI is not a valid URI or if it is not an absolute URI.
   ///
@@ -289,6 +286,13 @@
   /// @return a source object representing the absolute URI
   Source? forUri2(Uri absoluteUri);
 
+  /// Return the URI that should be used to reference the file at the absolute
+  /// [path], or `null` if there is no valid way to reference the file.
+  /// The file at that path is not required to exist.
+  ///
+  /// Throws an [ArgumentError] if the [path] is not a valid path.
+  Uri? pathToUri(String path);
+
   /// Return a source representing the URI that results from resolving the given
   /// (possibly relative) [containedUri] against the URI associated with the
   /// [containingSource], whether or not the resulting source exists, or `null`
@@ -301,6 +305,7 @@
   ///
   /// @param source the source to get URI for
   /// @return the absolute URI representing the given source
+  @Deprecated('Use pathToUri() instead')
   Uri? restoreUri(Source source);
 }
 
@@ -348,6 +353,7 @@
 /// The enumeration `UriKind` defines the different kinds of URI's that are
 /// known to the analysis engine. These are used to keep track of the kind of
 /// URI associated with a given source.
+@Deprecated('Use Source.uri instead')
 class UriKind implements Comparable<UriKind> {
   /// A 'dart:' URI.
   static const UriKind DART_URI = UriKind('DART_URI', 0, 0x64);
@@ -413,15 +419,14 @@
 /// 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() {}
+  /// Return the absolute URI that should be used to reference the file at the
+  /// absolute [path], or `null` if this resolver cannot reference this file.
+  /// The file at that path is not required to exist.
+  ///
+  /// Throws an [ArgumentError] if the [path] is not a valid path.
+  /// ignore: deprecated_member_use_from_same_package
+  Uri? pathToUri(String path) => restoreAbsolute(_FakeSource(path));
 
   /// Resolve the given absolute [uri]. Return a [Source] representing the file
   /// to which it was resolved, whether or not the resulting source exists, or
@@ -432,5 +437,21 @@
   /// valid URI cannot be computed.
   ///
   /// The computation should be based solely on [source.fullName].
-  Uri? restoreAbsolute(Source source) => null;
+  @Deprecated('Use pathToUri() instead')
+  Uri? restoreAbsolute(Source source) {
+    return pathToUri(source.fullName);
+  }
+}
+
+class _FakeSource implements Source {
+  @override
+  final String fullName;
+
+  _FakeSource(this.fullName);
+
+  @override
+  Uri get uri => pathos.toUri(fullName);
+
+  @override
+  dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index 906a677..1eb71fb 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -2,112 +2,5 @@
 // for details. 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/src/generated/engine.dart';
-import 'package:analyzer/src/generated/java_io.dart';
-import 'package:analyzer/src/generated/source.dart';
-
+@Deprecated('Import source.dart instead')
 export 'package:analyzer/src/generated/source.dart';
-
-/// Instances of the class `FileBasedSource` implement a source that represents
-/// a file.
-class FileBasedSource extends Source {
-  /// Map from encoded URI/filepath pair to a unique integer identifier.  This
-  /// identifier is used for equality tests and hash codes.
-  ///
-  /// The URI and filepath are joined into a pair by separating them with an '@'
-  /// character.
-  static final Map<String, int> _idTable = HashMap<String, int>();
-
-  /// The URI from which this source was originally derived.
-  @override
-  final Uri uri;
-
-  /// The unique ID associated with this [FileBasedSource].
-  final int id;
-
-  /// The file represented by this source.
-  final JavaFile file;
-
-  /// The cached absolute path of this source.
-  String? _absolutePath;
-
-  /// The cached encoding for this source.
-  String? _encoding;
-
-  /// Initialize a newly created source object to represent the given [file]. If
-  /// a [uri] is given, then it will be used as the URI from which the source
-  /// was derived, otherwise a `file:` URI will be created based on the [file].
-  FileBasedSource(JavaFile file, [Uri? uri])
-      : uri = uri ?? file.toURI(),
-        file = file,
-        id = _idTable.putIfAbsent(
-            '${uri ?? file.toURI()}@${file.getPath()}', () => _idTable.length);
-
-  @override
-  TimestampedData<String> get contents {
-    return contentsFromFile;
-  }
-
-  /// Get the contents and timestamp of the underlying file.
-  ///
-  /// Clients should consider using the method [AnalysisContext.getContents]
-  /// because contexts can have local overrides of the content of a source that
-  /// the source is not aware of.
-  ///
-  /// @return the contents of the source paired with the modification stamp of
-  /// the source
-  /// @throws Exception if the contents of this source could not be accessed
-  /// See [contents].
-  TimestampedData<String> get contentsFromFile {
-    return TimestampedData<String>(
-        file.lastModified(), file.readAsStringSync());
-  }
-
-  @override
-  String get encoding {
-    return _encoding ??= uri.toString();
-  }
-
-  @override
-  String get fullName {
-    return _absolutePath ??= file.getAbsolutePath();
-  }
-
-  @override
-  int get hashCode => uri.hashCode;
-
-  @override
-  bool get isInSystemLibrary => uri.scheme == DartUriResolver.DART_SCHEME;
-
-  @override
-  int get modificationStamp => file.lastModified();
-
-  @override
-  String get shortName => file.getName();
-
-  @override
-  UriKind get uriKind {
-    String scheme = uri.scheme;
-    return UriKind.fromScheme(scheme);
-  }
-
-  @override
-  bool operator ==(Object object) {
-    if (object is FileBasedSource) {
-      return id == object.id;
-    } else if (object is Source) {
-      return uri == object.uri;
-    }
-    return false;
-  }
-
-  @override
-  bool exists() => file.isFile();
-
-  @override
-  String toString() {
-    return file.getAbsolutePath();
-  }
-}
diff --git a/pkg/analyzer/lib/src/generated/super_context.dart b/pkg/analyzer/lib/src/generated/super_context.dart
index 8902ebb..7068c16 100644
--- a/pkg/analyzer/lib/src/generated/super_context.dart
+++ b/pkg/analyzer/lib/src/generated/super_context.dart
@@ -37,7 +37,7 @@
         return node.factoryKeyword == null
             ? SuperContext.valid
             : SuperContext.static;
-      } else if (node is ConstructorFieldInitializer) {
+      } else if (node is ConstructorInitializer) {
         return SuperContext.static;
       } else if (node is FieldDeclaration) {
         return node.staticKeyword == null && node.fields.lateKeyword != null
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 d722db43..e05cbc0 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
@@ -467,6 +467,7 @@
           name,
           TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
           constants,
+          [],
           TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
 
   static EnumDeclarationImpl enumDeclaration2(
@@ -1100,6 +1101,42 @@
               : TokenFactory.tokenFromType(TokenType.COLON),
           expression);
 
+  /// Create a type name whose name has been resolved to the given [element] and
+  /// whose type has been resolved to the type of the given element.
+  ///
+  /// <b>Note:</b> This method does not correctly handle class elements that
+  /// have type parameters.
+  static NamedTypeImpl namedType(ClassElement element,
+      [List<TypeAnnotation>? arguments]) {
+    var name = identifier3(element.name);
+    name.staticElement = element;
+    var typeName = namedType3(name, arguments);
+    typeName.type = element.instantiate(
+      typeArguments: List.filled(
+        element.typeParameters.length,
+        DynamicTypeImpl.instance,
+      ),
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
+    return typeName;
+  }
+
+  static NamedTypeImpl namedType3(Identifier name,
+          [List<TypeAnnotation>? arguments]) =>
+      astFactory.namedType(
+        name: name,
+        typeArguments: typeArgumentList(arguments),
+      );
+
+  static NamedTypeImpl namedType4(String name,
+          [List<TypeAnnotation>? arguments, bool question = false]) =>
+      astFactory.namedType(
+        name: identifier3(name),
+        typeArguments: typeArgumentList(arguments),
+        question:
+            question ? TokenFactory.tokenFromType(TokenType.QUESTION) : null,
+      );
+
   static NativeClauseImpl nativeClause(String nativeCode) =>
       astFactory.nativeClause(
           TokenFactory.tokenFromString("native"), string2(nativeCode));
@@ -1296,6 +1333,21 @@
   static SuperExpressionImpl superExpression() =>
       astFactory.superExpression(TokenFactory.tokenFromKeyword(Keyword.SUPER));
 
+  static SuperFormalParameterImpl superFormalParameter(
+          Keyword? keyword, TypeAnnotation? type, String identifier,
+          [FormalParameterList? parameterList]) =>
+      astFactory.superFormalParameter(
+          keyword:
+              keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
+          type: type,
+          superKeyword: TokenFactory.tokenFromKeyword(Keyword.SUPER),
+          period: TokenFactory.tokenFromType(TokenType.PERIOD),
+          identifier: identifier3(identifier),
+          parameters: parameterList);
+
+  static SuperFormalParameterImpl superFormalParameter2(String identifier) =>
+      superFormalParameter(null, null, identifier);
+
   static SwitchCaseImpl switchCase(
           Expression expression, List<Statement> statements) =>
       switchCase2(<Label>[], expression, statements);
@@ -1422,42 +1474,6 @@
         types, TokenFactory.tokenFromType(TokenType.GT));
   }
 
-  /// Create a type name whose name has been resolved to the given [element] and
-  /// whose type has been resolved to the type of the given element.
-  ///
-  /// <b>Note:</b> This method does not correctly handle class elements that
-  /// have type parameters.
-  static NamedTypeImpl typeName(ClassElement element,
-      [List<TypeAnnotation>? arguments]) {
-    var name = identifier3(element.name);
-    name.staticElement = element;
-    var typeName = typeName3(name, arguments);
-    typeName.type = element.instantiate(
-      typeArguments: List.filled(
-        element.typeParameters.length,
-        DynamicTypeImpl.instance,
-      ),
-      nullabilitySuffix: NullabilitySuffix.star,
-    );
-    return typeName;
-  }
-
-  static NamedTypeImpl typeName3(Identifier name,
-          [List<TypeAnnotation>? arguments]) =>
-      astFactory.namedType(
-        name: name,
-        typeArguments: typeArgumentList(arguments),
-      );
-
-  static NamedTypeImpl typeName4(String name,
-          [List<TypeAnnotation>? arguments, bool question = false]) =>
-      astFactory.namedType(
-        name: identifier3(name),
-        typeArguments: typeArgumentList(arguments),
-        question:
-            question ? TokenFactory.tokenFromType(TokenType.QUESTION) : null,
-      );
-
   static TypeParameterImpl 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 a33890a..cd89eef 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -17,12 +17,14 @@
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:collection/collection.dart';
+import 'package:meta/meta.dart';
 import 'package:path/path.dart';
 
 /// The class `ElementFactory` defines utility methods used to create elements
 /// for testing purposes. The elements that are created are complete in the
 /// sense that as much of the element model as can be created, given the
 /// provided information, has been created.
+@internal
 class ElementFactory {
   /// The element representing the class 'Object'.
   static ClassElementImpl? _objectElement;
@@ -90,8 +92,7 @@
 
   static CompilationUnitElementImpl compilationUnit(String fileName,
       [Source? librarySource]) {
-    Source source =
-        NonExistingSource(fileName, toUri(fileName), UriKind.FILE_URI);
+    Source source = NonExistingSource(fileName, toUri(fileName));
     CompilationUnitElementImpl unit = CompilationUnitElementImpl();
     unit.source = source;
     librarySource ??= source;
@@ -358,7 +359,7 @@
           ConstTopLevelVariableElementImpl(name, -1);
       var typeElement = type.element as ClassElement;
       var initializer = AstTestFactory.instanceCreationExpression2(
-          Keyword.CONST, AstTestFactory.typeName(typeElement));
+          Keyword.CONST, AstTestFactory.namedType(typeElement));
       if (type is InterfaceType) {
         var element = typeElement.unnamedConstructor;
         initializer.constructorName.staticElement = element;
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 f700ddd..9005be7 100644
--- a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
+++ b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
@@ -55,6 +55,7 @@
 
   _MockSource(this.uri);
 
+  @Deprecated('Not used anymore')
   @override
   String get encoding => '$uri';
 
diff --git a/pkg/analyzer/lib/src/generated/testing/token_factory.dart b/pkg/analyzer/lib/src/generated/testing/token_factory.dart
index 71dabc7..10654de 100644
--- a/pkg/analyzer/lib/src/generated/testing/token_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/token_factory.dart
@@ -4,8 +4,10 @@
 
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
+import 'package:meta/meta.dart';
 
 /// A set of utility methods that can be used to create tokens.
+@internal
 class TokenFactory {
   static Token tokenFromKeyword(Keyword keyword) => KeywordToken(keyword, 0);
 
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index 0c8f774..8b32896 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -28,11 +28,7 @@
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart'
-    show
-        AnalysisErrorInfo,
-        AnalysisErrorInfoImpl,
-        AnalysisOptions,
-        AnalysisOptionsImpl;
+    show AnalysisErrorInfo, AnalysisErrorInfoImpl, AnalysisOptions;
 import 'package:analyzer/src/generated/resolver.dart' show ScopeResolverVisitor;
 import 'package:analyzer/src/generated/source.dart' show LineInfo;
 import 'package:analyzer/src/lint/analysis.dart';
@@ -368,11 +364,26 @@
       isNonNullableByDefault: libraryElement.isNonNullableByDefault,
     );
 
+    var evaluationEngine = ConstantEvaluationEngine(
+      declaredVariables: declaredVariables,
+      isNonNullableByDefault: isEnabled(Feature.non_nullable),
+    );
+
+    var dependencies = <ConstantEvaluationTarget>[];
+    node.accept(
+      ReferenceFinder(dependencies.add),
+    );
+
+    computeConstants(
+      typeProvider,
+      typeSystem,
+      declaredVariables,
+      dependencies,
+      libraryElement.featureSet,
+    );
+
     var visitor = ConstantVisitor(
-      ConstantEvaluationEngine(
-        declaredVariables: declaredVariables,
-        isNonNullableByDefault: isEnabled(Feature.non_nullable),
-      ),
+      evaluationEngine,
       libraryElement,
       errorReporter,
     );
@@ -476,7 +487,7 @@
       typeSystem,
       declaredVariables,
       dependenciesFinder.dependencies.toList(),
-      (analysisOptions as AnalysisOptionsImpl).experimentStatus,
+      libraryElement.featureSet,
     );
 
     var listener = _ConstantAnalysisErrorListener();
diff --git a/pkg/analyzer/lib/src/lint/pub.dart b/pkg/analyzer/lib/src/lint/pub.dart
index d68ecdf..8c11a57 100644
--- a/pkg/analyzer/lib/src/lint/pub.dart
+++ b/pkg/analyzer/lib/src/lint/pub.dart
@@ -52,28 +52,27 @@
 
 PSHost? _processHost(
     YamlScalar key, YamlNode v, ResourceProvider? resourceProvider) {
-  if (v is! YamlMap) {
-    return null;
+  if (v is YamlScalar) {
+    // dependencies:
+    //   mypkg:
+    //     hosted:  https://some-pub-server.com
+    //     version: ^1.2.3
+    _PSHost host = _PSHost(isShortForm: true);
+    host.token = _PSNode(key, resourceProvider);
+    host.url = _processScalar(key, v, resourceProvider);
+    return host;
   }
-  YamlMap hostMap = v;
-  // name: transmogrify
-  // url: http://your-package-server.com
-  _PSHost host = _PSHost();
-  host.token = _PSNode(key, resourceProvider);
-  host.name = _findEntry(hostMap, 'name', resourceProvider);
-  host.url = _findEntry(hostMap, 'url', resourceProvider);
-  return host;
-}
-
-PSNodeList? _processList(
-    YamlScalar key, YamlNode v, ResourceProvider? resourceProvider) {
-  if (v is! YamlList) {
-    return null;
+  if (v is YamlMap) {
+    YamlMap hostMap = v;
+    // name: transmogrify
+    // url: http://your-package-server.com
+    _PSHost host = _PSHost(isShortForm: false);
+    host.token = _PSNode(key, resourceProvider);
+    host.name = _findEntry(hostMap, 'name', resourceProvider);
+    host.url = _findEntry(hostMap, 'url', resourceProvider);
+    return host;
   }
-  YamlList nodeList = v;
-
-  return _PSNodeList(_PSNode(key, resourceProvider),
-      nodeList.nodes.map((n) => _PSNode(n, resourceProvider)));
+  return null;
 }
 
 PSEntry? _processScalar(
@@ -86,6 +85,30 @@
       _PSNode(key, resourceProvider), _PSNode(value, resourceProvider));
 }
 
+PSNodeList? _processScalarList(
+    YamlScalar key, YamlNode v, ResourceProvider? resourceProvider) {
+  if (v is! YamlList) {
+    return null;
+  }
+  YamlList nodeList = v;
+
+  return _PSNodeList(
+      _PSNode(key, resourceProvider),
+      nodeList.nodes
+          .whereType<YamlScalar>()
+          .map((n) => _PSNode(n, resourceProvider)));
+}
+
+/// Representation of a key/value pair a map from package name to
+/// _package description_.
+///
+/// **Example** of a path-dependency:
+/// ```yaml
+/// dependencies:
+///   <name>:
+///     version: <version>
+///     path: <path>
+/// ```
 abstract class PSDependency {
   PSGitRepo? get git;
   PSHost? get host;
@@ -94,6 +117,8 @@
   PSEntry? get version;
 }
 
+/// Representation of the map from package name to _package description_ used
+/// under `dependencies`, `dev_dependencies` and `dependency_overrides`.
 abstract class PSDependencyList with IterableMixin<PSDependency> {}
 
 class PSEntry {
@@ -112,14 +137,54 @@
 }
 
 abstract class PSHost {
+  /// True, if _short-form_ for writing hosted-dependencies was used.
+  ///
+  /// **Example** of a hosted-dependency written in short-form:
+  /// ```yaml
+  /// dependencies:
+  ///   foo:
+  ///     hosted: https://some-pub-server.com
+  ///     version: ^1.2.3
+  /// ```
+  ///
+  /// The _long-form_ for writing the dependency given above is:
+  /// ```yaml
+  /// dependencies:
+  ///   foo:
+  ///     hosted:
+  ///       url: https://some-pub-server.com
+  ///       name: foo
+  ///     version: ^1.2.3
+  /// ```
+  ///
+  /// The short-form was added in Dart 2.15.0 because:
+  ///  * The `name` property just specifies the package name, which can be
+  ///    inferred from the context. So it is unnecessary to write it.
+  ///  * The nested object and `url` key becomes unnecessary when the `name`
+  ///    property is removed.
+  bool get isShortForm;
+
   PSEntry? get name;
   PSNode? get token;
   PSEntry? get url;
 }
 
+/// Representation of a leaf-node from `pubspec.yaml`.
 abstract class PSNode {
   Source get source;
   SourceSpan get span;
+
+  /// String value of the node, or `null` if value in pubspec.yaml is `null` or
+  /// omitted.
+  ///
+  /// **Example**
+  /// ```
+  /// name: foo
+  /// version:
+  /// ```
+  /// In the example above the [PSNode] for `foo` will have [text] "foo", and
+  /// the [PSNode] for `version` will have not have [text] as `null`, as empty
+  /// value or `"null"` is the same in YAML.
   String? get text;
 }
 
@@ -142,7 +207,9 @@
   PSDependencyList? get devDependencies;
   PSEntry? get documentation;
   PSEntry? get homepage;
+  PSEntry? get issueTracker;
   PSEntry? get name;
+  PSEntry? get repository;
   PSEntry? get version;
   void accept(PubspecVisitor visitor);
 }
@@ -159,7 +226,9 @@
   T? visitPackageDevDependency(PSDependency dependency) => null;
   T? visitPackageDocumentation(PSEntry documentation) => null;
   T? visitPackageHomepage(PSEntry homepage) => null;
+  T? visitPackageIssueTracker(PSEntry issueTracker) => null;
   T? visitPackageName(PSEntry name) => null;
+  T? visitPackageRepository(PSEntry repostory) => null;
   T? visitPackageVersion(PSEntry version) => null;
 }
 
@@ -276,11 +345,19 @@
 
 class _PSHost implements PSHost {
   @override
-  PSNode? token;
+  bool isShortForm;
+
   @override
   PSEntry? name;
+
+  @override
+  PSNode? token;
+
   @override
   PSEntry? url;
+
+  _PSHost({required this.isShortForm});
+
   @override
   String toString() => '''
     $token:
@@ -296,7 +373,7 @@
 
   final ResourceProvider? resourceProvider;
 
-  _PSNode(YamlNode node, this.resourceProvider)
+  _PSNode(YamlScalar node, this.resourceProvider)
       : text = node.value?.toString(),
         span = node.span;
 
@@ -337,8 +414,12 @@
   @override
   PSEntry? homepage;
   @override
+  PSEntry? issueTracker;
+  @override
   PSEntry? name;
   @override
+  PSEntry? repository;
+  @override
   PSEntry? version;
   @override
   PSDependencyList? dependencies;
@@ -372,6 +453,12 @@
     if (homepage != null) {
       visitor.visitPackageHomepage(homepage!);
     }
+    if (issueTracker != null) {
+      visitor.visitPackageIssueTracker(issueTracker!);
+    }
+    if (repository != null) {
+      visitor.visitPackageRepository(repository!);
+    }
     if (name != null) {
       visitor.visitPackageName(name!);
     }
@@ -401,6 +488,8 @@
     sb.writelin(authors);
     sb.writelin(description);
     sb.writelin(homepage);
+    sb.writelin(repository);
+    sb.writelin(issueTracker);
     sb.writelin(dependencies);
     sb.writelin(devDependencies);
     sb.writelin(dependencyOverrides);
@@ -424,11 +513,17 @@
           author = _processScalar(key, v, resourceProvider);
           break;
         case 'authors':
-          authors = _processList(key, v, resourceProvider);
+          authors = _processScalarList(key, v, resourceProvider);
           break;
         case 'homepage':
           homepage = _processScalar(key, v, resourceProvider);
           break;
+        case 'repository':
+          repository = _processScalar(key, v, resourceProvider);
+          break;
+        case 'issue_tracker':
+          issueTracker = _processScalar(key, v, resourceProvider);
+          break;
         case 'name':
           name = _processScalar(key, v, resourceProvider);
           break;
diff --git a/pkg/analyzer/lib/src/manifest/manifest_warning_code.g.dart b/pkg/analyzer/lib/src/manifest/manifest_warning_code.g.dart
index d988a94..0e1ee4c 100644
--- a/pkg/analyzer/lib/src/manifest/manifest_warning_code.g.dart
+++ b/pkg/analyzer/lib/src/manifest/manifest_warning_code.g.dart
@@ -76,7 +76,7 @@
   static const ManifestWarningCode UNSUPPORTED_CHROME_OS_FEATURE =
       ManifestWarningCode(
     'UNSUPPORTED_CHROME_OS_FEATURE',
-    "The feature {0} is not supported on Chrome OS, consider making it optional.",
+    "The feature {0} isn't supported on Chrome OS, consider making it optional.",
     correctionMessage:
         "Try changing to `android:required=\"false\"` for this feature.",
   );
@@ -88,7 +88,7 @@
   static const ManifestWarningCode UNSUPPORTED_CHROME_OS_HARDWARE =
       ManifestWarningCode(
     'UNSUPPORTED_CHROME_OS_HARDWARE',
-    "The feature {0} is not supported on Chrome OS, consider making it optional.",
+    "The feature {0} isn't supported on Chrome OS, consider making it optional.",
     correctionMessage:
         "Try adding `android:required=\"false\"` for this feature.",
   );
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.g.dart b/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.g.dart
index 689c4ba..88d2f07 100644
--- a/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.g.dart
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.g.dart
@@ -291,7 +291,7 @@
   // #### Description
   //
   // The analyzer produces this diagnostic when a package under either
-  // `dependencies` or `dev_dependencies` is not a pub, `git`, or `path` based
+  // `dependencies` or `dev_dependencies` isn't a pub, `git`, or `path` based
   // dependency.
   //
   // See [Package dependencies](https://dart.dev/tools/pub/dependencies) for
@@ -300,7 +300,7 @@
   // #### Example
   //
   // The following code produces this diagnostic because the dependency on the
-  // package `transmogrify` is not a pub, `git`, or `path` based dependency:
+  // package `transmogrify` isn't a pub, `git`, or `path` based dependency:
   //
   // ```yaml
   // %uri="pubspec.yaml"
diff --git a/pkg/analyzer/lib/src/services/available_declarations.dart b/pkg/analyzer/lib/src/services/available_declarations.dart
index 588b150..b5a3097 100644
--- a/pkg/analyzer/lib/src/services/available_declarations.dart
+++ b/pkg/analyzer/lib/src/services/available_declarations.dart
@@ -504,6 +504,10 @@
   /// The list of changed file paths.
   final List<String> _changedPaths = [];
 
+  /// While processing [_changedPaths] we accumulate libraries here.
+  /// Then we process all of them at once, and reset to the empty set.
+  Set<_File> _invalidatedLibraries = {};
+
   /// The list of files scheduled for processing.  It may include parts and
   /// libraries, but parts are ignored when we detect them.
   final List<_ScheduledFile> _scheduledFiles = [];
@@ -529,7 +533,9 @@
       _whenKnownFilesPulled = now;
       pullKnownFiles();
     }
-    return _changedPaths.isNotEmpty || _scheduledFiles.isNotEmpty;
+    return _changedPaths.isNotEmpty ||
+        _invalidatedLibraries.isNotEmpty ||
+        _scheduledFiles.isNotEmpty;
   }
 
   /// Add the [analysisContext], so that its libraries are reported via the
@@ -595,6 +601,13 @@
       return;
     }
 
+    // There are no more changes as far as we know.
+    // So, recompute exported declarations for all invalidated libraries.
+    if (_invalidatedLibraries.isNotEmpty) {
+      _processInvalidatedLibraries(_invalidatedLibraries);
+      _invalidatedLibraries = {};
+    }
+
     if (_scheduledFiles.isNotEmpty) {
       var scheduledFile = _scheduledFiles.removeLast();
       var file = _getFileByPath(scheduledFile.context, [], scheduledFile.path)!;
@@ -794,11 +807,33 @@
         _invalidateExportedDeclarations(invalidatedLibraries, newLibrary);
       }
     }
-    _computeExportedDeclarations(invalidatedLibraries);
 
-    var changedLibraries = <Library>[];
+    // Don't compute exported declarations now, there might be more changes.
+    // Instead, accumulate invalidated libraries, and recompute all later.
+    _invalidatedLibraries.addAll(invalidatedLibraries);
+
     var removedLibraries = <int>[];
     for (var libraryFile in invalidatedLibraries) {
+      if (!libraryFile.exists) {
+        _idToLibrary.remove(libraryFile.id);
+        removedLibraries.add(libraryFile.id);
+      }
+    }
+    for (var file in notLibraries) {
+      _idToLibrary.remove(file.id);
+      removedLibraries.add(file.id);
+    }
+    if (removedLibraries.isNotEmpty) {
+      _changesController.add(
+        LibraryChange._([], removedLibraries),
+      );
+    }
+  }
+
+  void _processInvalidatedLibraries(Set<_File> invalidatedLibraries) {
+    _computeExportedDeclarations(invalidatedLibraries);
+    var changedLibraries = <Library>[];
+    for (var libraryFile in invalidatedLibraries) {
       if (libraryFile.exists) {
         var library = Library._(
           libraryFile.id,
@@ -809,17 +844,10 @@
         );
         _idToLibrary[library.id] = library;
         changedLibraries.add(library);
-      } else {
-        _idToLibrary.remove(libraryFile.id);
-        removedLibraries.add(libraryFile.id);
       }
     }
-    for (var file in notLibraries) {
-      _idToLibrary.remove(file.id);
-      removedLibraries.add(file.id);
-    }
     _changesController.add(
-      LibraryChange._(changedLibraries, removedLibraries),
+      LibraryChange._(changedLibraries, []),
     );
   }
 
diff --git a/pkg/analyzer/lib/src/source/package_map_resolver.dart b/pkg/analyzer/lib/src/source/package_map_resolver.dart
index 0feee31..9b96f99 100644
--- a/pkg/analyzer/lib/src/source/package_map_resolver.dart
+++ b/pkg/analyzer/lib/src/source/package_map_resolver.dart
@@ -37,6 +37,22 @@
   }
 
   @override
+  Uri? pathToUri(String path) {
+    pathos.Context pathContext = resourceProvider.pathContext;
+    for (String pkgName in packageMap.keys) {
+      Folder pkgFolder = packageMap[pkgName]![0];
+      String pkgFolderPath = pkgFolder.path;
+      if (path.startsWith(pkgFolderPath + pathContext.separator)) {
+        String relPath = path.substring(pkgFolderPath.length + 1);
+        List<String> relPathComponents = pathContext.split(relPath);
+        String relUriPath = pathos.posix.joinAll(relPathComponents);
+        return Uri.parse('$PACKAGE_SCHEME:$pkgName/$relUriPath');
+      }
+    }
+    return null;
+  }
+
+  @override
   Source? resolveAbsolute(Uri uri) {
     if (!isPackageUri(uri)) {
       return null;
@@ -61,23 +77,6 @@
     return null;
   }
 
-  @override
-  Uri? restoreAbsolute(Source source) {
-    String sourcePath = source.fullName;
-    pathos.Context pathContext = resourceProvider.pathContext;
-    for (String pkgName in packageMap.keys) {
-      Folder pkgFolder = packageMap[pkgName]![0];
-      String pkgFolderPath = pkgFolder.path;
-      if (sourcePath.startsWith(pkgFolderPath + pathContext.separator)) {
-        String relPath = sourcePath.substring(pkgFolderPath.length + 1);
-        List<String> relPathComponents = pathContext.split(relPath);
-        String relUriPath = pathos.posix.joinAll(relPathComponents);
-        return Uri.parse('$PACKAGE_SCHEME:$pkgName/$relUriPath');
-      }
-    }
-    return null;
-  }
-
   /// Returns `true` if [uri] is a `package` URI.
   static bool isPackageUri(Uri uri) {
     return uri.scheme == PACKAGE_SCHEME;
diff --git a/pkg/analyzer/lib/src/source/source_resource.dart b/pkg/analyzer/lib/src/source/source_resource.dart
index e9d258a..9334b31 100644
--- a/pkg/analyzer/lib/src/source/source_resource.dart
+++ b/pkg/analyzer/lib/src/source/source_resource.dart
@@ -65,9 +65,10 @@
   /// See [contents].
   TimestampedData<String> get contentsFromFile {
     return TimestampedData<String>(
-        modificationStamp, fileReadMode(file.readAsStringSync()));
+        file.modificationStamp, fileReadMode(file.readAsStringSync()));
   }
 
+  @Deprecated('Not used anymore')
   @override
   String get encoding => _encoding ??= uri.toString();
 
@@ -77,9 +78,11 @@
   @override
   int get hashCode => uri.hashCode;
 
+  @Deprecated('Use uri.isScheme("dart") instead')
   @override
   bool get isInSystemLibrary => uri.scheme == DartUriResolver.DART_SCHEME;
 
+  @Deprecated('Not used anymore')
   @override
   int get modificationStamp {
     try {
@@ -92,6 +95,7 @@
   @override
   String get shortName => file.shortName;
 
+  @Deprecated('Use Source.uri instead')
   @override
   UriKind get uriKind => UriKind.fromScheme(uri.scheme);
 
diff --git a/pkg/analyzer/lib/src/string_source.dart b/pkg/analyzer/lib/src/string_source.dart
index de87280..a8e55db 100644
--- a/pkg/analyzer/lib/src/string_source.dart
+++ b/pkg/analyzer/lib/src/string_source.dart
@@ -29,18 +29,21 @@
   TimestampedData<String> get contents =>
       TimestampedData(modificationStamp, _contents);
 
+  @Deprecated('Not used anymore')
   @override
   String get encoding => uri.toString();
 
   @override
   int get hashCode => _contents.hashCode ^ fullName.hashCode;
 
+  @Deprecated('Use uri.isScheme("dart") instead')
   @override
   bool get isInSystemLibrary => false;
 
   @override
   String get shortName => fullName;
 
+  @Deprecated('Use Source.uri instead')
   @override
   UriKind get uriKind => UriKind.FILE_URI;
 
diff --git a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
index 03cce04..99372ae 100644
--- a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
@@ -72,9 +72,11 @@
   @override
   TimestampedData<String> get contents => TimestampedData<String>(0, '');
 
+  @Deprecated('Not used anymore')
   @override
   int get modificationStamp => 0;
 
+  @Deprecated('Use Source.uri instead')
   @override
   UriKind get uriKind => UriKind.PACKAGE_URI;
 
@@ -95,6 +97,9 @@
   InSummaryUriResolver(this.resourceProvider, this._dataStore);
 
   @override
+  Uri? pathToUri(String path) => null;
+
+  @override
   Source? resolveAbsolute(Uri uri) {
     String uriString = uri.toString();
     String? summaryPath = _dataStore.uriToSummaryPath[uriString];
diff --git a/pkg/analyzer/lib/src/summary/summary_sdk.dart b/pkg/analyzer/lib/src/summary/summary_sdk.dart
index 1ad7efe..e53670d 100644
--- a/pkg/analyzer/lib/src/summary/summary_sdk.dart
+++ b/pkg/analyzer/lib/src/summary/summary_sdk.dart
@@ -90,4 +90,10 @@
     Uri uri = Uri.parse(uriStr);
     return _uriResolver.resolveAbsolute(uri);
   }
+
+  @override
+  Uri? pathToUri(String path) {
+    // Libraries from summaries don't have corresponding Dart files.
+    return null;
+  }
 }
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 056696d..e331093 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -1406,6 +1406,8 @@
   List<DartType>? readOptionalTypeList() {
     if (_reader.readBool()) {
       return _readTypeList();
+    } else {
+      return null;
     }
   }
 
@@ -1695,6 +1697,8 @@
   ExpressionImpl? _readOptionalExpression() {
     if (_reader.readBool()) {
       return _readRequiredNode() as ExpressionImpl;
+    } else {
+      return null;
     }
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/data_reader.dart b/pkg/analyzer/lib/src/summary2/data_reader.dart
index ff6e1b8..e72e947 100644
--- a/pkg/analyzer/lib/src/summary2/data_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/data_reader.dart
@@ -57,18 +57,24 @@
   String? readOptionalStringReference() {
     if (readBool()) {
       return readStringReference();
+    } else {
+      return null;
     }
   }
 
   String? readOptionalStringUtf8() {
     if (readBool()) {
       return readStringUtf8();
+    } else {
+      return null;
     }
   }
 
   int? readOptionalUInt30() {
     if (readBool()) {
       return readUInt30();
+    } else {
+      return null;
     }
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 5d1e535..8d6599b 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/src/summary2/link.dart';
 import 'package:analyzer/src/summary2/reference.dart';
 import 'package:analyzer/src/util/comment.dart';
+import 'package:analyzer/src/util/uri.dart';
 import 'package:collection/collection.dart';
 
 class ElementBuilder extends ThrowingAstVisitor<void> {
@@ -997,16 +998,26 @@
     if (relativeUriStr == null) {
       return null;
     }
-    var relativeUri = Uri.parse(relativeUriStr);
-    return resolveRelativeUri(_libraryBuilder.uri, relativeUri);
+
+    Uri relativeUri;
+    try {
+      relativeUri = Uri.parse(relativeUriStr);
+    } on FormatException {
+      return null;
+    }
+
+    var absoluteUri = resolveRelativeUri(_libraryBuilder.uri, relativeUri);
+
+    var sourceFactory = _linker.analysisContext.sourceFactory;
+    return rewriteFileToPackageUri(sourceFactory, absoluteUri);
   }
 
   LibraryElement? _selectLibrary(NamespaceDirective node) {
-    try {
-      var uri = _selectAbsoluteUri(node);
-      return _linker.elementFactory.libraryOfUri('$uri');
-    } on FormatException {
+    var uri = _selectAbsoluteUri(node);
+    if (uri == null) {
       return null;
+    } else {
+      return _linker.elementFactory.libraryOfUri('$uri');
     }
   }
 
@@ -1261,7 +1272,9 @@
 
   Reference? addParameter(String? name, ParameterElementImpl element) {
     parameters.add(element);
-    if (name != null) {
+    if (name == null) {
+      return null;
+    } else {
       return _bindReference('@parameter', name, element);
     }
   }
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index 3833cc9..b91377d 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -180,11 +180,18 @@
   LibraryElementImpl libraryOfUri2(String uriStr) {
     var element = libraryOfUri(uriStr);
     if (element == null) {
+      libraryOfUri(uriStr);
       throw StateError('No library: $uriStr');
     }
     return element;
   }
 
+  /// Return the [LibraryElementImpl] if it is ready.
+  LibraryElementImpl? libraryOfUriIfReady(String uriStr) {
+    var element = rootReference.getChild(uriStr).element;
+    return element is LibraryElementImpl ? element : null;
+  }
+
   /// We have linked the bundle, and need to disconnect its libraries, so
   /// that the client can re-add the bundle, this time read from bytes.
   void removeBundle(Set<String> uriStrSet) {
diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart
index 6a393dc..73b4a73 100644
--- a/pkg/analyzer/lib/src/task/options.dart
+++ b/pkg/analyzer/lib/src/task/options.dart
@@ -139,6 +139,7 @@
   static const String implicitDynamic = 'implicit-dynamic';
 
   // Language options (see AnalysisOptionsImpl for documentation).
+  static const String strictCasts = 'strict-casts';
   static const String strictInference = 'strict-inference';
   static const String strictRawTypes = 'strict-raw-types';
 
@@ -177,7 +178,11 @@
   ];
 
   /// Supported `analyzer` language options.
-  static const List<String> languageOptions = [strictInference, strictRawTypes];
+  static const List<String> languageOptions = [
+    strictCasts,
+    strictInference,
+    strictRawTypes,
+  ];
 
   /// Supported 'analyzer' optional checks options.
   static const List<String> optionalChecksOptions = [
@@ -750,6 +755,9 @@
       AnalysisOptionsImpl options, Object? feature, Object value) {
     var boolValue = toBool(value);
     if (boolValue != null) {
+      if (feature == AnalyzerOptions.strictCasts) {
+        options.strictCasts = boolValue;
+      }
       if (feature == AnalyzerOptions.strictInference) {
         options.strictInference = boolValue;
       }
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index 3d179d7..ef1119a 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -82,21 +82,14 @@
   }
 
   void checkAssignment(Expression expr, DartType to) {
-    checkForCast(expr, from: expr.typeOrThrow, to: to);
+    _checkImplicitCast(expr, from: expr.typeOrThrow, to: to);
   }
 
-  /// 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 checkCollectionElement(
       CollectionElement? element, DartType expectedType) {
     if (element is ForElement) {
       checkCollectionElement(element.body, expectedType);
     } else if (element is IfElement) {
-      checkBoolean(element.condition);
       checkCollectionElement(element.thenElement, expectedType);
       checkCollectionElement(element.elseElement, expectedType);
     } else if (element is Expression) {
@@ -120,24 +113,11 @@
     }
   }
 
-  void checkForCast(
-    Expression expr, {
-    required DartType from,
-    required DartType to,
-  }) {
-    if (expr is ParenthesizedExpression) {
-      checkForCast(expr.expression, from: from, to: to);
-    } else {
-      _checkImplicitCast(expr, from: from, to: to);
-    }
-  }
-
   void checkMapElement(CollectionElement? element, DartType expectedKeyType,
       DartType expectedValueType) {
     if (element is ForElement) {
       checkMapElement(element.body, expectedKeyType, expectedValueType);
     } else if (element is IfElement) {
-      checkBoolean(element.condition);
       checkMapElement(element.thenElement, expectedKeyType, expectedValueType);
       checkMapElement(element.elseElement, expectedKeyType, expectedValueType);
     } else if (element is MapLiteralEntry) {
@@ -178,17 +158,12 @@
 
   @override
   void visitAssignmentExpression(AssignmentExpression node) {
-    var left = node.leftHandSide;
-    var right = node.rightHandSide;
     Token operator = node.operator;
     TokenType operatorType = operator.type;
     if (operatorType == TokenType.EQ ||
         operatorType == TokenType.QUESTION_QUESTION_EQ) {
-      checkForCast(right, from: right.typeOrThrow, to: node.writeType!);
-    } else if (operatorType == TokenType.AMPERSAND_AMPERSAND_EQ ||
-        operatorType == TokenType.BAR_BAR_EQ) {
-      checkBoolean(left);
-      checkBoolean(right);
+      var right = node.rightHandSide;
+      _checkImplicitCast(right, from: right.typeOrThrow, to: node.writeType!);
     } else {
       _checkCompoundAssignment(node);
     }
@@ -196,28 +171,6 @@
   }
 
   @override
-  void visitBinaryExpression(BinaryExpression node) {
-    var op = node.operator;
-    if (!op.isUserDefinableOperator) {
-      switch (op.type) {
-        case TokenType.AMPERSAND_AMPERSAND:
-        case TokenType.BAR_BAR:
-          checkBoolean(node.leftOperand);
-          checkBoolean(node.rightOperand);
-          break;
-        case TokenType.BANG_EQ:
-        case TokenType.BANG_EQ_EQ:
-        case TokenType.EQ_EQ_EQ:
-        case TokenType.QUESTION_QUESTION:
-          break;
-        default:
-          assert(false);
-      }
-    }
-    node.visitChildren(this);
-  }
-
-  @override
   void visitComment(Comment node) {
     // skip, no need to do typechecking inside comments (they may contain
     // comment references which would require resolution).
@@ -231,31 +184,9 @@
 
   @override
   void visitConditionalExpression(ConditionalExpression node) {
-    checkBoolean(node.condition);
     node.visitChildren(this);
   }
 
-  /// Check constructor declaration to ensure correct super call placement.
-  @override
-  void visitConstructorDeclaration(ConstructorDeclaration node) {
-    node.visitChildren(this);
-
-    final init = node.initializers;
-    for (int i = 0, last = init.length - 1; i < last; i++) {
-      final initializer = init[i];
-      if (initializer is SuperConstructorInvocation) {
-        // TODO(srawlins): Don't report this when
-        //  [CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR] or
-        //  [CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS] is reported for
-        //  this constructor.
-        var source = (node.root as CompilationUnit).declaredElement!.source;
-        var token = initializer.superKeyword;
-        reporter.onError(AnalysisError(source, token.offset, token.length,
-            CompileTimeErrorCode.INVALID_SUPER_INVOCATION, [initializer]));
-      }
-    }
-  }
-
   @override
   void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     var field = node.fieldName;
@@ -281,12 +212,6 @@
   }
 
   @override
-  void visitDoStatement(DoStatement node) {
-    checkBoolean(node.condition);
-    node.visitChildren(this);
-  }
-
-  @override
   void visitExpressionFunctionBody(ExpressionFunctionBody node) {
     _checkReturnOrYield(node.expression, node);
     node.visitChildren(this);
@@ -305,36 +230,12 @@
   }
 
   @override
-  void visitForPartsWithDeclarations(ForPartsWithDeclarations node) {
-    var condition = node.condition;
-    if (condition != null) {
-      checkBoolean(condition);
-    }
-    node.visitChildren(this);
-  }
-
-  @override
-  void visitForPartsWithExpression(ForPartsWithExpression node) {
-    var condition = node.condition;
-    if (condition != null) {
-      checkBoolean(condition);
-    }
-    node.visitChildren(this);
-  }
-
-  @override
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     _checkFunctionApplication(node);
     node.visitChildren(this);
   }
 
   @override
-  void visitIfStatement(IfStatement node) {
-    checkBoolean(node.condition);
-    node.visitChildren(this);
-  }
-
-  @override
   void visitIndexExpression(IndexExpression node) {
     var element = node.writeOrReadElement;
     if (element is MethodElement) {
@@ -403,11 +304,7 @@
 
   @override
   void visitPrefixExpression(PrefixExpression node) {
-    if (node.operator.type == TokenType.BANG) {
-      checkBoolean(node.operand);
-    } else {
-      _checkUnary(node, node.operand, node.operator, node.staticElement);
-    }
+    _checkUnary(node, node.operand, node.operator, node.staticElement);
     node.visitChildren(this);
   }
 
@@ -523,7 +420,7 @@
       for (VariableDeclaration variable in node.variables) {
         var initializer = variable.initializer;
         if (initializer != null) {
-          checkForCast(initializer,
+          _checkImplicitCast(initializer,
               from: initializer.typeOrThrow, to: type.typeOrThrow);
         }
       }
@@ -533,12 +430,6 @@
   }
 
   @override
-  void visitWhileStatement(WhileStatement node) {
-    checkBoolean(node.condition);
-    node.visitChildren(this);
-  }
-
-  @override
   void visitYieldStatement(YieldStatement node) {
     _checkReturnOrYield(node.expression, node, yieldStar: node.star != null);
     node.visitChildren(this);
@@ -591,11 +482,10 @@
     }
   }
 
-  /// 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) {
+  /// Returns true if an implicit downcast is required to assign an expression
+  /// of type [fromType] to type [to], false if it is not, or null if the
+  /// types are unrelated.
+  bool? _checkFunctionTypeCasts(FunctionType to, DartType fromType) {
     bool callTearoff = false;
     FunctionType? from;
     if (fromType is FunctionType) {
@@ -640,6 +530,7 @@
       return;
     }
 
+    expr = expr.unParenthesized;
     if (_needsImplicitCast(expr, to: to, from: from) == true) {
       _recordImplicitCast(expr, to,
           from: from,
@@ -796,7 +687,7 @@
     if (from.isVoid) return null;
 
     if (to is FunctionType) {
-      var needsCast = _checkFunctionTypeCasts(expr, to, from);
+      var needsCast = _checkFunctionTypeCasts(to, from);
       if (needsCast != null) return needsCast;
     }
 
diff --git a/pkg/analyzer/lib/src/test_utilities/find_node.dart b/pkg/analyzer/lib/src/test_utilities/find_node.dart
index 21b51e7..3c22e00 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_node.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_node.dart
@@ -344,6 +344,10 @@
     return _node(search, (n) => n is SuperConstructorInvocation);
   }
 
+  SuperFormalParameter superFormalParameter(String search) {
+    return _node(search, (n) => n is SuperFormalParameter);
+  }
+
   SwitchStatement switchStatement(String search) {
     return _node(search, (n) => n is SwitchStatement);
   }
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
index a7ecd5a..7693ddd 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
@@ -47,7 +47,7 @@
 
   Future<T> whenComplete(action());
 
-  static Future<List<T>> wait<T>(Iterable<Future<T>> futures, 
+  static Future<List<T>> wait<T>(Iterable<Future<T>> futures,
     {void cleanUp(T successValue)?}) => throw 0;
 }
 
@@ -705,6 +705,10 @@
   const Double();
 }
 
+class IntPtr extends NativeType {
+  const IntPtr();
+}
+
 class Pointer<T extends NativeType> extends NativeType {
   external factory Pointer.fromAddress(int ptr);
 
@@ -789,6 +793,50 @@
   final bool isLeaf;
   const FfiNative(this.nativeName, {this.isLeaf: false});
 }
+
+class Abi {
+  static const androidArm = _androidArm;
+  static const androidArm64 = _androidArm64;
+  static const androidIA32 = _androidIA32;
+
+  static const _androidArm = Abi._(_Architecture.arm, _OS.android);
+  static const _androidArm64 = Abi._(_Architecture.arm64, _OS.android);
+  static const _androidIA32 = Abi._(_Architecture.ia32, _OS.android);
+
+  final _OS _os;
+
+  final _Architecture _architecture;
+
+  const Abi._(this._architecture, this._os);
+}
+
+enum _Architecture {
+  arm,
+  arm64,
+  ia32,
+  x64,
+}
+
+enum _OS {
+  android,
+  fuchsia,
+  ios,
+  linux,
+  macos,
+  windows,
+}
+
+
+class AbiSpecificInteger extends NativeType {
+  const AbiSpecificInteger();
+}
+
+class AbiSpecificIntegerMapping {
+  final Map<Abi, NativeType> mapping;
+
+  const AbiSpecificIntegerMapping(this.mapping);
+}
+
 ''',
   )
 ]);
diff --git a/pkg/analyzer/lib/src/util/performance/operation_performance.dart b/pkg/analyzer/lib/src/util/performance/operation_performance.dart
index 3a090d2..3d5ac61b 100644
--- a/pkg/analyzer/lib/src/util/performance/operation_performance.dart
+++ b/pkg/analyzer/lib/src/util/performance/operation_performance.dart
@@ -155,12 +155,9 @@
   ) async {
     var child = _existingOrNewChild(name);
     child._timer.start();
-
-    try {
-      return await operation(child);
-    } finally {
-      child._timer.stop();
-    }
+    var result = await operation(child);
+    child._timer.stop();
+    return result;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/util/uri.dart b/pkg/analyzer/lib/src/util/uri.dart
index 963dafc..08e3008 100644
--- a/pkg/analyzer/lib/src/util/uri.dart
+++ b/pkg/analyzer/lib/src/util/uri.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/src/generated/source.dart';
+import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:path/path.dart';
 
 String fileUriToNormalizedPath(Context context, Uri fileUri) {
@@ -10,3 +12,32 @@
   path = context.normalize(path);
   return path;
 }
+
+/// If the [absoluteUri] is a `file` URI that has corresponding `package` URI,
+/// return it. If the URI is not valid, e.g. has empty path segments, so
+/// does not represent a valid file path, return `null`.
+Uri? rewriteFileToPackageUri(SourceFactory sourceFactory, Uri absoluteUri) {
+  // Only file URIs get rewritten into package URIs.
+  if (!absoluteUri.isScheme('file')) {
+    return absoluteUri;
+  }
+
+  // It must be a valid URI, e.g. `file:///home/` is not.
+  var pathSegments = absoluteUri.pathSegments;
+  if (pathSegments.isEmpty || pathSegments.last.isEmpty) {
+    return null;
+  }
+
+  // We ask for Source only because `restoreUri` needs it.
+  // TODO(scheglov) Add more direct way to convert a path to URI.
+  var source = sourceFactory.forUri2(absoluteUri);
+  if (source == null) {
+    return null;
+  }
+
+  if (source is InSummarySource) {
+    return source.uri;
+  }
+
+  return sourceFactory.pathToUri(source.fullName);
+}
diff --git a/pkg/analyzer/lib/src/workspace/bazel.dart b/pkg/analyzer/lib/src/workspace/bazel.dart
index aa3aec8..e8f24d5 100644
--- a/pkg/analyzer/lib/src/workspace/bazel.dart
+++ b/pkg/analyzer/lib/src/workspace/bazel.dart
@@ -53,9 +53,21 @@
         _context = workspace.provider.pathContext;
 
   @override
-  void clearCache() {
-    _sourceCache.clear();
-    _workspace.clearCache();
+  Uri? pathToUri(String path) {
+    // Search in each root.
+    for (var root in [
+      ..._workspace.binPaths,
+      _workspace.genfiles,
+      _workspace.readonly,
+      _workspace.root
+    ]) {
+      var uriParts = _restoreUriParts(root, path);
+      if (uriParts != null) {
+        return Uri.parse('package:${uriParts[0]}/${uriParts[1]}');
+      }
+    }
+
+    return null;
   }
 
   @override
@@ -70,26 +82,6 @@
     return source;
   }
 
-  @override
-  Uri? restoreAbsolute(Source source) {
-    String filePath = source.fullName;
-
-    // Search in each root.
-    for (var root in [
-      ..._workspace.binPaths,
-      _workspace.genfiles,
-      _workspace.readonly,
-      _workspace.root
-    ]) {
-      var uriParts = _restoreUriParts(root, filePath);
-      if (uriParts != null) {
-        return Uri.parse('package:${uriParts[0]}/${uriParts[1]}');
-      }
-    }
-
-    return null;
-  }
-
   Source? _resolveAbsolute(Uri uri) {
     if (uri.scheme == 'file') {
       var path = fileUriToNormalizedPath(_context, uri);
@@ -148,7 +140,7 @@
         String pathInLib = components.skip(4).join('/');
         return [packageName, pathInLib];
       } else {
-        for (int i = 2; i < components.length - 1; i++) {
+        for (int i = components.length - 2; i >= 2; i--) {
           String component = components[i];
           if (component == 'lib') {
             String packageName = components.getRange(0, i).join('.');
@@ -238,10 +230,6 @@
   @override
   UriResolver get packageUriResolver => BazelPackageUriResolver(this);
 
-  void clearCache() {
-    _directoryToPackage.clear();
-  }
-
   @override
   SourceFactory createSourceFactory(
     DartSdk? sdk,
@@ -370,6 +358,8 @@
         return packageRootedAt(folder);
       }
     }
+
+    return null;
   }
 
   /// In some distributed build environments, BUILD files are not preserved.
@@ -509,10 +499,9 @@
             context.join(root, '$symlinkPrefix-genfiles'),
             lookForBuildFileSubstitutes: lookForBuildFileSubstitutes);
       }
-
-      // // Go up the folder.
-      // folder = parent;
     }
+
+    return null;
   }
 
   /// Find the "bin" folder path, by searching for it.
@@ -599,6 +588,8 @@
     for (var match in pattern.allMatches(content)) {
       return Version.parse('${match.group(1)}.0');
     }
+
+    return null;
   }
 }
 
diff --git a/pkg/analyzer/lib/src/workspace/bazel_watcher.dart b/pkg/analyzer/lib/src/workspace/bazel_watcher.dart
index b3f09ec..54b96a0 100644
--- a/pkg/analyzer/lib/src/workspace/bazel_watcher.dart
+++ b/pkg/analyzer/lib/src/workspace/bazel_watcher.dart
@@ -123,6 +123,8 @@
         // folder, so we use a dummy value here. But this shouldn't really
         // matter, since the `symlinkTarget` should detect any modifications.
         return _ModifiedInfo(0, 0, symlinkTarget);
+      } else {
+        return null;
       }
     } on FileSystemException catch (_) {
       // File doesn't exist, so return null.
diff --git a/pkg/analyzer/lib/src/workspace/gn.dart b/pkg/analyzer/lib/src/workspace/gn.dart
index e22ce32..8ebed62 100644
--- a/pkg/analyzer/lib/src/workspace/gn.dart
+++ b/pkg/analyzer/lib/src/workspace/gn.dart
@@ -88,6 +88,7 @@
         return GnWorkspacePackage(folder.path, this);
       }
     }
+    return null;
   }
 
   /// Find the GN workspace that contains the given [filePath].
@@ -123,6 +124,7 @@
         return GnWorkspace._(provider, root, packageMap);
       }
     }
+    return null;
   }
 
   /// For a source at `$root/foo/bar`, the packages files are generated in
diff --git a/pkg/analyzer/lib/src/workspace/package_build.dart b/pkg/analyzer/lib/src/workspace/package_build.dart
index ba6e15c..4e06f04 100644
--- a/pkg/analyzer/lib/src/workspace/package_build.dart
+++ b/pkg/analyzer/lib/src/workspace/package_build.dart
@@ -60,6 +60,18 @@
   Map<String, List<Folder>> get packageMap => _workspace.packageMap;
 
   @override
+  Uri? pathToUri(String path) {
+    if (_context.isWithin(_workspace.root, path)) {
+      var uriParts = _restoreUriParts(path);
+      if (uriParts != null) {
+        return Uri.parse('package:${uriParts[0]}/${uriParts[1]}');
+      }
+    }
+
+    return _normalUriResolver.pathToUri(path);
+  }
+
+  @override
   Source? resolveAbsolute(Uri uri) {
     if (uri.scheme != 'package') {
       return null;
@@ -90,20 +102,6 @@
     return basicResolverSource;
   }
 
-  @override
-  Uri? restoreAbsolute(Source source) {
-    String filePath = source.fullName;
-
-    if (_context.isWithin(_workspace.root, filePath)) {
-      var uriParts = _restoreUriParts(filePath);
-      if (uriParts != null) {
-        return Uri.parse('package:${uriParts[0]}/${uriParts[1]}');
-      }
-    }
-
-    return _normalUriResolver.restoreAbsolute(source);
-  }
-
   List<String>? _restoreUriParts(String filePath) {
     String relative = _context.relative(filePath, from: _workspace.root);
     List<String> components = _context.split(relative);
@@ -330,13 +328,16 @@
         return null;
       }
     }
+    return null;
   }
 
   /// Return the content of the [file], `null` if cannot be read.
   static String? _fileContentOrNull(File file) {
     try {
       return file.readAsStringSync();
-    } catch (_) {}
+    } catch (_) {
+      return null;
+    }
   }
 }
 
diff --git a/pkg/analyzer/lib/src/workspace/pub.dart b/pkg/analyzer/lib/src/workspace/pub.dart
index e5059d7..1d83253 100644
--- a/pkg/analyzer/lib/src/workspace/pub.dart
+++ b/pkg/analyzer/lib/src/workspace/pub.dart
@@ -74,13 +74,16 @@
         return PubWorkspace._(provider, packageMap, root, pubspec);
       }
     }
+    return null;
   }
 
   /// Return the content of the [file], `null` if cannot be read.
   static String? _fileContentOrNull(File file) {
     try {
       return file.readAsStringSync();
-    } catch (_) {}
+    } catch (_) {
+      return null;
+    }
   }
 }
 
diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml
index 3aa6e61..7ad997e 100644
--- a/pkg/analyzer/messages.yaml
+++ b/pkg/analyzer/messages.yaml
@@ -6524,46 +6524,6 @@
 
       class C {}
       ```
-  INVALID_SUPER_INVOCATION:
-    problemMessage: "The superclass call must be last in an initializer list: '{0}'."
-    hasPublishedDocs: true
-    comment: No parameters.
-    documentation: |-
-      #### Description
-
-      The analyzer produces this diagnostic when the initializer list of a
-      constructor contains an invocation of a constructor in the superclass, but
-      the invocation isn't the last item in the initializer list.
-
-      #### Example
-
-      The following code produces this diagnostic because the invocation of the
-      superclass' constructor isn't the last item in the initializer list:
-
-      ```dart
-      class A {
-        A(int x);
-      }
-
-      class B extends A {
-        B(int x) : [!super!](x), assert(x >= 0);
-      }
-      ```
-
-      #### Common fixes
-
-      Move the invocation of the superclass' constructor to the end of the
-      initializer list:
-
-      ```dart
-      class A {
-        A(int x);
-      }
-
-      class B extends A {
-        B(int x) : assert(x >= 0), super(x);
-      }
-      ```
   INVALID_TYPE_ARGUMENT_IN_CONST_LIST:
     sharedName: INVALID_TYPE_ARGUMENT_IN_CONST_LITERAL
     problemMessage: "Constant list literals can't include a type parameter as a type argument, such as '{0}'."
@@ -11329,6 +11289,49 @@
       7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It
       is a compile-time error if a generative constructor of class Object
       includes a superinitializer.
+  SUPER_INVOCATION_NOT_LAST:
+    previousName: INVALID_SUPER_INVOCATION
+    problemMessage: "The superconstructor call must be last in an initializer list: '{0}'."
+    hasPublishedDocs: true
+    comment: |-
+      Parameters:
+      0: the superinitializer
+    documentation: |-
+      #### Description
+
+      The analyzer produces this diagnostic when the initializer list of a
+      constructor contains an invocation of a constructor in the superclass, but
+      the invocation isn't the last item in the initializer list.
+
+      #### Example
+
+      The following code produces this diagnostic because the invocation of the
+      superclass' constructor isn't the last item in the initializer list:
+
+      ```dart
+      class A {
+        A(int x);
+      }
+
+      class B extends A {
+        B(int x) : [!super!](x), assert(x >= 0);
+      }
+      ```
+
+      #### Common fixes
+
+      Move the invocation of the superclass' constructor to the end of the
+      initializer list:
+
+      ```dart
+      class A {
+        A(int x);
+      }
+
+      class B extends A {
+        B(int x) : assert(x >= 0), super(x);
+      }
+      ```
   SUPER_IN_EXTENSION:
     problemMessage: "The 'super' keyword can't be used in an extension because an extension doesn't have a superclass."
     hasPublishedDocs: true
@@ -12936,6 +12939,7 @@
       1: the name of the enclosing type where the getter is being looked for
   UNDEFINED_SUPER_METHOD:
     sharedName: UNDEFINED_SUPER_MEMBER
+    previousName: UNDEFINED_SUPER_METHOD
     problemMessage: "The method '{0}' isn't defined in a superclass of '{1}'."
     correctionMessage: "Try correcting the name to the name of an existing method, or defining a method named '{0}' in a superclass."
     hasPublishedDocs: true
@@ -13715,8 +13719,16 @@
       function that is not a generator function.
 
       No parameters.
+  YIELD_EACH_OF_INVALID_TYPE:
+    sharedName: YIELD_OF_INVALID_TYPE
+    problemMessage: "The type '{0}' implied by the 'yield*' expression must be assignable to '{1}'."
+    hasPublishedDocs: true
+    comment: |-
+      Parameters:
+      0: the type of the expression after `yield*`
+      1: the return type of the function containing the `yield*`
   YIELD_OF_INVALID_TYPE:
-    problemMessage: "The type '{0}' implied by the 'yield' expression must be assignable to '{1}'."
+    problemMessage: "A yielded value of type '{0}' must be assignable to '{1}'."
     hasPublishedDocs: true
     comment: |-
       Parameters:
@@ -13725,10 +13737,11 @@
     documentation: |-
       #### Description
 
-      The analyzer produces this diagnostic when the type of object produced by a
-      `yield` expression doesn't match the type of objects that are to be
-      returned from the `Iterable` or `Stream` types that are returned from a
-      generator (a function or method marked with either `sync*` or `async*`).
+      The analyzer produces this diagnostic when the type of object produced by
+      a `yield` or `yield*` expression doesn't match the type of objects that
+      are to be returned from the `Iterable` or `Stream` types that are returned
+      from a generator (a function or method marked with either `sync*` or
+      `async*`).
 
       #### Example
 
@@ -13762,6 +13775,18 @@
       }
       ```
 FfiCode:
+  ABI_SPECIFIC_INTEGER_MAPPING_EXTRA:
+    problemMessage: "Classes extending 'AbiSpecificInteger' must have exactly one 'AbiSpecificIntegerMapping' annotation specifying the mapping from ABI to a 'NativeType' integer with a fixed size."
+    correctionMessage: Try removing the extra annotation.
+    comment: No parameters.
+  ABI_SPECIFIC_INTEGER_MAPPING_MISSING:
+    problemMessage: "Classes extending 'AbiSpecificInteger' must have exactly one 'AbiSpecificIntegerMapping' annotation specifying the mapping from ABI to a 'NativeType' integer with a fixed size."
+    correctionMessage: Try adding an annotation.
+    comment: No parameters.
+  ABI_SPECIFIC_INTEGER_MAPPING_UNSUPPORTED:
+    problemMessage: "Only mappings to 'Int8', 'Int16', 'Int32', 'Int64', 'Uint8', 'Uint16', 'UInt32', and 'Uint64' are supported."
+    correctionMessage: Try changing the value to 'Int8', 'Int16', 'Int32', 'Int64', 'Uint8', 'Uint16', 'UInt32', or 'Uint64'.
+    comment: No parameters.
   ANNOTATION_ON_POINTER_FIELD:
     problemMessage: "Fields in a struct class whose type is 'Pointer' should not have any annotations."
     correctionMessage: Try removing the annotation.
@@ -13903,8 +13928,8 @@
     correctionMessage: Try changing the input to a positive number.
     comment: No parameters.
   NON_SIZED_TYPE_ARGUMENT:
-    problemMessage: "Type arguments to '{0}' can't have the type '{1}'. They can only be declared as native integer, 'Float', 'Double', 'Pointer', or subtype of 'Struct' or 'Union'."
-    correctionMessage: "Try using a native integer, 'Float', 'Double', 'Pointer', or subtype of 'Struct' or 'Union'."
+    problemMessage: "Type arguments to '{0}' can't have the type '{1}'. They can only be declared as native integer, 'Float', 'Double', 'Pointer', or subtype of 'Struct', 'Union', or 'AbiSpecificInteger'."
+    correctionMessage: "Try using a native integer, 'Float', 'Double', 'Pointer', or subtype of 'Struct', 'Union', or 'AbiSpecificInteger'."
     comment: |-
       Parameters:
       0: the type of the field
@@ -16620,7 +16645,7 @@
       var x = min(0, 1);
       ```
   UNDEFINED_REFERENCED_PARAMETER:
-    problemMessage: "The parameter '{0}' is not defined by '{1}'."
+    problemMessage: "The parameter '{0}' isn't defined by '{1}'."
     hasPublishedDocs: true
     comment: |-
       Parameters:
@@ -17444,11 +17469,11 @@
     correctionMessage: Consider declaring the corresponding activity element with `screenOrientation="unspecified"` or `"fullSensor"` attribute.
     comment: A code indicating that the activity is locked to an orientation.
   UNSUPPORTED_CHROME_OS_FEATURE:
-    problemMessage: "The feature {0} is not supported on Chrome OS, consider making it optional."
+    problemMessage: "The feature {0} isn't supported on Chrome OS, consider making it optional."
     correctionMessage: "Try changing to `android:required=\"false\"` for this feature."
     comment: A code indicating that a specified feature is not supported on Chrome OS.
   UNSUPPORTED_CHROME_OS_HARDWARE:
-    problemMessage: "The feature {0} is not supported on Chrome OS, consider making it optional."
+    problemMessage: "The feature {0} isn't supported on Chrome OS, consider making it optional."
     correctionMessage: "Try adding `android:required=\"false\"` for this feature."
     comment: |-
       A code indicating that a specified hardware feature is not supported on
@@ -18015,7 +18040,7 @@
       #### Description
 
       The analyzer produces this diagnostic when a package under either
-      `dependencies` or `dev_dependencies` is not a pub, `git`, or `path` based
+      `dependencies` or `dev_dependencies` isn't a pub, `git`, or `path` based
       dependency.
 
       See [Package dependencies](https://dart.dev/tools/pub/dependencies) for
@@ -18024,7 +18049,7 @@
       #### Example
 
       The following code produces this diagnostic because the dependency on the
-      package `transmogrify` is not a pub, `git`, or `path` based dependency:
+      package `transmogrify` isn't a pub, `git`, or `path` based dependency:
 
       ```yaml
       %uri="pubspec.yaml"
@@ -18384,7 +18409,7 @@
       `isEven` if `s` is `null`. In other words, if `s` is `null`, then neither
       `length` nor `isEven` will be invoked, and if `s` is non-`null`, then
       `length` can't return a `null` value. Either way, `isEven` can't be invoked
-      on a `null` value, so the null-aware operator is not necessary. See
+      on a `null` value, so the null-aware operator isn't necessary. See
       [Understanding null safety](/null-safety/understanding-null-safety#smarter-null-aware-methods)
       for more details.
 
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 76dc2d2..14a27f7 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 2.8.0-dev
+version: 2.8.0
 description: This package provides a library that performs static analysis of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/main/pkg/analyzer
 
@@ -7,7 +7,7 @@
   sdk: '>=2.14.0 <3.0.0'
 
 dependencies:
-  _fe_analyzer_shared: ^30.0.0
+  _fe_analyzer_shared: ^31.0.0
   cli_util: ^0.3.0
   collection: ^1.15.0
   convert: ^3.0.0
diff --git a/pkg/analyzer/test/dart/ast/ast_test.dart b/pkg/analyzer/test/dart/ast/ast_test.dart
index 4718ea0..12d892c 100644
--- a/pkg/analyzer/test/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/dart/ast/ast_test.dart
@@ -122,8 +122,8 @@
                 "A",
                 null,
                 null,
-                AstTestFactory.typeName4('B'),
-                AstTestFactory.withClause([AstTestFactory.typeName4('M')]),
+                AstTestFactory.namedType4('B'),
+                AstTestFactory.withClause([AstTestFactory.namedType4('M')]),
                 null)
             .isAbstract,
         isFalse);
@@ -132,8 +132,8 @@
                 "B",
                 null,
                 Keyword.ABSTRACT,
-                AstTestFactory.typeName4('A'),
-                AstTestFactory.withClause([AstTestFactory.typeName4('M')]),
+                AstTestFactory.namedType4('A'),
+                AstTestFactory.withClause([AstTestFactory.namedType4('M')]),
                 null)
             .isAbstract,
         isTrue);
@@ -1142,7 +1142,7 @@
 
   void test_isQualified_inConstructorName() {
     ConstructorName constructor = AstTestFactory.constructorName(
-        AstTestFactory.typeName4('MyClass'), "test");
+        AstTestFactory.namedType4('MyClass'), "test");
     SimpleIdentifier name = constructor.name!;
     expect(name.isQualified, isTrue);
   }
@@ -1688,6 +1688,21 @@
 }
 
 @reflectiveTest
+class SuperFormalParameterTest {
+  void test_endToken_noParameters() {
+    SuperFormalParameter parameter =
+        AstTestFactory.superFormalParameter2('field');
+    expect(parameter.endToken, parameter.identifier.endToken);
+  }
+
+  void test_endToken_parameters() {
+    SuperFormalParameter parameter = AstTestFactory.superFormalParameter(
+        null, null, 'field', AstTestFactory.formalParameterList([]));
+    expect(parameter.endToken, parameter.parameters!.endToken);
+  }
+}
+
+@reflectiveTest
 class VariableDeclarationTest extends ParserTestCase {
   void test_getDocumentationComment_onGrandParent() {
     VariableDeclaration varDecl = AstTestFactory.variableDeclaration("a");
diff --git a/pkg/analyzer/test/file_system/file_system_test_support.dart b/pkg/analyzer/test/file_system/file_system_test_support.dart
index 722474a..0550aa1 100644
--- a/pkg/analyzer/test/file_system/file_system_test_support.dart
+++ b/pkg/analyzer/test/file_system/file_system_test_support.dart
@@ -103,7 +103,6 @@
     Source source = file.createSource();
     expect(source, isNotNull);
     expect(source.fullName, defaultFilePath);
-    expect(source.uriKind, UriKind.FILE_URI);
     expect(source.uri, Uri.file(defaultFilePath));
     expect(source.exists(), isTrue);
     expect(source.contents.data, defaultFileContent);
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 9eecb33..873dc18 100644
--- a/pkg/analyzer/test/file_system/memory_file_system_test.dart
+++ b/pkg/analyzer/test/file_system/memory_file_system_test.dart
@@ -216,6 +216,7 @@
     expect(source.fullName, sourcePath);
   }
 
+  @Deprecated('Not used anymore')
   test_modificationStamp() {
     expect(source.modificationStamp, -1);
   }
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 c6192fb..61f06df 100644
--- a/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
+++ b/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
@@ -29,6 +29,12 @@
     expect(resolver, isNotNull);
   }
 
+  void test_pathToUri() {
+    var path = convertPath('/test.dart');
+    var uri = toUri(path);
+    expect(resolver.pathToUri(path), uri);
+  }
+
   void test_resolveAbsolute_file() {
     var uri = toUri('/test.dart');
 
@@ -59,14 +65,15 @@
     expect(source, isNull);
   }
 
+  @Deprecated('Use pathToUri() instead')
   void test_restoreAbsolute() {
     var uri = toUri('/test.dart');
 
     var source = resolver.resolveAbsolute(uri)!;
     expect(resolver.restoreAbsolute(source), uri);
     expect(
-        resolver.restoreAbsolute(NonExistingSource(
-            source.fullName, Uri.parse('dart:math'), UriKind.DART_URI)),
+        resolver.restoreAbsolute(
+            NonExistingSource(source.fullName, Uri.parse('dart:math'))),
         uri);
   }
 }
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
index 2fd5fff..532fa53 100644
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -5,10 +5,8 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart' hide SdkLibrariesReader;
-import 'package:analyzer/src/generated/java_engine_io.dart';
-import 'package:analyzer/src/generated/java_io.dart';
 import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
@@ -18,7 +16,6 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(DartUriResolverTest);
     defineReflectiveTests(ErrorSeverityTest);
-    defineReflectiveTests(FileBasedSourceTest);
     defineReflectiveTests(ResolveRelativeUriTest);
     defineReflectiveTests(UriKindTest);
   });
@@ -44,6 +41,18 @@
     expect(DartUriResolver.isDartUri(uri), isFalse);
   }
 
+  void test_pathToUri_library() {
+    var path = convertPath('/sdk/lib/core/core.dart');
+    var dartUri = resolver.pathToUri(path);
+    expect(dartUri.toString(), 'dart:core');
+  }
+
+  void test_pathToUri_part() {
+    var path = convertPath('/sdk/lib/core/int.dart');
+    var dartUri = resolver.pathToUri(path);
+    expect(dartUri.toString(), 'dart:core/int.dart');
+  }
+
   void test_resolve_dart_library() {
     var source = resolver.resolveAbsolute(Uri.parse('dart:core'));
     expect(source, isNotNull);
@@ -64,16 +73,18 @@
     expect(result, isNull);
   }
 
+  @Deprecated('Use pathToUri() instead')
   void test_restoreAbsolute_library() {
     _SourceMock source = _SourceMock();
-    source.uri = toUri('/sdk/lib/core/core.dart');
+    source.fullName = convertPath('/sdk/lib/core/core.dart');
     var dartUri = resolver.restoreAbsolute(source);
     expect(dartUri.toString(), 'dart:core');
   }
 
+  @Deprecated('Use pathToUri() instead')
   void test_restoreAbsolute_part() {
     _SourceMock source = _SourceMock();
-    source.uri = toUri('/sdk/lib/core/int.dart');
+    source.fullName = convertPath('/sdk/lib/core/int.dart');
     var dartUri = resolver.restoreAbsolute(source);
     expect(dartUri.toString(), 'dart:core/int.dart');
   }
@@ -128,134 +139,6 @@
 }
 
 @reflectiveTest
-class FileBasedSourceTest {
-  test_equals_false_differentFiles() async {
-    JavaFile file1 = FileUtilities2.createFile("/does/not/exist1.dart");
-    JavaFile file2 = FileUtilities2.createFile("/does/not/exist2.dart");
-    FileBasedSource source1 = FileBasedSource(file1);
-    FileBasedSource source2 = FileBasedSource(file2);
-    expect(source1 == source2, isFalse);
-  }
-
-  test_equals_false_null() async {
-    JavaFile file = FileUtilities2.createFile("/does/not/exist1.dart");
-    FileBasedSource source1 = FileBasedSource(file);
-    expect(source1, isNotNull);
-  }
-
-  test_equals_true() async {
-    JavaFile file1 = FileUtilities2.createFile("/does/not/exist.dart");
-    JavaFile file2 = FileUtilities2.createFile("/does/not/exist.dart");
-    FileBasedSource source1 = FileBasedSource(file1);
-    FileBasedSource source2 = FileBasedSource(file2);
-    expect(source1 == source2, isTrue);
-  }
-
-  test_getFullName() async {
-    String fullPath = "/does/not/exist.dart";
-    JavaFile file = FileUtilities2.createFile(fullPath);
-    FileBasedSource source = FileBasedSource(file);
-    expect(source.fullName, file.getAbsolutePath());
-  }
-
-  test_getShortName() async {
-    JavaFile file = FileUtilities2.createFile("/does/not/exist.dart");
-    FileBasedSource source = FileBasedSource(file);
-    expect(source.shortName, "exist.dart");
-  }
-
-  test_hashCode() async {
-    JavaFile file1 = FileUtilities2.createFile("/does/not/exist.dart");
-    JavaFile file2 = FileUtilities2.createFile("/does/not/exist.dart");
-    FileBasedSource source1 = FileBasedSource(file1);
-    FileBasedSource source2 = FileBasedSource(file2);
-    expect(source2.hashCode, source1.hashCode);
-  }
-
-  test_isInSystemLibrary_contagious() async {
-    DartSdk sdk = (_SimpleDartSdkTest()..setUp()).sdk;
-    UriResolver resolver = DartUriResolver(sdk);
-    SourceFactory factory = SourceFactory([resolver]);
-    // resolve dart:core
-    var result = resolver.resolveAbsolute(Uri.parse("dart:core"));
-    expect(result, isNotNull);
-    expect(result!.isInSystemLibrary, isTrue);
-    // system libraries reference only other system libraries
-    var partSource = factory.resolveUri(result, "num.dart");
-    expect(partSource, isNotNull);
-    expect(partSource!.isInSystemLibrary, isTrue);
-  }
-
-  test_isInSystemLibrary_false() async {
-    JavaFile file = FileUtilities2.createFile("/does/not/exist.dart");
-    FileBasedSource source = FileBasedSource(file);
-    expect(source, isNotNull);
-    expect(source.fullName, file.getAbsolutePath());
-    expect(source.isInSystemLibrary, isFalse);
-  }
-
-  test_issue14500() async {
-    // see https://code.google.com/p/dart/issues/detail?id=14500
-    FileBasedSource source = FileBasedSource(
-        FileUtilities2.createFile("/some/packages/foo:bar.dart"));
-    expect(source, isNotNull);
-    expect(source.exists(), isFalse);
-  }
-
-  test_resolveRelative_file_fileName() async {
-    if (OSUtilities.isWindows()) {
-      // On Windows, the URI that is produced includes a drive letter,
-      // which I believe is not consistent across all machines that might run
-      // this test.
-      return;
-    }
-    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
-    FileBasedSource source = FileBasedSource(file);
-    expect(source, isNotNull);
-    Uri relative = resolveRelativeUri(source.uri, Uri.parse("lib.dart"));
-    expect(relative, isNotNull);
-    expect(relative.toString(), "file:///a/b/lib.dart");
-  }
-
-  test_resolveRelative_file_filePath() async {
-    if (OSUtilities.isWindows()) {
-      // On Windows, the URI that is produced includes a drive letter,
-      // which I believe is not consistent across all machines that might run
-      // this test.
-      return;
-    }
-    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
-    FileBasedSource source = FileBasedSource(file);
-    expect(source, isNotNull);
-    Uri relative = resolveRelativeUri(source.uri, Uri.parse("c/lib.dart"));
-    expect(relative, isNotNull);
-    expect(relative.toString(), "file:///a/b/c/lib.dart");
-  }
-
-  test_resolveRelative_file_filePathWithParent() async {
-    if (OSUtilities.isWindows()) {
-      // On Windows, the URI that is produced includes a drive letter, which I
-      // believe is not consistent across all machines that might run this test.
-      return;
-    }
-    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
-    FileBasedSource source = FileBasedSource(file);
-    expect(source, isNotNull);
-    Uri relative = resolveRelativeUri(source.uri, Uri.parse("../c/lib.dart"));
-    expect(relative, isNotNull);
-    expect(relative.toString(), "file:///a/c/lib.dart");
-  }
-
-  test_system() async {
-    JavaFile file = FileUtilities2.createFile("/does/not/exist.dart");
-    FileBasedSource source = FileBasedSource(file, Uri.parse("dart:core"));
-    expect(source, isNotNull);
-    expect(source.fullName, file.getAbsolutePath());
-    expect(source.isInSystemLibrary, isTrue);
-  }
-}
-
-@reflectiveTest
 class ResolveRelativeUriTest {
   test_resolveRelative_dart_dartUri() async {
     _assertResolve('dart:foo', 'dart:bar', 'dart:bar');
@@ -310,6 +193,7 @@
 
 @reflectiveTest
 class UriKindTest {
+  @deprecated
   test_fromEncoding() async {
     expect(UriKind.fromEncoding(0x64), same(UriKind.DART_URI));
     expect(UriKind.fromEncoding(0x66), same(UriKind.FILE_URI));
@@ -317,6 +201,7 @@
     expect(UriKind.fromEncoding(0x58), isNull);
   }
 
+  @deprecated
   test_getEncoding() async {
     expect(UriKind.DART_URI.encoding, 0x64);
     expect(UriKind.FILE_URI.encoding, 0x66);
@@ -351,6 +236,9 @@
 
 class _SourceMock implements Source {
   @override
+  late final String fullName;
+
+  @override
   late final Uri uri;
 
   @override
diff --git a/pkg/analyzer/test/generated/element_resolver_test.dart b/pkg/analyzer/test/generated/element_resolver_test.dart
index a82b0a3..a018a3e 100644
--- a/pkg/analyzer/test/generated/element_resolver_test.dart
+++ b/pkg/analyzer/test/generated/element_resolver_test.dart
@@ -444,7 +444,7 @@
         ElementFactory.constructorElement2(classA, constructorName);
     classA.constructors = <ConstructorElement>[constructor];
     ConstructorName name = AstTestFactory.constructorName(
-        AstTestFactory.typeName(classA), constructorName);
+        AstTestFactory.namedType(classA), constructorName);
     _resolveNode(name);
     expect(name.staticElement, same(constructor));
     _listener.assertNoErrors();
@@ -458,7 +458,7 @@
         ElementFactory.constructorElement2(classA, constructorName);
     classA.constructors = <ConstructorElement>[constructor];
     ConstructorName name = AstTestFactory.constructorName(
-        AstTestFactory.typeName(classA), constructorName);
+        AstTestFactory.namedType(classA), constructorName);
     _resolveNode(name);
     expect(name.staticElement, same(constructor));
     _listener.assertNoErrors();
@@ -573,7 +573,7 @@
         ElementFactory.constructorElement2(classA, constructorName);
     classA.constructors = <ConstructorElement>[constructor];
     var name = AstTestFactory.constructorName(
-        AstTestFactory.typeName(classA), constructorName);
+        AstTestFactory.namedType(classA), constructorName);
     name.staticElement = constructor;
     InstanceCreationExpression creation =
         AstTestFactory.instanceCreationExpression(Keyword.NEW, name);
@@ -588,7 +588,7 @@
         ElementFactory.constructorElement2(classA, constructorName);
     classA.constructors = <ConstructorElement>[constructor];
     var name = AstTestFactory.constructorName(
-        AstTestFactory.typeName(classA), constructorName);
+        AstTestFactory.namedType(classA), constructorName);
     name.staticElement = constructor;
     InstanceCreationExpression creation =
         AstTestFactory.instanceCreationExpression(Keyword.NEW, name);
@@ -607,7 +607,7 @@
     constructor.parameters = <ParameterElement>[parameter];
     classA.constructors = <ConstructorElement>[constructor];
     var name = AstTestFactory.constructorName(
-        AstTestFactory.typeName(classA), constructorName);
+        AstTestFactory.namedType(classA), constructorName);
     name.staticElement = constructor;
     InstanceCreationExpression creation =
         AstTestFactory.instanceCreationExpression(Keyword.NEW, name, [
diff --git a/pkg/analyzer/test/generated/java_io_test.dart b/pkg/analyzer/test/generated/java_io_test.dart
index 561b53a..35bfdeb 100644
--- a/pkg/analyzer/test/generated/java_io_test.dart
+++ b/pkg/analyzer/test/generated/java_io_test.dart
@@ -16,6 +16,7 @@
         expect(path.context.isAbsolute(absolutePath), isTrue,
             reason: '"$absolutePath" is not absolute');
         // test that toURI() returns an absolute URI
+        // ignore: deprecated_member_use_from_same_package
         Uri uri = JavaFile(absolutePath).toURI();
         expect(uri.isAbsolute, isTrue);
         expect(uri.scheme, 'file');
@@ -30,6 +31,7 @@
         // it may be not on Windows, if "temp" is on other disk.
         String relPath = path.context.relative(absolutePath);
         // test that toURI() returns an absolute URI
+        // ignore: deprecated_member_use_from_same_package
         Uri uri = JavaFile(relPath).toURI();
         expect(uri.isAbsolute, isTrue);
         expect(uri.scheme, 'file');
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index 6cdd3b6..f40c8da 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -732,9 +732,56 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
     end('Enum');
-    super.endEnum(enumKeyword, leftBrace, count);
+    super.endEnum(enumKeyword, leftBrace, memberCount);
+  }
+
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    end('Method');
+    super.endEnumConstructor(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
+  }
+
+  @override
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    end('FactoryMethod');
+    super.endEnumFactoryMethod(beginToken, factoryKeyword, endToken);
+  }
+
+  @override
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    expectIn('Member');
+    super.endEnumFields(
+        abstractToken,
+        externalToken,
+        staticToken,
+        covariantToken,
+        lateToken,
+        varFinalOrConst,
+        count,
+        beginToken,
+        endToken);
+  }
+
+  @override
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    end('Method');
+    super.endEnumMethod(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
   }
 
   @override
@@ -838,15 +885,16 @@
   @override
   void endFormalParameter(
       Token? thisKeyword,
-      Token? periodAfterThis,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
       Token? initializerStart,
       Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
     end('FormalParameter');
-    super.endFormalParameter(thisKeyword, periodAfterThis, nameToken,
-        initializerStart, initializerEnd, kind, memberKind);
+    super.endFormalParameter(thisKeyword, superKeyword, periodAfterThisOrSuper,
+        nameToken, initializerStart, initializerEnd, kind, memberKind);
   }
 
   @override
@@ -1283,25 +1331,54 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    expectInOneOf(['ClassDeclaration', 'MixinDeclaration']);
-    listener?.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
-  }
-
-  @override
   void handleDottedName(int count, Token firstIdentifier) {
     expectIn('ConditionalUri');
     super.handleDottedName(count, firstIdentifier);
   }
 
   @override
+  void handleEnumElement(Token beginToken) {
+    expectIn('Enum');
+    super.handleEnumElement(beginToken);
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    expectIn('Enum');
+    super.handleEnumElements(elementsEndToken, elementsCount);
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    expectIn('Enum');
+    super.handleEnumHeader(enumKeyword, leftBrace);
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    expectIn('Enum');
+    super.handleEnumNoWithClause();
+  }
+
+  @override
+  void handleEnumWithClause(Token withKeyword) {
+    expectIn('Enum');
+    super.handleEnumWithClause(withKeyword);
+  }
+
+  @override
   void handleIdentifierList(int count) {
     expectInOneOf(['Hide', 'Show']);
     super.handleIdentifierList(count);
   }
 
   @override
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    expectInOneOf(['ClassDeclaration', 'MixinDeclaration', 'Enum']);
+    listener?.handleImplements(implementsKeyword, interfacesCount);
+  }
+
+  @override
   void handleImportPrefix(Token? deferredKeyword, Token? asKeyword) {
     // This event normally happens within "Import",
     // but happens within "CompilationUnit" during recovery.
@@ -1346,6 +1423,12 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    expectIn('Enum');
+    super.handleNoTypeNameInConstructorReference(token);
+  }
+
+  @override
   void handleRecoverClassHeader() {
     expectIn('ClassDeclaration');
     listener?.handleRecoverClassHeader();
diff --git a/pkg/analyzer/test/generated/source_factory_test.dart b/pkg/analyzer/test/generated/source_factory_test.dart
index 98e3f04..f13f48d 100644
--- a/pkg/analyzer/test/generated/source_factory_test.dart
+++ b/pkg/analyzer/test/generated/source_factory_test.dart
@@ -39,6 +39,16 @@
     expect(SourceFactory([]), isNotNull);
   }
 
+  void test_pathToUri() {
+    File file1 = getFile("/some/file1.dart");
+    File file2 = getFile("/some/file2.dart");
+    Uri expected1 = Uri.parse("file:///my_file.dart");
+    SourceFactory factory =
+        SourceFactory([UriResolver_restoreUri(file1.path, expected1)]);
+    expect(factory.pathToUri(file1.path), expected1);
+    expect(factory.pathToUri(file2.path), isNull);
+  }
+
   void test_resolveUri_absolute() {
     UriResolver_absolute resolver = UriResolver_absolute();
     SourceFactory factory = SourceFactory([resolver]);
@@ -95,6 +105,7 @@
     expect(result.uri.toString(), 'package:package/dir/second.dart');
   }
 
+  @Deprecated('Use pathToUri() instead')
   void test_restoreUri() {
     File file1 = getFile("/some/file1.dart");
     File file2 = getFile("/some/file2.dart");
@@ -102,7 +113,7 @@
     Source source2 = FileSource(file2);
     Uri expected1 = Uri.parse("file:///my_file.dart");
     SourceFactory factory =
-        SourceFactory([UriResolver_restoreUri(source1, expected1)]);
+        SourceFactory([UriResolver_restoreUri(file1.path, expected1)]);
     expect(factory.restoreUri(source1), same(expected1));
     expect(factory.restoreUri(source2), isNull);
   }
@@ -121,20 +132,20 @@
 }
 
 class UriResolver_restoreUri extends UriResolver {
-  Source source1;
+  String path1;
   Uri expected1;
-  UriResolver_restoreUri(this.source1, this.expected1);
+  UriResolver_restoreUri(this.path1, this.expected1);
 
   @override
-  Source? resolveAbsolute(Uri uri) => null;
-
-  @override
-  Uri? restoreAbsolute(Source source) {
-    if (identical(source, source1)) {
+  Uri? pathToUri(String path) {
+    if (path == path1) {
       return expected1;
     }
     return null;
   }
+
+  @override
+  Source? resolveAbsolute(Uri uri) => null;
 }
 
 class UriResolver_SourceFactoryTest_test_fromEncoding_valid
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index affcebc..6d3741a 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -230,7 +230,7 @@
     InterfaceType superclassType = interfaceTypeStar(superclass);
     ClassElement subclass = ElementFactory.classElement("B", superclassType);
     Expression node = AstTestFactory.asExpression(
-        AstTestFactory.thisExpression(), AstTestFactory.typeName(subclass));
+        AstTestFactory.thisExpression(), AstTestFactory.namedType(subclass));
     expect(_analyze(node, superclassType), interfaceTypeStar(subclass));
     _listener.assertNoErrors();
   }
@@ -315,7 +315,7 @@
     InstanceCreationExpression node =
         AstTestFactory.instanceCreationExpression2(
             null,
-            AstTestFactory.typeName(classElement),
+            AstTestFactory.namedType(classElement),
             [AstTestFactory.identifier3(constructorName)]);
     expect(_analyze(node), interfaceTypeStar(classElement));
     _listener.assertNoErrors();
@@ -328,8 +328,8 @@
     ConstructorElementImpl constructor =
         ElementFactory.constructorElement2(elementC, null);
     elementC.constructors = <ConstructorElement>[constructor];
-    var typeName =
-        AstTestFactory.typeName(elementC, [AstTestFactory.typeName(elementI)]);
+    var typeName = AstTestFactory.namedType(
+        elementC, [AstTestFactory.namedType(elementI)]);
     typeName.type = interfaceTypeStar(elementC,
         typeArguments: [interfaceTypeStar(elementI)]);
     InstanceCreationExpression node =
@@ -349,7 +349,7 @@
     classElement.constructors = <ConstructorElement>[constructor];
     InstanceCreationExpression node =
         AstTestFactory.instanceCreationExpression2(
-            null, AstTestFactory.typeName(classElement));
+            null, AstTestFactory.namedType(classElement));
     expect(_analyze(node), interfaceTypeStar(classElement));
     _listener.assertNoErrors();
   }
@@ -365,7 +365,7 @@
   void test_visitIsExpression_negated() {
     // a is! String
     Expression node = AstTestFactory.isExpression(
-        _resolvedString("a"), true, AstTestFactory.typeName4("String"));
+        _resolvedString("a"), true, AstTestFactory.namedType4("String"));
     expect(_analyze(node), same(_typeProvider.boolType));
     _listener.assertNoErrors();
   }
@@ -373,7 +373,7 @@
   void test_visitIsExpression_notNegated() {
     // a is String
     Expression node = AstTestFactory.isExpression(
-        _resolvedString("a"), false, AstTestFactory.typeName4("String"));
+        _resolvedString("a"), false, AstTestFactory.namedType4("String"));
     expect(_analyze(node), same(_typeProvider.boolType));
     _listener.assertNoErrors();
   }
diff --git a/pkg/analyzer/test/generated/test_analysis_context.dart b/pkg/analyzer/test/generated/test_analysis_context.dart
index 840d225..7d5eae6 100644
--- a/pkg/analyzer/test/generated/test_analysis_context.dart
+++ b/pkg/analyzer/test/generated/test_analysis_context.dart
@@ -9,7 +9,7 @@
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk_elements.dart';
 
 class TestAnalysisContext implements AnalysisContext {
@@ -43,6 +43,7 @@
     _typeSystemLegacy = TypeSystemImpl(
       implicitCasts: _analysisOptions.implicitCasts,
       isNonNullableByDefault: false,
+      strictCasts: _analysisOptions.strictCasts,
       strictInference: _analysisOptions.strictInference,
       typeProvider: _typeProviderLegacy,
     );
@@ -50,6 +51,7 @@
     _typeSystemNonNullableByDefault = TypeSystemImpl(
       implicitCasts: _analysisOptions.implicitCasts,
       isNonNullableByDefault: true,
+      strictCasts: _analysisOptions.strictCasts,
       strictInference: _analysisOptions.strictInference,
       typeProvider: _typeProviderNonNullableByDefault,
     );
@@ -105,6 +107,7 @@
 
   _MockSource(this.uri);
 
+  @Deprecated('Not used anymore')
   @override
   String get encoding => '$uri';
 
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index be7a535..927a542 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -454,6 +454,7 @@
     return TimestampedData<String>(0, _contents);
   }
 
+  @Deprecated('Not used anymore')
   @override
   String get encoding => _name;
 
@@ -465,11 +466,13 @@
   @override
   int get hashCode => 0;
 
+  @Deprecated('Use uri.isScheme("dart") instead')
   @override
   bool get isInSystemLibrary {
     return false;
   }
 
+  @Deprecated('Not used anymore')
   @override
   int get modificationStamp =>
       generateExceptionOnRead ? -1 : _modificationStamp;
@@ -482,6 +485,7 @@
   @override
   Uri get uri => Uri.file(_name);
 
+  @Deprecated('Use Source.uri instead')
   @override
   UriKind get uriKind {
     throw UnsupportedError('uriKind');
@@ -519,9 +523,11 @@
   TestSourceWithUri(String path, this.uri, [String content = ''])
       : super(path, content);
 
+  @Deprecated('Not used anymore')
   @override
   String get encoding => uri.toString();
 
+  @Deprecated('Use Source.uri instead')
   @override
   UriKind get uriKind {
     if (uri.scheme == 'dart') {
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index 95aa605..20115cd 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -2,15 +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 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/analysis/utilities.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/ast/ast_factory.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/utilities_collection.dart';
+import 'package:analyzer/src/test_utilities/find_node.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -209,24 +212,6 @@
   Expression get(CascadeExpression node) => node.target;
 }
 
-class Getter_NodeReplacerTest_test_catchClause
-    implements NodeReplacerTest_Getter<CatchClause, SimpleIdentifier> {
-  @override
-  SimpleIdentifier? get(CatchClause node) => node.stackTraceParameter;
-}
-
-class Getter_NodeReplacerTest_test_catchClause_2
-    implements NodeReplacerTest_Getter<CatchClause, SimpleIdentifier> {
-  @override
-  SimpleIdentifier? get(CatchClause node) => node.exceptionParameter;
-}
-
-class Getter_NodeReplacerTest_test_catchClause_3
-    implements NodeReplacerTest_Getter<CatchClause, TypeAnnotation> {
-  @override
-  TypeAnnotation? get(CatchClause node) => node.exceptionType;
-}
-
 class Getter_NodeReplacerTest_test_classDeclaration
     implements NodeReplacerTest_Getter<ClassDeclaration, ImplementsClause> {
   @override
@@ -1399,7 +1384,7 @@
         AstTestFactory.identifier3("c"),
         AstTestFactory.argumentList([AstTestFactory.integer(0)]),
         typeArguments:
-            AstTestFactory.typeArgumentList2([AstTestFactory.typeName4('T')]));
+            AstTestFactory.typeArgumentList2([AstTestFactory.namedType4('T')]));
     _assertReplace(node, Getter_NodeReplacerTest_test_annotation());
     _assertReplace(node, Getter_NodeReplacerTest_test_annotation_3());
     _assertReplace(node, Getter_NodeReplacerTest_test_annotation_2());
@@ -1414,8 +1399,8 @@
   void test_asExpression() {
     AsExpression node = AstTestFactory.asExpression(
         AstTestFactory.integer(0),
-        AstTestFactory.typeName3(
-            AstTestFactory.identifier3("a"), [AstTestFactory.typeName4("C")]));
+        AstTestFactory.namedType3(
+            AstTestFactory.identifier3("a"), [AstTestFactory.namedType4("C")]));
     _assertReplace(node, Getter_NodeReplacerTest_test_asExpression_2());
     _assertReplace(node, Getter_NodeReplacerTest_test_asExpression());
   }
@@ -1475,14 +1460,22 @@
   }
 
   void test_catchClause() {
-    CatchClause node = AstTestFactory.catchClause5(
-        AstTestFactory.typeName4("E"),
-        "e",
-        "s",
-        [AstTestFactory.emptyStatement()]);
-    _assertReplace(node, Getter_NodeReplacerTest_test_catchClause_3());
-    _assertReplace(node, Getter_NodeReplacerTest_test_catchClause_2());
-    _assertReplace(node, Getter_NodeReplacerTest_test_catchClause());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  try {} on E catch (e, st) {}
+  try {} on E2 catch (e2, st2) {}
+}
+''');
+    _assertReplace2<CatchClause>(
+      destination: findNode.catchClause('(e,'),
+      source: findNode.catchClause('(e2,'),
+      getters: [
+        (node) => node.exceptionType!,
+        (node) => node.exceptionParameter!,
+        (node) => node.stackTraceParameter!,
+        (node) => node.body,
+      ],
+    );
   }
 
   void test_classDeclaration() {
@@ -1490,9 +1483,9 @@
         null,
         "A",
         AstTestFactory.typeParameterList(["E"]),
-        AstTestFactory.extendsClause(AstTestFactory.typeName4("B")),
-        AstTestFactory.withClause([AstTestFactory.typeName4("C")]),
-        AstTestFactory.implementsClause([AstTestFactory.typeName4("D")]), [
+        AstTestFactory.extendsClause(AstTestFactory.namedType4("B")),
+        AstTestFactory.withClause([AstTestFactory.namedType4("C")]),
+        AstTestFactory.implementsClause([AstTestFactory.namedType4("D")]), [
       AstTestFactory.fieldDeclaration2(
           false, null, [AstTestFactory.variableDeclaration("f")])
     ]);
@@ -1515,9 +1508,9 @@
         "A",
         AstTestFactory.typeParameterList(["E"]),
         null,
-        AstTestFactory.typeName4("B"),
-        AstTestFactory.withClause([AstTestFactory.typeName4("C")]),
-        AstTestFactory.implementsClause([AstTestFactory.typeName4("D")]));
+        AstTestFactory.namedType4("B"),
+        AstTestFactory.withClause([AstTestFactory.namedType4("C")]),
+        AstTestFactory.implementsClause([AstTestFactory.namedType4("D")]));
     node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
     node.metadata
         .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
@@ -1582,7 +1575,7 @@
     node.metadata
         .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
     node.redirectedConstructor =
-        AstTestFactory.constructorName(AstTestFactory.typeName4("B"), "a");
+        AstTestFactory.constructorName(AstTestFactory.namedType4("B"), "a");
     _assertReplace(
         node, Getter_NodeReplacerTest_test_constructorDeclaration_3());
     _assertReplace(
@@ -1609,7 +1602,7 @@
 
   void test_constructorName() {
     ConstructorName node =
-        AstTestFactory.constructorName(AstTestFactory.typeName4("C"), "n");
+        AstTestFactory.constructorName(AstTestFactory.namedType4("C"), "n");
     _assertReplace(node, Getter_NodeReplacerTest_test_constructorName());
     _assertReplace(node, Getter_NodeReplacerTest_test_constructorName_2());
   }
@@ -1621,7 +1614,7 @@
 
   void test_declaredIdentifier() {
     var node =
-        AstTestFactory.declaredIdentifier4(AstTestFactory.typeName4("C"), "i");
+        AstTestFactory.declaredIdentifier4(AstTestFactory.namedType4("C"), "i");
     node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
     node.metadata
         .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
@@ -1688,7 +1681,7 @@
 
   void test_extendsClause() {
     ExtendsClause node =
-        AstTestFactory.extendsClause(AstTestFactory.typeName4("S"));
+        AstTestFactory.extendsClause(AstTestFactory.namedType4("S"));
     _assertReplace(node, Getter_NodeReplacerTest_test_extendsClause());
   }
 
@@ -1696,7 +1689,7 @@
     var node = AstTestFactory.fieldDeclaration(
         false,
         null,
-        AstTestFactory.typeName4("C"),
+        AstTestFactory.namedType4("C"),
         [AstTestFactory.variableDeclaration("c")]);
     node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
     node.metadata
@@ -1708,7 +1701,7 @@
   void test_fieldFormalParameter() {
     var node = AstTestFactory.fieldFormalParameter(
         null,
-        AstTestFactory.typeName4("C"),
+        AstTestFactory.namedType4("C"),
         "f",
         AstTestFactory.formalParameterList());
     node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
@@ -1789,7 +1782,7 @@
 
   void test_functionDeclaration() {
     var node = AstTestFactory.functionDeclaration(
-        AstTestFactory.typeName4("R"),
+        AstTestFactory.namedType4("R"),
         null,
         "f",
         AstTestFactory.functionExpression2(AstTestFactory.formalParameterList(),
@@ -1806,7 +1799,7 @@
   void test_functionDeclarationStatement() {
     FunctionDeclarationStatement node =
         AstTestFactory.functionDeclarationStatement(
-            AstTestFactory.typeName4("R"),
+            AstTestFactory.namedType4("R"),
             null,
             "f",
             AstTestFactory.functionExpression2(
@@ -1836,7 +1829,7 @@
 
   void test_functionTypeAlias() {
     var node = AstTestFactory.typeAlias(
-        AstTestFactory.typeName4("R"),
+        AstTestFactory.namedType4("R"),
         "F",
         AstTestFactory.typeParameterList(["E"]),
         AstTestFactory.formalParameterList());
@@ -1852,7 +1845,7 @@
 
   void test_functionTypedFormalParameter() {
     var node = AstTestFactory.functionTypedFormalParameter(
-        AstTestFactory.typeName4("R"),
+        AstTestFactory.namedType4("R"),
         "f",
         [AstTestFactory.simpleFormalParameter3("p")]);
     node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
@@ -1883,7 +1876,7 @@
 
   void test_implementsClause() {
     ImplementsClause node = AstTestFactory.implementsClause(
-        [AstTestFactory.typeName4("I"), AstTestFactory.typeName4("J")]);
+        [AstTestFactory.namedType4("I"), AstTestFactory.namedType4("J")]);
     _assertReplace(node, ListGetter_NodeReplacerTest_test_implementsClause(0));
   }
 
@@ -1911,7 +1904,7 @@
   void test_instanceCreationExpression() {
     InstanceCreationExpression node =
         AstTestFactory.instanceCreationExpression3(null,
-            AstTestFactory.typeName4("C"), "c", [AstTestFactory.integer(2)]);
+            AstTestFactory.namedType4("C"), "c", [AstTestFactory.integer(2)]);
     _assertReplace(
         node, Getter_NodeReplacerTest_test_instanceCreationExpression_2());
     _assertReplace(
@@ -1926,7 +1919,7 @@
 
   void test_isExpression() {
     IsExpression node = AstTestFactory.isExpression(
-        AstTestFactory.identifier3("v"), false, AstTestFactory.typeName4("T"));
+        AstTestFactory.identifier3("v"), false, AstTestFactory.namedType4("T"));
     _assertReplace(node, Getter_NodeReplacerTest_test_isExpression());
     _assertReplace(node, Getter_NodeReplacerTest_test_isExpression_2());
   }
@@ -1960,7 +1953,7 @@
   void test_listLiteral() {
     ListLiteral node = AstTestFactory.listLiteral2(
         null,
-        AstTestFactory.typeArgumentList([AstTestFactory.typeName4("E")]),
+        AstTestFactory.typeArgumentList([AstTestFactory.namedType4("E")]),
         [AstTestFactory.identifier3("e")]);
     _assertReplace(node, ListGetter_NodeReplacerTest_test_listLiteral(0));
     _testTypedLiteral(node);
@@ -1969,7 +1962,7 @@
   void test_mapLiteral() {
     SetOrMapLiteral node = AstTestFactory.setOrMapLiteral(
         null,
-        AstTestFactory.typeArgumentList([AstTestFactory.typeName4("E")]),
+        AstTestFactory.typeArgumentList([AstTestFactory.namedType4("E")]),
         [AstTestFactory.mapLiteralEntry("k", AstTestFactory.identifier3("v"))]);
     _assertReplace(node, ListGetter_NodeReplacerTest_test_mapLiteral(0));
     _testTypedLiteral(node);
@@ -1985,7 +1978,7 @@
   void test_methodDeclaration() {
     var node = AstTestFactory.methodDeclaration2(
         null,
-        AstTestFactory.typeName4("A"),
+        AstTestFactory.namedType4("A"),
         null,
         null,
         AstTestFactory.identifier3("m"),
@@ -2099,7 +2092,7 @@
 
   void test_simpleFormalParameter() {
     var node = AstTestFactory.simpleFormalParameter4(
-        AstTestFactory.typeName4("T"), "p");
+        AstTestFactory.namedType4("T"), "p");
     node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
     node.metadata = [
       AstTestFactory.annotation(AstTestFactory.identifier3("a"))
@@ -2127,6 +2120,30 @@
         node, Getter_NodeReplacerTest_test_superConstructorInvocation_2());
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/47741')
+  void test_superFormalParameter() {
+    var findNode = _parseStringToFindNode(r'''
+class A {
+  A(int foo<T>(int a));
+}
+
+class B extends A {
+  B.sub1(double super.bar1<T1>(int a1),);
+  B.sub2(double super.bar2<T2>(int a2),);
+}
+''');
+    _assertReplace2<SuperFormalParameter>(
+      destination: findNode.superFormalParameter('bar1'),
+      source: findNode.superFormalParameter('bar2'),
+      getters: [
+        (node) => node.type!,
+        (node) => node.identifier,
+        (node) => node.typeParameters!,
+        (node) => node.parameters!,
+      ],
+    );
+  }
+
   void test_switchCase() {
     SwitchCase node = AstTestFactory.switchCase2([AstTestFactory.label2("l")],
         AstTestFactory.integer(0), [AstTestFactory.block()]);
@@ -2161,7 +2178,7 @@
   void test_topLevelVariableDeclaration() {
     var node = AstTestFactory.topLevelVariableDeclaration(
         null,
-        AstTestFactory.typeName4("T"),
+        AstTestFactory.namedType4("T"),
         [AstTestFactory.variableDeclaration("t")]);
     node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
     node.metadata
@@ -2185,20 +2202,20 @@
 
   void test_typeArgumentList() {
     TypeArgumentList node =
-        AstTestFactory.typeArgumentList2([AstTestFactory.typeName4("A")]);
+        AstTestFactory.typeArgumentList2([AstTestFactory.namedType4("A")]);
     _assertReplace(node, ListGetter_NodeReplacerTest_test_typeArgumentList(0));
   }
 
   void test_typeName() {
-    NamedType node = AstTestFactory.typeName4(
-        "T", [AstTestFactory.typeName4("E"), AstTestFactory.typeName4("F")]);
+    NamedType node = AstTestFactory.namedType4(
+        "T", [AstTestFactory.namedType4("E"), AstTestFactory.namedType4("F")]);
     _assertReplace(node, Getter_NodeReplacerTest_test_typeName_2());
     _assertReplace(node, Getter_NodeReplacerTest_test_typeName());
   }
 
   void test_typeParameter() {
     TypeParameter node =
-        AstTestFactory.typeParameter2("E", AstTestFactory.typeName4("B"));
+        AstTestFactory.typeParameter2("E", AstTestFactory.namedType4("B"));
     _assertReplace(node, Getter_NodeReplacerTest_test_typeParameter_2());
     _assertReplace(node, Getter_NodeReplacerTest_test_typeParameter());
   }
@@ -2222,7 +2239,7 @@
   void test_variableDeclarationList() {
     var node = AstTestFactory.variableDeclarationList(
         null,
-        AstTestFactory.typeName4("T"),
+        AstTestFactory.namedType4("T"),
         [AstTestFactory.variableDeclaration("a")]);
     node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
     node.metadata
@@ -2238,7 +2255,7 @@
     VariableDeclarationStatement node =
         AstTestFactory.variableDeclarationStatement(
             null,
-            AstTestFactory.typeName4("T"),
+            AstTestFactory.namedType4("T"),
             [AstTestFactory.variableDeclaration("a")]);
     _assertReplace(
         node, Getter_NodeReplacerTest_test_variableDeclarationStatement());
@@ -2253,7 +2270,7 @@
 
   void test_withClause() {
     WithClause node =
-        AstTestFactory.withClause([AstTestFactory.typeName4("M")]);
+        AstTestFactory.withClause([AstTestFactory.namedType4("M")]);
     _assertReplace(node, ListGetter_NodeReplacerTest_test_withClause(0));
   }
 
@@ -2271,6 +2288,35 @@
     }
   }
 
+  void _assertReplace2<T extends AstNode>({
+    required T destination,
+    required T source,
+    required List<AstNode Function(T node)> getters,
+  }) {
+    for (var getter in getters) {
+      var child = getter(destination);
+      expect(child.parent, destination);
+
+      var replacement = getter(source);
+      NodeReplacer.replace(child, replacement);
+      expect(getter(destination), replacement);
+      expect(replacement.parent, destination);
+    }
+  }
+
+  FindNode _parseStringToFindNode(String content) {
+    var parseResult = parseString(
+      content: content,
+      featureSet: FeatureSet.fromEnableFlags2(
+        sdkLanguageVersion: ExperimentStatus.currentVersion,
+        flags: [
+          Feature.super_parameters.enableString,
+        ],
+      ),
+    );
+    return FindNode(parseResult.content, parseResult.unit);
+  }
+
   void _testAnnotatedNode(AnnotatedNode node) {
     _assertReplace(node, Getter_NodeReplacerTest_testAnnotatedNode());
     _assertReplace(node, ListGetter_NodeReplacerTest_testAnnotatedNode(0));
diff --git a/pkg/analyzer/test/source/package_map_resolver_test.dart b/pkg/analyzer/test/source/package_map_resolver_test.dart
index 19aee6d..27d7a9c 100644
--- a/pkg/analyzer/test/source/package_map_resolver_test.dart
+++ b/pkg/analyzer/test/source/package_map_resolver_test.dart
@@ -39,6 +39,33 @@
     expect(PackageMapUriResolver.isPackageUri(uri), isFalse);
   }
 
+  void test_pathToUri() {
+    String pkgFileA = provider.convertPath('/pkgA/lib/libA.dart');
+    String pkgFileB = provider.convertPath('/pkgB/lib/src/libB.dart');
+    provider.newFile(pkgFileA, 'library lib_a;');
+    provider.newFile(pkgFileB, 'library lib_b;');
+    PackageMapUriResolver resolver =
+        PackageMapUriResolver(provider, <String, List<Folder>>{
+      'pkgA': <Folder>[provider.getFolder(provider.convertPath('/pkgA/lib'))],
+      'pkgB': <Folder>[provider.getFolder(provider.convertPath('/pkgB/lib'))]
+    });
+    {
+      var path = provider.convertPath('/pkgA/lib/libA.dart');
+      var uri = resolver.pathToUri(path);
+      expect(uri, Uri.parse('package:pkgA/libA.dart'));
+    }
+    {
+      var path = provider.convertPath('/pkgB/lib/src/libB.dart');
+      var uri = resolver.pathToUri(path);
+      expect(uri, Uri.parse('package:pkgB/src/libB.dart'));
+    }
+    {
+      var path = provider.convertPath('/no/such/file');
+      var uri = resolver.pathToUri(path);
+      expect(uri, isNull);
+    }
+  }
+
   void test_resolve_multiple_folders() {
     var a = provider.newFile(provider.convertPath('/aaa/a.dart'), '');
     var b = provider.newFile(provider.convertPath('/bbb/b.dart'), '');
@@ -70,14 +97,14 @@
       Uri uri = Uri.parse('package:pkgA/libA.dart');
       var result = resolver.resolveAbsolute(uri)!;
       expect(result.exists(), isTrue);
-      expect(result.uriKind, UriKind.PACKAGE_URI);
+      expect(result.uri, uri);
       expect(result.fullName, pkgFileA);
     }
     {
       Uri uri = Uri.parse('package:pkgB/libB.dart');
       var result = resolver.resolveAbsolute(uri)!;
       expect(result.exists(), isTrue);
-      expect(result.uriKind, UriKind.PACKAGE_URI);
+      expect(result.uri, uri);
       expect(result.fullName, pkgFileB);
     }
   }
@@ -144,6 +171,7 @@
     expect(result, isNull);
   }
 
+  @Deprecated('Use pathToUri() instead')
   void test_restoreAbsolute() {
     String pkgFileA = provider.convertPath('/pkgA/lib/libA.dart');
     String pkgFileB = provider.convertPath('/pkgB/lib/src/libB.dart');
@@ -173,7 +201,8 @@
     }
   }
 
+  @Deprecated('Use pathToUri() instead')
   Source _createFileSource(String path) {
-    return NonExistingSource(path, toUri(path), UriKind.FILE_URI);
+    return NonExistingSource(path, toUri(path));
   }
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/base.dart b/pkg/analyzer/test/src/dart/analysis/base.dart
index 7f3d1cb..b6c9542 100644
--- a/pkg/analyzer/test/src/dart/analysis/base.dart
+++ b/pkg/analyzer/test/src/dart/analysis/base.dart
@@ -153,13 +153,10 @@
   void tearDown() {}
 }
 
-class _GeneratedUriResolverMock implements UriResolver {
+class _GeneratedUriResolverMock extends UriResolver {
   Source? Function(Uri)? resolveAbsoluteFunction;
 
-  Uri? Function(Source)? restoreAbsoluteFunction;
-
-  @override
-  void clearCache() {}
+  Uri? Function(String)? pathToUriFunction;
 
   @override
   noSuchMethod(Invocation invocation) {
@@ -167,17 +164,14 @@
   }
 
   @override
-  Source? resolveAbsolute(Uri uri) {
-    if (resolveAbsoluteFunction != null) {
-      return resolveAbsoluteFunction!(uri);
-    }
-    return null;
+  Uri? pathToUri(String path) {
+    return pathToUriFunction?.call(path);
   }
 
   @override
-  Uri? restoreAbsolute(Source source) {
-    if (restoreAbsoluteFunction != null) {
-      return restoreAbsoluteFunction!(source);
+  Source? resolveAbsolute(Uri uri) {
+    if (resolveAbsoluteFunction != null) {
+      return resolveAbsoluteFunction!(uri);
     }
     return null;
   }
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 65e9392..d9bdc60 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -51,7 +51,7 @@
       TypeArgumentList argumentList, List<DartType> expectedTypes) {
     expect(argumentList.arguments, hasLength(expectedTypes.length));
     for (int i = 0; i < expectedTypes.length; i++) {
-      _assertTypeNameSimple(argumentList.arguments[i], expectedTypes[i]);
+      _assertNamedTypeSimple(argumentList.arguments[i], expectedTypes[i]);
     }
   }
 
@@ -1804,11 +1804,11 @@
       expect(type.parameters[0].type, typeProvider.intType);
     }
 
-    _assertTypeNameSimple(p.returnType!, typeProvider.stringType);
+    _assertNamedTypeSimple(p.returnType!, typeProvider.stringType);
 
     {
       var a = p.parameters.parameters[0] as SimpleFormalParameter;
-      _assertTypeNameSimple(a.type!, typeProvider.intType);
+      _assertNamedTypeSimple(a.type!, typeProvider.intType);
       expect(a.identifier!.staticType, isNull);
     }
   }
@@ -1850,11 +1850,11 @@
       expect(type.parameters[0].type, typeProvider.intType);
     }
 
-    _assertTypeNameSimple(p.type!, typeProvider.stringType);
+    _assertNamedTypeSimple(p.type!, typeProvider.stringType);
 
     {
       var a = p.parameters!.parameters[0] as SimpleFormalParameter;
-      _assertTypeNameSimple(a.type!, typeProvider.intType);
+      _assertNamedTypeSimple(a.type!, typeProvider.intType);
       expect(a.identifier!.staticType, isNull);
     }
   }
@@ -1912,7 +1912,7 @@
     expect(parameterElement.field, same(fElement));
 
     var parameterNode = parameters[0] as FieldFormalParameter;
-    _assertTypeNameSimple(parameterNode.type!, typeProvider.intType);
+    _assertNamedTypeSimple(parameterNode.type!, typeProvider.intType);
     expect(parameterNode.declaredElement, same(parameterElement));
 
     expect(parameterNode.identifier.staticElement, same(parameterElement));
@@ -1980,7 +1980,7 @@
 
     List<TypeAnnotation> typeArguments = invocation.typeArguments!.arguments;
     expect(typeArguments, hasLength(1));
-    _assertTypeNameSimple(typeArguments[0], typeProvider.stringType);
+    _assertNamedTypeSimple(typeArguments[0], typeProvider.stringType);
   }
 
   test_functionExpressionInvocation_namedArgument() async {
@@ -2307,7 +2307,7 @@
 
       NamedType namedType = constructorName.type2;
       expect(namedType.typeArguments!.arguments, hasLength(1));
-      _assertTypeNameSimple(
+      _assertNamedTypeSimple(
           namedType.typeArguments!.arguments[0], typeProvider.boolType);
 
       var typeIdentifier = namedType.name as PrefixedIdentifier;
@@ -2384,7 +2384,7 @@
 
       NamedType namedType = constructorName.type2;
       expect(namedType.typeArguments!.arguments, hasLength(1));
-      _assertTypeNameSimple(
+      _assertNamedTypeSimple(
           namedType.typeArguments!.arguments[0], typeProvider.boolType);
 
       var typeIdentifier = namedType.name as SimpleIdentifier;
@@ -2432,7 +2432,7 @@
 
       NamedType namedType = constructorName.type2;
       expect(namedType.typeArguments!.arguments, hasLength(1));
-      _assertTypeNameSimple(
+      _assertNamedTypeSimple(
           namedType.typeArguments!.arguments[0], typeProvider.boolType);
 
       var typeIdentifier = namedType.name as SimpleIdentifier;
@@ -4906,10 +4906,10 @@
     LocalVariableElement vElement = vNode.declaredElement!;
     expect(vElement.type, typeProvider.numType);
 
-    var vTypeName = vNode.type as NamedType;
-    expect(vTypeName.type, typeProvider.numType);
+    var vNamedType = vNode.type as NamedType;
+    expect(vNamedType.type, typeProvider.numType);
 
-    var vTypeIdentifier = vTypeName.name as SimpleIdentifier;
+    var vTypeIdentifier = vNamedType.name as SimpleIdentifier;
     expect(vTypeIdentifier.staticElement, typeProvider.numType.element);
     expect(vTypeIdentifier.staticType, isNull);
 
@@ -7439,7 +7439,7 @@
       expect(bElement.type, typeProvider.doubleType);
 
       var namedType = bDeclaration.variables.type as NamedType;
-      _assertTypeNameSimple(namedType, typeProvider.doubleType);
+      _assertNamedTypeSimple(namedType, typeProvider.doubleType);
 
       expect(bNode.name.staticElement, same(bElement));
       expect(bNode.name.staticType, isNull);
@@ -7579,7 +7579,7 @@
     expect(aliasElement, same(findElement.typeAlias('F')));
     expect(function.returnType, typeProvider.intType);
 
-    _assertTypeNameSimple(alias.returnType as NamedType, typeProvider.intType);
+    _assertNamedTypeSimple(alias.returnType as NamedType, typeProvider.intType);
 
     _assertSimpleParameter(
         alias.parameters.parameters[0] as SimpleFormalParameter,
@@ -7645,10 +7645,10 @@
       expect(listIdentifier.staticElement, same(listElement));
       expect(listIdentifier.staticType, isNull);
 
-      var aTypeName = bound.typeArguments!.arguments[0] as NamedType;
-      expect(aTypeName.type, interfaceTypeNone(aElement));
+      var aNamedType = bound.typeArguments!.arguments[0] as NamedType;
+      expect(aNamedType.type, interfaceTypeNone(aElement));
 
-      var aIdentifier = aTypeName.name as SimpleIdentifier;
+      var aIdentifier = aNamedType.name as SimpleIdentifier;
       expect(aIdentifier.staticElement, same(aElement));
       expect(aIdentifier.staticType, isNull);
     }
@@ -7717,7 +7717,7 @@
     {
       var statement = statements[1] as TryStatement;
       CatchClause catchClause = statement.catchClauses[0];
-      _assertTypeNameSimple(
+      _assertNamedTypeSimple(
           catchClause.exceptionType as NamedType, typeProvider.intType);
 
       var exceptionNode = catchClause.exceptionParameter as SimpleIdentifier;
@@ -7760,7 +7760,7 @@
     {
       var statement = statements[3] as TryStatement;
       CatchClause catchClause = statement.catchClauses[0];
-      _assertTypeNameSimple(catchClause.exceptionType!, typeProvider.intType);
+      _assertNamedTypeSimple(catchClause.exceptionType!, typeProvider.intType);
       expect(catchClause.stackTraceParameter, isNull);
 
       var exceptionNode = catchClause.exceptionParameter as SimpleIdentifier;
@@ -7773,7 +7773,7 @@
     {
       var statement = statements[4] as TryStatement;
       CatchClause catchClause = statement.catchClauses[0];
-      _assertTypeNameSimple(
+      _assertNamedTypeSimple(
           catchClause.exceptionType as NamedType, typeProvider.intType);
       expect(catchClause.exceptionParameter, isNull);
       expect(catchClause.stackTraceParameter, isNull);
@@ -7821,7 +7821,7 @@
 
     List<TypeAnnotation> typeArguments = namedType.typeArguments!.arguments;
     expect(typeArguments, hasLength(1));
-    _assertTypeNameSimple(typeArguments[0], typeProvider.intType);
+    _assertNamedTypeSimple(typeArguments[0], typeProvider.intType);
   }
 
   test_type_void() async {
@@ -8657,6 +8657,15 @@
     }
   }
 
+  void _assertNamedTypeSimple(TypeAnnotation namedType, DartType type) {
+    namedType as NamedType;
+    expect(namedType.type, type);
+
+    var identifier = namedType.name as SimpleIdentifier;
+    expect(identifier.staticElement, same(type.element));
+    expect(identifier.staticType, isNull);
+  }
+
   void _assertParameterElement(ParameterElement element,
       {String? name, int? offset, ParameterKind? kind, DartType? type}) {
     expect(element, isNotNull);
@@ -8688,15 +8697,6 @@
     }
   }
 
-  void _assertTypeNameSimple(TypeAnnotation namedType, DartType type) {
-    namedType as NamedType;
-    expect(namedType.type, type);
-
-    var identifier = namedType.name as SimpleIdentifier;
-    expect(identifier.staticElement, same(type.element));
-    expect(identifier.staticType, isNull);
-  }
-
   List<Statement> _getMainStatements(ResolvedUnitResult result) {
     for (var declaration in result.unit.declarations) {
       if (declaration is FunctionDeclaration &&
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index de37c97..252bab2 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -1246,8 +1246,7 @@
     Source generatedSource = _SourceMock(generatedPath, uri);
 
     generatedUriResolver.resolveAbsoluteFunction = (uri) => generatedSource;
-    generatedUriResolver.restoreAbsoluteFunction = (Source source) {
-      String path = source.fullName;
+    generatedUriResolver.pathToUriFunction = (path) {
       if (path == templatePath || path == generatedPath) {
         return uri;
       } else {
@@ -1952,16 +1951,13 @@
       expect(result.errors, isEmpty);
     }
 
-    // Analysis of my_pkg/bin/b.dart produces the error "A value of type
-    // 'String' can't be assigned to a variable of type 'int'", because
-    // file:///my_pkg/bin/b.dart imports file:///my_pkg/lib/c.dart, which
-    // successfully imports file:///my_pkg/test/d.dart, causing y to have an
-    // inferred type of String.
+    // Analysis of my_pkg/bin/a.dart produces no error because
+    // the import `../lib/c.dart` is resolved to package:my_pkg/c.dart, and
+    // package:my_pkg/c.dart's import is erroneous, causing y's reference to z
+    // to be unresolved (and therefore have type dynamic).
     {
       ResolvedUnitResult result = await driver.getResultValid(b);
-      List<AnalysisError> errors = result.errors;
-      expect(errors, hasLength(1));
-      expect(errors[0].errorCode, CompileTimeErrorCode.INVALID_ASSIGNMENT);
+      expect(result.errors, isEmpty);
     }
   }
 
@@ -2028,8 +2024,10 @@
 
     {
       ResolvedUnitResult result = await driver.getResultValid(b);
-      expect(_getImportSource(result.unit, 0).uri.toString(),
-          'package:test/a.dart');
+      expect(
+        _getImportSource(result.unit, 0).uri,
+        Uri.parse('package:test/a.dart'),
+      );
       _assertTopLevelVarType(result.unit, 'VB', 'A<int>');
     }
 
@@ -2037,7 +2035,7 @@
       ResolvedUnitResult result = await driver.getResultValid(c);
       expect(
         _getImportSource(result.unit, 0).uri,
-        toUri('/test/lib/a.dart'),
+        Uri.parse('package:test/a.dart'),
       );
       _assertTopLevelVarType(result.unit, 'VC', 'A<double>');
     }
@@ -2924,6 +2922,24 @@
     expect(result.unit, isNotNull);
   }
 
+  test_removeFile_addFile_results() async {
+    var a = convertPath('/test/lib/a.dart');
+    newFile(a, content: 'class A {}');
+
+    driver.addFile(a);
+
+    await waitForIdleWithoutExceptions();
+    expect(allResults.map((e) => e.path).toSet(), {a});
+    allResults.clear();
+
+    driver.removeFile(a);
+    driver.addFile(a);
+
+    // a.dart should be produced again
+    await waitForIdleWithoutExceptions();
+    expect(allResults.map((e) => e.path).toSet(), {a});
+  }
+
   test_removeFile_changeFile_implicitlyAnalyzed() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
diff --git a/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart b/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart
index dfcbe51..0f485b1 100644
--- a/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart
@@ -446,9 +446,7 @@
 
   FeatureSet _getPathFeatureSet(String path) {
     path = convertPath(path);
-    var fileUri = toUri(path);
-    var fileSource = sourceFactory.forUri2(fileUri)!;
-    var uri = sourceFactory.restoreUri(fileSource)!;
+    var uri = sourceFactory.pathToUri(path)!;
     return provider.getFeatureSet(path, uri);
   }
 
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 b298989..f0a3e1f 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
@@ -30,13 +30,71 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../resolution/context_collection_resolution.dart';
+
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FileSystemStateTest);
+    defineReflectiveTests(FileSystemState_BazelWorkspaceTest);
   });
 }
 
 @reflectiveTest
+class FileSystemState_BazelWorkspaceTest extends BazelWorkspaceResolutionTest {
+  void test_getFileForUri_hasGenerated_askGeneratedFirst() async {
+    var relPath = 'dart/my/test/a.dart';
+    var writablePath = convertPath('$workspaceRootPath/$relPath');
+    var generatedPath = convertPath('$workspaceRootPath/bazel-bin/$relPath');
+
+    // This generated file should be used instead of the writable.
+    newFile(generatedPath);
+
+    var analysisDriver = driverFor(convertPath(testFilePath));
+
+    var fsState = analysisDriver.fsState;
+
+    // The file is the generated file.
+    var generatedUri = toUri(generatedPath);
+    var generatedFile = fsState.getFileForUri(generatedUri).t1!;
+    expect(generatedFile.uri, generatedUri);
+    expect(generatedFile.path, generatedPath);
+
+    // The file is cached under the requested URI.
+    var writableUri = toUri(writablePath);
+    var writableFile1 = fsState.getFileForUri(writableUri).t1!;
+    var writableFile2 = fsState.getFileForUri(writableUri).t1!;
+    expect(writableFile1, same(generatedFile));
+    expect(writableFile2, same(generatedFile));
+  }
+
+  void test_getFileForUri_hasGenerated_askWritableFirst() async {
+    var relPath = 'dart/my/test/a.dart';
+    var writablePath = convertPath('$workspaceRootPath/$relPath');
+    var generatedPath = convertPath('$workspaceRootPath/bazel-bin/$relPath');
+
+    // This generated file should be used instead of the writable.
+    newFile(generatedPath);
+
+    var analysisDriver = driverFor(convertPath(testFilePath));
+
+    var fsState = analysisDriver.fsState;
+
+    // The file is cached under the requested URI.
+    var writableUri = toUri(writablePath);
+    var writableFile1 = fsState.getFileForUri(writableUri).t1!;
+    var writableFile2 = fsState.getFileForUri(writableUri).t1!;
+    expect(writableFile2, same(writableFile1));
+
+    // The file is the generated file.
+    var generatedUri = toUri(generatedPath);
+    var generatedFile = fsState.getFileForUri(generatedUri).t1!;
+    expect(generatedFile.uri, generatedUri);
+    expect(generatedFile.path, generatedPath);
+    expect(writableFile2, same(generatedFile));
+  }
+}
+
+@reflectiveTest
 class FileSystemStateTest with ResourceProviderMixin {
   final ByteStore byteStore = MemoryByteStore();
   final FileContentOverlay contentOverlay = FileContentOverlay();
@@ -268,8 +326,6 @@
     expect(file.libraryFiles, [file, file.partedFiles[0]]);
 
     expect(_excludeSdk(file.directReferencedFiles), hasLength(5));
-
-    expect(fileSystemState.getFilesForPath(a1), [file]);
   }
 
   test_getFileForPath_onlyDartFiles() {
@@ -363,27 +419,6 @@
     );
   }
 
-  test_getFileForUri_packageVsFileUri() {
-    String path = convertPath('/aaa/lib/a.dart');
-    var packageUri = Uri.parse('package:aaa/a.dart');
-    var fileUri = toUri(path);
-
-    // The files with `package:` and `file:` URIs are different.
-    var filePackageUri = fileSystemState.getFileForUri(packageUri).asFileState;
-    var fileFileUri = fileSystemState.getFileForUri(fileUri).asFileState;
-    expect(filePackageUri, isNot(same(fileFileUri)));
-
-    expect(filePackageUri.path, path);
-    expect(filePackageUri.uri, packageUri);
-
-    expect(fileFileUri.path, path);
-    expect(fileFileUri.uri, fileUri);
-
-    // The file with the `package:` style URI is canonical, and is the first.
-    var files = fileSystemState.getFilesForPath(path);
-    expect(files, [filePackageUri, fileFileUri]);
-  }
-
   test_getFilesSubtypingName() {
     String a = convertPath('/a.dart');
     String b = convertPath('/b.dart');
@@ -742,10 +777,10 @@
   }
 }
 
-class _GeneratedUriResolverMock implements UriResolver {
+class _GeneratedUriResolverMock extends UriResolver {
   Source? Function(Uri)? resolveAbsoluteFunction;
 
-  Uri? Function(Source)? restoreAbsoluteFunction;
+  Uri? Function(String)? pathToUriFunction;
 
   @override
   noSuchMethod(Invocation invocation) {
@@ -753,17 +788,14 @@
   }
 
   @override
-  Source? resolveAbsolute(Uri uri) {
-    if (resolveAbsoluteFunction != null) {
-      return resolveAbsoluteFunction!(uri);
-    }
-    return null;
+  Uri? pathToUri(String path) {
+    return pathToUriFunction?.call(path);
   }
 
   @override
-  Uri? restoreAbsolute(Source source) {
-    if (restoreAbsoluteFunction != null) {
-      return restoreAbsoluteFunction!(source);
+  Source? resolveAbsolute(Uri uri) {
+    if (resolveAbsoluteFunction != null) {
+      return resolveAbsoluteFunction!(uri);
     }
     return null;
   }
@@ -784,11 +816,13 @@
   }
 }
 
-extension on Either2<FileState?, ExternalLibrary> {
-  FileState get asFileState {
-    return map(
-      (file) => file!,
-      (_) => fail('Expected a file'),
+extension _Either2Extension<T1, T2> on Either2<T1, T2> {
+  T1 get t1 {
+    late T1 result;
+    map(
+      (t1) => result = t1,
+      (_) => throw 'Expected T1',
     );
+    return result;
   }
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart
index cecd83d..29798f2 100644
--- a/pkg/analyzer/test/src/dart/analysis/index_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart
@@ -1155,6 +1155,18 @@
     assertThat(element)..isReferencedAt('test: 0', true);
   }
 
+  test_isReferencedBy_ParameterElement_optionalNamed_ofTopFunction_anywhere() async {
+    await _indexTestUnit('''
+void foo(int a, int b, {int? test}) {}
+
+void() {
+  foo(1, test: 0, 2);
+}
+''');
+    Element element = findElement.parameter('test');
+    assertThat(element)..isReferencedAt('test: 0', true);
+  }
+
   test_isReferencedBy_ParameterElement_optionalPositional() async {
     await _indexTestUnit('''
 foo([p]) {
diff --git a/pkg/analyzer/test/src/dart/analysis/resolve_for_completion_test.dart b/pkg/analyzer/test/src/dart/analysis/resolve_for_completion_test.dart
new file mode 100644
index 0000000..e241371
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/analysis/resolve_for_completion_test.dart
@@ -0,0 +1,546 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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/driver.dart';
+import 'package:analyzer/src/dart/analysis/results.dart';
+import 'package:analyzer/src/util/performance/operation_performance.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ResolveForCompletionTest);
+  });
+}
+
+@reflectiveTest
+class ResolveForCompletionTest extends PubPackageResolutionTest {
+  AnalysisDriver get testDriver {
+    return driverFor(testFilePathPlatform);
+  }
+
+  String get testFilePathPlatform => convertPath(testFilePath);
+
+  test_class__fieldDeclaration_type_namedType_name() async {
+    var result = _resolveTestCode(r'''
+class A {
+  var f1 = 0;
+  doub^ f2 = null;
+  var f3 = 1;
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_class__fieldDeclaration_type_namedType_typeArgument_name() async {
+    var result = _resolveTestCode(r'''
+class A {
+  var f1 = 0;
+  List<doub^>? f2 = null;
+  var f3 = 1;
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_class_extends_name() async {
+    var result = _resolveTestCode(r'''
+class A extends foo^ {}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_class_fieldDeclaration_initializer() async {
+    var result = _resolveTestCode(r'''
+class A {
+  var f1 = 0;
+  var f2 = foo^;
+  var f3 = 1;
+}
+''');
+
+    result.assertResolvedNodes([
+      'var f2 = foo;',
+    ]);
+  }
+
+  test_class_implements_name() async {
+    var result = _resolveTestCode(r'''
+class A implements foo^ {}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_class_methodDeclaration_body() async {
+    var result = _resolveTestCode(r'''
+class A {}
+
+class B {
+  void foo1() {}
+
+  void foo2() {
+    print(0);
+    bar^;
+    print(1);
+  }
+
+  void foo3() {}
+}
+''');
+
+    result.assertResolvedNodes([
+      'void foo2() {print(0); bar; print(1);}',
+    ]);
+  }
+
+  test_class_methodDeclaration_name() async {
+    var result = _resolveTestCode(r'''
+class A {
+  void foo^() {
+    print(0);
+  }
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_class_methodDeclaration_returnType_name() async {
+    var result = _resolveTestCode(r'''
+class A {
+  doub^ foo() {}
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_class_with_name() async {
+    var result = _resolveTestCode(r'''
+class A with foo^ {}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_constructorDeclaration_body() async {
+    var result = _resolveTestCode(r'''
+class A {}
+
+class B {
+  void foo1() {}
+
+  B() {
+    print(0);
+    bar^;
+    print(1);
+  }
+
+  void foo2() {}
+}
+''');
+
+    result.assertResolvedNodes([
+      'B() {print(0); bar; print(1);}',
+    ]);
+  }
+
+  test_constructorDeclaration_fieldInitializer_name() async {
+    var result = _resolveTestCode(r'''
+class A {}
+
+class B {
+  var f;
+
+  void foo1() {}
+
+  B(int a) : bar^ = 0 {
+    print(0);
+  }
+
+  void foo2() {}
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_constructorDeclaration_fieldInitializer_value() async {
+    var result = _resolveTestCode(r'''
+class A {
+  var f;
+
+  A(int a) : f = a + bar^ {
+    print(0);
+  }
+}
+''');
+
+    // TODO(scheglov) Resolve only the initializer.
+    result.assertResolvedNodes([
+      'A(int a) : f = a + bar {print(0);}',
+    ]);
+  }
+
+  test_constructorDeclaration_name() async {
+    var result = _resolveTestCode(r'''
+class A {
+  A.foo^() {
+    print(0);
+  }
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_doubleLiteral() async {
+    var result = _resolveTestCode(r'''
+var v = 1.2^;
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_extension_methodDeclaration_body() async {
+    var result = _resolveTestCode(r'''
+extension E on int {
+  void foo1() {}
+
+  void foo2() {
+    print(0);
+    bar^;
+    print(1);
+  }
+
+  void foo3() {}
+}
+''');
+
+    result.assertResolvedNodes([
+      'void foo2() {print(0); bar; print(1);}',
+    ]);
+  }
+
+  test_extension_methodDeclaration_name() async {
+    var result = _resolveTestCode(r'''
+extension E on int {
+  void foo^() {
+    print(0);
+  }
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_extension_methodDeclaration_returnType_name() async {
+    var result = _resolveTestCode(r'''
+extension E on int {
+  doub^ foo() {}
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_extension_on_name() async {
+    var result = _resolveTestCode(r'''
+extension E on int^ {
+  void foo() {}
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_functionDeclaration_body() async {
+    var result = _resolveTestCode(r'''
+void foo1() {}
+
+void foo2() {
+  print(0);
+  bar^;
+  print(1);
+}
+
+void foo3() {}
+''');
+
+    result.assertResolvedNodes([
+      'void foo2() {print(0); bar; print(1);}',
+    ]);
+  }
+
+  test_functionDeclaration_name() async {
+    var result = _resolveTestCode(r'''
+void foo^() {
+  print(0);
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_functionDeclaration_returnType_name() async {
+    var result = _resolveTestCode(r'''
+doub^ f() {}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_importDirective_show_name() async {
+    var result = _resolveTestCode(r'''
+import 'dart:async';
+import 'dart:math' show ^;
+import 'dart:io';
+''');
+
+    result.assertResolvedNodes([
+      "import 'dart:math' show ;",
+    ]);
+  }
+
+  test_importDirective_uri() async {
+    var result = _resolveTestCode(r'''
+import 'dart:async';
+import 'dart:ma^'
+import 'dart:io';
+''');
+
+    result.assertResolvedNodes([
+      "import 'dart:ma';",
+    ]);
+  }
+
+  test_integerLiteral() async {
+    var result = _resolveTestCode(r'''
+var v = 0^;
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_localVariableDeclaration_name() async {
+    var result = _resolveTestCode(r'''
+void f() {
+  var foo^
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_localVariableDeclaration_type_name() async {
+    var result = _resolveTestCode(r'''
+void f() {
+  doub^ a;
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_mixin_implements_name() async {
+    var result = _resolveTestCode(r'''
+mixin M implements foo^ {}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_mixin_methodDeclaration_body() async {
+    var result = _resolveTestCode(r'''
+class A {}
+
+mixin M {
+  void foo1() {}
+
+  void foo2() {
+    print(0);
+    bar^;
+    print(1);
+  }
+
+  void foo3() {}
+}
+''');
+
+    result.assertResolvedNodes([
+      'void foo2() {print(0); bar; print(1);}',
+    ]);
+  }
+
+  test_mixin_methodDeclaration_name() async {
+    var result = _resolveTestCode(r'''
+mixin M {
+  void foo^() {
+    print(0);
+  }
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_mixin_methodDeclaration_returnType_name() async {
+    var result = _resolveTestCode(r'''
+mixin M {
+  doub^ foo() {}
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_mixin_on_name() async {
+    var result = _resolveTestCode(r'''
+mixin M on foo^ {}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_processPendingChanges() async {
+    newFile(testFilePath, content: 'class A {}');
+
+    // Read the file.
+    testDriver.getFileSync(testFilePathPlatform);
+
+    // Should call `changeFile()`, and the driver must re-read the file.
+    var result = _resolveTestCode(r'''
+var v1 = 0;
+var v2 = v1.^;
+''');
+
+    result.assertResolvedNodes([
+      'var v2 = v1.;',
+    ]);
+  }
+
+  test_simpleFormalParameter_name() async {
+    var result = _resolveTestCode(r'''
+void f(doub^) {}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_simpleFormalParameter_type_name() async {
+    var result = _resolveTestCode(r'''
+void f(doub^ a) {}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_topLevelVariable_initializer() async {
+    var result = _resolveTestCode(r'''
+var v1 = 0;
+var v2 = foo^;
+var v3 = 1;
+''');
+
+    result.assertResolvedNodes([
+      'var v2 = foo;',
+    ]);
+  }
+
+  test_topLevelVariable_name() async {
+    var result = _resolveTestCode(r'''
+var v1 = 0;
+var v2^
+var v3 = 0;
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_topLevelVariable_type_namedType_name() async {
+    var result = _resolveTestCode(r'''
+var v1 = 0;
+doub^ v2 = null;
+var v3 = 1;
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_topLevelVariable_type_namedType_typeArgument_name() async {
+    var result = _resolveTestCode(r'''
+var v1 = 0;
+List<doub^>? v2 = null;
+var v3 = 1;
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_typedef_name_nothing() async {
+    var result = _resolveTestCode(r'''
+typedef F^
+''');
+
+    _assertWholeUnitResolved(result);
+  }
+
+  test_typeParameter_name() async {
+    var result = _resolveTestCode(r'''
+void f<T^>() {
+  print(0);
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  int _newFileWithOffset(String path, String content) {
+    var offset = content.indexOf('^');
+    expect(offset, isNot(equals(-1)), reason: 'missing ^');
+
+    var nextOffset = content.indexOf('^', offset + 1);
+    expect(nextOffset, equals(-1), reason: 'too many ^');
+
+    var before = content.substring(0, offset);
+    var after = content.substring(offset + 1);
+    newFile(path, content: before + after);
+
+    return offset;
+  }
+
+  ResolvedForCompletionResultImpl _resolveTestCode(String content) {
+    var path = testFilePathPlatform;
+    var offset = _newFileWithOffset(path, content);
+    testDriver.changeFile(path);
+
+    var performance = OperationPerformanceImpl('<root>');
+    var result = testDriver.resolveForCompletion(
+      path: path,
+      offset: offset,
+      performance: performance,
+    );
+    return result!;
+  }
+
+  static void _assertWholeUnitResolved(
+    ResolvedForCompletionResultImpl result,
+  ) {
+    expect(result.resolvedNodes, [result.parsedUnit]);
+  }
+}
+
+extension ResolvedForCompletionResultImplExtension
+    on ResolvedForCompletionResultImpl {
+  void assertResolvedNodes(List<String> expected) {
+    var actual = resolvedNodes.map((e) => '$e').toList();
+    expect(actual, expected);
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index 700ec3d..612ac02 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -114,6 +114,259 @@
         unorderedEquals([a.methods[0], b.fields[0]]));
   }
 
+  test_declarations_class() async {
+    await resolveTestCode('''
+class C {
+  int f;
+  C();
+  C.named();
+  int get g => 0;
+  void set s(_) {}
+  void m() {}
+}
+''');
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, null);
+    var declarations = results.declarations;
+    declarations.assertHas('C', DeclarationKind.CLASS,
+        offset: 6, codeOffset: 0, codeLength: 91);
+    declarations.assertHas('f', DeclarationKind.FIELD,
+        offset: 16, codeOffset: 12, codeLength: 5, className: 'C');
+    declarations.assertHas('named', DeclarationKind.CONSTRUCTOR,
+        offset: 30, codeOffset: 28, codeLength: 10, className: 'C');
+    declarations.assertHas('g', DeclarationKind.GETTER,
+        offset: 49, codeOffset: 41, codeLength: 15, className: 'C');
+    declarations.assertHas('s', DeclarationKind.SETTER,
+        offset: 68, codeOffset: 59, codeLength: 16, className: 'C');
+    declarations.assertHas('m', DeclarationKind.METHOD,
+        offset: 83, codeOffset: 78, codeLength: 11, className: 'C');
+  }
+
+  test_declarations_discover() async {
+    var aaaPackageRootPath = '$packagesRootPath/aaa';
+    var bbbPackageRootPath = '$packagesRootPath/bbb';
+    var cccPackageRootPath = '$packagesRootPath/ccc';
+    var aaaFilePath = convertPath('$aaaPackageRootPath/lib/a.dart');
+    var bbbFilePath = convertPath('$bbbPackageRootPath/lib/b.dart');
+    var cccFilePath = convertPath('$cccPackageRootPath/lib/c.dart');
+
+    writeTestPackageConfig(
+      PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: aaaPackageRootPath)
+        ..add(name: 'bbb', rootPath: bbbPackageRootPath),
+    );
+
+    newFile(aaaFilePath, content: 'class A {}');
+    newFile(bbbFilePath, content: 'class B {}');
+    newFile(cccFilePath, content: 'class C {}');
+
+    await resolveTestCode('class T {}');
+
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, null);
+    var declarations = results.declarations;
+
+    declarations.assertHas('T', DeclarationKind.CLASS);
+    declarations.assertHas('A', DeclarationKind.CLASS);
+    declarations.assertHas('B', DeclarationKind.CLASS);
+    declarations.assertNo('C');
+  }
+
+  test_declarations_enum() async {
+    await resolveTestCode('''
+enum E {
+  a, bb, ccc
+}
+''');
+
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, null);
+    var declarations = results.declarations;
+
+    declarations.assertHas('E', DeclarationKind.ENUM,
+        offset: 5, codeOffset: 0, codeLength: 23);
+    declarations.assertHas('a', DeclarationKind.ENUM_CONSTANT,
+        offset: 11, codeOffset: 11, codeLength: 1);
+    declarations.assertHas('bb', DeclarationKind.ENUM_CONSTANT,
+        offset: 14, codeOffset: 14, codeLength: 2);
+    declarations.assertHas('ccc', DeclarationKind.ENUM_CONSTANT,
+        offset: 18, codeOffset: 18, codeLength: 3);
+  }
+
+  test_declarations_maxResults() async {
+    await resolveTestCode('''
+class A {}
+class B {}
+class C {}
+''');
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, 2);
+    expect(results.declarations, hasLength(2));
+  }
+
+  test_declarations_mixin() async {
+    await resolveTestCode('''
+mixin M {
+  int f;
+  int get g => 0;
+  void set s(_) {}
+  void m() {}
+}
+''');
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, null);
+    var declarations = results.declarations;
+    declarations.assertHas('M', DeclarationKind.MIXIN,
+        offset: 6, codeOffset: 0, codeLength: 71);
+    declarations.assertHas('f', DeclarationKind.FIELD,
+        offset: 16, codeOffset: 12, codeLength: 5, mixinName: 'M');
+    declarations.assertHas('g', DeclarationKind.GETTER,
+        offset: 29, codeOffset: 21, codeLength: 15, mixinName: 'M');
+    declarations.assertHas('s', DeclarationKind.SETTER,
+        offset: 48, codeOffset: 39, codeLength: 16, mixinName: 'M');
+    declarations.assertHas('m', DeclarationKind.METHOD,
+        offset: 63, codeOffset: 58, codeLength: 11, mixinName: 'M');
+  }
+
+  test_declarations_onlyForFile() async {
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
+    var b = newFile('$testPackageLibPath/b.dart', content: 'class B {}').path;
+
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, null, onlyForFile: b);
+    var declarations = results.declarations;
+
+    expect(results.files, [b]);
+
+    declarations.assertNo('A');
+    declarations.assertHas('B', DeclarationKind.CLASS);
+  }
+
+  test_declarations_parameters() async {
+    await resolveTestCode('''
+class C {
+  int get g => 0;
+  void m(int a, double b) {}
+}
+void f(bool a, String b) {}
+''');
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, null);
+    var declarations = results.declarations;
+
+    var declaration = declarations.assertHas('C', DeclarationKind.CLASS);
+    expect(declaration.parameters, isNull);
+
+    declaration =
+        declarations.assertHas('g', DeclarationKind.GETTER, className: 'C');
+    expect(declaration.parameters, isNull);
+
+    declaration =
+        declarations.assertHas('m', DeclarationKind.METHOD, className: 'C');
+    expect(declaration.parameters, '(int a, double b)');
+
+    declaration = declarations.assertHas('f', DeclarationKind.FUNCTION);
+    expect(declaration.parameters, '(bool a, String b)');
+  }
+
+  test_declarations_parameters_functionTyped() async {
+    await resolveTestCode('''
+void f1(bool a(int b, String c)) {}
+void f2(a(b, c)) {}
+void f3(bool Function(int a, String b) c) {}
+void f4(bool Function(int, String) a) {}
+''');
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, null);
+    var declarations = results.declarations;
+
+    var declaration = declarations.assertHas('f1', DeclarationKind.FUNCTION);
+    expect(declaration.parameters, '(bool Function(int, String) a)');
+
+    declaration = declarations.assertHas('f2', DeclarationKind.FUNCTION);
+    expect(declaration.parameters, '(dynamic Function(dynamic, dynamic) a)');
+
+    declaration = declarations.assertHas('f3', DeclarationKind.FUNCTION);
+    expect(declaration.parameters, '(bool Function(int, String) c)');
+
+    declaration = declarations.assertHas('f4', DeclarationKind.FUNCTION);
+    expect(declaration.parameters, '(bool Function(int, String) a)');
+  }
+
+  test_declarations_parameters_typeArguments() async {
+    await resolveTestCode('''
+class A<T, T2> {
+  void m1(Map<int, String> a) {}
+  void m2<U>(Map<T, U> a) {}
+  void m3<U1, U2>(Map<Map<T2, U2>, Map<U1, T>> a) {}
+}
+''');
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, null);
+    var declarations = results.declarations;
+
+    var declaration =
+        declarations.assertHas('m1', DeclarationKind.METHOD, className: 'A');
+    expect(declaration.parameters, '(Map<int, String> a)');
+
+    declaration =
+        declarations.assertHas('m2', DeclarationKind.METHOD, className: 'A');
+    expect(declaration.parameters, '(Map<T, U> a)');
+
+    declaration =
+        declarations.assertHas('m3', DeclarationKind.METHOD, className: 'A');
+    expect(declaration.parameters, '(Map<Map<T2, U2>, Map<U1, T>> a)');
+  }
+
+  test_declarations_regExp() async {
+    await resolveTestCode('''
+class A {}
+class B {}
+class C {}
+class D {}
+''');
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, RegExp(r'[A-C]'), null);
+    var declarations = results.declarations;
+
+    declarations.assertHas('A', DeclarationKind.CLASS);
+    declarations.assertHas('B', DeclarationKind.CLASS);
+    declarations.assertHas('C', DeclarationKind.CLASS);
+    declarations.assertNo('D');
+  }
+
+  test_declarations_top() async {
+    await resolveTestCode('''
+int get g => 0;
+void set s(_) {}
+void f(int p) {}
+int v;
+typedef void tf1();
+typedef tf2<T> = int Function<S>(T tp, S sp);
+''');
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, null);
+    var declarations = results.declarations;
+
+    declarations.assertHas('g', DeclarationKind.GETTER,
+        offset: 8, codeOffset: 0, codeLength: 15);
+    declarations.assertHas('s', DeclarationKind.SETTER,
+        offset: 25, codeOffset: 16, codeLength: 16);
+    declarations.assertHas(
+      'f',
+      DeclarationKind.FUNCTION,
+      offset: 38,
+      codeOffset: 33,
+      codeLength: 16,
+    );
+    declarations.assertHas('v', DeclarationKind.VARIABLE,
+        offset: 54, codeOffset: 50, codeLength: 5);
+    declarations.assertHas('tf1', DeclarationKind.TYPE_ALIAS,
+        offset: 70, codeOffset: 57, codeLength: 19);
+    declarations.assertHas('tf2', DeclarationKind.TYPE_ALIAS,
+        offset: 85, codeOffset: 77, codeLength: 45);
+  }
+
   test_searchMemberReferences_qualified_resolved() async {
     await resolveTestCode('''
 class C {
@@ -1164,6 +1417,25 @@
     await _verifyReferences(element, expected);
   }
 
+  test_searchReferences_ParameterElement_optionalNamed_anywhere() async {
+    await resolveTestCode('''
+foo(int a, int b, {p}) {
+  p;
+}
+main() {
+  foo(0, p: 1, 2);
+}
+''');
+    var element = findElement.parameter('p');
+    var foo = findElement.function('foo');
+    var main = findElement.function('main');
+    var expected = [
+      _expectId(foo, SearchResultKind.READ, 'p;'),
+      _expectIdQ(main, SearchResultKind.REFERENCE, 'p: 1')
+    ];
+    await _verifyReferences(element, expected);
+  }
+
   test_searchReferences_ParameterElement_optionalPositional() async {
     await resolveTestCode('''
 foo([p]) {
@@ -2126,3 +2398,38 @@
     expect(matches, unorderedEquals(expectedMatches));
   }
 }
+
+extension on List<Declaration> {
+  void assertNo(String name) {
+    for (var declaration in this) {
+      if (declaration.name == name) {
+        fail('Unexpected declaration $name');
+      }
+    }
+  }
+
+  Declaration assertHas(String name, DeclarationKind kind,
+      {int? offset,
+      int? codeOffset,
+      int? codeLength,
+      String? className,
+      String? mixinName}) {
+    for (var declaration in this) {
+      if (declaration.name == name &&
+          declaration.kind == kind &&
+          (offset == null || declaration.offset == offset) &&
+          (codeOffset == null || declaration.codeOffset == codeOffset) &&
+          (codeLength == null || declaration.codeLength == codeLength) &&
+          declaration.className == className &&
+          declaration.mixinName == mixinName) {
+        return declaration;
+      }
+    }
+    var actual =
+        map((d) => '(name=${d.name}, kind=${d.kind}, offset=${d.offset}, '
+            'codeOffset=${d.codeOffset}, codeLength=${d.codeLength}, '
+            'className=${d.className}, mixinName=${d.mixinName})').join('\n');
+    fail('Expected to find (name=$name, kind=$kind, offset=$offset, '
+        'codeOffset=$codeOffset, codeLength=$codeLength) in\n$actual');
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/analysis/test_all.dart b/pkg/analyzer/test/src/dart/analysis/test_all.dart
index fbbd8d5..2c5030d 100644
--- a/pkg/analyzer/test/src/dart/analysis/test_all.dart
+++ b/pkg/analyzer/test/src/dart/analysis/test_all.dart
@@ -24,6 +24,7 @@
 import 'index_test.dart' as index;
 import 'mutex_test.dart' as mutex;
 import 'referenced_names_test.dart' as referenced_names;
+import 'resolve_for_completion_test.dart' as resolve_for_completion;
 import 'results/test_all.dart' as results;
 import 'search_test.dart' as search;
 import 'session_helper_test.dart' as session_helper;
@@ -53,6 +54,7 @@
     index.main();
     mutex.main();
     referenced_names.main();
+    resolve_for_completion.main();
     results.main();
     search.main();
     session.main();
diff --git a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
index 70b153a..9914458 100644
--- a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
@@ -46,7 +46,7 @@
         AstTestFactory.annotation2(AstTestFactory.identifier3("A"),
             AstTestFactory.identifier3("c"), AstTestFactory.argumentList(),
             typeArguments: AstTestFactory.typeArgumentList2(
-                [AstTestFactory.typeName4('T')])));
+                [AstTestFactory.namedType4('T')])));
   }
 
   void test_visitArgumentList() {
@@ -62,7 +62,7 @@
     _assertSource(
         "e as T",
         AstTestFactory.asExpression(
-            AstTestFactory.identifier3("e"), AstTestFactory.typeName4("T")));
+            AstTestFactory.identifier3("e"), AstTestFactory.namedType4("T")));
   }
 
   void test_visitAssertStatement() {
@@ -193,12 +193,12 @@
 
   void test_visitCatchClause_on() {
     _assertSource(
-        "on E {}", AstTestFactory.catchClause3(AstTestFactory.typeName4("E")));
+        "on E {}", AstTestFactory.catchClause3(AstTestFactory.namedType4("E")));
   }
 
   void test_visitCatchClause_on_catch() {
     _assertSource("on E catch (e) {}",
-        AstTestFactory.catchClause4(AstTestFactory.typeName4("E"), "e"));
+        AstTestFactory.catchClause4(AstTestFactory.namedType4("E"), "e"));
   }
 
   void test_visitClassDeclaration_abstract() {
@@ -220,7 +220,7 @@
             null,
             "C",
             null,
-            AstTestFactory.extendsClause(AstTestFactory.typeName4("A")),
+            AstTestFactory.extendsClause(AstTestFactory.namedType4("A")),
             null,
             null));
   }
@@ -232,9 +232,9 @@
             null,
             "C",
             null,
-            AstTestFactory.extendsClause(AstTestFactory.typeName4("A")),
+            AstTestFactory.extendsClause(AstTestFactory.namedType4("A")),
             null,
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("B")])));
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("B")])));
   }
 
   void test_visitClassDeclaration_extends_with() {
@@ -244,8 +244,8 @@
             null,
             "C",
             null,
-            AstTestFactory.extendsClause(AstTestFactory.typeName4("A")),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M")]),
+            AstTestFactory.extendsClause(AstTestFactory.namedType4("A")),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M")]),
             null));
   }
 
@@ -256,16 +256,16 @@
             null,
             "C",
             null,
-            AstTestFactory.extendsClause(AstTestFactory.typeName4("A")),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M")]),
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("B")])));
+            AstTestFactory.extendsClause(AstTestFactory.namedType4("A")),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M")]),
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("B")])));
   }
 
   void test_visitClassDeclaration_implements() {
     _assertSource(
         "class C implements B {}",
         AstTestFactory.classDeclaration(null, "C", null, null, null,
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("B")])));
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("B")])));
   }
 
   void test_visitClassDeclaration_multipleMember() {
@@ -293,7 +293,7 @@
             null,
             "C",
             AstTestFactory.typeParameterList(["E"]),
-            AstTestFactory.extendsClause(AstTestFactory.typeName4("A")),
+            AstTestFactory.extendsClause(AstTestFactory.namedType4("A")),
             null,
             null));
   }
@@ -305,9 +305,9 @@
             null,
             "C",
             AstTestFactory.typeParameterList(["E"]),
-            AstTestFactory.extendsClause(AstTestFactory.typeName4("A")),
+            AstTestFactory.extendsClause(AstTestFactory.namedType4("A")),
             null,
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("B")])));
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("B")])));
   }
 
   void test_visitClassDeclaration_parameters_extends_with() {
@@ -317,8 +317,8 @@
             null,
             "C",
             AstTestFactory.typeParameterList(["E"]),
-            AstTestFactory.extendsClause(AstTestFactory.typeName4("A")),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M")]),
+            AstTestFactory.extendsClause(AstTestFactory.namedType4("A")),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M")]),
             null));
   }
 
@@ -329,9 +329,9 @@
             null,
             "C",
             AstTestFactory.typeParameterList(["E"]),
-            AstTestFactory.extendsClause(AstTestFactory.typeName4("A")),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M")]),
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("B")])));
+            AstTestFactory.extendsClause(AstTestFactory.namedType4("A")),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M")]),
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("B")])));
   }
 
   void test_visitClassDeclaration_parameters_implements() {
@@ -343,7 +343,7 @@
             AstTestFactory.typeParameterList(["E"]),
             null,
             null,
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("B")])));
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("B")])));
   }
 
   void test_visitClassDeclaration_singleMember() {
@@ -370,8 +370,8 @@
             "C",
             null,
             Keyword.ABSTRACT,
-            AstTestFactory.typeName4("S"),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M1")]),
+            AstTestFactory.namedType4("S"),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M1")]),
             null));
   }
 
@@ -382,9 +382,9 @@
             "C",
             null,
             Keyword.ABSTRACT,
-            AstTestFactory.typeName4("S"),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M1")]),
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("I")])));
+            AstTestFactory.namedType4("S"),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M1")]),
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("I")])));
   }
 
   void test_visitClassTypeAlias_generic() {
@@ -394,9 +394,9 @@
             "C",
             AstTestFactory.typeParameterList(["E"]),
             null,
-            AstTestFactory.typeName4("S", [AstTestFactory.typeName4("E")]),
+            AstTestFactory.namedType4("S", [AstTestFactory.namedType4("E")]),
             AstTestFactory.withClause([
-              AstTestFactory.typeName4("M1", [AstTestFactory.typeName4("E")])
+              AstTestFactory.namedType4("M1", [AstTestFactory.namedType4("E")])
             ]),
             null));
   }
@@ -408,9 +408,9 @@
             "C",
             null,
             null,
-            AstTestFactory.typeName4("S"),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M1")]),
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("I")])));
+            AstTestFactory.namedType4("S"),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M1")]),
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("I")])));
   }
 
   void test_visitClassTypeAlias_minimal() {
@@ -420,8 +420,8 @@
             "C",
             null,
             null,
-            AstTestFactory.typeName4("S"),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M1")]),
+            AstTestFactory.namedType4("S"),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M1")]),
             null));
   }
 
@@ -432,8 +432,8 @@
             "C",
             AstTestFactory.typeParameterList(["E"]),
             Keyword.ABSTRACT,
-            AstTestFactory.typeName4("S"),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M1")]),
+            AstTestFactory.namedType4("S"),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M1")]),
             null));
   }
 
@@ -444,9 +444,9 @@
             "C",
             AstTestFactory.typeParameterList(["E"]),
             Keyword.ABSTRACT,
-            AstTestFactory.typeName4("S"),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M1")]),
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("I")])));
+            AstTestFactory.namedType4("S"),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M1")]),
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("I")])));
   }
 
   void test_visitClassTypeAlias_parameters_implements() {
@@ -456,9 +456,9 @@
             "C",
             AstTestFactory.typeParameterList(["E"]),
             null,
-            AstTestFactory.typeName4("S"),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M1")]),
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("I")])));
+            AstTestFactory.namedType4("S"),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M1")]),
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("I")])));
   }
 
   void test_visitClassTypeAlias_withMetadata() {
@@ -466,8 +466,8 @@
         "C",
         null,
         null,
-        AstTestFactory.typeName4("S"),
-        AstTestFactory.withClause([AstTestFactory.typeName4("M1")]),
+        AstTestFactory.namedType4("S"),
+        AstTestFactory.withClause([AstTestFactory.namedType4("M1")]),
         null);
     declaration.metadata.add(
         AstTestFactory.annotation(AstTestFactory.identifier3("deprecated")));
@@ -684,19 +684,19 @@
     _assertSource(
         "p.C.n",
         AstTestFactory.constructorName(
-            AstTestFactory.typeName4("p.C.n"), null));
+            AstTestFactory.namedType4("p.C.n"), null));
   }
 
   void test_visitConstructorName_unnamed_noPrefix() {
     _assertSource("C",
-        AstTestFactory.constructorName(AstTestFactory.typeName4("C"), null));
+        AstTestFactory.constructorName(AstTestFactory.namedType4("C"), null));
   }
 
   void test_visitConstructorName_unnamed_prefix() {
     _assertSource(
         "p.C",
         AstTestFactory.constructorName(
-            AstTestFactory.typeName3(AstTestFactory.identifier5("p", "C")),
+            AstTestFactory.namedType3(AstTestFactory.identifier5("p", "C")),
             null));
   }
 
@@ -845,7 +845,7 @@
 
   void test_visitExtendsClause() {
     _assertSource("extends C",
-        AstTestFactory.extendsClause(AstTestFactory.typeName4("C")));
+        AstTestFactory.extendsClause(AstTestFactory.namedType4("C")));
   }
 
   void test_visitExtensionDeclaration_empty() {
@@ -853,7 +853,7 @@
         'extension E on C {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             isExtensionTypeDeclaration: false));
   }
 
@@ -862,7 +862,7 @@
         'extension E on C {var a; var b;}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             members: [
               AstTestFactory.fieldDeclaration2(false, Keyword.VAR,
                   [AstTestFactory.variableDeclaration('a')]),
@@ -878,7 +878,7 @@
         AstTestFactory.extensionDeclaration(
             name: 'E',
             typeParameters: AstTestFactory.typeParameterList(['T']),
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             isExtensionTypeDeclaration: false));
   }
 
@@ -887,7 +887,7 @@
         'extension E on C {var a;}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             members: [
               AstTestFactory.fieldDeclaration2(
                   false, Keyword.VAR, [AstTestFactory.variableDeclaration('a')])
@@ -900,9 +900,9 @@
         'extension type E on C hide B {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             hideClause:
-                AstTestFactory.hideClause([AstTestFactory.typeName4("B")]),
+                AstTestFactory.hideClause([AstTestFactory.namedType4("B")]),
             isExtensionTypeDeclaration: true));
   }
 
@@ -911,7 +911,7 @@
         'extension type E on C hide B {var a; var b;}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             members: [
               AstTestFactory.fieldDeclaration2(false, Keyword.VAR,
                   [AstTestFactory.variableDeclaration('a')]),
@@ -919,7 +919,7 @@
                   false, Keyword.VAR, [AstTestFactory.variableDeclaration('b')])
             ],
             hideClause:
-                AstTestFactory.hideClause([AstTestFactory.typeName4("B")]),
+                AstTestFactory.hideClause([AstTestFactory.namedType4("B")]),
             isExtensionTypeDeclaration: true));
   }
 
@@ -929,9 +929,9 @@
         AstTestFactory.extensionDeclaration(
             name: 'E',
             typeParameters: AstTestFactory.typeParameterList(['T']),
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             hideClause:
-                AstTestFactory.hideClause([AstTestFactory.typeName4("B")]),
+                AstTestFactory.hideClause([AstTestFactory.namedType4("B")]),
             isExtensionTypeDeclaration: true));
   }
 
@@ -940,13 +940,13 @@
         'extension type E on C hide B {var a;}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             members: [
               AstTestFactory.fieldDeclaration2(
                   false, Keyword.VAR, [AstTestFactory.variableDeclaration('a')])
             ],
             hideClause:
-                AstTestFactory.hideClause([AstTestFactory.typeName4("B")]),
+                AstTestFactory.hideClause([AstTestFactory.namedType4("B")]),
             isExtensionTypeDeclaration: true));
   }
 
@@ -955,7 +955,7 @@
         'extension type E on C show foo {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             showClause: AstTestFactory.showClause(
                 [AstTestFactory.showHideElement("foo")]),
             isExtensionTypeDeclaration: true));
@@ -966,9 +966,9 @@
         'extension type E on C show B {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             showClause:
-                AstTestFactory.showClause([AstTestFactory.typeName4("B")]),
+                AstTestFactory.showClause([AstTestFactory.namedType4("B")]),
             isExtensionTypeDeclaration: true));
   }
 
@@ -977,7 +977,7 @@
         'extension type E on C show get foo {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             showClause: AstTestFactory.showClause(
                 [AstTestFactory.showHideElementGetter("foo")]),
             isExtensionTypeDeclaration: true));
@@ -988,7 +988,7 @@
         'extension type E on C show B {var a; var b;}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             members: [
               AstTestFactory.fieldDeclaration2(false, Keyword.VAR,
                   [AstTestFactory.variableDeclaration('a')]),
@@ -996,7 +996,7 @@
                   false, Keyword.VAR, [AstTestFactory.variableDeclaration('b')])
             ],
             showClause:
-                AstTestFactory.showClause([AstTestFactory.typeName4("B")]),
+                AstTestFactory.showClause([AstTestFactory.namedType4("B")]),
             isExtensionTypeDeclaration: true));
   }
 
@@ -1005,7 +1005,7 @@
         'extension type E on C show operator * {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             showClause: AstTestFactory.showClause(
                 [AstTestFactory.showHideElementOperator("*")]),
             isExtensionTypeDeclaration: true));
@@ -1017,9 +1017,9 @@
         AstTestFactory.extensionDeclaration(
             name: 'E',
             typeParameters: AstTestFactory.typeParameterList(['T']),
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             showClause:
-                AstTestFactory.showClause([AstTestFactory.typeName4("B")]),
+                AstTestFactory.showClause([AstTestFactory.namedType4("B")]),
             isExtensionTypeDeclaration: true));
   }
 
@@ -1028,9 +1028,9 @@
         'extension type E on C show prefix.B {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             showClause: AstTestFactory.showClause([
-              AstTestFactory.typeName3(
+              AstTestFactory.namedType3(
                   AstTestFactory.identifier5('prefix', 'B'))
             ]),
             isExtensionTypeDeclaration: true));
@@ -1041,7 +1041,7 @@
         'extension type E on C show set foo {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             showClause: AstTestFactory.showClause(
                 [AstTestFactory.showHideElementSetter("foo")]),
             isExtensionTypeDeclaration: true));
@@ -1052,13 +1052,13 @@
         'extension type E on C show B {var a;}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             members: [
               AstTestFactory.fieldDeclaration2(
                   false, Keyword.VAR, [AstTestFactory.variableDeclaration('a')])
             ],
             showClause:
-                AstTestFactory.showClause([AstTestFactory.typeName4("B")]),
+                AstTestFactory.showClause([AstTestFactory.namedType4("B")]),
             isExtensionTypeDeclaration: true));
   }
 
@@ -1067,11 +1067,11 @@
         'extension type E on C show B<int, String> {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             showClause: AstTestFactory.showClause([
-              AstTestFactory.typeName3(AstTestFactory.identifier3('B'), [
-                AstTestFactory.typeName4('int'),
-                AstTestFactory.typeName4('String')
+              AstTestFactory.namedType3(AstTestFactory.identifier3('B'), [
+                AstTestFactory.namedType4('int'),
+                AstTestFactory.namedType4('String')
               ])
             ]),
             isExtensionTypeDeclaration: true));
@@ -1082,9 +1082,9 @@
         'extension type E on C show B hide foo {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             showClause:
-                AstTestFactory.showClause([AstTestFactory.typeName4("B")]),
+                AstTestFactory.showClause([AstTestFactory.namedType4("B")]),
             hideClause: AstTestFactory.hideClause(
                 [AstTestFactory.showHideElement("foo")]),
             isExtensionTypeDeclaration: true));
@@ -1105,7 +1105,7 @@
         AstTestFactory.extensionOverride(
             extensionName: AstTestFactory.identifier5('p', 'E'),
             typeArguments: AstTestFactory.typeArgumentList(
-                [AstTestFactory.typeName4('A')]),
+                [AstTestFactory.namedType4('A')]),
             argumentList: AstTestFactory.argumentList(
                 [AstTestFactory.identifier3('o')])));
   }
@@ -1125,7 +1125,7 @@
         AstTestFactory.extensionOverride(
             extensionName: AstTestFactory.identifier3('E'),
             typeArguments: AstTestFactory.typeArgumentList(
-                [AstTestFactory.typeName4('A')]),
+                [AstTestFactory.namedType4('A')]),
             argumentList: AstTestFactory.argumentList(
                 [AstTestFactory.identifier3('o')])));
   }
@@ -1135,7 +1135,7 @@
         'extension type E on C {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             isExtensionTypeDeclaration: true));
   }
 
@@ -1144,7 +1144,7 @@
         'extension type E on C {var a; var b;}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             members: [
               AstTestFactory.fieldDeclaration2(false, Keyword.VAR,
                   [AstTestFactory.variableDeclaration('a')]),
@@ -1160,7 +1160,7 @@
         AstTestFactory.extensionDeclaration(
             name: 'E',
             typeParameters: AstTestFactory.typeParameterList(['T']),
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             isExtensionTypeDeclaration: true));
   }
 
@@ -1169,7 +1169,7 @@
         'extension type E on C {var a;}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             members: [
               AstTestFactory.fieldDeclaration2(
                   false, Keyword.VAR, [AstTestFactory.variableDeclaration('a')])
@@ -1227,7 +1227,7 @@
         "A this.a(b)",
         AstTestFactory.fieldFormalParameter(
             null,
-            AstTestFactory.typeName4("A"),
+            AstTestFactory.namedType4("A"),
             "a",
             AstTestFactory.formalParameterList(
                 [AstTestFactory.simpleFormalParameter3("b")])));
@@ -1237,7 +1237,7 @@
     _assertSource(
         "A this.a<E, F>(b)",
         astFactory.fieldFormalParameter2(
-            type: AstTestFactory.typeName4('A'),
+            type: AstTestFactory.namedType4('A'),
             thisKeyword: TokenFactory.tokenFromKeyword(Keyword.THIS),
             period: TokenFactory.tokenFromType(TokenType.PERIOD),
             identifier: AstTestFactory.identifier3('a'),
@@ -1255,19 +1255,19 @@
     _assertSource(
         "final A this.a",
         AstTestFactory.fieldFormalParameter(
-            Keyword.FINAL, AstTestFactory.typeName4("A"), "a"));
+            Keyword.FINAL, AstTestFactory.namedType4("A"), "a"));
   }
 
   void test_visitFieldFormalParameter_type() {
     _assertSource(
         "A this.a",
         AstTestFactory.fieldFormalParameter(
-            null, AstTestFactory.typeName4("A"), "a"));
+            null, AstTestFactory.namedType4("A"), "a"));
   }
 
   void test_visitFieldFormalParameter_type_covariant() {
     var expected = AstTestFactory.fieldFormalParameter(
-        null, AstTestFactory.typeName4("A"), "a");
+        null, AstTestFactory.namedType4("A"), "a");
     expected.covariantKeyword =
         TokenFactory.tokenFromKeyword(Keyword.COVARIANT);
     _assertSource("covariant A this.a", expected);
@@ -1370,7 +1370,7 @@
               null),
           AstTestFactory.namedFormalParameter(
               AstTestFactory.simpleFormalParameter2(
-                  null, AstTestFactory.typeName4('A'), "b")
+                  null, AstTestFactory.namedType4('A'), "b")
                 ..requiredKeyword =
                     TokenFactory.tokenFromKeyword(Keyword.REQUIRED),
               null),
@@ -1819,14 +1819,14 @@
         "f<A>()",
         AstTestFactory.functionExpressionInvocation2(
             AstTestFactory.identifier3("f"),
-            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('A')])));
+            AstTestFactory.typeArgumentList([AstTestFactory.namedType4('A')])));
   }
 
   void test_visitFunctionTypeAlias_generic() {
     _assertSource(
         "typedef A F<B>();",
         AstTestFactory.typeAlias(
-            AstTestFactory.typeName4("A"),
+            AstTestFactory.namedType4("A"),
             "F",
             AstTestFactory.typeParameterList(["B"]),
             AstTestFactory.formalParameterList()));
@@ -1835,13 +1835,13 @@
   void test_visitFunctionTypeAlias_nonGeneric() {
     _assertSource(
         "typedef A F();",
-        AstTestFactory.typeAlias(AstTestFactory.typeName4("A"), "F", null,
+        AstTestFactory.typeAlias(AstTestFactory.namedType4("A"), "F", null,
             AstTestFactory.formalParameterList()));
   }
 
   void test_visitFunctionTypeAlias_withMetadata() {
     FunctionTypeAlias declaration = AstTestFactory.typeAlias(
-        AstTestFactory.typeName4("A"),
+        AstTestFactory.namedType4("A"),
         "F",
         null,
         AstTestFactory.formalParameterList());
@@ -1867,7 +1867,7 @@
     _assertSource(
         "T f()?",
         astFactory.functionTypedFormalParameter2(
-            returnType: AstTestFactory.typeName4("T"),
+            returnType: AstTestFactory.namedType4("T"),
             identifier: AstTestFactory.identifier3('f'),
             parameters: AstTestFactory.formalParameterList([]),
             question: TokenFactory.tokenFromType(TokenType.QUESTION)));
@@ -1877,12 +1877,12 @@
     _assertSource(
         "T f()",
         AstTestFactory.functionTypedFormalParameter(
-            AstTestFactory.typeName4("T"), "f"));
+            AstTestFactory.namedType4("T"), "f"));
   }
 
   void test_visitFunctionTypedFormalParameter_type_covariant() {
     var expected = AstTestFactory.functionTypedFormalParameter(
-        AstTestFactory.typeName4("T"), "f");
+        AstTestFactory.namedType4("T"), "f");
     expected.covariantKeyword =
         TokenFactory.tokenFromKeyword(Keyword.COVARIANT);
     _assertSource("covariant T f()", expected);
@@ -1892,7 +1892,7 @@
     _assertSource(
         "T f<E>()",
         astFactory.functionTypedFormalParameter2(
-            returnType: AstTestFactory.typeName4("T"),
+            returnType: AstTestFactory.namedType4("T"),
             identifier: AstTestFactory.identifier3('f'),
             typeParameters: AstTestFactory.typeParameterList(['E']),
             parameters: AstTestFactory.formalParameterList([])));
@@ -1902,11 +1902,11 @@
     _assertSource(
         "int Function<T>(T)",
         AstTestFactory.genericFunctionType(
-            AstTestFactory.typeName4("int"),
+            AstTestFactory.namedType4("int"),
             AstTestFactory.typeParameterList2(['T']),
             AstTestFactory.formalParameterList([
               AstTestFactory.simpleFormalParameter4(
-                  AstTestFactory.typeName4("T"), null)
+                  AstTestFactory.namedType4("T"), null)
             ])));
   }
 
@@ -1914,11 +1914,11 @@
     _assertSource(
         "int Function<T>(T)?",
         AstTestFactory.genericFunctionType(
-            AstTestFactory.typeName4("int"),
+            AstTestFactory.namedType4("int"),
             AstTestFactory.typeParameterList2(['T']),
             AstTestFactory.formalParameterList([
               AstTestFactory.simpleFormalParameter4(
-                  AstTestFactory.typeName4("T"), null)
+                  AstTestFactory.namedType4("T"), null)
             ]),
             question: true));
   }
@@ -1930,11 +1930,11 @@
             'X',
             AstTestFactory.typeParameterList2(['S']),
             AstTestFactory.genericFunctionType(
-                AstTestFactory.typeName4("S"),
+                AstTestFactory.namedType4("S"),
                 AstTestFactory.typeParameterList2(['T']),
                 AstTestFactory.formalParameterList([
                   AstTestFactory.simpleFormalParameter4(
-                      AstTestFactory.typeName4("T"), null)
+                      AstTestFactory.namedType4("T"), null)
                 ]))));
   }
 
@@ -1980,12 +1980,12 @@
     _assertSource(
         "implements A, B",
         AstTestFactory.implementsClause(
-            [AstTestFactory.typeName4("A"), AstTestFactory.typeName4("B")]));
+            [AstTestFactory.namedType4("A"), AstTestFactory.namedType4("B")]));
   }
 
   void test_visitImplementsClause_single() {
     _assertSource("implements A",
-        AstTestFactory.implementsClause([AstTestFactory.typeName4("A")]));
+        AstTestFactory.implementsClause([AstTestFactory.namedType4("A")]));
   }
 
   void test_visitImportDirective_combinator() {
@@ -2101,21 +2101,21 @@
     _assertSource(
         "const C()",
         AstTestFactory.instanceCreationExpression2(
-            Keyword.CONST, AstTestFactory.typeName4("C")));
+            Keyword.CONST, AstTestFactory.namedType4("C")));
   }
 
   void test_visitInstanceCreationExpression_named() {
     _assertSource(
         "new C.c()",
         AstTestFactory.instanceCreationExpression3(
-            Keyword.NEW, AstTestFactory.typeName4("C"), "c"));
+            Keyword.NEW, AstTestFactory.namedType4("C"), "c"));
   }
 
   void test_visitInstanceCreationExpression_unnamed() {
     _assertSource(
         "new C()",
         AstTestFactory.instanceCreationExpression2(
-            Keyword.NEW, AstTestFactory.typeName4("C")));
+            Keyword.NEW, AstTestFactory.namedType4("C")));
   }
 
   void test_visitIntegerLiteral() {
@@ -2141,14 +2141,14 @@
     _assertSource(
         "a is! C",
         AstTestFactory.isExpression(AstTestFactory.identifier3("a"), true,
-            AstTestFactory.typeName4("C")));
+            AstTestFactory.namedType4("C")));
   }
 
   void test_visitIsExpression_normal() {
     _assertSource(
         "a is C",
         AstTestFactory.isExpression(AstTestFactory.identifier3("a"), false,
-            AstTestFactory.typeName4("C")));
+            AstTestFactory.namedType4("C")));
   }
 
   void test_visitLabel() {
@@ -2201,7 +2201,7 @@
         '<int>[0, for (e in l) 0, if (b) 1, ...[0]]',
         astFactory.listLiteral(
             null,
-            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+            AstTestFactory.typeArgumentList([AstTestFactory.namedType4('int')]),
             Tokens.openSquareBracket(),
             [
               AstTestFactory.integer(0),
@@ -2267,7 +2267,7 @@
         'const <int>[0]',
         astFactory.listLiteral(
             TokenFactory.tokenFromKeyword(Keyword.CONST),
-            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+            AstTestFactory.typeArgumentList([AstTestFactory.namedType4('int')]),
             Tokens.openSquareBracket(),
             [AstTestFactory.integer(0)],
             Tokens.closeSquareBracket()));
@@ -2285,7 +2285,7 @@
         '<int>[0]',
         astFactory.listLiteral(
             null,
-            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+            AstTestFactory.typeArgumentList([AstTestFactory.namedType4('int')]),
             Tokens.openSquareBracket(),
             [AstTestFactory.integer(0)],
             Tokens.closeSquareBracket()));
@@ -2332,7 +2332,7 @@
         "external T m();",
         AstTestFactory.methodDeclaration(
             null,
-            AstTestFactory.typeName4("T"),
+            AstTestFactory.namedType4("T"),
             null,
             null,
             AstTestFactory.identifier3("m"),
@@ -2357,7 +2357,7 @@
         "T get m {}",
         AstTestFactory.methodDeclaration2(
             null,
-            AstTestFactory.typeName4("T"),
+            AstTestFactory.namedType4("T"),
             Keyword.GET,
             null,
             AstTestFactory.identifier3("m"),
@@ -2370,7 +2370,7 @@
         "T set m(var v) {}",
         AstTestFactory.methodDeclaration2(
             null,
-            AstTestFactory.typeName4("T"),
+            AstTestFactory.namedType4("T"),
             Keyword.SET,
             null,
             AstTestFactory.identifier3("m"),
@@ -2426,7 +2426,7 @@
         "T operator +() {}",
         AstTestFactory.methodDeclaration2(
             null,
-            AstTestFactory.typeName4("T"),
+            AstTestFactory.namedType4("T"),
             null,
             Keyword.OPERATOR,
             AstTestFactory.identifier3("+"),
@@ -2439,7 +2439,7 @@
         "T m() {}",
         AstTestFactory.methodDeclaration2(
             null,
-            AstTestFactory.typeName4("T"),
+            AstTestFactory.namedType4("T"),
             null,
             null,
             AstTestFactory.identifier3("m"),
@@ -2479,7 +2479,7 @@
         "static T m() {}",
         AstTestFactory.methodDeclaration2(
             Keyword.STATIC,
-            AstTestFactory.typeName4("T"),
+            AstTestFactory.namedType4("T"),
             null,
             null,
             AstTestFactory.identifier3("m"),
@@ -2535,7 +2535,7 @@
     _assertSource(
         "m<A>()",
         AstTestFactory.methodInvocation3(null, "m",
-            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('A')])));
+            AstTestFactory.typeArgumentList([AstTestFactory.namedType4('A')])));
   }
 
   void test_visitNamedExpression() {
@@ -2681,8 +2681,8 @@
       astFactory.setOrMapLiteral(
         leftBracket: Tokens.openCurlyBracket(),
         typeArguments: AstTestFactory.typeArgumentList([
-          AstTestFactory.typeName4('String'),
-          AstTestFactory.typeName4('String')
+          AstTestFactory.namedType4('String'),
+          AstTestFactory.namedType4('String')
         ]),
         elements: [
           AstTestFactory.mapLiteralEntry3('a', 'b'),
@@ -2736,8 +2736,8 @@
       astFactory.setOrMapLiteral(
         constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
         typeArguments: AstTestFactory.typeArgumentList([
-          AstTestFactory.typeName4('String'),
-          AstTestFactory.typeName4('String')
+          AstTestFactory.namedType4('String'),
+          AstTestFactory.namedType4('String')
         ]),
         leftBracket: Tokens.openCurlyBracket(),
         elements: [AstTestFactory.mapLiteralEntry3('a', 'b')],
@@ -2762,8 +2762,8 @@
       "<String, String>{'a' : 'b'}",
       astFactory.setOrMapLiteral(
         typeArguments: AstTestFactory.typeArgumentList([
-          AstTestFactory.typeName4('String'),
-          AstTestFactory.typeName4('String')
+          AstTestFactory.namedType4('String'),
+          AstTestFactory.namedType4('String')
         ]),
         leftBracket: Tokens.openCurlyBracket(),
         elements: [AstTestFactory.mapLiteralEntry3('a', 'b')],
@@ -2777,7 +2777,7 @@
       '<int>{0, for (e in l) 0, if (b) 1, ...[0]}',
       astFactory.setOrMapLiteral(
         typeArguments:
-            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+            AstTestFactory.typeArgumentList([AstTestFactory.namedType4('int')]),
         leftBracket: Tokens.openCurlyBracket(),
         elements: [
           AstTestFactory.integer(0),
@@ -2833,7 +2833,7 @@
       astFactory.setOrMapLiteral(
         constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
         typeArguments:
-            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+            AstTestFactory.typeArgumentList([AstTestFactory.namedType4('int')]),
         leftBracket: Tokens.openCurlyBracket(),
         elements: [AstTestFactory.integer(0)],
         rightBracket: Tokens.closeCurlyBracket(),
@@ -2857,7 +2857,7 @@
       '<int>{0}',
       astFactory.setOrMapLiteral(
         typeArguments:
-            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+            AstTestFactory.typeArgumentList([AstTestFactory.namedType4('int')]),
         leftBracket: Tokens.openCurlyBracket(),
         elements: [AstTestFactory.integer(0)],
         rightBracket: Tokens.closeCurlyBracket(),
@@ -2882,19 +2882,19 @@
     _assertSource(
         "final A a",
         AstTestFactory.simpleFormalParameter2(
-            Keyword.FINAL, AstTestFactory.typeName4("A"), "a"));
+            Keyword.FINAL, AstTestFactory.namedType4("A"), "a"));
   }
 
   void test_visitSimpleFormalParameter_type() {
     _assertSource(
         "A a",
         AstTestFactory.simpleFormalParameter4(
-            AstTestFactory.typeName4("A"), "a"));
+            AstTestFactory.namedType4("A"), "a"));
   }
 
   void test_visitSimpleFormalParameter_type_covariant() {
     var expected = AstTestFactory.simpleFormalParameter4(
-        AstTestFactory.typeName4("A"), "a");
+        AstTestFactory.namedType4("A"), "a");
     expected.covariantKeyword =
         TokenFactory.tokenFromKeyword(Keyword.COVARIANT);
     _assertSource("covariant A a", expected);
@@ -2962,6 +2962,64 @@
     _assertSource("super", AstTestFactory.superExpression());
   }
 
+  void test_visitSuperFormalParameter_annotation() {
+    SuperFormalParameter parameter = AstTestFactory.superFormalParameter2('f');
+    parameter.metadata
+        .add(AstTestFactory.annotation(AstTestFactory.identifier3("A")));
+    _assertSource('@A super.f', parameter);
+  }
+
+  void test_visitSuperFormalParameter_functionTyped() {
+    _assertSource(
+        "A super.a(b)",
+        AstTestFactory.superFormalParameter(
+            null,
+            AstTestFactory.namedType4("A"),
+            "a",
+            AstTestFactory.formalParameterList(
+                [AstTestFactory.simpleFormalParameter3("b")])));
+  }
+
+  void test_visitSuperFormalParameter_functionTyped_typeParameters() {
+    _assertSource(
+        "A super.a<E, F>(b)",
+        astFactory.superFormalParameter(
+            type: AstTestFactory.namedType4('A'),
+            superKeyword: TokenFactory.tokenFromKeyword(Keyword.SUPER),
+            period: TokenFactory.tokenFromType(TokenType.PERIOD),
+            identifier: AstTestFactory.identifier3('a'),
+            typeParameters: AstTestFactory.typeParameterList(['E', 'F']),
+            parameters: AstTestFactory.formalParameterList(
+                [AstTestFactory.simpleFormalParameter3("b")])));
+  }
+
+  void test_visitSuperFormalParameter_keyword() {
+    _assertSource("var super.a",
+        AstTestFactory.superFormalParameter(Keyword.VAR, null, "a"));
+  }
+
+  void test_visitSuperFormalParameter_keywordAndType() {
+    _assertSource(
+        "final A super.a",
+        AstTestFactory.superFormalParameter(
+            Keyword.FINAL, AstTestFactory.namedType4("A"), "a"));
+  }
+
+  void test_visitSuperFormalParameter_type() {
+    _assertSource(
+        "A super.a",
+        AstTestFactory.superFormalParameter(
+            null, AstTestFactory.namedType4("A"), "a"));
+  }
+
+  void test_visitSuperFormalParameter_type_covariant() {
+    var expected = AstTestFactory.superFormalParameter(
+        null, AstTestFactory.namedType4("A"), "a");
+    expected.covariantKeyword =
+        TokenFactory.tokenFromKeyword(Keyword.COVARIANT);
+    _assertSource("covariant A super.a", expected);
+  }
+
   void test_visitSwitchCase_multipleLabels() {
     _assertSource(
         "l1: l2: case a: {}",
@@ -3074,15 +3132,15 @@
     _assertSource(
         "try {} on E {}",
         AstTestFactory.tryStatement2(AstTestFactory.block(),
-            [AstTestFactory.catchClause3(AstTestFactory.typeName4("E"))]));
+            [AstTestFactory.catchClause3(AstTestFactory.namedType4("E"))]));
   }
 
   void test_visitTryStatement_catches() {
     _assertSource(
         "try {} on E {} on F {}",
         AstTestFactory.tryStatement2(AstTestFactory.block(), [
-          AstTestFactory.catchClause3(AstTestFactory.typeName4("E")),
-          AstTestFactory.catchClause3(AstTestFactory.typeName4("F"))
+          AstTestFactory.catchClause3(AstTestFactory.namedType4("E")),
+          AstTestFactory.catchClause3(AstTestFactory.namedType4("F"))
         ]));
   }
 
@@ -3091,7 +3149,7 @@
         "try {} on E {} finally {}",
         AstTestFactory.tryStatement3(
             AstTestFactory.block(),
-            [AstTestFactory.catchClause3(AstTestFactory.typeName4("E"))],
+            [AstTestFactory.catchClause3(AstTestFactory.namedType4("E"))],
             AstTestFactory.block()));
   }
 
@@ -3106,45 +3164,45 @@
     _assertSource(
         "<E, F>",
         AstTestFactory.typeArgumentList2(
-            [AstTestFactory.typeName4("E"), AstTestFactory.typeName4("F")]));
+            [AstTestFactory.namedType4("E"), AstTestFactory.namedType4("F")]));
   }
 
   void test_visitTypeArgumentList_single() {
     _assertSource("<E>",
-        AstTestFactory.typeArgumentList2([AstTestFactory.typeName4("E")]));
+        AstTestFactory.typeArgumentList2([AstTestFactory.namedType4("E")]));
   }
 
   void test_visitTypeName_multipleArgs() {
     _assertSource(
         "C<D, E>",
-        AstTestFactory.typeName4("C",
-            [AstTestFactory.typeName4("D"), AstTestFactory.typeName4("E")]));
+        AstTestFactory.namedType4("C",
+            [AstTestFactory.namedType4("D"), AstTestFactory.namedType4("E")]));
   }
 
   void test_visitTypeName_nestedArg() {
     _assertSource(
         "C<D<E>>",
-        AstTestFactory.typeName4("C", [
-          AstTestFactory.typeName4("D", [AstTestFactory.typeName4("E")])
+        AstTestFactory.namedType4("C", [
+          AstTestFactory.namedType4("D", [AstTestFactory.namedType4("E")])
         ]));
   }
 
   void test_visitTypeName_noArgs() {
-    _assertSource("C", AstTestFactory.typeName4("C"));
+    _assertSource("C", AstTestFactory.namedType4("C"));
   }
 
   void test_visitTypeName_noArgs_withQuestion() {
-    _assertSource("C?", AstTestFactory.typeName4("C", null, true));
+    _assertSource("C?", AstTestFactory.namedType4("C", null, true));
   }
 
   void test_visitTypeName_singleArg() {
-    _assertSource(
-        "C<D>", AstTestFactory.typeName4("C", [AstTestFactory.typeName4("D")]));
+    _assertSource("C<D>",
+        AstTestFactory.namedType4("C", [AstTestFactory.namedType4("D")]));
   }
 
   void test_visitTypeName_singleArg_withQuestion() {
     _assertSource("C<D>?",
-        AstTestFactory.typeName4("C", [AstTestFactory.typeName4("D")], true));
+        AstTestFactory.namedType4("C", [AstTestFactory.namedType4("D")], true));
   }
 
   void test_visitTypeParameter_variance_contravariant() {
@@ -3161,7 +3219,7 @@
 
   void test_visitTypeParameter_withExtends() {
     _assertSource("E extends C",
-        AstTestFactory.typeParameter2("E", AstTestFactory.typeName4("C")));
+        AstTestFactory.typeParameter2("E", AstTestFactory.namedType4("C")));
   }
 
   void test_visitTypeParameter_withMetadata() {
@@ -3205,7 +3263,7 @@
     _assertSource(
         "const C a, b",
         AstTestFactory.variableDeclarationList(
-            Keyword.CONST, AstTestFactory.typeName4("C"), [
+            Keyword.CONST, AstTestFactory.namedType4("C"), [
           AstTestFactory.variableDeclaration("a"),
           AstTestFactory.variableDeclaration("b")
         ]));
@@ -3235,7 +3293,7 @@
     _assertSource(
         "C a, b",
         AstTestFactory.variableDeclarationList(
-            null, AstTestFactory.typeName4("C"), [
+            null, AstTestFactory.namedType4("C"), [
           AstTestFactory.variableDeclaration("a"),
           AstTestFactory.variableDeclaration("b")
         ]));
@@ -3255,7 +3313,7 @@
         "C c;",
         AstTestFactory.variableDeclarationStatement(
             null,
-            AstTestFactory.typeName4("C"),
+            AstTestFactory.namedType4("C"),
             [AstTestFactory.variableDeclaration("c")]));
   }
 
@@ -3270,15 +3328,15 @@
     _assertSource(
         "with A, B, C",
         AstTestFactory.withClause([
-          AstTestFactory.typeName4("A"),
-          AstTestFactory.typeName4("B"),
-          AstTestFactory.typeName4("C")
+          AstTestFactory.namedType4("A"),
+          AstTestFactory.namedType4("B"),
+          AstTestFactory.namedType4("C")
         ]));
   }
 
   void test_visitWithClause_single() {
     _assertSource(
-        "with A", AstTestFactory.withClause([AstTestFactory.typeName4("A")]));
+        "with A", AstTestFactory.withClause([AstTestFactory.namedType4("A")]));
   }
 
   void test_visitYieldStatement() {
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
index 26f0785..09360c4 100644
--- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
@@ -64,6 +64,18 @@
     );
   }
 
+  test_identical_constructorReference_aliasIsNotProperRename_differentCount2() async {
+    await resolveTestCode('''
+class C<T, U> {}
+typedef MyC<T> = C;
+const a = identical(MyC.new, C.new);
+''');
+    expect(
+      _evaluateConstant('a'),
+      _boolValue(false),
+    );
+  }
+
   test_identical_constructorReference_aliasIsNotProperRename_differentOrder() async {
     await resolveTestCode('''
 class C<T, U> {}
@@ -124,7 +136,7 @@
     );
   }
 
-  test_identical_constructorReference_aliasIsProperRename_mutualSubtypes() async {
+  test_identical_constructorReference_aliasIsProperRename_mutualSubtypes_dynamic() async {
     await resolveTestCode('''
 class C<T> {}
 typedef MyC<T extends Object?> = C<T>;
@@ -136,6 +148,18 @@
     );
   }
 
+  test_identical_constructorReference_aliasIsProperRename_mutualSubtypes_futureOr() async {
+    await resolveTestCode('''
+class C<T extends num> {}
+typedef MyC<T extends FutureOr<num>> = C<T>;
+const a = identical(MyC<int>.new, MyC<int>.new);
+''');
+    expect(
+      _evaluateConstant('a'),
+      _boolValue(true),
+    );
+  }
+
   test_identical_constructorReference_aliasIsProperRename_uninstantiated() async {
     await resolveTestCode('''
 class C<T> {}
@@ -1500,11 +1524,7 @@
       'c',
       errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT],
     );
-    if (analysisOptions.experimentStatus.constant_update_2018) {
-      expect(result.toIntValue(), 1);
-    } else {
-      expect(result, isNull);
-    }
+    expect(result.toIntValue(), 1);
   }
 
   test_visitConditionalExpression_eager_true_invalid_int() async {
diff --git a/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart b/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart
index 853eb50..82433a76 100644
--- a/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart
+++ b/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart
@@ -642,7 +642,7 @@
 
     var reporter = ErrorReporter(
       listener,
-      NonExistingSource('/test.dart', toUri('/test.dart'), UriKind.FILE_URI),
+      NonExistingSource('/test.dart', toUri('/test.dart')),
       isNonNullableByDefault: false,
     );
 
diff --git a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
index 7a04577..0b35e99 100644
--- a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
+++ b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
@@ -2,10 +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/element/element.dart';
+import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:analyzer/src/dart/micro/cider_byte_store.dart';
 import 'package:analyzer/src/dart/micro/library_graph.dart';
 import 'package:analyzer/src/dart/micro/resolve_file.dart';
+import 'package:analyzer/src/dart/micro/utils.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/lint/registry.dart';
 import 'package:test/test.dart';
@@ -390,10 +394,10 @@
 ''');
 
     await resolveFile(bPath);
-    var result = fileResolver.findReferences(6, aPath);
+    var result = fileResolver.findReferences(_findElement(6, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [6]),
-      CiderSearchMatch(bPath, [42])
+      CiderSearchMatch(bPath, [CharacterLocation(4, 11)]),
+      CiderSearchMatch(aPath, [CharacterLocation(1, 7)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -411,9 +415,10 @@
 ''');
 
     await resolveFile(aPath);
-    var result = fileResolver.findReferences(16, aPath);
+    var result = fileResolver.findReferences(_findElement(16, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [16, 53])
+      CiderSearchMatch(
+          aPath, [CharacterLocation(2, 7), CharacterLocation(5, 5)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -429,9 +434,10 @@
 ''');
 
     await resolveFile(aPath);
-    var result = fileResolver.findReferences(11, aPath);
+    var result = fileResolver.findReferences(_findElement(11, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [11, 28])
+      CiderSearchMatch(
+          aPath, [CharacterLocation(2, 3), CharacterLocation(5, 1)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -454,10 +460,10 @@
 ''');
 
     await resolveFile(bPath);
-    var result = fileResolver.findReferences(20, aPath);
+    var result = fileResolver.findReferences(_findElement(20, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [20]),
-      CiderSearchMatch(bPath, [56])
+      CiderSearchMatch(bPath, [CharacterLocation(5, 15)]),
+      CiderSearchMatch(aPath, [CharacterLocation(2, 11)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -473,9 +479,10 @@
 }
 ''');
     await resolveFile(aPath);
-    var result = fileResolver.findReferences(39, aPath);
+    var result = fileResolver.findReferences(_findElement(39, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [39, 62])
+      CiderSearchMatch(
+          aPath, [CharacterLocation(3, 9), CharacterLocation(4, 11)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -505,10 +512,11 @@
 ''');
 
     await resolveFile(bPath);
-    var result = fileResolver.findReferences(17, aPath);
+    var result = fileResolver.findReferences(_findElement(17, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [17, 68]),
-      CiderSearchMatch(bPath, [46])
+      CiderSearchMatch(bPath, [CharacterLocation(5, 5)]),
+      CiderSearchMatch(
+          aPath, [CharacterLocation(2, 8), CharacterLocation(7, 4)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -531,10 +539,10 @@
 ''');
 
     await resolveFile(bPath);
-    var result = fileResolver.findReferences(21, aPath);
+    var result = fileResolver.findReferences(_findElement(21, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [21]),
-      CiderSearchMatch(bPath, [46])
+      CiderSearchMatch(bPath, [CharacterLocation(5, 5)]),
+      CiderSearchMatch(aPath, [CharacterLocation(2, 12)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -558,10 +566,10 @@
 ''');
 
     await resolveFile(bPath);
-    var result = fileResolver.findReferences(19, aPath);
+    var result = fileResolver.findReferences(_findElement(19, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [19]),
-      CiderSearchMatch(bPath, [39])
+      CiderSearchMatch(bPath, [CharacterLocation(4, 13)]),
+      CiderSearchMatch(aPath, [CharacterLocation(3, 9)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -585,10 +593,10 @@
 ''');
 
     await resolveFile(bPath);
-    var result = fileResolver.findReferences(20, aPath);
+    var result = fileResolver.findReferences(_findElement(20, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [20]),
-      CiderSearchMatch(bPath, [29])
+      CiderSearchMatch(bPath, [CharacterLocation(4, 3)]),
+      CiderSearchMatch(aPath, [CharacterLocation(3, 10)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -605,9 +613,10 @@
 ''');
 
     await resolveFile(aPath);
-    var result = fileResolver.findReferences(10, aPath);
+    var result = fileResolver.findReferences(_findElement(10, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [10, 43])
+      CiderSearchMatch(
+          aPath, [CharacterLocation(1, 11), CharacterLocation(4, 11)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -622,14 +631,18 @@
 }
 ''');
     await resolveFile(aPath);
-    var result = fileResolver.findReferences(10, aPath);
+    var result = fileResolver.findReferences(_findElement(10, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [10, 22, 40])
+      CiderSearchMatch(aPath, [
+        CharacterLocation(1, 11),
+        CharacterLocation(2, 8),
+        CharacterLocation(4, 12)
+      ])
     ];
     expect(result.map((e) => e.path),
         unorderedEquals(expected.map((e) => e.path)));
-    expect(result.map((e) => e.offsets),
-        unorderedEquals(expected.map((e) => e.offsets)));
+    expect(result.map((e) => e.startPositions),
+        unorderedEquals(expected.map((e) => e.startPositions)));
   }
 
   test_findReferences_typedef() async {
@@ -646,10 +659,10 @@
 ''');
 
     await resolveFile(bPath);
-    var result = fileResolver.findReferences(8, aPath);
+    var result = fileResolver.findReferences(_findElement(8, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [8]),
-      CiderSearchMatch(bPath, [25])
+      CiderSearchMatch(bPath, [CharacterLocation(3, 8)]),
+      CiderSearchMatch(aPath, [CharacterLocation(1, 9)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -1266,4 +1279,11 @@
   void _assertRemovedPaths(Matcher matcher) {
     expect(fileResolver.fsState!.testView.removedPaths, matcher);
   }
+
+  Element _findElement(int offset, String filePath) {
+    var resolvedUnit = fileResolver.resolve(path: filePath);
+    var node = NodeLocator(offset).searchWithin(resolvedUnit.unit);
+    var element = getElementOfNode(node);
+    return element!;
+  }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/comment_test.dart b/pkg/analyzer/test/src/dart/resolution/comment_test.dart
index 3d386b9..7735e22 100644
--- a/pkg/analyzer/test/src/dart/resolution/comment_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/comment_test.dart
@@ -15,359 +15,7 @@
 
 @reflectiveTest
 class CommentDriverResolutionTest extends PubPackageResolutionTest {
-  test_error_unqualifiedReferenceToNonLocalStaticMember() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  static void foo() {}
-}
-
-/// [foo]
-class B extends A {}
-''');
-
-    assertElement(
-      findNode.simple('foo]'),
-      findElement.method('foo', of: 'A'),
-    );
-  }
-
-  test_identifier_beforeClass() async {
-    await assertNoErrorsInCode(r'''
-/// [foo]
-class A {
-  foo() {}
-}
-''');
-
-    assertElement(
-      findNode.simple('foo]'),
-      findElement.method('foo'),
-    );
-  }
-
-  test_identifier_beforeConstructor() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  /// [p]
-  A(int p);
-}''');
-
-    assertElement(
-      findNode.simple('p]'),
-      findElement.parameter('p'),
-    );
-  }
-
-  test_identifier_beforeEnum() async {
-    await assertNoErrorsInCode(r'''
-/// This is the [Samurai] kind.
-enum Samurai {
-  /// Use [int].
-  WITH_SWORD,
-  /// Like [WITH_SWORD], but only without one.
-  WITHOUT_SWORD
-}''');
-
-    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 {
-    await assertNoErrorsInCode(r'''
-/// [p]
-foo(int p) {}
-''');
-
-    assertElement(
-      findNode.simple('p]'),
-      findElement.parameter('p'),
-    );
-  }
-
-  test_identifier_beforeFunction_expressionBody() async {
-    await assertNoErrorsInCode(r'''
-/// [p]
-foo(int p) => null;
-''');
-
-    assertElement(
-      findNode.simple('p]'),
-      findElement.parameter('p'),
-    );
-  }
-
-  test_identifier_beforeFunctionTypeAlias() async {
-    await assertNoErrorsInCode(r'''
-/// [p]
-typedef Foo(int p);
-''');
-
-    assertElement(
-      findNode.simple('p]'),
-      findElement.parameter('p'),
-    );
-  }
-
-  test_identifier_beforeGenericTypeAlias() async {
-    await assertNoErrorsInCode(r'''
-/// Can resolve [T], [S], and [p].
-typedef Foo<T> = Function<S>(int p);
-''');
-
-    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 {
-    await assertNoErrorsInCode(r'''
-/// [int]
-get g => null;
-''');
-
-    assertElement(findNode.simple('int]'), intElement);
-  }
-
-  test_identifier_beforeMethod() async {
-    await assertNoErrorsInCode(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});
-}
-''');
-
-    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_class_instanceGetter() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  int get foo => 0;
-}
-
-/// [A.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
-    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
-  }
-
-  test_identifier_class_instanceMethod() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  void foo() {}
-}
-
-/// [A.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
-    assertElement(findNode.simple('foo]'), findElement.method('foo'));
-  }
-
-  test_identifier_class_instanceSetter() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  set foo(int _) {}
-}
-
-/// [A.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
-    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
-  }
-
-  test_identifier_class_staticGetter() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  static int get foo => 0;
-}
-
-/// [A.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
-    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
-  }
-
-  test_identifier_class_staticMethod() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  static void foo() {}
-}
-
-/// [A.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
-    assertElement(findNode.simple('foo]'), findElement.method('foo'));
-  }
-
-  test_identifier_class_staticSetter() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  static set foo(int _) {}
-}
-
-/// [A.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
-    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
-  }
-
-  test_identifier_extension_instanceGetter() async {
-    await assertNoErrorsInCode(r'''
-extension E on int {
-  int get foo => 0;
-}
-
-/// [E.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
-    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
-  }
-
-  test_identifier_extension_instanceMethod() async {
-    await assertNoErrorsInCode(r'''
-extension E on int {
-  void foo() {}
-}
-
-/// [E.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
-    assertElement(findNode.simple('foo]'), findElement.method('foo'));
-  }
-
-  test_identifier_extension_instanceSetter() async {
-    await assertNoErrorsInCode(r'''
-extension E on int {
-  set foo(int _) {}
-}
-
-/// [E.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
-    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
-  }
-
-  test_identifier_extension_staticGetter() async {
-    await assertNoErrorsInCode(r'''
-extension E on int {
-  static int get foo => 0;
-}
-
-/// [E.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
-    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
-  }
-
-  test_identifier_extension_staticMethod() async {
-    await assertNoErrorsInCode(r'''
-extension E on int {
-  static void foo() {}
-}
-
-/// [E.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
-    assertElement(findNode.simple('foo]'), findElement.method('foo'));
-  }
-
-  test_identifier_extension_staticSetter() async {
-    await assertNoErrorsInCode(r'''
-extension E on int {
-  static set foo(int _) {}
-}
-
-/// [E.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
-    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
-  }
-
-  test_identifier_parameter_functionTyped() async {
-    await assertNoErrorsInCode(r'''
-/// [bar]
-foo(int bar()) {}
-''');
-
-    assertElement(
-      findNode.simple('bar]'),
-      findElement.parameter('bar'),
-    );
-  }
-
-  test_identifier_setter() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  /// [x] in A
-  mA() {}
-  set x(value) {}
-}
-
-class B extends A {
-  /// [x] in B
-  mB() {}
-}
-''');
-
-    var x = findElement.setter('x', of: 'A');
-    assertElement(findNode.simple('x] in A'), x);
-    assertElement(findNode.simple('x] in B'), x);
-  }
-
-  test_new() async {
+  test_newKeyword() async {
     await assertErrorsInCode('''
 class A {
   A();
@@ -394,4 +42,356 @@
       findElement.constructor('named', of: 'A'),
     );
   }
+
+  test_prefixedIdentifier_class_instanceGetter() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int get foo => 0;
+}
+
+/// [A.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
+    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
+  }
+
+  test_prefixedIdentifier_class_instanceMethod() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  void foo() {}
+}
+
+/// [A.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
+    assertElement(findNode.simple('foo]'), findElement.method('foo'));
+  }
+
+  test_prefixedIdentifier_class_instanceSetter() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  set foo(int _) {}
+}
+
+/// [A.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
+    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
+  }
+
+  test_prefixedIdentifier_class_staticGetter() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  static int get foo => 0;
+}
+
+/// [A.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
+    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
+  }
+
+  test_prefixedIdentifier_class_staticMethod() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  static void foo() {}
+}
+
+/// [A.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
+    assertElement(findNode.simple('foo]'), findElement.method('foo'));
+  }
+
+  test_prefixedIdentifier_class_staticSetter() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  static set foo(int _) {}
+}
+
+/// [A.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
+    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
+  }
+
+  test_prefixedIdentifier_extension_instanceGetter() async {
+    await assertNoErrorsInCode(r'''
+extension E on int {
+  int get foo => 0;
+}
+
+/// [E.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
+    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
+  }
+
+  test_prefixedIdentifier_extension_instanceMethod() async {
+    await assertNoErrorsInCode(r'''
+extension E on int {
+  void foo() {}
+}
+
+/// [E.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
+    assertElement(findNode.simple('foo]'), findElement.method('foo'));
+  }
+
+  test_prefixedIdentifier_extension_instanceSetter() async {
+    await assertNoErrorsInCode(r'''
+extension E on int {
+  set foo(int _) {}
+}
+
+/// [E.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
+    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
+  }
+
+  test_prefixedIdentifier_extension_staticGetter() async {
+    await assertNoErrorsInCode(r'''
+extension E on int {
+  static int get foo => 0;
+}
+
+/// [E.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
+    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
+  }
+
+  test_prefixedIdentifier_extension_staticMethod() async {
+    await assertNoErrorsInCode(r'''
+extension E on int {
+  static void foo() {}
+}
+
+/// [E.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
+    assertElement(findNode.simple('foo]'), findElement.method('foo'));
+  }
+
+  test_prefixedIdentifier_extension_staticSetter() async {
+    await assertNoErrorsInCode(r'''
+extension E on int {
+  static set foo(int _) {}
+}
+
+/// [E.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
+    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
+  }
+
+  test_simpleIdentifier_beforeClass() async {
+    await assertNoErrorsInCode(r'''
+/// [foo]
+class A {
+  foo() {}
+}
+''');
+
+    assertElement(
+      findNode.simple('foo]'),
+      findElement.method('foo'),
+    );
+  }
+
+  test_simpleIdentifier_beforeConstructor() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  /// [p]
+  A(int p);
+}''');
+
+    assertElement(
+      findNode.simple('p]'),
+      findElement.parameter('p'),
+    );
+  }
+
+  test_simpleIdentifier_beforeEnum() async {
+    await assertNoErrorsInCode(r'''
+/// This is the [Samurai] kind.
+enum Samurai {
+  /// Use [int].
+  WITH_SWORD,
+  /// Like [WITH_SWORD], but only without one.
+  WITHOUT_SWORD
+}''');
+
+    assertElement(
+      findNode.simple('Samurai]'),
+      findElement.enum_('Samurai'),
+    );
+    assertElement(
+      findNode.simple('int]'),
+      intElement,
+    );
+    assertElement(
+      findNode.simple('WITH_SWORD]'),
+      findElement.getter('WITH_SWORD'),
+    );
+  }
+
+  test_simpleIdentifier_beforeFunction_blockBody() async {
+    await assertNoErrorsInCode(r'''
+/// [p]
+foo(int p) {}
+''');
+
+    assertElement(
+      findNode.simple('p]'),
+      findElement.parameter('p'),
+    );
+  }
+
+  test_simpleIdentifier_beforeFunction_expressionBody() async {
+    await assertNoErrorsInCode(r'''
+/// [p]
+foo(int p) => null;
+''');
+
+    assertElement(
+      findNode.simple('p]'),
+      findElement.parameter('p'),
+    );
+  }
+
+  test_simpleIdentifier_beforeFunctionTypeAlias() async {
+    await assertNoErrorsInCode(r'''
+/// [p]
+typedef Foo(int p);
+''');
+
+    assertElement(
+      findNode.simple('p]'),
+      findElement.parameter('p'),
+    );
+  }
+
+  test_simpleIdentifier_beforeGenericTypeAlias() async {
+    await assertNoErrorsInCode(r'''
+/// Can resolve [T], [S], and [p].
+typedef Foo<T> = Function<S>(int p);
+''');
+
+    assertElement(
+      findNode.simple('T]'),
+      findElement.typeParameter('T'),
+    );
+    assertElement(findNode.simple('S]'), findElement.typeParameter('S'));
+    assertElement(
+      findNode.simple('p]'),
+      findElement.parameter('p'),
+    );
+  }
+
+  test_simpleIdentifier_beforeGetter() async {
+    await assertNoErrorsInCode(r'''
+/// [int]
+get g => null;
+''');
+
+    assertElement(findNode.simple('int]'), intElement);
+  }
+
+  test_simpleIdentifier_beforeMethod() async {
+    await assertNoErrorsInCode(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});
+}
+''');
+
+    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_simpleIdentifier_parameter_functionTyped() async {
+    await assertNoErrorsInCode(r'''
+/// [bar]
+foo(int bar()) {}
+''');
+
+    assertElement(
+      findNode.simple('bar]'),
+      findElement.parameter('bar'),
+    );
+  }
+
+  test_simpleIdentifier_setter() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  /// [x] in A
+  mA() {}
+  set x(value) {}
+}
+
+class B extends A {
+  /// [x] in B
+  mB() {}
+}
+''');
+
+    var x = findElement.setter('x', of: 'A');
+    assertElement(findNode.simple('x] in A'), x);
+    assertElement(findNode.simple('x] in B'), x);
+  }
+
+  test_simpleIdentifier_unqualifiedReferenceToNonLocalStaticMember() async {
+    await assertNoErrorsInCode('''
+class A {
+  static void foo() {}
+}
+
+/// [foo]
+class B extends A {}
+''');
+
+    assertElement(
+      findNode.simple('foo]'),
+      findElement.method('foo', of: 'A'),
+    );
+  }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index 148433e..1b491ac 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -36,6 +36,7 @@
   final bool implicitCasts;
   final bool implicitDynamic;
   final List<String> lints;
+  final bool strictCasts;
   final bool strictInference;
   final bool strictRawTypes;
   final List<String> unignorableNames;
@@ -45,6 +46,7 @@
     this.implicitCasts = true,
     this.implicitDynamic = true,
     this.lints = const [],
+    this.strictCasts = false,
     this.strictInference = false,
     this.strictRawTypes = false,
     this.unignorableNames = const [],
@@ -59,8 +61,9 @@
       buffer.writeln('    - $experiment');
     }
     buffer.writeln('  language:');
-    buffer.writeln('    strict-raw-types: $strictRawTypes');
+    buffer.writeln('    strict-casts: $strictCasts');
     buffer.writeln('    strict-inference: $strictInference');
+    buffer.writeln('    strict-raw-types: $strictRawTypes');
     buffer.writeln('  strong-mode:');
     buffer.writeln('    implicit-casts: $implicitCasts');
     buffer.writeln('    implicit-dynamic: $implicitDynamic');
@@ -393,13 +396,14 @@
 }
 
 mixin WithNoImplicitCastsMixin on PubPackageResolutionTest {
+  /// Asserts that no errors are reported in [code] when implicit casts are
+  /// allowed, and that [expectedErrors] are reported for the same [code] when
+  /// implicit casts are not allowed.
   Future<void> assertErrorsWithNoImplicitCasts(
     String code,
-    List<ExpectedError> expectedErrorsWhenImplicitCastsDisabled,
+    List<ExpectedError> expectedErrors,
   ) async {
-    newFile(testFilePath, content: code);
-
-    await resolveTestFile();
+    await resolveTestCode(code);
     assertNoErrorsInResult();
 
     disposeAnalysisContextCollection();
@@ -411,8 +415,13 @@
     );
 
     await resolveTestFile();
-    assertErrorsInResult(expectedErrorsWhenImplicitCastsDisabled);
+    assertErrorsInResult(expectedErrors);
   }
+
+  /// Asserts that no errors are reported in [code], both when implicit casts
+  /// are allowed and when implicit casts are not allowed.
+  Future<void> assertNoErrorsWithNoImplicitCasts(String code) async =>
+      assertErrorsWithNoImplicitCasts(code, []);
 }
 
 mixin WithoutConstructorTearoffsMixin on PubPackageResolutionTest {
@@ -427,3 +436,32 @@
   @override
   bool get typeToStringWithNullability => false;
 }
+
+mixin WithStrictCastsMixin on PubPackageResolutionTest {
+  /// Asserts that no errors are reported in [code] when implicit casts are
+  /// allowed, and that [expectedErrors] are reported for the same [code] when
+  /// implicit casts are not allowed.
+  Future<void> assertErrorsWithStrictCasts(
+    String code,
+    List<ExpectedError> expectedErrors,
+  ) async {
+    await resolveTestCode(code);
+    assertNoErrorsInResult();
+
+    disposeAnalysisContextCollection();
+
+    writeTestPackageAnalysisOptionsFile(
+      AnalysisOptionsFileConfig(
+        strictCasts: true,
+      ),
+    );
+
+    await resolveTestFile();
+    assertErrorsInResult(expectedErrors);
+  }
+
+  /// Asserts that no errors are reported in [code], both when implicit casts
+  /// are allowed and when implicit casts are not allowed.
+  Future<void> assertNoErrorsWithStrictCasts(String code) async =>
+      assertErrorsWithStrictCasts(code, []);
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
index fc226d1..a2dab45 100644
--- a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
@@ -311,13 +311,33 @@
 var x = A.foo<int>;
 ''', [
       error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR, 42,
-          5),
+          5,
+          messageContains: ["'A.foo'"]),
     ]);
 
     assertFunctionReference(findNode.functionReference('A.foo<int>;'),
         findElement.constructor('foo'), 'dynamic');
   }
 
+  test_constructorReference_prefixed() async {
+    await assertErrorsInCode('''
+import 'dart:async' as a;
+var x = a.Future.delayed<int>;
+''', [
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR, 50,
+          5,
+          messageContains: ["'a.Future.delayed'"]),
+    ]);
+    assertFunctionReference(
+        findNode.functionReference('a.Future.delayed<int>;'),
+        findElement
+            .import('dart:async')
+            .importedLibrary!
+            .getType('Future')!
+            .getNamedConstructor('delayed'),
+        'dynamic');
+  }
+
   test_dynamicTyped() async {
     await assertErrorsInCode('''
 dynamic i = 1;
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 feac804..5175800 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
@@ -305,42 +305,48 @@
 
   test_namedArgument_anywhere() async {
     await assertNoErrorsInCode('''
-class A {
-  A(int a, double b, {bool? c, bool? d});
+class A {}
+class B {}
+class C {}
+class D {}
+
+class X {
+  X(A a, B b, {C? c, D? d});
 }
 
+T g1<T>() => throw 0;
+T g2<T>() => throw 0;
+T g3<T>() => throw 0;
+T g4<T>() => throw 0;
+
 void f() {
-  A(0, c: true, 1.2, d: true);
+  X(g1(), c: g3(), g2(), d: g4());
 }
 ''');
 
     assertInstanceCreation(
-      findNode.instanceCreation('A(0'),
-      findElement.class_('A'),
-      'A',
+      findNode.instanceCreation('X(g'),
+      findElement.class_('X'),
+      'X',
     );
 
-    assertParameterElement(
-      findNode.integerLiteral('0'),
-      findElement.parameter('a'),
-    );
+    var g1 = findNode.methodInvocation('g1()');
+    assertType(g1, 'A');
+    assertParameterElement(g1, findElement.parameter('a'));
 
-    assertParameterElement(
-      findNode.doubleLiteral('1.2'),
-      findElement.parameter('b'),
-    );
+    var g2 = findNode.methodInvocation('g2()');
+    assertType(g2, 'B');
+    assertParameterElement(g2, findElement.parameter('b'));
 
-    assertParameterElement(
-      findNode.namedExpression('c: true'),
-      findElement.parameter('c'),
-    );
-    assertNamedParameterRef('c: true', 'c');
+    var named_g3 = findNode.namedExpression('c: g3()');
+    assertType(named_g3.expression, 'C?');
+    assertParameterElement(named_g3, findElement.parameter('c'));
+    assertNamedParameterRef('c:', 'c');
 
-    assertParameterElement(
-      findNode.namedExpression('d: true'),
-      findElement.parameter('d'),
-    );
-    assertNamedParameterRef('d: true', 'd');
+    var named_g4 = findNode.namedExpression('d: g4()');
+    assertType(named_g4.expression, 'D?');
+    assertParameterElement(named_g4, findElement.parameter('d'));
+    assertNamedParameterRef('d:', 'd');
   }
 
   test_typeAlias_generic_class_generic_named_infer_all() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
index 7c96192..b17dc6f 100644
--- a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
@@ -128,7 +128,7 @@
           rightParenthesis: )
         constructorName: ConstructorName
           staticElement: self::@class::A::@constructor::•
-          type: TypeName
+          type: NamedType
             name: SimpleIdentifier
               staticElement: self::@class::A
               staticType: null
@@ -804,7 +804,7 @@
     token: A
   typeArguments: TypeArgumentList
     arguments
-      TypeName
+      NamedType
         name: SimpleIdentifier
           staticElement: dart:core::@class::int
           staticType: null
@@ -855,7 +855,7 @@
     token: A
   typeArguments: TypeArgumentList
     arguments
-      TypeName
+      NamedType
         name: SimpleIdentifier
           staticElement: dart:core::@class::int
           staticType: null
@@ -1202,7 +1202,7 @@
     token: B
   typeArguments: TypeArgumentList
     arguments
-      TypeName
+      NamedType
         name: SimpleIdentifier
           staticElement: dart:core::@class::int
           staticType: null
@@ -1515,7 +1515,7 @@
     staticType: null
   typeArguments: TypeArgumentList
     arguments
-      TypeName
+      NamedType
         name: SimpleIdentifier
           staticElement: dart:core::@class::int
           staticType: null
@@ -1580,7 +1580,7 @@
     staticType: null
   typeArguments: TypeArgumentList
     arguments
-      TypeName
+      NamedType
         name: SimpleIdentifier
           staticElement: dart:core::@class::int
           staticType: null
@@ -1679,7 +1679,7 @@
     token: B
   typeArguments: TypeArgumentList
     arguments
-      TypeName
+      NamedType
         name: SimpleIdentifier
           staticElement: dart:core::@class::int
           staticType: null
@@ -1744,7 +1744,7 @@
     token: B
   typeArguments: TypeArgumentList
     arguments
-      TypeName
+      NamedType
         name: SimpleIdentifier
           staticElement: dart:core::@class::int
           staticType: null
@@ -1911,7 +1911,7 @@
     token: B
   typeArguments: TypeArgumentList
     arguments
-      TypeName
+      NamedType
         name: SimpleIdentifier
           staticElement: dart:core::@class::int
           staticType: null
@@ -1965,7 +1965,7 @@
     token: B
   typeArguments: TypeArgumentList
     arguments
-      TypeName
+      NamedType
         name: SimpleIdentifier
           staticElement: dart:core::@class::int
           staticType: null
diff --git a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
index 32d8c5d..c564c0c 100644
--- a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -2865,40 +2865,46 @@
 
   test_namedArgument_anywhere() async {
     await assertNoErrorsInCode('''
-void foo(int a, double b, {bool? c, bool? d}) {}
+class A {}
+class B {}
+class C {}
+class D {}
+
+void foo(A a, B b, {C? c, D? d}) {}
+
+T g1<T>() => throw 0;
+T g2<T>() => throw 0;
+T g3<T>() => throw 0;
+T g4<T>() => throw 0;
 
 void f() {
-  foo(0, c: true, 1.2, d: true);
+  foo(g1(), c: g3(), g2(), d: g4());
 }
 ''');
 
     assertMethodInvocation(
-      findNode.methodInvocation('foo(0'),
+      findNode.methodInvocation('foo(g'),
       findElement.topFunction('foo'),
-      'void Function(int, double, {bool? c, bool? d})',
+      'void Function(A, B, {C? c, D? d})',
     );
 
-    assertParameterElement(
-      findNode.integerLiteral('0'),
-      findElement.parameter('a'),
-    );
+    var g1 = findNode.methodInvocation('g1()');
+    assertType(g1, 'A');
+    assertParameterElement(g1, findElement.parameter('a'));
 
-    assertParameterElement(
-      findNode.doubleLiteral('1.2'),
-      findElement.parameter('b'),
-    );
+    var g2 = findNode.methodInvocation('g2()');
+    assertType(g2, 'B');
+    assertParameterElement(g2, findElement.parameter('b'));
 
-    assertParameterElement(
-      findNode.namedExpression('c: true'),
-      findElement.parameter('c'),
-    );
-    assertNamedParameterRef('c: true', 'c');
+    var named_g3 = findNode.namedExpression('c: g3()');
+    assertType(named_g3.expression, 'C?');
+    assertParameterElement(named_g3, findElement.parameter('c'));
+    assertNamedParameterRef('c:', 'c');
 
-    assertParameterElement(
-      findNode.namedExpression('d: true'),
-      findElement.parameter('d'),
-    );
-    assertNamedParameterRef('d: true', 'd');
+    var named_g4 = findNode.namedExpression('d: g4()');
+    assertType(named_g4.expression, 'D?');
+    assertParameterElement(named_g4, findElement.parameter('d'));
+    assertNamedParameterRef('d:', 'd');
   }
 
   test_nullShorting_cascade_firstMethodInvocation() async {
diff --git a/pkg/analyzer/test/src/dart/sdk/sdk_test.dart b/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
index 6af1989..6e9b9ef 100644
--- a/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
+++ b/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
@@ -122,17 +122,6 @@
 
 @reflectiveTest
 class FolderBasedDartSdkTest with ResourceProviderMixin {
-  void test_addExtensions() {
-    FolderBasedDartSdk sdk = _createDartSdk();
-    String uri = 'dart:my.internal';
-    sdk.addExtensions({uri: '/Users/user/dart/my.dart'});
-    expect(sdk.mapDartUri(uri), isNotNull);
-    // The `shortName` property must include the `dart:` prefix.
-    expect(sdk.sdkLibraries, contains(predicate((SdkLibrary library) {
-      return library.shortName == uri;
-    })));
-  }
-
   void test_creation() {
     FolderBasedDartSdk sdk = _createDartSdk();
     expect(sdk, isNotNull);
@@ -150,7 +139,6 @@
         .getChildAssumingFile("core.dart")
         .toUri())!;
     expect(source, isNotNull);
-    expect(source.isInSystemLibrary, isTrue);
     expect(source.uri.toString(), "dart:core");
   }
 
@@ -161,7 +149,6 @@
     File file = dirDartium.getChildAssumingFile("html_dart2js.dart");
     var source = sdk.fromFileUri(file.toUri())!;
     expect(source, isNotNull);
-    expect(source.isInSystemLibrary, isTrue);
     expect(source.uri.toString(), "dart:html");
   }
 
@@ -172,7 +159,6 @@
     File file = dirCommon.getChildAssumingFile("html_common_dart2js.dart");
     var source = sdk.fromFileUri(file.toUri())!;
     expect(source, isNotNull);
-    expect(source.isInSystemLibrary, isTrue);
     expect(source.uri.toString(), "dart:html_common");
   }
 
@@ -183,7 +169,6 @@
         .getChildAssumingFile("num.dart")
         .toUri())!;
     expect(source, isNotNull);
-    expect(source.isInSystemLibrary, isTrue);
     expect(source.uri.toString(), "dart:core/num.dart");
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/abi_specific_integer_mapping_test.dart b/pkg/analyzer/test/src/diagnostics/abi_specific_integer_mapping_test.dart
new file mode 100644
index 0000000..746ce71
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/abi_specific_integer_mapping_test.dart
@@ -0,0 +1,81 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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/ffi_code.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AbiSpecificIntegerMappingTest);
+  });
+}
+
+@reflectiveTest
+class AbiSpecificIntegerMappingTest extends PubPackageResolutionTest {
+  test_doubleMapping() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi';
+@AbiSpecificIntegerMapping({})
+@AbiSpecificIntegerMapping({})
+class UintPtr extends AbiSpecificInteger {
+  const UintPtr();
+}
+''', [
+      error(FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_EXTRA, 51, 25),
+    ]);
+  }
+
+  test_invalidMapping() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi';
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: IntPtr(),
+  Abi.androidIA32: UintPtr(),
+})
+class UintPtr extends AbiSpecificInteger {
+  const UintPtr();
+}
+''', [
+      error(FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_UNSUPPORTED, 20, 25),
+    ]);
+  }
+
+  test_noMapping() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi';
+class UintPtr extends AbiSpecificInteger {
+  const UintPtr();
+}
+''', [
+      error(FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_MISSING, 25, 7),
+    ]);
+  }
+
+  test_singleMapping() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:ffi';
+@AbiSpecificIntegerMapping({})
+class UintPtr extends AbiSpecificInteger {
+  const UintPtr();
+}
+''');
+  }
+
+  test_validMapping() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:ffi';
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: Uint64(),
+  Abi.androidIA32: Uint32(),
+})
+class UintPtr extends AbiSpecificInteger {
+  const UintPtr();
+}
+''');
+  }
+}
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
index 60ca6a0..226eafa 100644
--- a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
@@ -11,8 +11,10 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ArgumentTypeNotAssignableTest);
-    defineReflectiveTests(ArgumentTypeNotAssignableWithNoImplicitCastsTest);
+    defineReflectiveTests(
+        ArgumentTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest);
     defineReflectiveTests(ArgumentTypeNotAssignableWithoutNullSafetyTest);
+    defineReflectiveTests(ArgumentTypeNotAssignableWithStrictCastsTest);
   });
 }
 
@@ -656,7 +658,7 @@
 }
 
 @reflectiveTest
-class ArgumentTypeNotAssignableWithNoImplicitCastsTest
+class ArgumentTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest
     extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
   test_functionCall() async {
@@ -708,3 +710,28 @@
     ]);
   }
 }
+
+@reflectiveTest
+class ArgumentTypeNotAssignableWithStrictCastsTest
+    extends PubPackageResolutionTest with WithStrictCastsMixin {
+  test_functionCall() async {
+    await assertErrorsWithStrictCasts('''
+void f(int i) {}
+void foo(dynamic a) {
+  f(a);
+}
+''', [
+      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 43, 1),
+    ]);
+  }
+
+  test_operator() async {
+    await assertErrorsWithStrictCasts('''
+void foo(int i, dynamic a) {
+  i + a;
+}
+''', [
+      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 35, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_num_string_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_num_string_test.dart
index 8acf4e9..b4bcb41 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_num_string_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_num_string_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/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -17,21 +16,14 @@
 @reflectiveTest
 class ConstEvalTypeBoolNumStringTest extends PubPackageResolutionTest {
   test_equal() async {
-    await assertErrorsInCode(
-        r'''
+    await assertNoErrorsInCode(r'''
 class A {
   const A();
 }
 
 const num a = 0;
 const b = a == const A();
-''',
-        IsEnabledByDefault.constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING, 53,
-                    14),
-              ]);
+''');
   }
 
   test_notEqual() async {
diff --git a/pkg/analyzer/test/src/diagnostics/const_with_undefined_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/const_with_undefined_constructor_test.dart
index ee5737d..90bd671 100644
--- a/pkg/analyzer/test/src/diagnostics/const_with_undefined_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_with_undefined_constructor_test.dart
@@ -24,7 +24,23 @@
   return const A.noSuchConstructor();
 }
 ''', [
-      error(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR, 48, 17),
+      error(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR, 48, 17,
+          messageContains: ["class 'A'", "constructor 'noSuchConstructor'"]),
+    ]);
+  }
+
+  test_named_prefixed() async {
+    await assertErrorsInCode(r'''
+import 'dart:async' as a;
+f() {
+  return const a.Future.noSuchConstructor();
+}
+''', [
+      error(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR, 56, 17,
+          messageContains: [
+            "class 'a.Future'",
+            "constructor 'noSuchConstructor'"
+          ]),
     ]);
   }
 
@@ -53,7 +69,26 @@
 }
 ''', [
       error(
-          CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, 51, 1),
+          CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, 51, 1,
+          messageContains: ["'A'"]),
+    ]);
+  }
+
+  test_unnamed_prefixed() async {
+    newFile('$testPackageLibPath/lib1.dart', content: '''
+class A {
+  const A.name();
+}
+''');
+    await assertErrorsInCode(r'''
+import 'lib1.dart' as lib1;
+f() {
+  return const lib1.A();
+}
+''', [
+      error(
+          CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, 49, 6,
+          messageContains: ["'lib1.A'"]),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/field_initializer_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/field_initializer_not_assignable_test.dart
index 07abbcd..767bfa9 100644
--- a/pkg/analyzer/test/src/diagnostics/field_initializer_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/field_initializer_not_assignable_test.dart
@@ -10,7 +10,9 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FieldInitializerNotAssignableTest);
-    defineReflectiveTests(FieldInitializerNotAssignableWithNoImplicitCastsTest);
+    defineReflectiveTests(
+        FieldInitializerNotAssignableWithoutNullSafetyAndNoImplicitCastsTest);
+    defineReflectiveTests(FieldInitializerNotAssignableWithStrictCastsTest);
   });
 }
 
@@ -53,14 +55,34 @@
 }
 
 @reflectiveTest
-class FieldInitializerNotAssignableWithNoImplicitCastsTest
+class FieldInitializerNotAssignableWithoutNullSafetyAndNoImplicitCastsTest
     extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
   test_constructorInitializer() async {
-    await assertErrorsWithNoImplicitCasts(
-      'class A { int i; A(num n) : i = n; }',
+    await assertErrorsWithNoImplicitCasts('''
+class A {
+  int i;
+  A(num n) : i = n;
+}
+''', [
+      error(CompileTimeErrorCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, 36, 1),
+    ]);
+  }
+}
+
+@reflectiveTest
+class FieldInitializerNotAssignableWithStrictCastsTest
+    extends PubPackageResolutionTest with WithStrictCastsMixin {
+  test_constructorInitializer() async {
+    await assertErrorsWithStrictCasts(
+      '''
+class A {
+  int i;
+  A(dynamic a) : i = a;
+}
+''',
       [
-        error(CompileTimeErrorCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, 32, 1),
+        error(CompileTimeErrorCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, 40, 1),
       ],
     );
   }
diff --git a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
index c75dd89..31ecd85 100644
--- a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
@@ -11,6 +11,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(ForInOfInvalidTypeTest);
     defineReflectiveTests(ForInOfInvalidTypeWithoutNullSafetyTest);
+    defineReflectiveTests(ForInOfInvalidTypeWithStrictCastsTest);
   });
 }
 
@@ -183,3 +184,19 @@
 ''');
   }
 }
+
+@reflectiveTest
+class ForInOfInvalidTypeWithStrictCastsTest extends PubPackageResolutionTest
+    with WithStrictCastsMixin {
+  test_forIn() async {
+    await assertErrorsWithStrictCasts('''
+f(dynamic e) {
+  for (var id in e) {
+    id;
+  }
+}
+''', [
+      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE, 32, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart b/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart
index 68e338d..f154d5d 100644
--- a/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart
@@ -22,7 +22,7 @@
   external Pointer notEmpty;
 }
 ''', [
-      error(FfiCode.GENERIC_STRUCT_SUBCLASS, 25, 1),
+      error(FfiCode.GENERIC_STRUCT_SUBCLASS, 25, 1, messageContains: ["'S'"]),
     ]);
   }
 
@@ -33,7 +33,7 @@
   external Pointer notEmpty;
 }
 ''', [
-      error(FfiCode.GENERIC_STRUCT_SUBCLASS, 25, 1),
+      error(FfiCode.GENERIC_STRUCT_SUBCLASS, 25, 1, messageContains: ["'S'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/implicit_dynamic_field_test.dart b/pkg/analyzer/test/src/diagnostics/implicit_dynamic_field_test.dart
index fd002a6..1bfd680 100644
--- a/pkg/analyzer/test/src/diagnostics/implicit_dynamic_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/implicit_dynamic_field_test.dart
@@ -49,7 +49,8 @@
   final f = (<dynamic>[])[0];
 }
 ''', [
-      error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 18, 20),
+      error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 18, 20,
+          messageContains: ["'f'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/initializer_for_non_existent_field_test.dart b/pkg/analyzer/test/src/diagnostics/initializer_for_non_existent_field_test.dart
index 43361f5..e2b6231 100644
--- a/pkg/analyzer/test/src/diagnostics/initializer_for_non_existent_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/initializer_for_non_existent_field_test.dart
@@ -24,7 +24,20 @@
 }
 A a = const A();
 ''', [
-      error(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD, 24, 9),
+      error(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD, 24, 9,
+          messageContains: ["'x'"]),
+    ]);
+  }
+
+  test_getter() async {
+    await assertErrorsInCode('''
+class A {
+  int get x => 0;
+  A() : x = 0;
+}
+''', [
+      error(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD, 36, 5,
+          messageContains: ["'x'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/initializer_for_static_field_test.dart b/pkg/analyzer/test/src/diagnostics/initializer_for_static_field_test.dart
index 6acd087..d556c0b 100644
--- a/pkg/analyzer/test/src/diagnostics/initializer_for_static_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/initializer_for_static_field_test.dart
@@ -33,7 +33,8 @@
   A() : x = 0 {}
 }
 ''', [
-      error(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, 38, 5),
+      error(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, 38, 5,
+          messageContains: ["'x'"]),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_annotation_test.dart
index a72d21b..00abc76 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_annotation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_annotation_test.dart
@@ -110,6 +110,40 @@
     ]);
   }
 
+  test_localVariable_const() async {
+    await assertNoErrorsInCode(r'''
+void f() {
+  const a = 0;
+  @a
+  var b; // ignore:unused_local_variable
+}
+''');
+  }
+
+  test_localVariable_const_withArguments() async {
+    await assertErrorsInCode(r'''
+void f() {
+  const a = 0;
+  @a(0)
+  var b; // ignore:unused_local_variable
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_ANNOTATION, 28, 5),
+    ]);
+  }
+
+  test_localVariable_final() async {
+    await assertErrorsInCode(r'''
+void f() {
+  final a = 0;
+  @a
+  var b; // ignore:unused_local_variable
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_ANNOTATION, 28, 2),
+    ]);
+  }
+
   test_notClass_importWithPrefix() async {
     newFile('$testPackageLibPath/annotations.dart', content: r'''
 class Property {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
index a303efd..726f456 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
@@ -11,8 +11,10 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(InvalidAssignment_ImplicitCallReferenceTest);
     defineReflectiveTests(InvalidAssignmentTest);
-    defineReflectiveTests(InvalidAssignmentWithNoImplicitCastsTest);
+    defineReflectiveTests(
+        InvalidAssignmentWithoutNullSafetyAndNoImplicitCastsTest);
     defineReflectiveTests(InvalidAssignmentWithoutNullSafetyTest);
+    defineReflectiveTests(InvalidAssignmentWithStrictCastsTest);
   });
 }
 
@@ -962,24 +964,27 @@
 }
 
 @reflectiveTest
-class InvalidAssignmentWithNoImplicitCastsTest extends PubPackageResolutionTest
+class InvalidAssignmentWithoutNullSafetyAndNoImplicitCastsTest
+    extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
   test_assignment() async {
-    await assertErrorsWithNoImplicitCasts(
-      'void f(num n, int i) { i = n;}',
-      [
-        error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 27, 1),
-      ],
-    );
+    await assertErrorsWithNoImplicitCasts('''
+void f(num n, int i) {
+  i = n;
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 29, 1),
+    ]);
   }
 
   test_compoundAssignment() async {
-    await assertErrorsWithNoImplicitCasts(
-      'void f(num n, int i) { i += n; }',
-      [
-        error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 28, 1),
-      ],
-    );
+    await assertErrorsWithNoImplicitCasts('''
+void f(num n, int i) {
+  i += n;
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 30, 1),
+    ]);
   }
 
   @failingTest
@@ -1008,11 +1013,11 @@
 
   test_numericOps() async {
     // Regression test for https://github.com/dart-lang/sdk/issues/26912
-    await assertErrorsWithNoImplicitCasts(r'''
+    await assertNoErrorsWithNoImplicitCasts('''
 void f(int x, int y) {
   x += y;
 }
-''', []);
+''');
   }
 
   @failingTest
@@ -1088,3 +1093,16 @@
     ]);
   }
 }
+
+@reflectiveTest
+class InvalidAssignmentWithStrictCastsTest extends PubPackageResolutionTest
+    with WithStrictCastsMixin {
+  test_assignment() async {
+    await assertErrorsWithStrictCasts('''
+dynamic a;
+int b = a;
+''', [
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 19, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_override_of_non_virtual_member_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_override_of_non_virtual_member_test.dart
index 10a52f8..7c31b18 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_override_of_non_virtual_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_override_of_non_virtual_member_test.dart
@@ -35,7 +35,8 @@
   int g = 0;
 }
 ''', [
-      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 113, 1),
+      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 113, 1,
+          messageContains: ["member 'g'", "in 'C'"]),
     ]);
   }
 
@@ -70,7 +71,8 @@
   int get g => 0;
 }
 ''', [
-      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 117, 1),
+      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 117, 1,
+          messageContains: ["member 'g'", "in 'C'"]),
     ]);
   }
 
@@ -228,7 +230,8 @@
   void f() {}
 }
 ''', [
-      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 111, 1),
+      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 111, 1,
+          messageContains: ["member 'f'", "in 'M'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_list_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_list_test.dart
index a47fffd..85db5dc 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_list_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_list_test.dart
@@ -23,7 +23,8 @@
   }
 }
 ''', [
-      error(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST, 39, 1),
+      error(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST, 39, 1,
+          messageContains: ["'E'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_map_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_map_test.dart
index 3c75e1d..d12b1e8 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_map_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_map_test.dart
@@ -23,7 +23,8 @@
   }
 }
 ''', [
-      error(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP, 39, 1),
+      error(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP, 39, 1,
+          messageContains: ["'E'"]),
     ]);
   }
 
@@ -45,7 +46,8 @@
   }
 }
 ''', [
-      error(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP, 47, 1),
+      error(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP, 47, 1,
+          messageContains: ["'E'"]),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_set_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_set_test.dart
index fe0c076..69d6881 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_set_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_set_test.dart
@@ -23,7 +23,8 @@
   }
 }
 ''', [
-      error(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_SET, 39, 1),
+      error(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_SET, 39, 1,
+          messageContains: ["'E'"]),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_covariant_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_covariant_test.dart
new file mode 100644
index 0000000..20b7d5c
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/invalid_use_of_covariant_test.dart
@@ -0,0 +1,121 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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.g.dart';
+import 'package:analyzer/src/error/codes.g.dart';
+import 'package:analyzer/src/generated/parser.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidUseOfCovariantTest);
+  });
+}
+
+@reflectiveTest
+class InvalidUseOfCovariantTest extends PubPackageResolutionTest {
+  test_functionExpression() async {
+    await assertErrorsInCode('''
+Function f = (covariant int x) {};
+''', [
+      error(CompileTimeErrorCode.INVALID_USE_OF_COVARIANT, 14, 9),
+    ]);
+  }
+
+  test_functionType_inFunctionTypedParameterOfInstanceMethod() async {
+    await assertErrorsInCode('''
+class C {
+  void m(void p(covariant int)) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_USE_OF_COVARIANT, 26, 9),
+    ]);
+  }
+
+  test_functionType_inParameterOfInstanceMethod() async {
+    await assertErrorsInCode('''
+class C {
+  void m(void Function(covariant int) p) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_USE_OF_COVARIANT, 33, 9),
+    ]);
+  }
+
+  test_functionType_inTypeAlias() async {
+    await assertErrorsInCode('''
+typedef F = void Function(covariant int);
+''', [
+      error(CompileTimeErrorCode.INVALID_USE_OF_COVARIANT, 26, 9),
+    ]);
+  }
+
+  test_functionType_inTypeArgument() async {
+    await assertErrorsInCode('''
+List<void Function(covariant int)> a = [];
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_USE_OF_COVARIANT, 19, 9),
+      // TODO(srawlins): Recover better from this situation (`covariant` in
+      // parameter in type argument).
+      error(ParserErrorCode.EXPECTED_EXECUTABLE, 43, 1),
+    ]);
+  }
+
+  test_functionType_inTypeParameterBound() async {
+    await assertErrorsInCode('''
+void foo<T extends void Function(covariant int)>() {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_USE_OF_COVARIANT, 33, 9),
+      // TODO(srawlins): Recover better from this situation (`covariant` in
+      // parameter in bound).
+      error(ParserErrorCode.EXPECTED_EXECUTABLE, 54, 1),
+    ]);
+  }
+
+  test_localFunction() async {
+    await assertErrorsInCode('''
+void foo() {
+  void f(covariant int x) {}
+}
+''', [
+      error(HintCode.UNUSED_ELEMENT, 20, 1),
+      error(CompileTimeErrorCode.INVALID_USE_OF_COVARIANT, 22, 9),
+    ]);
+  }
+
+  test_staticFunction() async {
+    await assertErrorsInCode('''
+class C {
+  static void m(covariant int x) {}
+}
+''', [
+      // INVALID_USE_OF_COVARIANT is not reported here; it would be redundant.
+      error(ParserErrorCode.EXTRANEOUS_MODIFIER, 26, 9),
+    ]);
+  }
+
+  test_staticFunction_onMixin() async {
+    await assertErrorsInCode('''
+mixin M {
+  static void m(covariant int x) {}
+}
+''', [
+      // INVALID_USE_OF_COVARIANT is not reported here; it would be redundant.
+      error(ParserErrorCode.EXTRANEOUS_MODIFIER, 26, 9),
+    ]);
+  }
+
+  test_topLevelFunction() async {
+    await assertErrorsInCode('''
+void f(covariant int x) {}
+''', [
+      // INVALID_USE_OF_COVARIANT is not reported here; it would be redundant.
+      error(ParserErrorCode.EXTRANEOUS_MODIFIER, 7, 9),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
index 8d45f28..6a85dc3 100644
--- a/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
@@ -10,8 +10,10 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ListElementTypeNotAssignableTest);
-    defineReflectiveTests(ListElementTypeNotAssignableWithNoImplicitCastsTest);
+    defineReflectiveTests(
+        ListElementTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest);
     defineReflectiveTests(ListElementTypeNotAssignableWithoutNullSafetyTest);
+    defineReflectiveTests(ListElementTypeNotAssignableWithStrictCastsTest);
   });
 }
 
@@ -233,7 +235,7 @@
 }
 
 @reflectiveTest
-class ListElementTypeNotAssignableWithNoImplicitCastsTest
+class ListElementTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest
     extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
   test_ifElement_falseBranch_dynamic() async {
@@ -291,3 +293,37 @@
 class ListElementTypeNotAssignableWithoutNullSafetyTest
     extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, ListElementTypeNotAssignableTestCases {}
+
+@reflectiveTest
+class ListElementTypeNotAssignableWithStrictCastsTest
+    extends PubPackageResolutionTest with WithStrictCastsMixin {
+  test_ifElement_falseBranch() async {
+    await assertErrorsWithStrictCasts('''
+void f(bool c, dynamic a) {
+  <int>[if (c) 0 else a];
+}
+''', [
+      error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 50, 1),
+    ]);
+  }
+
+  test_ifElement_trueBranch() async {
+    await assertErrorsWithStrictCasts('''
+void f(bool c, dynamic a) {
+  <int>[if (c) a];
+}
+''', [
+      error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 43, 1),
+    ]);
+  }
+
+  test_spread() async {
+    await assertErrorsWithStrictCasts('''
+void f(Iterable<dynamic> a) {
+  <int>[...a];
+}
+''', [
+      error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 41, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart
index 1216de7..ca3c915 100644
--- a/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart
@@ -10,8 +10,10 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(MapKeyTypeNotAssignableTest);
-    defineReflectiveTests(MapKeyTypeNotAssignableWithNoImplicitCastsTest);
+    defineReflectiveTests(
+        MapKeyTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest);
     defineReflectiveTests(MapKeyTypeNotAssignableWithoutNullSafetyTest);
+    defineReflectiveTests(MapKeyTypeNotAssignableWithStrictCastsTest);
   });
 }
 
@@ -238,7 +240,7 @@
 }
 
 @reflectiveTest
-class MapKeyTypeNotAssignableWithNoImplicitCastsTest
+class MapKeyTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest
     extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
   test_ifElement_falseBranch_key_dynamic() async {
@@ -302,3 +304,37 @@
 ''');
   }
 }
+
+@reflectiveTest
+class MapKeyTypeNotAssignableWithStrictCastsTest
+    extends PubPackageResolutionTest with WithStrictCastsMixin {
+  test_ifElement_falseBranch() async {
+    await assertErrorsWithStrictCasts('''
+void f(bool c, dynamic a) {
+  <int, int>{if (c) 0: 0 else a: 0};
+}
+''', [
+      error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 58, 1),
+    ]);
+  }
+
+  test_ifElement_trueBranch() async {
+    await assertErrorsWithStrictCasts('''
+void f(bool c, dynamic a) {
+  <int, int>{if (c) a: 0 };
+}
+''', [
+      error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 48, 1),
+    ]);
+  }
+
+  test_spread() async {
+    await assertErrorsWithStrictCasts('''
+void f(Map<dynamic, int> a) {
+  <int, int>{...a};
+}
+''', [
+      error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 46, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart
index 212b70b..4cebc25 100644
--- a/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart
@@ -10,8 +10,10 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(MapValueTypeNotAssignableTest);
-    defineReflectiveTests(MapValueTypeNotAssignableWithNoImplicitCastsTest);
+    defineReflectiveTests(
+        MapValueTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest);
     defineReflectiveTests(MapValueTypeNotAssignableWithoutNullSafetyTest);
+    defineReflectiveTests(MapValueTypeNotAssignableWithStrictCastsTest);
   });
 }
 
@@ -232,7 +234,7 @@
 }
 
 @reflectiveTest
-class MapValueTypeNotAssignableWithNoImplicitCastsTest
+class MapValueTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest
     extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
   test_ifElement_falseBranch_value_dynamic() async {
@@ -296,3 +298,37 @@
 ''');
   }
 }
+
+@reflectiveTest
+class MapValueTypeNotAssignableWithStrictCastsTest
+    extends PubPackageResolutionTest with WithStrictCastsMixin {
+  test_ifElement_falseBranch() async {
+    await assertErrorsWithStrictCasts('''
+void f(bool c, dynamic a) {
+  <int, int>{if (c) 0: 0 else 0: a};
+}
+''', [
+      error(CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 61, 1),
+    ]);
+  }
+
+  test_ifElement_trueBranch() async {
+    await assertErrorsWithStrictCasts('''
+void f(bool c, dynamic a) {
+  <int, int>{if (c) 0: a};
+}
+''', [
+      error(CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 51, 1),
+    ]);
+  }
+
+  test_spread() async {
+    await assertErrorsWithStrictCasts('''
+void f(Map<int, dynamic> a) {
+  <int, int>{...a};
+}
+''', [
+      error(CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 46, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/multiple_super_initializers_test.dart b/pkg/analyzer/test/src/diagnostics/multiple_super_initializers_test.dart
index 8147f29..ef8d48e 100644
--- a/pkg/analyzer/test/src/diagnostics/multiple_super_initializers_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/multiple_super_initializers_test.dart
@@ -15,14 +15,22 @@
 
 @reflectiveTest
 class MultipleSuperInitializersTest extends PubPackageResolutionTest {
+  test_oneSuperInitializer() async {
+    await assertNoErrorsInCode('''
+class A {}
+class B extends A {
+  B() : super() {}
+}
+''');
+  }
+
   test_twoSuperInitializers() async {
-    await assertErrorsInCode(r'''
+    await assertErrorsInCode('''
 class A {}
 class B extends A {
   B() : super(), super() {}
 }
 ''', [
-      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 39, 5),
       error(CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS, 48, 7),
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/new_with_undefined_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/new_with_undefined_constructor_test.dart
index 4ebf06c..4a7c777 100644
--- a/pkg/analyzer/test/src/diagnostics/new_with_undefined_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/new_with_undefined_constructor_test.dart
@@ -30,7 +30,8 @@
   new A();
 }
 ''', [
-      error(CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, 38, 1),
+      error(CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, 38, 1,
+          messageContains: ["'A'"]),
     ]);
   }
 
@@ -47,6 +48,24 @@
     ]);
   }
 
+  test_default_prefixed() async {
+    newFile('$testPackageLibPath/lib1.dart', content: '''
+class A {
+  A.name() {}
+}
+''');
+    await assertErrorsInCode('''
+import 'lib1.dart' as lib1;
+
+f() {
+  new lib1.A();
+}
+''', [
+      error(CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, 41, 6,
+          messageContains: ["'lib1.A'"]),
+    ]);
+  }
+
   test_default_unnamedViaNew() async {
     await assertErrorsInCode('''
 class A {
@@ -102,7 +121,25 @@
   new A.name();
 }
 ''', [
-      error(CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR, 35, 4),
+      error(CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR, 35, 4,
+          messageContains: ["class 'A'", "named 'name'"]),
+    ]);
+  }
+
+  test_named_prefixed() async {
+    newFile('$testPackageLibPath/lib1.dart', content: '''
+class A {
+  A() {}
+}
+''');
+    await assertErrorsInCode('''
+import 'lib1.dart' as lib1;
+f() {
+  new lib1.A.name();
+}
+''', [
+      error(CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR, 47, 4,
+          messageContains: ["class 'lib1.A'", "named 'name'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart b/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart
index 0e9e5de..3f99747 100644
--- a/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart
@@ -10,8 +10,10 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonBoolConditionTest);
-    defineReflectiveTests(NonBoolConditionWithNoImplicitCastsTest);
+    defineReflectiveTests(
+        NonBoolConditionWithoutNullSafetyAndNoImplicitCastsTest);
     defineReflectiveTests(NonBoolConditionWithNullSafetyTest);
+    defineReflectiveTests(NonBoolConditionWithStrictCastsTest);
   });
 }
 
@@ -26,6 +28,21 @@
     ]);
   }
 
+  test_conditional_implicitCast_fromLiteral() async {
+    await assertErrorsInCode('''
+f() { return [1, 2, 3] ? 2 : 1; }
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 13, 9),
+    ]);
+  }
+
+  test_conditional_implicitCast_fromSupertype() async {
+    await assertNoErrorsInCode('''
+Object o;
+f() { return o ? 2 : 1; }
+''');
+  }
+
   test_do() async {
     await assertErrorsInCode(r'''
 f() {
@@ -36,6 +53,26 @@
     ]);
   }
 
+  test_do_implicitCast_fromLiteral() async {
+    await assertErrorsInCode('''
+Object o;
+f() {
+  do {} while ([1, 2, 3]);
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 31, 9),
+    ]);
+  }
+
+  test_do_implicitCast_fromSupertype() async {
+    await assertNoErrorsInCode('''
+Object o;
+f() {
+  do {} while (o);
+}
+''');
+  }
+
   test_for() async {
     // https://github.com/dart-lang/sdk/issues/24713
     await assertErrorsInCode(r'''
@@ -71,6 +108,25 @@
     ]);
   }
 
+  test_for_implicitCast_fromLiteral() async {
+    await assertErrorsInCode('''
+f() {
+  for (;[1, 2, 3];) {}
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 14, 9),
+    ]);
+  }
+
+  test_for_implicitCast_fromSupertype() async {
+    await assertNoErrorsInCode('''
+Object o;
+f() {
+  for (;o;) {}
+}
+''');
+  }
+
   test_forElement() async {
     await assertErrorsInCode('''
 var v = [for (; 0;) 1];
@@ -89,6 +145,24 @@
     ]);
   }
 
+  test_if_implicitCast_fromLiteral() async {
+    await assertErrorsInCode('''
+f() {
+  if ([1, 2, 3]) return 2; else return 1;
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 12, 9),
+    ]);
+  }
+
+  test_if_implicitCast_fromSupertype() async {
+    await assertNoErrorsInCode('''
+f(Object o) {
+  if (o) return 2; else return 1;
+}
+''');
+  }
+
   test_ifElement() async {
     await assertErrorsInCode('''
 var v = [if (3) 1];
@@ -97,6 +171,21 @@
     ]);
   }
 
+  test_ifElement_implicitCast_fromLiteral() async {
+    await assertErrorsInCode('''
+var v = [if ([1, 2, 3]) 'x'];
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 13, 9),
+    ]);
+  }
+
+  test_ifElement_implicitCast_fromSupertype() async {
+    await assertNoErrorsInCode('''
+Object o;
+var v = [if (o) 'x'];
+''');
+  }
+
   test_while() async {
     await assertErrorsInCode(r'''
 f() {
@@ -106,10 +195,52 @@
       error(CompileTimeErrorCode.NON_BOOL_CONDITION, 15, 1),
     ]);
   }
+
+  test_while_implicitCast_fromLiteral() async {
+    await assertErrorsInCode('''
+f() {
+  while ([1, 2, 3]) {}
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 15, 9),
+    ]);
+  }
+
+  test_while_implicitCast_fromSupertype() async {
+    await assertNoErrorsInCode('''
+f(Object o) {
+  while (o) {}
+}
+''');
+  }
 }
 
 @reflectiveTest
-class NonBoolConditionWithNoImplicitCastsTest extends PubPackageResolutionTest
+class NonBoolConditionWithNullSafetyTest extends PubPackageResolutionTest {
+  test_if_null() async {
+    await assertErrorsInCode(r'''
+void f(Null a) {
+  if (a) {}
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 23, 1),
+    ]);
+  }
+
+  test_ternary_condition_null() async {
+    await assertErrorsInCode(r'''
+void f(Null a) {
+  a ? 0 : 1;
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 19, 1),
+    ]);
+  }
+}
+
+@reflectiveTest
+class NonBoolConditionWithoutNullSafetyAndNoImplicitCastsTest
+    extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
   test_map_ifElement_condition_dynamic() async {
     await assertErrorsWithNoImplicitCasts(r'''
@@ -153,26 +284,25 @@
 }
 
 @reflectiveTest
-class NonBoolConditionWithNullSafetyTest extends PubPackageResolutionTest {
-  test_if_null() async {
-    await assertErrorsInCode(r'''
-m() {
-  Null x;
-  if (x) {}
+class NonBoolConditionWithStrictCastsTest extends PubPackageResolutionTest
+    with WithStrictCastsMixin {
+  test_map_ifElement_condition() async {
+    await assertErrorsWithStrictCasts('''
+void f(dynamic c) {
+  <int, int>{if (c) 0: 0};
 }
 ''', [
-      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 22, 1),
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 37, 1),
     ]);
   }
 
-  test_ternary_condition_null() async {
-    await assertErrorsInCode(r'''
-m() {
-  Null x;
-  x ? 0 : 1;
+  test_set_ifElement_condition() async {
+    await assertErrorsWithStrictCasts('''
+void f(dynamic c) {
+  <int>{if (c) 0};
 }
 ''', [
-      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 18, 1),
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 32, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_bool_expression_test.dart b/pkg/analyzer/test/src/diagnostics/non_bool_expression_test.dart
index 0a12cfb..1305b0d 100644
--- a/pkg/analyzer/test/src/diagnostics/non_bool_expression_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_expression_test.dart
@@ -10,6 +10,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonBoolExpressionTest);
+    defineReflectiveTests(NonBoolExpressionWithStrictCastsTest);
   });
 }
 
@@ -47,3 +48,17 @@
     ]);
   }
 }
+
+@reflectiveTest
+class NonBoolExpressionWithStrictCastsTest extends PubPackageResolutionTest
+    with WithStrictCastsMixin {
+  test_assert() async {
+    await assertErrorsWithStrictCasts('''
+void f(dynamic a) {
+  assert(a);
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_EXPRESSION, 29, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/non_bool_negation_expression_test.dart b/pkg/analyzer/test/src/diagnostics/non_bool_negation_expression_test.dart
index 2d2c516..f0578ad 100644
--- a/pkg/analyzer/test/src/diagnostics/non_bool_negation_expression_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_negation_expression_test.dart
@@ -11,6 +11,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(NonBoolNegationExpressionTest);
     defineReflectiveTests(NonBoolNegationExpressionWithNullSafetyTest);
+    defineReflectiveTests(NonBoolNegationExpressionWithStrictCastsTest);
   });
 }
 
@@ -26,20 +27,50 @@
       error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 9, 2),
     ]);
   }
+
+  test_nonBool_implicitCast_fromLiteral() async {
+    await assertErrorsInCode('''
+f() {
+  ![1, 2, 3];
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 9, 9),
+    ]);
+  }
+
+  test_nonBool_implicitCast_fromSupertype() async {
+    await assertNoErrorsInCode('''
+f(Object o) {
+  !o;
+}
+''');
+  }
 }
 
 @reflectiveTest
 class NonBoolNegationExpressionWithNullSafetyTest
     extends PubPackageResolutionTest {
   test_null() async {
-    await assertErrorsInCode(r'''
-m() {
-  Null x;
+    await assertErrorsInCode('''
+void m(Null x) {
   !x;
 }
 ''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
-      error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 19, 1),
+      error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 20, 1),
+    ]);
+  }
+}
+
+@reflectiveTest
+class NonBoolNegationExpressionWithStrictCastsTest
+    extends PubPackageResolutionTest with WithStrictCastsMixin {
+  test_negation() async {
+    await assertErrorsWithStrictCasts(r'''
+void f(dynamic a) {
+  !a;
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 23, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_bool_operand_test.dart b/pkg/analyzer/test/src/diagnostics/non_bool_operand_test.dart
index f3d16b1..1b25120 100644
--- a/pkg/analyzer/test/src/diagnostics/non_bool_operand_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_operand_test.dart
@@ -11,6 +11,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(NonBoolOperandTest);
     defineReflectiveTests(NonBoolOperandWithNullSafetyTest);
+    defineReflectiveTests(NonBoolOperandWithStrictCastsTest);
   });
 }
 
@@ -27,6 +28,34 @@
     ]);
   }
 
+  test_and_left_implicitCast_fromInstanceCreationExpression() async {
+    await assertErrorsInCode('''
+main() {
+  new Object() && true;
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_OPERAND, 11, 12),
+    ]);
+  }
+
+  test_and_left_implicitCast_fromLiteral() async {
+    await assertErrorsInCode('''
+bool f(List<int> left, bool right) {
+  return left && right;
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_OPERAND, 46, 4),
+    ]);
+  }
+
+  test_and_left_implicitCast_fromSupertype() async {
+    await assertNoErrorsInCode('''
+bool f(Object left, bool right) {
+  return left && right;
+}
+''');
+  }
+
   test_and_right() async {
     await assertErrorsInCode(r'''
 bool f(bool left, String right) {
@@ -82,3 +111,17 @@
     ]);
   }
 }
+
+@reflectiveTest
+class NonBoolOperandWithStrictCastsTest extends PubPackageResolutionTest
+    with WithStrictCastsMixin {
+  test_and() async {
+    await assertErrorsWithStrictCasts('''
+void f(dynamic a) {
+  if(a && true) {}
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_OPERAND, 25, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/not_iterable_spread_test.dart b/pkg/analyzer/test/src/diagnostics/not_iterable_spread_test.dart
index d81a21a..d968410 100644
--- a/pkg/analyzer/test/src/diagnostics/not_iterable_spread_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_iterable_spread_test.dart
@@ -11,6 +11,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(NotIterableSpreadTest);
     defineReflectiveTests(NotIterableSpreadWithoutNullSafetyTest);
+    defineReflectiveTests(NotIterableSpreadWithStrictCastsTest);
   });
 }
 
@@ -112,3 +113,27 @@
 @reflectiveTest
 class NotIterableSpreadWithoutNullSafetyTest extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, NotIterableSpreadTestCases {}
+
+@reflectiveTest
+class NotIterableSpreadWithStrictCastsTest extends PubPackageResolutionTest
+    with WithStrictCastsMixin {
+  test_list() async {
+    await assertErrorsWithStrictCasts('''
+void f(dynamic a) {
+  [...a];
+}
+''', [
+      error(CompileTimeErrorCode.NOT_ITERABLE_SPREAD, 26, 1),
+    ]);
+  }
+
+  test_set() async {
+    await assertErrorsWithStrictCasts('''
+void f(dynamic a) {
+  <int>{...a};
+}
+''', [
+      error(CompileTimeErrorCode.NOT_ITERABLE_SPREAD, 31, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/not_map_spread_test.dart b/pkg/analyzer/test/src/diagnostics/not_map_spread_test.dart
index 3c008f9..aa8cf06 100644
--- a/pkg/analyzer/test/src/diagnostics/not_map_spread_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_map_spread_test.dart
@@ -11,6 +11,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(NotMapSpreadTest);
     defineReflectiveTests(NotMapSpreadWithoutNullSafetyTest);
+    defineReflectiveTests(NotMapSpreadWithStrictCastsTest);
   });
 }
 
@@ -102,3 +103,17 @@
 @reflectiveTest
 class NotMapSpreadWithoutNullSafetyTest extends PubPackageResolutionTest
     with NotMapSpreadTestCases, WithoutNullSafetyMixin {}
+
+@reflectiveTest
+class NotMapSpreadWithStrictCastsTest extends PubPackageResolutionTest
+    with WithStrictCastsMixin {
+  test_map() async {
+    await assertErrorsWithStrictCasts('''
+void f(dynamic a) {
+  <int, String>{...a};
+}
+''', [
+      error(CompileTimeErrorCode.NOT_MAP_SPREAD, 39, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/return_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/return_of_invalid_type_test.dart
index 89bab3f..1a11708 100644
--- a/pkg/analyzer/test/src/diagnostics/return_of_invalid_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/return_of_invalid_type_test.dart
@@ -10,8 +10,10 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ReturnOfInvalidTypeTest);
-    defineReflectiveTests(ReturnOfInvalidTypeWithNoImplicitCastsTest);
+    defineReflectiveTests(
+        ReturnOfInvalidTypeWithoutNullSafetyAndNoImplicitCastsTest);
     defineReflectiveTests(ReturnOfInvalidTypeWithoutNullSafetyTest);
+    defineReflectiveTests(ReturnOfInvalidTypeWithStrictCastsTest);
   });
 }
 
@@ -234,6 +236,15 @@
 ''');
   }
 
+  test_function_asyncStar() async {
+    await assertErrorsInCode('''
+Stream<int> f() async* => 3;
+''', [
+      // RETURN_OF_INVALID_TYPE shouldn't be reported in addition to this error.
+      error(CompileTimeErrorCode.RETURN_IN_GENERATOR, 23, 2),
+    ]);
+  }
+
   test_function_sync_block__to_dynamic() async {
     await assertNoErrorsInCode(r'''
 f() {
@@ -430,6 +441,15 @@
     ]);
   }
 
+  test_function_syncStar() async {
+    await assertErrorsInCode('''
+Iterable<int> f() sync* => 3;
+''', [
+      // RETURN_OF_INVALID_TYPE shouldn't be reported in addition to this error.
+      error(CompileTimeErrorCode.RETURN_IN_GENERATOR, 24, 2),
+    ]);
+  }
+
   test_getter_sync_block_String__to_int() async {
     await assertErrorsInCode('''
 int get g {
@@ -529,7 +549,7 @@
 }
 
 @reflectiveTest
-class ReturnOfInvalidTypeWithNoImplicitCastsTest
+class ReturnOfInvalidTypeWithoutNullSafetyAndNoImplicitCastsTest
     extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
   test_return() async {
@@ -553,3 +573,25 @@
 @reflectiveTest
 class ReturnOfInvalidTypeWithoutNullSafetyTest extends PubPackageResolutionTest
     with ReturnOfInvalidTypeTestCases, WithoutNullSafetyMixin {}
+
+@reflectiveTest
+class ReturnOfInvalidTypeWithStrictCastsTest extends PubPackageResolutionTest
+    with WithStrictCastsMixin {
+  test_return() async {
+    await assertErrorsWithStrictCasts('''
+int f(dynamic a) => a;
+''', [
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 20, 1),
+    ]);
+  }
+
+  test_return_async() async {
+    await assertErrorsWithStrictCasts('''
+Future<int> f(dynamic a) async {
+  return a;
+}
+''', [
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 42, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart
index a74f2cc..d5cb62b 100644
--- a/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart
@@ -10,8 +10,10 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetElementTypeNotAssignableTest);
-    defineReflectiveTests(SetElementTypeNotAssignableWithNoImplicitCastsTest);
+    defineReflectiveTests(
+        SetElementTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest);
     defineReflectiveTests(SetElementTypeNotAssignableWithoutNullSafetyTest);
+    defineReflectiveTests(SetElementTypeNotAssignableWithStrictCastsTest);
   });
 }
 
@@ -198,7 +200,7 @@
 }
 
 @reflectiveTest
-class SetElementTypeNotAssignableWithNoImplicitCastsTest
+class SetElementTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest
     extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
   test_ifElement_falseBranch_dynamic() async {
@@ -256,3 +258,37 @@
 class SetElementTypeNotAssignableWithoutNullSafetyTest
     extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, SetElementTypeNotAssignableTestCases {}
+
+@reflectiveTest
+class SetElementTypeNotAssignableWithStrictCastsTest
+    extends PubPackageResolutionTest with WithStrictCastsMixin {
+  test_ifElement_falseBranch() async {
+    await assertErrorsWithStrictCasts('''
+void f(bool c, dynamic a) {
+  <int>{if (c) 0 else a};
+}
+''', [
+      error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 50, 1),
+    ]);
+  }
+
+  test_ifElement_trueBranch() async {
+    await assertErrorsWithStrictCasts('''
+void f(bool c, dynamic a) {
+  <int>{if (c) a};
+}
+''', [
+      error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 43, 1),
+    ]);
+  }
+
+  test_spread() async {
+    await assertErrorsWithStrictCasts('''
+void f(Iterable<dynamic> a) {
+  <int>{...a};
+}
+''', [
+      error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 41, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/subtype_of_ffi_class_test.dart b/pkg/analyzer/test/src/diagnostics/subtype_of_ffi_class_test.dart
index 6e19801..63d6735 100644
--- a/pkg/analyzer/test/src/diagnostics/subtype_of_ffi_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/subtype_of_ffi_class_test.dart
@@ -154,7 +154,18 @@
 import 'dart:ffi';
 class C implements Double {}
 ''', [
-      error(FfiCode.SUBTYPE_OF_FFI_CLASS_IN_IMPLEMENTS, 38, 6),
+      error(FfiCode.SUBTYPE_OF_FFI_CLASS_IN_IMPLEMENTS, 38, 6,
+          messageContains: ["class 'C'", "implement 'Double'"]),
+    ]);
+  }
+
+  test_Double_prefixed() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi' as ffi;
+class C implements ffi.Double {}
+''', [
+      error(FfiCode.SUBTYPE_OF_FFI_CLASS_IN_IMPLEMENTS, 45, 10,
+          messageContains: ["class 'C'", "implement 'ffi.Double'"]),
     ]);
   }
 
@@ -285,7 +296,20 @@
 ''', [
       error(CompileTimeErrorCode.MIXIN_CLASS_DECLARES_CONSTRUCTOR, 32, 6),
       error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 32, 6),
-      error(FfiCode.SUBTYPE_OF_FFI_CLASS_IN_WITH, 32, 6),
+      error(FfiCode.SUBTYPE_OF_FFI_CLASS_IN_WITH, 32, 6,
+          messageContains: ["class 'C'", "mix in 'Double'"]),
+    ]);
+  }
+
+  test_Double_prefixed() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi' as ffi;
+class C with ffi.Double {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_CLASS_DECLARES_CONSTRUCTOR, 39, 10),
+      error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 39, 10),
+      error(FfiCode.SUBTYPE_OF_FFI_CLASS_IN_WITH, 39, 10,
+          messageContains: ["class 'C'", "mix in 'ffi.Double'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart b/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart
index 026be64..969c1be 100644
--- a/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart
@@ -52,7 +52,22 @@
 class C implements S {}
 ''', [
       error(FfiCode.EMPTY_STRUCT, 25, 1),
-      error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS, 64, 1),
+      error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS, 64, 1,
+          messageContains: ["class 'C'", "implement 'S'"]),
+    ]);
+  }
+
+  test_implements_struct_prefixed() async {
+    newFile('$testPackageLibPath/lib1.dart', content: '''
+import 'dart:ffi';
+class S extends Struct {}
+''');
+    await assertErrorsInCode(r'''
+import 'lib1.dart' as lib1;
+class C implements lib1.S {}
+''', [
+      error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS, 47, 6,
+          messageContains: ["class 'C'", "implement 'lib1.S'"]),
     ]);
   }
 
@@ -78,7 +93,24 @@
 ''', [
       error(FfiCode.EMPTY_STRUCT, 25, 1),
       error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 58, 1),
-      error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_WITH, 58, 1),
+      error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_WITH, 58, 1,
+          messageContains: ["class 'C'", "mix in 'S'"]),
+    ]);
+  }
+
+  test_with_struct_prefixed() async {
+    newFile('$testPackageLibPath/lib1.dart', content: '''
+import 'dart:ffi';
+class S extends Struct {}
+''');
+    await assertErrorsInCode(r'''
+import 'lib1.dart' as lib1;
+
+class C with lib1.S {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 42, 6),
+      error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_WITH, 42, 6,
+          messageContains: ["class 'C'", "mix in 'lib1.S'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/super_in_invalid_context_test.dart b/pkg/analyzer/test/src/diagnostics/super_in_invalid_context_test.dart
index 321b5e8..ca2e979 100644
--- a/pkg/analyzer/test/src/diagnostics/super_in_invalid_context_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/super_in_invalid_context_test.dart
@@ -77,7 +77,7 @@
     ]);
   }
 
-  test_constructorFieldInitializer() async {
+  test_constructorInitializer_field() async {
     await assertErrorsInCode(r'''
 class A {
   m() {}
@@ -91,6 +91,37 @@
     ]);
   }
 
+  test_constructorInitializer_super() async {
+    await assertErrorsInCode(r'''
+class S {
+  final int f;
+  S(this.f);
+}
+
+class C extends S {
+  C() : super(super.f);
+}
+''', [
+      error(CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, 75, 5),
+    ]);
+  }
+
+  test_constructorInitializer_this() async {
+    await assertErrorsInCode(r'''
+class S {
+  final int f;
+  S(this.f);
+}
+
+class C extends S {
+  C() : this.other(super.f);
+  C.other(int a) : super(a);
+}
+''', [
+      error(CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, 80, 5),
+    ]);
+  }
+
   test_extension_field_static() async {
     await assertErrorsInCode('''
 class A {
diff --git a/pkg/analyzer/test/src/diagnostics/super_in_redirecting_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/super_in_redirecting_constructor_test.dart
index 9fafaa1..c58d414 100644
--- a/pkg/analyzer/test/src/diagnostics/super_in_redirecting_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/super_in_redirecting_constructor_test.dart
@@ -33,7 +33,6 @@
   A.name() {}
 }
 ''', [
-      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 18, 5),
       error(CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR, 18, 7),
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_super_invocation_test.dart b/pkg/analyzer/test/src/diagnostics/super_invocation_not_last_test.dart
similarity index 66%
rename from pkg/analyzer/test/src/diagnostics/invalid_super_invocation_test.dart
rename to pkg/analyzer/test/src/diagnostics/super_invocation_not_last_test.dart
index 078fecf..6924087 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_super_invocation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/super_invocation_not_last_test.dart
@@ -9,19 +9,19 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(InvalidSuperInvocationTest);
+    defineReflectiveTests(SuperInvocationNotLastTest);
   });
 }
 
 @reflectiveTest
-class InvalidSuperInvocationTest extends PubPackageResolutionTest {
+class SuperInvocationNotLastTest extends PubPackageResolutionTest {
   test_superBeforeAssert() async {
     await assertErrorsInCode(r'''
 class A {
   A(int? x) : super(), assert(x != null);
 }
 ''', [
-      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 24, 5),
+      error(CompileTimeErrorCode.SUPER_INVOCATION_NOT_LAST, 24, 5),
     ]);
   }
 
@@ -32,7 +32,16 @@
   A() : super(), x = 1;
 }
 ''', [
-      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 33, 5),
+      error(CompileTimeErrorCode.SUPER_INVOCATION_NOT_LAST, 33, 5),
     ]);
   }
+
+  test_superIsLast() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  final int x;
+  A() : x = 1, super();
+}
+''');
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 0331a23..4456cef 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -4,6 +4,7 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'abi_specific_integer_mapping_test.dart' as abi_specific_integer_mapping;
 import 'abstract_class_member_test.dart' as abstract_class_member;
 import 'abstract_field_constructor_initializer_test.dart'
     as abstract_field_constructor_initializer;
@@ -344,7 +345,6 @@
     as invalid_required_positional_param;
 import 'invalid_sealed_annotation_test.dart' as invalid_sealed_annotation;
 import 'invalid_super_in_initializer_test.dart' as invalid_super_in_initializer;
-import 'invalid_super_invocation_test.dart' as invalid_super_invocation;
 import 'invalid_type_argument_in_const_list_test.dart'
     as invalid_type_argument_in_const_list;
 import 'invalid_type_argument_in_const_map_test.dart'
@@ -354,6 +354,7 @@
 import 'invalid_uri_test.dart' as invalid_uri;
 import 'invalid_use_of_covariant_in_extension_test.dart'
     as invalid_use_of_covariant_in_extension;
+import 'invalid_use_of_covariant_test.dart' as invalid_use_of_covariant;
 import 'invalid_use_of_internal_member_test.dart'
     as invalid_use_of_internal_member;
 import 'invalid_use_of_protected_member_test.dart'
@@ -624,6 +625,7 @@
 import 'super_in_redirecting_constructor_test.dart'
     as super_in_redirecting_constructor;
 import 'super_initializer_in_object_test.dart' as super_initializer_in_object;
+import 'super_invocation_not_last_test.dart' as super_invocation_not_last;
 import 'switch_case_completes_normally_test.dart'
     as switch_case_completes_normally;
 import 'switch_expression_not_assignable_test.dart'
@@ -720,6 +722,7 @@
 
 main() {
   defineReflectiveSuite(() {
+    abi_specific_integer_mapping.main();
     abstract_class_member.main();
     abstract_field_constructor_initializer.main();
     abstract_field_initializer.main();
@@ -947,11 +950,11 @@
     invalid_required_positional_param.main();
     invalid_sealed_annotation.main();
     invalid_super_in_initializer.main();
-    invalid_super_invocation.main();
     invalid_type_argument_in_const_list.main();
     invalid_type_argument_in_const_map.main();
     invalid_type_argument_in_const_set.main();
     invalid_uri.main();
+    invalid_use_of_covariant.main();
     invalid_use_of_covariant_in_extension.main();
     invalid_use_of_internal_member.main();
     invalid_use_of_protected_member.main();
@@ -1130,6 +1133,7 @@
     super_in_invalid_context.main();
     super_in_redirecting_constructor.main();
     super_initializer_in_object.main();
+    super_invocation_not_last.main();
     switch_case_completes_normally.main();
     switch_expression_not_assignable.main();
     tearoff_of_generative_constructor_of_abstract_class.main();
diff --git a/pkg/analyzer/test/src/diagnostics/type_annotation_deferred_class_test.dart b/pkg/analyzer/test/src/diagnostics/type_annotation_deferred_class_test.dart
index c622fb0..b432e45 100644
--- a/pkg/analyzer/test/src/diagnostics/type_annotation_deferred_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/type_annotation_deferred_class_test.dart
@@ -25,7 +25,8 @@
 class C<T> { const C(); }
 @C<a.D>() main () {}
 ''', [
-      error(CompileTimeErrorCode.TYPE_ANNOTATION_DEFERRED_CLASS, 77, 3),
+      error(CompileTimeErrorCode.TYPE_ANNOTATION_DEFERRED_CLASS, 77, 3,
+          messageContains: ["'a.D'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_constructor_in_initializer_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_constructor_in_initializer_test.dart
index b951089..daee2e5 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_constructor_in_initializer_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_constructor_in_initializer_test.dart
@@ -22,7 +22,8 @@
   B() : super.named();
 }
 ''', [
-      error(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, 39, 13),
+      error(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, 39, 13,
+          messageContains: ["class 'A'", "named 'named'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
index d97a894..a577c7f 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
@@ -36,7 +36,8 @@
 class T {}
 f(T e1) { e1.m = 0; }
 ''', [
-      error(CompileTimeErrorCode.UNDEFINED_SETTER, 24, 1),
+      error(CompileTimeErrorCode.UNDEFINED_SETTER, 24, 1,
+          messageContains: ["the type 'T'"]),
     ]);
   }
 
@@ -99,7 +100,8 @@
 f(var p) {
   f(C.s = 1);
 }''', [
-      error(CompileTimeErrorCode.UNDEFINED_SETTER, 75, 1),
+      error(CompileTimeErrorCode.UNDEFINED_SETTER, 75, 1,
+          messageContains: ["type 'C'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
index 8eec4b2..44ea839 100644
--- a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
@@ -1651,7 +1651,7 @@
   yield* x;
 }
 ''', [
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 37, 1),
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 37, 1),
       error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE_IN_YIELD_EACH,
           37, 1),
     ]);
diff --git a/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart
index ddb8c9c..e064365 100644
--- a/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart
@@ -11,6 +11,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(YieldOfInvalidTypeTest);
     defineReflectiveTests(YieldOfInvalidTypeWithoutNullSafetyTest);
+    defineReflectiveTests(YieldOfInvalidTypeWithStrictCastsTest);
   });
 }
 
@@ -39,7 +40,6 @@
 }
 ''', [
       error(CompileTimeErrorCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE, 0, 3),
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 25, 1),
     ]);
   }
 
@@ -58,7 +58,6 @@
 }
 ''', [
       error(CompileTimeErrorCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE, 0, 13),
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 35, 1),
     ]);
   }
 
@@ -140,7 +139,6 @@
 }
 ''', [
       error(CompileTimeErrorCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE, 0, 3),
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 24, 1),
     ]);
   }
 
@@ -198,7 +196,6 @@
 }
 ''', [
       error(CompileTimeErrorCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE, 0, 11),
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 32, 1),
     ]);
   }
 
@@ -246,7 +243,7 @@
   yield* 0;
 }
 ''', [
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 22, 1),
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 22, 1),
     ]);
   }
 
@@ -257,7 +254,7 @@
   yield* a;
 }
 ''', [
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 41, 1),
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 41, 1),
     ]);
   }
 
@@ -268,7 +265,7 @@
   yield* a;
 }
 ''', [
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 53, 1),
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 53, 1),
     ]);
   }
 
@@ -279,7 +276,7 @@
   yield* a;
 }
 ''', [
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 56, 1),
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 56, 1),
     ]);
   }
 
@@ -303,7 +300,7 @@
 Stream g() => throw 0;
 ''',
         expectedErrorsByNullability(nullable: [
-          error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 34, 3),
+          error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 34, 3),
         ], legacy: []));
   }
 
@@ -335,7 +332,7 @@
 
 Stream<String> g() => throw 0;
 ''', [
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 34, 3),
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 34, 3),
     ]);
   }
 
@@ -375,7 +372,7 @@
   yield* 0;
 }
 ''', [
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 21, 1),
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 21, 1),
     ]);
   }
 
@@ -388,7 +385,7 @@
   f;
 }
 ''', [
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 41, 1),
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 41, 1),
     ]);
   }
 
@@ -412,7 +409,7 @@
 Iterable g() => throw 0;
 ''',
         expectedErrorsByNullability(nullable: [
-          error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 35, 3),
+          error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 35, 3),
         ], legacy: []));
   }
 
@@ -444,7 +441,7 @@
 
 Iterable<String> g() => throw 0;
 ''', [
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 35, 3),
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 35, 3),
     ]);
   }
 }
@@ -452,3 +449,27 @@
 @reflectiveTest
 class YieldOfInvalidTypeWithoutNullSafetyTest extends PubPackageResolutionTest
     with YieldOfInvalidTypeTestCases, WithoutNullSafetyMixin {}
+
+@reflectiveTest
+class YieldOfInvalidTypeWithStrictCastsTest extends PubPackageResolutionTest
+    with WithStrictCastsMixin {
+  test_yieldEach_asyncStar() async {
+    await assertErrorsWithStrictCasts('''
+f(dynamic a) async* {
+  yield* a;
+}
+''', [
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 31, 1),
+    ]);
+  }
+
+  test_yieldEach_syncStar() async {
+    await assertErrorsWithStrictCasts('''
+f(dynamic a) sync* {
+  yield* a;
+}
+''', [
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 30, 1),
+    ]);
+  }
+}
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
index 4212464..5beaead 100644
--- a/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
+++ b/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
@@ -488,6 +488,29 @@
     expect(result.value!.toIntValue(), 3);
   }
 
+  test_hasValue_constantReference() async {
+    await resolve('''
+const a = 42;
+var x = a;
+''');
+    var result = _evaluateX();
+    expect(result.errors, isEmpty);
+    expect(result.value!.toIntValue(), 42);
+  }
+
+  test_hasValue_constantReference_imported() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+const a = 42;
+''');
+    await resolve('''
+import 'a.dart';
+var x = a;
+''');
+    var result = _evaluateX();
+    expect(result.errors, isEmpty);
+    expect(result.value!.toIntValue(), 42);
+  }
+
   test_hasValue_intLiteral() async {
     await resolve('''
 var x = 42;
diff --git a/pkg/analyzer/test/src/lint/pub_test.dart b/pkg/analyzer/test/src/lint/pub_test.dart
index 4e71879..db3a2d0 100644
--- a/pkg/analyzer/test/src/lint/pub_test.dart
+++ b/pkg/analyzer/test/src/lint/pub_test.dart
@@ -27,6 +27,13 @@
       name: transmogrify
       url: http://your-package-server.com
     version: '>=0.4.0 <1.0.0'
+  transmogrify_optional_name:
+    hosted:
+      url: http://your-package-server.com
+    version: '>=0.4.0 <1.0.0'
+  transmogrify_short_form:
+    hosted: http://your-package-server.com
+    version: '>=0.4.0 <1.0.0'
   analyzer: '0.24.0-dev.1'
   cli_util: '>=0.0.1 <0.1.0'
   semver: '>=0.2.0 <0.3.0'
@@ -43,6 +50,8 @@
   unittest: '>=0.11.0 <0.12.0'
 dependency_overrides:
   foo: 1.2.0
+repository: https://github.com/dart-lang/linter
+issue_tracker: https://github.com/dart-lang/linter/issues
 """;
 
   Pubspec ps = Pubspec.parse(src);
@@ -65,6 +74,10 @@
       });
       testValue('homepage', ps.homepage,
           equals('https://github.com/dart-lang/linter'));
+      testValue('repository', ps.repository,
+          equals('https://github.com/dart-lang/linter'));
+      testValue('issue_tracker', ps.issueTracker,
+          equals('https://github.com/dart-lang/linter/issues'));
       testValue(
           'description', ps.description, equals('Style linter for Dart.'));
       testValue('version', ps.version, equals('0.0.1'));
@@ -108,6 +121,26 @@
         testValueSpan('name', host.name, startOffset: 243, endOffset: 255);
       });
 
+      group('hosted (optional name)', () {
+        PSDependency dep =
+            findDependency(ps.dependencies, name: 'transmogrify_optional_name');
+        PSHost host = dep.host!;
+        test('name', () => expect(host.name, isNull));
+        testValue('url', host.url, equals('http://your-package-server.com'));
+        testKeySpan('url', host.url, startOffset: 376, endOffset: 379);
+        testValueSpan('url', host.url, startOffset: 381, endOffset: 411);
+      });
+
+      group('hosted (short-form)', () {
+        PSDependency dep =
+            findDependency(ps.dependencies, name: 'transmogrify_short_form');
+        PSHost host = dep.host!;
+        test('name', () => expect(host.name, isNull));
+        testValue('url', host.url, equals('http://your-package-server.com'));
+        testKeySpan('url', host.url, startOffset: 473, endOffset: 479);
+        testValueSpan('url', host.url, startOffset: 481, endOffset: 511);
+      });
+
       group('git', () {
         PSDependency dep = findDependency(ps.dependencies, name: 'kittens');
         PSGitRepo git = dep.git!;
diff --git a/pkg/analyzer/test/src/services/available_declarations_test.dart b/pkg/analyzer/test/src/services/available_declarations_test.dart
index 17908dd..357ca89 100644
--- a/pkg/analyzer/test/src/services/available_declarations_test.dart
+++ b/pkg/analyzer/test/src/services/available_declarations_test.dart
@@ -914,6 +914,75 @@
     ]);
   }
 
+  /// https://github.com/dart-lang/sdk/issues/47804
+  test_updated_exported2() 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');
+
+    newFile(a, content: r'''
+class A {}
+''');
+    newFile(b, content: r'''
+class B {}
+''');
+    newFile(c, content: r'''
+export 'a.dart';
+export 'b.dart';
+class C {}
+''');
+    tracker.addContext(testAnalysisContext);
+
+    await _doAllTrackerWork();
+    _assertHasLibrary('package:test/c.dart', declarations: [
+      _ExpectedDeclaration.class_('A', [
+        _ExpectedDeclaration.constructor(''),
+      ]),
+      _ExpectedDeclaration.class_('B', [
+        _ExpectedDeclaration.constructor(''),
+      ]),
+      _ExpectedDeclaration.class_('C', [
+        _ExpectedDeclaration.constructor(''),
+      ]),
+    ]);
+
+    changes.clear();
+
+    newFile(a, content: r'''
+class A2 {}
+''');
+    newFile(b, content: r'''
+class B2 {}
+''');
+    tracker.changeFile(a);
+    tracker.changeFile(b);
+    await _doAllTrackerWork();
+
+    // In general it is OK to get duplicate libraries.
+    // But here we notified about both `a.dart` and `b.dart` changes before
+    // performing any work. So, there is no reason do handle `c.dart` twice.
+    var uniquePathSet = <String>{};
+    for (var change in changes) {
+      for (var library in change.changed) {
+        if (!uniquePathSet.add(library.path)) {
+          fail('Not unique path: ${library.path}');
+        }
+      }
+    }
+
+    _assertHasLibrary('package:test/c.dart', declarations: [
+      _ExpectedDeclaration.class_('A2', [
+        _ExpectedDeclaration.constructor(''),
+      ]),
+      _ExpectedDeclaration.class_('B2', [
+        _ExpectedDeclaration.constructor(''),
+      ]),
+      _ExpectedDeclaration.class_('C', [
+        _ExpectedDeclaration.constructor(''),
+      ]),
+    ]);
+  }
+
   test_updated_library() async {
     var a = convertPath('/home/test/lib/a.dart');
     var b = convertPath('/home/test/lib/b.dart');
diff --git a/pkg/analyzer/test/src/source/source_resource_test.dart b/pkg/analyzer/test/src/source/source_resource_test.dart
index fb3b7b8a..901d10f 100644
--- a/pkg/analyzer/test/src/source/source_resource_test.dart
+++ b/pkg/analyzer/test/src/source/source_resource_test.dart
@@ -83,6 +83,7 @@
     expect(source2.hashCode, source1.hashCode);
   }
 
+  @Deprecated('Use uri.isScheme("dart") instead')
   void test_isInSystemLibrary_contagious() {
     DartSdk sdk = _createSdk();
     UriResolver resolver = DartUriResolver(sdk);
@@ -95,6 +96,7 @@
     expect(partSource.isInSystemLibrary, isTrue);
   }
 
+  @Deprecated('Use uri.isScheme("dart") instead')
   void test_isInSystemLibrary_false() {
     File file = getFile("/does/not/exist.dart");
     FileSource source = FileSource(file);
@@ -159,7 +161,7 @@
     FileSource source = FileSource(file, Uri.parse("dart:core"));
     expect(source, isNotNull);
     expect(source.fullName, file.path);
-    expect(source.isInSystemLibrary, isTrue);
+    expect(source.uri.toString(), 'dart:core');
   }
 
   DartSdk _createSdk() {
diff --git a/pkg/analyzer/test/src/summary/in_summary_source_test.dart b/pkg/analyzer/test/src/summary/in_summary_source_test.dart
index 570ebce..2e8ef04 100644
--- a/pkg/analyzer/test/src/summary/in_summary_source_test.dart
+++ b/pkg/analyzer/test/src/summary/in_summary_source_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index 11f3116..3f5806f 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -1036,8 +1036,7 @@
   @override
   void visitNamedType(NamedType node) {
     _writeNextCodeLine(node);
-    // TODO(scheglov) Change to NamedType.
-    _writeln('TypeName');
+    _writeln('NamedType');
     _withIndent(() {
       _writeNode('name', node.name);
       _writeType('type', node.type);
@@ -1439,8 +1438,7 @@
     _writeln('TypeLiteral');
     _withIndent(() {
       var properties = _Properties();
-      // TODO(scheglov) Change to 'type'.
-      properties.addNode('typeName', node.type);
+      properties.addNode('type', node.type);
       _addExpression(properties, node);
       _writeProperties(properties);
     });
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
index b1f2a75..6378283 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
@@ -13,11 +13,13 @@
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/summary2/bundle_reader.dart';
 import 'package:analyzer/src/summary2/informative_data.dart';
 import 'package:analyzer/src/summary2/link.dart';
 import 'package:analyzer/src/summary2/linked_element_factory.dart';
 import 'package:analyzer/src/summary2/reference.dart';
+import 'package:analyzer/src/util/uri.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'element_text.dart';
@@ -60,7 +62,7 @@
     for (var sdkLibrary in sdk.sdkLibraries) {
       var source = sourceFactory.resolveUri(null, sdkLibrary.shortName)!;
       var text = getFile(source.fullName).readAsStringSync();
-      var unit = parseText(text, featureSet);
+      var unit = parseText(source, text, featureSet);
 
       var inputUnits = <LinkInputUnit>[];
       _addLibraryUnits(source, unit, inputUnits, featureSet);
@@ -143,7 +145,7 @@
       );
     }
 
-    return elementFactory.libraryOfUri('${source.uri}')!;
+    return elementFactory.libraryOfUri2('${source.uri}');
   }
 
   void setUp() {
@@ -178,7 +180,7 @@
 
         if (partSource != null) {
           var text = _readSafely(partSource.fullName);
-          var unit = parseText(text, featureSet);
+          var unit = parseText(partSource, text, featureSet);
           units.add(
             LinkInputUnit(
               partDirectiveIndex: partDirectiveIndex,
@@ -196,16 +198,14 @@
   void _addNonDartLibraries(
     Set<Source> addedLibraries,
     List<LinkInputLibrary> libraries,
-    Source? source,
+    Source source,
   ) {
-    if (source == null ||
-        source.uri.isScheme('dart') ||
-        !addedLibraries.add(source)) {
+    if (source.uri.isScheme('dart') || !addedLibraries.add(source)) {
       return;
     }
 
     var text = _readSafely(source.fullName);
-    var unit = parseText(text, featureSet);
+    var unit = parseText(source, text, featureSet);
 
     var units = <LinkInputUnit>[];
     _addLibraryUnits(source, unit, units, featureSet);
@@ -217,8 +217,29 @@
     );
 
     void addRelativeUriStr(StringLiteral uriNode) {
-      var uriStr = uriNode.stringValue;
-      var uriSource = sourceFactory.resolveUri(source, uriStr);
+      var relativeUriStr = uriNode.stringValue;
+      if (relativeUriStr == null) {
+        return;
+      }
+
+      Uri relativeUri;
+      try {
+        relativeUri = Uri.parse(relativeUriStr);
+      } on FormatException {
+        return;
+      }
+
+      var absoluteUri = resolveRelativeUri(source.uri, relativeUri);
+      var rewrittenUri = rewriteFileToPackageUri(sourceFactory, absoluteUri);
+      if (rewrittenUri == null) {
+        return;
+      }
+
+      var uriSource = sourceFactory.forUri2(rewrittenUri);
+      if (uriSource == null) {
+        return;
+      }
+
       _addNonDartLibraries(addedLibraries, libraries, uriSource);
     }
 
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 25f182d..bdfa95c 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -72,8 +72,7 @@
 
   Source addSource(String path, String contents) {
     var file = newFile(path, content: contents);
-    var fileSource = file.createSource();
-    var uri = sourceFactory.restoreUri(fileSource)!;
+    var uri = sourceFactory.pathToUri(file.path)!;
     return sourceFactory.forUri2(uri)!;
   }
 
@@ -6187,7 +6186,7 @@
               staticType: num
               token: a @27
             staticType: int
-            type: TypeName
+            type: NamedType
               name: SimpleIdentifier
                 staticElement: dart:core::@class::int
                 staticType: null
@@ -6399,7 +6398,7 @@
               staticElement: ConstructorMember
                 base: self::@class::C::@constructor::•
                 substitution: {T: int}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -6429,7 +6428,7 @@
               staticElement: ConstructorMember
                 base: self::@class::C::@constructor::named
                 substitution: {T: int}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -6486,7 +6485,7 @@
                 token: named @37
               period: . @36
               staticElement: self::@class::A::@constructor::named
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::A
                   staticType: null
@@ -6583,7 +6582,7 @@
               int
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -6717,7 +6716,7 @@
                   staticElement: ConstructorMember
                     base: self::@class::P1::@constructor::•
                     substitution: {T: dynamic}
-                  type: TypeName
+                  type: NamedType
                     name: SimpleIdentifier
                       staticElement: self::@class::P1
                       staticType: null
@@ -6732,7 +6731,7 @@
                   staticElement: ConstructorMember
                     base: self::@class::P2::@constructor::•
                     substitution: {T: int}
-                  type: TypeName
+                  type: NamedType
                     name: SimpleIdentifier
                       staticElement: self::@class::P2
                       staticType: null
@@ -6740,7 +6739,7 @@
                     type: P2<int>
                     typeArguments: TypeArgumentList
                       arguments
-                        TypeName
+                        NamedType
                           name: SimpleIdentifier
                             staticElement: dart:core::@class::int
                             staticType: null
@@ -7029,7 +7028,7 @@
               staticElement: ConstructorMember
                 base: self::@class::C::@constructor::named
                 substitution: {K: int, V: String}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -7037,13 +7036,13 @@
                 type: C<int, String>
                 typeArguments: TypeArgumentList
                   arguments
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::int
                         staticType: null
                         token: int @63
                       type: int
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::String
                         staticType: null
@@ -7099,7 +7098,7 @@
               staticElement: ConstructorMember
                 base: a.dart::@class::C::@constructor::named
                 substitution: {K: int, V: String}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: a.dart::@class::C
                   staticType: null
@@ -7107,13 +7106,13 @@
                 type: C<int, String>
                 typeArguments: TypeArgumentList
                   arguments
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::int
                         staticType: null
                         token: int @35
                       type: int
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::String
                         staticType: null
@@ -7169,7 +7168,7 @@
               staticElement: ConstructorMember
                 base: a.dart::@class::C::@constructor::named
                 substitution: {K: int, V: String}
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: a.dart::@class::C
@@ -7185,13 +7184,13 @@
                 type: C<int, String>
                 typeArguments: TypeArgumentList
                   arguments
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::int
                         staticType: null
                         token: int @42
                       type: int
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::String
                         staticType: null
@@ -7238,7 +7237,7 @@
               staticElement: ConstructorMember
                 base: self::@class::C::@constructor::•
                 substitution: {K: dynamic, V: dynamic}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -7283,7 +7282,7 @@
               staticElement: ConstructorMember
                 base: self::@class::C::@constructor::•
                 substitution: {K: int, V: String}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -7291,13 +7290,13 @@
                 type: C<int, String>
                 typeArguments: TypeArgumentList
                   arguments
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::int
                         staticType: null
                         token: int @49
                       type: int
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::String
                         staticType: null
@@ -7340,7 +7339,7 @@
               staticElement: ConstructorMember
                 base: a.dart::@class::C::@constructor::•
                 substitution: {K: int, V: String}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: a.dart::@class::C
                   staticType: null
@@ -7348,13 +7347,13 @@
                 type: C<int, String>
                 typeArguments: TypeArgumentList
                   arguments
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::int
                         staticType: null
                         token: int @35
                       type: int
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::String
                         staticType: null
@@ -7397,7 +7396,7 @@
               staticElement: ConstructorMember
                 base: a.dart::@class::C::@constructor::•
                 substitution: {K: int, V: String}
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: a.dart::@class::C
@@ -7413,13 +7412,13 @@
                 type: C<int, String>
                 typeArguments: TypeArgumentList
                   arguments
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::int
                         staticType: null
                         token: int @42
                       type: int
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::String
                         staticType: null
@@ -7504,7 +7503,7 @@
                 token: named @91
               period: . @90
               staticElement: self::@class::C::@constructor::named
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -7548,7 +7547,7 @@
                 token: named @35
               period: . @34
               staticElement: a.dart::@class::C::@constructor::named
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: a.dart::@class::C
                   staticType: null
@@ -7592,7 +7591,7 @@
                 token: named @42
               period: . @41
               staticElement: a.dart::@class::C::@constructor::named
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: a.dart::@class::C
@@ -7641,7 +7640,7 @@
                 token: named @29
               period: . @28
               staticElement: <null>
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -7672,7 +7671,7 @@
               rightParenthesis: ) @24
             constructorName: ConstructorName
               staticElement: <null>
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: <null>
@@ -7723,7 +7722,7 @@
                 token: named @42
               period: . @41
               staticElement: <null>
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: a.dart::@class::C
@@ -7771,7 +7770,7 @@
                 token: named @42
               period: . @41
               staticElement: <null>
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: <null>
@@ -7815,7 +7814,7 @@
                 token: named @20
               period: . @19
               staticElement: <null>
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: <null>
@@ -7867,7 +7866,7 @@
                 token: named @32
               period: . @31
               staticElement: <null>
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -7905,7 +7904,7 @@
               rightParenthesis: ) @43
             constructorName: ConstructorName
               staticElement: self::@class::C::@constructor::•
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -7944,7 +7943,7 @@
               rightParenthesis: ) @35
             constructorName: ConstructorName
               staticElement: a.dart::@class::C::@constructor::•
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: a.dart::@class::C
                   staticType: null
@@ -7983,7 +7982,7 @@
               rightParenthesis: ) @42
             constructorName: ConstructorName
               staticElement: a.dart::@class::C::@constructor::•
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: a.dart::@class::C
@@ -8022,7 +8021,7 @@
               rightParenthesis: ) @18
             constructorName: ConstructorName
               staticElement: <null>
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: <null>
                   staticType: null
@@ -8057,7 +8056,7 @@
               rightParenthesis: ) @42
             constructorName: ConstructorName
               staticElement: <null>
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: <null>
@@ -8096,7 +8095,7 @@
               rightParenthesis: ) @20
             constructorName: ConstructorName
               staticElement: <null>
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: <null>
@@ -8143,7 +8142,7 @@
               token: a @23
             isOperator: is @25
             staticType: bool
-            type: TypeName
+            type: NamedType
               name: SimpleIdentifier
                 staticElement: dart:core::@class::int
                 staticType: null
@@ -8509,7 +8508,7 @@
             staticType: List<int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -8552,7 +8551,7 @@
             staticType: List<int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -8620,7 +8619,7 @@
                   staticType: List<int>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::int
                           staticType: null
@@ -8634,7 +8633,7 @@
             staticType: List<int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -8673,7 +8672,7 @@
                   staticType: List<int>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::int
                           staticType: null
@@ -8687,7 +8686,7 @@
             staticType: List<int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -8732,13 +8731,13 @@
             staticType: Map<int, int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
                     token: int @24
                   type: int
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -8828,13 +8827,13 @@
                   staticType: Map<int, int>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::int
                           staticType: null
                           token: int @38
                         type: int
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::int
                           staticType: null
@@ -8849,13 +8848,13 @@
             staticType: Map<int, int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
                     token: int @24
                   type: int
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -8899,13 +8898,13 @@
                   staticType: Map<int, int>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::int
                           staticType: null
                           token: int @39
                         type: int
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::int
                           staticType: null
@@ -8920,13 +8919,13 @@
             staticType: Map<int, int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
                     token: int @24
                   type: int
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -8970,7 +8969,7 @@
               int
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -10345,7 +10344,7 @@
             staticType: Set<int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -10426,7 +10425,7 @@
                   staticType: Set<int>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::int
                           staticType: null
@@ -10441,7 +10440,7 @@
             staticType: Set<int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -10481,7 +10480,7 @@
                   staticType: Set<int>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::int
                           staticType: null
@@ -10496,7 +10495,7 @@
             staticType: Set<int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -11495,7 +11494,7 @@
             staticType: List<Null>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::Null
                     staticType: null
@@ -11523,7 +11522,7 @@
             staticType: List<dynamic>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dynamic@-1
                     staticType: null
@@ -11551,7 +11550,7 @@
             staticType: List<int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -11569,7 +11568,7 @@
             staticType: List<List<dynamic>>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::List
                     staticType: null
@@ -11587,7 +11586,7 @@
             staticType: List<List<String>>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::List
                     staticType: null
@@ -11595,7 +11594,7 @@
                   type: List<String>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::String
                           staticType: null
@@ -11615,7 +11614,7 @@
             staticType: List<Map<int, List<String>>>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::Map
                     staticType: null
@@ -11623,13 +11622,13 @@
                   type: Map<int, List<String>>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::int
                           staticType: null
                           token: int @288
                         type: int
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::List
                           staticType: null
@@ -11637,7 +11636,7 @@
                         type: List<String>
                         typeArguments: TypeArgumentList
                           arguments
-                            TypeName
+                            NamedType
                               name: SimpleIdentifier
                                 staticElement: dart:core::@class::String
                                 staticType: null
@@ -11687,7 +11686,7 @@
             staticType: List<C>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: a.dart::@class::C
                     staticType: null
@@ -11723,7 +11722,7 @@
             staticType: List<C>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: PrefixedIdentifier
                     identifier: SimpleIdentifier
                       staticElement: a.dart::@class::C
@@ -11772,7 +11771,7 @@
             staticType: List<int Function(String)>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: self::@typeAlias::F
                     staticType: null
@@ -11808,13 +11807,13 @@
             staticType: Map<dynamic, int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dynamic@-1
                     staticType: null
                     token: dynamic @25
                   type: dynamic
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -11833,13 +11832,13 @@
             staticType: Map<int, dynamic>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
                     token: int @67
                   type: int
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dynamic@-1
                     staticType: null
@@ -11858,13 +11857,13 @@
             staticType: Map<int, String>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
                     token: int @110
                   type: int
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::String
                     staticType: null
@@ -11883,13 +11882,13 @@
             staticType: Map<int, List<String>>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
                     token: int @169
                   type: int
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::List
                     staticType: null
@@ -11897,7 +11896,7 @@
                   type: List<String>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::String
                           staticType: null
@@ -11940,7 +11939,7 @@
             staticType: Set<dynamic>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dynamic@-1
                     staticType: null
@@ -11959,7 +11958,7 @@
             staticType: Set<int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -11978,7 +11977,7 @@
             staticType: Set<List<String>>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::List
                     staticType: null
@@ -11986,7 +11985,7 @@
                   type: List<String>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::String
                           staticType: null
@@ -12126,7 +12125,7 @@
         constantInitializer
           TypeLiteral
             staticType: Type
-            typeName: TypeName
+            type: NamedType
               name: SimpleIdentifier
                 staticElement: dart:core::@class::List
                 staticType: List<int>
@@ -12134,7 +12133,7 @@
               type: List<int>
               typeArguments: TypeArgumentList
                 arguments
-                  TypeName
+                  NamedType
                     name: SimpleIdentifier
                       staticElement: dart:core::@class::int
                       staticType: null
@@ -12608,7 +12607,7 @@
                         staticElement: ConstructorMember
                           base: self::@class::A::@constructor::•
                           substitution: {T: dynamic Function()}
-                        type: TypeName
+                        type: NamedType
                           name: SimpleIdentifier
                             staticElement: self::@class::A
                             staticType: null
@@ -13889,7 +13888,7 @@
                     rightParenthesis: ) @47
                   constructorName: ConstructorName
                     staticElement: self::@class::D::@constructor::•
-                    type: TypeName
+                    type: NamedType
                       name: SimpleIdentifier
                         staticElement: self::@class::D
                         staticType: null
@@ -13919,7 +13918,7 @@
                     rightParenthesis: ) @99
                   constructorName: ConstructorName
                     staticElement: self::@class::C::@constructor::•
-                    type: TypeName
+                    type: NamedType
                       name: SimpleIdentifier
                         staticElement: self::@class::C
                         staticType: null
@@ -14139,7 +14138,7 @@
                       staticElement: ConstructorMember
                         base: self::@class::A::@constructor::•
                         substitution: {T: dynamic Function()}
-                      type: TypeName
+                      type: NamedType
                         name: SimpleIdentifier
                           staticElement: self::@class::A
                           staticType: null
@@ -14187,7 +14186,7 @@
                       staticType: int
                     isOperator: is @16
                     staticType: bool
-                    type: TypeName
+                    type: NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::int
                         staticType: null
@@ -14306,7 +14305,7 @@
                       staticElement: ConstructorMember
                         base: self::@class::B::@constructor::•
                         substitution: {T1: int, T2: double}
-                      type: TypeName
+                      type: NamedType
                         name: SimpleIdentifier
                           staticElement: self::@class::B
                           staticType: null
@@ -14355,7 +14354,7 @@
                       staticElement: ConstructorMember
                         base: self::@class::B::@constructor::•
                         substitution: {T: Never}
-                      type: TypeName
+                      type: NamedType
                         name: SimpleIdentifier
                           staticElement: self::@class::B
                           staticType: null
@@ -14414,7 +14413,7 @@
                       staticElement: ConstructorMember
                         base: self::@class::B::@constructor::•
                         substitution: {T: Never}
-                      type: TypeName
+                      type: NamedType
                         name: SimpleIdentifier
                           staticElement: self::@class::B
                           staticType: null
@@ -14474,7 +14473,7 @@
                       staticElement: ConstructorMember
                         base: self::@class::B::@constructor::•
                         substitution: {T: Null*}
-                      type: TypeName
+                      type: NamedType
                         name: SimpleIdentifier
                           staticElement: self::@class::B
                           staticType: null
@@ -14523,7 +14522,7 @@
                       staticElement: ConstructorMember
                         base: self::@class::B::@constructor::•
                         substitution: {T: Null*}
-                      type: TypeName
+                      type: NamedType
                         name: SimpleIdentifier
                           staticElement: self::@class::B
                           staticType: null
@@ -14567,7 +14566,7 @@
                   staticElement: ConstructorMember
                     base: self::@class::B::@constructor::•
                     substitution: {T: Never}
-                  type: TypeName
+                  type: NamedType
                     name: SimpleIdentifier
                       staticElement: self::@class::B
                       staticType: null
@@ -14617,7 +14616,7 @@
                       staticElement: ConstructorMember
                         base: self::@class::B::@constructor::•
                         substitution: {T: Never}
-                      type: TypeName
+                      type: NamedType
                         name: SimpleIdentifier
                           staticElement: self::@class::B
                           staticType: null
@@ -14672,7 +14671,7 @@
                       staticElement: ConstructorMember
                         base: self::@class::B::@constructor::•
                         substitution: {T1: Never, T2: Never}
-                      type: TypeName
+                      type: NamedType
                         name: SimpleIdentifier
                           staticElement: self::@class::B
                           staticType: null
@@ -14723,7 +14722,7 @@
                       staticElement: ConstructorMember
                         base: self::@class::B::@constructor::•
                         substitution: {T: Never}
-                      type: TypeName
+                      type: NamedType
                         name: SimpleIdentifier
                           staticElement: self::@class::B
                           staticType: null
@@ -16135,7 +16134,7 @@
                   staticElement: ConstructorMember
                     base: self::@class::A::@constructor::•
                     substitution: {T: int Function(double)}
-                  type: TypeName
+                  type: NamedType
                     name: SimpleIdentifier
                       staticElement: self::@class::A
                       staticType: null
@@ -16162,14 +16161,14 @@
                                   staticElement: a@78
                                   staticType: null
                                   token: a @78
-                                type: TypeName
+                                type: NamedType
                                   name: SimpleIdentifier
                                     staticElement: dart:core::@class::double
                                     staticType: null
                                     token: double @71
                                   type: double
                             rightParenthesis: ) @79
-                          returnType: TypeName
+                          returnType: NamedType
                             name: SimpleIdentifier
                               staticElement: dart:core::@class::int
                               staticType: null
@@ -17774,14 +17773,14 @@
                           staticElement: a@52
                           staticType: null
                           token: a @52
-                        type: TypeName
+                        type: NamedType
                           name: SimpleIdentifier
                             staticElement: dart:core::@class::String
                             staticType: null
                             token: String @45
                           type: String
                     rightParenthesis: ) @53
-                  returnType: TypeName
+                  returnType: NamedType
                     name: SimpleIdentifier
                       staticElement: dart:core::@class::int
                       staticType: null
@@ -17850,14 +17849,14 @@
                           staticElement: a@52
                           staticType: null
                           token: a @52
-                        type: TypeName
+                        type: NamedType
                           name: SimpleIdentifier
                             staticElement: dart:core::@class::String
                             staticType: null
                             token: String @45
                           type: String
                     rightParenthesis: ) @53
-                  returnType: TypeName
+                  returnType: NamedType
                     name: SimpleIdentifier
                       staticElement: dart:core::@class::int
                       staticType: null
@@ -17908,7 +17907,7 @@
               staticElement: ConstructorMember
                 base: self::@class::A::@constructor::•
                 substitution: {T: String Function({int? a})}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::A
                   staticType: null
@@ -17942,14 +17941,14 @@
                                 staticElement: a@63
                                 staticType: null
                                 token: a @63
-                              type: TypeName
+                              type: NamedType
                                 name: SimpleIdentifier
                                   staticElement: dart:core::@class::int
                                   staticType: null
                                   token: int @58
                                 type: int?
                         rightParenthesis: ) @65
-                      returnType: TypeName
+                      returnType: NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::String
                           staticType: null
@@ -17995,7 +17994,7 @@
               staticElement: ConstructorMember
                 base: self::@class::A::@constructor::•
                 substitution: {T: String Function([int?])}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::A
                   staticType: null
@@ -18029,14 +18028,14 @@
                                 staticElement: a@63
                                 staticType: null
                                 token: a @63
-                              type: TypeName
+                              type: NamedType
                                 name: SimpleIdentifier
                                   staticElement: dart:core::@class::int
                                   staticType: null
                                   token: int @58
                                 type: int?
                         rightParenthesis: ) @65
-                      returnType: TypeName
+                      returnType: NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::String
                           staticType: null
@@ -18082,7 +18081,7 @@
               staticElement: ConstructorMember
                 base: self::@class::A::@constructor::•
                 substitution: {T: String Function({required int a})}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::A
                   staticType: null
@@ -18117,14 +18116,14 @@
                                 staticType: null
                                 token: a @71
                               requiredKeyword: required @58
-                              type: TypeName
+                              type: NamedType
                                 name: SimpleIdentifier
                                   staticElement: dart:core::@class::int
                                   staticType: null
                                   token: int @67
                                 type: int
                         rightParenthesis: ) @73
-                      returnType: TypeName
+                      returnType: NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::String
                           staticType: null
@@ -18170,7 +18169,7 @@
               staticElement: ConstructorMember
                 base: self::@class::A::@constructor::•
                 substitution: {T: String Function(int)}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::A
                   staticType: null
@@ -18197,14 +18196,14 @@
                               staticElement: a@61
                               staticType: null
                               token: a @61
-                            type: TypeName
+                            type: NamedType
                               name: SimpleIdentifier
                                 staticElement: dart:core::@class::int
                                 staticType: null
                                 token: int @57
                               type: int
                         rightParenthesis: ) @62
-                      returnType: TypeName
+                      returnType: NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::String
                           staticType: null
@@ -18533,7 +18532,7 @@
                 token: named @67
               period: . @66
               staticElement: self::@class::C::@constructor::named
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -18936,8 +18935,7 @@
   test_import_short_absolute() async {
     testFile = '/my/project/bin/test.dart';
     // Note: "/a.dart" resolves differently on Windows vs. Posix.
-    var destinationPath =
-        resourceProvider.pathContext.fromUri(Uri.parse('/a.dart'));
+    var destinationPath = convertPath('/a.dart');
     addLibrarySource(destinationPath, 'class C {}');
     var library = await checkLibrary('import "/a.dart"; C c;');
     checkElementText(library, r'''
@@ -19108,7 +19106,7 @@
               staticElement: ConstructorMember
                 base: self::@class::C::@constructor::•
                 substitution: {V: int}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -19176,7 +19174,7 @@
               rightParenthesis: ) @114
             constructorName: ConstructorName
               staticElement: self::@class::C::@constructor::•
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -22218,7 +22216,7 @@
               token: A @36
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -22274,7 +22272,7 @@
               token: A @36
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -22441,7 +22439,7 @@
               staticType: null
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -22654,7 +22652,7 @@
               token: A @30
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -22798,7 +22796,7 @@
               staticType: null
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -33883,7 +33881,7 @@
               staticElement: ConstructorMember
                 base: self::@class::A::@constructor::•
                 substitution: {T: int}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::A
                   staticType: null
diff --git a/pkg/analyzer/test/src/summary/test_strategies.dart b/pkg/analyzer/test/src/summary/test_strategies.dart
index 5632a0a..8d21be1 100644
--- a/pkg/analyzer/test/src/summary/test_strategies.dart
+++ b/pkg/analyzer/test/src/summary/test_strategies.dart
@@ -14,22 +14,22 @@
 import 'package:analyzer/src/generated/source.dart';
 
 CompilationUnit parseText(
+  Source source,
   String text,
   FeatureSet featureSet,
 ) {
   CharSequenceReader reader = CharSequenceReader(text);
-  Scanner scanner =
-      Scanner(_SourceMock.instance, reader, AnalysisErrorListener.NULL_LISTENER)
-        ..configureFeatures(
-          featureSetForOverriding: featureSet,
-          featureSet: featureSet,
-        );
+  Scanner scanner = Scanner(source, reader, AnalysisErrorListener.NULL_LISTENER)
+    ..configureFeatures(
+      featureSetForOverriding: featureSet,
+      featureSet: featureSet,
+    );
   Token token = scanner.tokenize();
   // Pass the feature set from the scanner to the parser
   // because the scanner may have detected a language version comment
   // and downgraded the feature set it holds.
   Parser parser = Parser(
-    NonExistingSource.unknown,
+    source,
     AnalysisErrorListener.NULL_LISTENER,
     featureSet: scanner.featureSet,
   );
@@ -43,10 +43,3 @@
 
   return unit;
 }
-
-class _SourceMock implements Source {
-  static final Source instance = _SourceMock();
-
-  @override
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index a25a5ac..5a33bcb 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -1906,13 +1906,18 @@
 var fe0 = (int x) => x as dynamic;
 var fe1 = (int x) => x;
 ''', [
-      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 12, 2),
-      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 96, 2),
+      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 12, 2,
+          messageContains: ["'f0'"]),
+      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 96, 2,
+          messageContains: ["'g0'"]),
       error(HintCode.UNUSED_ELEMENT, 96, 2),
       error(HintCode.UNUSED_ELEMENT, 126, 2),
-      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 212, 12),
-      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 304, 2),
-      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 373, 1),
+      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 212, 12,
+          messageContains: ["'m0'"]),
+      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 304, 2,
+          messageContains: ["'y0'"]),
+      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 373, 1,
+          messageContains: ["'f'"]),
     ]);
   }
 
@@ -3026,33 +3031,6 @@
     ]);
   }
 
-  test_superCallPlacement() async {
-    await assertErrorsInCode('''
-class Base {
-  var x;
-  Base() : x = 1;
-}
-
-class Derived extends Base {
-  var y, z;
-  Derived() : y = 1, super(), z = 2;
-}
-
-class Valid extends Base {
-  var y, z;
-  Valid(): y = 1, z = 2, super();
-}
-
-class AlsoValid extends Base {
-  AlsoValid() : super();
-}
-
-main() => new Derived();
-''', [
-      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 105, 5),
-    ]);
-  }
-
   test_superclassOverrideOfGrandInterface_interfaceOfAbstractSuperclass() async {
     await assertErrorsInCode('''
 class A {}
@@ -3411,62 +3389,6 @@
     ]);
   }
 
-  test_unaryOperators() async {
-    await assertErrorsInCode('''
-class A {
-  A operator ~() => null;
-  A operator +(int x) => null;
-  A operator -(int x) => null;
-  A operator -() => null;
-}
-class B extends A {}
-class C extends B {}
-
-foo() => new A();
-
-test() {
-  A a = new A();
-  B b = new B();
-  var c = foo();
-  dynamic d;
-
-  ~a;
-  (~d);
-
-  !a;
-  !d;
-
-  -a;
-  (-d);
-
-  ++a;
-  --a;
-  (++d);
-  (--d);
-
-  a++;
-  a--;
-  (d++);
-  (d--);
-
-  ++b;
-  --b;
-  b++;
-  b--;
-
-  takesC(C c) => null;
-  takesC(++b);
-  takesC(--b);
-  takesC(b++);
-  takesC(b--);
-}
-''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 201, 1),
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 237, 1),
-      error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 280, 1),
-    ]);
-  }
-
   test_unboundTypeName() async {
     await assertErrorsInCode('''
 void main() {
diff --git a/pkg/analyzer/test/src/workspace/bazel_test.dart b/pkg/analyzer/test/src/workspace/bazel_test.dart
index 88e983e..bdfa730 100644
--- a/pkg/analyzer/test/src/workspace/bazel_test.dart
+++ b/pkg/analyzer/test/src/workspace/bazel_test.dart
@@ -38,6 +38,12 @@
     expect(workspace.isBazel, isTrue);
   }
 
+  void test_pathToUri() {
+    Uri uri = toUri('/workspace/test.dart');
+    var source = resolver.resolveAbsolute(uri)!;
+    expect(resolver.pathToUri(source.fullName), uri);
+  }
+
   void test_resolveAbsolute_doesNotExist() {
     var source = _resolvePath('/workspace/foo.dart')!;
     expect(source.exists(), isFalse);
@@ -79,14 +85,15 @@
     expect(source, isNull);
   }
 
+  @Deprecated('Use pathToUri() instead')
   void test_restoreAbsolute() {
     Uri uri =
         resourceProvider.pathContext.toUri(convertPath('/workspace/test.dart'));
     var source = resolver.resolveAbsolute(uri)!;
     expect(resolver.restoreAbsolute(source), uri);
     expect(
-        resolver.restoreAbsolute(NonExistingSource(source.fullName,
-            Uri.parse('package:test/test.dart'), UriKind.PACKAGE_URI)),
+        resolver.restoreAbsolute(NonExistingSource(
+            source.fullName, Uri.parse('package:test/test.dart'))),
         uri);
   }
 
@@ -538,6 +545,15 @@
         'package:third_party.something/foo.dart');
   }
 
+  void test_restoreAbsolute_workspace_nestedLib() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/my/components/lib/src/foo/lib/foo.dart',
+    ]);
+    _assertRestore('/workspace/my/components/lib/src/foo/lib/foo.dart',
+        'package:my.components.lib.src.foo/foo.dart');
+  }
+
   void _addResources(List<String> paths,
       {String workspacePath = '/workspace'}) {
     for (String path in paths) {
@@ -561,21 +577,25 @@
       {bool exists = true, bool restore = true}) {
     Uri uri = Uri.parse(uriStr);
     var source = resolver.resolveAbsolute(uri)!;
-    expect(source.fullName, convertPath(posixPath));
+    var path = source.fullName;
+    expect(path, convertPath(posixPath));
     expect(source.uri, uri);
     expect(source.exists(), exists);
     // If enabled, test also "restoreAbsolute".
     if (restore) {
-      var uri = resolver.restoreAbsolute(source);
-      expect(uri.toString(), uriStr);
+      expect(resolver.pathToUri(path), uri);
+      // ignore: deprecated_member_use_from_same_package
+      expect(resolver.restoreAbsolute(source), uri);
     }
   }
 
-  void _assertRestore(String posixPath, String? expectedUri) {
+  void _assertRestore(String posixPath, String? expectedUriStr) {
+    var expectedUri = expectedUriStr != null ? Uri.parse(expectedUriStr) : null;
     String path = convertPath(posixPath);
     _MockSource source = _MockSource(path);
-    var uri = resolver.restoreAbsolute(source);
-    expect(uri?.toString(), expectedUri);
+    expect(resolver.pathToUri(path), expectedUri);
+    // ignore: deprecated_member_use_from_same_package
+    expect(resolver.restoreAbsolute(source), expectedUri);
   }
 }
 
diff --git a/pkg/analyzer/test/src/workspace/package_build_test.dart b/pkg/analyzer/test/src/workspace/package_build_test.dart
index b7a9650..f262445 100644
--- a/pkg/analyzer/test/src/workspace/package_build_test.dart
+++ b/pkg/analyzer/test/src/workspace/package_build_test.dart
@@ -20,23 +20,25 @@
 
 class MockUriResolver implements UriResolver {
   Map<Uri, File> uriToFile = {};
-  Map<String, Uri> pathToUri = {};
+  Map<String, Uri> pathToUriMap = {};
 
   void add(Uri uri, File file) {
     uriToFile[uri] = file;
-    pathToUri[file.path] = uri;
+    pathToUriMap[file.path] = uri;
   }
 
   @override
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 
   @override
-  Source? resolveAbsolute(Uri uri) {
-    return uriToFile[uri]?.createSource(uri);
+  Uri? pathToUri(String path) {
+    return pathToUriMap[path];
   }
 
   @override
-  Uri? restoreAbsolute(Source source) => pathToUri[source.fullName];
+  Source? resolveAbsolute(Uri uri) {
+    return uriToFile[uri]?.createSource(uri);
+  }
 }
 
 @reflectiveTest
@@ -61,6 +63,12 @@
     expect(workspace.isBazel, isFalse);
   }
 
+  void test_pathToUri() {
+    var uri = toUri('/workspace/test.dart');
+    var source = resolver.resolveAbsolute(uri)!;
+    expect(resolver.pathToUri(source.fullName), uri);
+  }
+
   void test_resolveAbsolute_doesNotExist() {
     var source = _resolvePath('/workspace/foo.dart')!;
     expect(source, isNotNull);
@@ -98,6 +106,7 @@
     expect(source, isNull);
   }
 
+  @Deprecated('Use pathToUri() instead')
   void test_restoreAbsolute() {
     Uri uri =
         resourceProvider.pathContext.toUri(convertPath('/workspace/test.dart'));
@@ -105,8 +114,8 @@
     expect(source, isNotNull);
     expect(resolver.restoreAbsolute(source), uri);
     expect(
-        resolver.restoreAbsolute(NonExistingSource(source.fullName,
-            Uri.parse('package:test/test.dart'), UriKind.PACKAGE_URI)),
+        resolver.restoreAbsolute(NonExistingSource(
+            source.fullName, Uri.parse('package:test/test.dart'))),
         uri);
   }
 
@@ -207,13 +216,15 @@
   Source _assertResolveUri(Uri uri, String posixPath,
       {bool exists = true, bool restore = true}) {
     var source = resolver.resolveAbsolute(uri)!;
-    expect(source.fullName, convertPath(posixPath));
+    var path = source.fullName;
+    expect(path, convertPath(posixPath));
     expect(source.uri, uri);
     expect(source.exists(), exists);
     // If enabled, test also "restoreAbsolute".
     if (restore) {
-      var restoredUri = resolver.restoreAbsolute(source);
-      expect(restoredUri.toString(), uri.toString());
+      expect(resolver.pathToUri(path), uri);
+      // ignore: deprecated_member_use_from_same_package
+      expect(resolver.restoreAbsolute(source), uri);
     }
     return source;
   }
diff --git a/pkg/analyzer/tool/diagnostics/diagnostics.md b/pkg/analyzer/tool/diagnostics/diagnostics.md
index d00d0d5..97d64c9 100644
--- a/pkg/analyzer/tool/diagnostics/diagnostics.md
+++ b/pkg/analyzer/tool/diagnostics/diagnostics.md
@@ -6518,7 +6518,7 @@
 #### Description
 
 The analyzer produces this diagnostic when a package under either
-`dependencies` or `dev_dependencies` is not a pub, `git`, or `path` based
+`dependencies` or `dev_dependencies` isn't a pub, `git`, or `path` based
 dependency.
 
 See [Package dependencies](https://dart.dev/tools/pub/dependencies) for
@@ -6527,7 +6527,7 @@
 #### Example
 
 The following code produces this diagnostic because the dependency on the
-package `transmogrify` is not a pub, `git`, or `path` based dependency:
+package `transmogrify` isn't a pub, `git`, or `path` based dependency:
 
 ```yaml
 name: example
@@ -6968,7 +6968,7 @@
 `isEven` if `s` is `null`. In other words, if `s` is `null`, then neither
 `length` nor `isEven` will be invoked, and if `s` is non-`null`, then
 `length` can't return a `null` value. Either way, `isEven` can't be invoked
-on a `null` value, so the null-aware operator is not necessary. See
+on a `null` value, so the null-aware operator isn't necessary. See
 [Understanding null safety](/null-safety/understanding-null-safety#smarter-null-aware-methods)
 for more details.
 
@@ -7152,46 +7152,6 @@
 }
 {% endprettify %}
 
-### invalid_super_invocation
-
-_The superclass call must be last in an initializer list: '{0}'._
-
-#### Description
-
-The analyzer produces this diagnostic when the initializer list of a
-constructor contains an invocation of a constructor in the superclass, but
-the invocation isn't the last item in the initializer list.
-
-#### Example
-
-The following code produces this diagnostic because the invocation of the
-superclass' constructor isn't the last item in the initializer list:
-
-{% prettify dart tag=pre+code %}
-class A {
-  A(int x);
-}
-
-class B extends A {
-  B(int x) : [!super!](x), assert(x >= 0);
-}
-{% endprettify %}
-
-#### Common fixes
-
-Move the invocation of the superclass' constructor to the end of the
-initializer list:
-
-{% prettify dart tag=pre+code %}
-class A {
-  A(int x);
-}
-
-class B extends A {
-  B(int x) : assert(x >= 0), super(x);
-}
-{% endprettify %}
-
 ### invalid_type_argument_in_const_literal
 
 _Constant list literals can't include a type parameter as a type argument, such
@@ -12846,6 +12806,48 @@
 class C extends Object {}
 {% endprettify %}
 
+### super_invocation_not_last
+
+<a id="invalid_super_invocation" aria-hidden="true"></a>_(Previously known as `invalid_super_invocation`)_
+
+_The superconstructor call must be last in an initializer list: '{0}'._
+
+#### Description
+
+The analyzer produces this diagnostic when the initializer list of a
+constructor contains an invocation of a constructor in the superclass, but
+the invocation isn't the last item in the initializer list.
+
+#### Example
+
+The following code produces this diagnostic because the invocation of the
+superclass' constructor isn't the last item in the initializer list:
+
+{% prettify dart tag=pre+code %}
+class A {
+  A(int x);
+}
+
+class B extends A {
+  B(int x) : [!super!](x), assert(x >= 0);
+}
+{% endprettify %}
+
+#### Common fixes
+
+Move the invocation of the superclass' constructor to the end of the
+initializer list:
+
+{% prettify dart tag=pre+code %}
+class A {
+  A(int x);
+}
+
+class B extends A {
+  B(int x) : assert(x >= 0), super(x);
+}
+{% endprettify %}
+
 ### super_in_extension
 
 _The 'super' keyword can't be used in an extension because an extension doesn't
@@ -14405,7 +14407,7 @@
 
 ### undefined_referenced_parameter
 
-_The parameter '{0}' is not defined by '{1}'._
+_The parameter '{0}' isn't defined by '{1}'._
 
 #### Description
 
@@ -14511,6 +14513,8 @@
 
 ### undefined_super_member
 
+<a id="undefined_super_method" aria-hidden="true"></a>_(Previously known as `undefined_super_method`)_
+
 _The getter '{0}' isn't defined in a superclass of '{1}'._
 
 _The method '{0}' isn't defined in a superclass of '{1}'._
@@ -15829,14 +15833,17 @@
 
 ### yield_of_invalid_type
 
-_The type '{0}' implied by the 'yield' expression must be assignable to '{1}'._
+_A yielded value of type '{0}' must be assignable to '{1}'._
+
+_The type '{0}' implied by the 'yield*' expression must be assignable to '{1}'._
 
 #### Description
 
-The analyzer produces this diagnostic when the type of object produced by a
-`yield` expression doesn't match the type of objects that are to be
-returned from the `Iterable` or `Stream` types that are returned from a
-generator (a function or method marked with either `sync*` or `async*`).
+The analyzer produces this diagnostic when the type of object produced by
+a `yield` or `yield*` expression doesn't match the type of objects that
+are to be returned from the `Iterable` or `Stream` types that are returned
+from a generator (a function or method marked with either `sync*` or
+`async*`).
 
 #### Example
 
@@ -15869,7 +15876,3 @@
   yield '0';
 }
 {% endprettify %}
-
-### undefined_super_method
-
-See [undefined_super_member](#undefined_super_member).
diff --git a/pkg/analyzer/tool/diagnostics/generate.dart b/pkg/analyzer/tool/diagnostics/generate.dart
index c726a25..9f58663 100644
--- a/pkg/analyzer/tool/diagnostics/generate.dart
+++ b/pkg/analyzer/tool/diagnostics/generate.dart
@@ -39,6 +39,9 @@
   /// The messages associated with the diagnostic.
   List<String> messages;
 
+  /// The previous names by which this diagnostic has been known.
+  List<String> previousNames = [];
+
   /// The documentation text associated with the diagnostic.
   String? documentation;
 
@@ -56,10 +59,22 @@
     }
   }
 
+  void addPreviousName(String previousName) {
+    if (!previousNames.contains(previousName)) {
+      previousNames.add(previousName);
+    }
+  }
+
   /// Return the full documentation for this diagnostic.
   void writeOn(StringSink sink) {
     messages.sort();
     sink.writeln('### ${name.toLowerCase()}');
+    for (var previousName in previousNames) {
+      sink.writeln();
+      var previousInLowerCase = previousName.toLowerCase();
+      sink.writeln('<a id="$previousInLowerCase" aria-hidden="true"></a>'
+          '_(Previously known as `$previousInLowerCase`)_');
+    }
     for (String message in messages) {
       sink.writeln();
       for (String line in _split('_${_escape(message)}_')) {
@@ -120,7 +135,6 @@
     _writeHeader(sink);
     _writeGlossary(sink);
     _writeDiagnostics(sink);
-    _writeForwards(sink);
   }
 
   /// Extract documentation from all of the files containing the definitions of
@@ -140,6 +154,10 @@
       } else {
         info.addMessage(message);
       }
+      var previousName = errorCodeInfo.previousName;
+      if (previousName != null) {
+        info.addPreviousName(previousName);
+      }
       var docs = _extractDoc('$className.$errorName', errorCodeInfo);
       if (docs.isNotEmpty) {
         if (info.documentation != null) {
@@ -185,17 +203,6 @@
     }
   }
 
-  /// Write the forwarding documentation for all of the diagnostics that have
-  /// been renamed.
-  void _writeForwards(StringSink sink) {
-    sink.write('''
-
-### undefined_super_method
-
-See [undefined_super_member](#undefined_super_member).
-''');
-  }
-
   /// Write the glossary.
   void _writeGlossary(StringSink sink) {
     sink.write(r'''
diff --git a/pkg/analyzer/tool/messages/error_code_info.dart b/pkg/analyzer/tool/messages/error_code_info.dart
index 907a564..e89d24d 100644
--- a/pkg/analyzer/tool/messages/error_code_info.dart
+++ b/pkg/analyzer/tool/messages/error_code_info.dart
@@ -76,7 +76,7 @@
 ];
 
 /// Decoded messages from the analyzer's `messages.yaml` file.
-final Map<String, Map<String, ErrorCodeInfo>> analyzerMessages =
+final Map<String, Map<String, AnalyzerErrorCodeInfo>> analyzerMessages =
     _loadAnalyzerMessages();
 
 /// The path to the `analyzer` package.
@@ -88,7 +88,8 @@
     CfeToAnalyzerErrorCodeTables._(frontEndMessages);
 
 /// Decoded messages from the front end's `messages.yaml` file.
-final Map<String, ErrorCodeInfo> frontEndMessages = _loadFrontEndMessages();
+final Map<String, FrontEndErrorCodeInfo> frontEndMessages =
+    _loadFrontEndMessages();
 
 /// The path to the `front_end` package.
 final String frontEndPkgPath =
@@ -110,13 +111,13 @@
 /// Decodes a YAML object (obtained from `pkg/analyzer/messages.yaml`) into a
 /// two-level map of [ErrorCodeInfo], indexed first by class name and then by
 /// error name.
-Map<String, Map<String, ErrorCodeInfo>> decodeAnalyzerMessagesYaml(
+Map<String, Map<String, AnalyzerErrorCodeInfo>> decodeAnalyzerMessagesYaml(
     Object? yaml) {
   Never problem(String message) {
     throw 'Problem in pkg/analyzer/messages.yaml: $message';
   }
 
-  var result = <String, Map<String, ErrorCodeInfo>>{};
+  var result = <String, Map<String, AnalyzerErrorCodeInfo>>{};
   if (yaml is! Map<Object?, Object?>) {
     problem('root node is not a map');
   }
@@ -142,7 +143,7 @@
       }
       try {
         (result[className] ??= {})[errorName] =
-            ErrorCodeInfo.fromYaml(errorValue);
+            AnalyzerErrorCodeInfo.fromYaml(errorValue);
       } catch (e) {
         problem('while processing '
             '$className.$errorName, $e');
@@ -154,12 +155,12 @@
 
 /// Decodes a YAML object (obtained from `pkg/front_end/messages.yaml`) into a
 /// map from error name to [ErrorCodeInfo].
-Map<String, ErrorCodeInfo> decodeCfeMessagesYaml(Object? yaml) {
+Map<String, FrontEndErrorCodeInfo> decodeCfeMessagesYaml(Object? yaml) {
   Never problem(String message) {
     throw 'Problem in pkg/front_end/messages.yaml: $message';
   }
 
-  var result = <String, ErrorCodeInfo>{};
+  var result = <String, FrontEndErrorCodeInfo>{};
   if (yaml is! Map<Object?, Object?>) {
     problem('root node is not a map');
   }
@@ -172,25 +173,49 @@
     if (errorValue is! Map<Object?, Object?>) {
       problem('value associated with error $errorName is not a map');
     }
-    result[errorName] = ErrorCodeInfo.fromYaml(errorValue);
+    result[errorName] = FrontEndErrorCodeInfo.fromYaml(errorValue);
   }
   return result;
 }
 
 /// Loads analyzer messages from the analyzer's `messages.yaml` file.
-Map<String, Map<String, ErrorCodeInfo>> _loadAnalyzerMessages() {
+Map<String, Map<String, AnalyzerErrorCodeInfo>> _loadAnalyzerMessages() {
   Object? messagesYaml =
       loadYaml(File(join(analyzerPkgPath, 'messages.yaml')).readAsStringSync());
   return decodeAnalyzerMessagesYaml(messagesYaml);
 }
 
 /// Loads front end messages from the front end's `messages.yaml` file.
-Map<String, ErrorCodeInfo> _loadFrontEndMessages() {
+Map<String, FrontEndErrorCodeInfo> _loadFrontEndMessages() {
   Object? messagesYaml =
       loadYaml(File(join(frontEndPkgPath, 'messages.yaml')).readAsStringSync());
   return decodeCfeMessagesYaml(messagesYaml);
 }
 
+/// In-memory representation of error code information obtained from the
+/// analyzer's `messages.yaml` file.
+class AnalyzerErrorCodeInfo extends ErrorCodeInfo {
+  AnalyzerErrorCodeInfo(
+      {String? comment,
+      String? correctionMessage,
+      String? documentation,
+      bool hasPublishedDocs = false,
+      bool isUnresolvedIdentifier = false,
+      required String problemMessage,
+      String? sharedName})
+      : super(
+            comment: comment,
+            correctionMessage: correctionMessage,
+            documentation: documentation,
+            hasPublishedDocs: hasPublishedDocs,
+            isUnresolvedIdentifier: isUnresolvedIdentifier,
+            problemMessage: problemMessage,
+            sharedName: sharedName);
+
+  AnalyzerErrorCodeInfo.fromYaml(Map<Object?, Object?> yaml)
+      : super.fromYaml(yaml);
+}
+
 /// Data tables mapping between CFE errors and their corresponding automatically
 /// generated analyzer errors.
 class CfeToAnalyzerErrorCodeTables {
@@ -218,7 +243,7 @@
   /// automatically generated, and whose values are the front end error name.
   final Map<ErrorCodeInfo, String> infoToFrontEndCode = {};
 
-  CfeToAnalyzerErrorCodeTables._(Map<String, ErrorCodeInfo> messages) {
+  CfeToAnalyzerErrorCodeTables._(Map<String, FrontEndErrorCodeInfo> messages) {
     for (var entry in messages.entries) {
       var errorCodeInfo = entry.value;
       var index = errorCodeInfo.index;
@@ -322,14 +347,10 @@
   String get typeCode => 'ErrorType.$type';
 }
 
-/// In-memory representation of error code information obtained from either a
-/// `messages.yaml` file.  Supports both the analyzer and front_end message file
-/// formats.
-class ErrorCodeInfo {
-  /// For error code information obtained from the CFE, the set of analyzer
-  /// error codes that corresponds to this error code, if any.
-  final List<String> analyzerCode;
-
+/// In-memory representation of error code information obtained from either the
+/// analyzer or the front end's `messages.yaml` file.  This class contains the
+/// common functionality supported by both formats.
+abstract class ErrorCodeInfo {
   /// If present, a documentation comment that should be associated with the
   /// error in code generated output.
   final String? comment;
@@ -345,10 +366,6 @@
   /// been published.
   final bool hasPublishedDocs;
 
-  /// For error code information obtained from the CFE, the index of the error
-  /// in the analyzer's `fastaAnalyzerErrorCodes` table.
-  final int? index;
-
   /// Indicates whether this error is caused by an unresolved identifier.
   final bool isUnresolvedIdentifier;
 
@@ -360,30 +377,32 @@
   /// codes.
   final String? sharedName;
 
+  /// If present, indicates that this error code has been renamed from
+  /// [previousName] to its current name (or [sharedName]).
+  final String? previousName;
+
   ErrorCodeInfo(
-      {this.analyzerCode = const [],
-      this.comment,
+      {this.comment,
       this.documentation,
       this.hasPublishedDocs = false,
-      this.index,
       this.isUnresolvedIdentifier = false,
       this.sharedName,
       required this.problemMessage,
-      this.correctionMessage});
+      this.correctionMessage,
+      this.previousName});
 
   /// Decodes an [ErrorCodeInfo] object from its YAML representation.
   ErrorCodeInfo.fromYaml(Map<Object?, Object?> yaml)
       : this(
-            analyzerCode: _decodeAnalyzerCode(yaml['analyzerCode']),
             comment: yaml['comment'] as String?,
             correctionMessage: yaml['correctionMessage'] as String?,
             documentation: yaml['documentation'] as String?,
             hasPublishedDocs: yaml['hasPublishedDocs'] as bool? ?? false,
-            index: yaml['index'] as int?,
             isUnresolvedIdentifier:
                 yaml['isUnresolvedIdentifier'] as bool? ?? false,
             problemMessage: yaml['problemMessage'] as String,
-            sharedName: yaml['sharedName'] as String?);
+            sharedName: yaml['sharedName'] as String?,
+            previousName: yaml['previousName'] as String?);
 
   /// Given a messages.yaml entry, come up with a mapping from placeholder
   /// patterns in its message strings to their corresponding indices.
@@ -459,8 +478,6 @@
   /// Encodes this object into a YAML representation.
   Map<Object?, Object?> toYaml() => {
         if (sharedName != null) 'sharedName': sharedName,
-        if (analyzerCode.isNotEmpty)
-          'analyzerCode': _encodeAnalyzerCode(analyzerCode),
         'problemMessage': problemMessage,
         if (correctionMessage != null) 'correctionMessage': correctionMessage,
         if (isUnresolvedIdentifier) 'isUnresolvedIdentifier': true,
@@ -468,6 +485,30 @@
         if (comment != null) 'comment': comment,
         if (documentation != null) 'documentation': documentation,
       };
+}
+
+/// In-memory representation of error code information obtained from the front
+/// end's `messages.yaml` file.
+class FrontEndErrorCodeInfo extends ErrorCodeInfo {
+  /// The set of analyzer error codes that corresponds to this error code, if
+  /// any.
+  final List<String> analyzerCode;
+
+  /// The index of the error in the analyzer's `fastaAnalyzerErrorCodes` table.
+  final int? index;
+
+  FrontEndErrorCodeInfo.fromYaml(Map<Object?, Object?> yaml)
+      : analyzerCode = _decodeAnalyzerCode(yaml['analyzerCode']),
+        index = yaml['index'] as int?,
+        super.fromYaml(yaml);
+
+  @override
+  Map<Object?, Object?> toYaml() => {
+        if (analyzerCode.isNotEmpty)
+          'analyzerCode': _encodeAnalyzerCode(analyzerCode),
+        if (index != null) 'index': index,
+        ...super.toYaml(),
+      };
 
   static List<String> _decodeAnalyzerCode(Object? value) {
     if (value == null) {
diff --git a/pkg/analyzer/tool/messages/extract_errors_to_yaml.dart b/pkg/analyzer/tool/messages/extract_errors_to_yaml.dart
index 75b6f60..d26eab1 100644
--- a/pkg/analyzer/tool/messages/extract_errors_to_yaml.dart
+++ b/pkg/analyzer/tool/messages/extract_errors_to_yaml.dart
@@ -221,7 +221,7 @@
       var commentInfo = _extractCommentInfo(fieldDeclaration);
       var documentationComment = commentInfo.documentationComment;
       var otherComment = commentInfo.otherComment;
-      yamlCodes[uniqueNameSuffix] = ErrorCodeInfo(
+      yamlCodes[uniqueNameSuffix] = AnalyzerErrorCodeInfo(
               sharedName: uniqueNameSuffix == name ? null : name,
               problemMessage: code.problemMessage,
               correctionMessage: code.correctionMessage,
diff --git a/pkg/analyzer/tool/summary/mini_ast.dart b/pkg/analyzer/tool/summary/mini_ast.dart
index 928fbf4..2e58862 100644
--- a/pkg/analyzer/tool/summary/mini_ast.dart
+++ b/pkg/analyzer/tool/summary/mini_ast.dart
@@ -285,16 +285,14 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void endConstructorReference(Token start, Token? periodBeforeName,
+      Token endToken, ConstructorReferenceContext constructorReferenceContext) {
+    debugEvent("ConstructorReference");
+  }
+
+  @override
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
     debugEvent("Enum");
-    var constants =
-        List<EnumConstantDeclaration?>.filled(count, null, growable: true);
-    popList(count, constants);
-    var name = pop() as String;
-    var metadata = popTypedList<Annotation>();
-    var comment = pop() as Comment?;
-    compilationUnit.declarations.add(EnumDeclaration(
-        comment, metadata, name, constants.whereNotNull().toList()));
   }
 
   @override
@@ -306,7 +304,8 @@
   @override
   void endFormalParameter(
       Token? thisKeyword,
-      Token? periodAfterThis,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
       Token? initializerStart,
       Token? initializerEnd,
@@ -421,6 +420,37 @@
   }
 
   @override
+  void handleEnumElement(Token beginToken) {
+    debugEvent("EnumElement");
+    pop(); // Arguments.
+    pop(); // Type arguments.
+  }
+
+  @override
+  void handleEnumElements(Token endToken, int count) {
+    debugEvent("EnumElements");
+    var constants =
+        List<EnumConstantDeclaration?>.filled(count, null, growable: true);
+    popList(count, constants);
+    pop(); // Type variables.
+    var name = pop() as String;
+    var metadata = popTypedList<Annotation>();
+    var comment = pop() as Comment?;
+    compilationUnit.declarations.add(EnumDeclaration(
+        comment, metadata, name, constants.whereNotNull().toList()));
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    debugEvent("EnumHeader");
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    debugEvent("NoEnumWithClause");
+  }
+
+  @override
   void handleFormalParameterWithoutValue(Token token) {
     debugEvent("FormalParameterWithoutValue");
   }
@@ -539,6 +569,11 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    debugEvent("NoTypeNameInConstructorReference");
+  }
+
+  @override
   void handleQualified(Token period) {
     debugEvent("Qualified");
     var suffix = pop() as String;
diff --git a/pkg/analyzer_cli/lib/src/analyzer_impl.dart b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
index 4b3846b..19caf6d 100644
--- a/pkg/analyzer_cli/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
@@ -11,8 +11,6 @@
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.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_cli/src/driver.dart';
 import 'package:analyzer_cli/src/error_formatter.dart';
 import 'package:analyzer_cli/src/error_severity.dart';
@@ -46,25 +44,22 @@
   /// specified on the command line as though it is reached via a "package:"
   /// URI, but avoid suppressing its output in the event that the user has not
   /// specified the "--package-warnings" option.
-  String _selfPackageName;
+  String? _selfPackageName;
 
   AnalyzerImpl(this.analysisOptions, this.analysisDriver, this.libraryFile,
       this.options, this.stats, this.startTime);
 
   void addCompilationUnitSource(
       CompilationUnitElement unit, Set<CompilationUnitElement> units) {
-    if (unit == null || !units.add(unit)) {
+    if (!units.add(unit)) {
       return;
     }
-    var source = unit.source;
-    if (source != null) {
-      files.add(source.fullName);
-    }
+    files.add(unit.source.fullName);
   }
 
   void addLibrarySources(LibraryElement library, Set<LibraryElement> libraries,
       Set<CompilationUnitElement> units) {
-    if (library == null || !libraries.add(library)) {
+    if (!libraries.add(library)) {
       return;
     }
     // Maybe skip library.
@@ -104,7 +99,7 @@
         if (_defaultSeverityProcessor(error) == null) {
           continue;
         }
-        status = status.max(computeSeverity(error, options, analysisOptions));
+        status = status.max(computeSeverity(error, options, analysisOptions)!);
       }
     }
     return status;
@@ -162,22 +157,21 @@
     return computeMaxErrorSeverity();
   }
 
-  ErrorSeverity _defaultSeverityProcessor(AnalysisError error) =>
+  ErrorSeverity? _defaultSeverityProcessor(AnalysisError error) =>
       determineProcessedSeverity(error, options, analysisOptions);
 
   /// Returns true if we want to report diagnostics for this library.
   bool _isAnalyzedLibrary(LibraryElement library) {
     var source = library.source;
-    switch (source.uriKind) {
-      case UriKind.DART_URI:
-        return options.showSdkWarnings;
-      case UriKind.PACKAGE_URI:
-        if (_isPathInPubCache(source.fullName)) {
-          return false;
-        }
-        return _isAnalyzedPackage(source.uri);
-      default:
-        return true;
+    if (source.uri.isScheme('dart')) {
+      return options.showSdkWarnings;
+    } else if (source.uri.isScheme('package')) {
+      if (_isPathInPubCache(source.fullName)) {
+        return false;
+      }
+      return _isAnalyzedPackage(source.uri);
+    } else {
+      return true;
     }
   }
 
@@ -194,7 +188,7 @@
     } else if (options.showPackageWarningsPrefix == null) {
       return true;
     } else {
-      return packageName.startsWith(options.showPackageWarningsPrefix);
+      return packageName.startsWith(options.showPackageWarningsPrefix!);
     }
   }
 
@@ -238,14 +232,14 @@
 
   @override
   void logException(dynamic exception,
-      [StackTrace stackTrace,
-      List<InstrumentationServiceAttachment> attachments = const []]) {
+      [StackTrace? stackTrace,
+      List<InstrumentationServiceAttachment>? attachments = const []]) {
     errorSink.writeln(exception);
     errorSink.writeln(stackTrace);
   }
 
   @override
-  void logInfo(String message, [Object exception]) {
+  void logInfo(String message, [Object? exception]) {
     outSink.writeln(message);
     if (exception != null) {
       outSink.writeln(exception);
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 28e3590..b2dd53f 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -41,10 +41,10 @@
 import 'package:yaml/yaml.dart';
 
 /// Shared IO sink for standard error reporting.
-StringSink errorSink = io.stderr;
+late StringSink errorSink = io.stderr;
 
 /// Shared IO sink for standard out reporting.
-StringSink outSink = io.stdout;
+late StringSink outSink = io.stdout;
 
 /// Test this option map to see if it specifies lint rules.
 bool containsLintRuleEntry(YamlMap options) {
@@ -55,13 +55,14 @@
 class Driver implements CommandLineStarter {
   static final ByteStore analysisDriverMemoryByteStore = MemoryByteStore();
 
-  _AnalysisContextProvider _analysisContextProvider;
-  DriverBasedAnalysisContext analysisContext;
+  bool _isStarted = false;
 
-  /// The driver that was most recently created by a call to [_analyzeAll], or
-  /// `null` if [_analyzeAll] hasn't been called yet.
+  late _AnalysisContextProvider _analysisContextProvider;
+  DriverBasedAnalysisContext? analysisContext;
+
+  /// The driver that was most recently created by a call to [_analyzeAll].
   @visibleForTesting
-  AnalysisDriver analysisDriver;
+  AnalysisDriver? analysisDriver;
 
   /// The total number of source files loaded by an AnalysisContext.
   int _analyzedFileCount = 0;
@@ -73,7 +74,7 @@
   final AnalysisStats stats = AnalysisStats();
 
   /// The [PathFilter] for excluded files with wildcards, etc.
-  PathFilter pathFilter;
+  late PathFilter pathFilter;
 
   /// Create a new Driver instance.
   Driver({@Deprecated('This parameter has no effect') bool isTesting = false});
@@ -88,9 +89,10 @@
 
   @override
   Future<void> start(List<String> arguments) async {
-    if (analysisDriver != null) {
+    if (_isStarted) {
       throw StateError('start() can only be called once');
     }
+    _isStarted = true;
     var startTime = DateTime.now().millisecondsSinceEpoch;
 
     StringUtilities.INTERNER = MappedInterner();
@@ -98,7 +100,7 @@
     linter.registerLintRules();
 
     // Parse commandline options.
-    var options = CommandLineOptions.parse(resourceProvider, arguments);
+    var options = CommandLineOptions.parse(resourceProvider, arguments)!;
 
     _analysisContextProvider = _AnalysisContextProvider(resourceProvider);
 
@@ -106,7 +108,7 @@
     if (options.batchMode) {
       var batchRunner = BatchRunner(outSink, errorSink);
       batchRunner.runAsBatch(arguments, (List<String> args) async {
-        var options = CommandLineOptions.parse(resourceProvider, args);
+        var options = CommandLineOptions.parse(resourceProvider, args)!;
         return await _analyzeAll(options);
       });
     } else {
@@ -129,7 +131,7 @@
       for (var i = 0; i < 3; i++) {
         buildSdkSummary(
           resourceProvider: PhysicalResourceProvider.INSTANCE,
-          sdkPath: options.dartSdkPath,
+          sdkPath: options.dartSdkPath!,
         );
       }
 
@@ -137,13 +139,13 @@
     }
 
     if (analysisDriver != null) {
-      _analyzedFileCount += analysisDriver.knownFiles.length;
+      _analyzedFileCount += analysisDriver!.knownFiles.length;
     }
 
     if (options.perfReport != null) {
       var json = makePerfReport(
           startTime, currentTimeMillis, options, _analyzedFileCount, stats);
-      io.File(options.perfReport).writeAsStringSync(json);
+      io.File(options.perfReport!).writeAsStringSync(json);
     }
   }
 
@@ -175,7 +177,7 @@
     SeverityProcessor defaultSeverityProcessor;
     defaultSeverityProcessor = (AnalysisError error) {
       return determineProcessedSeverity(
-          error, options, analysisDriver.analysisOptions);
+          error, options, analysisDriver!.analysisOptions);
     };
 
     // We currently print out to stderr to ensure that when in batch mode we
@@ -213,7 +215,8 @@
     for (var sourcePath in pathList) {
       _analysisContextProvider.configureForPath(sourcePath);
       analysisContext = _analysisContextProvider.analysisContext;
-      analysisDriver = _analysisContextProvider.analysisDriver;
+      final analysisDriver =
+          this.analysisDriver = _analysisContextProvider.analysisDriver;
       pathFilter = _analysisContextProvider.pathFilter;
 
       // Add all the files to be analyzed en masse to the context. Skip any
@@ -250,8 +253,8 @@
             analysisDriver.currentSession.analysisContext.contextRoot.root.path,
           );
           formatter.formatErrors([
-            ErrorsResultImpl(analysisDriver.currentSession, path, null,
-                lineInfo, false, errors)
+            ErrorsResultImpl(analysisDriver.currentSession, path,
+                pathContext.toUri(path), lineInfo, false, errors)
           ]);
           for (var error in errors) {
             var severity = determineProcessedSeverity(
@@ -272,7 +275,7 @@
               errors.addAll(validator.validate(node.nodes));
             }
 
-            if (analysisDriver != null && analysisDriver.analysisOptions.lint) {
+            if (analysisDriver.analysisOptions.lint) {
               var visitors = <LintRule, PubspecVisitor>{};
               for (var linter in analysisDriver.analysisOptions.lintRules) {
                 if (linter is LintRule) {
@@ -301,13 +304,13 @@
             if (errors.isNotEmpty) {
               for (var error in errors) {
                 var severity = determineProcessedSeverity(
-                    error, options, analysisDriver.analysisOptions);
+                    error, options, analysisDriver.analysisOptions)!;
                 allResult = allResult.max(severity);
               }
               var lineInfo = LineInfo.fromContent(content);
               formatter.formatErrors([
-                ErrorsResultImpl(analysisDriver.currentSession, path, null,
-                    lineInfo, false, errors)
+                ErrorsResultImpl(analysisDriver.currentSession, path,
+                    pathContext.toUri(path), lineInfo, false, errors)
               ]);
             }
           } catch (exception) {
@@ -322,12 +325,12 @@
             var errors = validator.validate(
                 content, analysisDriver.analysisOptions.chromeOsManifestChecks);
             formatter.formatErrors([
-              ErrorsResultImpl(analysisDriver.currentSession, path, null,
-                  lineInfo, false, errors)
+              ErrorsResultImpl(analysisDriver.currentSession, path,
+                  pathContext.toUri(path), lineInfo, false, errors)
             ]);
             for (var error in errors) {
               var severity = determineProcessedSeverity(
-                  error, options, analysisDriver.analysisOptions);
+                  error, options, analysisDriver.analysisOptions)!;
               allResult = allResult.max(severity);
             }
           } catch (exception) {
@@ -360,7 +363,7 @@
     // The next batch should not be affected by a previous batch.
     // E.g. the same parts in both batches, but with different libraries.
     for (var path in dartFiles) {
-      analysisDriver.removeFile(path);
+      analysisDriver!.removeFile(path);
     }
 
     // Any dangling parts still in this list were definitely dangling.
@@ -412,6 +415,7 @@
   Future<ErrorSeverity> _runAnalyzer(
       FileState file, CommandLineOptions options, ErrorFormatter formatter) {
     var startTime = currentTimeMillis;
+    final analysisDriver = this.analysisDriver!;
     var analyzer = AnalyzerImpl(analysisDriver.analysisOptions, analysisDriver,
         file, options, stats, startTime);
     return analyzer.analyze(formatter);
@@ -446,9 +450,8 @@
 
   /// Return whether the [newOptions] are equal to the [previous].
   static bool _equalCommandLineOptions(
-      CommandLineOptions previous, CommandLineOptions newOptions) {
+      CommandLineOptions? previous, CommandLineOptions newOptions) {
     return previous != null &&
-        newOptions != null &&
         newOptions.defaultPackagesPath == previous.defaultPackagesPath &&
         _equalMaps(newOptions.declaredVariables, previous.declaredVariables) &&
         newOptions.log == previous.log &&
@@ -460,7 +463,8 @@
         newOptions.lints == previous.lints &&
         newOptions.defaultLanguageVersion == previous.defaultLanguageVersion &&
         newOptions.disableCacheFlushing == previous.disableCacheFlushing &&
-        _equalLists(newOptions.enabledExperiments, previous.enabledExperiments);
+        _equalLists(
+            newOptions.enabledExperiments!, previous.enabledExperiments!);
   }
 
   /// Perform a deep comparison of two string lists.
@@ -494,27 +498,27 @@
   final ResourceProvider _resourceProvider;
   final FileContentCache _fileContentCache;
 
-  CommandLineOptions _commandLineOptions;
-  List<String> _pathList;
+  CommandLineOptions? _commandLineOptions;
+  late List<String> _pathList;
 
-  final Map<Folder, DriverBasedAnalysisContext> _folderContexts = {};
-  AnalysisContextCollectionImpl _collection;
-  DriverBasedAnalysisContext _analysisContext;
+  final Map<Folder, DriverBasedAnalysisContext?> _folderContexts = {};
+  AnalysisContextCollectionImpl? _collection;
+  DriverBasedAnalysisContext? _analysisContext;
 
   _AnalysisContextProvider(this._resourceProvider)
       : _fileContentCache = FileContentCache(_resourceProvider);
 
-  DriverBasedAnalysisContext get analysisContext {
+  DriverBasedAnalysisContext? get analysisContext {
     return _analysisContext;
   }
 
   AnalysisDriver get analysisDriver {
-    return _analysisContext.driver;
+    return _analysisContext!.driver;
   }
 
   /// TODO(scheglov) Use analyzedFiles()
   PathFilter get pathFilter {
-    var contextRoot = analysisContext.contextRoot;
+    var contextRoot = analysisContext!.contextRoot;
     var optionsFile = contextRoot.optionsFile;
 
     // If there is no options file, there can be no excludes.
@@ -524,7 +528,7 @@
 
     // Exclude patterns are relative to the directory with the options file.
     return PathFilter(contextRoot.root.path, optionsFile.parent2.path,
-        analysisContext.analysisOptions.excludePatterns);
+        analysisContext!.analysisOptions.excludePatterns);
   }
 
   void configureForPath(String path) {
@@ -554,10 +558,10 @@
     _collection = AnalysisContextCollectionImpl(
       byteStore: Driver.analysisDriverMemoryByteStore,
       includedPaths: _pathList,
-      optionsFile: _commandLineOptions.defaultAnalysisOptionsPath,
-      packagesFile: _commandLineOptions.defaultPackagesPath,
+      optionsFile: _commandLineOptions!.defaultAnalysisOptionsPath,
+      packagesFile: _commandLineOptions!.defaultPackagesPath,
       resourceProvider: _resourceProvider,
-      sdkPath: _commandLineOptions.dartSdkPath,
+      sdkPath: _commandLineOptions!.dartSdkPath,
       updateAnalysisOptions: _updateAnalysisOptions,
       fileContentCache: _fileContentCache,
     );
@@ -580,10 +584,10 @@
   }
 
   void _setContextForPath(String path) {
-    _analysisContext = _collection.contextFor(path);
+    _analysisContext = _collection!.contextFor(path);
   }
 
   void _updateAnalysisOptions(AnalysisOptionsImpl analysisOptions) {
-    _commandLineOptions.updateAnalysisOptions(analysisOptions);
+    _commandLineOptions!.updateAnalysisOptions(analysisOptions);
   }
 }
diff --git a/pkg/analyzer_cli/lib/src/error_formatter.dart b/pkg/analyzer_cli/lib/src/error_formatter.dart
index f496762..51c7002 100644
--- a/pkg/analyzer_cli/lib/src/error_formatter.dart
+++ b/pkg/analyzer_cli/lib/src/error_formatter.dart
@@ -34,7 +34,7 @@
 
 /// Returns desired severity for the given [error] (or `null` if it's to be
 /// suppressed).
-typedef SeverityProcessor = ErrorSeverity Function(AnalysisError error);
+typedef SeverityProcessor = ErrorSeverity? Function(AnalysisError error);
 
 /// Analysis statistics counter.
 class AnalysisStats {
@@ -113,20 +113,20 @@
   final String message;
   final List<ContextMessage> contextMessages;
   final String errorCode;
-  final String correction;
-  final String url;
+  final String? correction;
+  final String? url;
 
   CLIError({
-    this.severity,
-    this.sourcePath,
-    this.offset,
-    this.line,
-    this.column,
-    this.message,
-    this.contextMessages,
-    this.errorCode,
-    this.correction,
-    this.url,
+    required this.severity,
+    required this.sourcePath,
+    required this.offset,
+    required this.line,
+    required this.column,
+    required this.message,
+    required this.contextMessages,
+    required this.errorCode,
+    required this.correction,
+    required this.url,
   });
 
   @override
@@ -150,7 +150,8 @@
   @override
   int compareTo(CLIError other) {
     // severity
-    var compare = _severityCompare[other.severity] - _severityCompare[severity];
+    var compare =
+        _severityCompare[other.severity]! - _severityCompare[severity]!;
     if (compare != 0) return compare;
 
     // path
@@ -179,12 +180,11 @@
   final StringSink out;
   final CommandLineOptions options;
   final AnalysisStats stats;
-  SeverityProcessor _severityProcessor;
+  final SeverityProcessor _severityProcessor;
 
   ErrorFormatter(this.out, this.options, this.stats,
-      {SeverityProcessor severityProcessor}) {
-    _severityProcessor = severityProcessor ?? _severityIdentity;
-  }
+      {SeverityProcessor? severityProcessor})
+      : _severityProcessor = severityProcessor ?? _severityIdentity;
 
   /// Call to write any batched up errors from [formatErrors].
   void flush();
@@ -213,22 +213,20 @@
 
   /// Compute the severity for this [error] or `null` if this error should be
   /// filtered.
-  ErrorSeverity _computeSeverity(AnalysisError error) =>
+  ErrorSeverity? _computeSeverity(AnalysisError error) =>
       _severityProcessor(error);
 }
 
 class HumanErrorFormatter extends ErrorFormatter {
-  AnsiLogger ansi;
+  late final AnsiLogger ansi = AnsiLogger(options.color);
 
   // This is a Set in order to de-dup CLI errors.
   final Set<CLIError> batchedErrors = {};
 
   HumanErrorFormatter(
       StringSink out, CommandLineOptions options, AnalysisStats stats,
-      {SeverityProcessor severityProcessor})
-      : super(out, options, stats, severityProcessor: severityProcessor) {
-    ansi = AnsiLogger(this.options.color);
-  }
+      {SeverityProcessor? severityProcessor})
+      : super(out, options, stats, severityProcessor: severityProcessor);
 
   @override
   void flush() {
@@ -281,10 +279,10 @@
   void formatError(
       Map<AnalysisError, ErrorsResult> errorToLine, AnalysisError error) {
     var source = error.source;
-    var result = errorToLine[error];
+    var result = errorToLine[error]!;
     var location = result.lineInfo.getLocation(error.offset);
 
-    var severity = _severityProcessor(error);
+    var severity = _severityProcessor(error)!;
 
     // Get display name; translate INFOs into LINTS and HINTS.
     var errorType = severity.displayName;
@@ -297,9 +295,9 @@
 
     // warning • 'foo' is not a bar. • lib/foo.dart:1:2 • foo_warning
     String sourcePath;
-    if (source.uriKind == UriKind.DART_URI) {
+    if (source.uri.isScheme('dart')) {
       sourcePath = source.uri.toString();
-    } else if (source.uriKind == UriKind.PACKAGE_URI) {
+    } else if (source.uri.isScheme('package')) {
       sourcePath = _relative(source.fullName);
       if (sourcePath == source.fullName) {
         // If we weren't able to shorten the path name, use the package: version.
@@ -314,7 +312,7 @@
       if (session is DriverBasedAnalysisContext) {
         var fileResult = session.driver.getFileSync(message.filePath);
         if (fileResult is FileResult) {
-          var lineInfo = fileResult?.lineInfo;
+          var lineInfo = fileResult.lineInfo;
           var location = lineInfo.getLocation(message.offset);
           contextMessages.add(ContextMessage(
               message.filePath,
@@ -343,7 +341,7 @@
 class JsonErrorFormatter extends ErrorFormatter {
   JsonErrorFormatter(
       StringSink out, CommandLineOptions options, AnalysisStats stats,
-      {SeverityProcessor severityProcessor})
+      {SeverityProcessor? severityProcessor})
       : super(out, options, stats, severityProcessor: severityProcessor);
 
   @override
@@ -430,7 +428,7 @@
 
   MachineErrorFormatter(
       StringSink out, CommandLineOptions options, AnalysisStats stats,
-      {SeverityProcessor severityProcessor})
+      {SeverityProcessor? severityProcessor})
       : super(out, options, stats, severityProcessor: severityProcessor);
 
   @override
@@ -444,7 +442,7 @@
       return;
     }
     var source = error.source;
-    var location = errorToLine[error].lineInfo.getLocation(error.offset);
+    var location = errorToLine[error]!.lineInfo.getLocation(error.offset);
     var length = error.length;
 
     var severity = _severityProcessor(error);
diff --git a/pkg/analyzer_cli/lib/src/error_severity.dart b/pkg/analyzer_cli/lib/src/error_severity.dart
index dc7e4ec..23bfe3e 100644
--- a/pkg/analyzer_cli/lib/src/error_severity.dart
+++ b/pkg/analyzer_cli/lib/src/error_severity.dart
@@ -12,17 +12,15 @@
 /// - if [options.enableTypeChecks] is false, then de-escalate checked-mode
 ///   compile time errors to a severity of [ErrorSeverity.INFO].
 /// - if [options.lintsAreFatal] is true, escalate lints to errors.
-ErrorSeverity computeSeverity(
+ErrorSeverity? computeSeverity(
   AnalysisError error,
   CommandLineOptions commandLineOptions,
   AnalysisOptions analysisOptions,
 ) {
-  if (analysisOptions != null) {
-    var processor = ErrorProcessor.getProcessor(analysisOptions, error);
-    // If there is a processor for this error, defer to it.
-    if (processor != null) {
-      return processor.severity;
-    }
+  var processor = ErrorProcessor.getProcessor(analysisOptions, error);
+  // If there is a processor for this error, defer to it.
+  if (processor != null) {
+    return processor.severity;
   }
 
   if (commandLineOptions.lintsAreFatal && error.errorCode is LintCode) {
@@ -34,7 +32,7 @@
 
 /// Check various configuration options to get a desired severity for this
 /// [error] (or `null` if it's to be suppressed).
-ErrorSeverity determineProcessedSeverity(AnalysisError error,
+ErrorSeverity? determineProcessedSeverity(AnalysisError error,
     CommandLineOptions commandLineOptions, AnalysisOptions analysisOptions) {
   var severity = computeSeverity(error, commandLineOptions, analysisOptions);
   // Skip TODOs categorically unless escalated to ERROR or HINT (#26215).
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index fa01214..4ad9d00 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -35,6 +35,8 @@
 
 T cast<T>(dynamic value) => value as T;
 
+T? castNullable<T>(dynamic value) => value as T?;
+
 /// Print the given [message] to stderr and exit with the given [exitCode].
 void printAndFail(String message, {int exitCode = 15}) {
   errorSink.writeln(message);
@@ -53,18 +55,18 @@
   /// The file path of the analysis options file that should be used in place of
   /// any file in the root directory or a parent of the root directory,
   /// or `null` if the normal lookup mechanism should be used.
-  String defaultAnalysisOptionsPath;
+  String? defaultAnalysisOptionsPath;
 
   /// The file path of the .packages file that should be used in place of any
   /// file found using the normal (Package Specification DEP) lookup mechanism,
   /// or `null` if the normal lookup mechanism should be used.
-  String defaultPackagesPath;
+  String? defaultPackagesPath;
 
   /// A table mapping variable names to values for the declared variables.
   final Map<String, String> declaredVariables = {};
 
   /// The path to the dart SDK.
-  String dartSdkPath;
+  String? dartSdkPath;
 
   /// Whether to disable cache flushing. This option can improve analysis
   /// speed at the expense of memory usage. It may also be useful for working
@@ -91,7 +93,7 @@
 
   /// The path to a file to write a performance log.
   /// (Or null if not enabled.)
-  final String perfReport;
+  final String? perfReport;
 
   /// Batch mode (for unit testing)
   final bool batchMode;
@@ -100,7 +102,7 @@
   final bool showPackageWarnings;
 
   /// If not null, show package: warnings only for matching packages.
-  final String showPackageWarningsPrefix;
+  final String? showPackageWarningsPrefix;
 
   /// Whether to show SDK warnings
   final bool showSdkWarnings;
@@ -133,7 +135,7 @@
     ResourceProvider resourceProvider,
     ArgResults args,
   )   : _argResults = args,
-        dartSdkPath = cast(args[_sdkPathOption]),
+        dartSdkPath = castNullable(args[_sdkPathOption]),
         disableCacheFlushing = cast(args['disable-cache-flushing']),
         disableHints = cast(args['no-hints']),
         displayVersion = cast(args['version']),
@@ -141,12 +143,13 @@
         log = cast(args['log']),
         jsonFormat = args['format'] == 'json',
         machineFormat = args['format'] == 'machine',
-        perfReport = cast(args['x-perf-report']),
+        perfReport = castNullable(args['x-perf-report']),
         batchMode = cast(args['batch']),
         showPackageWarnings = cast(args['show-package-warnings']) ||
             cast(args['package-warnings']) ||
             args['x-package-warnings-prefix'] != null,
-        showPackageWarningsPrefix = cast(args['x-package-warnings-prefix']),
+        showPackageWarningsPrefix =
+            castNullable(args['x-package-warnings-prefix']),
         showSdkWarnings = cast(args['sdk-warnings']),
         sourceFiles = args.rest,
         infosAreFatal = cast(args['fatal-infos']) || cast(args['fatal-hints']),
@@ -160,11 +163,11 @@
     //
     defaultAnalysisOptionsPath = _absoluteNormalizedPath(
       resourceProvider,
-      cast(args[_analysisOptionsFileOption]),
+      castNullable(args[_analysisOptionsFileOption]),
     );
     defaultPackagesPath = _absoluteNormalizedPath(
       resourceProvider,
-      cast(args[_packagesOption]),
+      castNullable(args[_packagesOption]),
     );
 
     //
@@ -192,20 +195,20 @@
 
   /// The default language version for files that are not in a package.
   /// (Or null if no default language version to force.)
-  String get defaultLanguageVersion {
-    return cast(_argResults[_defaultLanguageVersionOption]);
+  String? get defaultLanguageVersion {
+    return castNullable(_argResults[_defaultLanguageVersionOption]);
   }
 
   /// A list of the names of the experiments that are to be enabled.
-  List<String> get enabledExperiments {
-    return cast(_argResults[_enableExperimentOption]);
+  List<String>? get enabledExperiments {
+    return castNullable(_argResults[_enableExperimentOption]);
   }
 
-  bool get implicitCasts => _argResults[_implicitCastsFlag] as bool;
+  bool? get implicitCasts => _argResults[_implicitCastsFlag] as bool?;
 
-  bool get lints => _argResults[_lintsFlag] as bool;
+  bool? get lints => _argResults[_lintsFlag] as bool?;
 
-  bool get noImplicitDynamic => _argResults[_noImplicitDynamicFlag] as bool;
+  bool? get noImplicitDynamic => _argResults[_noImplicitDynamicFlag] as bool?;
 
   /// Update the [analysisOptions] with flags that the user specified
   /// explicitly. The [analysisOptions] are usually loaded from one of
@@ -222,7 +225,7 @@
           .restrictToVersion(nonPackageLanguageVersion);
     }
 
-    var enabledExperiments = this.enabledExperiments;
+    var enabledExperiments = this.enabledExperiments!;
     if (enabledExperiments.isNotEmpty) {
       analysisOptions.contextFeatures = FeatureSet.fromEnableFlags2(
         sdkLanguageVersion: ExperimentStatus.currentVersion,
@@ -303,7 +306,7 @@
   /// Parse [args] into [CommandLineOptions] describing the specified
   /// analyzer options. In case of a format error, calls [printAndFail], which
   /// by default prints an error message to stderr and exits.
-  static CommandLineOptions parse(
+  static CommandLineOptions? parse(
       ResourceProvider resourceProvider, List<String> args,
       {void Function(String msg) printAndFail = printAndFail}) {
     var options = _parse(resourceProvider, args);
@@ -335,9 +338,9 @@
     return options;
   }
 
-  static String _absoluteNormalizedPath(
+  static String? _absoluteNormalizedPath(
     ResourceProvider resourceProvider,
-    String path,
+    String? path,
   ) {
     if (path == null) {
       return null;
@@ -425,7 +428,7 @@
     }
   }
 
-  static CommandLineOptions _parse(
+  static CommandLineOptions? _parse(
     ResourceProvider resourceProvider,
     List<String> args,
   ) {
diff --git a/pkg/analyzer_cli/pubspec.yaml b/pkg/analyzer_cli/pubspec.yaml
index 5297838..0580b81 100644
--- a/pkg/analyzer_cli/pubspec.yaml
+++ b/pkg/analyzer_cli/pubspec.yaml
@@ -5,7 +5,7 @@
 publish_to: none
 
 environment:
-  sdk: "^2.7.0"
+  sdk: "^2.14.0"
 
 dependencies:
   analyzer: any
diff --git a/pkg/analyzer_cli/test/analysis_options_test.dart b/pkg/analyzer_cli/test/analysis_options_test.dart
index 0c68a22..72e1bb4 100644
--- a/pkg/analyzer_cli/test/analysis_options_test.dart
+++ b/pkg/analyzer_cli/test/analysis_options_test.dart
@@ -18,15 +18,10 @@
 
 @reflectiveTest
 class OptionsTest {
-  _Runner runner;
-
-  void setUp() {
-    runner = _Runner.setUp();
-  }
+  final _Runner runner = _Runner.setUp();
 
   void tearDown() {
     runner.tearDown();
-    runner = null;
   }
 
   Future<void> test_options() async {
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index 19d778d..de57da2 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -34,16 +34,16 @@
 class BaseTest {
   static const emptyOptionsFile = 'data/empty_options.yaml';
 
-  StringSink _savedOutSink, _savedErrorSink;
-  int _savedExitCode;
-  ExitHandler _savedExitHandler;
+  late StringSink _savedOutSink, _savedErrorSink;
+  late int _savedExitCode;
+  late ExitHandler _savedExitHandler;
 
-  Driver driver;
+  late Driver driver;
 
-  AnalysisOptions get analysisOptions => driver.analysisDriver.analysisOptions;
+  AnalysisOptions get analysisOptions => driver.analysisDriver!.analysisOptions;
 
   /// Normalize text with bullets.
-  String bulletToDash(StringSink item) => '$item'.replaceAll('•', '-');
+  String bulletToDash(StringSink? item) => '$item'.replaceAll('•', '-');
 
   /// Start a driver for the given [source], optionally providing additional
   /// [args] and an [options] file path. The value of [options] defaults to an
@@ -60,7 +60,7 @@
   /// Like [drive], but takes an array of sources.
   Future<void> driveMany(
     List<String> sources, {
-    String options = emptyOptionsFile,
+    String? options = emptyOptionsFile,
     List<String> args = const <String>[],
   }) async {
     options = _posixToPlatformPath(options);
@@ -112,7 +112,7 @@
   ///
   /// This is a utility method for testing; paths passed in to other methods in
   /// this class are never converted automatically.
-  String _posixToPlatformPath(String filePath) {
+  String? _posixToPlatformPath(String? filePath) {
     if (filePath == null) {
       return null;
     }
@@ -359,7 +359,7 @@
       expect(
           bulletToDash(outSink),
           contains(
-              'warning - The feature android.software.home_screen is not supported on Chrome OS'));
+              "warning - The feature android.software.home_screen isn't supported on Chrome OS"));
       expect(exitCode, 0);
     });
   }
@@ -464,7 +464,7 @@
     ]);
     expect(processorFor(missing_return).severity, ErrorSeverity.ERROR);
     expect(bulletToDash(outSink),
-        contains("error - This function has a return type of 'int'"));
+        contains("error - The body might complete normally"));
     expect(outSink.toString(), contains('1 error and 1 warning found.'));
   }
 
diff --git a/pkg/analyzer_cli/test/embedder_test.dart b/pkg/analyzer_cli/test/embedder_test.dart
index 3420843..584f477 100644
--- a/pkg/analyzer_cli/test/embedder_test.dart
+++ b/pkg/analyzer_cli/test/embedder_test.dart
@@ -12,8 +12,8 @@
 
 void main() {
   group('_embedder.yaml', () {
-    StringSink savedOutSink, savedErrorSink;
-    int savedExitCode;
+    late StringSink savedOutSink, savedErrorSink;
+    late int savedExitCode;
 
     setUp(() {
       savedOutSink = outSink;
diff --git a/pkg/analyzer_cli/test/errors_reported_once_test.dart b/pkg/analyzer_cli/test/errors_reported_once_test.dart
index d25a78e..9fdabc2 100644
--- a/pkg/analyzer_cli/test/errors_reported_once_test.dart
+++ b/pkg/analyzer_cli/test/errors_reported_once_test.dart
@@ -18,9 +18,9 @@
 
 @reflectiveTest
 class ErrorsReportedOnceTest {
-  StringSink savedOutSink, savedErrorSink;
-  int savedExitCode;
-  ExitHandler savedExitHandler;
+  late StringSink savedOutSink, savedErrorSink;
+  late int savedExitCode;
+  late ExitHandler savedExitHandler;
 
   void setUp() {
     savedOutSink = outSink;
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 16d79dd..510a9ad 100644
--- a/pkg/analyzer_cli/test/errors_upgrade_fails_cli_test.dart
+++ b/pkg/analyzer_cli/test/errors_upgrade_fails_cli_test.dart
@@ -18,9 +18,9 @@
 
 @reflectiveTest
 class ErrorUpgradeFailsCli {
-  StringSink savedOutSink, savedErrorSink;
-  int savedExitCode;
-  ExitHandler savedExitHandler;
+  late StringSink savedOutSink, savedErrorSink;
+  late int savedExitCode;
+  late ExitHandler savedExitHandler;
 
   void setUp() {
     savedOutSink = outSink;
diff --git a/pkg/analyzer_cli/test/mocks.dart b/pkg/analyzer_cli/test/mocks.dart
index 405448e..a8b487a 100644
--- a/pkg/analyzer_cli/test/mocks.dart
+++ b/pkg/analyzer_cli/test/mocks.dart
@@ -32,10 +32,10 @@
   List<DiagnosticMessage> get contextMessages => const [];
 
   @override
-  String get correction => null;
+  String? get correction => null;
 
   @override
-  String get correctionMessage => null;
+  String? get correctionMessage => null;
 
   @override
   DiagnosticMessage get problemMessage => DiagnosticMessageImpl(
@@ -46,7 +46,7 @@
       url: null);
 
   @override
-  Severity get severity => null;
+  Severity get severity => Severity.error;
 }
 
 class MockAnalysisErrorInfo implements AnalysisErrorInfo {
@@ -87,7 +87,7 @@
   String name;
 
   @override
-  String url;
+  String? url;
 
   MockErrorCode(this.type, this.errorSeverity, this.name);
 
@@ -120,7 +120,7 @@
 }
 
 class MockLineInfo implements LineInfo {
-  CharacterLocation defaultLocation;
+  CharacterLocation? defaultLocation;
 
   MockLineInfo({this.defaultLocation});
 
@@ -137,7 +137,7 @@
   @override
   CharacterLocation getLocation(int offset) {
     if (defaultLocation != null) {
-      return defaultLocation;
+      return defaultLocation!;
     }
     throw StateError('Unexpected invocation of getLocation');
   }
@@ -155,55 +155,13 @@
 
 class MockSource implements Source {
   @override
-  String fullName;
-
-  MockSource(this.fullName);
+  final String fullName;
 
   @override
-  TimestampedData<String> get contents {
-    throw StateError('Unexpected invocation of contents');
-  }
+  final Uri uri;
+
+  MockSource(this.fullName, this.uri);
 
   @override
-  String get encoding {
-    throw StateError('Unexpected invocation of encoding');
-  }
-
-  @override
-  bool get isInSystemLibrary {
-    throw StateError('Unexpected invocation of isInSystemLibrary');
-  }
-
-  @override
-  Source get librarySource {
-    throw StateError('Unexpected invocation of librarySource');
-  }
-
-  @override
-  int get modificationStamp {
-    throw StateError('Unexpected invocation of modificationStamp');
-  }
-
-  @override
-  String get shortName {
-    throw StateError('Unexpected invocation of shortName');
-  }
-
-  @override
-  Source get source {
-    throw StateError('Unexpected invocation of source');
-  }
-
-  @override
-  Uri get uri {
-    throw StateError('Unexpected invocation of uri');
-  }
-
-  @override
-  UriKind get uriKind => null; //UriKind.FILE_URI;
-
-  @override
-  bool exists() {
-    throw StateError('Unexpected invocation of exists');
-  }
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
diff --git a/pkg/analyzer_cli/test/options_test.dart b/pkg/analyzer_cli/test/options_test.dart
index 4b7167b..1c151dd 100644
--- a/pkg/analyzer_cli/test/options_test.dart
+++ b/pkg/analyzer_cli/test/options_test.dart
@@ -24,11 +24,11 @@
       var outStringBuffer = StringBuffer();
       var errorStringBuffer = StringBuffer();
 
-      StringSink savedOutSink, savedErrorSink;
-      int savedExitCode;
-      ExitHandler savedExitHandler;
+      late StringSink savedOutSink, savedErrorSink;
+      late int savedExitCode;
+      late ExitHandler savedExitHandler;
 
-      CommandLineOptions parse(List<String> args,
+      CommandLineOptions? parse(List<String> args,
           {void Function(String msg) printAndFail = printAndFail}) {
         var resourceProvider = PhysicalResourceProvider.INSTANCE;
         return CommandLineOptions.parse(resourceProvider, args,
@@ -53,7 +53,7 @@
       });
 
       test('defaults', () {
-        var options = parse(['--dart-sdk', '.', 'foo.dart']);
+        var options = parse(['--dart-sdk', '.', 'foo.dart'])!;
         expect(options, isNotNull);
         expect(options.dartSdkPath, isNotNull);
         expect(options.disableCacheFlushing, isFalse);
@@ -78,19 +78,19 @@
       });
 
       test('batch', () {
-        var options = parse(['--dart-sdk', '.', '--batch']);
+        var options = parse(['--dart-sdk', '.', '--batch'])!;
         expect(options.batchMode, isTrue);
       });
 
       test('defined variables', () {
-        var options = parse(['--dart-sdk', '.', '-Dfoo=bar', 'foo.dart']);
+        var options = parse(['--dart-sdk', '.', '-Dfoo=bar', 'foo.dart'])!;
         expect(options.declaredVariables['foo'], equals('bar'));
         expect(options.declaredVariables['bar'], isNull);
       });
 
       test('disable cache flushing', () {
         var options =
-            parse(['--dart-sdk', '.', '--disable-cache-flushing', 'foo.dart']);
+            parse(['--dart-sdk', '.', '--disable-cache-flushing', 'foo.dart'])!;
         expect(options.disableCacheFlushing, isTrue);
       });
 
@@ -126,119 +126,126 @@
         };
 
         test('no values', () {
-          var options =
-              overrideKnownFeatures(knownFeatures, () => parse(['foo.dart']));
+          var options = overrideKnownFeatures(
+              knownFeatures, (() => parse(['foo.dart'])!));
           expect(options.enabledExperiments, isEmpty);
         });
 
         test('single value', () {
           var options = overrideKnownFeatures(knownFeatures,
-              () => parse(['--enable-experiment', 'a', 'foo.dart']));
+              (() => parse(['--enable-experiment', 'a', 'foo.dart'])!));
           expect(options.enabledExperiments, ['a']);
         });
 
         group('multiple values', () {
           test('single flag', () {
             var options = overrideKnownFeatures(knownFeatures,
-                () => parse(['--enable-experiment', 'a,b', 'foo.dart']));
+                (() => parse(['--enable-experiment', 'a,b', 'foo.dart'])!));
             expect(options.enabledExperiments, ['a', 'b']);
           });
 
           test('mixed single and multiple flags', () {
             var options = overrideKnownFeatures(
                 knownFeatures,
-                () => parse([
+                (() => parse([
                       '--enable-experiment',
                       'a,b',
                       '--enable-experiment',
                       'c',
                       'foo.dart'
-                    ]));
+                    ])!));
             expect(options.enabledExperiments, ['a', 'b', 'c']);
           });
 
           test('multiple flags', () {
             var options = overrideKnownFeatures(
                 knownFeatures,
-                () => parse([
+                (() => parse([
                       '--enable-experiment',
                       'a',
                       '--enable-experiment',
                       'b',
                       'foo.dart'
-                    ]));
+                    ])!));
             expect(options.enabledExperiments, ['a', 'b']);
           });
         });
       });
 
       test('hintsAreFatal', () {
-        var options = parse(['--dart-sdk', '.', '--fatal-hints', 'foo.dart']);
+        var options = parse(['--dart-sdk', '.', '--fatal-hints', 'foo.dart'])!;
         expect(options.infosAreFatal, isTrue);
       });
 
       test('infosAreFatal', () {
-        var options = parse(['--dart-sdk', '.', '--fatal-infos', 'foo.dart']);
+        var options = parse(['--dart-sdk', '.', '--fatal-infos', 'foo.dart'])!;
         expect(options.infosAreFatal, isTrue);
       });
 
       test('log', () {
-        var options = parse(['--dart-sdk', '.', '--log', 'foo.dart']);
+        var options = parse(['--dart-sdk', '.', '--log', 'foo.dart'])!;
         expect(options.log, isTrue);
       });
 
       group('format', () {
         test('json', () {
-          var options = parse(['--dart-sdk', '.', '--format=json', 'foo.dart']);
+          var options =
+              parse(['--dart-sdk', '.', '--format=json', 'foo.dart'])!;
           expect(options.jsonFormat, isTrue);
           expect(options.machineFormat, isFalse);
         });
 
         test('machine', () {
           var options =
-              parse(['--dart-sdk', '.', '--format=machine', 'foo.dart']);
+              parse(['--dart-sdk', '.', '--format=machine', 'foo.dart'])!;
           expect(options.jsonFormat, isFalse);
           expect(options.machineFormat, isTrue);
         });
       });
 
       test('no-hints', () {
-        var options = parse(['--dart-sdk', '.', '--no-hints', 'foo.dart']);
+        var options = parse(['--dart-sdk', '.', '--no-hints', 'foo.dart'])!;
         expect(options.disableHints, isTrue);
       });
 
       test('options', () {
-        var options =
-            parse(['--dart-sdk', '.', '--options', 'options.yaml', 'foo.dart']);
+        var options = parse(
+            ['--dart-sdk', '.', '--options', 'options.yaml', 'foo.dart'])!;
         expect(options.defaultAnalysisOptionsPath, endsWith('options.yaml'));
       });
 
       test('lints', () {
-        var options = parse(['--dart-sdk', '.', '--lints', 'foo.dart']);
+        var options = parse(['--dart-sdk', '.', '--lints', 'foo.dart'])!;
         expect(options.lints, isTrue);
       });
 
       test('package warnings', () {
         var options =
-            parse(['--dart-sdk', '.', '--package-warnings', 'foo.dart']);
+            parse(['--dart-sdk', '.', '--package-warnings', 'foo.dart'])!;
         expect(options.showPackageWarnings, isTrue);
       });
 
       test('sdk warnings', () {
-        var options = parse(['--dart-sdk', '.', '--sdk-warnings', 'foo.dart']);
+        var options = parse(['--dart-sdk', '.', '--sdk-warnings', 'foo.dart'])!;
         expect(options.showSdkWarnings, isTrue);
       });
 
       test('sourceFiles', () {
-        var options = parse(
-            ['--dart-sdk', '.', '--log', 'foo.dart', 'foo2.dart', 'foo3.dart']);
+        var options = parse([
+          '--dart-sdk',
+          '.',
+          '--log',
+          'foo.dart',
+          'foo2.dart',
+          'foo3.dart'
+        ])!;
         expect(options.sourceFiles,
             equals(['foo.dart', 'foo2.dart', 'foo3.dart']));
       });
 
       test('warningsAreFatal', () {
         var options =
-            parse(['--dart-sdk', '.', '--fatal-warnings', 'foo.dart']);
+            parse(['--dart-sdk', '.', '--fatal-warnings', 'foo.dart'])!;
         expect(options.warningsAreFatal, isTrue);
       });
 
@@ -250,25 +257,25 @@
           '--dart-sdk',
           '.',
           'foo.dart'
-        ]);
+        ])!;
         expect(options, isNotNull);
         expect(options.sourceFiles, equals(['foo.dart']));
       });
 
       test('hintsAreFatal', () {
-        var options = parse(['--dart-sdk', '.', '--fatal-lints', 'foo.dart']);
+        var options = parse(['--dart-sdk', '.', '--fatal-lints', 'foo.dart'])!;
         expect(options.lintsAreFatal, isTrue);
       });
 
       test('bad SDK dir', () {
-        String failureMessage;
+        String? failureMessage;
         parse(['--dart-sdk', '&&&&&', 'foo.dart'],
             printAndFail: (msg) => failureMessage = msg);
         expect(failureMessage, equals('Invalid Dart SDK path: &&&&&'));
       });
 
       test('--train-snapshot', () {
-        var options = parse(['--train-snapshot', 'foo.dart']);
+        var options = parse(['--train-snapshot', 'foo.dart'])!;
         expect(options.trainSnapshot, isTrue);
       });
     });
@@ -278,13 +285,13 @@
 
 @reflectiveTest
 class ArgumentsTest with ResourceProviderMixin {
-  CommandLineOptions commandLineOptions;
-  String failureMessage;
+  CommandLineOptions? commandLineOptions;
+  String? failureMessage;
 
   void test_declaredVariables() {
     _parse(['-Da=0', '-Db=', 'a.dart']);
 
-    var definedVariables = commandLineOptions.declaredVariables;
+    var definedVariables = commandLineOptions!.declaredVariables;
 
     expect(definedVariables['a'], '0');
     expect(definedVariables['b'], '');
@@ -296,7 +303,7 @@
     _parse(['--options=$expected', 'a.dart']);
 
     expect(
-      commandLineOptions.defaultAnalysisOptionsPath,
+      commandLineOptions!.defaultAnalysisOptionsPath,
       endsWith(expected),
     );
   }
@@ -306,16 +313,16 @@
     _parse(['--packages=$expected', 'a.dart']);
 
     expect(
-      commandLineOptions.defaultPackagesPath,
+      commandLineOptions!.defaultPackagesPath,
       endsWith(expected),
     );
   }
 
   void test_defaults() {
     _parse(['a.dart']);
-    expect(commandLineOptions.declaredVariables, isEmpty);
-    expect(commandLineOptions.defaultAnalysisOptionsPath, isNull);
-    expect(commandLineOptions.defaultPackagesPath, isNull);
+    expect(commandLineOptions!.declaredVariables, isEmpty);
+    expect(commandLineOptions!.defaultAnalysisOptionsPath, isNull);
+    expect(commandLineOptions!.defaultPackagesPath, isNull);
   }
 
   void test_filterUnknownArguments() {
@@ -554,7 +561,7 @@
     var analysisOptions = AnalysisOptionsImpl();
     configureInitial(analysisOptions);
 
-    commandLineOptions.updateAnalysisOptions(analysisOptions);
+    commandLineOptions!.updateAnalysisOptions(analysisOptions);
     checkApplied(analysisOptions);
   }
 
diff --git a/pkg/analyzer_cli/test/package_prefix_test.dart b/pkg/analyzer_cli/test/package_prefix_test.dart
index 157ffe9..9aa0d57 100644
--- a/pkg/analyzer_cli/test/package_prefix_test.dart
+++ b/pkg/analyzer_cli/test/package_prefix_test.dart
@@ -13,7 +13,7 @@
 
 void main() {
   group('--x-package-warnings-prefix', () {
-    _Runner runner;
+    late _Runner runner;
 
     setUp(() {
       runner = _Runner.setUp();
@@ -21,7 +21,6 @@
 
     tearDown(() {
       runner.tearDown();
-      runner = null;
     });
 
     test('shows only the hint whose package matches the prefix', () async {
diff --git a/pkg/analyzer_cli/test/perf_report_test.dart b/pkg/analyzer_cli/test/perf_report_test.dart
index 933b455..321bb89 100644
--- a/pkg/analyzer_cli/test/perf_report_test.dart
+++ b/pkg/analyzer_cli/test/perf_report_test.dart
@@ -15,7 +15,7 @@
     var options = CommandLineOptions.parse(
       PhysicalResourceProvider.INSTANCE,
       ['somefile.dart'],
-    );
+    )!;
     var encoded = makePerfReport(1000, 1234, options, 0, AnalysisStats());
 
     var jsonData = json.decode(encoded);
diff --git a/pkg/analyzer_cli/test/reporter_test.dart b/pkg/analyzer_cli/test/reporter_test.dart
index e0edaba..cffb0ff 100644
--- a/pkg/analyzer_cli/test/reporter_test.dart
+++ b/pkg/analyzer_cli/test/reporter_test.dart
@@ -2,21 +2,23 @@
 // for details. All 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/error/error.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/analysis/results.dart';
 import 'package:analyzer_cli/src/ansi.dart' as ansi;
 import 'package:analyzer_cli/src/error_formatter.dart';
+import 'package:path/path.dart' as package_path;
 import 'package:test/test.dart' hide ErrorFormatter;
 
 import 'mocks.dart';
 
 void main() {
   group('reporter', () {
-    StringBuffer out;
-    AnalysisStats stats;
-    MockCommandLineOptions options;
-    ErrorFormatter reporter;
+    late StringBuffer out;
+    late AnalysisStats stats;
+    late MockCommandLineOptions options;
+    late ErrorFormatter reporter;
 
     setUp(() {
       ansi.runningTests = true;
@@ -102,9 +104,15 @@
 
   // Details
   var code = MockErrorCode(type, severity, 'mock_code');
-  var source = MockSource('/foo/bar/baz.dart');
+  var path = '/foo/bar/baz.dart';
+  var source = MockSource(path, package_path.toUri(path));
   var error = MockAnalysisError(source, code, 20, 'MSG');
 
-  return ErrorsResultImpl(
-      null, source.fullName, null, lineInfo, false, [error]);
+  return ErrorsResultImpl(_MockAnslysisSession(), source.fullName,
+      Uri.file('/'), lineInfo, false, [error]);
+}
+
+class _MockAnslysisSession implements AnalysisSession {
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
diff --git a/pkg/analyzer_cli/test/strong_mode_test.dart b/pkg/analyzer_cli/test/strong_mode_test.dart
index 914a3ef..2f9dc3f 100644
--- a/pkg/analyzer_cli/test/strong_mode_test.dart
+++ b/pkg/analyzer_cli/test/strong_mode_test.dart
@@ -29,7 +29,7 @@
     expect(exitCode, 3);
     var stdout = bulletToDash(outSink);
     expect(stdout, contains("isn't a valid override of"));
-    expect(stdout, contains('error - The list literal type'));
+    expect(stdout, contains('error - A value of type'));
     expect(stdout, contains('2 errors found'));
   }
 }
diff --git a/pkg/analyzer_cli/tool/perf.dart b/pkg/analyzer_cli/tool/perf.dart
index e4e3dcb..2ad2424 100644
--- a/pkg/analyzer_cli/tool/perf.dart
+++ b/pkg/analyzer_cli/tool/perf.dart
@@ -19,7 +19,6 @@
 import 'package:analyzer/src/dart/sdk/sdk.dart' show FolderBasedDartSdk;
 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/source/package_map_resolver.dart';
 
 void main(List<String> args) async {
@@ -64,12 +63,12 @@
 int scanTotalChars = 0;
 
 /// Factory to load and resolve app, packages, and sdk sources.
-SourceFactory sources;
+late SourceFactory sources;
 
 /// Add to [files] all sources reachable from [start].
-void collectSources(Source start, Set<Source> files) {
+void collectSources(Source? start, Set<Source?> files) {
   if (!files.add(start)) return;
-  var unit = parseDirectives(start);
+  var unit = parseDirectives(start!);
   for (var directive in unit.directives) {
     if (directive is UriBasedDirective) {
       var next = sources.resolveUri(start, directive.uri.stringValue);
@@ -90,7 +89,7 @@
 }
 
 /// Parses every file in [files] and reports the time spent doing so.
-void parseFiles(Set<Source> files) {
+void parseFiles(Set<Source?> files) {
   // The code below will record again how many chars are scanned and how long it
   // takes to scan them, even though we already did so in [scanReachableFiles].
   // Recording and reporting this twice is unnecessary, but we do so for now to
@@ -100,7 +99,7 @@
   scanTotalChars = 0;
   var parseTimer = Stopwatch()..start();
   for (var source in files) {
-    parseFull(source);
+    parseFull(source!);
   }
   parseTimer.stop();
 
@@ -133,7 +132,7 @@
 }
 
 /// Scans every file in [files] and reports the time spent doing so.
-void scanFiles(Set<Source> files) {
+void scanFiles(Set<Source?> files) {
   // The code below will record again how many chars are scanned and how long it
   // takes to scan them, even though we already did so in [scanReachableFiles].
   // Recording and reporting this twice is unnecessary, but we do so for now to
@@ -142,7 +141,7 @@
   var old = scanTotalChars;
   scanTotalChars = 0;
   for (var source in files) {
-    tokenize(source);
+    tokenize(source!);
   }
 
   // Report size and scanning time again. See discussion above.
@@ -152,8 +151,8 @@
 
 /// Load and scans all files we need to process: files reachable from the
 /// entrypoint and all core libraries automatically included by the VM.
-Set<Source> scanReachableFiles(Uri entryUri) {
-  var files = <Source>{};
+Set<Source?> scanReachableFiles(Uri entryUri) {
+  var files = <Source?>{};
   var loadTimer = Stopwatch()..start();
   collectSources(sources.forUri2(entryUri), files);
 
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 a9597f7..d2d24b8 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
@@ -242,6 +242,13 @@
   }
 
   @override
+  bool hasEditsFor(String path) {
+    return _dartFileEditBuilders.containsKey(path) ||
+        _genericFileEditBuilders.containsKey(path) ||
+        _yamlFileEditBuilders.containsKey(path);
+  }
+
+  @override
   void setSelection(Position position) {
     _selection = position;
   }
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 9b0c895..104fc79 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
@@ -17,6 +17,7 @@
     hide Element, ElementKind;
 import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/src/utilities/charcodes.dart';
+import 'package:analyzer_plugin/src/utilities/library.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';
@@ -1337,11 +1338,6 @@
   /// the names used in generated code, to information about these imports.
   Map<Uri, _LibraryToImport> librariesToImport = {};
 
-  /// A mapping from libraries that need to be imported relatively in order to
-  /// make visible the names used in generated code, to information about these
-  /// imports.
-  Map<String, _LibraryToImport> librariesToRelativelyImport = {};
-
   /// Initialize a newly created builder to build a source file edit within the
   /// change being built by the given [changeBuilder]. The file being edited has
   /// the given [resolvedUnit] and [timeStamp].
@@ -1350,10 +1346,7 @@
       : super(changeBuilder, resolvedUnit.path, timeStamp);
 
   @override
-  bool get hasEdits =>
-      super.hasEdits ||
-      librariesToImport.isNotEmpty ||
-      librariesToRelativelyImport.isNotEmpty;
+  bool get hasEdits => super.hasEdits || librariesToImport.isNotEmpty;
 
   @override
   void addInsertion(
@@ -1402,9 +1395,6 @@
     for (var entry in librariesToImport.entries) {
       copy.librariesToImport[entry.key] = entry.value;
     }
-    for (var entry in librariesToRelativelyImport.entries) {
-      copy.librariesToRelativelyImport[entry.key] = entry.value;
-    }
     return copy;
   }
 
@@ -1418,9 +1408,6 @@
     if (librariesToImport.isNotEmpty) {
       _addLibraryImports(librariesToImport.values);
     }
-    if (librariesToRelativelyImport.isNotEmpty) {
-      _addLibraryImports(librariesToRelativelyImport.values);
-    }
   }
 
   @override
@@ -1480,8 +1467,12 @@
     return ImportLibraryElementResultImpl(null);
   }
 
-  String importLibraryWithRelativeUri(String uriText, [String? prefix]) {
-    return _importLibraryWithRelativeUri(uriText, prefix).uriText;
+  String importLibraryWithAbsoluteUri(Uri uri, [String? prefix]) {
+    return _importLibrary(uri, prefix: prefix, forceAbsolute: true).uriText;
+  }
+
+  String importLibraryWithRelativeUri(Uri uri, [String? prefix]) {
+    return _importLibrary(uri, prefix: prefix, forceRelative: true).uriText;
   }
 
   @override
@@ -1720,24 +1711,55 @@
   }
 
   /// Computes the best URI to import [uri] into the target library.
-  String _getLibraryUriText(Uri uri) {
-    if (uri.scheme == 'file') {
-      var pathContext = resolvedUnit.session.resourceProvider.pathContext;
-      var whatPath = pathContext.fromUri(uri);
+  ///
+  /// [uri] may be converted from an absolute URI to a relative URI depending on
+  /// user preferences/lints unless [forceAbsolute] or [forceRelative] are `true`.
+  String _getLibraryUriText(
+    Uri uri, {
+    bool forceAbsolute = false,
+    bool forceRelative = false,
+  }) {
+    var pathContext = resolvedUnit.session.resourceProvider.pathContext;
+
+    /// Returns the relative path to import [whatPath] into [resolvedUnit].
+    String getRelativePath(String whatPath) {
       var libraryPath = resolvedUnit.libraryElement.source.fullName;
       var libraryFolder = pathContext.dirname(libraryPath);
       var relativeFile = pathContext.relative(whatPath, from: libraryFolder);
       return pathContext.split(relativeFile).join('/');
     }
+
+    if (uri.isScheme('file')) {
+      var whatPath = pathContext.fromUri(uri);
+      return getRelativePath(whatPath);
+    }
+    var preferRelative = _isLintEnabled('prefer_relative_imports');
+    if (forceRelative || (preferRelative && !forceAbsolute)) {
+      if (canBeRelativeImport(uri, resolvedUnit.uri)) {
+        var whatPath = resolvedUnit.session.uriConverter.uriToPath(uri);
+        if (whatPath != null) {
+          return getRelativePath(whatPath);
+        }
+      }
+    }
     return uri.toString();
   }
 
   /// Arrange to have an import added for the library with the given [uri].
-  _LibraryToImport _importLibrary(Uri uri) {
+  ///
+  /// [uri] may be converted from an absolute URI to a relative URI depending on
+  /// user preferences/lints unless [forceAbsolute] or [forceRelative] are `true`.
+  _LibraryToImport _importLibrary(
+    Uri uri, {
+    String? prefix,
+    bool forceAbsolute = false,
+    bool forceRelative = false,
+  }) {
     var import = (libraryChangeBuilder ?? this).librariesToImport[uri];
     if (import == null) {
-      var uriText = _getLibraryUriText(uri);
-      var prefix =
+      var uriText = _getLibraryUriText(uri,
+          forceAbsolute: forceAbsolute, forceRelative: forceRelative);
+      prefix ??=
           importPrefixGenerator != null ? importPrefixGenerator!(uri) : null;
       import = _LibraryToImport(uriText, prefix);
       (libraryChangeBuilder ?? this).librariesToImport[uri] = import;
@@ -1745,23 +1767,17 @@
     return import;
   }
 
-  /// Arrange to have an import added for the library with the given relative
-  /// [uriText].
-  _LibraryToImport _importLibraryWithRelativeUri(String uriText,
-      [String? prefix]) {
-    var import = librariesToRelativelyImport[uriText];
-    if (import == null) {
-      import = _LibraryToImport(uriText, prefix);
-      librariesToRelativelyImport[uriText] = import;
-    }
-    return import;
-  }
-
   /// Return `true` if the [element] is defined in the target library.
   bool _isDefinedLocally(Element element) {
     return element.library == resolvedUnit.libraryElement;
   }
 
+  bool _isLintEnabled(String lintName) {
+    final analysisOptions =
+        resolvedUnit.session.analysisContext.analysisOptions;
+    return analysisOptions.isLintEnabled(lintName);
+  }
+
   /// Create an edit to replace the return type of the innermost function
   /// containing the given [node] with the type `Future`. The [typeProvider] is
   /// used to check the current return type, because if it is already `Future`
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 2fe6603..bb03fc8 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart
@@ -69,9 +69,6 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class CompletionTarget {
-  /// The compilation unit in which the completion is occurring.
-  final CompilationUnit unit;
-
   /// The offset within the source at which the completion is being requested.
   final int offset;
 
@@ -122,14 +119,8 @@
   ParameterElement? _parameterElement;
 
   /// Compute the appropriate [CompletionTarget] for the given [offset] within
-  /// the [compilationUnit].
-  ///
-  /// Optionally, start the search from within [entryPoint] instead of using
-  /// the [compilationUnit], which is useful for analyzing ASTs that have no
-  /// [compilationUnit] such as dart expressions within angular templates.
-  factory CompletionTarget.forOffset(
-      CompilationUnit compilationUnit, int offset,
-      {AstNode? entryPoint}) {
+  /// the [entryPoint].
+  factory CompletionTarget.forOffset(AstNode entryPoint, int offset) {
     // The precise algorithm is as follows. We perform a depth-first search of
     // all edges in the parse tree (both those that point to AST nodes and
     // those that point to tokens), visiting parents before children. The
@@ -144,7 +135,6 @@
     // prune the search to the point where no recursion is necessary; at each
     // step in the process we know exactly which child node we need to proceed
     // to.
-    entryPoint ??= compilationUnit;
     var containingNode = entryPoint;
     outerLoop:
     while (true) {
@@ -167,11 +157,10 @@
             var commentToken = _getContainingCommentToken(entity, offset);
             if (commentToken != null) {
               return CompletionTarget._(
-                  compilationUnit, offset, containingNode, commentToken, true);
+                  offset, containingNode, commentToken, true);
             }
             // Target found.
-            return CompletionTarget._(
-                compilationUnit, offset, containingNode, entity, false);
+            return CompletionTarget._(offset, containingNode, entity, false);
           } else {
             // Since entity is a token, we don't need to look inside it; just
             // proceed to the next entity.
@@ -198,14 +187,13 @@
                   _getContainingDocComment(containingNode, commentToken);
               if (docComment != null) {
                 return CompletionTarget._(
-                    compilationUnit, offset, docComment, commentToken, false);
+                    offset, docComment, commentToken, false);
               } else {
-                return CompletionTarget._(compilationUnit, offset,
-                    compilationUnit, commentToken, true);
+                return CompletionTarget._(
+                    offset, entryPoint, commentToken, true);
               }
             }
-            return CompletionTarget._(
-                compilationUnit, offset, containingNode, entity, false);
+            return CompletionTarget._(offset, containingNode, entity, false);
           }
 
           // Otherwise, the completion target is somewhere inside the entity,
@@ -228,23 +216,23 @@
       assert(identical(containingNode, entryPoint));
 
       // Check for comments on the EOF token (trailing comments in a file).
-      var commentToken =
-          _getContainingCommentToken(compilationUnit.endToken, offset);
-      if (commentToken != null) {
-        return CompletionTarget._(
-            compilationUnit, offset, compilationUnit, commentToken, true);
+      if (entryPoint is CompilationUnit) {
+        var commentToken =
+            _getContainingCommentToken(entryPoint.endToken, offset);
+        if (commentToken != null) {
+          return CompletionTarget._(offset, entryPoint, commentToken, true);
+        }
       }
 
       // Since no completion target was found, we set the completion target
       // entity to null and use the entryPoint as the parent.
-      return CompletionTarget._(
-          compilationUnit, offset, entryPoint, null, false);
+      return CompletionTarget._(offset, entryPoint, null, false);
     }
   }
 
   /// Create a [CompletionTarget] holding the given [containingNode] and
   /// [entity].
-  CompletionTarget._(this.unit, this.offset, AstNode containingNode,
+  CompletionTarget._(this.offset, AstNode containingNode,
       SyntacticEntity? entity, this.isCommentText)
       : containingNode = containingNode,
         entity = entity,
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
index dea31e3..2110c49 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
@@ -20,22 +19,12 @@
 /// suggestions should be made based upon the type of node in which the
 /// suggestions were requested.
 class OpType {
-  /// The [TypeSystem] used during resolution of the current unit.
-  TypeSystem? _typeSystem;
-
   /// Indicates whether constructor suggestions should be included.
   bool includeConstructorSuggestions = false;
 
   /// Indicates whether type names should be suggested.
   bool includeTypeNameSuggestions = false;
 
-  /// If [includeTypeNameSuggestions] is set to true, then this function may
-  /// be set to a non-default function to filter out potential suggestions
-  /// (null) based on their static [DartType], or change the relative relevance
-  /// by returning a higher or lower relevance.
-  SuggestionsFilter typeNameSuggestionsFilter =
-      (DartType _, int relevance) => relevance;
-
   /// Indicates whether setters along with methods and functions that
   /// have a [void] return type should be suggested.
   bool includeVoidReturnSuggestions = false;
@@ -76,10 +65,6 @@
   /// An representation of the location at which completion was requested.
   String? completionLocation;
 
-  /// The type that is required by the context in which the completion was
-  /// activated, or `null` if there is no such type, or it cannot be determined.
-  DartType? _requiredType;
-
   /// Determine the suggestions that should be made based upon the given
   /// [CompletionTarget] and [offset].
   factory OpType.forCompletion(CompletionTarget target, int offset) {
@@ -90,8 +75,6 @@
       return optype;
     }
 
-    optype._typeSystem = target.unit.declaredElement?.library.typeSystem;
-
     var targetNode = target.containingNode;
     targetNode.accept(_OpTypeAstVisitor(optype, target.entity, offset));
 
@@ -111,16 +94,9 @@
 
     // If a value should be suggested, suggest also constructors.
     if (optype.includeReturnValueSuggestions) {
-      // Careful: in angular plugin, `target.unit` may be null!
-      var unitElement = target.unit.declaredElement;
-      if (unitElement != null) {
-        optype.includeConstructorSuggestions = true;
-      }
+      optype.includeConstructorSuggestions = true;
     }
 
-    // Compute the type required by the context and set filters.
-    optype._computeRequiredTypeAndFilters(target);
-
     return optype;
   }
 
@@ -142,59 +118,6 @@
       !includeReturnValueSuggestions &&
       !includeVoidReturnSuggestions;
 
-  /// Try to determine the required context type, and configure filters.
-  void _computeRequiredTypeAndFilters(CompletionTarget target) {
-    var entity = target.entity;
-    AstNode? node = target.containingNode;
-
-    if (node is InstanceCreationExpression &&
-        node.keyword != null &&
-        node.constructorName == entity) {
-      entity = node;
-      node = node.parent;
-    }
-
-    if (node is AssignmentExpression &&
-        node.operator.type == TokenType.EQ &&
-        node.rightHandSide == entity) {
-      _requiredType = node.leftHandSide.staticType;
-    } else if (node is BinaryExpression &&
-        node.operator.type == TokenType.EQ_EQ &&
-        node.rightOperand == entity) {
-      _requiredType = node.leftOperand.staticType;
-    } else if (node is NamedExpression && node.expression == entity) {
-      _requiredType = node.staticParameterElement?.type;
-    } else if (node is SwitchCase && node.expression == entity) {
-      var parent = node.parent;
-      if (parent is SwitchStatement) {
-        _requiredType = parent.expression.staticType;
-      }
-    } else if (node is VariableDeclaration && node.initializer == entity) {
-      _requiredType = node.declaredElement?.type;
-    } else if (entity is Expression && entity.staticParameterElement != null) {
-      _requiredType = entity.staticParameterElement?.type;
-    }
-
-    var requiredType = _requiredType;
-    if (requiredType == null) {
-      return;
-    }
-    if (requiredType.isDynamic || requiredType.isDartCoreObject) {
-      _requiredType = null;
-      return;
-    }
-  }
-
-  /// Return `true` if the [leftType] is a subtype of the [rightType].
-  bool _isSubtypeOf(DartType leftType, DartType rightType) {
-    var typeSystem = _typeSystem;
-    if (typeSystem == null) {
-      return false;
-    }
-
-    return typeSystem.isSubtypeOf(leftType, rightType);
-  }
-
   /// Return the statement before [entity]
   /// where [entity] can be a statement or the `}` closing the given block.
   static Statement? getPreviousStatement(Block node, Object? entity) {
@@ -334,17 +257,6 @@
     if (identical(entity, node.type)) {
       optype.completionLocation = 'AsExpression_type';
       optype.includeTypeNameSuggestions = true;
-      optype.typeNameSuggestionsFilter = (DartType dartType, int relevance) {
-        var staticType = node.expression.staticType;
-        if (staticType != null &&
-            (staticType.isDynamic ||
-                (optype._isSubtypeOf(dartType, staticType) &&
-                    dartType != staticType))) {
-          return relevance;
-        } else {
-          return null;
-        }
-      };
     }
   }
 
@@ -652,7 +564,6 @@
     if (identical(entity, node.superclass2)) {
       optype.completionLocation = 'ExtendsClause_superclass';
       optype.includeTypeNameSuggestions = true;
-      optype.typeNameSuggestionsFilter = _nonMixinClasses;
     }
   }
 
@@ -947,17 +858,6 @@
     if (identical(entity, node.type)) {
       optype.completionLocation = 'IsExpression_type';
       optype.includeTypeNameSuggestions = true;
-      optype.typeNameSuggestionsFilter = (DartType dartType, int relevance) {
-        var staticType = node.expression.staticType;
-        if (staticType != null &&
-            (staticType.isDynamic ||
-                (optype._isSubtypeOf(dartType, staticType) &&
-                    dartType != staticType))) {
-          return relevance;
-        } else {
-          return null;
-        }
-      };
     }
   }
 
@@ -1473,18 +1373,6 @@
     return false;
   }
 
-  /// A filter used to disable everything except classes (such as functions and
-  /// mixins).
-  int? _nonMixinClasses(DartType type, int relevance) {
-    if (type is InterfaceType) {
-      if (type.element.isMixin) {
-        return null;
-      }
-      return relevance;
-    }
-    return null;
-  }
-
   static bool _isParameterOfGenericFunctionType(FormalParameter node) {
     var parameterList = node.parent;
     if (parameterList is DefaultFormalParameter) {
diff --git a/pkg/analyzer_plugin/lib/src/utilities/library.dart b/pkg/analyzer_plugin/lib/src/utilities/library.dart
new file mode 100644
index 0000000..8fa8383
--- /dev/null
+++ b/pkg/analyzer_plugin/lib/src/utilities/library.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Checks whether importing the library with URI [library2] into the
+/// library with URI [library1] could be a relative import.
+///
+/// Both URIs must be package: URIs and belong to the same package for this to
+/// be true.
+bool canBeRelativeImport(Uri library1, Uri library2) {
+  return library1.isScheme('package') &&
+      library2.isScheme('package') &&
+      library1.pathSegments.isNotEmpty &&
+      library2.pathSegments.isNotEmpty &&
+      library1.pathSegments.first == library2.pathSegments.first;
+}
diff --git a/pkg/analyzer_plugin/lib/utilities/assist/assist.dart b/pkg/analyzer_plugin/lib/utilities/assist/assist.dart
index 3e6290b..58791ae 100644
--- a/pkg/analyzer_plugin/lib/utilities/assist/assist.dart
+++ b/pkg/analyzer_plugin/lib/utilities/assist/assist.dart
@@ -69,7 +69,8 @@
   /// for example to allow key-binding specific fixes (or groups of).
   final String id;
 
-  /// The priority of this kind of assist for the kind of error being addressed.
+  /// The priority of this kind of assist for the kind of error being addressed
+  /// where a higher integer value indicates a higher priority and relevance.
   final int priority;
 
   /// A human-readable description of the changes that will be applied by this
diff --git a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_core.dart b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_core.dart
index e407543..804c3c4c 100644
--- a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_core.dart
+++ b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_core.dart
@@ -63,6 +63,10 @@
   /// that changes to the copy will not effect this change builder.
   ChangeBuilder copy();
 
+  /// Return `true` if this builder already has edits for the file with the
+  /// given [path].
+  bool hasEditsFor(String path);
+
   /// Set the selection for the change being built to the given [position].
   void setSelection(Position position);
 }
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 6bd6c78..4eababe 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
@@ -346,6 +346,9 @@
   ///
   /// Returns the text of the URI that will be used in the import directive.
   /// It can be different than the given [Uri].
+  ///
+  /// [uri] may be converted from an absolute URI to a relative URI depending on
+  /// user preferences/lints.
   String importLibrary(Uri uri);
 
   /// Ensure that the library with the given [uri] is imported.
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 cf0a57b..77cc825 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
@@ -59,8 +59,8 @@
     CompletionTarget? target,
     OpType? optype,
   }) async {
-    target ??= CompletionTarget.forOffset(request.result.unit, request.offset,
-        entryPoint: entryPoint);
+    entryPoint ??= request.result.unit;
+    target ??= CompletionTarget.forOffset(entryPoint, request.offset);
     optype ??= OpType.forCompletion(target, request.offset);
     if (!optype.includeIdentifiers) {
       return;
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 a27010c..d88f47a 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
@@ -29,7 +29,7 @@
     var containingLibrary = request.result.libraryElement;
 
     // Recompute the target since resolution may have changed it
-    var expression = _computeDotTarget(request, null);
+    var expression = _computeDotTarget(request.result.unit, request.offset);
     if (expression == null || expression.isSynthetic) {
       return;
     }
@@ -42,7 +42,7 @@
     var containingLibrary = request.result.libraryElement;
 
     // Recompute the target since resolution may have changed it
-    var expression = _computeDotTarget(request, entryPoint);
+    var expression = _computeDotTarget(entryPoint, request.offset);
     if (expression == null || expression.isSynthetic) {
       return;
     }
@@ -50,10 +50,8 @@
   }
 
   /// Update the completion [target] and [dotTarget] based on the given [unit].
-  Expression? _computeDotTarget(
-      DartCompletionRequest request, AstNode? entryPoint) {
-    var target = CompletionTarget.forOffset(request.result.unit, request.offset,
-        entryPoint: entryPoint);
+  Expression? _computeDotTarget(AstNode entryPoint, int offset) {
+    var target = CompletionTarget.forOffset(entryPoint, offset);
     return target.dotTarget;
   }
 
diff --git a/pkg/analyzer_plugin/test/plugin/mocks.dart b/pkg/analyzer_plugin/test/plugin/mocks.dart
index 338593b..bf4de1d 100644
--- a/pkg/analyzer_plugin/test/plugin/mocks.dart
+++ b/pkg/analyzer_plugin/test/plugin/mocks.dart
@@ -159,18 +159,18 @@
   @override
   TimestampedData<String> get contents => TimestampedData(0, '');
 
+  @Deprecated('Not used anymore')
   @override
   String get encoding => '';
 
   @override
   String get fullName => '/pkg/lib/test.dart';
 
+  @Deprecated('Use uri.isScheme("dart") instead')
   @override
   bool get isInSystemLibrary => false;
 
-  @override
-  Source get librarySource => this;
-
+  @Deprecated('Not used anymore')
   @override
   int get modificationStamp => 0;
 
@@ -178,11 +178,9 @@
   String get shortName => 'test.dart';
 
   @override
-  Source get source => this;
-
-  @override
   Uri get uri => Uri.parse('package:test/test.dart');
 
+  @Deprecated('Use Source.uri instead')
   @override
   UriKind get uriKind => UriKind.PACKAGE_URI;
 
diff --git a/pkg/analyzer_utilities/lib/check/bool.dart b/pkg/analyzer_utilities/lib/check/bool.dart
new file mode 100644
index 0000000..18d5054
--- /dev/null
+++ b/pkg/analyzer_utilities/lib/check/bool.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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_utilities/check/check.dart';
+
+extension BoolExtension on CheckTarget<bool> {
+  void get isTrue {
+    if (!value) {
+      fail('is not true');
+    }
+  }
+
+  void get isFalse {
+    if (value) {
+      fail('is not false');
+    }
+  }
+}
diff --git a/pkg/analyzer_utilities/lib/check/check.dart b/pkg/analyzer_utilities/lib/check/check.dart
new file mode 100644
index 0000000..b3147bb
--- /dev/null
+++ b/pkg/analyzer_utilities/lib/check/check.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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_utilities/check/check_target.dart';
+import 'package:meta/meta.dart';
+
+export 'package:analyzer_utilities/check/bool.dart';
+export 'package:analyzer_utilities/check/check_target.dart';
+export 'package:analyzer_utilities/check/equality.dart';
+export 'package:analyzer_utilities/check/int.dart';
+export 'package:analyzer_utilities/check/iterable.dart';
+export 'package:analyzer_utilities/check/string.dart';
+export 'package:analyzer_utilities/check/type.dart';
+
+@useResult
+CheckTarget<T> check<T>(T value) {
+  return CheckTarget(value, 0, () => '$value');
+}
diff --git a/pkg/analyzer_utilities/lib/check/check_target.dart b/pkg/analyzer_utilities/lib/check/check_target.dart
new file mode 100644
index 0000000..1d0e608
--- /dev/null
+++ b/pkg/analyzer_utilities/lib/check/check_target.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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' as test_package;
+
+class CheckTarget<T> {
+  final T value;
+  final int _depth;
+
+  /// The function that return the description of the value, and of the
+  /// chain how we arrived to this value.
+  final String Function() _describe;
+
+  CheckTarget(this.value, this._depth, this._describe);
+
+  String get _indent => '  ' * (_depth + 1);
+
+  String valueStr(value) {
+    if (value is String) {
+      return "'$value'";
+    }
+    return '$value';
+  }
+
+  Never fail(String message) {
+    test_package.fail(_describe() + '\n' + _indent + message);
+  }
+
+  /// Chains to the given [value]; if a subsequent check fails, [describe]
+  /// will be invoked to describe the [value].
+  CheckTarget<U> nest<U>(
+    U value,
+    String Function(U value) describe,
+  ) {
+    return CheckTarget(value, _depth + 1, () {
+      return _describe() + '\n' + _indent + describe(value);
+    });
+  }
+}
diff --git a/pkg/analyzer_utilities/lib/check/equality.dart b/pkg/analyzer_utilities/lib/check/equality.dart
new file mode 100644
index 0000000..2d265b8
--- /dev/null
+++ b/pkg/analyzer_utilities/lib/check/equality.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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_utilities/check/check.dart';
+
+extension EqualityExtension<T> on CheckTarget<T> {
+  void isEqualTo(Object? other) {
+    if (value != other) {
+      fail('is not equal to $other');
+    }
+  }
+
+  void isNotEqualTo(Object? other) {
+    if (value == other) {
+      fail('is equal to $other');
+    }
+  }
+}
diff --git a/pkg/analyzer_utilities/lib/check/int.dart b/pkg/analyzer_utilities/lib/check/int.dart
new file mode 100644
index 0000000..59587b2
--- /dev/null
+++ b/pkg/analyzer_utilities/lib/check/int.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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_utilities/check/check.dart';
+
+extension IntExtension on CheckTarget<int> {
+  void get isZero {
+    if (value != 0) {
+      fail('is not zero');
+    }
+  }
+
+  void isGreaterThan(int other) {
+    if (!(value > other)) {
+      fail('is not greater than $other');
+    }
+  }
+}
diff --git a/pkg/analyzer_utilities/lib/check/iterable.dart b/pkg/analyzer_utilities/lib/check/iterable.dart
new file mode 100644
index 0000000..0e3e0d3
--- /dev/null
+++ b/pkg/analyzer_utilities/lib/check/iterable.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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_utilities/check/check.dart';
+import 'package:meta/meta.dart';
+
+extension IterableExtension<T> on CheckTarget<Iterable<T>> {
+  void get isEmpty {
+    if (value.isNotEmpty) {
+      fail('is not empty');
+    }
+  }
+
+  void get isNotEmpty {
+    if (value.isEmpty) {
+      fail('is empty');
+    }
+  }
+
+  @UseResult.unless(parameterDefined: 'expected')
+  CheckTarget<int> hasLength([int? expected]) {
+    var actual = value.length;
+
+    if (expected != null && actual != expected) {
+      fail('does not have length ${valueStr(expected)}');
+    }
+
+    return nest(actual, (length) => 'has length $length');
+  }
+}
diff --git a/pkg/analyzer_utilities/lib/check/string.dart b/pkg/analyzer_utilities/lib/check/string.dart
new file mode 100644
index 0000000..3d80003
--- /dev/null
+++ b/pkg/analyzer_utilities/lib/check/string.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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_utilities/check/check.dart';
+import 'package:meta/meta.dart';
+
+extension StringExtension on CheckTarget<String> {
+  void contains(Pattern other) {
+    if (!value.contains(other)) {
+      fail('does not contain ${valueStr(other)}');
+    }
+  }
+
+  void startsWith(Pattern other) {
+    if (!value.startsWith(other)) {
+      fail('does not start with ${valueStr(other)}');
+    }
+  }
+
+  @UseResult.unless(parameterDefined: 'expected')
+  CheckTarget<int> hasLength([int? expected]) {
+    var actual = value.length;
+
+    if (expected != null && actual != expected) {
+      fail('does not have length ${valueStr(expected)}');
+    }
+
+    return nest(actual, (length) => 'has length $length');
+  }
+}
diff --git a/pkg/analyzer_utilities/lib/check/type.dart b/pkg/analyzer_utilities/lib/check/type.dart
new file mode 100644
index 0000000..ea28b9e
--- /dev/null
+++ b/pkg/analyzer_utilities/lib/check/type.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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_utilities/check/check.dart';
+
+extension IsExtension<T> on CheckTarget<T> {
+  CheckTarget<U> isA<U extends T>() {
+    final value = this.value;
+    if (value is U) {
+      return nest(value, (_) => 'is of type $U');
+    } else {
+      fail('is not of type $U');
+    }
+  }
+}
diff --git a/pkg/analyzer_utilities/pubspec.yaml b/pkg/analyzer_utilities/pubspec.yaml
index a8426e4..d0aac18 100644
--- a/pkg/analyzer_utilities/pubspec.yaml
+++ b/pkg/analyzer_utilities/pubspec.yaml
@@ -9,5 +9,7 @@
   analyzer:
     path: ../analyzer
   html: any
+  meta:
+    path: ../meta
   path: any
   test: any
diff --git a/pkg/analyzer_utilities/test/check/check_test.dart b/pkg/analyzer_utilities/test/check/check_test.dart
new file mode 100644
index 0000000..cc52f80
--- /dev/null
+++ b/pkg/analyzer_utilities/test/check/check_test.dart
@@ -0,0 +1,166 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All 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_utilities/check/check.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group('type', () {
+    group('bool', () {
+      test('isEqualTo', () {
+        check(true).isEqualTo(true);
+        check(false).isEqualTo(false);
+        _fails(() => check(true).isEqualTo(false));
+        _fails(() => check(false).isEqualTo(true));
+      });
+      test('isFalse', () {
+        check(false).isFalse;
+        _fails(() => check(true).isFalse);
+      });
+      test('isNotEqualTo', () {
+        check(true).isNotEqualTo(false);
+        check(false).isNotEqualTo(true);
+        _fails(() => check(true).isNotEqualTo(true));
+        _fails(() => check(false).isNotEqualTo(false));
+      });
+      test('isTrue', () {
+        check(true).isTrue;
+        _fails(() => check(false).isTrue);
+      });
+    });
+    group('int', () {
+      test('isEqualTo', () {
+        check(0).isEqualTo(0);
+        check(1).isEqualTo(1);
+        check(2).isEqualTo(2);
+        _fails(() => check(0).isEqualTo(1));
+        _fails(() => check(1).isEqualTo(0));
+      });
+      test('isGreaterThan', () {
+        check(2).isGreaterThan(1);
+        check(1).isGreaterThan(0);
+        check(-1).isGreaterThan(-2);
+        _fails(() => check(0).isGreaterThan(0));
+        _fails(() => check(0).isGreaterThan(1));
+        _fails(() => check(1).isGreaterThan(2));
+        _fails(() => check(-2).isGreaterThan(-1));
+      });
+      test('isNotEqualTo', () {
+        check(0).isNotEqualTo(1);
+        check(1).isNotEqualTo(0);
+        check(1).isNotEqualTo(2);
+        check(2).isNotEqualTo(1);
+        _fails(() => check(0).isNotEqualTo(0));
+        _fails(() => check(1).isNotEqualTo(1));
+        _fails(() => check(2).isNotEqualTo(2));
+      });
+      test('isZero', () {
+        check(0).isZero;
+        _fails(() => check(1).isZero);
+        _fails(() => check(-1).isZero);
+      });
+    });
+    group('Iterable', () {
+      test('hasLength', () {
+        check(<int>[]).hasLength().isZero;
+        check(<int>[0]).hasLength().isEqualTo(1);
+        check(<int>[0]).hasLength(1);
+        check(<int>[0, 1]).hasLength().isEqualTo(2);
+        check(<int>[0, 1]).hasLength(2);
+        check(<int>{}).hasLength().isZero;
+        check(<int>{0}).hasLength().isEqualTo(1);
+        check(<int>{0}).hasLength(1);
+        check(<int>{0, 1}).hasLength().isEqualTo(2);
+        check(<int>{0, 1}).hasLength(2);
+        _fails(() => check(<int>[]).hasLength(1));
+        _fails(() => check(<int>[]).hasLength(2));
+        _fails(() => check(<int>{}).hasLength(1));
+        _fails(() => check(<int>{}).hasLength(2));
+        _fails(() => check(<int>[]).hasLength().isEqualTo(1));
+        _fails(() => check(<int>[0]).hasLength().isEqualTo(0));
+      });
+      test('isEmpty', () {
+        check(<int>[]).isEmpty;
+        check(<int>{}).isEmpty;
+        _fails(() => check([0]).isEmpty);
+        _fails(() => check([0, 1]).isEmpty);
+        _fails(() => check({0}).isEmpty);
+        _fails(() => check({0, 1}).isEmpty);
+      });
+      test('isNotEmpty', () {
+        check([0]).isNotEmpty;
+        check([0, 1]).isNotEmpty;
+        check({0}).isNotEmpty;
+        check({0, 1}).isNotEmpty;
+        _fails(() => check(<int>[]).isNotEmpty);
+        _fails(() => check(<int>{}).isNotEmpty);
+      });
+    });
+    group('String', () {
+      test('contains', () {
+        check('abc').contains('a');
+        check('abc').contains('b');
+        check('abc').contains('c');
+        check('abc').contains('ab');
+        check('abc').contains('bc');
+        check('abc').contains(RegExp('a'));
+        check('abc').contains(RegExp('a.'));
+        check('abc').contains(RegExp('a.c'));
+        check('abc').contains(RegExp('.b.'));
+        _fails(() => check('abc').contains('x'));
+        _fails(() => check('abc').contains('ac'));
+        _fails(() => check('abc').contains(RegExp('ac.')));
+      });
+      test('hasLength', () {
+        check('').hasLength().isZero;
+        check('').hasLength(0);
+        check('a').hasLength().isEqualTo(1);
+        check('a').hasLength(1);
+        check('abc').hasLength().isEqualTo(3);
+        check('abc').hasLength(3);
+        _fails(() => check('abc').hasLength(0));
+        _fails(() => check('abc').hasLength(1));
+        _fails(() => check('abc').hasLength(2));
+      });
+      test('isEqualTo', () {
+        check('').isEqualTo('');
+        check('abc').isEqualTo('abc');
+        check('foobar').isEqualTo('foobar');
+        _fails(() => check('abc').isEqualTo('ab'));
+        _fails(() => check('abc').isEqualTo('xyz'));
+      });
+      test('isNotEqualTo', () {
+        check('abc').isNotEqualTo('ab');
+        check('abc').isNotEqualTo('xyz');
+        _fails(() => check('abc').isNotEqualTo('abc'));
+        _fails(() => check('foobar').isNotEqualTo('foobar'));
+      });
+      test('startsWith', () {
+        check('abc').startsWith('a');
+        check('abc').startsWith('ab');
+        check('abc').startsWith('abc');
+        check('abc').startsWith(RegExp('..c'));
+        check('abc').startsWith(RegExp('.*c'));
+        _fails(() => check('abc').startsWith('b'));
+        _fails(() => check('abc').startsWith('x'));
+        _fails(() => check('abc').startsWith(RegExp('.c')));
+      });
+    });
+    group('type', () {
+      test('isA', () {
+        check(0).isA<int>();
+        _fails(() => check('abc' as dynamic).isA<int>());
+      });
+    });
+  });
+}
+
+void _fails(void Function() f) {
+  try {
+    f();
+  } on TestFailure {
+    return;
+  }
+  fail('expected to fail');
+}
diff --git a/pkg/compiler/lib/compiler_new.dart b/pkg/compiler/lib/compiler_new.dart
index 4b1d89f..5a4ccc8 100644
--- a/pkg/compiler/lib/compiler_new.dart
+++ b/pkg/compiler/lib/compiler_new.dart
@@ -82,6 +82,9 @@
   /// Deferred map output.
   deferredMap,
 
+  /// Unused libraries output.
+  dumpUnusedLibraries,
+
   /// Implementation specific output used for debugging the compiler.
   debug,
 }
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 8737b26..18fa4cb 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -175,6 +175,9 @@
   // For backward compatibility the option is still accepted, but it is ignored.
   static const String initializingFormalAccess = '--initializing-formal-access';
 
+  // Whether or not to dump a list of unused libraries.
+  static const String dumpUnusedLibraries = '--dump-unused-libraries';
+
   // Experimental flags.
   static const String resolveOnly = '--resolve-only';
 
diff --git a/pkg/compiler/lib/src/common/codegen.dart b/pkg/compiler/lib/src/common/codegen.dart
index e8b8488..3f766ba 100644
--- a/pkg/compiler/lib/src/common/codegen.dart
+++ b/pkg/compiler/lib/src/common/codegen.dart
@@ -23,6 +23,7 @@
 import '../js_backend/string_reference.dart' show StringReference;
 import '../js_backend/type_reference.dart' show TypeReference;
 import '../js_emitter/code_emitter_task.dart' show Emitter;
+import '../js_model/elements.dart' show JGeneratorBody;
 import '../js_model/type_recipe.dart' show TypeRecipe;
 import '../native/behavior.dart';
 import '../serialization/serialization.dart';
@@ -720,32 +721,35 @@
     sink.end(tag);
   }
 
+  @override
+  bool get isFinalized => _value != null;
+
   js.Name get value {
-    assert(_value != null, 'value not set for $this');
+    assert(isFinalized, 'value not set for $this');
     return _value;
   }
 
   void set value(js.Name node) {
-    assert(_value == null);
+    assert(!isFinalized);
     assert(node != null);
     _value = node.withSourceInformation(sourceInformation);
   }
 
   @override
   String get key {
-    assert(_value != null);
+    assert(isFinalized);
     return _value.key;
   }
 
   @override
   String get name {
-    assert(_value != null, 'value not set for $this');
+    assert(isFinalized, 'value not set for $this');
     return _value.name;
   }
 
   @override
   bool get allowRename {
-    assert(_value != null, 'value not set for $this');
+    assert(isFinalized, 'value not set for $this');
     return _value.allowRename;
   }
 
@@ -771,6 +775,98 @@
   @override
   String toString() =>
       'ModularName(kind=$kind, data=$data, value=${_value?.key})';
+
+  @override
+  String nonfinalizedDebugText() {
+    switch (kind) {
+      case ModularNameKind.rtiField:
+        return r'ModularName"$ti"';
+      case ModularNameKind.instanceField:
+        return 'ModularName"field:${(data as Entity).name}"';
+      case ModularNameKind.instanceMethod:
+        return 'ModularName"${_instanceMethodName(data)}"';
+      case ModularNameKind.methodProperty:
+        return 'ModularName"methodProperty:${(data as Entity).name}"';
+      case ModularNameKind.operatorIs:
+        return 'ModularName"is:${_className(data)}"';
+      case ModularNameKind.className:
+        return 'ModularName"class:${_className(data)}"';
+      case ModularNameKind.globalPropertyNameForClass:
+        return 'ModularName"classref:${_className(data)}"';
+      case ModularNameKind.aliasedSuperMember:
+        MemberEntity member = (data as MemberEntity);
+        String className = _className(member.enclosingClass);
+        String invocationName = Namer.operatorNameToIdentifier(member.name);
+        final description = "$className.$invocationName";
+        return 'ModularName"alias:$description"';
+      case ModularNameKind.staticClosure:
+        return 'ModularName"closure:${_qualifiedStaticName(data)}"';
+      case ModularNameKind.lazyInitializer:
+        return 'ModularName"lazy:${(data as MemberEntity).name}"';
+      case ModularNameKind.globalPropertyNameForMember:
+        MemberEntity member = data as MemberEntity;
+        return 'ModularName"ref:${_qualifiedStaticName(member)}"';
+      case ModularNameKind.invocation:
+        return 'ModularName"selector:${_selectorText(data as Selector)}"';
+      case ModularNameKind.nameForOneShotInterceptor:
+        return 'ModularName"oneshot:${_selectorText(data as Selector)}"';
+      case ModularNameKind.globalNameForInterfaceTypeVariable:
+        break;
+      case ModularNameKind.nameForGetInterceptor:
+        return 'ModularName"getInterceptor"';
+      case ModularNameKind.asName:
+        return 'ModularName"asName:$data"';
+    }
+    return super.nonfinalizedDebugText();
+  }
+
+  String _className(ClassEntity cls) {
+    return cls.name.replaceAll('&', '_');
+  }
+
+  String _qualifiedStaticName(MemberEntity member) {
+    if (member.isConstructor || member.isStatic) {
+      return '${_className(member.enclosingClass)}.${member.name}';
+    }
+    return member.name;
+  }
+
+  String _instanceMethodInvocationName(MemberEntity member) {
+    String invocationName = Namer.operatorNameToIdentifier(member.name);
+    if (member.isGetter) invocationName = r'get$' + invocationName;
+    if (member.isSetter) invocationName = r'set$' + invocationName;
+    return invocationName;
+  }
+
+  String _instanceMethodName(MemberEntity member) {
+    if (member is ConstructorBodyEntity) {
+      return 'constructorBody:${_qualifiedStaticName(member.constructor)}';
+    }
+    if (member is JGeneratorBody) {
+      MemberEntity function = member.function;
+      return 'generatorBody:'
+          '${_className(function.enclosingClass)}.'
+          '${_instanceMethodInvocationName(function)}';
+    }
+    return 'instanceMethod:${_instanceMethodInvocationName(member)}';
+  }
+
+  String _selectorText(Selector selector) {
+    // Approximation to unminified selector.
+    if (selector.isGetter) return r'get$' + selector.name;
+    if (selector.isSetter) return r'set$' + selector.name;
+    if (selector.isOperator || selector.isIndex || selector.isIndexSet) {
+      return Namer.operatorNameToIdentifier(selector.name);
+    }
+    List<String> parts = [
+      selector.name,
+      if (selector.callStructure.typeArgumentCount > 0)
+        '${selector.callStructure.typeArgumentCount}',
+      '${selector.callStructure.argumentCount}',
+      ...selector.callStructure.getOrderedNamedArguments()
+    ];
+    return parts.join(r'$');
+  }
 }
 
 enum ModularExpressionKind {
@@ -819,13 +915,16 @@
   }
 
   @override
+  bool get isFinalized => _value != null;
+
+  @override
   js.Expression get value {
-    assert(_value != null);
+    assert(isFinalized);
     return _value;
   }
 
   void set value(js.Expression node) {
-    assert(_value == null);
+    assert(!isFinalized);
     assert(node != null);
     _value = node.withSourceInformation(sourceInformation);
   }
@@ -863,6 +962,17 @@
     sb.write(',value=$_value)');
     return sb.toString();
   }
+
+  @override
+  String nonfinalizedDebugText() {
+    switch (kind) {
+      case ModularExpressionKind.constant:
+        return 'ModularExpression"<constant>"';
+      case ModularExpressionKind.embeddedGlobalAccess:
+        return 'ModularExpression"init.$data"';
+    }
+    return super.nonfinalizedDebugText();
+  }
 }
 
 enum JsNodeKind {
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index 84c3c2b..d4e63fb 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -2228,13 +2228,13 @@
   /// Return `null` if the member is not found in the class or any superclass.
   MemberEntity lookupClassMember(ClassEntity cls, String name,
       {bool setter = false}) {
-    var entity = lookupLocalClassMember(cls, name, setter: setter);
-    if (entity != null) return entity;
+    while (true) {
+      final entity = lookupLocalClassMember(cls, name, setter: setter);
+      if (entity != null) return entity;
 
-    var superclass = getSuperClass(cls);
-    if (superclass == null) return null;
-
-    return lookupClassMember(superclass, name, setter: setter);
+      cls = getSuperClass(cls);
+      if (cls == null) return null;
+    }
   }
 
   /// Lookup the constructor [name] in [cls], fail if the class is missing and
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index b899fbe..146e093 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -5,6 +5,7 @@
 library dart2js.compiler_base;
 
 import 'dart:async' show Future;
+import 'dart:convert' show jsonEncode;
 
 import 'package:front_end/src/api_unstable/dart2js.dart'
     show clearStringTokenCanonicalizer;
@@ -178,8 +179,7 @@
     enqueuer = EnqueueTask(this);
 
     tasks = [
-      kernelLoader = KernelLoaderTask(
-          options, provider, _outputProvider, reporter, measurer),
+      kernelLoader = KernelLoaderTask(options, provider, reporter, measurer),
       kernelFrontEndTask,
       globalInference = GlobalTypeInferenceTask(this),
       deferredLoadTask = frontendStrategy.createDeferredLoadTask(this),
@@ -247,6 +247,31 @@
     return options.readClosedWorldUri != null && options.readDataUri != null;
   }
 
+  /// Dumps a list of unused [ir.Library]'s in the [KernelResult]. This *must*
+  /// be called before [setMainAndTrimComponent], because that method will
+  /// discard the unused [ir.Library]s.
+  void dumpUnusedLibraries(KernelResult result) {
+    var usedUris = result.libraries.toSet();
+    bool isUnused(ir.Library l) => !usedUris.contains(l.importUri);
+    String libraryString(ir.Library library) {
+      return '${library.importUri}(${library.fileUri})';
+    }
+
+    var unusedLibraries =
+        result.component.libraries.where(isUnused).map(libraryString).toList();
+    unusedLibraries.sort();
+    var jsonLibraries = jsonEncode(unusedLibraries);
+    outputProvider.createOutputSink(options.outputUri.pathSegments.last,
+        'unused.json', api.OutputType.dumpUnusedLibraries)
+      ..add(jsonLibraries)
+      ..close();
+    reporter.reportInfo(
+        reporter.createMessage(NO_LOCATION_SPANNABLE, MessageKind.GENERIC, {
+      'text': "${unusedLibraries.length} unused libraries out of "
+          "${result.component.libraries.length}. Dumping to JSON."
+    }));
+  }
+
   Future runInternal() async {
     clearState();
     var compilationTarget = options.compilationTarget;
@@ -275,13 +300,8 @@
           performGlobalTypeInference(closedWorldAndIndices.closedWorld);
       var indices = closedWorldAndIndices.indices;
       if (options.writeDataUri != null) {
-        if (options.noClosedWorldInData) {
-          serializationTask.serializeGlobalTypeInference(
-              globalTypeInferenceResults, indices);
-        } else {
-          serializationTask
-              .serializeGlobalTypeInferenceLegacy(globalTypeInferenceResults);
-        }
+        serializationTask.serializeGlobalTypeInference(
+            globalTypeInferenceResults, indices);
         return;
       }
       await generateJavaScriptCode(globalTypeInferenceResults,
@@ -301,12 +321,6 @@
               closedWorldAndIndices);
       await generateJavaScriptCode(globalTypeInferenceResults,
           indices: closedWorldAndIndices.indices);
-    } else if (options.readDataUri != null) {
-      // TODO(joshualitt) delete and clean up after google3 roll
-      var globalTypeInferenceResults =
-          await serializationTask.deserializeGlobalTypeInferenceLegacy(
-              environment, abstractValueStrategy);
-      await generateJavaScriptCode(globalTypeInferenceResults);
     } else {
       KernelResult result = await kernelLoader.load();
       reporter.log("Kernel load complete");
@@ -317,7 +331,6 @@
       if (retainDataForTesting) {
         componentForTesting = result.component;
       }
-      if (options.cfeOnly) return;
 
       frontendStrategy.registerLoadedLibraries(result);
 
@@ -325,12 +338,37 @@
         await runModularAnalysis(result);
       } else {
         List<ModuleData> data;
-        if (options.modularAnalysisInputs != null) {
+        if (options.hasModularAnalysisInputs) {
           data =
               await serializationTask.deserializeModuleData(result.component);
         }
         frontendStrategy.registerModuleData(data);
-        await compileFromKernel(result.rootLibraryUri, result.libraries);
+
+        // After we've deserialized modular data, we set and verify the main
+        // method as well as trim the component of any unnecessary dependencies.
+        // Note: It is critical we wait to trim the dill until after we've
+        // deserialized modular data because some of this data may reference
+        // 'trimmed' elements.
+        if (options.fromDill) {
+          if (options.dumpUnusedLibraries) {
+            dumpUnusedLibraries(result);
+          }
+          if (options.entryUri != null) {
+            result.setMainAndTrimComponent(options.entryUri);
+          }
+          if (result.component.mainMethod == null) {
+            // TODO(sigmund): move this so that we use the same error template
+            // from the CFE.
+            _reporter.reportError(_reporter.createMessage(NO_LOCATION_SPANNABLE,
+                MessageKind.GENERIC, {'text': "No 'main' method found."}));
+            return;
+          }
+        }
+        if (options.cfeOnly) {
+          await serializationTask.serializeComponent(result.component);
+        } else {
+          await compileFromKernel(result.rootLibraryUri, result.libraries);
+        }
       }
     }
   }
@@ -543,16 +581,6 @@
       if (stopAfterClosedWorld || options.stopAfterProgramSplit) return;
       GlobalTypeInferenceResults globalInferenceResults =
           performGlobalTypeInference(closedWorld);
-      if (options.writeDataUri != null) {
-        // TODO(joshualitt) delete after google3 roll.
-        if (options.noClosedWorldInData) {
-          throw '"no-closed-world-in-data" requires serializing closed world.';
-        } else {
-          serializationTask
-              .serializeGlobalTypeInferenceLegacy(globalInferenceResults);
-        }
-        return;
-      }
       if (options.testMode) {
         globalInferenceResults =
             globalTypeInferenceResultsTestMode(globalInferenceResults);
diff --git a/pkg/compiler/lib/src/constants/values.dart b/pkg/compiler/lib/src/constants/values.dart
index 144d936..86abfd0 100644
--- a/pkg/compiler/lib/src/constants/values.dart
+++ b/pkg/compiler/lib/src/constants/values.dart
@@ -857,10 +857,16 @@
   ConstantValueKind get kind => ConstantValueKind.JS_NAME;
 
   @override
-  String toDartText(DartTypes dartTypes) => 'js_name(${name})';
+  String toDartText(DartTypes dartTypes) {
+    if (name.isFinalized) 'js_name(${name})';
+    return 'js_name(name.nonfinalizedDebugText())';
+  }
 
   @override
-  String toStructuredText(DartTypes dartTypes) => 'JsNameConstant(${name})';
+  String toStructuredText(DartTypes dartTypes) {
+    if (name.isFinalized) return 'JsNameConstant(${name})';
+    return 'JsNameConstant(name.nonfinalizedDebugText())';
+  }
 }
 
 /// A constant used as the dummy receiver value for intercepted calls with
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index bd60c69..8a49df4 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -548,7 +548,7 @@
         setWriteModularAnalysis),
     OptionHandler('${Flags.readData}|${Flags.readData}=.+', setReadData),
     OptionHandler('${Flags.writeData}|${Flags.writeData}=.+', setWriteData),
-    OptionHandler(Flags.noClosedWorldInData, passThrough),
+    OptionHandler(Flags.noClosedWorldInData, ignoreOption),
     OptionHandler('${Flags.readClosedWorld}|${Flags.readClosedWorld}=.+',
         setReadClosedWorld),
     OptionHandler('${Flags.writeClosedWorld}|${Flags.writeClosedWorld}=.+',
@@ -627,6 +627,7 @@
     OptionHandler(Flags.benchmarkingExperiment, passThrough),
     OptionHandler(Flags.soundNullSafety, setNullSafetyMode),
     OptionHandler(Flags.noSoundNullSafety, setNullSafetyMode),
+    OptionHandler(Flags.dumpUnusedLibraries, passThrough),
 
     // TODO(floitsch): remove conditional directives flag.
     // We don't provide the info-message yet, since we haven't publicly
@@ -664,10 +665,17 @@
     // Wire up feature flags.
     OptionHandler(Flags.canary, passThrough),
     OptionHandler(Flags.noShipping, passThrough),
+    // Shipped features.
+    for (var feature in features.shipped)
+      OptionHandler('--${feature.flag}', passThrough),
+    for (var feature in features.shipped)
+      OptionHandler('--no-${feature.flag}', passThrough),
+    // Shipping features.
     for (var feature in features.shipping)
       OptionHandler('--${feature.flag}', passThrough),
     for (var feature in features.shipping)
       OptionHandler('--no-${feature.flag}', passThrough),
+    // Canary features.
     for (var feature in features.canary)
       OptionHandler('--${feature.flag}', passThrough),
     for (var feature in features.canary)
@@ -825,9 +833,7 @@
       if (readStrategy == ReadStrategy.fromCodegen) {
         fail("Cannot read and write serialized codegen simultaneously.");
       }
-      // TODO(joshualitt) cleanup after google3 roll.
-      if (readStrategy != ReadStrategy.fromData &&
-          readStrategy != ReadStrategy.fromDataAndClosedWorld) {
+      if (readStrategy != ReadStrategy.fromDataAndClosedWorld) {
         fail("Can only write serialized codegen from serialized data.");
       }
       if (codegenShards == null) {
@@ -855,10 +861,7 @@
       options.add('${Flags.readClosedWorld}=${readClosedWorldUri}');
       break;
     case ReadStrategy.fromData:
-      // TODO(joshualitt): fail after Google3 roll.
-      // fail("Must read from closed world and data.");
-      readDataUri ??= Uri.base.resolve('$scriptName.data');
-      options.add('${Flags.readData}=${readDataUri}');
+      fail("Must read from closed world and data.");
       break;
     case ReadStrategy.fromDataAndClosedWorld:
       readClosedWorldUri ??= Uri.base.resolve('$scriptName.world');
@@ -868,19 +871,6 @@
       break;
     case ReadStrategy.fromCodegen:
     case ReadStrategy.fromCodegenAndData:
-      // TODO(joshualitt): fall through to fail after google3 roll.
-      readDataUri ??= Uri.base.resolve('$scriptName.data');
-      options.add('${Flags.readData}=${readDataUri}');
-      readCodegenUri ??= Uri.base.resolve('$scriptName.code');
-      options.add('${Flags.readCodegen}=${readCodegenUri}');
-      if (codegenShards == null) {
-        fail("Cannot write serialized codegen without setting "
-            "${Flags.codegenShards}.");
-      } else if (codegenShards <= 0) {
-        fail("${Flags.codegenShards} must be a positive integer.");
-      }
-      options.add('${Flags.codegenShards}=$codegenShards');
-      break;
     case ReadStrategy.fromCodegenAndClosedWorld:
       fail("Must read from closed world, data, and codegen");
       break;
@@ -929,7 +919,7 @@
     String summary;
     switch (readStrategy) {
       case ReadStrategy.fromDart:
-        inputName = 'characters Dart';
+        inputName = inputDillUri != null ? 'kernel bytes' : 'characters Dart';
         inputSize = inputProvider.dartCharactersRead;
         summary = 'Dart file $input ';
         break;
@@ -941,13 +931,7 @@
         summary = 'Data files $input and $dataInput ';
         break;
       case ReadStrategy.fromData:
-        // TODO(joshualitt): fail after google3 roll.
-        //fail("Must read from closed world and data.");
-        inputName = 'bytes data';
-        inputSize = inputProvider.dartCharactersRead;
-        String dataInput =
-            fe.relativizeUri(Uri.base, readDataUri, Platform.isWindows);
-        summary = 'Data files $input and $dataInput ';
+        fail("Must read from closed world and data.");
         break;
       case ReadStrategy.fromDataAndClosedWorld:
         inputName = 'bytes data';
@@ -960,16 +944,6 @@
         break;
       case ReadStrategy.fromCodegen:
       case ReadStrategy.fromCodegenAndData:
-        // TODO(joshualitt): Fall through to fail after google3 roll.
-        inputName = 'bytes data';
-        inputSize = inputProvider.dartCharactersRead;
-        String dataInput =
-            fe.relativizeUri(Uri.base, readDataUri, Platform.isWindows);
-        String codeInput =
-            fe.relativizeUri(Uri.base, readCodegenUri, Platform.isWindows);
-        summary = 'Data files $input, $dataInput and '
-            '${codeInput}[0-${codegenShards - 1}] ';
-        break;
       case ReadStrategy.fromCodegenAndClosedWorld:
         fail("Must read from closed world, data, and codegen");
         break;
@@ -1378,7 +1352,7 @@
   fail(message);
 }
 
-void main(List<String> arguments) {
+Future<void> main(List<String> arguments) async {
   // Expand `@path/to/file`
   // When running from bazel, argument of the form `@path/to/file` might be
   // provided. It needs to be replaced by reading all the contents of the
@@ -1396,7 +1370,7 @@
     batchMain(arguments.sublist(0, arguments.length - 1));
     return;
   }
-  internalMain(arguments);
+  await internalMain(arguments);
 }
 
 /// Return all non-empty lines in a file found at [path].
diff --git a/pkg/compiler/lib/src/deferred_load/program_split_constraints/nodes.dart b/pkg/compiler/lib/src/deferred_load/program_split_constraints/nodes.dart
index 9f10c18..92068f6 100644
--- a/pkg/compiler/lib/src/deferred_load/program_split_constraints/nodes.dart
+++ b/pkg/compiler/lib/src/deferred_load/program_split_constraints/nodes.dart
@@ -44,8 +44,7 @@
   Uri get uri => _uriAndPrefix.uri;
   String get prefix => _uriAndPrefix.prefix;
 
-  ReferenceNode(this._uriAndPrefix, {name})
-      : super(name ?? _uriAndPrefix.prefix);
+  ReferenceNode(String name, this._uriAndPrefix) : super(name);
 
   @override
   Map<String, dynamic> toJson() {
@@ -60,8 +59,8 @@
     if (nodeJson['type'] != 'reference') {
       throw 'Unrecognized type for reference node: ${nodeJson['type']}.';
     }
-    return ReferenceNode(UriAndPrefix.fromJson(nodeJson['import']),
-        name: nodeJson['name']);
+    return ReferenceNode(
+        nodeJson['name'], UriAndPrefix.fromJson(nodeJson['import']));
   }
 
   @override
@@ -193,9 +192,10 @@
   final Map<String, NamedNode> namedNodes = {};
   ReferenceNodeNamer _referenceNodeNamer;
 
-  /// The prefix in the 'uri#prefix' string will become a key to reference this
-  /// node in other builder calls.
-  String _prefixNamer(UriAndPrefix uriAndPrefix) => uriAndPrefix.prefix;
+  /// 'uri#prefix' will become a key to reference this node in other builder
+  /// calls.
+  String _uriAndPrefixNamer(UriAndPrefix uriAndPrefix) =>
+      uriAndPrefix.toString();
 
   /// Override the default reference node namer.
   set referenceNodeNamer(ReferenceNodeNamer namer) =>
@@ -203,7 +203,23 @@
 
   /// Returns the [ReferenceNodeNamer] to use for naming.
   ReferenceNodeNamer get referenceNodeNamer =>
-      _referenceNodeNamer ?? _prefixNamer;
+      _referenceNodeNamer ?? _uriAndPrefixNamer;
+
+  NamedNode _addNamedNode(NamedNode node) {
+    if (namedNodes.containsKey(node.name)) {
+      throw 'Node with name ${node.name} already exists: '
+          '${namedNodes[node.name]}';
+    }
+    namedNodes[node.name] = node;
+    return node;
+  }
+
+  NamedNode _lookupNamedNode(String nodeName) {
+    if (!namedNodes.containsKey(nodeName)) {
+      throw 'Missing reference node for $nodeName';
+    }
+    return namedNodes[nodeName];
+  }
 
   /// Returns a [ReferenceNode] referencing [importUriAndPrefix].
   /// [ReferenceNode]s are typically created in bulk, by mapping over a list of
@@ -212,43 +228,47 @@
   /// [referenceNodeNamer] per [ReferenceNode].
   ReferenceNode referenceNode(String importUriAndPrefix) {
     var uriAndPrefix = UriAndPrefix.fromJson(importUriAndPrefix);
-    var referenceNode = ReferenceNode(uriAndPrefix);
     var name = referenceNodeNamer(uriAndPrefix);
-    namedNodes[name] = referenceNode;
-    return referenceNode;
+    return _addNamedNode(ReferenceNode(name, uriAndPrefix));
   }
 
   /// Creates an unnamed [RelativeOrderNode] referencing two [NamedNode]s.
   RelativeOrderNode orderNode(String predecessor, String successor) {
     return RelativeOrderNode(
-        predecessor: namedNodes[predecessor], successor: namedNodes[successor]);
+        predecessor: _lookupNamedNode(predecessor),
+        successor: _lookupNamedNode(successor));
   }
 
   /// Creates a [CombinerNode] which can be referenced by [name] in further
   /// calls to the builder.
-  CombinerNode combinerNode(
-      String name, List<String> nodes, CombinerType type) {
-    var combinerNode = CombinerNode(name, type,
-        nodes.map((name) => namedNodes[name] as ReferenceNode).toSet());
-    namedNodes[name] = combinerNode;
-    return combinerNode;
+  CombinerNode combinerNode(String name, Set<String> nodes, CombinerType type) {
+    ReferenceNode _lookup(String nodeName) {
+      var node = _lookupNamedNode(nodeName);
+      if (node is! ReferenceNode) {
+        // TODO(joshualitt): Implement nested combiners.
+        throw '$name references node $nodeName which is not a ReferenceNode.';
+      }
+      return node as ReferenceNode;
+    }
+
+    return _addNamedNode(CombinerNode(name, type, nodes.map(_lookup).toSet()));
   }
 
   /// Creates an 'and' [CombinerNode] which can be referenced by [name] in
   /// further calls to the builder.
-  CombinerNode andNode(String name, List<String> nodes) {
+  CombinerNode andNode(String name, Set<String> nodes) {
     return combinerNode(name, nodes, CombinerType.and);
   }
 
   /// Creates a 'fuse' [CombinerNode] which can be referenced by [name] in
   /// further calls to the builder.
-  CombinerNode fuseNode(String name, List<String> nodes) {
+  CombinerNode fuseNode(String name, Set<String> nodes) {
     return combinerNode(name, nodes, CombinerType.fuse);
   }
 
   /// Creates an 'or' [CombinerNode] which can be referenced by [name] in
   /// further calls to the builder.
-  CombinerNode orNode(String name, List<String> nodes) {
+  CombinerNode orNode(String name, Set<String> nodes) {
     return combinerNode(name, nodes, CombinerType.or);
   }
 }
diff --git a/pkg/compiler/lib/src/ir/impact.dart b/pkg/compiler/lib/src/ir/impact.dart
index f3d8702..3e7f7fca 100644
--- a/pkg/compiler/lib/src/ir/impact.dart
+++ b/pkg/compiler/lib/src/ir/impact.dart
@@ -858,4 +858,11 @@
   void visitNullConstant(ir.NullConstant node) {
     registry.registerNullLiteral();
   }
+
+  @override
+  void visitConstructorTearOffConstant(ir.ConstructorTearOffConstant node) {
+    // The CFE encoding of redirecting factories, which dart2js doesn't use,
+    // uses ConstructorTearOff(Constant) to point to its effective target.
+    // However, these should be safe to ignore.
+  }
 }
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index b122154..9696343 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -1556,31 +1556,32 @@
     // for-in [iterableType] is a subtype of `Stream`.
     ir.DartType iterableType = visitNode(node.iterable);
     ir.DartType iteratorType = const ir.DynamicType();
-    if (node.isAsync) {
-      ir.InterfaceType streamInterfaceType = getInterfaceTypeOf(iterableType);
-      ir.InterfaceType streamType = typeEnvironment.getTypeAsInstanceOf(
-          streamInterfaceType,
-          typeEnvironment.coreTypes.streamClass,
-          currentLibrary,
-          typeEnvironment.coreTypes);
-      if (streamType != null) {
-        iteratorType = ir.InterfaceType(
-            typeEnvironment.coreTypes.streamIteratorClass,
-            ir.Nullability.nonNullable,
-            streamType.typeArguments);
-      }
-    } else {
-      ir.InterfaceType iterableInterfaceType = getInterfaceTypeOf(iterableType);
-      ir.Member member = hierarchy.getInterfaceMember(
-          iterableInterfaceType.classNode, ir.Name(Identifiers.iterator));
-      if (member != null) {
-        iteratorType = ir.Substitution.fromInterfaceType(
-                typeEnvironment.getTypeAsInstanceOf(
-                    iterableInterfaceType,
-                    member.enclosingClass,
-                    currentLibrary,
-                    typeEnvironment.coreTypes))
-            .substituteType(member.getterType);
+    ir.InterfaceType iterableInterfaceType = getInterfaceTypeOf(iterableType);
+    if (iterableInterfaceType != null) {
+      if (node.isAsync) {
+        ir.InterfaceType streamType = typeEnvironment.getTypeAsInstanceOf(
+            iterableInterfaceType,
+            typeEnvironment.coreTypes.streamClass,
+            currentLibrary,
+            typeEnvironment.coreTypes);
+        if (streamType != null) {
+          iteratorType = ir.InterfaceType(
+              typeEnvironment.coreTypes.streamIteratorClass,
+              ir.Nullability.nonNullable,
+              streamType.typeArguments);
+        }
+      } else {
+        ir.Member member = hierarchy.getInterfaceMember(
+            iterableInterfaceType.classNode, ir.Name(Identifiers.iterator));
+        if (member != null) {
+          iteratorType = ir.Substitution.fromInterfaceType(
+                  typeEnvironment.getTypeAsInstanceOf(
+                      iterableInterfaceType,
+                      member.enclosingClass,
+                      currentLibrary,
+                      typeEnvironment.coreTypes))
+              .substituteType(member.getterType);
+        }
       }
     }
     _staticTypeCache._forInIteratorTypes[node] = iteratorType;
diff --git a/pkg/compiler/lib/src/js/js.dart b/pkg/compiler/lib/src/js/js.dart
index 1b1ac8e..c8f5a30 100644
--- a/pkg/compiler/lib/src/js/js.dart
+++ b/pkg/compiler/lib/src/js/js.dart
@@ -83,6 +83,9 @@
     codePositionListener.onPositions(
         node, startPosition, endPosition, closingPosition);
   }
+
+  @override
+  bool get isDebugContext => false;
 }
 
 /// Interface for ast nodes that encapsulate an ast that needs to be
diff --git a/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart b/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
index 3df93c3..8b46bb4 100644
--- a/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
+++ b/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
@@ -147,6 +147,32 @@
   }
 
   @override
+  String nonfinalizedDebugText() {
+    switch (kind) {
+      case DeferredHolderExpressionKind.globalObjectForClass:
+        return 'Holder"${_className(data)}"';
+      case DeferredHolderExpressionKind.globalObjectForMember:
+        return 'Holder"${_qualifiedStaticName(data)}"';
+      case DeferredHolderExpressionKind.globalObjectForInterceptors:
+        return 'J';
+      case DeferredHolderExpressionKind.globalObjectForConstant:
+        return 'Holder"constants"';
+      case DeferredHolderExpressionKind.globalObjectForStaticState:
+        return r'$';
+    }
+    return super.nonfinalizedDebugText();
+  }
+
+  String _className(ClassEntity cls) => cls.name.replaceAll('&', '_');
+
+  String _qualifiedStaticName(MemberEntity member) {
+    if (member.isConstructor || member.isStatic) {
+      return '${_className(member.enclosingClass)}.${member.name}';
+    }
+    return member.name;
+  }
+
+  @override
   Iterable<js.Node> get containedNodes => isFinalized ? [_value] : const [];
 }
 
diff --git a/pkg/compiler/lib/src/js_backend/minify_namer.dart b/pkg/compiler/lib/src/js_backend/minify_namer.dart
index 94f28fc..82c7200 100644
--- a/pkg/compiler/lib/src/js_backend/minify_namer.dart
+++ b/pkg/compiler/lib/src/js_backend/minify_namer.dart
@@ -380,7 +380,7 @@
   jsAst.Name nameForOneShotInterceptor(
       Selector selector, Iterable<ClassEntity> classes) {
     String root = selector.isOperator
-        ? operatorNameToIdentifier(selector.name)
+        ? Namer.operatorNameToIdentifier(selector.name)
         : privateName(selector.memberName);
     String prefix = selector.isGetter
         ? r"$get"
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index 11d3b51..83c7797 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -1425,7 +1425,7 @@
     return StringBackedName(name);
   }
 
-  String operatorNameToIdentifier(String name) {
+  static String operatorNameToIdentifier(String name) {
     if (name == null) return null;
     if (name == '==') {
       return r'$eq';
diff --git a/pkg/compiler/lib/src/js_backend/string_reference.dart b/pkg/compiler/lib/src/js_backend/string_reference.dart
index 62c378b..69d1a2d 100644
--- a/pkg/compiler/lib/src/js_backend/string_reference.dart
+++ b/pkg/compiler/lib/src/js_backend/string_reference.dart
@@ -143,6 +143,26 @@
 
   @override
   Iterable<js.Node> get containedNodes => isFinalized ? [_value] : const [];
+
+  @override
+  String nonfinalizedDebugText() {
+    const doubleQuote = 0x22;
+    final buffer = StringBuffer('StringReference');
+    if (constant.stringValue.length <= 1000) {
+      buffer.writeCharCode(doubleQuote);
+      for (int rune in constant.stringValue.runes) {
+        if (rune >= 0x20 && rune < 0x7F && rune != doubleQuote) {
+          buffer.writeCharCode(rune);
+        } else {
+          buffer.write(r'\u{');
+          buffer.write(rune.toRadixString(16));
+          buffer.write(r'}');
+        }
+      }
+      buffer.writeCharCode(doubleQuote);
+    }
+    return '$buffer';
+  }
 }
 
 /// A [StringReferenceResource] is a deferred JavaScript statement determined
diff --git a/pkg/compiler/lib/src/js_backend/type_reference.dart b/pkg/compiler/lib/src/js_backend/type_reference.dart
index d488b24..7bfc470 100644
--- a/pkg/compiler/lib/src/js_backend/type_reference.dart
+++ b/pkg/compiler/lib/src/js_backend/type_reference.dart
@@ -161,6 +161,15 @@
 
   @override
   Iterable<js.Node> get containedNodes => isFinalized ? [_value] : const [];
+
+  @override
+  String nonfinalizedDebugText() {
+    TypeRecipe typeRecipe = this.typeRecipe;
+    if (typeRecipe is TypeExpressionRecipe) {
+      return 'TypeReference"${typeRecipe.type.toString()}"';
+    }
+    return super.nonfinalizedDebugText();
+  }
 }
 
 /// A [TypeReferenceResource] is a deferred JavaScript statement determined by
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 91c66d3..cd26c6b 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
@@ -189,11 +189,12 @@
   };
 }
 
-// Creates a lazy final field that uses non-nullable initialization semantics.
+// Creates a lazy final static field that uses non-nullable initialization
+// semantics.
 //
-// A lazy field has a storage entry, [name], which holds the value, and a
-// getter ([getterName]) to access the field. If the field wasn't set before
-// the first access, it is initialized with the [initializer].
+// A lazy final field has a storage entry, [name], which holds the value, and a
+// getter ([getterName]) to access the field. The field is initialized on first
+// access with the [initializer].
 function lazyFinal(holder, name, getterName, initializer) {
   var uninitializedSentinel = holder;
   holder[name] = uninitializedSentinel;
@@ -201,12 +202,21 @@
     if (holder[name] === uninitializedSentinel) {
       var value = initializer();
       if (holder[name] !== uninitializedSentinel) {
+        // Since there is no setter, the only way to get here is via bounded
+        // recursion, where `initializer` calls the lazy final getter.
         #throwLateFieldADI(name);
       }
       holder[name] = value;
     }
-    holder[getterName] = function() { return this[name]; };
-    return holder[name];
+    // TODO(sra): Does the value need to be stored in the holder at all?
+    // Potentially a call to the getter could be replaced with an access to
+    // holder slot if dominated by a previous call to the getter. Does the
+    // optimizer do this? If so, within a single function, the dominance
+    // relations should allow a local copy via GVN, so it is not that valuable
+    // an optimization for a `final` static variable.
+    var finalValue = holder[name];
+    holder[getterName] = function() { return finalValue; };
+    return finalValue;
   };
 }
 
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index ae463a8..d8985b7 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -93,7 +93,7 @@
   int get enabledConstructorTearOffLowerings => ConstructorTearOffLowering.all;
 
   @override
-  List<String> get extraRequiredLibraries => _requiredLibraries[name]!;
+  List<String> get extraRequiredLibraries => requiredLibraries[name]!;
 
   @override
   List<String> get extraIndexedLibraries => const [
@@ -222,49 +222,86 @@
 
 // TODO(sigmund): this "extraRequiredLibraries" needs to be removed...
 // compile-platform should just specify which libraries to compile instead.
-const _requiredLibraries = <String, List<String>>{
+const requiredLibraries = <String, List<String>>{
   'dart2js': [
+    'dart:_async_await_error_codes',
     'dart:_dart2js_runtime_metrics',
     'dart:_foreign_helper',
+    'dart:_http',
     'dart:_interceptors',
     'dart:_internal',
+    'dart:_js',
     'dart:_js_annotations',
     'dart:_js_embedded_names',
     'dart:_js_helper',
     'dart:_js_names',
+    'dart:_js_primitives',
     'dart:_late_helper',
+    'dart:_metadata',
     'dart:_native_typed_data',
+    'dart:_recipe_syntax',
+    'dart:_rti',
     'dart:async',
     'dart:collection',
+    'dart:convert',
+    'dart:developer',
     'dart:html',
     'dart:html_common',
     'dart:indexed_db',
     'dart:io',
+    'dart:isolate',
     'dart:js',
     'dart:js_util',
+    'dart:math',
     'dart:svg',
+    'dart:typed_data',
     'dart:web_audio',
     'dart:web_gl',
   ],
   'dart2js_server': [
+    'dart:_async_await_error_codes',
     'dart:_dart2js_runtime_metrics',
     'dart:_foreign_helper',
+    'dart:_http',
     'dart:_interceptors',
     'dart:_internal',
+    'dart:_js',
     'dart:_js_annotations',
     'dart:_js_embedded_names',
     'dart:_js_helper',
     'dart:_js_names',
+    'dart:_js_primitives',
     'dart:_late_helper',
     'dart:_native_typed_data',
+    'dart:_recipe_syntax',
+    'dart:_rti',
     'dart:async',
     'dart:collection',
+    'dart:convert',
+    'dart:developer',
     'dart:io',
+    'dart:isolate',
     'dart:js',
     'dart:js_util',
+    'dart:math',
+    'dart:typed_data',
   ]
 };
 
+/// Extends the Dart2jsTarget to transform outlines to meet the requirements
+/// of summaries in bazel and package-build.
+class Dart2jsSummaryTarget extends Dart2jsTarget with SummaryMixin {
+  @override
+  final List<Uri> sources;
+
+  @override
+  final bool excludeNonSources;
+
+  Dart2jsSummaryTarget(String name, this.sources, this.excludeNonSources,
+      TargetFlags targetFlags)
+      : super(name, targetFlags);
+}
+
 class Dart2jsConstantsBackend extends ConstantsBackend {
   @override
   final bool supportsUnevaluatedConstants;
diff --git a/pkg/compiler/lib/src/kernel/loader.dart b/pkg/compiler/lib/src/kernel/loader.dart
index 79e95d4..dbefdbb 100644
--- a/pkg/compiler/lib/src/kernel/loader.dart
+++ b/pkg/compiler/lib/src/kernel/loader.dart
@@ -9,7 +9,6 @@
 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;
@@ -20,7 +19,6 @@
 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;
@@ -34,7 +32,6 @@
   final DiagnosticReporter _reporter;
 
   final api.CompilerInput _compilerInput;
-  final api.CompilerOutput _compilerOutput;
 
   final CompilerOptions _options;
 
@@ -47,40 +44,14 @@
   /// This is used for testing.
   bool forceSerialization = false;
 
-  KernelLoaderTask(this._options, this._compilerInput, this._compilerOutput,
-      this._reporter, Measurer measurer)
+  KernelLoaderTask(
+      this._options, this._compilerInput, this._reporter, Measurer measurer)
       : initializedCompilerState = _options.kernelInitializedCompilerState,
         super(measurer);
 
   @override
   String get name => 'kernel loader';
 
-  ir.Reference findMainMethod(Component component, Uri entryUri) {
-    var entryLibrary = component.libraries
-        .firstWhere((l) => l.fileUri == entryUri, orElse: () => null);
-    if (entryLibrary == null) {
-      throw ArgumentError('Entry uri $entryUri not found in dill.');
-    }
-    var mainMethod = entryLibrary.procedures
-        .firstWhere((p) => p.name.text == 'main', orElse: () => null);
-
-    // In some cases, a main method is defined in another file, and then
-    // exported. In these cases, we search for the main method in
-    // [additionalExports].
-    ir.Reference mainMethodReference;
-    if (mainMethod == null) {
-      mainMethodReference = entryLibrary.additionalExports.firstWhere(
-          (p) => p.canonicalName.name == 'main',
-          orElse: () => null);
-    } else {
-      mainMethodReference = mainMethod.reference;
-    }
-    if (mainMethodReference == null) {
-      throw ArgumentError('Entry uri $entryUri has no main method.');
-    }
-    return mainMethodReference;
-  }
-
   /// Loads an entire Kernel [Component] from a file on disk.
   Future<KernelResult> load() {
     return measure(() async {
@@ -97,9 +68,6 @@
       var resolvedUri = _options.compilationTarget;
       ir.Component component;
       List<Uri> moduleLibraries = const [];
-      var isDill = resolvedUri.path.endsWith('.dill') ||
-          resolvedUri.path.endsWith('.gdill') ||
-          resolvedUri.path.endsWith('.mdill');
 
       void inferNullSafetyMode(bool isSound) {
         if (_options.nullSafetyMode == NullSafetyMode.unspecified) {
@@ -112,7 +80,7 @@
         assert(_options.nullSafetyMode != NullSafetyMode.unspecified);
       }
 
-      if (isDill) {
+      if (_options.fromDill) {
         component = ir.Component();
         Future<void> read(Uri uri) async {
           api.Input input = await _compilerInput.readFromUri(uri,
@@ -122,13 +90,6 @@
 
         await read(resolvedUri);
 
-        // If an entryUri is supplied, we use it to manually select the main
-        // method.
-        if (_options.entryUri != null) {
-          var mainMethod = findMainMethod(component, _options.entryUri);
-          component.setMainMethodAndMode(mainMethod, true, component.mode);
-        }
-
         if (_options.modularMode) {
           moduleLibraries =
               component.libraries.map((lib) => lib.importUri).toList();
@@ -161,25 +122,12 @@
           if (platformUri != resolvedUri) await read(platformUri);
         }
 
-        // Concatenate dills and then reset main method.
-        var mainMethod = component.mainMethodName;
-        var mainMode = component.mode;
+        // Concatenate dills.
         if (_options.dillDependencies != null) {
           for (Uri dependency in _options.dillDependencies) {
             await read(dependency);
           }
         }
-        component.setMainMethodAndMode(mainMethod, true, mainMode);
-
-        // This is not expected to be null when creating a whole-program .dill
-        // file, but needs to be checked for modular inputs.
-        if (component.mainMethod == null && !_options.modularMode) {
-          // TODO(sigmund): move this so that we use the same error template
-          // from the CFE.
-          _reporter.reportError(_reporter.createMessage(NO_LOCATION_SPANNABLE,
-              MessageKind.GENERIC, {'text': "No 'main' method found."}));
-          return null;
-        }
       } else {
         bool verbose = false;
         Target target =
@@ -232,18 +180,6 @@
         validateNullSafetyMode();
       }
 
-      if (_options.cfeOnly) {
-        measureSubtask('serialize dill', () {
-          _reporter.log('Writing dill to ${_options.outputUri}');
-          api.BinaryOutputSink dillOutput =
-              _compilerOutput.createBinarySink(_options.outputUri);
-          BinaryOutputSinkAdapter irSink = BinaryOutputSinkAdapter(dillOutput);
-          BinaryPrinter printer = BinaryPrinter(irSink);
-          printer.writeComponentFile(component);
-          irSink.close();
-        });
-      }
-
       if (forceSerialization) {
         // TODO(johnniwinther): Remove this when #34942 is fixed.
         List<int> data = serializeComponent(component);
@@ -290,7 +226,7 @@
 
 /// Result of invoking the CFE to produce the kernel IR.
 class KernelResult {
-  final ir.Component component;
+  ir.Component component;
 
   /// The [Uri] of the root library containing main.
   /// Note: rootLibraryUri will be null for some modules, for example in the
@@ -314,6 +250,55 @@
   KernelResult(this.component, this.rootLibraryUri, this.libraries,
       this.moduleLibraries);
 
+  static Library _findEntryLibrary(Component component, Uri entryUri) {
+    var entryLibrary = component.libraries
+        .firstWhere((l) => l.fileUri == entryUri, orElse: () => null);
+    if (entryLibrary == null) {
+      throw ArgumentError('Entry uri $entryUri not found in dill.');
+    }
+    return entryLibrary;
+  }
+
+  static ir.Reference _findMainMethod(Library entryLibrary) {
+    var mainMethod = entryLibrary.procedures
+        .firstWhere((p) => p.name.text == 'main', orElse: () => null);
+
+    // In some cases, a main method is defined in another file, and then
+    // exported. In these cases, we search for the main method in
+    // [additionalExports].
+    ir.Reference mainMethodReference;
+    if (mainMethod == null) {
+      mainMethodReference = entryLibrary.additionalExports.firstWhere(
+          (p) => p.canonicalName.name == 'main',
+          orElse: () => null);
+    } else {
+      mainMethodReference = mainMethod.reference;
+    }
+    if (mainMethodReference == null) {
+      throw ArgumentError(
+          'Entry uri ${entryLibrary.fileUri} has no main method.');
+    }
+    return mainMethodReference;
+  }
+
+  void setMainAndTrimComponent(Uri entryUri) {
+    var entryLibrary = _findEntryLibrary(component, entryUri);
+    var mainMethod = _findMainMethod(entryLibrary);
+    var irLibraryMap = <Uri, Library>{};
+    var irLibraries = <Library>[];
+    for (var library in component.libraries) {
+      irLibraryMap[library.importUri] = library;
+    }
+    for (var library in libraries) {
+      irLibraries.add(irLibraryMap[library]);
+    }
+    component = ir.Component(
+        libraries: irLibraries,
+        uriToSource: component.uriToSource,
+        nameRoot: component.root);
+    component.setMainMethodAndMode(mainMethod, true, component.mode);
+  }
+
   @override
   String toString() =>
       'root=$rootLibraryUri,libraries=$libraries,module=$moduleLibraries';
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index d0a06d4..d78db4c 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -18,6 +18,7 @@
 }
 
 enum FeatureStatus {
+  shipped,
   shipping,
   canary,
 }
@@ -31,6 +32,10 @@
 /// passed. The [isNegativeFlag] bool flips things around so while in [canary]
 /// the [FeatureOption] is enabled unless explicitly disabled, and while in
 /// [staging] it is disabled unless explicitly enabled.
+///
+/// Finally, mature features can be moved to [shipped], at which point we ignore
+/// the flag, but throw if the value of the flag is unexpected(i.e. if a
+/// positive flag is disabled, or a negative flag is enabled).
 class FeatureOption {
   final String flag;
   final bool isNegativeFlag;
@@ -71,6 +76,9 @@
   /// Whether to generate code compliant with Content Security Policy.
   FeatureOption useContentSecurityPolicy = FeatureOption('csp');
 
+  /// [FeatureOption]s which are shipped and cannot be toggled.
+  late final List<FeatureOption> shipped = [];
+
   /// [FeatureOption]s which default to enabled.
   late final List<FeatureOption> shipping = [
     legacyJavaScript,
@@ -107,6 +115,7 @@
 
   /// Parses a [List<String>] and enables / disables features as necessary.
   void parse(List<String> options) {
+    _verifyShippedFeatures(options, shipped);
     _extractFeatures(options, shipping, FeatureStatus.shipping);
     _extractFeatures(options, canary, FeatureStatus.canary);
   }
@@ -151,6 +160,13 @@
   /// Returns the compilation target specified by these options.
   Uri? get compilationTarget => inputDillUri ?? entryUri;
 
+  bool get fromDill {
+    var targetPath = compilationTarget!.path;
+    return targetPath.endsWith('.dill') ||
+        targetPath.endsWith('.gdill') ||
+        targetPath.endsWith('.mdill');
+  }
+
   /// Location of the package configuration file.
   ///
   /// If not null then [packageRoot] should be null.
@@ -176,6 +192,8 @@
 
   List<Uri>? modularAnalysisInputs;
 
+  bool get hasModularAnalysisInputs => modularAnalysisInputs != null;
+
   /// Location from which serialized inference data is read.
   ///
   /// If this is set, the [entryUri] is expected to be a .dill file and the
@@ -546,6 +564,9 @@
   /// Verbosity level used for filtering messages during compilation.
   fe.Verbosity verbosity = fe.Verbosity.all;
 
+  // Whether or not to dump a list of unused libraries.
+  bool dumpUnusedLibraries = false;
+
   late FeatureOptions features;
 
   // -------------------------------------------------
@@ -672,6 +693,7 @@
       .._noSoundNullSafety = _hasOption(options, Flags.noSoundNullSafety)
       .._mergeFragmentsThreshold =
           _extractIntOption(options, '${Flags.mergeFragmentsThreshold}=')
+      ..dumpUnusedLibraries = _hasOption(options, Flags.dumpUnusedLibraries)
       ..cfeInvocationModes = fe.InvocationMode.parseArguments(
           _extractStringOption(options, '${Flags.cfeInvocationModes}=', '')!,
           onError: onError)
@@ -908,4 +930,28 @@
   }
 }
 
+void _verifyShippedFeatures(
+    List<String> options, List<FeatureOption> features) {
+  for (var feature in features) {
+    String featureFlag = feature.flag;
+    String enableFeatureFlag = '--$featureFlag';
+    String disableFeatureFlag = '--no-$featureFlag';
+    bool enableFeature = _hasOption(options, enableFeatureFlag);
+    bool disableFeature = _hasOption(options, disableFeatureFlag);
+    if (enableFeature && disableFeature) {
+      throw ArgumentError("'$enableFeatureFlag' incompatible with "
+          "'$disableFeatureFlag'");
+    }
+    if (enableFeature && feature.isNegativeFlag) {
+      throw ArgumentError(
+          "$disableFeatureFlag has already shipped and cannot be enabled.");
+    }
+    if (disableFeature && !feature.isNegativeFlag) {
+      throw ArgumentError(
+          "$enableFeatureFlag has already shipped and cannot be disabled.");
+    }
+    feature.state = !feature.isNegativeFlag;
+  }
+}
+
 const String _UNDETERMINED_BUILD_ID = "build number could not be determined";
diff --git a/pkg/compiler/lib/src/serialization/task.dart b/pkg/compiler/lib/src/serialization/task.dart
index 27d75ae..e63f515 100644
--- a/pkg/compiler/lib/src/serialization/task.dart
+++ b/pkg/compiler/lib/src/serialization/task.dart
@@ -66,40 +66,6 @@
       closedWorld.elementMap, closedWorld, globalLocalsMap, inferredData);
 }
 
-void serializeGlobalTypeInferenceResultsToSinkLegacy(
-    GlobalTypeInferenceResults results, DataSink sink) {
-  JsClosedWorld closedWorld = results.closedWorld;
-  GlobalLocalsMap globalLocalsMap = results.globalLocalsMap;
-  InferredData inferredData = results.inferredData;
-  closedWorld.writeToDataSink(sink);
-  globalLocalsMap.writeToDataSink(sink);
-  inferredData.writeToDataSink(sink);
-  results.writeToDataSink(sink, closedWorld.elementMap);
-  sink.close();
-}
-
-GlobalTypeInferenceResults
-    deserializeGlobalTypeInferenceResultsFromSourceLegacy(
-        CompilerOptions options,
-        DiagnosticReporter reporter,
-        Environment environment,
-        AbstractValueStrategy abstractValueStrategy,
-        ir.Component component,
-        DataSource source) {
-  JsClosedWorld newClosedWorld = JsClosedWorld.readFromDataSource(
-      options, reporter, environment, abstractValueStrategy, component, source);
-  GlobalLocalsMap newGlobalLocalsMap = GlobalLocalsMap.readFromDataSource(
-      newClosedWorld.closureDataLookup.getEnclosingMember, source);
-  InferredData newInferredData =
-      InferredData.readFromDataSource(source, newClosedWorld);
-  return GlobalTypeInferenceResults.readFromDataSource(
-      source,
-      newClosedWorld.elementMap,
-      newClosedWorld,
-      newGlobalLocalsMap,
-      newInferredData);
-}
-
 void serializeClosedWorldToSink(JsClosedWorld closedWorld, DataSink sink) {
   closedWorld.writeToDataSink(sink);
   sink.close();
@@ -321,39 +287,6 @@
     });
   }
 
-  // TODO(joshualitt) get rid of legacy functions after Google3 roll.
-  void serializeGlobalTypeInferenceLegacy(GlobalTypeInferenceResults results) {
-    JsClosedWorld closedWorld = results.closedWorld;
-    ir.Component component = closedWorld.elementMap.programEnv.mainComponent;
-    serializeComponent(component);
-
-    measureSubtask('serialize data', () {
-      _reporter.log('Writing data to ${_options.writeDataUri}');
-      api.BinaryOutputSink dataOutput =
-          _outputProvider.createBinarySink(_options.writeDataUri);
-      DataSink sink = BinarySink(BinaryOutputSinkAdapter(dataOutput));
-      serializeGlobalTypeInferenceResultsToSinkLegacy(results, sink);
-    });
-  }
-
-  Future<GlobalTypeInferenceResults> deserializeGlobalTypeInferenceLegacy(
-      Environment environment,
-      AbstractValueStrategy abstractValueStrategy) async {
-    ir.Component component = await deserializeComponentAndUpdateOptions();
-
-    return await measureIoSubtask('deserialize data', () async {
-      _reporter.log('Reading data from ${_options.readDataUri}');
-      api.Input<List<int>> dataInput = await _provider
-          .readFromUri(_options.readDataUri, inputKind: api.InputKind.binary);
-      DataSource source =
-          BinarySourceImpl(dataInput.data, stringInterner: _stringInterner);
-      return deserializeGlobalTypeInferenceResultsFromSourceLegacy(_options,
-          _reporter, environment, abstractValueStrategy, component, source);
-    });
-  }
-
-  // TODO(joshualitt): Investigate whether closed world indices can be shared
-  // with codegen.
   void serializeCodegen(BackendStrategy backendStrategy,
       CodegenResults codegenResults, DataSourceIndices indices) {
     GlobalTypeInferenceResults globalTypeInferenceResults =
diff --git a/pkg/compiler/lib/src/source_file_provider.dart b/pkg/compiler/lib/src/source_file_provider.dart
index cc5e875..359fead 100644
--- a/pkg/compiler/lib/src/source_file_provider.dart
+++ b/pkg/compiler/lib/src/source_file_provider.dart
@@ -351,6 +351,7 @@
         uri = out.resolve('$name.$extension');
         break;
       case OutputType.dumpInfo:
+      case OutputType.dumpUnusedLibraries:
       case OutputType.deferredMap:
         if (name == '') {
           name = out.pathSegments.last;
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index e7ec92f..5e44fa5 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -95,13 +95,18 @@
       CodegenRegistry registry,
       ModularNamer namer,
       ModularEmitter emitter) {
+    js.Expression code;
     if (member.isField) {
-      return generateLazyInitializer(
+      code = generateLazyInitializer(
           member, graph, codegen, closedWorld, registry, namer, emitter);
     } else {
-      return generateMethod(
+      code = generateMethod(
           member, graph, codegen, closedWorld, registry, namer, emitter);
     }
+    if (code != null) {
+      codegen.tracer.traceJavaScriptText('JavaScript', code.debugPrint);
+    }
+    return code;
   }
 
   js.Expression generateLazyInitializer(
@@ -113,7 +118,6 @@
       ModularNamer namer,
       ModularEmitter emitter) {
     return measure(() {
-      codegen.tracer.traceGraph("codegen", graph);
       SourceInformation sourceInformation = sourceInformationStrategy
           .createBuilderForContext(field)
           .buildDeclaration(field);
@@ -129,6 +133,7 @@
           closedWorld,
           registry);
       codeGenerator.visitGraph(graph);
+      codegen.tracer.traceGraph("codegen", graph);
       return js.Fun(codeGenerator.parameters, codeGenerator.body)
           .withSourceInformation(sourceInformation);
     });
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
index 2ceac61..ab0b1a6 100644
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
@@ -117,9 +117,24 @@
         .isEmitted;
   }
 
-  HBoundsCheck insertBoundsCheck(HInstruction indexerNode, HInstruction array,
-      HInstruction indexArgument, JClosedWorld closedWorld) {
+  HBoundsCheck insertBoundsCheck(
+      HInvokeDynamic indexerNode,
+      HInstruction array,
+      HInstruction indexArgument,
+      JClosedWorld closedWorld,
+      OptimizationTestLog log) {
     final abstractValueDomain = closedWorld.abstractValueDomain;
+
+    if (abstractValueDomain.isNull(array.instructionType).isPotentiallyTrue) {
+      HNullCheck check = HNullCheck(
+          array, abstractValueDomain.excludeNull(array.instructionType))
+        ..selector = indexerNode.selector
+        ..sourceInformation = indexerNode.sourceInformation;
+      log?.registerNullCheck(indexerNode, check);
+      indexerNode.block.addBefore(indexerNode, check);
+      array = check;
+    }
+
     HGetLength length = HGetLength(array, abstractValueDomain.positiveIntType,
         isAssignable: abstractValueDomain
             .isFixedLengthJsIndexable(array.instructionType)
@@ -212,7 +227,7 @@
     HInstruction checkedIndex = index;
     if (requiresBoundsCheck(instruction, closedWorld)) {
       checkedIndex =
-          insertBoundsCheck(instruction, receiver, index, closedWorld);
+          insertBoundsCheck(instruction, receiver, index, closedWorld, log);
     }
     HIndexAssign converted = HIndexAssign(
         closedWorld.abstractValueDomain, receiver, checkedIndex, value);
@@ -291,7 +306,7 @@
     HInstruction checkedIndex = index;
     if (requiresBoundsCheck(instruction, closedWorld)) {
       checkedIndex =
-          insertBoundsCheck(instruction, receiver, index, closedWorld);
+          insertBoundsCheck(instruction, receiver, index, closedWorld, log);
     }
     HIndex converted = HIndex(receiver, checkedIndex, elementType);
     log?.registerIndex(instruction, converted);
@@ -322,7 +337,7 @@
     if (requiresBoundsCheck(instruction, closedWorld)) {
       HConstant zeroIndex = graph.addConstantInt(0, closedWorld);
       HBoundsCheck check =
-          insertBoundsCheck(instruction, receiver, zeroIndex, closedWorld);
+          insertBoundsCheck(instruction, receiver, zeroIndex, closedWorld, log);
       HInstruction minusOne = graph.addConstantInt(-1, closedWorld);
       check.inputs.add(minusOne);
       minusOne.usedBy.add(check);
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index d600d7e..0475798 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -606,8 +606,20 @@
           .isDefinitelyTrue) {
         resultType = _abstractValueDomain.uint32Type;
       }
+      HInstruction checkedReceiver = actualReceiver;
+      if (actualReceiver.isNull(_abstractValueDomain).isPotentiallyTrue) {
+        // The receiver is potentially `null` so we insert a null receiver
+        // check. This will be folded into the length access later.
+        HNullCheck check = HNullCheck(actualReceiver,
+            _abstractValueDomain.excludeNull(actualReceiver.instructionType))
+          ..selector = node.selector
+          ..sourceInformation = node.sourceInformation;
+        _log?.registerNullCheck(node, check);
+        node.block.addBefore(node, check);
+        checkedReceiver = check;
+      }
       HGetLength result =
-          HGetLength(actualReceiver, resultType, isAssignable: !isFixed);
+          HGetLength(checkedReceiver, resultType, isAssignable: !isFixed);
       return result;
     } else if (actualReceiver.isConstantMap()) {
       HConstant constantInput = actualReceiver;
@@ -2607,12 +2619,14 @@
     if (branch is HIf) {
       if (branch.thenBlock.isLive == branch.elseBlock.isLive) return;
       assert(branch.condition.isConstant());
-      HBasicBlock target =
+      HBasicBlock liveSuccessor =
           branch.thenBlock.isLive ? branch.thenBlock : branch.elseBlock;
-      HInstruction instruction = target.first;
-      while (!instruction.isControlFlow()) {
-        HInstruction next = instruction.next;
+      HInstruction instruction = liveSuccessor.first;
+      // Move instructions up until the final control flow instruction or pinned
+      // HTypeKnown.
+      while (instruction.next != null) {
         if (instruction is HTypeKnown && instruction.isPinned) break;
+        HInstruction next = instruction.next;
         // It might be worth re-running GVN optimizations if we hoisted a
         // GVN-able instructions from [target] into [block].
         newGvnCandidates = newGvnCandidates || instruction.useGvn();
diff --git a/pkg/compiler/lib/src/ssa/ssa.dart b/pkg/compiler/lib/src/ssa/ssa.dart
index 5b825ce..39c3355 100644
--- a/pkg/compiler/lib/src/ssa/ssa.dart
+++ b/pkg/compiler/lib/src/ssa/ssa.dart
@@ -101,6 +101,8 @@
           graph.asyncElementType,
           sourceInformationBuilder.buildAsyncBody(),
           sourceInformationBuilder.buildAsyncExit());
+      _codegen.tracer
+          .traceJavaScriptText('JavaScript.rewrite', result.debugPrint);
     }
     if (result.sourceInformation == null) {
       result = result.withSourceInformation(
diff --git a/pkg/compiler/lib/src/ssa/ssa_tracer.dart b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
index 8887610..c8a843f 100644
--- a/pkg/compiler/lib/src/ssa/ssa_tracer.dart
+++ b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
@@ -30,6 +30,35 @@
     });
   }
 
+  void traceJavaScriptText(String name, String data) {
+    DEBUG_MODE = true;
+    tag("cfg", () {
+      printProperty("name", name);
+      // Emit a fake basic block, with one 'instruction' per line of text.
+      tag("block", () {
+        printProperty("name", "B1");
+        printProperty("from_bci", -1);
+        printProperty("to_bci", -1);
+        printEmptyProperty("predecessors");
+        printEmptyProperty("successors");
+        printEmptyProperty("xhandlers");
+        printEmptyProperty("flags");
+        tag("states", () {
+          tag("locals", () {
+            printProperty("size", 0);
+            printProperty("method", "None");
+          });
+        });
+        tag("HIR", () {
+          for (final line in data.split('\n')) {
+            addIndent();
+            add("0 0 i0 js | $line<|@\n");
+          }
+        });
+      });
+    });
+  }
+
   void addPredecessors(HBasicBlock block) {
     if (block.predecessors.isEmpty) {
       printEmptyProperty("predecessors");
diff --git a/pkg/compiler/lib/src/tracer.dart b/pkg/compiler/lib/src/tracer.dart
index 3386c81..26f4bb3d 100644
--- a/pkg/compiler/lib/src/tracer.dart
+++ b/pkg/compiler/lib/src/tracer.dart
@@ -55,6 +55,11 @@
     }
   }
 
+  void traceJavaScriptText(String name, String Function() getText) {
+    if (!traceActive) return;
+    HTracer(output, closedWorld).traceJavaScriptText(name, getText());
+  }
+
   void close() {
     if (output != null) {
       output.close();
diff --git a/pkg/compiler/test/custom_split/custom_split_test.dart b/pkg/compiler/test/custom_split/custom_split_test.dart
index fb0968a..f1e4fd4 100644
--- a/pkg/compiler/test/custom_split/custom_split_test.dart
+++ b/pkg/compiler/test/custom_split/custom_split_test.dart
@@ -83,17 +83,30 @@
   return json;
 }
 
+Uri getFileInTestFolder(String test, String file) =>
+    Platform.script.resolve('data/$test/$file');
+
+Future<String> compileConstraintsToJson(String test, Compiler compiler) async {
+  var constraints = getFileInTestFolder(test, 'constraints.dart');
+  var component = compiler.componentForTesting;
+  return constraintsToJson(component, constraints);
+}
+
+File getConstraintsJsonFile(String test) {
+  var constraintsJsonUri = getFileInTestFolder(test, 'constraints.json');
+  return File(constraintsJsonUri.toFilePath());
+}
+
 /// Verifies the programmatic API produces the expected JSON.
 Future<void> verifyCompiler(String test, Compiler compiler) async {
-  var constraints = Platform.script.resolve('data/$test/constraints.dart');
-  var constraintsJsonUri =
-      Platform.script.resolve('data/$test/constraints.json');
-  var component = compiler.componentForTesting;
-  var json = await constraintsToJson(component, constraints);
-  var constraintsJson =
-      File(constraintsJsonUri.toFilePath()).readAsStringSync();
-  constraintsJson = constraintsJson.substring(0, constraintsJson.length - 1);
-  Expect.equals(json, constraintsJson);
+  var json = await compileConstraintsToJson(test, compiler);
+  Expect.equals(getConstraintsJsonFile(test).readAsStringSync(), json);
+}
+
+/// Generates constraint JSON.
+Future<void> generateJSON(String test, Compiler compiler) async {
+  var json = await compileConstraintsToJson(test, compiler);
+  getConstraintsJsonFile(test).writeAsStringSync(json);
 }
 
 /// Compute the [OutputUnit]s for all source files involved in the test, and
@@ -102,6 +115,7 @@
 /// or all supporting libraries to be in the `libs` folder, starting with the
 /// same name as the original file in `data`.
 main(List<String> args) {
+  bool generateGoldens = args.contains('-g');
   asyncTest(() async {
     Directory dataDir = Directory.fromUri(Platform.script.resolve('data'));
     await checkTests(dataDir, const OutputUnitDataComputer(),
@@ -109,6 +123,8 @@
         perTestOptions: createPerTestOptions(),
         args: args, setUpFunction: () {
       importPrefixes.clear();
-    }, testedConfigs: allSpecConfigs, verifyCompiler: verifyCompiler);
+    },
+        testedConfigs: allSpecConfigs,
+        verifyCompiler: generateGoldens ? generateJSON : verifyCompiler);
   });
 }
diff --git a/pkg/compiler/test/custom_split/data/diamond/constraints.dart b/pkg/compiler/test/custom_split/data/diamond/constraints.dart
index 92a7665..88ccb84 100644
--- a/pkg/compiler/test/custom_split/data/diamond/constraints.dart
+++ b/pkg/compiler/test/custom_split/data/diamond/constraints.dart
@@ -12,12 +12,16 @@
 }
 
 List<Node> processDeferredImports(List<String> imports) {
+  var step1 = 'memory:sdk/tests/web/native/main.dart#step1';
+  var step2a = 'memory:sdk/tests/web/native/main.dart#step2a';
+  var step2b = 'memory:sdk/tests/web/native/main.dart#step2b';
+  var step3 = 'memory:sdk/tests/web/native/main.dart#step3';
   var builder = ProgramSplitBuilder();
   return [
     ...imports.map(builder.referenceNode),
-    builder.orderNode('step1', 'step2a'),
-    builder.orderNode('step1', 'step2b'),
-    builder.orderNode('step2a', 'step3'),
-    builder.orderNode('step2b', 'step3'),
+    builder.orderNode(step1, step2a),
+    builder.orderNode(step1, step2b),
+    builder.orderNode(step2a, step3),
+    builder.orderNode(step2b, step3),
   ];
 }
diff --git a/pkg/compiler/test/custom_split/data/diamond/constraints.json b/pkg/compiler/test/custom_split/data/diamond/constraints.json
index 83dfe0a..21b8afa 100644
--- a/pkg/compiler/test/custom_split/data/diamond/constraints.json
+++ b/pkg/compiler/test/custom_split/data/diamond/constraints.json
@@ -1,42 +1,42 @@
 [
   {
     "type": "reference",
-    "name": "step1",
+    "name": "memory:sdk/tests/web/native/main.dart#step1",
     "import": "memory:sdk/tests/web/native/main.dart#step1"
   },
   {
     "type": "reference",
-    "name": "step2a",
+    "name": "memory:sdk/tests/web/native/main.dart#step2a",
     "import": "memory:sdk/tests/web/native/main.dart#step2a"
   },
   {
     "type": "reference",
-    "name": "step2b",
+    "name": "memory:sdk/tests/web/native/main.dart#step2b",
     "import": "memory:sdk/tests/web/native/main.dart#step2b"
   },
   {
     "type": "reference",
-    "name": "step3",
+    "name": "memory:sdk/tests/web/native/main.dart#step3",
     "import": "memory:sdk/tests/web/native/main.dart#step3"
   },
   {
     "type": "order",
-    "predecessor": "step1",
-    "successor": "step2a"
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
+    "successor": "memory:sdk/tests/web/native/main.dart#step2a"
   },
   {
     "type": "order",
-    "predecessor": "step1",
-    "successor": "step2b"
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
+    "successor": "memory:sdk/tests/web/native/main.dart#step2b"
   },
   {
     "type": "order",
-    "predecessor": "step2a",
-    "successor": "step3"
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step2a",
+    "successor": "memory:sdk/tests/web/native/main.dart#step3"
   },
   {
     "type": "order",
-    "predecessor": "step2b",
-    "successor": "step3"
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step2b",
+    "successor": "memory:sdk/tests/web/native/main.dart#step3"
   }
-]
+]
\ No newline at end of file
diff --git a/pkg/compiler/test/custom_split/data/diamond_and/constraints.dart b/pkg/compiler/test/custom_split/data/diamond_and/constraints.dart
index b3a40ca..a333016 100644
--- a/pkg/compiler/test/custom_split/data/diamond_and/constraints.dart
+++ b/pkg/compiler/test/custom_split/data/diamond_and/constraints.dart
@@ -12,11 +12,15 @@
 }
 
 List<Node> processDeferredImports(List<String> imports) {
+  var step1 = 'memory:sdk/tests/web/native/main.dart#step1';
+  var step2a = 'memory:sdk/tests/web/native/main.dart#step2a';
+  var step2b = 'memory:sdk/tests/web/native/main.dart#step2b';
+  var step3 = 'memory:sdk/tests/web/native/main.dart#step3';
   var builder = ProgramSplitBuilder();
   return [
     ...imports.map(builder.referenceNode),
-    builder.andNode('step2', ['step2a', 'step2b']),
-    builder.orderNode('step1', 'step2'),
-    builder.orderNode('step2', 'step3'),
+    builder.andNode('step2', {step2a, step2b}),
+    builder.orderNode(step1, 'step2'),
+    builder.orderNode('step2', step3),
   ];
 }
diff --git a/pkg/compiler/test/custom_split/data/diamond_and/constraints.json b/pkg/compiler/test/custom_split/data/diamond_and/constraints.json
index 931a910..85344e7 100644
--- a/pkg/compiler/test/custom_split/data/diamond_and/constraints.json
+++ b/pkg/compiler/test/custom_split/data/diamond_and/constraints.json
@@ -1,40 +1,40 @@
 [
   {
     "type": "reference",
-    "name": "step1",
+    "name": "memory:sdk/tests/web/native/main.dart#step1",
     "import": "memory:sdk/tests/web/native/main.dart#step1"
   },
   {
     "type": "reference",
-    "name": "step2a",
+    "name": "memory:sdk/tests/web/native/main.dart#step2a",
     "import": "memory:sdk/tests/web/native/main.dart#step2a"
   },
   {
     "type": "reference",
-    "name": "step2b",
+    "name": "memory:sdk/tests/web/native/main.dart#step2b",
     "import": "memory:sdk/tests/web/native/main.dart#step2b"
   },
   {
     "type": "reference",
-    "name": "step3",
+    "name": "memory:sdk/tests/web/native/main.dart#step3",
     "import": "memory:sdk/tests/web/native/main.dart#step3"
   },
   {
     "type": "and",
     "name": "step2",
     "nodes": [
-      "step2a",
-      "step2b"
+      "memory:sdk/tests/web/native/main.dart#step2a",
+      "memory:sdk/tests/web/native/main.dart#step2b"
     ]
   },
   {
     "type": "order",
-    "predecessor": "step1",
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
     "successor": "step2"
   },
   {
     "type": "order",
     "predecessor": "step2",
-    "successor": "step3"
+    "successor": "memory:sdk/tests/web/native/main.dart#step3"
   }
-]
+]
\ No newline at end of file
diff --git a/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.dart b/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.dart
index 6fdf62e..145cbd1 100644
--- a/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.dart
+++ b/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.dart
@@ -12,11 +12,15 @@
 }
 
 List<Node> processDeferredImports(List<String> imports) {
+  var step1 = 'memory:sdk/tests/web/native/main.dart#step1';
+  var step2a = 'memory:sdk/tests/web/native/main.dart#step2a';
+  var step2b = 'memory:sdk/tests/web/native/main.dart#step2b';
+  var step3 = 'memory:sdk/tests/web/native/main.dart#step3';
   var builder = ProgramSplitBuilder();
   return [
     ...imports.map(builder.referenceNode),
-    builder.fuseNode('step2', ['step2a', 'step2b']),
-    builder.orderNode('step1', 'step2'),
-    builder.orderNode('step2', 'step3'),
+    builder.fuseNode('step2', {step2a, step2b}),
+    builder.orderNode(step1, 'step2'),
+    builder.orderNode('step2', step3),
   ];
 }
diff --git a/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.json b/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.json
index f170d18..dccfe20 100644
--- a/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.json
+++ b/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.json
@@ -1,40 +1,40 @@
 [
   {
     "type": "reference",
-    "name": "step1",
+    "name": "memory:sdk/tests/web/native/main.dart#step1",
     "import": "memory:sdk/tests/web/native/main.dart#step1"
   },
   {
     "type": "reference",
-    "name": "step2a",
+    "name": "memory:sdk/tests/web/native/main.dart#step2a",
     "import": "memory:sdk/tests/web/native/main.dart#step2a"
   },
   {
     "type": "reference",
-    "name": "step2b",
+    "name": "memory:sdk/tests/web/native/main.dart#step2b",
     "import": "memory:sdk/tests/web/native/main.dart#step2b"
   },
   {
     "type": "reference",
-    "name": "step3",
+    "name": "memory:sdk/tests/web/native/main.dart#step3",
     "import": "memory:sdk/tests/web/native/main.dart#step3"
   },
   {
     "type": "fuse",
     "name": "step2",
     "nodes": [
-      "step2a",
-      "step2b"
+      "memory:sdk/tests/web/native/main.dart#step2a",
+      "memory:sdk/tests/web/native/main.dart#step2b"
     ]
   },
   {
     "type": "order",
-    "predecessor": "step1",
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
     "successor": "step2"
   },
   {
     "type": "order",
     "predecessor": "step2",
-    "successor": "step3"
+    "successor": "memory:sdk/tests/web/native/main.dart#step3"
   }
-]
+]
\ No newline at end of file
diff --git a/pkg/compiler/test/custom_split/data/diamond_or/constraints.dart b/pkg/compiler/test/custom_split/data/diamond_or/constraints.dart
index 659bf73..bdc5e1f 100644
--- a/pkg/compiler/test/custom_split/data/diamond_or/constraints.dart
+++ b/pkg/compiler/test/custom_split/data/diamond_or/constraints.dart
@@ -12,11 +12,15 @@
 }
 
 List<Node> processDeferredImports(List<String> imports) {
+  var step1 = 'memory:sdk/tests/web/native/main.dart#step1';
+  var step2a = 'memory:sdk/tests/web/native/main.dart#step2a';
+  var step2b = 'memory:sdk/tests/web/native/main.dart#step2b';
+  var step3 = 'memory:sdk/tests/web/native/main.dart#step3';
   var builder = ProgramSplitBuilder();
   return [
     ...imports.map(builder.referenceNode),
-    builder.orNode('step2', ['step2a', 'step2b']),
-    builder.orderNode('step1', 'step2'),
-    builder.orderNode('step2', 'step3'),
+    builder.orNode('step2', {step2a, step2b}),
+    builder.orderNode(step1, 'step2'),
+    builder.orderNode('step2', step3),
   ];
 }
diff --git a/pkg/compiler/test/custom_split/data/diamond_or/constraints.json b/pkg/compiler/test/custom_split/data/diamond_or/constraints.json
index 5fcc300..c4091f4 100644
--- a/pkg/compiler/test/custom_split/data/diamond_or/constraints.json
+++ b/pkg/compiler/test/custom_split/data/diamond_or/constraints.json
@@ -1,40 +1,40 @@
 [
   {
     "type": "reference",
-    "name": "step1",
+    "name": "memory:sdk/tests/web/native/main.dart#step1",
     "import": "memory:sdk/tests/web/native/main.dart#step1"
   },
   {
     "type": "reference",
-    "name": "step2a",
+    "name": "memory:sdk/tests/web/native/main.dart#step2a",
     "import": "memory:sdk/tests/web/native/main.dart#step2a"
   },
   {
     "type": "reference",
-    "name": "step2b",
+    "name": "memory:sdk/tests/web/native/main.dart#step2b",
     "import": "memory:sdk/tests/web/native/main.dart#step2b"
   },
   {
     "type": "reference",
-    "name": "step3",
+    "name": "memory:sdk/tests/web/native/main.dart#step3",
     "import": "memory:sdk/tests/web/native/main.dart#step3"
   },
   {
     "type": "or",
     "name": "step2",
     "nodes": [
-      "step2a",
-      "step2b"
+      "memory:sdk/tests/web/native/main.dart#step2a",
+      "memory:sdk/tests/web/native/main.dart#step2b"
     ]
   },
   {
     "type": "order",
-    "predecessor": "step1",
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
     "successor": "step2"
   },
   {
     "type": "order",
     "predecessor": "step2",
-    "successor": "step3"
+    "successor": "memory:sdk/tests/web/native/main.dart#step3"
   }
-]
+]
\ No newline at end of file
diff --git a/pkg/compiler/test/custom_split/data/two_branch/constraints.dart b/pkg/compiler/test/custom_split/data/two_branch/constraints.dart
index 1e6ad05..27a00ab 100644
--- a/pkg/compiler/test/custom_split/data/two_branch/constraints.dart
+++ b/pkg/compiler/test/custom_split/data/two_branch/constraints.dart
@@ -12,10 +12,13 @@
 }
 
 List<Node> processDeferredImports(List<String> imports) {
+  var step1 = 'memory:sdk/tests/web/native/main.dart#step1';
+  var step2a = 'memory:sdk/tests/web/native/main.dart#step2a';
+  var step2b = 'memory:sdk/tests/web/native/main.dart#step2b';
   var builder = ProgramSplitBuilder();
   return [
     ...imports.map(builder.referenceNode),
-    builder.orderNode('step1', 'step2a'),
-    builder.orderNode('step1', 'step2b'),
+    builder.orderNode(step1, step2a),
+    builder.orderNode(step1, step2b),
   ];
 }
diff --git a/pkg/compiler/test/custom_split/data/two_branch/constraints.json b/pkg/compiler/test/custom_split/data/two_branch/constraints.json
index 8b86071..1a29d7b 100644
--- a/pkg/compiler/test/custom_split/data/two_branch/constraints.json
+++ b/pkg/compiler/test/custom_split/data/two_branch/constraints.json
@@ -1,27 +1,27 @@
 [
   {
     "type": "reference",
-    "name": "step1",
+    "name": "memory:sdk/tests/web/native/main.dart#step1",
     "import": "memory:sdk/tests/web/native/main.dart#step1"
   },
   {
     "type": "reference",
-    "name": "step2a",
+    "name": "memory:sdk/tests/web/native/main.dart#step2a",
     "import": "memory:sdk/tests/web/native/main.dart#step2a"
   },
   {
     "type": "reference",
-    "name": "step2b",
+    "name": "memory:sdk/tests/web/native/main.dart#step2b",
     "import": "memory:sdk/tests/web/native/main.dart#step2b"
   },
   {
     "type": "order",
-    "predecessor": "step1",
-    "successor": "step2a"
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
+    "successor": "memory:sdk/tests/web/native/main.dart#step2a"
   },
   {
     "type": "order",
-    "predecessor": "step1",
-    "successor": "step2b"
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
+    "successor": "memory:sdk/tests/web/native/main.dart#step2b"
   }
-]
+]
\ No newline at end of file
diff --git a/pkg/compiler/test/custom_split/data/two_step/constraints.dart b/pkg/compiler/test/custom_split/data/two_step/constraints.dart
index 9089c5c..fe0d8a5 100644
--- a/pkg/compiler/test/custom_split/data/two_step/constraints.dart
+++ b/pkg/compiler/test/custom_split/data/two_step/constraints.dart
@@ -12,10 +12,13 @@
 }
 
 List<Node> processDeferredImports(List<String> imports) {
+  var step1 = 'memory:sdk/tests/web/native/main.dart#step1';
+  var step2 = 'memory:sdk/tests/web/native/main.dart#step2';
+  var step3 = 'memory:sdk/tests/web/native/main.dart#step3';
   var builder = ProgramSplitBuilder();
   return [
     ...imports.map(builder.referenceNode),
-    builder.orderNode('step1', 'step2'),
-    builder.orderNode('step2', 'step3'),
+    builder.orderNode(step1, step2),
+    builder.orderNode(step2, step3),
   ];
 }
diff --git a/pkg/compiler/test/custom_split/data/two_step/constraints.json b/pkg/compiler/test/custom_split/data/two_step/constraints.json
index b72db44..77a02de 100644
--- a/pkg/compiler/test/custom_split/data/two_step/constraints.json
+++ b/pkg/compiler/test/custom_split/data/two_step/constraints.json
@@ -1,27 +1,27 @@
 [
   {
     "type": "reference",
-    "name": "step1",
+    "name": "memory:sdk/tests/web/native/main.dart#step1",
     "import": "memory:sdk/tests/web/native/main.dart#step1"
   },
   {
     "type": "reference",
-    "name": "step2",
+    "name": "memory:sdk/tests/web/native/main.dart#step2",
     "import": "memory:sdk/tests/web/native/main.dart#step2"
   },
   {
     "type": "reference",
-    "name": "step3",
+    "name": "memory:sdk/tests/web/native/main.dart#step3",
     "import": "memory:sdk/tests/web/native/main.dart#step3"
   },
   {
     "type": "order",
-    "predecessor": "step1",
-    "successor": "step2"
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
+    "successor": "memory:sdk/tests/web/native/main.dart#step2"
   },
   {
     "type": "order",
-    "predecessor": "step2",
-    "successor": "step3"
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step2",
+    "successor": "memory:sdk/tests/web/native/main.dart#step3"
   }
-]
+]
\ No newline at end of file
diff --git a/pkg/compiler/test/end_to_end/command_line_test.dart b/pkg/compiler/test/end_to_end/command_line_test.dart
index ec0a78a..f3ecc57 100644
--- a/pkg/compiler/test/end_to_end/command_line_test.dart
+++ b/pkg/compiler/test/end_to_end/command_line_test.dart
@@ -91,14 +91,27 @@
       '--out=foo.dill'
     ], out: 'foo.dill', readClosedWorld: 'foo.world', writeData: 'foo.data');
 
-    await test([Flags.readData, 'foo.dill'],
-        out: 'out.js', readData: 'foo.dill.data');
-    await test([Flags.readData, 'foo.dill', '--out=foo.js'],
-        out: 'foo.js', readData: 'foo.dill.data');
-    await test(['${Flags.readData}=out.data', 'foo.dill'],
-        out: 'out.js', readData: 'out.data');
-    await test(['${Flags.readData}=out.data', 'foo.dill', '--out=foo.js'],
-        out: 'foo.js', readData: 'out.data');
+    await test([Flags.readData, 'foo.dill'], exitCode: 1);
+    await test([Flags.readClosedWorld, Flags.readData, 'foo.dill'],
+        out: 'out.js',
+        readClosedWorld: 'foo.dill.world',
+        readData: 'foo.dill.data');
+    await test(
+        [Flags.readClosedWorld, Flags.readData, 'foo.dill', '--out=foo.js'],
+        out: 'foo.js',
+        readClosedWorld: 'foo.dill.world',
+        readData: 'foo.dill.data');
+    await test([
+      '${Flags.readClosedWorld}=out.world',
+      '${Flags.readData}=out.data',
+      'foo.dill'
+    ], out: 'out.js', readClosedWorld: 'out.world', readData: 'out.data');
+    await test([
+      '${Flags.readClosedWorld}=out.world',
+      '${Flags.readData}=out.data',
+      'foo.dill',
+      '--out=foo.js'
+    ], out: 'foo.js', readClosedWorld: 'out.world', readData: 'out.data');
 
     await test([
       Flags.writeCodegen,
@@ -107,6 +120,7 @@
       '${Flags.codegenShards}=2'
     ], exitCode: 1);
     await test([
+      Flags.readClosedWorld,
       Flags.readData,
       Flags.writeCodegen,
       'foo.dill',
@@ -114,6 +128,7 @@
       '${Flags.codegenShards}=2'
     ],
         out: 'out',
+        readClosedWorld: 'foo.dill.world',
         readData: 'foo.dill.data',
         writeCodegen: 'out.code',
         codegenShard: 0,
@@ -121,16 +136,19 @@
     await test([
       Flags.writeCodegen,
       Flags.readData,
+      Flags.readClosedWorld,
       'foo.dill',
       '${Flags.codegenShard}=1',
       '${Flags.codegenShards}=2'
     ],
         out: 'out',
+        readClosedWorld: 'foo.dill.world',
         readData: 'foo.dill.data',
         writeCodegen: 'out.code',
         codegenShard: 1,
         codegenShards: 2);
     await test([
+      '${Flags.readClosedWorld}=foo.world',
       '${Flags.readData}=foo.data',
       '${Flags.writeCodegen}=foo.code',
       'foo.dill',
@@ -138,6 +156,7 @@
       '${Flags.codegenShards}=3'
     ],
         out: 'out',
+        readClosedWorld: 'foo.world',
         readData: 'foo.data',
         writeCodegen: 'foo.code',
         codegenShard: 0,
@@ -145,12 +164,14 @@
     await test([
       '${Flags.readData}=foo.data',
       '${Flags.writeCodegen}',
+      '${Flags.readClosedWorld}=foo.world',
       'foo.dill',
       '--out=foo.js',
       '${Flags.codegenShard}=0',
       '${Flags.codegenShards}=2'
     ],
         out: 'foo.js',
+        readClosedWorld: 'foo.world',
         readData: 'foo.data',
         writeCodegen: 'foo.js.code',
         codegenShard: 0,
@@ -203,28 +224,126 @@
       '${Flags.codegenShards}=2'
     ], exitCode: 1);
 
-    await test([Flags.readCodegen, 'foo.dill', '${Flags.codegenShards}=2'],
-        out: 'out.js',
-        readData: 'foo.dill.data',
-        readCodegen: 'foo.dill.code',
-        codegenShards: 2);
+    // These three flags should parse in any order, but all are required.
     await test([
-      '${Flags.readCodegen}=foo.code',
-      'foo.dill',
-      '${Flags.codegenShards}=3'
-    ],
-        out: 'out.js',
-        readData: 'foo.dill.data',
-        readCodegen: 'foo.code',
-        codegenShards: 3);
-
-    await test([
+      Flags.readClosedWorld,
       Flags.readData,
       Flags.readCodegen,
       'foo.dill',
       '${Flags.codegenShards}=2'
     ],
         out: 'out.js',
+        readClosedWorld: 'foo.dill.world',
+        readData: 'foo.dill.data',
+        readCodegen: 'foo.dill.code',
+        codegenShards: 2);
+    await test([
+      Flags.readClosedWorld,
+      Flags.readCodegen,
+      Flags.readData,
+      'foo.dill',
+      '${Flags.codegenShards}=2'
+    ],
+        out: 'out.js',
+        readClosedWorld: 'foo.dill.world',
+        readData: 'foo.dill.data',
+        readCodegen: 'foo.dill.code',
+        codegenShards: 2);
+    await test([
+      Flags.readCodegen,
+      Flags.readClosedWorld,
+      Flags.readData,
+      'foo.dill',
+      '${Flags.codegenShards}=2'
+    ],
+        out: 'out.js',
+        readClosedWorld: 'foo.dill.world',
+        readData: 'foo.dill.data',
+        readCodegen: 'foo.dill.code',
+        codegenShards: 2);
+    await test([
+      Flags.readCodegen,
+      Flags.readData,
+      Flags.readClosedWorld,
+      'foo.dill',
+      '${Flags.codegenShards}=2'
+    ],
+        out: 'out.js',
+        readClosedWorld: 'foo.dill.world',
+        readData: 'foo.dill.data',
+        readCodegen: 'foo.dill.code',
+        codegenShards: 2);
+    await test([
+      Flags.readData,
+      Flags.readCodegen,
+      Flags.readClosedWorld,
+      'foo.dill',
+      '${Flags.codegenShards}=2'
+    ],
+        out: 'out.js',
+        readClosedWorld: 'foo.dill.world',
+        readData: 'foo.dill.data',
+        readCodegen: 'foo.dill.code',
+        codegenShards: 2);
+    await test([
+      Flags.readData,
+      Flags.readClosedWorld,
+      Flags.readCodegen,
+      'foo.dill',
+      '${Flags.codegenShards}=2'
+    ],
+        out: 'out.js',
+        readClosedWorld: 'foo.dill.world',
+        readData: 'foo.dill.data',
+        readCodegen: 'foo.dill.code',
+        codegenShards: 2);
+    await test([
+      Flags.readClosedWorld,
+      Flags.readCodegen,
+      'foo.dill',
+      '${Flags.codegenShards}=2'
+    ], exitCode: 1);
+    await test([
+      Flags.readData,
+      Flags.readCodegen,
+      'foo.dill',
+      '${Flags.codegenShards}=2'
+    ], exitCode: 1);
+
+    await test([
+      Flags.readData,
+      Flags.readClosedWorld,
+      Flags.readCodegen,
+      'foo.dill',
+      '${Flags.codegenShards}=2'
+    ],
+        out: 'out.js',
+        readClosedWorld: 'foo.dill.world',
+        readData: 'foo.dill.data',
+        readCodegen: 'foo.dill.code',
+        codegenShards: 2);
+    await test([
+      '${Flags.readCodegen}=foo.code',
+      'foo.dill',
+      '${Flags.codegenShards}=3',
+      Flags.readData,
+      Flags.readClosedWorld,
+    ],
+        out: 'out.js',
+        readData: 'foo.dill.data',
+        readClosedWorld: 'foo.dill.world',
+        readCodegen: 'foo.code',
+        codegenShards: 3);
+
+    await test([
+      Flags.readData,
+      Flags.readCodegen,
+      Flags.readClosedWorld,
+      'foo.dill',
+      '${Flags.codegenShards}=2'
+    ],
+        out: 'out.js',
+        readClosedWorld: 'foo.dill.world',
         readData: 'foo.dill.data',
         readCodegen: 'foo.dill.code',
         codegenShards: 2);
@@ -233,9 +352,11 @@
       '${Flags.readCodegen}=foo.code',
       'foo.dill',
       '${Flags.codegenShards}=3',
+      '${Flags.readClosedWorld}=foo.world',
       '-v'
     ],
         out: 'out.js',
+        readClosedWorld: 'foo.world',
         readData: 'foo.data',
         readCodegen: 'foo.code',
         codegenShards: 3);
diff --git a/pkg/compiler/test/end_to_end/feature_options_test.dart b/pkg/compiler/test/end_to_end/feature_options_test.dart
index d950d19..db2c87e 100644
--- a/pkg/compiler/test/end_to_end/feature_options_test.dart
+++ b/pkg/compiler/test/end_to_end/feature_options_test.dart
@@ -12,6 +12,8 @@
 import 'package:compiler/src/options.dart' show FeatureOptions, FeatureOption;
 
 class TestFeatureOptions extends FeatureOptions {
+  FeatureOption f1 = FeatureOption('f1');
+  FeatureOption noF2 = FeatureOption('f2', isNegativeFlag: true);
   FeatureOption sf1 = FeatureOption('sf1');
   FeatureOption sf2 = FeatureOption('sf2');
   FeatureOption noSf3 = FeatureOption('sf3', isNegativeFlag: true);
@@ -22,6 +24,9 @@
   FeatureOption noCf4 = FeatureOption('cf4', isNegativeFlag: true);
 
   @override
+  List<FeatureOption> shipped;
+
+  @override
   List<FeatureOption> shipping;
 
   @override
@@ -29,6 +34,7 @@
 
   // Initialize feature lists.
   TestFeatureOptions() {
+    shipped = [f1, noF2];
     shipping = [sf1, sf2, noSf3, noSf4];
     canary = [cf1, cf2, noCf3, noCf4];
   }
@@ -40,8 +46,14 @@
   return tfo;
 }
 
+void expectShipped(TestFeatureOptions tfo) {
+  Expect.isTrue(tfo.f1.isEnabled);
+  Expect.isTrue(tfo.noF2.isDisabled);
+}
+
 void testShipping() {
   var tfo = test([]);
+  expectShipped(tfo);
   Expect.isTrue(tfo.sf1.isEnabled);
   Expect.isTrue(tfo.sf2.isEnabled);
   Expect.isTrue(tfo.noSf3.isDisabled);
@@ -54,6 +66,7 @@
 
 void testNoShipping() {
   var tfo = test([Flags.noShipping]);
+  expectShipped(tfo);
   Expect.isTrue(tfo.sf1.isDisabled);
   Expect.isTrue(tfo.sf2.isDisabled);
   Expect.isTrue(tfo.noSf3.isEnabled);
@@ -66,6 +79,7 @@
 
 void testCanary() {
   var tfo = test([Flags.canary]);
+  expectShipped(tfo);
   Expect.isTrue(tfo.sf1.isEnabled);
   Expect.isTrue(tfo.sf2.isEnabled);
   Expect.isTrue(tfo.noSf3.isDisabled);
@@ -78,6 +92,7 @@
 
 void testShippingDisabled() {
   var tfo = test(['--no-sf2', '--sf3']);
+  expectShipped(tfo);
   Expect.isTrue(tfo.sf1.isEnabled);
   Expect.isTrue(tfo.sf2.isDisabled);
   Expect.isTrue(tfo.noSf3.isEnabled);
@@ -90,6 +105,7 @@
 
 void testCanaryDisabled() {
   var tfo = test([Flags.canary, '--no-sf2', '--sf3', '--no-cf1', '--cf3']);
+  expectShipped(tfo);
   Expect.isTrue(tfo.sf1.isEnabled);
   Expect.isTrue(tfo.sf2.isDisabled);
   Expect.isTrue(tfo.noSf3.isEnabled);
@@ -102,6 +118,7 @@
 
 void testNoShippingEnabled() {
   var tfo = test([Flags.noShipping, '--sf1', '--no-sf3', '--cf2', '--no-cf3']);
+  expectShipped(tfo);
   Expect.isTrue(tfo.sf1.isEnabled);
   Expect.isTrue(tfo.sf2.isDisabled);
   Expect.isTrue(tfo.noSf3.isDisabled);
@@ -114,6 +131,7 @@
 
 void testNoCanaryEnabled() {
   var tfo = test(['--cf1', '--no-cf3']);
+  expectShipped(tfo);
   Expect.isTrue(tfo.sf1.isEnabled);
   Expect.isTrue(tfo.sf2.isEnabled);
   Expect.isTrue(tfo.noSf3.isDisabled);
@@ -128,6 +146,11 @@
   Expect.throwsArgumentError(() => test(['--cf1', '--no-cf1']));
 }
 
+void testNoShippedDisable() {
+  Expect.throwsArgumentError(() => test(['--no-f1']));
+  Expect.throwsArgumentError(() => test(['--f2']));
+}
+
 void flavorStringTest(List<String> options, String expectedFlavorString) {
   var tfo = test(options);
   Expect.equals(expectedFlavorString, tfo.flavorString());
@@ -159,6 +182,7 @@
   testNoCanaryEnabled();
   testNoShippingEnabled();
   testFlagCollision();
+  testNoShippedDisable();
 
   // Supplemental tests.
   flavorStringTests();
diff --git a/pkg/compiler/test/model/cfe_annotations_test.dart b/pkg/compiler/test/model/cfe_annotations_test.dart
index c9bd48e..9cb3b6e 100644
--- a/pkg/compiler/test/model/cfe_annotations_test.dart
+++ b/pkg/compiler/test/model/cfe_annotations_test.dart
@@ -14,6 +14,7 @@
 import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/kernel/element_map_impl.dart';
 import 'package:expect/expect.dart';
+import 'package:front_end/src/api_prototype/lowering_predicates.dart';
 import 'package:kernel/ast.dart' as ir;
 
 import '../helpers/args_helper.dart';
@@ -434,6 +435,7 @@
                     implicitJsInteropMember:
                         nativeData.isJsInteropClass(classEntity),
                     implicitNativeMember: member is! ir.Constructor &&
+                        !isTearOffLowering(member) &&
                         nativeData.isNativeClass(classEntity) &&
                         !nativeData.isJsInteropClass(classEntity));
               }
diff --git a/pkg/compiler/tool/modular_test_suite.dart b/pkg/compiler/tool/modular_test_suite.dart
index 6195548..7a20a67 100644
--- a/pkg/compiler/tool/modular_test_suite.dart
+++ b/pkg/compiler/tool/modular_test_suite.dart
@@ -5,39 +5,23 @@
 /// Test the modular compilation pipeline of dart2js.
 ///
 /// This is a shell that runs multiple tests, one per folder under `data/`.
-import 'dart:io';
 import 'dart:async';
 
-import 'package:compiler/src/commandline_options.dart';
-import 'package:front_end/src/compute_platform_binaries_location.dart'
-    show computePlatformBinariesLocation;
 import 'package:modular_test/src/io_pipeline.dart';
-import 'package:modular_test/src/pipeline.dart';
-import 'package:modular_test/src/suite.dart';
 import 'package:modular_test/src/runner.dart';
-import 'package:package_config/package_config.dart';
+import 'modular_test_suite_helper.dart';
 
-String packageConfigJsonPath = ".dart_tool/package_config.json";
-Uri sdkRoot = Platform.script.resolve("../../../");
-Uri packageConfigUri = sdkRoot.resolve(packageConfigJsonPath);
-Options _options;
-String _dart2jsScript;
-String _kernelWorkerScript;
-
-// TODO(joshualitt): Figure out a way to support package configs in
-// tests/modular.
-PackageConfig _packageConfig;
 main(List<String> args) async {
-  _options = Options.parse(args);
-  _packageConfig = await loadPackageConfigUri(packageConfigUri);
-  await _resolveScripts();
+  var options = Options.parse(args);
+  await resolveScripts(options);
   await Future.wait([
     runSuite(
         sdkRoot.resolve('tests/modular/'),
         'tests/modular',
-        _options,
+        options,
         IOPipeline([
-          SourceToDillStep(),
+          OutlineDillCompilationStep(),
+          FullDillCompilationStep(),
           ModularAnalysisStep(),
           ComputeClosedWorldStep(useModularAnalysis: true),
           GlobalAnalysisStep(),
@@ -46,740 +30,5 @@
           Dart2jsEmissionStep(),
           RunD8(),
         ], cacheSharedModules: true)),
-    runSuite(
-        sdkRoot.resolve('tests/modular/'),
-        'tests/modular',
-        _options,
-        IOPipeline([
-          SourceToDillStep(),
-          ComputeClosedWorldStep(useModularAnalysis: false),
-          LegacyGlobalAnalysisStep(),
-          LegacyDart2jsCodegenStep(codeId0),
-          LegacyDart2jsCodegenStep(codeId1),
-          LegacyDart2jsEmissionStep(),
-          RunD8(),
-        ], cacheSharedModules: true))
   ]);
 }
-
-const dillId = DataId("dill");
-const modularUpdatedDillId = DataId("mdill");
-const modularDataId = DataId("mdata");
-const closedWorldId = DataId("world");
-const globalUpdatedDillId = DataId("gdill");
-const globalDataId = DataId("gdata");
-const codeId = ShardsDataId("code", 2);
-const codeId0 = ShardDataId(codeId, 0);
-const codeId1 = ShardDataId(codeId, 1);
-const jsId = DataId("js");
-const txtId = DataId("txt");
-const fakeRoot = 'dev-dart-app:/';
-
-String _packageConfigEntry(String name, Uri root,
-    {Uri packageRoot, LanguageVersion version}) {
-  var fields = [
-    '"name": "${name}"',
-    '"rootUri": "$root"',
-    if (packageRoot != null) '"packageUri": "$packageRoot"',
-    if (version != null) '"languageVersion": "$version"'
-  ];
-  return '{${fields.join(',')}}';
-}
-
-// Step that compiles sources in a module to a .dill file.
-class SourceToDillStep implements IOModularStep {
-  @override
-  List<DataId> get resultData => const [dillId];
-
-  @override
-  bool get needsSources => true;
-
-  @override
-  List<DataId> get dependencyDataNeeded => const [dillId];
-
-  @override
-  List<DataId> get moduleDataNeeded => const [];
-
-  @override
-  bool get onlyOnMain => false;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose) print("\nstep: source-to-dill on $module");
-
-    // We use non file-URI schemes for representeing source locations in a
-    // root-agnostic way. This allows us to refer to file across modules and
-    // across steps without exposing the underlying temporary folders that are
-    // created by the framework. In build systems like bazel this is especially
-    // important because each step may be run on a different machine.
-    //
-    // Files in packages are defined in terms of `package:` URIs, while
-    // non-package URIs are defined using the `dart-dev-app` scheme.
-    String rootScheme = module.isSdk ? 'dart-dev-sdk' : 'dev-dart-app';
-    String sourceToImportUri(Uri relativeUri) {
-      if (module.isPackage) {
-        var basePath = module.packageBase.path;
-        var packageRelativePath = basePath == "./"
-            ? relativeUri.path
-            : relativeUri.path.substring(basePath.length);
-        return 'package:${module.name}/$packageRelativePath';
-      } else {
-        return '$rootScheme:/$relativeUri';
-      }
-    }
-
-    // We create both a .packages and package_config.json file which defines
-    // the location of this module if it is a package.  The CFE requires that
-    // if a `package:` URI of a dependency is used in an import, then we need
-    // that package entry in the associated file. However, after it checks that
-    // the definition exists, the CFE will not actually use the resolved URI if
-    // a library for the import URI is already found in one of the provide
-    // .dill files of the dependencies. For that reason, and to ensure that
-    // a step only has access to the files provided in a module, we generate a
-    // config file with invalid folders for other packages.
-    // TODO(sigmund): follow up with the CFE to see if we can remove the need
-    // for these dummy entries..
-    // TODO(joshualitt): Generate just the json file.
-    var packagesJson = [];
-    var packagesContents = StringBuffer();
-    if (module.isPackage) {
-      packagesContents.write('${module.name}:${module.packageBase}\n');
-      packagesJson.add(_packageConfigEntry(
-          module.name, Uri.parse('../${module.packageBase}')));
-    }
-
-    Set<Module> transitiveDependencies = computeTransitiveDependencies(module);
-    int unusedNum = 0;
-    for (Module dependency in transitiveDependencies) {
-      if (dependency.isPackage) {
-        // rootUri should be ignored for dependent modules, so we pass in a
-        // bogus value.
-        var rootUri = Uri.parse('unused$unusedNum');
-        unusedNum++;
-
-        var dependentPackage = _packageConfig[dependency.name];
-        var packageJson = dependentPackage == null
-            ? _packageConfigEntry(dependency.name, rootUri)
-            : _packageConfigEntry(dependentPackage.name, rootUri,
-                version: dependentPackage.languageVersion);
-        packagesJson.add(packageJson);
-        packagesContents.write('${dependency.name}:$rootUri\n');
-      }
-    }
-
-    if (module.isPackage) {
-      await File.fromUri(root.resolve(packageConfigJsonPath))
-          .create(recursive: true);
-      await File.fromUri(root.resolve(packageConfigJsonPath)).writeAsString('{'
-          '  "configVersion": ${_packageConfig.version},'
-          '  "packages": [ ${packagesJson.join(',')} ]'
-          '}');
-    }
-
-    await File.fromUri(root.resolve('.packages'))
-        .writeAsString('$packagesContents');
-
-    List<String> sources;
-    List<String> extraArgs;
-    if (module.isSdk) {
-      // When no flags are passed, we can skip compilation and reuse the
-      // platform.dill created by build.py.
-      if (flags.isEmpty) {
-        var platform = computePlatformBinariesLocation()
-            .resolve("dart2js_platform_unsound.dill");
-        var destination = root.resolveUri(toUri(module, dillId));
-        if (_options.verbose) {
-          print('command:\ncp $platform $destination');
-        }
-        await File.fromUri(platform).copy(destination.toFilePath());
-        return;
-      }
-      sources = ['dart:core'];
-      extraArgs = ['--libraries-file', '$rootScheme:///sdk/lib/libraries.json'];
-      assert(transitiveDependencies.isEmpty);
-    } else {
-      sources = module.sources.map(sourceToImportUri).toList();
-      extraArgs = ['--packages-file', '$rootScheme:/.packages'];
-    }
-
-    // TODO(joshualitt): Ensure the kernel worker has some way to specify
-    // --no-sound-null-safety
-    List<String> args = [
-      _kernelWorkerScript,
-      '--no-summary-only',
-      '--target',
-      'dart2js',
-      '--multi-root',
-      '$root',
-      '--multi-root-scheme',
-      rootScheme,
-      ...extraArgs,
-      '--output',
-      '${toUri(module, dillId)}',
-      ...(transitiveDependencies
-          .expand((m) => ['--input-linked', '${toUri(m, dillId)}'])),
-      ...(sources.expand((String uri) => ['--source', uri])),
-      ...(flags.expand((String flag) => ['--enable-experiment', flag])),
-    ];
-
-    var result =
-        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
-    _checkExitCode(result, this, module);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose) print("\ncached step: source-to-dill on $module");
-  }
-}
-
-class ModularAnalysisStep implements IOModularStep {
-  @override
-  List<DataId> get resultData => const [modularDataId, modularUpdatedDillId];
-
-  @override
-  bool get needsSources => false;
-
-  @override
-  List<DataId> get dependencyDataNeeded => const [dillId];
-
-  @override
-  List<DataId> get moduleDataNeeded => const [dillId];
-
-  @override
-  bool get onlyOnMain => false;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose) print("\nstep: modular analysis on $module");
-    Set<Module> transitiveDependencies = computeTransitiveDependencies(module);
-    Iterable<String> dillDependencies =
-        transitiveDependencies.map((m) => '${toUri(m, dillId)}');
-    List<String> args = [
-      '--packages=${sdkRoot.toFilePath()}/.packages',
-      _dart2jsScript,
-      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${Flags.inputDill}=${toUri(module, dillId)}',
-      if (dillDependencies.isNotEmpty)
-        '--dill-dependencies=${dillDependencies.join(',')}',
-      '--out=${toUri(module, modularUpdatedDillId)}',
-      '${Flags.writeModularAnalysis}=${toUri(module, modularDataId)}',
-      for (String flag in flags) '--enable-experiment=$flag',
-    ];
-    var result =
-        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
-
-    _checkExitCode(result, this, module);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose) {
-      print("cached step: dart2js modular analysis on $module");
-    }
-  }
-}
-
-DataId idForDill({bool useModularAnalysis}) =>
-    useModularAnalysis ? modularUpdatedDillId : dillId;
-
-List<DataId> inputFromAnalysis({bool useModularAnalysis = false}) => [
-      idForDill(useModularAnalysis: useModularAnalysis),
-      if (useModularAnalysis) modularDataId,
-    ];
-
-// Step that invokes the dart2js closed world computation.
-class ComputeClosedWorldStep implements IOModularStep {
-  final bool useModularAnalysis;
-
-  ComputeClosedWorldStep({this.useModularAnalysis});
-
-  @override
-  List<DataId> get resultData => const [closedWorldId, globalUpdatedDillId];
-
-  @override
-  bool get needsSources => false;
-
-  @override
-  List<DataId> get dependencyDataNeeded =>
-      inputFromAnalysis(useModularAnalysis: useModularAnalysis);
-
-  @override
-  List<DataId> get moduleDataNeeded =>
-      inputFromAnalysis(useModularAnalysis: useModularAnalysis);
-
-  @override
-  bool get onlyOnMain => true;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose)
-      print("\nstep: dart2js compute closed world on $module");
-    Set<Module> transitiveDependencies = computeTransitiveDependencies(module);
-    DataId dillId = idForDill(useModularAnalysis: useModularAnalysis);
-    Iterable<String> dillDependencies =
-        transitiveDependencies.map((m) => '${toUri(m, dillId)}');
-    List<String> dataDependencies = transitiveDependencies
-        .map((m) => '${toUri(m, modularDataId)}')
-        .toList();
-    dataDependencies.add('${toUri(module, modularDataId)}');
-    List<String> args = [
-      '--packages=${sdkRoot.toFilePath()}/.packages',
-      _dart2jsScript,
-      // TODO(sigmund): remove this dependency on libraries.json
-      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
-      '${Flags.inputDill}=${toUri(module, dillId)}',
-      for (String flag in flags) '--enable-experiment=$flag',
-      '${Flags.dillDependencies}=${dillDependencies.join(',')}',
-      if (useModularAnalysis)
-        '${Flags.readModularAnalysis}=${dataDependencies.join(',')}',
-      '${Flags.writeClosedWorld}=${toUri(module, closedWorldId)}',
-      Flags.noClosedWorldInData,
-      '--out=${toUri(module, globalUpdatedDillId)}',
-    ];
-    var result =
-        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
-
-    _checkExitCode(result, this, module);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose)
-      print("\ncached step: dart2js compute closed world on $module");
-  }
-}
-
-// Step that runs the dart2js modular analysis.
-class GlobalAnalysisStep implements IOModularStep {
-  @override
-  List<DataId> get resultData => const [globalDataId];
-
-  @override
-  bool get needsSources => false;
-
-  @override
-  List<DataId> get dependencyDataNeeded => const [globalUpdatedDillId];
-
-  @override
-  List<DataId> get moduleDataNeeded =>
-      const [closedWorldId, globalUpdatedDillId];
-
-  @override
-  bool get onlyOnMain => true;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose) print("\nstep: dart2js global analysis on $module");
-    List<String> args = [
-      '--packages=${sdkRoot.toFilePath()}/.packages',
-      _dart2jsScript,
-      // TODO(sigmund): remove this dependency on libraries.json
-      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
-      '${Flags.inputDill}=${toUri(module, globalUpdatedDillId)}',
-      for (String flag in flags) '--enable-experiment=$flag',
-      '${Flags.readClosedWorld}=${toUri(module, closedWorldId)}',
-      '${Flags.writeData}=${toUri(module, globalDataId)}',
-      // TODO(joshualitt): delete this flag after google3 roll
-      '${Flags.noClosedWorldInData}',
-    ];
-    var result =
-        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
-
-    _checkExitCode(result, this, module);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose)
-      print("\ncached step: dart2js global analysis on $module");
-  }
-}
-
-// Step that invokes the dart2js code generation on the main module given the
-// results of the global analysis step and produces one shard of the codegen
-// output.
-class Dart2jsCodegenStep implements IOModularStep {
-  final ShardDataId codeId;
-
-  Dart2jsCodegenStep(this.codeId);
-
-  @override
-  List<DataId> get resultData => [codeId];
-
-  @override
-  bool get needsSources => false;
-
-  @override
-  List<DataId> get dependencyDataNeeded => const [];
-
-  @override
-  List<DataId> get moduleDataNeeded =>
-      const [globalUpdatedDillId, closedWorldId, globalDataId];
-
-  @override
-  bool get onlyOnMain => true;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose) print("\nstep: dart2js backend on $module");
-    List<String> args = [
-      '--packages=${sdkRoot.toFilePath()}/.packages',
-      _dart2jsScript,
-      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
-      '${Flags.inputDill}=${toUri(module, globalUpdatedDillId)}',
-      for (String flag in flags) '--enable-experiment=$flag',
-      '${Flags.readClosedWorld}=${toUri(module, closedWorldId)}',
-      '${Flags.readData}=${toUri(module, globalDataId)}',
-      '${Flags.writeCodegen}=${toUri(module, codeId.dataId)}',
-      '${Flags.codegenShard}=${codeId.shard}',
-      '${Flags.codegenShards}=${codeId.dataId.shards}',
-    ];
-    var result =
-        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
-
-    _checkExitCode(result, this, module);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose) print("cached step: dart2js backend on $module");
-  }
-}
-
-// Step that invokes the dart2js codegen enqueuer and emitter on the main module
-// given the results of the global analysis step and codegen shards.
-class Dart2jsEmissionStep implements IOModularStep {
-  @override
-  List<DataId> get resultData => const [jsId];
-
-  @override
-  bool get needsSources => false;
-
-  @override
-  List<DataId> get dependencyDataNeeded => const [];
-
-  @override
-  List<DataId> get moduleDataNeeded => const [
-        globalUpdatedDillId,
-        closedWorldId,
-        globalDataId,
-        codeId0,
-        codeId1
-      ];
-
-  @override
-  bool get onlyOnMain => true;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose) print("step: dart2js backend on $module");
-    List<String> args = [
-      '--packages=${sdkRoot.toFilePath()}/.packages',
-      _dart2jsScript,
-      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
-      '${Flags.inputDill}=${toUri(module, globalUpdatedDillId)}',
-      for (String flag in flags) '${Flags.enableLanguageExperiments}=$flag',
-      '${Flags.readClosedWorld}=${toUri(module, closedWorldId)}',
-      '${Flags.readData}=${toUri(module, globalDataId)}',
-      '${Flags.readCodegen}=${toUri(module, codeId)}',
-      '${Flags.codegenShards}=${codeId.shards}',
-      '--out=${toUri(module, jsId)}',
-    ];
-    var result =
-        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
-
-    _checkExitCode(result, this, module);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose) print("\ncached step: dart2js backend on $module");
-  }
-}
-
-// TODO(joshualitt): delete after google3 roll.
-class LegacyGlobalAnalysisStep implements IOModularStep {
-  @override
-  List<DataId> get resultData => const [globalDataId];
-
-  @override
-  bool get needsSources => false;
-
-  @override
-  List<DataId> get dependencyDataNeeded => const [globalUpdatedDillId];
-
-  @override
-  List<DataId> get moduleDataNeeded =>
-      const [closedWorldId, globalUpdatedDillId];
-
-  @override
-  bool get onlyOnMain => true;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose) print("\nstep: dart2js global analysis on $module");
-    List<String> args = [
-      '--packages=${sdkRoot.toFilePath()}/.packages',
-      _dart2jsScript,
-      // TODO(sigmund): remove this dependency on libraries.json
-      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
-      '${toUri(module, globalUpdatedDillId)}',
-      for (String flag in flags) '--enable-experiment=$flag',
-      '${Flags.readClosedWorld}=${toUri(module, closedWorldId)}',
-      '${Flags.writeData}=${toUri(module, globalDataId)}',
-    ];
-    var result =
-        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
-
-    _checkExitCode(result, this, module);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose)
-      print("\ncached step: dart2js global analysis on $module");
-  }
-}
-
-// Step that invokes the dart2js code generation on the main module given the
-// results of the global analysis step and produces one shard of the codegen
-// output.
-// Note: Legacy.
-class LegacyDart2jsCodegenStep implements IOModularStep {
-  final ShardDataId codeId;
-
-  LegacyDart2jsCodegenStep(this.codeId);
-
-  @override
-  List<DataId> get resultData => [codeId];
-
-  @override
-  bool get needsSources => false;
-
-  @override
-  List<DataId> get dependencyDataNeeded => const [];
-
-  @override
-  List<DataId> get moduleDataNeeded =>
-      const [globalUpdatedDillId, globalDataId];
-
-  @override
-  bool get onlyOnMain => true;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose) print("\nstep: dart2js backend on $module");
-    List<String> args = [
-      '--packages=${sdkRoot.toFilePath()}/.packages',
-      _dart2jsScript,
-      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
-      '${toUri(module, globalUpdatedDillId)}',
-      for (String flag in flags) '--enable-experiment=$flag',
-      '${Flags.readData}=${toUri(module, globalDataId)}',
-      '${Flags.writeCodegen}=${toUri(module, codeId.dataId)}',
-      '${Flags.codegenShard}=${codeId.shard}',
-      '${Flags.codegenShards}=${codeId.dataId.shards}',
-    ];
-    var result =
-        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
-
-    _checkExitCode(result, this, module);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose) print("cached step: dart2js backend on $module");
-  }
-}
-
-// Step that invokes the dart2js codegen enqueuer and emitter on the main module
-// given the results of the global analysis step and codegen shards.
-// Note: Legacy.
-class LegacyDart2jsEmissionStep implements IOModularStep {
-  @override
-  List<DataId> get resultData => const [jsId];
-
-  @override
-  bool get needsSources => false;
-
-  @override
-  List<DataId> get dependencyDataNeeded => const [];
-
-  @override
-  List<DataId> get moduleDataNeeded =>
-      const [globalUpdatedDillId, globalDataId, codeId0, codeId1];
-
-  @override
-  bool get onlyOnMain => true;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose) print("step: dart2js backend on $module");
-    List<String> args = [
-      '--packages=${sdkRoot.toFilePath()}/.packages',
-      _dart2jsScript,
-      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
-      '${toUri(module, globalUpdatedDillId)}',
-      for (String flag in flags) '${Flags.enableLanguageExperiments}=$flag',
-      '${Flags.readData}=${toUri(module, globalDataId)}',
-      '${Flags.readCodegen}=${toUri(module, codeId)}',
-      '${Flags.codegenShards}=${codeId.shards}',
-      '--out=${toUri(module, jsId)}',
-    ];
-    var result =
-        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
-
-    _checkExitCode(result, this, module);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose) print("\ncached step: dart2js backend on $module");
-  }
-}
-
-/// Step that runs the output of dart2js in d8 and saves the output.
-class RunD8 implements IOModularStep {
-  @override
-  List<DataId> get resultData => const [txtId];
-
-  @override
-  bool get needsSources => false;
-
-  @override
-  List<DataId> get dependencyDataNeeded => const [];
-
-  @override
-  List<DataId> get moduleDataNeeded => const [jsId];
-
-  @override
-  bool get onlyOnMain => true;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose) print("\nstep: d8 on $module");
-    List<String> d8Args = [
-      sdkRoot
-          .resolve('sdk/lib/_internal/js_runtime/lib/preambles/d8.js')
-          .toFilePath(),
-      root.resolveUri(toUri(module, jsId)).toFilePath(),
-    ];
-    var result = await _runProcess(
-        sdkRoot.resolve(_d8executable).toFilePath(), d8Args, root.toFilePath());
-
-    _checkExitCode(result, this, module);
-
-    await File.fromUri(root.resolveUri(toUri(module, txtId)))
-        .writeAsString(result.stdout);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose) print("\ncached step: d8 on $module");
-  }
-}
-
-void _checkExitCode(ProcessResult result, IOModularStep step, Module module) {
-  if (result.exitCode != 0 || _options.verbose) {
-    stdout.write(result.stdout);
-    stderr.write(result.stderr);
-  }
-  if (result.exitCode != 0) {
-    throw "${step.runtimeType} failed on $module:\n\n"
-        "stdout:\n${result.stdout}\n\n"
-        "stderr:\n${result.stderr}";
-  }
-}
-
-Future<ProcessResult> _runProcess(
-    String command, List<String> arguments, String workingDirectory) {
-  if (_options.verbose) {
-    print('command:\n$command ${arguments.join(' ')} from $workingDirectory');
-  }
-  return Process.run(command, arguments, workingDirectory: workingDirectory);
-}
-
-String get _d8executable {
-  if (Platform.isWindows) {
-    return 'third_party/d8/windows/d8.exe';
-  } else if (Platform.isLinux) {
-    return 'third_party/d8/linux/d8';
-  } else if (Platform.isMacOS) {
-    return 'third_party/d8/macos/d8';
-  }
-  throw UnsupportedError('Unsupported platform.');
-}
-
-class ShardsDataId implements DataId {
-  @override
-  final String name;
-  final int shards;
-
-  const ShardsDataId(this.name, this.shards);
-
-  @override
-  String toString() => name;
-}
-
-class ShardDataId implements DataId {
-  final ShardsDataId dataId;
-  final int _shard;
-
-  const ShardDataId(this.dataId, this._shard);
-
-  int get shard {
-    assert(0 <= _shard && _shard < dataId.shards);
-    return _shard;
-  }
-
-  @override
-  String get name => '${dataId.name}${shard}';
-
-  @override
-  String toString() => name;
-}
-
-Future<void> _resolveScripts() async {
-  Future<String> resolve(
-      String sourceUriOrPath, String relativeSnapshotPath) async {
-    Uri sourceUri = sdkRoot.resolve(sourceUriOrPath);
-    String result =
-        sourceUri.scheme == 'file' ? sourceUri.toFilePath() : sourceUriOrPath;
-    if (_options.useSdk) {
-      String snapshot = Uri.file(Platform.resolvedExecutable)
-          .resolve(relativeSnapshotPath)
-          .toFilePath();
-      if (await File(snapshot).exists()) {
-        return snapshot;
-      }
-    }
-    return result;
-  }
-
-  _dart2jsScript = await resolve(
-      'package:compiler/src/dart2js.dart', 'snapshots/dart2js.dart.snapshot');
-  _kernelWorkerScript = await resolve('utils/bazel/kernel_worker.dart',
-      'snapshots/kernel_worker.dart.snapshot');
-}
-
-String _librarySpecForSnapshot = Uri.file(Platform.resolvedExecutable)
-    .resolve('../lib/libraries.json')
-    .toFilePath();
diff --git a/pkg/compiler/tool/modular_test_suite_helper.dart b/pkg/compiler/tool/modular_test_suite_helper.dart
new file mode 100644
index 0000000..cd583ad
--- /dev/null
+++ b/pkg/compiler/tool/modular_test_suite_helper.dart
@@ -0,0 +1,662 @@
+// 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.
+
+/// Test the modular compilation pipeline of dart2js.
+///
+/// This is a shell that runs multiple tests, one per folder under `data/`.
+import 'dart:io';
+import 'dart:async';
+
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/kernel/dart2js_target.dart';
+import 'package:front_end/src/compute_platform_binaries_location.dart'
+    show computePlatformBinariesLocation;
+import 'package:modular_test/src/io_pipeline.dart';
+import 'package:modular_test/src/pipeline.dart';
+import 'package:modular_test/src/suite.dart';
+import 'package:modular_test/src/runner.dart';
+import 'package:package_config/package_config.dart';
+
+String packageConfigJsonPath = ".dart_tool/package_config.json";
+Uri sdkRoot = Platform.script.resolve("../../../");
+Uri packageConfigUri = sdkRoot.resolve(packageConfigJsonPath);
+Options _options;
+String _dart2jsScript;
+String _kernelWorkerScript;
+
+const dillSummaryId = DataId("sdill");
+const dillId = DataId("dill");
+const modularUpdatedDillId = DataId("mdill");
+const modularDataId = DataId("mdata");
+const closedWorldId = DataId("world");
+const globalUpdatedDillId = DataId("gdill");
+const globalDataId = DataId("gdata");
+const codeId = ShardsDataId("code", 2);
+const codeId0 = ShardDataId(codeId, 0);
+const codeId1 = ShardDataId(codeId, 1);
+const jsId = DataId("js");
+const txtId = DataId("txt");
+const fakeRoot = 'dev-dart-app:/';
+
+String _packageConfigEntry(String name, Uri root,
+    {Uri packageRoot, LanguageVersion version}) {
+  var fields = [
+    '"name": "${name}"',
+    '"rootUri": "$root"',
+    if (packageRoot != null) '"packageUri": "$packageRoot"',
+    if (version != null) '"languageVersion": "$version"'
+  ];
+  return '{${fields.join(',')}}';
+}
+
+abstract class CFEStep implements IOModularStep {
+  final String stepName;
+
+  CFEStep(this.stepName);
+
+  @override
+  bool get needsSources => true;
+
+  @override
+  bool get onlyOnMain => false;
+
+  @override
+  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
+      List<String> flags) async {
+    if (_options.verbose) print("\nstep: $stepName on $module");
+
+    // TODO(joshualitt): Figure out a way to support package configs in
+    // tests/modular.
+    var packageConfig = await loadPackageConfigUri(packageConfigUri);
+
+    // We use non file-URI schemes for representeing source locations in a
+    // root-agnostic way. This allows us to refer to file across modules and
+    // across steps without exposing the underlying temporary folders that are
+    // created by the framework. In build systems like bazel this is especially
+    // important because each step may be run on a different machine.
+    //
+    // Files in packages are defined in terms of `package:` URIs, while
+    // non-package URIs are defined using the `dart-dev-app` scheme.
+    String rootScheme = module.isSdk ? 'dart-dev-sdk' : 'dev-dart-app';
+    String sourceToImportUri(Uri relativeUri) {
+      if (module.isPackage) {
+        var basePath = module.packageBase.path;
+        var packageRelativePath = basePath == "./"
+            ? relativeUri.path
+            : relativeUri.path.substring(basePath.length);
+        return 'package:${module.name}/$packageRelativePath';
+      } else {
+        return '$rootScheme:/$relativeUri';
+      }
+    }
+
+    // We create both a .packages and package_config.json file which defines
+    // the location of this module if it is a package.  The CFE requires that
+    // if a `package:` URI of a dependency is used in an import, then we need
+    // that package entry in the associated file. However, after it checks that
+    // the definition exists, the CFE will not actually use the resolved URI if
+    // a library for the import URI is already found in one of the provide
+    // .dill files of the dependencies. For that reason, and to ensure that
+    // a step only has access to the files provided in a module, we generate a
+    // config file with invalid folders for other packages.
+    // TODO(sigmund): follow up with the CFE to see if we can remove the need
+    // for these dummy entries..
+    // TODO(joshualitt): Generate just the json file.
+    var packagesJson = [];
+    var packagesContents = StringBuffer();
+    if (module.isPackage) {
+      packagesContents.write('${module.name}:${module.packageBase}\n');
+      packagesJson.add(_packageConfigEntry(
+          module.name, Uri.parse('../${module.packageBase}')));
+    }
+
+    Set<Module> transitiveDependencies = computeTransitiveDependencies(module);
+    int unusedNum = 0;
+    for (Module dependency in transitiveDependencies) {
+      if (dependency.isPackage) {
+        // rootUri should be ignored for dependent modules, so we pass in a
+        // bogus value.
+        var rootUri = Uri.parse('unused$unusedNum');
+        unusedNum++;
+
+        var dependentPackage = packageConfig[dependency.name];
+        var packageJson = dependentPackage == null
+            ? _packageConfigEntry(dependency.name, rootUri)
+            : _packageConfigEntry(dependentPackage.name, rootUri,
+                version: dependentPackage.languageVersion);
+        packagesJson.add(packageJson);
+        packagesContents.write('${dependency.name}:$rootUri\n');
+      }
+    }
+
+    if (module.isPackage) {
+      await File.fromUri(root.resolve(packageConfigJsonPath))
+          .create(recursive: true);
+      await File.fromUri(root.resolve(packageConfigJsonPath)).writeAsString('{'
+          '  "configVersion": ${packageConfig.version},'
+          '  "packages": [ ${packagesJson.join(',')} ]'
+          '}');
+    }
+
+    await File.fromUri(root.resolve('.packages'))
+        .writeAsString('$packagesContents');
+
+    List<String> sources;
+    List<String> extraArgs = ['--packages-file', '$rootScheme:/.packages'];
+    if (module.isSdk) {
+      // When no flags are passed, we can skip compilation and reuse the
+      // platform.dill created by build.py.
+      if (flags.isEmpty) {
+        var platform = computePlatformBinariesLocation()
+            .resolve("dart2js_platform_unsound.dill");
+        var destination = root.resolveUri(toUri(module, outputData));
+        if (_options.verbose) {
+          print('command:\ncp $platform $destination');
+        }
+        await File.fromUri(platform).copy(destination.toFilePath());
+        return;
+      }
+      sources = requiredLibraries['dart2js'] + ['dart:core'];
+      extraArgs += [
+        '--libraries-file',
+        '$rootScheme:///sdk/lib/libraries.json'
+      ];
+      assert(transitiveDependencies.isEmpty);
+    } else {
+      sources = module.sources.map(sourceToImportUri).toList();
+    }
+
+    // TODO(joshualitt): Ensure the kernel worker has some way to specify
+    // --no-sound-null-safety
+    List<String> args = [
+      _kernelWorkerScript,
+      ...stepArguments,
+      '--exclude-non-sources',
+      '--multi-root',
+      '$root',
+      '--multi-root-scheme',
+      rootScheme,
+      ...extraArgs,
+      '--output',
+      '${toUri(module, outputData)}',
+      ...(transitiveDependencies
+          .expand((m) => ['--input-summary', '${toUri(m, inputData)}'])),
+      ...(sources.expand((String uri) => ['--source', uri])),
+      ...(flags.expand((String flag) => ['--enable-experiment', flag])),
+    ];
+
+    var result =
+        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
+    _checkExitCode(result, this, module);
+  }
+
+  List<String> get stepArguments;
+
+  DataId get inputData;
+
+  DataId get outputData;
+
+  @override
+  void notifyCached(Module module) {
+    if (_options.verbose) print("\ncached step: $stepName on $module");
+  }
+}
+
+// Step that compiles sources in a module to a summary .dill file.
+class OutlineDillCompilationStep extends CFEStep {
+  @override
+  List<DataId> get resultData => const [dillSummaryId];
+
+  @override
+  bool get needsSources => true;
+
+  @override
+  List<DataId> get dependencyDataNeeded => const [dillSummaryId];
+
+  @override
+  List<DataId> get moduleDataNeeded => const [];
+
+  @override
+  List<String> get stepArguments =>
+      ['--target', 'dart2js_summary', '--summary-only'];
+
+  @override
+  DataId get inputData => dillSummaryId;
+
+  @override
+  DataId get outputData => dillSummaryId;
+
+  OutlineDillCompilationStep() : super('outline-dill-compilation');
+}
+
+// Step that compiles sources in a module to a .dill file.
+class FullDillCompilationStep extends CFEStep {
+  @override
+  List<DataId> get resultData => const [dillId];
+
+  @override
+  bool get needsSources => true;
+
+  @override
+  List<DataId> get dependencyDataNeeded => const [dillSummaryId];
+
+  @override
+  List<DataId> get moduleDataNeeded => const [];
+
+  @override
+  List<String> get stepArguments =>
+      ['--target', 'dart2js', '--no-summary', '--no-summary-only'];
+
+  @override
+  DataId get inputData => dillSummaryId;
+
+  @override
+  DataId get outputData => dillId;
+
+  FullDillCompilationStep() : super('full-dill-compilation');
+}
+
+class ModularAnalysisStep implements IOModularStep {
+  @override
+  List<DataId> get resultData => const [modularDataId, modularUpdatedDillId];
+
+  @override
+  bool get needsSources => false;
+
+  @override
+  List<DataId> get dependencyDataNeeded => const [dillId];
+
+  @override
+  List<DataId> get moduleDataNeeded => const [dillId];
+
+  @override
+  bool get onlyOnMain => false;
+
+  @override
+  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
+      List<String> flags) async {
+    if (_options.verbose) print("\nstep: modular analysis on $module");
+    Set<Module> transitiveDependencies = computeTransitiveDependencies(module);
+    Iterable<String> dillDependencies =
+        transitiveDependencies.map((m) => '${toUri(m, dillId)}');
+    List<String> args = [
+      '--packages=${sdkRoot.toFilePath()}/.packages',
+      _dart2jsScript,
+      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
+      '${Flags.inputDill}=${toUri(module, dillId)}',
+      if (dillDependencies.isNotEmpty)
+        '--dill-dependencies=${dillDependencies.join(',')}',
+      '--out=${toUri(module, modularUpdatedDillId)}',
+      '${Flags.writeModularAnalysis}=${toUri(module, modularDataId)}',
+      for (String flag in flags) '--enable-experiment=$flag',
+    ];
+    var result =
+        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
+
+    _checkExitCode(result, this, module);
+  }
+
+  @override
+  void notifyCached(Module module) {
+    if (_options.verbose) {
+      print("cached step: dart2js modular analysis on $module");
+    }
+  }
+}
+
+DataId idForDill({bool useModularAnalysis}) =>
+    useModularAnalysis ? modularUpdatedDillId : dillId;
+
+List<DataId> inputFromAnalysis({bool useModularAnalysis = false}) => [
+      idForDill(useModularAnalysis: useModularAnalysis),
+      if (useModularAnalysis) modularDataId,
+    ];
+
+// Step that invokes the dart2js closed world computation.
+class ComputeClosedWorldStep implements IOModularStep {
+  final bool useModularAnalysis;
+
+  ComputeClosedWorldStep({this.useModularAnalysis});
+
+  @override
+  List<DataId> get resultData => const [closedWorldId, globalUpdatedDillId];
+
+  @override
+  bool get needsSources => false;
+
+  @override
+  List<DataId> get dependencyDataNeeded =>
+      inputFromAnalysis(useModularAnalysis: useModularAnalysis);
+
+  @override
+  List<DataId> get moduleDataNeeded =>
+      inputFromAnalysis(useModularAnalysis: useModularAnalysis);
+
+  @override
+  bool get onlyOnMain => true;
+
+  @override
+  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
+      List<String> flags) async {
+    if (_options.verbose)
+      print("\nstep: dart2js compute closed world on $module");
+    Set<Module> transitiveDependencies = computeTransitiveDependencies(module);
+    DataId dillId = idForDill(useModularAnalysis: useModularAnalysis);
+    Iterable<String> dillDependencies =
+        transitiveDependencies.map((m) => '${toUri(m, dillId)}');
+    List<String> dataDependencies = transitiveDependencies
+        .map((m) => '${toUri(m, modularDataId)}')
+        .toList();
+    dataDependencies.add('${toUri(module, modularDataId)}');
+    List<String> args = [
+      '--packages=${sdkRoot.toFilePath()}/.packages',
+      _dart2jsScript,
+      // TODO(sigmund): remove this dependency on libraries.json
+      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
+      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
+      '${Flags.inputDill}=${toUri(module, dillId)}',
+      for (String flag in flags) '--enable-experiment=$flag',
+      '${Flags.dillDependencies}=${dillDependencies.join(',')}',
+      if (useModularAnalysis)
+        '${Flags.readModularAnalysis}=${dataDependencies.join(',')}',
+      '${Flags.writeClosedWorld}=${toUri(module, closedWorldId)}',
+      Flags.noClosedWorldInData,
+      '--out=${toUri(module, globalUpdatedDillId)}',
+    ];
+    var result =
+        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
+
+    _checkExitCode(result, this, module);
+  }
+
+  @override
+  void notifyCached(Module module) {
+    if (_options.verbose)
+      print("\ncached step: dart2js compute closed world on $module");
+  }
+}
+
+// Step that runs the dart2js modular analysis.
+class GlobalAnalysisStep implements IOModularStep {
+  @override
+  List<DataId> get resultData => const [globalDataId];
+
+  @override
+  bool get needsSources => false;
+
+  @override
+  List<DataId> get dependencyDataNeeded => const [globalUpdatedDillId];
+
+  @override
+  List<DataId> get moduleDataNeeded =>
+      const [closedWorldId, globalUpdatedDillId];
+
+  @override
+  bool get onlyOnMain => true;
+
+  @override
+  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
+      List<String> flags) async {
+    if (_options.verbose) print("\nstep: dart2js global analysis on $module");
+    List<String> args = [
+      '--packages=${sdkRoot.toFilePath()}/.packages',
+      _dart2jsScript,
+      // TODO(sigmund): remove this dependency on libraries.json
+      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
+      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
+      '${Flags.inputDill}=${toUri(module, globalUpdatedDillId)}',
+      for (String flag in flags) '--enable-experiment=$flag',
+      '${Flags.readClosedWorld}=${toUri(module, closedWorldId)}',
+      '${Flags.writeData}=${toUri(module, globalDataId)}',
+      // TODO(joshualitt): delete this flag after google3 roll
+      '${Flags.noClosedWorldInData}',
+    ];
+    var result =
+        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
+
+    _checkExitCode(result, this, module);
+  }
+
+  @override
+  void notifyCached(Module module) {
+    if (_options.verbose)
+      print("\ncached step: dart2js global analysis on $module");
+  }
+}
+
+// Step that invokes the dart2js code generation on the main module given the
+// results of the global analysis step and produces one shard of the codegen
+// output.
+class Dart2jsCodegenStep implements IOModularStep {
+  final ShardDataId codeId;
+
+  Dart2jsCodegenStep(this.codeId);
+
+  @override
+  List<DataId> get resultData => [codeId];
+
+  @override
+  bool get needsSources => false;
+
+  @override
+  List<DataId> get dependencyDataNeeded => const [];
+
+  @override
+  List<DataId> get moduleDataNeeded =>
+      const [globalUpdatedDillId, closedWorldId, globalDataId];
+
+  @override
+  bool get onlyOnMain => true;
+
+  @override
+  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
+      List<String> flags) async {
+    if (_options.verbose) print("\nstep: dart2js backend on $module");
+    List<String> args = [
+      '--packages=${sdkRoot.toFilePath()}/.packages',
+      _dart2jsScript,
+      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
+      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
+      '${Flags.inputDill}=${toUri(module, globalUpdatedDillId)}',
+      for (String flag in flags) '--enable-experiment=$flag',
+      '${Flags.readClosedWorld}=${toUri(module, closedWorldId)}',
+      '${Flags.readData}=${toUri(module, globalDataId)}',
+      '${Flags.writeCodegen}=${toUri(module, codeId.dataId)}',
+      '${Flags.codegenShard}=${codeId.shard}',
+      '${Flags.codegenShards}=${codeId.dataId.shards}',
+    ];
+    var result =
+        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
+
+    _checkExitCode(result, this, module);
+  }
+
+  @override
+  void notifyCached(Module module) {
+    if (_options.verbose) print("cached step: dart2js backend on $module");
+  }
+}
+
+// Step that invokes the dart2js codegen enqueuer and emitter on the main module
+// given the results of the global analysis step and codegen shards.
+class Dart2jsEmissionStep implements IOModularStep {
+  @override
+  List<DataId> get resultData => const [jsId];
+
+  @override
+  bool get needsSources => false;
+
+  @override
+  List<DataId> get dependencyDataNeeded => const [];
+
+  @override
+  List<DataId> get moduleDataNeeded => const [
+        globalUpdatedDillId,
+        closedWorldId,
+        globalDataId,
+        codeId0,
+        codeId1
+      ];
+
+  @override
+  bool get onlyOnMain => true;
+
+  @override
+  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
+      List<String> flags) async {
+    if (_options.verbose) print("step: dart2js backend on $module");
+    List<String> args = [
+      '--packages=${sdkRoot.toFilePath()}/.packages',
+      _dart2jsScript,
+      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
+      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
+      '${Flags.inputDill}=${toUri(module, globalUpdatedDillId)}',
+      for (String flag in flags) '${Flags.enableLanguageExperiments}=$flag',
+      '${Flags.readClosedWorld}=${toUri(module, closedWorldId)}',
+      '${Flags.readData}=${toUri(module, globalDataId)}',
+      '${Flags.readCodegen}=${toUri(module, codeId)}',
+      '${Flags.codegenShards}=${codeId.shards}',
+      '--out=${toUri(module, jsId)}',
+    ];
+    var result =
+        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
+
+    _checkExitCode(result, this, module);
+  }
+
+  @override
+  void notifyCached(Module module) {
+    if (_options.verbose) print("\ncached step: dart2js backend on $module");
+  }
+}
+
+/// Step that runs the output of dart2js in d8 and saves the output.
+class RunD8 implements IOModularStep {
+  @override
+  List<DataId> get resultData => const [txtId];
+
+  @override
+  bool get needsSources => false;
+
+  @override
+  List<DataId> get dependencyDataNeeded => const [];
+
+  @override
+  List<DataId> get moduleDataNeeded => const [jsId];
+
+  @override
+  bool get onlyOnMain => true;
+
+  @override
+  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
+      List<String> flags) async {
+    if (_options.verbose) print("\nstep: d8 on $module");
+    List<String> d8Args = [
+      sdkRoot
+          .resolve('sdk/lib/_internal/js_runtime/lib/preambles/d8.js')
+          .toFilePath(),
+      root.resolveUri(toUri(module, jsId)).toFilePath(),
+    ];
+    var result = await _runProcess(
+        sdkRoot.resolve(_d8executable).toFilePath(), d8Args, root.toFilePath());
+
+    _checkExitCode(result, this, module);
+
+    await File.fromUri(root.resolveUri(toUri(module, txtId)))
+        .writeAsString(result.stdout);
+  }
+
+  @override
+  void notifyCached(Module module) {
+    if (_options.verbose) print("\ncached step: d8 on $module");
+  }
+}
+
+void _checkExitCode(ProcessResult result, IOModularStep step, Module module) {
+  if (result.exitCode != 0 || _options.verbose) {
+    stdout.write(result.stdout);
+    stderr.write(result.stderr);
+  }
+  if (result.exitCode != 0) {
+    throw "${step.runtimeType} failed on $module:\n\n"
+        "stdout:\n${result.stdout}\n\n"
+        "stderr:\n${result.stderr}";
+  }
+}
+
+Future<ProcessResult> _runProcess(
+    String command, List<String> arguments, String workingDirectory) {
+  if (_options.verbose) {
+    print('command:\n$command ${arguments.join(' ')} from $workingDirectory');
+  }
+  return Process.run(command, arguments, workingDirectory: workingDirectory);
+}
+
+String get _d8executable {
+  if (Platform.isWindows) {
+    return 'third_party/d8/windows/d8.exe';
+  } else if (Platform.isLinux) {
+    return 'third_party/d8/linux/d8';
+  } else if (Platform.isMacOS) {
+    return 'third_party/d8/macos/d8';
+  }
+  throw UnsupportedError('Unsupported platform.');
+}
+
+class ShardsDataId implements DataId {
+  @override
+  final String name;
+  final int shards;
+
+  const ShardsDataId(this.name, this.shards);
+
+  @override
+  String toString() => name;
+}
+
+class ShardDataId implements DataId {
+  final ShardsDataId dataId;
+  final int _shard;
+
+  const ShardDataId(this.dataId, this._shard);
+
+  int get shard {
+    assert(0 <= _shard && _shard < dataId.shards);
+    return _shard;
+  }
+
+  @override
+  String get name => '${dataId.name}${shard}';
+
+  @override
+  String toString() => name;
+}
+
+Future<void> resolveScripts(Options options) async {
+  Future<String> resolve(
+      String sourceUriOrPath, String relativeSnapshotPath) async {
+    Uri sourceUri = sdkRoot.resolve(sourceUriOrPath);
+    String result =
+        sourceUri.scheme == 'file' ? sourceUri.toFilePath() : sourceUriOrPath;
+    if (_options.useSdk) {
+      String snapshot = Uri.file(Platform.resolvedExecutable)
+          .resolve(relativeSnapshotPath)
+          .toFilePath();
+      if (await File(snapshot).exists()) {
+        return snapshot;
+      }
+    }
+    return result;
+  }
+
+  _options = options;
+  _dart2jsScript = await resolve(
+      'package:compiler/src/dart2js.dart', 'snapshots/dart2js.dart.snapshot');
+  _kernelWorkerScript = await resolve('utils/bazel/kernel_worker.dart',
+      'snapshots/kernel_worker.dart.snapshot');
+}
+
+String _librarySpecForSnapshot = Uri.file(Platform.resolvedExecutable)
+    .resolve('../lib/libraries.json')
+    .toFilePath();
diff --git a/pkg/compiler/tool/modular_test_suite_legacy.dart b/pkg/compiler/tool/modular_test_suite_legacy.dart
new file mode 100644
index 0000000..875a64a
--- /dev/null
+++ b/pkg/compiler/tool/modular_test_suite_legacy.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.
+
+/// Test the modular compilation pipeline of dart2js.
+///
+/// This is a shell that runs multiple tests, one per folder under `data/`.
+import 'dart:async';
+
+import 'package:modular_test/src/io_pipeline.dart';
+import 'package:modular_test/src/runner.dart';
+import 'modular_test_suite_helper.dart';
+
+main(List<String> args) async {
+  var options = Options.parse(args);
+  await resolveScripts(options);
+  await Future.wait([
+    runSuite(
+        sdkRoot.resolve('tests/modular/'),
+        'tests/modular',
+        options,
+        IOPipeline([
+          OutlineDillCompilationStep(),
+          FullDillCompilationStep(),
+          ComputeClosedWorldStep(useModularAnalysis: false),
+          GlobalAnalysisStep(),
+          Dart2jsCodegenStep(codeId0),
+          Dart2jsCodegenStep(codeId1),
+          Dart2jsEmissionStep(),
+          RunD8(),
+        ], cacheSharedModules: true)),
+  ]);
+}
diff --git a/pkg/dart2native/lib/dart2native.dart b/pkg/dart2native/lib/dart2native.dart
index f5f0dfe..be47b4c 100644
--- a/pkg/dart2native/lib/dart2native.dart
+++ b/pkg/dart2native/lib/dart2native.dart
@@ -6,8 +6,8 @@
 import 'dart:typed_data';
 
 // Maximum page size across all supported architectures (arm64 macOS has 16K
-// pages, the rest are all 4k pages).
-const elfPageSize = 16384;
+// pages, some arm64 Linux distributions have 64K pages).
+const elfPageSize = 65536;
 const appjitMagicNumber = <int>[0xdc, 0xdc, 0xf6, 0xf6, 0, 0, 0, 0];
 
 enum Kind { aot, exe }
diff --git a/pkg/dart_internal/CHANGELOG.md b/pkg/dart_internal/CHANGELOG.md
index c49fe05..8894fed 100644
--- a/pkg/dart_internal/CHANGELOG.md
+++ b/pkg/dart_internal/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 0.2.3
+
+- Support the latest Dart SDK.
+
+## 0.2.2
+
+- Support the latest Dart SDK.
+
 ## 0.2.1
 
 - Support the latest Dart SDK.
diff --git a/pkg/dart_internal/pubspec.yaml b/pkg/dart_internal/pubspec.yaml
index d871d5c..9d5dacc 100644
--- a/pkg/dart_internal/pubspec.yaml
+++ b/pkg/dart_internal/pubspec.yaml
@@ -1,5 +1,5 @@
 name: dart_internal
-version: 0.2.2
+version: 0.2.3
 repository: https://github.com/dart-lang/sdk/tree/master/pkg/dart_internal
 description: >-
   This package is not intended for wide use. It provides a temporary API to
@@ -9,4 +9,4 @@
 environment:
   # Restrict the upper bound so that we can remove support for this in a later
   # version of the SDK without it being a breaking change.
-  sdk: ">=2.12.0 <2.16.0"
+  sdk: ">=2.12.0 <2.17.0"
diff --git a/pkg/dartdev/lib/dartdev.dart b/pkg/dartdev/lib/dartdev.dart
index 9367cf6..a545f1a 100644
--- a/pkg/dartdev/lib/dartdev.dart
+++ b/pkg/dartdev/lib/dartdev.dart
@@ -213,7 +213,10 @@
     final path = commandNames.join('/');
     // Send the screen view to analytics
     unawaited(
-      analytics.sendScreenView(path),
+      analytics.sendScreenView(path, parameters:
+          // Starts a new analytics session.
+          // https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#sc
+          {'sc': 'start'}),
     );
 
     // The exit code for the dartdev process; null indicates that it has not been
diff --git a/pkg/dartdev/lib/src/analysis_server.dart b/pkg/dartdev/lib/src/analysis_server.dart
index 580619b..1666afc 100644
--- a/pkg/dartdev/lib/src/analysis_server.dart
+++ b/pkg/dartdev/lib/src/analysis_server.dart
@@ -8,7 +8,11 @@
 
 import 'package:analysis_server/src/server/driver.dart' show Driver;
 import 'package:analysis_server_client/protocol.dart'
-    show EditBulkFixesResult, ResponseDecoder;
+    show
+        AddContentOverlay,
+        AnalysisUpdateContentParams,
+        EditBulkFixesResult,
+        ResponseDecoder;
 import 'package:args/args.dart';
 import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
@@ -167,6 +171,12 @@
     });
   }
 
+  /// Send an `analysis.updateContent` request with the given [files].
+  Future<void> updateContent(Map<String, AddContentOverlay> files) async {
+    await _sendCommand('analysis.updateContent',
+        params: AnalysisUpdateContentParams(files).toJson());
+  }
+
   Future<Map<String, dynamic>> _sendCommand(String method,
       {Map<String, dynamic> params}) {
     final String id = (++_id).toString();
diff --git a/pkg/dartdev/lib/src/commands/fix.dart b/pkg/dartdev/lib/src/commands/fix.dart
index c81e467..d6c8b5a 100644
--- a/pkg/dartdev/lib/src/commands/fix.dart
+++ b/pkg/dartdev/lib/src/commands/fix.dart
@@ -7,6 +7,7 @@
 
 import 'package:analysis_server_client/protocol.dart' hide AnalysisError;
 import 'package:intl/intl.dart';
+import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
 
 import '../analysis_server.dart';
@@ -26,6 +27,12 @@
 
 To use the tool, run either ['dart fix --dry-run'] for a preview of the proposed changes for a project, or ['dart fix --apply'] to apply the changes.''';
 
+  /// The maximum number of times that fixes will be requested from the server.
+  static const maxPasses = 4;
+
+  /// A map from the absolute path of a file to the updated content of the file.
+  final Map<String, String> fileContentCache = {};
+
   FixCommand({bool verbose = false}) : super(cmdName, cmdDescription, verbose) {
     argParser.addFlag('dry-run',
         abbr: 'n',
@@ -86,7 +93,7 @@
     var modeText = dryRun ? ' (dry run)' : '';
 
     final projectName = path.basename(dirPath);
-    var progress = log.progress(
+    var computeFixesProgress = log.progress(
         'Computing fixes in ${log.ansi.emphasized(projectName)}$modeText');
 
     var server = AnalysisServer(
@@ -99,53 +106,60 @@
 
     await server.start();
 
-    EditBulkFixesResult fixes;
     server.onExit.then((int exitCode) {
-      if (fixes == null && exitCode != 0) {
-        progress?.cancel();
+      if (computeFixesProgress != null && exitCode != 0) {
+        computeFixesProgress?.cancel();
+        computeFixesProgress = null;
         io.exitCode = exitCode;
       }
     });
 
-    fixes = await server.requestBulkFixes(dirPath, inTestMode);
-    final List<SourceFileEdit> edits = fixes.edits;
+    Future<Map<String, BulkFix>> _applyAllEdits() async {
+      var detailsMap = <String, BulkFix>{};
+      List<SourceFileEdit> edits;
+      var pass = 0;
+      do {
+        var fixes = await server.requestBulkFixes(dirPath, inTestMode);
+        _mergeDetails(detailsMap, fixes.details);
+        edits = fixes.edits;
+        _applyEdits(server, edits);
+        pass++;
+        // TODO(brianwilkerson) Be more intelligent about detecting infinite
+        //  loops so that we can increase [maxPasses].
+      } while (pass < maxPasses && edits.isNotEmpty);
+      return detailsMap;
+    }
 
+    var detailsMap = await _applyAllEdits();
     await server.shutdown();
 
-    progress.finish(showTiming: true);
+    if (computeFixesProgress != null) {
+      computeFixesProgress.finish(showTiming: true);
+      computeFixesProgress = null;
+    }
 
     if (inTestMode) {
-      var result = _compareFixesInDirectory(dir, edits);
+      var result = _compareFixesInDirectory(dir);
       log.stdout('Passed: ${result.passCount}, Failed: ${result.failCount}');
       return result.failCount > 0 ? 1 : 0;
-    } else if (edits.isEmpty) {
+    } else if (detailsMap.isEmpty) {
       log.stdout('Nothing to fix!');
     } else {
-      var details = fixes.details;
-      details.sort((f1, f2) => path
-          .relative(f1.path, from: dirPath)
-          .compareTo(path.relative(f2.path, from: dirPath)));
-
-      var fileCount = 0;
-      var fixCount = 0;
-
-      for (var d in details) {
-        ++fileCount;
-        for (var f in d.fixes) {
-          fixCount += f.occurrences;
-        }
-      }
+      var fileCount = detailsMap.length;
+      var fixCount = detailsMap.values
+          .expand((detail) => detail.fixes)
+          .fold(0, (previousValue, fixes) => previousValue + fixes.occurrences);
 
       if (dryRun) {
         log.stdout('');
         log.stdout('${_format(fixCount)} proposed ${_pluralFix(fixCount)} '
             'in ${_format(fileCount)} ${pluralize("file", fileCount)}.');
-        _printDetails(details, dir);
+        _printDetails(detailsMap, dir);
       } else {
-        progress = log.progress('Applying fixes');
-        _applyFixes(edits);
-        progress.finish(showTiming: true);
-        _printDetails(details, dir);
+        var applyFixesProgress = log.progress('Applying fixes');
+        _writeFiles();
+        applyFixesProgress.finish(showTiming: true);
+        _printDetails(detailsMap, dir);
         log.stdout('${_format(fixCount)} ${_pluralFix(fixCount)} made in '
             '${_format(fileCount)} ${pluralize("file", fileCount)}.');
       }
@@ -154,20 +168,24 @@
     return 0;
   }
 
-  void _applyFixes(List<SourceFileEdit> edits) {
+  void _applyEdits(AnalysisServer server, List<SourceFileEdit> edits) {
+    var overlays = <String, AddContentOverlay>{};
     for (var edit in edits) {
-      var fileName = edit.file;
-      var file = io.File(fileName);
-      var code = file.existsSync() ? file.readAsStringSync() : '';
-      code = SourceEdit.applySequence(code, edit.edits);
-      file.writeAsStringSync(code);
+      var filePath = edit.file;
+      var content = fileContentCache.putIfAbsent(filePath, () {
+        var file = io.File(filePath);
+        return file.existsSync() ? file.readAsStringSync() : '';
+      });
+      var newContent = SourceEdit.applySequence(content, edit.edits);
+      fileContentCache[filePath] = newContent;
+      overlays[filePath] = AddContentOverlay(newContent);
     }
+    server.updateContent(overlays);
   }
 
   /// Return `true` if any of the fixes fail to create the same content as is
   /// found in the golden file.
-  _TestResult _compareFixesInDirectory(
-      io.Directory directory, List<SourceFileEdit> edits) {
+  _TestResult _compareFixesInDirectory(io.Directory directory) {
     var result = _TestResult();
     //
     // Gather the files of interest in this directory and process
@@ -177,7 +195,7 @@
     var expectFileMap = <String, io.File>{};
     for (var child in directory.listSync()) {
       if (child is io.Directory) {
-        var childResult = _compareFixesInDirectory(child, edits);
+        var childResult = _compareFixesInDirectory(child);
         result.passCount += childResult.passCount;
         result.failCount += childResult.failCount;
       } else if (child is io.File) {
@@ -189,10 +207,6 @@
         }
       }
     }
-    var editMap = <String, SourceFileEdit>{};
-    for (var edit in edits) {
-      editMap[edit.file] = edit;
-    }
     for (var originalFile in dartFiles) {
       var filePath = originalFile.path;
       var baseName = path.basename(filePath);
@@ -205,19 +219,24 @@
             'No corresponding expect file for the Dart file at "$filePath".');
         continue;
       }
-      var edit = editMap[filePath];
       try {
-        var originalCode = originalFile.readAsStringSync();
         var expectedCode = expectFile.readAsStringSync();
-        var actualCode = edit == null
-            ? originalCode
-            : SourceEdit.applySequence(originalCode, edit.edits);
+        var actualIsOriginal = !fileContentCache.containsKey(filePath);
+        var actualCode = actualIsOriginal
+            ? originalFile.readAsStringSync()
+            : fileContentCache[filePath];
         // Use a whitespace insensitive comparison.
         if (_compressWhitespace(actualCode) !=
             _compressWhitespace(expectedCode)) {
           result.failCount++;
-          _reportFailure(filePath, actualCode, expectedCode);
-          _printEdits(edits);
+          // TODO(brianwilkerson) Do a better job of displaying the differences.
+          //  It's very hard to see the diff with large files.
+          _reportFailure(
+            filePath,
+            actualCode,
+            expectedCode,
+            actualIsOriginal: actualIsOriginal,
+          );
         } else {
           result.passCount++;
         }
@@ -243,15 +262,54 @@
   String _compressWhitespace(String code) =>
       code.replaceAll(RegExp(r'\s+'), ' ');
 
+  /// Merge the fixes from the current round's [details] into the [detailsMap].
+  void _mergeDetails(Map<String, BulkFix> detailsMap, List<BulkFix> details) {
+    for (var detail in details) {
+      var previousDetail = detailsMap[detail.path];
+      if (previousDetail != null) {
+        _mergeFixCounts(previousDetail.fixes, detail.fixes);
+      } else {
+        detailsMap[detail.path] = detail;
+      }
+    }
+  }
+
+  void _mergeFixCounts(
+      List<BulkFixDetail> oldFixes, List<BulkFixDetail> newFixes) {
+    var originalOldLength = oldFixes.length;
+    newFixLoop:
+    for (var newFix in newFixes) {
+      var newCode = newFix.code;
+      // Iterate over the original content of the list, not any of the newly
+      // added fixes, because the newly added fixes can't be a match.
+      for (var i = 0; i < originalOldLength; i++) {
+        var oldFix = oldFixes[i];
+        if (oldFix.code == newCode) {
+          oldFix.occurrences += newFix.occurrences;
+          continue newFixLoop;
+        }
+      }
+      oldFixes.add(newFix);
+    }
+  }
+
   String _pluralFix(int count) => count == 1 ? 'fix' : 'fixes';
 
-  void _printDetails(List<BulkFix> details, io.Directory workingDir) {
+  void _printDetails(Map<String, BulkFix> detailsMap, io.Directory workingDir) {
+    String relative(String absolutePath) {
+      return path.relative(absolutePath, from: workingDir.path);
+    }
+
     log.stdout('');
 
     final bullet = log.ansi.bullet;
 
-    for (var detail in details) {
-      log.stdout(path.relative(detail.path, from: workingDir.path));
+    var modifiedFilePaths = detailsMap.keys.toList();
+    modifiedFilePaths
+        .sort((first, second) => relative(first).compareTo(relative(second)));
+    for (var filePath in modifiedFilePaths) {
+      var detail = detailsMap[filePath];
+      log.stdout(relative(detail.path));
       final fixes = detail.fixes.toList();
       fixes.sort((a, b) => a.code.compareTo(b.code));
       for (var fix in fixes) {
@@ -262,27 +320,30 @@
     }
   }
 
-  void _printEdits(List<SourceFileEdit> edits) {
-    log.stdout('Edits returned from server:');
-    for (var fileEdit in edits) {
-      log.stdout('  ${fileEdit.file}');
-      for (var edit in fileEdit.edits) {
-        log.stdout("    ${edit.offset} - ${edit.end}, '${edit.replacement}'");
-      }
-    }
-  }
-
   /// Report that the [actualCode] produced by applying fixes to the content of
   /// [filePath] did not match the [expectedCode].
-  void _reportFailure(String filePath, String actualCode, String expectedCode) {
+  void _reportFailure(String filePath, String actualCode, String expectedCode,
+      {@required bool actualIsOriginal}) {
     log.stdout('Failed when applying fixes to $filePath');
     log.stdout('Expected:');
     log.stdout(expectedCode);
     log.stdout('');
-    log.stdout('Actual:');
+    if (actualIsOriginal) {
+      log.stdout('Actual (original code was unchanged):');
+    } else {
+      log.stdout('Actual:');
+    }
     log.stdout(actualCode);
   }
 
+  /// Write the modified contents of files in the [fileContentCache] to disk.
+  void _writeFiles() {
+    for (var entry in fileContentCache.entries) {
+      var file = io.File(entry.key);
+      file.writeAsStringSync(entry.value);
+    }
+  }
+
   static String _format(int value) => _numberFormat.format(value);
 }
 
diff --git a/pkg/dartdev/lib/src/commands/run.dart b/pkg/dartdev/lib/src/commands/run.dart
index 69db956..a74fa84 100644
--- a/pkg/dartdev/lib/src/commands/run.dart
+++ b/pkg/dartdev/lib/src/commands/run.dart
@@ -318,10 +318,11 @@
         stderrSub.cancel();
         completer.complete();
       } else {
+        final error = result['error'] ?? event;
+        final stacktrace = result['stacktrace'] ?? '';
         stderrSub.cancel();
         completer.completeError(
-          'Could not start Observatory HTTP server',
-        );
+            'Could not start Observatory HTTP server:\n$error\n$stacktrace\n');
       }
     });
     try {
diff --git a/pkg/dartdev/test/analytics_test.dart b/pkg/dartdev/test/analytics_test.dart
index 3ae1f16..450db64 100644
--- a/pkg/dartdev/test/analytics_test.dart
+++ b/pkg/dartdev/test/analytics_test.dart
@@ -40,9 +40,9 @@
     });
   });
 
-  test('Analytics control smoke test', () {
+  test('Analytics control smoke test', () async {
     final p = project(logAnalytics: true);
-    var result = p.runSync(['--disable-analytics']);
+    var result = await p.run(['--disable-analytics']);
     expect(result.stdout, contains('''
   ╔════════════════════════════════════════════════════════════════════════════╗
   ║ Analytics reporting disabled. In order to enable it, run:                  ║
@@ -52,7 +52,7 @@
   ╚════════════════════════════════════════════════════════════════════════════╝
 '''));
 
-    result = p.runSync(['--enable-analytics']);
+    result = await p.run(['--enable-analytics']);
     expect(result.stdout, contains('''
   ╔════════════════════════════════════════════════════════════════════════════╗
   ║ The Dart tool uses Google Analytics to report feature usage statistics     ║
@@ -69,13 +69,13 @@
 
   final experiments = await experimentsWithValidation();
   group('Sending analytics', () {
-    test('help', () {
+    test('help', () async {
       final p = project(logAnalytics: true);
-      final result = p.runSync(['help']);
+      final result = await p.run(['help']);
       expect(extractAnalytics(result), [
         {
           'hitType': 'screenView',
-          'message': {'viewName': 'help'}
+          'message': {'viewName': 'help', 'sc': 'start'}
         },
         {
           'hitType': 'event',
@@ -97,14 +97,14 @@
         }
       ]);
     });
-    test('create', () {
+    test('create', () async {
       final p = project(logAnalytics: true);
       final result =
-          p.runSync(['create', '--no-pub', '-tpackage-simple', 'name']);
+          await p.run(['create', '--no-pub', '-tpackage-simple', 'name']);
       expect(extractAnalytics(result), [
         {
           'hitType': 'screenView',
-          'message': {'viewName': 'create'}
+          'message': {'viewName': 'create', 'sc': 'start'}
         },
         {
           'hitType': 'event',
@@ -129,17 +129,17 @@
       ]);
     });
 
-    test('pub get dry run', () {
+    test('pub get dry run', () async {
       final p = project(logAnalytics: true, pubspec: {
         'name': 'foo',
         'environment': {'sdk': '>=2.10.0 <3.0.0'},
         'dependencies': {'_dummy_pkg': '0.0.1'}
       });
-      final result = p.runSync(['pub', 'get', '--dry-run']);
+      final result = await p.run(['pub', 'get', '--dry-run']);
       expect(extractAnalytics(result), [
         {
           'hitType': 'screenView',
-          'message': {'viewName': 'pub/get'}
+          'message': {'viewName': 'pub/get', 'sc': 'start'}
         },
         {
           'hitType': 'event',
@@ -164,17 +164,17 @@
       ]);
     });
 
-    test('pub get', () {
+    test('pub get', () async {
       final p = project(logAnalytics: true, pubspec: {
         'name': 'foo',
         'environment': {'sdk': '>=2.10.0 <3.0.0'},
         'dependencies': {'_dummy_pkg': '0.0.1'}
       });
-      final result = p.runSync(['pub', 'get']);
+      final result = await p.run(['pub', 'get']);
       expect(extractAnalytics(result), [
         {
           'hitType': 'screenView',
-          'message': {'viewName': 'pub/get'}
+          'message': {'viewName': 'pub/get', 'sc': 'start'},
         },
         {
           'hitType': 'event',
@@ -218,13 +218,13 @@
       ]);
     });
 
-    test('format', () {
+    test('format', () async {
       final p = project(logAnalytics: true);
-      final result = p.runSync(['format', '-l80', '.']);
+      final result = await p.run(['format', '-l80', '.']);
       expect(extractAnalytics(result), [
         {
           'hitType': 'screenView',
-          'message': {'viewName': 'format'}
+          'message': {'viewName': 'format', 'sc': 'start'}
         },
         {
           'hitType': 'event',
@@ -249,11 +249,11 @@
       ]);
     });
 
-    test('run', () {
+    test('run', () async {
       final p = project(
           mainSrc: 'void main(List<String> args) => print(args)',
           logAnalytics: true);
-      final result = p.runSync([
+      final result = await p.run([
         'run',
         '--no-pause-isolates-on-exit',
         '--enable-asserts',
@@ -263,7 +263,7 @@
       expect(extractAnalytics(result), [
         {
           'hitType': 'screenView',
-          'message': {'viewName': 'run'}
+          'message': {'viewName': 'run', 'sc': 'start'},
         },
         {
           'hitType': 'event',
@@ -289,11 +289,11 @@
     });
     group('run --enable-experiments', () {
       for (final experiment in experiments) {
-        test(experiment.name, () {
+        test(experiment.name, () async {
           final p = project(mainSrc: experiment.validation, logAnalytics: true);
           {
             for (final no in ['', 'no-']) {
-              final result = p.runSync([
+              final result = await p.run([
                 'run',
                 '--enable-experiment=$no${experiment.name}',
                 'lib/main.dart',
@@ -301,7 +301,7 @@
               expect(extractAnalytics(result), [
                 {
                   'hitType': 'screenView',
-                  'message': {'viewName': 'run'}
+                  'message': {'viewName': 'run', 'sc': 'start'},
                 },
                 {
                   'hitType': 'event',
@@ -330,16 +330,16 @@
       }
     });
 
-    test('compile', () {
+    test('compile', () async {
       final p = project(
           mainSrc: 'void main(List<String> args) => print(args);',
           logAnalytics: true);
-      final result = p
-          .runSync(['compile', 'kernel', 'lib/main.dart', '-o', 'main.kernel']);
+      final result = await p
+          .run(['compile', 'kernel', 'lib/main.dart', '-o', 'main.kernel']);
       expect(extractAnalytics(result), [
         {
           'hitType': 'screenView',
-          'message': {'viewName': 'compile/kernel'}
+          'message': {'viewName': 'compile/kernel', 'sc': 'start'},
         },
         {
           'hitType': 'event',
diff --git a/pkg/dartdev/test/commands/analyze_test.dart b/pkg/dartdev/test/commands/analyze_test.dart
index af8984c..11613ef 100644
--- a/pkg/dartdev/test/commands/analyze_test.dart
+++ b/pkg/dartdev/test/commands/analyze_test.dart
@@ -178,9 +178,9 @@
 
   tearDown(() => p?.dispose());
 
-  test('--help', () {
+  test('--help', () async {
     p = project();
-    var result = p.runSync(['analyze', '--help']);
+    var result = await p.run(['analyze', '--help']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -188,9 +188,9 @@
     expect(result.stdout, contains(_analyzeUsageText));
   });
 
-  test('--help --verbose', () {
+  test('--help --verbose', () async {
     p = project();
-    var result = p.runSync(['analyze', '--help', '--verbose']);
+    var result = await p.run(['analyze', '--help', '--verbose']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -203,10 +203,10 @@
 
     tearDown(() => secondProject?.dispose());
 
-    test('folder and file', () {
+    test('folder and file', () async {
       p = project(mainSrc: "int get foo => 'str';\n");
       secondProject = project(mainSrc: "int get foo => 'str';\n");
-      var result = p.runSync(['analyze', p.dirPath, secondProject.mainPath]);
+      var result = await p.run(['analyze', p.dirPath, secondProject.mainPath]);
 
       expect(result.exitCode, 3);
       expect(result.stderr, isEmpty);
@@ -216,10 +216,10 @@
       expect(result.stdout, contains('2 issues found.'));
     });
 
-    test('two folders', () {
+    test('two folders', () async {
       p = project(mainSrc: "int get foo => 'str';\n");
       secondProject = project(mainSrc: "int get foo => 'str';\n");
-      var result = p.runSync(['analyze', p.dirPath, secondProject.dirPath]);
+      var result = await p.run(['analyze', p.dirPath, secondProject.dirPath]);
 
       expect(result.exitCode, 3);
       expect(result.stderr, isEmpty);
@@ -230,9 +230,9 @@
     });
   });
 
-  test('no such directory', () {
+  test('no such directory', () async {
     p = project();
-    var result = p.runSync(['analyze', '/no/such/dir1/']);
+    var result = await p.run(['analyze', '/no/such/dir1/']);
 
     expect(result.exitCode, 64);
     expect(result.stdout, isEmpty);
@@ -241,10 +241,10 @@
     expect(result.stderr, contains(_analyzeUsageText));
   });
 
-  test('current working directory', () {
+  test('current working directory', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
 
-    var result = p.runSync(['analyze'], workingDir: p.dirPath);
+    var result = await p.run(['analyze'], workingDir: p.dirPath);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -252,18 +252,18 @@
   });
 
   group('single directory', () {
-    test('no errors', () {
+    test('no errors', () async {
       p = project(mainSrc: 'int get foo => 1;\n');
-      var result = p.runSync(['analyze', p.dirPath]);
+      var result = await p.run(['analyze', p.dirPath]);
 
       expect(result.exitCode, 0);
       expect(result.stderr, isEmpty);
       expect(result.stdout, contains('No issues found!'));
     });
 
-    test('one error', () {
+    test('one error', () async {
       p = project(mainSrc: "int get foo => 'str';\n");
-      var result = p.runSync(['analyze', p.dirPath]);
+      var result = await p.run(['analyze', p.dirPath]);
 
       expect(result.exitCode, 3);
       expect(result.stderr, isEmpty);
@@ -273,9 +273,9 @@
       expect(result.stdout, contains('1 issue found.'));
     });
 
-    test('two errors', () {
+    test('two errors', () async {
       p = project(mainSrc: "int get foo => 'str';\nint get bar => 'str';\n");
-      var result = p.runSync(['analyze', p.dirPath]);
+      var result = await p.run(['analyze', p.dirPath]);
 
       expect(result.exitCode, 3);
       expect(result.stderr, isEmpty);
@@ -284,18 +284,18 @@
   });
 
   group('single file', () {
-    test('no errors', () {
+    test('no errors', () async {
       p = project(mainSrc: 'int get foo => 1;\n');
-      var result = p.runSync(['analyze', p.mainPath]);
+      var result = await p.run(['analyze', p.mainPath]);
 
       expect(result.exitCode, 0);
       expect(result.stderr, isEmpty);
       expect(result.stdout, contains('No issues found!'));
     });
 
-    test('one error', () {
+    test('one error', () async {
       p = project(mainSrc: "int get foo => 'str';\n");
-      var result = p.runSync(['analyze', p.mainPath]);
+      var result = await p.run(['analyze', p.mainPath]);
 
       expect(result.exitCode, 3);
       expect(result.stderr, isEmpty);
@@ -306,65 +306,65 @@
     });
   });
 
-  test('warning --fatal-warnings', () {
+  test('warning --fatal-warnings', () async {
     p = project(
         mainSrc: _unusedImportCodeSnippet,
         analysisOptions: _unusedImportAnalysisOptions);
-    var result = p.runSync(['analyze', '--fatal-warnings', p.dirPath]);
+    var result = await p.run(['analyze', '--fatal-warnings', p.dirPath]);
 
     expect(result.exitCode, equals(2));
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('1 issue found.'));
   });
 
-  test('warning implicit --fatal-warnings', () {
+  test('warning implicit --fatal-warnings', () async {
     p = project(
         mainSrc: _unusedImportCodeSnippet,
         analysisOptions: _unusedImportAnalysisOptions);
-    var result = p.runSync(['analyze', p.dirPath]);
+    var result = await p.run(['analyze', p.dirPath]);
 
     expect(result.exitCode, equals(2));
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('1 issue found.'));
   });
 
-  test('warning --no-fatal-warnings', () {
+  test('warning --no-fatal-warnings', () async {
     p = project(
         mainSrc: _unusedImportCodeSnippet,
         analysisOptions: _unusedImportAnalysisOptions);
-    var result = p.runSync(['analyze', '--no-fatal-warnings', p.dirPath]);
+    var result = await p.run(['analyze', '--no-fatal-warnings', p.dirPath]);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('1 issue found.'));
   });
 
-  test('info implicit no --fatal-infos', () {
+  test('info implicit no --fatal-infos', () async {
     p = project(mainSrc: dartVersionFilePrefix2_9 + 'String foo() {}');
-    var result = p.runSync(['analyze', p.dirPath]);
+    var result = await p.run(['analyze', p.dirPath]);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('1 issue found.'));
   });
 
-  test('info --fatal-infos', () {
+  test('info --fatal-infos', () async {
     p = project(mainSrc: dartVersionFilePrefix2_9 + 'String foo() {}');
-    var result = p.runSync(['analyze', '--fatal-infos', p.dirPath]);
+    var result = await p.run(['analyze', '--fatal-infos', p.dirPath]);
 
     expect(result.exitCode, 1);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('1 issue found.'));
   });
 
-  test('--verbose', () {
+  test('--verbose', () async {
     p = project(mainSrc: '''
 int f() {
   var result = one + 2;
   var one = 1;
   return result;
 }''');
-    var result = p.runSync(['analyze', '--verbose', p.dirPath]);
+    var result = await p.run(['analyze', '--verbose', p.dirPath]);
 
     expect(result.exitCode, 3);
     expect(result.stderr, isEmpty);
@@ -377,7 +377,7 @@
   });
 
   group('--packages', () {
-    test('existing', () {
+    test('existing', () async {
       final foo = project(name: 'foo');
       foo.file('lib/foo.dart', 'var my_foo = 0;');
 
@@ -399,7 +399,7 @@
   ]
 }
 ''');
-      var result = p.runSync([
+      var result = await p.run([
         'analyze',
         '--packages=${p.findFile('my_packages.json').path}',
         p.dirPath,
@@ -410,9 +410,9 @@
       expect(result.stdout, contains('No issues found!'));
     });
 
-    test('not existing', () {
+    test('not existing', () async {
       p = project();
-      var result = p.runSync([
+      var result = await p.run([
         'analyze',
         '--packages=no.such.file',
         p.dirPath,
@@ -424,11 +424,11 @@
     });
   });
 
-  test('--cache', () {
+  test('--cache', () async {
     var cache = project(name: 'cache');
 
     p = project(mainSrc: 'var v = 0;');
-    var result = p.runSync([
+    var result = await p.run([
       'analyze',
       '--cache=${cache.dirPath}',
       p.mainPath,
diff --git a/pkg/dartdev/test/commands/compile_test.dart b/pkg/dartdev/test/commands/compile_test.dart
index be43ac7..2facc8c 100644
--- a/pkg/dartdev/test/commands/compile_test.dart
+++ b/pkg/dartdev/test/commands/compile_test.dart
@@ -29,9 +29,9 @@
     expect(binDir.path, contains('bin'));
   });
 
-  test('Implicit --help', () {
+  test('Implicit --help', () async {
     final p = project();
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
       ],
@@ -40,9 +40,9 @@
     expect(result.exitCode, compileErrorExitCode);
   });
 
-  test('--help', () {
+  test('--help', () async {
     final p = project();
-    final result = p.runSync(
+    final result = await p.run(
       ['compile', '--help'],
     );
     expect(result.stdout, contains('Compile Dart'));
@@ -61,9 +61,9 @@
     expect(result.exitCode, 0);
   });
 
-  test('--help --verbose', () {
+  test('--help --verbose', () async {
     final p = project();
-    final result = p.runSync(
+    final result = await p.run(
       ['compile', '--help', '--verbose'],
     );
     expect(result.stdout, contains('Compile Dart'));
@@ -76,10 +76,10 @@
     expect(result.exitCode, 0);
   });
 
-  test('Compile and run jit snapshot', () {
+  test('Compile and run jit snapshot', () async {
     final p = project(mainSrc: 'void main() { print("I love jit"); }');
     final outFile = path.join(p.dirPath, 'main.jit');
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'jit-snapshot',
@@ -93,18 +93,18 @@
     expect(File(outFile).existsSync(), true,
         reason: 'File not found: $outFile');
 
-    result = p.runSync(['run', 'main.jit']);
+    result = await p.run(['run', 'main.jit']);
     expect(result.stdout, contains('I love jit'));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
   });
 
-  test('Compile and run executable', () {
+  test('Compile and run executable', () async {
     final p = project(mainSrc: 'void main() { print("I love executables"); }');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'lib', 'main.exe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -127,11 +127,11 @@
     expect(result.exitCode, 0);
   }, skip: isRunningOnIA32);
 
-  test('Compile to executable disabled on IA32', () {
+  test('Compile to executable disabled on IA32', () async {
     final p = project(mainSrc: 'void main() { print("I love executables"); }');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -144,11 +144,11 @@
     expect(result.exitCode, 64);
   }, skip: !isRunningOnIA32);
 
-  test('Compile to AOT snapshot disabled on IA32', () {
+  test('Compile to AOT snapshot disabled on IA32', () async {
     final p = project(mainSrc: 'void main() { print("I love executables"); }');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'aot-snapshot',
@@ -161,13 +161,13 @@
     expect(result.exitCode, 64);
   }, skip: !isRunningOnIA32);
 
-  test('Compile and run executable with options', () {
+  test('Compile and run executable with options', () async {
     final p = project(
         mainSrc: 'void main() {print(const String.fromEnvironment("life"));}');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myexe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -194,12 +194,12 @@
     expect(result.exitCode, 0);
   }, skip: isRunningOnIA32);
 
-  test('Compile and run aot snapshot', () {
+  test('Compile and run aot snapshot', () async {
     final p = project(mainSrc: 'void main() { print("I love AOT"); }');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'main.aot'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'aot-snapshot',
@@ -225,10 +225,10 @@
     expect(result.exitCode, 0);
   }, skip: isRunningOnIA32);
 
-  test('Compile and run kernel snapshot', () {
+  test('Compile and run kernel snapshot', () async {
     final p = project(mainSrc: 'void main() { print("I love kernel"); }');
     final outFile = path.join(p.dirPath, 'main.dill');
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'kernel',
@@ -242,13 +242,13 @@
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
 
-    result = p.runSync(['run', 'main.dill']);
+    result = await p.run(['run', 'main.dill']);
     expect(result.stdout, contains('I love kernel'));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
   });
 
-  test('Compile JS', () {
+  test('Compile JS', () async {
     final p = project(mainSrc: '''
         void main() {
           print('1: ' + const String.fromEnvironment('foo'));
@@ -257,7 +257,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'main.js'));
 
-    final result = p.runSync([
+    final result = await p.run([
       'compile',
       'js',
       '-m',
@@ -279,7 +279,7 @@
     expect(contents.contains('2: foo'), true);
   });
 
-  test('Compile exe with error', () {
+  test('Compile exe with error', () async {
     final p = project(mainSrc: '''
 void main() {
   int? i;
@@ -289,7 +289,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myexe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -309,7 +309,7 @@
         reason: 'File not found: $outFile');
   }, skip: isRunningOnIA32);
 
-  test('Compile exe with warnings', () {
+  test('Compile exe with warnings', () async {
     final p = project(mainSrc: '''
 void main() {
   int i = 0;
@@ -319,7 +319,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myexe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -336,12 +336,12 @@
         reason: 'File not found: $outFile');
   }, skip: isRunningOnIA32);
 
-  test('Compile exe with sound null safety', () {
+  test('Compile exe with sound null safety', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myexe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -358,7 +358,7 @@
         reason: 'File not found: $outFile');
   }, skip: isRunningOnIA32);
 
-  test('Compile exe with unsound null safety', () {
+  test('Compile exe with unsound null safety', () async {
     final p = project(mainSrc: '''
 // @dart=2.9
 void main() {}
@@ -366,7 +366,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myexe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -383,14 +383,14 @@
         reason: 'File not found: $outFile');
   }, skip: isRunningOnIA32);
 
-  test('Compile and run exe with --sound-null-safety', () {
+  test('Compile and run exe with --sound-null-safety', () async {
     final p = project(mainSrc: '''void main() {
       print((<int?>[] is List<int>) ? 'oh no' : 'sound');
     }''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myexe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -417,14 +417,14 @@
     expect(result.exitCode, 0);
   }, skip: isRunningOnIA32);
 
-  test('Compile and run exe with --no-sound-null-safety', () {
+  test('Compile and run exe with --no-sound-null-safety', () async {
     final p = project(mainSrc: '''void main() {
       print((<int?>[] is List<int>) ? 'unsound' : 'oh no');
     }''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myexe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -451,12 +451,12 @@
     expect(result.exitCode, 0);
   }, skip: isRunningOnIA32);
 
-  test('Compile exe without info', () {
+  test('Compile exe without info', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myexe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -475,7 +475,7 @@
         reason: 'File not found: $outFile');
   }, skip: isRunningOnIA32);
 
-  test('Compile exe without warnings', () {
+  test('Compile exe without warnings', () async {
     final p = project(mainSrc: '''
 void main() {
   int i = 0;
@@ -485,7 +485,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myexe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -502,12 +502,12 @@
     expect(result.exitCode, 0);
   }, skip: isRunningOnIA32);
 
-  test('Compile JS with sound null safety', () {
+  test('Compile JS with sound null safety', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjs'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'js',
@@ -524,7 +524,7 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile JS with unsound null safety', () {
+  test('Compile JS with unsound null safety', () async {
     final p = project(mainSrc: '''
 // @dart=2.9
 void main() {}
@@ -532,7 +532,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjs'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'js',
@@ -549,12 +549,12 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile JS without info', () {
+  test('Compile JS without info', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjs'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'js',
@@ -573,7 +573,7 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile JS without warnings', () {
+  test('Compile JS without warnings', () async {
     final p = project(mainSrc: '''
 void main() {
   int i = 0;
@@ -583,7 +583,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjs'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'js',
@@ -600,12 +600,12 @@
     expect(result.exitCode, 0);
   });
 
-  test('Compile AOT snapshot with sound null safety', () {
+  test('Compile AOT snapshot with sound null safety', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myaot'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'aot-snapshot',
@@ -622,7 +622,7 @@
         reason: 'File not found: $outFile');
   }, skip: isRunningOnIA32);
 
-  test('Compile AOT snapshot with unsound null safety', () {
+  test('Compile AOT snapshot with unsound null safety', () async {
     final p = project(mainSrc: '''
 // @dart=2.9
 void main() {}
@@ -630,7 +630,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myaot'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'aot-snapshot',
@@ -647,12 +647,12 @@
         reason: 'File not found: $outFile');
   }, skip: isRunningOnIA32);
 
-  test('Compile AOT snapshot without info', () {
+  test('Compile AOT snapshot without info', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myaot'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'aot-snapshot',
@@ -671,7 +671,7 @@
         reason: 'File not found: $outFile');
   }, skip: isRunningOnIA32);
 
-  test('Compile AOT snapshot without warnings', () {
+  test('Compile AOT snapshot without warnings', () async {
     final p = project(mainSrc: '''
 void main() {
   int i = 0;
@@ -681,7 +681,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myaot'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'aot-snapshot',
@@ -698,7 +698,7 @@
     expect(result.exitCode, 0);
   }, skip: isRunningOnIA32);
 
-  test('Compile AOT snapshot with warnings', () {
+  test('Compile AOT snapshot with warnings', () async {
     final p = project(mainSrc: '''
 void main() {
   int i = 0;
@@ -708,7 +708,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myaot'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'aot-snapshot',
@@ -726,12 +726,12 @@
     expect(result.exitCode, 0);
   }, skip: isRunningOnIA32);
 
-  test('Compile kernel with invalid trailing argument', () {
+  test('Compile kernel with invalid trailing argument', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'mydill'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'kernel',
@@ -754,12 +754,12 @@
     expect(File(outFile).existsSync(), false, reason: 'File found: $outFile');
   });
 
-  test('Compile kernel with sound null safety', () {
+  test('Compile kernel with sound null safety', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'mydill'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'kernel',
@@ -776,7 +776,7 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile kernel with unsound null safety', () {
+  test('Compile kernel with unsound null safety', () async {
     final p = project(mainSrc: '''
 // @dart=2.9
 void main() {}
@@ -784,7 +784,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'mydill'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'kernel',
@@ -801,12 +801,12 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile kernel without info', () {
+  test('Compile kernel without info', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'mydill'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'kernel',
@@ -825,7 +825,7 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile kernel without warning', () {
+  test('Compile kernel without warning', () async {
     final p = project(mainSrc: '''
 void main() {
     int i;
@@ -834,7 +834,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'mydill'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'kernel',
@@ -851,7 +851,7 @@
     expect(result.exitCode, 254);
   });
 
-  test('Compile kernel with warnings', () {
+  test('Compile kernel with warnings', () async {
     final p = project(mainSrc: '''
 void main() {
     int i = 0;
@@ -860,7 +860,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'mydill'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'kernel',
@@ -877,12 +877,12 @@
     expect(result.exitCode, 0);
   });
 
-  test('Compile JIT snapshot with sound null safety', () {
+  test('Compile JIT snapshot with sound null safety', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjit'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'jit-snapshot',
@@ -899,7 +899,7 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile JIT snapshot with unsound null safety', () {
+  test('Compile JIT snapshot with unsound null safety', () async {
     final p = project(mainSrc: '''
 // @dart=2.9
 void main() {}
@@ -907,7 +907,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjit'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'jit-snapshot',
@@ -924,13 +924,13 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile JIT snapshot with training args', () {
+  test('Compile JIT snapshot with training args', () async {
     final p =
         project(mainSrc: '''void main(List<String> args) => print(args);''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjit'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'jit-snapshot',
@@ -948,12 +948,12 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile JIT snapshot without info', () {
+  test('Compile JIT snapshot without info', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjit'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'jit-snapshot',
@@ -972,7 +972,7 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile JIT snapshot without warnings', () {
+  test('Compile JIT snapshot without warnings', () async {
     final p = project(mainSrc: '''
 void main() {
     int i;
@@ -981,7 +981,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjit'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'jit-snapshot',
@@ -998,7 +998,7 @@
     expect(result.exitCode, 254);
   });
 
-  test('Compile JIT snapshot with warnings', () {
+  test('Compile JIT snapshot with warnings', () async {
     final p = project(mainSrc: '''
 void main() {
     int i = 0;
@@ -1007,7 +1007,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjit'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'jit-snapshot',
diff --git a/pkg/dartdev/test/commands/create_integration_test.dart b/pkg/dartdev/test/commands/create_integration_test.dart
index 8bc1066..e4363a4 100644
--- a/pkg/dartdev/test/commands/create_integration_test.dart
+++ b/pkg/dartdev/test/commands/create_integration_test.dart
@@ -22,10 +22,10 @@
 
   // Create tests for each template.
   for (String templateId in CreateCommand.legalTemplateIds) {
-    test(templateId, () {
+    test(templateId, () async {
       p = project();
 
-      ProcessResult createResult = p.runSync([
+      ProcessResult createResult = await p.run([
         'create',
         '--force',
         '--template',
@@ -37,11 +37,11 @@
       // Validate that the project analyzes cleanly.
       // TODO: Should we use --fatal-infos here?
       ProcessResult analyzeResult =
-          p.runSync(['analyze'], workingDir: p.dir.path);
+          await p.run(['analyze'], workingDir: p.dir.path);
       expect(analyzeResult.exitCode, 0, reason: analyzeResult.stdout);
 
       // Validate that the code is well formatted.
-      ProcessResult formatResult = p.runSync([
+      ProcessResult formatResult = await p.run([
         'format',
         '--output',
         'none',
diff --git a/pkg/dartdev/test/commands/create_test.dart b/pkg/dartdev/test/commands/create_test.dart
index 5af3323..6978d98 100644
--- a/pkg/dartdev/test/commands/create_test.dart
+++ b/pkg/dartdev/test/commands/create_test.dart
@@ -23,9 +23,9 @@
 
   tearDown(() => p?.dispose());
 
-  test('--help', () {
+  test('--help', () async {
     p = project();
-    var result = p.runSync(['create', '--help']);
+    var result = await p.run(['create', '--help']);
 
     expect(result.stdout, contains('Create a new Dart project.'));
     expect(
@@ -38,9 +38,9 @@
     expect(result.exitCode, 0);
   });
 
-  test('--help --verbose', () {
+  test('--help --verbose', () async {
     p = project();
-    var result = p.runSync(['create', '--help', '--verbose']);
+    var result = await p.run(['create', '--help', '--verbose']);
 
     expect(result.stdout, contains('Create a new Dart project.'));
     expect(
@@ -53,21 +53,21 @@
     expect(result.exitCode, 0);
   });
 
-  test('default template exists', () {
+  test('default template exists', () async {
     expect(CreateCommand.legalTemplateIds,
         contains(CreateCommand.defaultTemplateId));
   });
 
-  test('all templates exist', () {
+  test('all templates exist', () async {
     for (String templateId in CreateCommand.legalTemplateIds) {
       expect(CreateCommand.legalTemplateIds, contains(templateId));
     }
   });
 
-  test('list templates', () {
+  test('list templates', () async {
     p = project();
 
-    ProcessResult result = p.runSync(['create', '--list-templates']);
+    ProcessResult result = await p.run(['create', '--list-templates']);
     expect(result.exitCode, 0);
 
     String output = result.stdout.toString();
@@ -78,27 +78,27 @@
     expect(parsedResult[0]['description'], isNotNull);
   });
 
-  test('no directory given', () {
+  test('no directory given', () async {
     p = project();
 
-    ProcessResult result = p.runSync([
+    ProcessResult result = await p.run([
       'create',
     ]);
     expect(result.exitCode, 1);
   });
 
-  test('directory already exists', () {
+  test('directory already exists', () async {
     p = project();
 
-    ProcessResult result = p.runSync(
+    ProcessResult result = await p.run(
         ['create', '--template', CreateCommand.defaultTemplateId, p.dir.path]);
     expect(result.exitCode, 73);
   });
 
-  test('project in current directory', () {
+  test('project in current directory', () async {
     p = project();
     final projectDir = Directory('foo')..createSync();
-    final result = p.runSync(
+    final result = await p.run(
       ['create', '--force', '.'],
       workingDir: projectDir.path,
     );
@@ -107,9 +107,9 @@
     expect(result.exitCode, 0);
   });
 
-  test('project with normalized package name', () {
+  test('project with normalized package name', () async {
     p = project();
-    final result = p.runSync(['create', 'requires-normalization']);
+    final result = await p.run(['create', 'requires-normalization']);
     expect(result.stderr, isEmpty);
     expect(
         result.stdout,
@@ -118,9 +118,9 @@
     expect(result.exitCode, 0);
   });
 
-  test('project with an invalid package name', () {
+  test('project with an invalid package name', () async {
     p = project();
-    final result = p.runSync(['create', 'bad-package^name']);
+    final result = await p.run(['create', 'bad-package^name']);
     expect(
       result.stderr,
       contains(
@@ -131,20 +131,20 @@
     expect(result.exitCode, 73);
   });
 
-  test('bad template id', () {
+  test('bad template id', () async {
     p = project();
 
-    ProcessResult result =
-        p.runSync(['create', '--no-pub', '--template', 'foo-bar', p.dir.path]);
+    ProcessResult result = await p
+        .run(['create', '--no-pub', '--template', 'foo-bar', p.dir.path]);
     expect(result.exitCode, isNot(0));
   });
 
   // Create tests for each template.
   for (String templateId in CreateCommand.legalTemplateIds) {
-    test(templateId, () {
+    test(templateId, () async {
       p = project();
       const projectName = 'template_project';
-      ProcessResult result = p.runSync([
+      ProcessResult result = await p.run([
         'create',
         '--force',
         '--no-pub',
diff --git a/pkg/dartdev/test/commands/debug_adapter_test.dart b/pkg/dartdev/test/commands/debug_adapter_test.dart
index c21f476..00a7e8c 100644
--- a/pkg/dartdev/test/commands/debug_adapter_test.dart
+++ b/pkg/dartdev/test/commands/debug_adapter_test.dart
@@ -13,9 +13,9 @@
 void debugAdapter() {
   // Implementation of debug_adapter is tested in the DDS package where the
   // DAP implementation lives.
-  test('--help', () {
+  test('--help', () async {
     final p = project();
-    var result = p.runSync(['debug_adapter', '--help']);
+    var result = await p.run(['debug_adapter', '--help']);
 
     expect(
         result.stdout,
diff --git a/pkg/dartdev/test/commands/devtools_test.dart b/pkg/dartdev/test/commands/devtools_test.dart
index 37bc32e..656b8c6 100644
--- a/pkg/dartdev/test/commands/devtools_test.dart
+++ b/pkg/dartdev/test/commands/devtools_test.dart
@@ -18,9 +18,9 @@
 
   tearDown(() => p?.dispose());
 
-  test('--help', () {
+  test('--help', () async {
     p = project();
-    var result = p.runSync(['devtools', '--help']);
+    var result = await p.run(['devtools', '--help']);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Open DevTools'));
@@ -31,9 +31,9 @@
     expect(result.stdout.contains('--try-ports'), isFalse);
   });
 
-  test('--help --verbose', () {
+  test('--help --verbose', () async {
     p = project();
-    var result = p.runSync(['devtools', '--help', '--verbose']);
+    var result = await p.run(['devtools', '--help', '--verbose']);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Open DevTools'));
diff --git a/pkg/dartdev/test/commands/fix_test.dart b/pkg/dartdev/test/commands/fix_test.dart
index 97cddf9..1f0dd94 100644
--- a/pkg/dartdev/test/commands/fix_test.dart
+++ b/pkg/dartdev/test/commands/fix_test.dart
@@ -52,18 +52,18 @@
 ''');
   }
 
-  ProcessResult runFix(List<String> args, {String workingDir}) {
+  Future<ProcessResult> runFix(List<String> args, {String workingDir}) async {
     if (runFromSource) {
       var binary = path.join(Directory.current.path, 'bin', 'dartdev.dart');
-      return p.runSync([binary, 'fix', ...?args], workingDir: workingDir);
+      return await p.run([binary, 'fix', ...?args], workingDir: workingDir);
     }
-    return p.runSync(['fix', ...args], workingDir: workingDir);
+    return await p.run(['fix', ...args], workingDir: workingDir);
   }
 
-  test('--help', () {
+  test('--help', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
 
-    var result = runFix([p.dirPath, '--help']);
+    var result = await runFix([p.dirPath, '--help']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -76,10 +76,10 @@
     expect(result.stdout, contains('Usage: dart fix [arguments]'));
   });
 
-  test('--help --verbose', () {
+  test('--help --verbose', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
 
-    var result = runFix([p.dirPath, '--help', '--verbose']);
+    var result = await runFix([p.dirPath, '--help', '--verbose']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -95,10 +95,10 @@
     );
   });
 
-  test('none', () {
+  test('none', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
 
-    var result = runFix([p.dirPath]);
+    var result = await runFix([p.dirPath]);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -106,17 +106,17 @@
         result.stdout, contains('Apply automated fixes to Dart source code.'));
   });
 
-  test('--apply (none)', () {
+  test('--apply (none)', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
 
-    var result = runFix(['--apply', p.dirPath]);
+    var result = await runFix(['--apply', p.dirPath]);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Nothing to fix!'));
   });
 
-  test('--apply (no args)', () {
+  test('--apply (no args)', () async {
     p = project(
       mainSrc: '''
 var x = "";
@@ -128,7 +128,7 @@
 ''',
     );
 
-    var result = runFix(['--apply'], workingDir: p.dirPath);
+    var result = await runFix(['--apply'], workingDir: p.dirPath);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(
@@ -140,7 +140,7 @@
         ]));
   });
 
-  test('--dry-run', () {
+  test('--dry-run', () async {
     p = project(
       mainSrc: '''
 class A {
@@ -158,7 +158,7 @@
     - prefer_single_quotes
 ''',
     );
-    var result = runFix(['--dry-run', '.'], workingDir: p.dirPath);
+    var result = await runFix(['--dry-run', '.'], workingDir: p.dirPath);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(
@@ -171,7 +171,7 @@
         ]));
   });
 
-  test('--apply (.)', () {
+  test('--apply (.)', () async {
     p = project(
       mainSrc: '''
 var x = "";
@@ -182,7 +182,7 @@
     - prefer_single_quotes
 ''',
     );
-    var result = runFix(['--apply', '.'], workingDir: p.dirPath);
+    var result = await runFix(['--apply', '.'], workingDir: p.dirPath);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(
@@ -195,7 +195,33 @@
         ]));
   });
 
-  test('--apply (excludes)', () {
+  test('--apply (contradictory lints do not loop infinitely)', () async {
+    p = project(
+      mainSrc: '''
+var x = "";
+''',
+      analysisOptions: '''
+linter:
+  rules:
+    - prefer_double_quotes
+    - prefer_single_quotes
+''',
+    );
+    var result = await runFix(['--apply', '.'], workingDir: p.dirPath);
+    expect(result.exitCode, 0);
+    expect(result.stderr, isEmpty);
+    expect(
+        result.stdout,
+        stringContainsInOrder([
+          'Applying fixes...',
+          'lib${Platform.pathSeparator}main.dart',
+          '  prefer_double_quotes $bullet 2 fixes',
+          '  prefer_single_quotes $bullet 2 fixes',
+          '4 fixes made in 1 file.',
+        ]));
+  });
+
+  test('--apply (excludes)', () async {
     p = project(
       mainSrc: '''
 var x = "";
@@ -209,13 +235,13 @@
     - prefer_single_quotes
 ''',
     );
-    var result = runFix(['--apply', '.'], workingDir: p.dirPath);
+    var result = await runFix(['--apply', '.'], workingDir: p.dirPath);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Nothing to fix!'));
   });
 
-  test('--apply (ignores)', () {
+  test('--apply (ignores)', () async {
     p = project(
       mainSrc: '''
 // ignore: prefer_single_quotes
@@ -227,14 +253,41 @@
     - prefer_single_quotes
 ''',
     );
-    var result = runFix(['--apply', '.'], workingDir: p.dirPath);
+    var result = await runFix(['--apply', '.'], workingDir: p.dirPath);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Nothing to fix!'));
   });
 
+  test('--apply (unused imports require a second pass)', () async {
+    p = project(
+      mainSrc: '''
+import 'dart:math';
+
+var x = "";
+''',
+      analysisOptions: '''
+linter:
+  rules:
+    - prefer_single_quotes
+''',
+    );
+    var result = await runFix(['--apply', '.'], workingDir: p.dirPath);
+    expect(result.exitCode, 0);
+    expect(result.stderr, isEmpty);
+    expect(
+        result.stdout,
+        stringContainsInOrder([
+          'Applying fixes...',
+          'lib${Platform.pathSeparator}main.dart',
+          '  prefer_single_quotes $bullet 1 fix',
+          '  unused_import $bullet 1 fix',
+          '2 fixes made in 1 file.',
+        ]));
+  });
+
   group('compare-to-golden', () {
-    test('applied fixes do not match expected', () {
+    test('applied fixes do not match expected', () async {
       p = project(
         mainSrc: '''
 class A {
@@ -261,11 +314,12 @@
   String a() => '';
 }
 ''');
-      result = runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
+      result =
+          await runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
       assertResult(exitCode: 1);
     });
 
-    test('applied fixes match expected', () {
+    test('applied fixes match expected', () async {
       p = project(
         mainSrc: '''
 class A {
@@ -293,11 +347,12 @@
   String a() => '';
 }
 ''');
-      result = runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
+      result =
+          await runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
       assertResult();
     });
 
-    test('missing expect', () {
+    test('missing expect', () async {
       p = project(
         mainSrc: '''
 class A {
@@ -315,11 +370,12 @@
     - prefer_single_quotes
 ''',
       );
-      result = runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
+      result =
+          await runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
       assertResult(exitCode: 1);
     });
 
-    test('missing original', () {
+    test('missing original', () async {
       p = project(mainSrc: '''
 class C {}
 ''');
@@ -329,11 +385,12 @@
       p.file('lib/secondary.dart.expect', '''
 class A {}
 ''');
-      result = runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
+      result =
+          await runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
       assertResult(exitCode: 1);
     });
 
-    test('no fixes to apply does not match expected', () {
+    test('no fixes to apply does not match expected', () async {
       p = project(
         mainSrc: '''
 class A {
@@ -351,7 +408,8 @@
   String a() => '';
 }
 ''');
-      result = runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
+      result =
+          await runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
       assertResult(exitCode: 1);
     });
   });
diff --git a/pkg/dartdev/test/commands/flag_test.dart b/pkg/dartdev/test/commands/flag_test.dart
index da055db..b5aa76e 100644
--- a/pkg/dartdev/test/commands/flag_test.dart
+++ b/pkg/dartdev/test/commands/flag_test.dart
@@ -59,9 +59,9 @@
 
   tearDown(() => p?.dispose());
 
-  test('--help', () {
+  test('--help', () async {
     p = project();
-    var result = p.runSync(['--help']);
+    var result = await p.run(['--help']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -77,9 +77,9 @@
     expect(result.stdout, contains('migrate '));
   });
 
-  test('--help --verbose', () {
+  test('--help --verbose', () async {
     p = project();
-    var result = p.runSync(['--help', '--verbose']);
+    var result = await p.run(['--help', '--verbose']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -87,9 +87,9 @@
         contains('The following options are only used for VM development'));
   });
 
-  test('--help -v', () {
+  test('--help -v', () async {
     p = project();
-    var result = p.runSync(['--help', '-v']);
+    var result = await p.run(['--help', '-v']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -97,25 +97,26 @@
         contains('The following options are only used for VM development'));
   });
 
-  test('print Dart CLI help on usage error', () {
+  test('print Dart CLI help on usage error', () async {
     p = project();
-    var result = p.runSync(['---help']);
+    var result = await p.run(['---help']);
     expect(result.exitCode, 255);
     expect(result.stdout, contains(DartdevRunner.dartdevDescription));
     expect(result.stderr, isEmpty);
   });
 
-  test('print VM help on usage error when --disable-dart-dev is provided', () {
+  test('print VM help on usage error when --disable-dart-dev is provided',
+      () async {
     p = project();
-    var result = p.runSync(['---help', '--disable-dart-dev']);
+    var result = await p.run(['---help', '--disable-dart-dev']);
     expect(result.exitCode, 255);
     expect(result.stdout, isNot(contains(DartdevRunner.dartdevDescription)));
     expect(result.stderr, isEmpty);
   });
 
-  test('help', () {
+  test('help', () async {
     p = project();
-    var result = p.runSync(['help']);
+    var result = await p.run(['help']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -131,9 +132,9 @@
     expect(result.stdout, contains('migrate '));
   });
 
-  test('help --verbose', () {
+  test('help --verbose', () async {
     p = project();
-    var result = p.runSync(['help', '--verbose']);
+    var result = await p.run(['help', '--verbose']);
 
     expect(result.exitCode, 0);
     expect(result.stdout,
@@ -141,9 +142,9 @@
     expect(result.stdout, contains('migrate '));
   });
 
-  test('help -v', () {
+  test('help -v', () async {
     p = project();
-    var result = p.runSync(['help', '-v']);
+    var result = await p.run(['help', '-v']);
 
     expect(result.exitCode, 0);
     expect(result.stdout,
diff --git a/pkg/dartdev/test/commands/format_test.dart b/pkg/dartdev/test/commands/format_test.dart
index 568f3ce..5331c6d 100644
--- a/pkg/dartdev/test/commands/format_test.dart
+++ b/pkg/dartdev/test/commands/format_test.dart
@@ -18,9 +18,9 @@
 
   tearDown(() => p?.dispose());
 
-  test('--help', () {
+  test('--help', () async {
     p = project();
-    var result = p.runSync(['format', '--help']);
+    var result = await p.run(['format', '--help']);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Idiomatically format Dart source code.'));
@@ -31,9 +31,9 @@
     expect(result.stdout.contains('--stdin-name'), isFalse);
   });
 
-  test('--help --verbose', () {
+  test('--help --verbose', () async {
     p = project();
-    var result = p.runSync(['format', '--help', '--verbose']);
+    var result = await p.run(['format', '--help', '--verbose']);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Idiomatically format Dart source code.'));
@@ -44,17 +44,17 @@
     expect(result.stdout, contains('--stdin-name'));
   });
 
-  test('unchanged', () {
+  test('unchanged', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
-    ProcessResult result = p.runSync(['format', p.relativeFilePath]);
+    ProcessResult result = await p.run(['format', p.relativeFilePath]);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, startsWith('Formatted 1 file (0 changed) in '));
   });
 
-  test('formatted', () {
+  test('formatted', () async {
     p = project(mainSrc: 'int get foo =>       1;\n');
-    ProcessResult result = p.runSync(['format', p.relativeFilePath]);
+    ProcessResult result = await p.run(['format', p.relativeFilePath]);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(
@@ -63,9 +63,9 @@
             'Formatted lib/main.dart\nFormatted 1 file (1 changed) in '));
   });
 
-  test('formatted with exit code set', () {
+  test('formatted with exit code set', () async {
     p = project(mainSrc: 'int get foo =>       1;\n');
-    ProcessResult result = p.runSync([
+    ProcessResult result = await p.run([
       'format',
       '--set-exit-if-changed',
       p.relativeFilePath,
@@ -78,9 +78,9 @@
             'Formatted lib/main.dart\nFormatted 1 file (1 changed) in '));
   });
 
-  test('not formatted with exit code set', () {
+  test('not formatted with exit code set', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
-    ProcessResult result = p.runSync([
+    ProcessResult result = await p.run([
       'format',
       '--set-exit-if-changed',
       p.relativeFilePath,
@@ -90,10 +90,10 @@
     expect(result.stdout, startsWith('Formatted 1 file (0 changed) in '));
   });
 
-  test('unknown file', () {
+  test('unknown file', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
     var unknownFilePath = '${p.relativeFilePath}-unknown-file.dart';
-    ProcessResult result = p.runSync(['format', unknownFilePath]);
+    ProcessResult result = await p.run(['format', unknownFilePath]);
     expect(result.exitCode, 0);
     expect(result.stderr,
         startsWith('No file or directory found at "$unknownFilePath".'));
diff --git a/pkg/dartdev/test/commands/help_test.dart b/pkg/dartdev/test/commands/help_test.dart
index 09c3c41..2202b56 100644
--- a/pkg/dartdev/test/commands/help_test.dart
+++ b/pkg/dartdev/test/commands/help_test.dart
@@ -26,10 +26,10 @@
       .commands
       .forEach((String commandKey, Command command) {
     if (!_commandsNotTested.contains(commandKey)) {
-      test('(help $commandKey == $commandKey --help)', () {
+      test('(help $commandKey == $commandKey --help)', () async {
         p = project();
-        var result = p.runSync(['help', commandKey]);
-        var verbHelpResult = p.runSync([commandKey, '--help']);
+        var result = await p.run(['help', commandKey]);
+        var verbHelpResult = await p.run([commandKey, '--help']);
 
         expect(result.stdout, contains(verbHelpResult.stdout));
         expect(result.stderr, contains(verbHelpResult.stderr));
@@ -37,20 +37,20 @@
     }
   });
 
-  test('(help test ~= test --help) outside project', () {
+  test('(help test ~= test --help) outside project', () async {
     p = project();
     p.deleteFile('pubspec.yaml');
-    var result = p.runSync(['help', 'test']);
-    var testHelpResult = p.runSync(['test', '--help']);
+    var result = await p.run(['help', 'test']);
+    var testHelpResult = await p.run(['test', '--help']);
 
     expect(testHelpResult.stdout, contains(result.stdout));
     expect(testHelpResult.stderr, contains(result.stderr));
   });
 
-  test('(help pub == pub --help)', () {
+  test('(help pub == pub --help)', () async {
     p = project();
-    var result = p.runSync(['help', 'pub']);
-    var pubHelpResult = p.runSync(['pub', '--help']);
+    var result = await p.run(['help', 'pub']);
+    var pubHelpResult = await p.run(['pub', '--help']);
 
     expect(result.stdout, contains(pubHelpResult.stdout));
     expect(result.stderr, contains(pubHelpResult.stderr));
diff --git a/pkg/dartdev/test/commands/migrate_test.dart b/pkg/dartdev/test/commands/migrate_test.dart
index 94795be..68475ee 100644
--- a/pkg/dartdev/test/commands/migrate_test.dart
+++ b/pkg/dartdev/test/commands/migrate_test.dart
@@ -19,9 +19,9 @@
 
   tearDown(() => p?.dispose());
 
-  test('--help', () {
+  test('--help', () async {
     p = project();
-    var result = p.runSync(['migrate', '--help']);
+    var result = await p.run(['migrate', '--help']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -35,9 +35,9 @@
     );
   });
 
-  test('--help --verbose', () {
+  test('--help --verbose', () async {
     p = project();
-    var result = p.runSync(['migrate', '--help', '--verbose']);
+    var result = await p.run(['migrate', '--help', '--verbose']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -53,43 +53,43 @@
     );
   });
 
-  test('directory implicit', () {
+  test('directory implicit', () async {
     p = project(mainSrc: dartVersionFilePrefix2_9 + 'int get foo => 1;\n');
     var result =
-        p.runSync(['migrate', '--no-web-preview'], workingDir: p.dirPath);
+        await p.run(['migrate', '--no-web-preview'], workingDir: p.dirPath);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Generating migration suggestions'));
   });
 
-  test('directory explicit', () {
+  test('directory explicit', () async {
     p = project(mainSrc: dartVersionFilePrefix2_9 + 'int get foo => 1;\n');
-    var result = p.runSync(['migrate', '--no-web-preview', p.dirPath]);
+    var result = await p.run(['migrate', '--no-web-preview', p.dirPath]);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Generating migration suggestions'));
   });
 
-  test('bad directory', () {
+  test('bad directory', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
-    var result = p.runSync(['migrate', 'foo_bar_dir']);
+    var result = await p.run(['migrate', 'foo_bar_dir']);
     expect(result.exitCode, 1);
     expect(result.stderr, contains('foo_bar_dir does not exist'));
     expect(result.stdout, isEmpty);
   });
 
-  test('pub get needs running', () {
+  test('pub get needs running', () async {
     p = project(mainSrc: 'import "package:foo/foo.dart";\n');
-    var result = p.runSync(['migrate', p.dirPath]);
+    var result = await p.run(['migrate', p.dirPath]);
     expect(result.exitCode, 1);
     expect(result.stderr, isEmpty);
     expect(result.stdout, runPubGet);
     expect(result.stdout, isNot(setLowerSdkConstraint));
   });
 
-  test('non-pub-related error', () {
+  test('non-pub-related error', () async {
     p = project(mainSrc: 'var missing = "semicolon"\n');
-    var result = p.runSync(['migrate', p.dirPath]);
+    var result = await p.run(['migrate', p.dirPath]);
     expect(result.exitCode, 1);
     expect(result.stderr, isEmpty);
     expect(result.stdout, runPubGet);
diff --git a/pkg/dartdev/test/commands/pub_test.dart b/pkg/dartdev/test/commands/pub_test.dart
index ab5b715..2eafe5e 100644
--- a/pkg/dartdev/test/commands/pub_test.dart
+++ b/pkg/dartdev/test/commands/pub_test.dart
@@ -25,8 +25,8 @@
     expect(result.stderr, isEmpty);
   }
 
-  test('implicit --help', () {
-    final result = project().runSync(['pub']);
+  test('implicit --help', () async {
+    final result = await project().run(['pub']);
     expect(result, isNotNull);
     expect(result.exitCode, 64);
     expect(result.stderr, contains('Missing subcommand for "dart pub".'));
@@ -34,18 +34,18 @@
     expect(result.stdout, isEmpty);
   });
 
-  test('--help', () {
-    _assertPubHelpInvoked(project().runSync(['pub', '--help']));
+  test('--help', () async {
+    _assertPubHelpInvoked(await project().run(['pub', '--help']));
   });
 
-  test('-h', () {
-    _assertPubHelpInvoked(project().runSync(['pub', '-h']));
+  test('-h', () async {
+    _assertPubHelpInvoked(await project().run(['pub', '-h']));
   });
 
-  test('help cache', () {
+  test('help cache', () async {
     p = project();
-    var result = p.runSync(['help', 'pub', 'cache']);
-    var result2 = p.runSync(['pub', 'cache', '--help']);
+    var result = await p.run(['help', 'pub', 'cache']);
+    var result2 = await p.run(['pub', 'cache', '--help']);
 
     expect(result.exitCode, 0);
 
@@ -56,10 +56,10 @@
     expect(result.stderr, result2.stderr);
   });
 
-  test('help publish', () {
+  test('help publish', () async {
     p = project();
-    var result = p.runSync(['help', 'pub', 'publish']);
-    var result2 = p.runSync(['pub', 'publish', '--help']);
+    var result = await p.run(['help', 'pub', 'publish']);
+    var result2 = await p.run(['pub', 'publish', '--help']);
 
     expect(result.exitCode, 0);
 
@@ -71,17 +71,17 @@
     expect(result.stderr, result2.stderr);
   });
 
-  test('failure', () {
+  test('failure', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
-    var result = p.runSync(['pub', 'deps']);
+    var result = await p.run(['pub', 'deps']);
     expect(result.exitCode, 65);
     expect(result.stdout, isEmpty);
     expect(result.stderr, contains('No pubspec.lock file found'));
   });
 
-  test('failure unknown option', () {
+  test('failure unknown option', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
-    var result = p.runSync(['pub', 'deps', '--foo']);
+    var result = await p.run(['pub', 'deps', '--foo']);
     expect(result.exitCode, 64);
     expect(result.stdout, isEmpty);
     expect(result.stderr, startsWith('Could not find an option named "foo".'));
diff --git a/pkg/dartdev/test/commands/run_test.dart b/pkg/dartdev/test/commands/run_test.dart
index 613a508..1e9b3e0 100644
--- a/pkg/dartdev/test/commands/run_test.dart
+++ b/pkg/dartdev/test/commands/run_test.dart
@@ -25,9 +25,9 @@
 
   tearDown(() => p?.dispose());
 
-  test('--help', () {
+  test('--help', () async {
     p = project();
-    var result = p.runSync(['run', '--help']);
+    var result = await p.run(['run', '--help']);
 
     expect(result.stdout, contains('Run a Dart program.'));
     expect(result.stdout, contains('Debugging options:'));
@@ -41,9 +41,9 @@
     expect(result.exitCode, 0);
   });
 
-  test('--help --verbose', () {
+  test('--help --verbose', () async {
     p = project();
-    var result = p.runSync(['run', '--help', '--verbose']);
+    var result = await p.run(['run', '--help', '--verbose']);
 
     expect(result.stdout, contains('Run a Dart program.'));
     expect(result.stdout, contains('Debugging options:'));
@@ -57,30 +57,30 @@
     expect(result.exitCode, 0);
   });
 
-  test("'Hello World'", () {
+  test("'Hello World'", () async {
     p = project(mainSrc: "void main() { print('Hello World'); }");
-    ProcessResult result = p.runSync(['run', p.relativeFilePath]);
+    ProcessResult result = await p.run(['run', p.relativeFilePath]);
 
     expect(result.stdout, contains('Hello World'));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
   });
 
-  test('no such file', () {
+  test('no such file', () async {
     p = project(mainSrc: "void main() { print('Hello World'); }");
     ProcessResult result =
-        p.runSync(['run', 'no/such/file/${p.relativeFilePath}']);
+        await p.run(['run', 'no/such/file/${p.relativeFilePath}']);
 
     expect(result.stderr, isNotEmpty);
     expect(result.exitCode, isNot(0));
   });
 
-  test('implicit packageName.dart', () {
+  test('implicit packageName.dart', () async {
     // TODO(jwren) circle back to reimplement this test if possible, the file
     // name (package name) will be the name of the temporary directory on disk
     p = project(mainSrc: "void main() { print('Hello World'); }");
     p.file('bin/main.dart', "void main() { print('Hello main.dart'); }");
-    ProcessResult result = p.runSync(['run']);
+    ProcessResult result = await p.run(['run']);
 
     expect(result.stdout, contains('Hello main.dart'));
     expect(result.stderr, isEmpty);
@@ -88,10 +88,10 @@
   }, skip: true);
 
   // Could not find the implicit file to run: bin
-  test('missing implicit packageName.dart', () {
+  test('missing implicit packageName.dart', () async {
     p = project(mainSrc: "void main() { print('Hello World'); }");
     p.file('bin/foo.dart', "void main() { print('Hello main.dart'); }");
-    ProcessResult result = p.runSync(['run']);
+    ProcessResult result = await p.run(['run']);
 
     expect(result.stdout, isEmpty);
     expect(
@@ -101,10 +101,10 @@
     expect(result.exitCode, 255);
   });
 
-  test('arguments are properly passed', () {
+  test('arguments are properly passed', () async {
     p = project();
     p.file('main.dart', 'void main(args) { print(args); }');
-    ProcessResult result = p.runSync([
+    ProcessResult result = await p.run([
       'run',
       '--enable-experiment=test-experiment',
       'main.dart',
@@ -118,7 +118,7 @@
     expect(result.exitCode, 0);
   });
 
-  test('from path-dependency with cyclic dependency', () {
+  test('from path-dependency with cyclic dependency', () async {
     p = project(name: 'foo');
     final bar = TestProject(name: 'bar');
     p.file('pubspec.yaml', '''
@@ -141,7 +141,7 @@
 void main(List<String> args) => print("$b $args");
 ''');
 
-      ProcessResult result = p.runSync(['run', 'bar:main', '--arg1', 'arg2']);
+      ProcessResult result = await p.run(['run', 'bar:main', '--arg1', 'arg2']);
 
       expect(result.stderr, isEmpty);
       expect(result.stdout, contains('FOO BAR [--arg1, arg2]'));
@@ -156,7 +156,7 @@
     p.file('main.dart', 'void main(args) { print(args); }');
     // Test with absolute path
     final name = path.join(p.dirPath, 'main.dart');
-    final result = p.runSync([
+    final result = await p.run([
       'run',
       '--enable-experiment=test-experiment',
       name,
@@ -175,7 +175,7 @@
     p.file('main.dart', 'void main(args) { print(args); }');
     // Test with File uri
     final name = path.join(p.dirPath, 'main.dart');
-    final result = p.runSync([
+    final result = await p.run([
       'run',
       Uri.file(name).toString(),
       '--argument1',
@@ -199,7 +199,7 @@
     //
     // This test ensures that allowed arguments for dart run which are valid VM
     // arguments are properly handled by the VM.
-    ProcessResult result = p.runSync([
+    ProcessResult result = await p.run([
       'run',
       '--observe',
       '--pause-isolates-on-start',
@@ -220,7 +220,7 @@
     expect(result.exitCode, 0);
 
     // Again, with --disable-service-auth-codes.
-    result = p.runSync([
+    result = await p.run([
       'run',
       '--observe',
       '--pause-isolates-on-start',
@@ -242,7 +242,7 @@
     expect(result.exitCode, 0);
 
     // Again, with IPv6.
-    result = p.runSync([
+    result = await p.run([
       'run',
       '--observe=8181/::1',
       '--pause-isolates-on-start',
@@ -269,7 +269,7 @@
 
     // Any VM flags not listed under 'dart run help --verbose' should be passed
     // before a dartdev command.
-    ProcessResult result = p.runSync([
+    ProcessResult result = await p.run([
       'run',
       '--vm-name=foo',
       p.relativeFilePath,
@@ -288,7 +288,7 @@
 
     // Any VM flags not listed under 'dart run help --verbose' should be passed
     // before a dartdev command.
-    ProcessResult result = p.runSync([
+    ProcessResult result = await p.run([
       'run',
       '--verbose_gc',
       p.relativeFilePath,
@@ -307,7 +307,7 @@
 
     // Ensure --enable-asserts doesn't cause the dartdev isolate to fail to
     // load. Regression test for: https://github.com/dart-lang/sdk/issues/42831
-    ProcessResult result = p.runSync([
+    ProcessResult result = await p.run([
       'run',
       '--enable-asserts',
       p.relativeFilePath,
@@ -322,7 +322,7 @@
     p = project(mainSrc: 'void main() { assert(false); }');
 
     // Any VM flags passed after the script shouldn't be interpreted by the VM.
-    ProcessResult result = p.runSync([
+    ProcessResult result = await p.run([
       'run',
       p.relativeFilePath,
       '--enable-asserts',
@@ -333,10 +333,10 @@
     expect(result.exitCode, 0);
   });
 
-  test('without verbose CFE info', () {
+  test('without verbose CFE info', () async {
     final p = project(mainSrc: '''void main() {}''');
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'run',
         '--verbosity=warning',
@@ -352,9 +352,9 @@
 
   group('DDS', () {
     group('disable', () {
-      test('dart run simple', () {
+      test('dart run simple', () async {
         p = project(mainSrc: "void main() { print('Hello World'); }");
-        ProcessResult result = p.runSync([
+        ProcessResult result = await p.run([
           'run',
           '--no-dds',
           '--enable-vm-service',
@@ -364,9 +364,9 @@
         expect(result.stdout, contains(observatoryMessagePrefix));
       });
 
-      test('dart simple', () {
+      test('dart simple', () async {
         p = project(mainSrc: "void main() { print('Hello World'); }");
-        ProcessResult result = p.runSync([
+        ProcessResult result = await p.run([
           '--no-dds',
           '--enable-vm-service',
           p.relativeFilePath,
@@ -377,9 +377,9 @@
     });
 
     group('explicit enable', () {
-      test('dart run simple', () {
+      test('dart run simple', () async {
         p = project(mainSrc: "void main() { print('Hello World'); }");
-        ProcessResult result = p.runSync([
+        ProcessResult result = await p.run([
           'run',
           '--dds',
           '--enable-vm-service',
@@ -389,9 +389,9 @@
         expect(result.stdout, contains(observatoryMessagePrefix));
       });
 
-      test('dart simple', () {
+      test('dart simple', () async {
         p = project(mainSrc: "void main() { print('Hello World'); }");
-        ProcessResult result = p.runSync([
+        ProcessResult result = await p.run([
           '--dds',
           '--enable-vm-service',
           p.relativeFilePath,
@@ -405,7 +405,7 @@
   group('DevTools', () {
     test('dart run simple', () async {
       p = project(mainSrc: "void main() { print('Hello World'); }");
-      ProcessResult result = p.runSync([
+      ProcessResult result = await p.run([
         'run',
         '--enable-vm-service',
         p.relativeFilePath,
@@ -415,7 +415,7 @@
 
     test('dart simple', () async {
       p = project(mainSrc: "void main() { print('Hello World'); }");
-      ProcessResult result = p.runSync([
+      ProcessResult result = await p.run([
         '--enable-vm-service',
         p.relativeFilePath,
       ]);
@@ -424,7 +424,7 @@
 
     test('dart run explicit', () async {
       p = project(mainSrc: "void main() { print('Hello World'); }");
-      ProcessResult result = p.runSync([
+      ProcessResult result = await p.run([
         'run',
         '--serve-devtools',
         '--enable-vm-service',
@@ -435,7 +435,7 @@
 
     test('dart explicit', () async {
       p = project(mainSrc: "void main() { print('Hello World'); }");
-      ProcessResult result = p.runSync([
+      ProcessResult result = await p.run([
         '--serve-devtools',
         '--enable-vm-service',
         p.relativeFilePath,
@@ -445,7 +445,7 @@
 
     test('dart run disabled', () async {
       p = project(mainSrc: "void main() { print('Hello World'); }");
-      ProcessResult result = p.runSync([
+      ProcessResult result = await p.run([
         'run',
         '--enable-vm-service',
         '--no-serve-devtools',
@@ -456,7 +456,7 @@
 
     test('dart disabled', () async {
       p = project(mainSrc: "void main() { print('Hello World'); }");
-      ProcessResult result = p.runSync([
+      ProcessResult result = await p.run([
         '--enable-vm-service',
         '--no-serve-devtools',
         p.relativeFilePath,
@@ -466,7 +466,7 @@
 
     test('dart run VM service not enabled', () async {
       p = project(mainSrc: "void main() { print('Hello World'); }");
-      ProcessResult result = p.runSync([
+      ProcessResult result = await p.run([
         'run',
         '--serve-devtools',
         p.relativeFilePath,
@@ -476,7 +476,7 @@
 
     test('dart VM service not enabled', () async {
       p = project(mainSrc: "void main() { print('Hello World'); }");
-      ProcessResult result = p.runSync([
+      ProcessResult result = await p.run([
         '--serve-devtools',
         p.relativeFilePath,
       ]);
diff --git a/pkg/dartdev/test/commands/test_test.dart b/pkg/dartdev/test/commands/test_test.dart
index bda022bb..634d2b9 100644
--- a/pkg/dartdev/test/commands/test_test.dart
+++ b/pkg/dartdev/test/commands/test_test.dart
@@ -21,10 +21,10 @@
 
   tearDown(() => p?.dispose());
 
-  test('--help', () {
+  test('--help', () async {
     p = project();
 
-    final result = p.runSync(['test', '--help']);
+    final result = await p.run(['test', '--help']);
 
     expect(result.exitCode, 0);
     expect(result.stdout, startsWith('''
@@ -35,22 +35,22 @@
     expect(result.stderr, isEmpty);
   });
 
-  test('dart help test', () {
+  test('dart help test', () async {
     p = project();
 
-    final result = p.runSync(['help', 'test']);
+    final result = await p.run(['help', 'test']);
 
     expect(result.exitCode, 0);
     expect(result.stdout, contains(' tests for a project'));
     expect(result.stderr, isEmpty);
   });
 
-  test('no pubspec.yaml', () {
+  test('no pubspec.yaml', () async {
     p = project();
     var pubspec = File(path.join(p.dirPath, 'pubspec.yaml'));
     pubspec.deleteSync();
 
-    var result = p.runSync(['test']);
+    var result = await p.run(['test']);
 
     expect(result.stderr, isEmpty);
     expect(result.stdout, '''
@@ -58,7 +58,7 @@
 ''');
     expect(result.exitCode, 65);
 
-    var resultHelp = p.runSync(['test', '--help']);
+    var resultHelp = await p.run(['test', '--help']);
 
     expect(resultHelp.stderr, isEmpty);
     expect(resultHelp.stdout, '''
@@ -74,7 +74,7 @@
     expect(resultHelp.exitCode, 65);
   });
 
-  test('runs test', () {
+  test('runs test', () async {
     p = project();
     p.file('test/foo_test.dart', '''
 import 'package:test/test.dart';
@@ -87,13 +87,14 @@
 ''');
 
     // An implicit `pub get` will happen.
-    final result = p.runSync(['test', '--no-color', '--reporter', 'expanded']);
+    final result =
+        await p.run(['test', '--no-color', '--reporter', 'expanded']);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('All tests passed!'));
     expect(result.exitCode, 0);
   });
 
-  test('no package:test dependency', () {
+  test('no package:test dependency', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
     p.file('pubspec.yaml', '''
 name: ${p.name}
@@ -110,7 +111,7 @@
 }
 ''');
 
-    final result = p.runSync(['test']);
+    final result = await p.run(['test']);
     expect(result.exitCode, 65);
     expect(
       result.stdout,
@@ -119,16 +120,17 @@
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 65);
 
-    final resultPubAdd = p.runSync(['pub', 'add', 'test']);
+    final resultPubAdd = await p.run(['pub', 'add', 'test']);
 
     expect(resultPubAdd.exitCode, 0);
-    final result2 = p.runSync(['test', '--no-color', '--reporter', 'expanded']);
+    final result2 =
+        await p.run(['test', '--no-color', '--reporter', 'expanded']);
     expect(result2.stderr, isEmpty);
     expect(result2.stdout, contains('All tests passed!'));
     expect(result2.exitCode, 0);
   });
 
-  test('has package:test dependency', () {
+  test('has package:test dependency', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
     p.file('test/foo_test.dart', '''
 $dartVersionFilePrefix2_9
@@ -142,15 +144,16 @@
 }
 ''');
 
-    final result = p.runSync(['test', '--no-color', '--reporter', 'expanded']);
+    final result =
+        await p.run(['test', '--no-color', '--reporter', 'expanded']);
     expect(result.exitCode, 0);
     expect(result.stdout, contains('All tests passed!'));
     expect(result.stderr, isEmpty);
   });
 
   group('--enable-experiment', () {
-    ProcessResult runTestWithExperimentFlag(String flag) {
-      return p.runSync([
+    Future<ProcessResult> runTestWithExperimentFlag(String flag) async {
+      return await p.run([
         if (flag != null) flag,
         'test',
         '--no-color',
@@ -159,21 +162,21 @@
       ]);
     }
 
-    void expectSuccess(String flag) {
-      final result = runTestWithExperimentFlag(flag);
+    Future<void> expectSuccess(String flag) async {
+      final result = await runTestWithExperimentFlag(flag);
       expect(result.stdout, contains('feature enabled'),
           reason: 'stderr: ${result.stderr}');
       expect(result.exitCode, 0,
           reason: 'stdout: ${result.stdout} stderr: ${result.stderr}');
     }
 
-    void expectFailure(String flag) {
-      final result = runTestWithExperimentFlag(flag);
+    Future<void> expectFailure(String flag) async {
+      final result = await runTestWithExperimentFlag(flag);
       expect(result.exitCode, isNot(0));
     }
 
     for (final experiment in experiments) {
-      test(experiment.name, () {
+      test(experiment.name, () async {
         final currentSdk = Version.parse(Platform.version.split(' ').first);
         p = project(
             mainSrc: experiment.validation,
@@ -190,12 +193,12 @@
 ''');
         if (experiment.enabledIn != null) {
           // The experiment has been released - enabling it should have no effect.
-          expectSuccess(null);
-          expectSuccess('--enable-experiment=${experiment.name}');
+          await expectSuccess(null);
+          await expectSuccess('--enable-experiment=${experiment.name}');
         } else {
-          expectFailure(null);
-          expectFailure('--enable-experiment=no-${experiment.name}');
-          expectSuccess('--enable-experiment=${experiment.name}');
+          await expectFailure(null);
+          await expectFailure('--enable-experiment=no-${experiment.name}');
+          await expectSuccess('--enable-experiment=${experiment.name}');
         }
       });
     }
diff --git a/pkg/dartdev/test/load_from_dill_test.dart b/pkg/dartdev/test/load_from_dill_test.dart
index 6de6c6c..633e7af 100644
--- a/pkg/dartdev/test/load_from_dill_test.dart
+++ b/pkg/dartdev/test/load_from_dill_test.dart
@@ -14,13 +14,13 @@
   tearDown(() => p?.dispose());
 
   test("Fallback to dartdev.dill from dartdev.dart.snapshot for 'Hello World'",
-      () {
+      () async {
     p = project(mainSrc: "void main() { print('Hello World'); }");
-    // The DartDev snapshot includes the --use-bare-instructions flag. If
-    // --no-use-bare-instructions is passed, the VM will fail to load the
+    // The DartDev snapshot includes the --use_field_guards flag. If
+    // --no-use-field-guards is passed, the VM will fail to load the
     // snapshot and should fall back to using the DartDev dill file.
     ProcessResult result =
-        p.runSync(['--no-use-bare-instructions', 'run', p.relativeFilePath]);
+        await p.run(['--no-use-field-guards', 'run', p.relativeFilePath]);
 
     expect(result.stdout, contains('Hello World'));
     expect(result.stderr, isEmpty);
diff --git a/pkg/dartdev/test/no_such_file_test.dart b/pkg/dartdev/test/no_such_file_test.dart
index b5a3452..9b2edc4 100644
--- a/pkg/dartdev/test/no_such_file_test.dart
+++ b/pkg/dartdev/test/no_such_file_test.dart
@@ -11,25 +11,25 @@
 
   tearDown(() => p?.dispose());
 
-  test('Ensure parsing fails after encountering invalid file', () {
+  test('Ensure parsing fails after encountering invalid file', () async {
     // Regression test for https://github.com/dart-lang/sdk/issues/43991
     p = project();
-    final noArgsResult = p.runSync(['foo.dart']);
+    final noArgsResult = await p.run(['foo.dart']);
     expect(noArgsResult.stderr, isNotEmpty);
     expect(noArgsResult.stdout, isEmpty);
     expect(noArgsResult.exitCode, 64);
 
-    final argsResult = p.runSync(['foo.dart', '--bar']);
+    final argsResult = await p.run(['foo.dart', '--bar']);
     expect(argsResult.stderr, noArgsResult.stderr);
     expect(argsResult.stdout, isEmpty);
     expect(argsResult.exitCode, 64);
   });
 
   test('Providing --snapshot VM option with invalid script fails gracefully',
-      () {
+      () async {
     // Regression test for https://github.com/dart-lang/sdk/issues/43785
     p = project();
-    final result = p.runSync(['--snapshot=abc', 'foo.dart']);
+    final result = await p.run(['--snapshot=abc', 'foo.dart']);
     expect(result.stderr, isNotEmpty);
     expect(result.stderr, contains("Error when reading 'foo.dart':"));
     expect(result.stdout, isEmpty);
diff --git a/pkg/dartdev/test/utils.dart b/pkg/dartdev/test/utils.dart
index 73f944f..fe656a5 100644
--- a/pkg/dartdev/test/utils.dart
+++ b/pkg/dartdev/test/utils.dart
@@ -51,6 +51,8 @@
 
   final Map<String, dynamic> pubspec;
 
+  Process _process;
+
   TestProject(
       {String mainSrc,
       String analysisOptions,
@@ -92,24 +94,34 @@
   }
 
   void dispose() {
+    _process?.kill();
+    _process = null;
     if (dir.existsSync()) {
       dir.deleteSync(recursive: true);
     }
   }
 
-  ProcessResult runSync(
+  Future<ProcessResult> run(
     List<String> arguments, {
     String workingDir,
-  }) {
-    return Process.runSync(
+  }) async {
+    _process = await Process.start(
         Platform.resolvedExecutable,
         [
           '--no-analytics',
           ...arguments,
         ],
         workingDirectory: workingDir ?? dir.path,
-        environment: {if (logAnalytics) '_DARTDEV_LOG_ANALYTICS': 'true'},
-        stdoutEncoding: utf8);
+        environment: {if (logAnalytics) '_DARTDEV_LOG_ANALYTICS': 'true'});
+    final stdoutContents = _process.stdout.transform(utf8.decoder).join();
+    final stderrContents = _process.stderr.transform(utf8.decoder).join();
+    final code = await _process.exitCode;
+    return ProcessResult(
+      _process.pid,
+      code,
+      await stdoutContents,
+      await stderrContents,
+    );
   }
 
   Future<Process> start(
diff --git a/pkg/dds/CHANGELOG.md b/pkg/dds/CHANGELOG.md
index cccc7a8..0b7db0f 100644
--- a/pkg/dds/CHANGELOG.md
+++ b/pkg/dds/CHANGELOG.md
@@ -1,3 +1,9 @@
+# 2.1.5
+- Update to new CpuSamplesEvent format for CPU sample caching for improved
+  performance.
+- Add additional context in the case of failure to ascii decode headers caused
+  by utf8 content on the stream.
+
 # 2.1.4
 - A new library `package:dds/dap.dart` exposes classes required to build a custom DAP
   debug-adapter on top of the base Dart DAP functionality in DDS.
diff --git a/pkg/dds/lib/src/cpu_samples_manager.dart b/pkg/dds/lib/src/cpu_samples_manager.dart
index a0c413a..108da99 100644
--- a/pkg/dds/lib/src/cpu_samples_manager.dart
+++ b/pkg/dds/lib/src/cpu_samples_manager.dart
@@ -52,21 +52,31 @@
     int bufferSize = 1000000,
   ]) : super(bufferSize);
 
-  void cacheSamples(CpuSamples samples) {
-    String getFunctionId(ProfileFunction function) {
-      final functionObject = function.function;
-      if (functionObject is NativeFunction) {
-        return 'native/${functionObject.name}';
-      }
-      return functionObject.id!;
-    }
+  ProfileFunction _buildProfileFunction(dynamic function) {
+    // `kind` and `resolvedUrl` are populated in `populateFunctionDetails()`.
+    return ProfileFunction(
+      kind: '',
+      inclusiveTicks: -1,
+      exclusiveTicks: -1,
+      resolvedUrl: '',
+      function: function,
+    );
+  }
 
+  String _getFunctionId(dynamic function) {
+    if (function is NativeFunction) {
+      return 'native/${function.name}';
+    }
+    return function.id!;
+  }
+
+  void cacheSamples(CpuSamplesEvent samples) {
     // Initialize upon seeing our first samples.
     if (functions.isEmpty) {
       samplePeriod = samples.samplePeriod!;
       maxStackDepth = samples.maxStackDepth!;
       pid = samples.pid!;
-      functions.addAll(samples.functions!);
+      functions.addAll(samples.functions!.map(_buildProfileFunction));
 
       // Build the initial id to function index mapping. This allows for us to
       // lookup a ProfileFunction in the global function list stored in this
@@ -77,7 +87,7 @@
       // TODO(bkonyi): investigate creating some form of stable ID for
       // Functions tied to closures.
       for (int i = 0; i < functions.length; ++i) {
-        idToFunctionIndex[getFunctionId(functions[i])] = i;
+        idToFunctionIndex[_getFunctionId(functions[i].function)] = i;
       }
 
       // Clear tick information as we'll need to recalculate these values later
@@ -94,14 +104,14 @@
 
       // Check to see if we've got a function object we've never seen before.
       for (int i = 0; i < newFunctions.length; ++i) {
-        final key = getFunctionId(newFunctions[i]);
+        final key = _getFunctionId(newFunctions[i]);
         if (!idToFunctionIndex.containsKey(key)) {
           idToFunctionIndex[key] = functions.length;
           // Keep track of the original index and the location of the function
           // in the master function list so we can update the function indicies
           // for each sample in this batch.
           indexMapping[i] = functions.length;
-          functions.add(newFunctions[i]);
+          functions.add(_buildProfileFunction(newFunctions[i]));
 
           // Reset tick state as we'll recalculate later.
           functions.last.inclusiveTicks = 0;
@@ -159,6 +169,28 @@
     return evicted;
   }
 
+  Future<void> populateFunctionDetails(
+      DartDevelopmentServiceImpl dds, String isolateId) async {
+    final cpuSamples = await dds.vmServiceClient.sendRequest('getCpuSamples', {
+      'isolateId': isolateId,
+      'timeOriginMicros': 0,
+      'timeExtentMicros': 0,
+    });
+    final fullFunctions = cpuSamples['functions'];
+    for (final func in fullFunctions) {
+      final profileFunc = ProfileFunction.parse(func)!;
+      final id = _getFunctionId(profileFunc.function!);
+      final index = idToFunctionIndex[id];
+      if (index == null) {
+        continue;
+      }
+      final result = functions[index];
+      result.kind = profileFunc.kind;
+      result.resolvedUrl = profileFunc.resolvedUrl;
+      result.function = profileFunc.function;
+    }
+  }
+
   Map<String, dynamic> toJson() {
     return {
       'type': 'CachedCpuSamples',
diff --git a/pkg/dds/lib/src/dap/adapters/dart.dart b/pkg/dds/lib/src/dap/adapters/dart.dart
index 67be4b5..523cadf 100644
--- a/pkg/dds/lib/src/dap/adapters/dart.dart
+++ b/pkg/dds/lib/src/dap/adapters/dart.dart
@@ -8,11 +8,11 @@
 
 import 'package:collection/collection.dart';
 import 'package:meta/meta.dart';
-import 'package:package_config/package_config.dart';
 import 'package:path/path.dart' as path;
 import 'package:vm_service/vm_service.dart' as vm;
 
 import '../../../dds.dart';
+import '../../rpc_error_codes.dart';
 import '../base_debug_adapter.dart';
 import '../exceptions.dart';
 import '../isolate_manager.dart';
@@ -49,6 +49,16 @@
 /// will work.
 const threadExceptionExpression = r'$_threadException';
 
+/// Typedef for handlers of VM Service stream events.
+typedef _StreamEventHandler<T> = FutureOr<void> Function(T data);
+
+/// A null result passed to `sendResponse` functions when there is no result.
+///
+/// Because the signature of `sendResponse` is generic, an argument must be
+/// provided even when the generic type is `void`. This value is used to make
+/// it clearer in calling code that the result is unused.
+const _noResult = null;
+
 /// Pattern for extracting useful error messages from an evaluation exception.
 final _evalErrorMessagePattern = RegExp('Error: (.*)');
 
@@ -139,6 +149,9 @@
   final String? name;
   final String? cwd;
 
+  /// Environment variables to pass to the launched process.
+  final Map<String, String>? env;
+
   /// Paths that should be considered the users local code.
   ///
   /// These paths will generally be all of the open folders in the users editor
@@ -189,6 +202,8 @@
     required this.restart,
     required this.name,
     required this.cwd,
+    // TODO(dantup): This can be made required after Flutter DAP is passing it.
+    this.env,
     required this.additionalProjectPaths,
     required this.debugSdkLibraries,
     required this.debugExternalPackageLibraries,
@@ -201,6 +216,7 @@
       : restart = obj['restart'],
         name = obj['name'] as String?,
         cwd = obj['cwd'] as String?,
+        env = obj['env'] as Map<String, String>?,
         additionalProjectPaths =
             (obj['additionalProjectPaths'] as List?)?.cast<String>(),
         debugSdkLibraries = obj['debugSdkLibraries'] as bool?,
@@ -216,6 +232,7 @@
         if (restart != null) 'restart': restart,
         if (name != null) 'name': name,
         if (cwd != null) 'cwd': cwd,
+        if (env != null) 'env': env,
         if (additionalProjectPaths != null)
           'additionalProjectPaths': additionalProjectPaths,
         if (debugSdkLibraries != null) 'debugSdkLibraries': debugSdkLibraries,
@@ -354,6 +371,17 @@
 
   late final sendLogsToClient = args.sendLogsToClient ?? false;
 
+  /// Whether or not the DAP is terminating.
+  ///
+  /// When set to `true`, some requests that return "Service Disappeared" errors
+  /// will be caught and dropped as these are expected if the process is
+  /// terminating.
+  ///
+  /// This flag may be set by incoming requests from the client
+  /// (terminateRequest/disconnectRequest) or when a process terminates, or the
+  /// VM Service disconnects.
+  bool isTerminating = false;
+
   DartDebugAdapter(
     ByteStreamServerChannel channel, {
     this.ipv6 = false,
@@ -531,16 +559,20 @@
     this.vmService = vmService;
 
     unawaited(vmService.onDone.then((_) => _handleVmServiceClosed()));
+
+    // Handlers must be wrapped to handle Service Disappeared errors if async
+    // code tries to call the VM Service after termination begins.
+    final wrap = _wrapHandlerWithErrorHandling;
     _subscriptions.addAll([
-      vmService.onIsolateEvent.listen(handleIsolateEvent),
-      vmService.onDebugEvent.listen(handleDebugEvent),
-      vmService.onLoggingEvent.listen(handleLoggingEvent),
-      vmService.onExtensionEvent.listen(handleExtensionEvent),
-      vmService.onServiceEvent.listen(handleServiceEvent),
+      vmService.onIsolateEvent.listen(wrap(handleIsolateEvent)),
+      vmService.onDebugEvent.listen(wrap(handleDebugEvent)),
+      vmService.onLoggingEvent.listen(wrap(handleLoggingEvent)),
+      vmService.onExtensionEvent.listen(wrap(handleExtensionEvent)),
+      vmService.onServiceEvent.listen(wrap(handleServiceEvent)),
       if (_subscribeToOutputStreams)
-        vmService.onStdoutEvent.listen(_handleStdoutEvent),
+        vmService.onStdoutEvent.listen(wrap(_handleStdoutEvent)),
       if (_subscribeToOutputStreams)
-        vmService.onStderrEvent.listen(_handleStderrEvent),
+        vmService.onStderrEvent.listen(wrap(_handleStderrEvent)),
     ]);
     await Future.wait([
       vmService.streamListen(vm.EventStreams.kIsolate),
@@ -558,8 +590,20 @@
     // Let the subclass do any existing setup once we have a connection.
     await debuggerConnected(vmInfo);
 
-    // Process any existing isolates that may have been created before the
-    // streams above were set up.
+    await _withErrorHandling(
+      () => _configureExistingIsolates(vmService, vmInfo, resumeIfStarting),
+    );
+
+    _debuggerInitializedCompleter.complete();
+  }
+
+  /// Process any existing isolates that may have been created before the
+  /// streams above were set up.
+  Future<void> _configureExistingIsolates(
+    vm.VmService vmService,
+    vm.VM vmInfo,
+    bool resumeIfStarting,
+  ) async {
     final existingIsolateRefs = vmInfo.isolates;
     final existingIsolates = existingIsolateRefs != null
         ? await Future.wait(existingIsolateRefs
@@ -596,8 +640,6 @@
         }
       }
     }));
-
-    _debuggerInitializedCompleter.complete();
   }
 
   /// Handles the clients "continue" ("resume") request for the thread in
@@ -632,26 +674,26 @@
   ) async {
     switch (request.command) {
 
-      /// Used by tests to validate available protocols (e.g. DDS). There may be
-      /// value in making this available to clients in future, but for now it's
-      /// internal.
+      // Used by tests to validate available protocols (e.g. DDS). There may be
+      // value in making this available to clients in future, but for now it's
+      // internal.
       case '_getSupportedProtocols':
         final protocols = await vmService?.getSupportedProtocols();
         sendResponse(protocols?.toJson());
         break;
 
-      /// Used to toggle debug settings such as whether SDK/Packages are
-      /// debuggable while the session is in progress.
+      // Used to toggle debug settings such as whether SDK/Packages are
+      // debuggable while the session is in progress.
       case 'updateDebugOptions':
         if (args != null) {
           await _updateDebugOptions(args.args);
         }
-        sendResponse(null);
+        sendResponse(_noResult);
         break;
 
-      /// Allows an editor to call a service/service extension that it was told
-      /// about via a custom 'dart.serviceRegistered' or
-      /// 'dart.serviceExtensionAdded' event.
+      // Allows an editor to call a service/service extension that it was told
+      // about via a custom 'dart.serviceRegistered' or
+      // 'dart.serviceExtensionAdded' event.
       case 'callService':
         final method = args?.args['method'] as String?;
         if (method == null) {
@@ -667,6 +709,15 @@
         sendResponse(response?.json);
         break;
 
+      // Used to reload sources for all isolates. This supports Hot Reload for
+      // Dart apps. Flutter's DAP handles this command itself (and sends it
+      // through the run daemon) as it needs to perform additional work to
+      // rebuild widgets afterwards.
+      case 'hotReload':
+        await _isolateManager.reloadSources();
+        sendResponse(_noResult);
+        break;
+
       default:
         await super.customRequest(request, args, sendResponse);
     }
@@ -695,6 +746,8 @@
     DisconnectArguments? args,
     void Function() sendResponse,
   ) async {
+    isTerminating = true;
+
     await disconnectImpl();
     await shutdown();
     sendResponse();
@@ -839,6 +892,7 @@
       return;
     }
 
+    isTerminating = true;
     _hasSentTerminatedEvent = true;
     // Always add a leading newline since the last written text might not have
     // had one.
@@ -901,12 +955,13 @@
   /// 'additionalProjectPaths' in the launch arguments. An editor should include
   /// the paths of all open workspace folders in 'additionalProjectPaths' to
   /// support this feature correctly.
-  bool isExternalPackageLibrary(Uri uri) {
+  Future<bool> isExternalPackageLibrary(ThreadInfo thread, Uri uri) async {
     if (!uri.isScheme('package')) {
       return false;
     }
-    final libraryPath = resolvePackageUri(uri);
-    if (libraryPath == null) {
+
+    final packagePath = await thread.resolveUriToPackageLibPath(uri);
+    if (packagePath == null) {
       return false;
     }
 
@@ -914,9 +969,10 @@
     // may have returned different casing (e.g. Windows drive letters). It's
     // almost certain a user wouldn't have a "local" package and an "external"
     // package with paths differing only be case.
-    final libraryPathLower = libraryPath.toLowerCase();
-    return !projectPaths.any((projectPath) =>
-        path.isWithin(projectPath.toLowerCase(), libraryPathLower));
+    final packagePathLower = packagePath.toLowerCase();
+    return !projectPaths
+        .map((projectPath) => projectPath.toLowerCase())
+        .any((projectPath) => path.isWithin(projectPath, packagePathLower));
   }
 
   /// Checks whether this library is from the SDK.
@@ -954,10 +1010,10 @@
   ///
   /// Initial values are provided in the launch arguments, but may be updated
   /// by the `updateDebugOptions` custom request.
-  bool libaryIsDebuggable(Uri uri) {
+  Future<bool> libraryIsDebuggable(ThreadInfo thread, Uri uri) async {
     if (isSdkLibrary(uri)) {
       return _isolateManager.debugSdkLibraries;
-    } else if (isExternalPackageLibrary(uri)) {
+    } else if (await isExternalPackageLibrary(thread, uri)) {
       return _isolateManager.debugExternalPackageLibraries;
     } else {
       return true;
@@ -976,12 +1032,6 @@
     sendResponse();
   }
 
-  /// Resolves a `package: URI` to the real underlying source path.
-  ///
-  /// Returns `null` if no mapping was possible, for example if the package is
-  /// not in the package mapping file.
-  String? resolvePackageUri(Uri uri) => _converter.resolvePackageUri(uri);
-
   /// restart is called by the client when the user invokes a restart (for
   /// example with the button on the debug toolbar).
   ///
@@ -1248,6 +1298,15 @@
           (frame) => frame.kind == vm.FrameKind.kAsyncSuspensionMarker,
         );
 
+        // Pre-resolve all URIs in batch so the call below does not trigger
+        // many requests to the server.
+        final allUris = frames
+            .map((frame) => frame.location?.script?.uri)
+            .whereNotNull()
+            .map(Uri.parse)
+            .toList();
+        await thread.resolveUrisToPathsBatch(allUris);
+
         Future<StackFrame> convert(int index, vm.Frame frame) async {
           return _converter.convertVmToDapStackFrame(
             thread,
@@ -1318,6 +1377,8 @@
     TerminateArguments? args,
     void Function() sendResponse,
   ) async {
+    isTerminating = true;
+
     await terminateImpl();
     await shutdown();
     sendResponse();
@@ -1346,14 +1407,12 @@
 
   /// Sets the package config file to use for `package: URI` resolution.
   ///
-  /// TODO(dantup): Remove this once
-  ///   https://github.com/dart-lang/sdk/issues/45530 is done as it will not be
-  ///   necessary.
+  /// It is no longer necessary to call this method as the package config file
+  /// is no longer used. URI lookups are done via the VM Service.
+  @Deprecated('No longer necessary, URI lookups are done via VM Service')
   void usePackageConfigFile(File packageConfig) {
-    _converter.packageConfig = PackageConfig.parseString(
-      packageConfig.readAsStringSync(),
-      Uri.file(packageConfig.path),
-    );
+    // TODO(dantup): Remove this method after Flutter DA is updated not to use
+    // it.
   }
 
   /// [variablesRequest] is called by the client to request child variables for
@@ -1661,6 +1720,7 @@
   }
 
   Future<void> _handleVmServiceClosed() async {
+    isTerminating = true;
     if (terminateOnVmServiceClose) {
       handleSessionTerminate();
     }
@@ -1767,6 +1827,40 @@
       streamClosed: streamClosedCompleter.future,
     );
   }
+
+  /// Wraps a function with an error handler that handles errors that occur when
+  /// the VM Service/DDS shuts down.
+  ///
+  /// When the debug adapter is terminating, it's possible in-flight requests
+  /// triggered by handlers will fail with "Service Disappeared". This is
+  /// normal and such errors can be ignored, rather than allowed to pass
+  /// uncaught.
+  _StreamEventHandler<T> _wrapHandlerWithErrorHandling<T>(
+    _StreamEventHandler<T> handler,
+  ) {
+    return (data) => _withErrorHandling(() => handler(data));
+  }
+
+  /// Calls a function with an error handler that handles errors that occur when
+  /// the VM Service/DDS shuts down.
+  ///
+  /// When the debug adapter is terminating, it's possible in-flight requests
+  /// will fail with "Service Disappeared". This is normal and such errors can
+  /// be ignored, rather than allowed to pass uncaught.
+  FutureOr<T?> _withErrorHandling<T>(FutureOr<T> Function() func) async {
+    try {
+      return await func();
+    } on vm.RPCError catch (e) {
+      // If we're been asked to shut down while this request was occurring,
+      // it's normal to get kServiceDisappeared so we should handle this
+      // silently.
+      if (isTerminating && e.code == RpcErrorCodes.kServiceDisappeared) {
+        return null;
+      }
+
+      rethrow;
+    }
+  }
 }
 
 /// An implementation of [LaunchRequestArguments] that includes all fields used
@@ -1794,6 +1888,15 @@
   /// the VM or Flutter tool).
   final List<String>? toolArgs;
 
+  /// Arguments to be passed directly to the Dart VM that will run [program].
+  ///
+  /// Unlike [toolArgs] which always go after the complete tool, these args
+  /// always go directly after `dart`:
+  ///
+  ///   - dart {vmAdditionalArgs} {toolArgs}
+  ///   - dart {vmAdditionalArgs} run test:test {toolArgs}
+  final List<String>? vmAdditionalArgs;
+
   final int? vmServicePort;
 
   final bool? enableAsserts;
@@ -1810,17 +1913,39 @@
   /// simplest) way, but prevents the user from being able to type into `stdin`.
   final String? console;
 
+  /// An optional tool to run instead of "dart".
+  ///
+  /// In combination with [customToolReplacesArgs] allows invoking a custom
+  /// tool instead of "dart" to launch scripts/tests. The custom tool must be
+  /// completely compatible with the tool/command it is replacing.
+  ///
+  /// This field should be a full absolute path if the tool may not be available
+  /// in `PATH`.
+  final String? customTool;
+
+  /// The number of arguments to delete from the beginning of the argument list
+  /// when invoking [customTool].
+  ///
+  /// For example, setting [customTool] to `dart_test` and
+  /// `customToolReplacesArgs` to `2` for a test run would invoke
+  /// `dart_test foo_test.dart` instead of `dart run test:test foo_test.dart`.
+  final int? customToolReplacesArgs;
+
   DartLaunchRequestArguments({
     this.noDebug,
     required this.program,
     this.args,
     this.vmServicePort,
     this.toolArgs,
+    this.vmAdditionalArgs,
     this.console,
     this.enableAsserts,
+    this.customTool,
+    this.customToolReplacesArgs,
     Object? restart,
     String? name,
     String? cwd,
+    Map<String, String>? env,
     List<String>? additionalProjectPaths,
     bool? debugSdkLibraries,
     bool? debugExternalPackageLibraries,
@@ -1831,6 +1956,7 @@
           restart: restart,
           name: name,
           cwd: cwd,
+          env: env,
           additionalProjectPaths: additionalProjectPaths,
           debugSdkLibraries: debugSdkLibraries,
           debugExternalPackageLibraries: debugExternalPackageLibraries,
@@ -1844,9 +1970,12 @@
         program = obj['program'] as String,
         args = (obj['args'] as List?)?.cast<String>(),
         toolArgs = (obj['toolArgs'] as List?)?.cast<String>(),
+        vmAdditionalArgs = (obj['vmAdditionalArgs'] as List?)?.cast<String>(),
         vmServicePort = obj['vmServicePort'] as int?,
         console = obj['console'] as String?,
         enableAsserts = obj['enableAsserts'] as bool?,
+        customTool = obj['customTool'] as String?,
+        customToolReplacesArgs = obj['customToolReplacesArgs'] as int?,
         super.fromMap(obj);
 
   @override
@@ -1856,9 +1985,13 @@
         'program': program,
         if (args != null) 'args': args,
         if (toolArgs != null) 'toolArgs': toolArgs,
+        if (vmAdditionalArgs != null) 'vmAdditionalArgs': vmAdditionalArgs,
         if (vmServicePort != null) 'vmServicePort': vmServicePort,
         if (console != null) 'console': console,
         if (enableAsserts != null) 'enableAsserts': enableAsserts,
+        if (customTool != null) 'customTool': customTool,
+        if (customToolReplacesArgs != null)
+          'customToolReplacesArgs': customToolReplacesArgs,
       };
 
   static DartLaunchRequestArguments fromJson(Map<String, Object?> obj) =>
diff --git a/pkg/dds/lib/src/dap/adapters/dart_cli_adapter.dart b/pkg/dds/lib/src/dap/adapters/dart_cli_adapter.dart
index 3dca392..46e28e3 100644
--- a/pkg/dds/lib/src/dap/adapters/dart_cli_adapter.dart
+++ b/pkg/dds/lib/src/dap/adapters/dart_cli_adapter.dart
@@ -5,6 +5,7 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
+import 'dart:math' as math;
 
 import 'package:path/path.dart' as path;
 import 'package:pedantic/pedantic.dart';
@@ -76,7 +77,6 @@
   /// breakpoints, and resume.
   Future<void> launchImpl() async {
     final args = this.args as DartLaunchRequestArguments;
-    final vmPath = Platform.resolvedExecutable;
     File? vmServiceInfoFile;
 
     final debug = !(args.noDebug ?? false);
@@ -87,6 +87,7 @@
     }
 
     final vmArgs = <String>[
+      ...?args.vmAdditionalArgs,
       if (debug) ...[
         '--enable-vm-service=${args.vmServicePort ?? 0}${ipv6 ? '/::1' : ''}',
         '--pause_isolates_on_start',
@@ -101,6 +102,14 @@
       // editor-spawned debug sessions.
       if (args.enableAsserts ?? true) '--enable-asserts',
     ];
+
+    // Handle customTool and deletion of any arguments for it.
+    final executable = args.customTool ?? Platform.resolvedExecutable;
+    final removeArgs = args.customToolReplacesArgs;
+    if (args.customTool != null && removeArgs != null) {
+      vmArgs.removeRange(0, math.min(removeArgs, vmArgs.length));
+    }
+
     final processArgs = [
       ...vmArgs,
       ...?args.toolArgs,
@@ -108,18 +117,6 @@
       ...?args.args,
     ];
 
-    // Find the package_config file for this script.
-    // TODO(dantup): Remove this once
-    //   https://github.com/dart-lang/sdk/issues/45530 is done as it will not be
-    //   necessary.
-    var possibleRoot = path.isAbsolute(args.program)
-        ? path.dirname(args.program)
-        : path.dirname(path.normalize(path.join(args.cwd ?? '', args.program)));
-    final packageConfig = findPackageConfigFile(possibleRoot);
-    if (packageConfig != null) {
-      this.usePackageConfigFile(packageConfig);
-    }
-
     // If the client supports runInTerminal and args.console is set to either
     // 'terminal' or 'runInTerminal' we won't run the process ourselves, but
     // instead call the client to run it for us (this allows it to run in a
@@ -136,12 +133,22 @@
                 : null
         : null;
 
-    // TODO(dantup): Support passing env to both of these.
-
     if (terminalKind != null) {
-      await launchInEditorTerminal(debug, terminalKind, vmPath, processArgs);
+      await launchInEditorTerminal(
+        debug,
+        terminalKind,
+        executable,
+        processArgs,
+        workingDirectory: args.cwd,
+        env: args.env,
+      );
     } else {
-      await launchAsProcess(vmPath, processArgs);
+      await launchAsProcess(
+        executable,
+        processArgs,
+        workingDirectory: args.cwd,
+        env: args.env,
+      );
     }
 
     // Delay responding until the debugger is connected.
@@ -166,18 +173,6 @@
       return;
     }
 
-    // Find the package_config file for this script.
-    // TODO(dantup): Remove this once
-    //   https://github.com/dart-lang/sdk/issues/45530 is done as it will not be
-    //   necessary.
-    final cwd = args.cwd;
-    if (cwd != null) {
-      final packageConfig = findPackageConfigFile(cwd);
-      if (packageConfig != null) {
-        this.usePackageConfigFile(packageConfig);
-      }
-    }
-
     final uri = vmServiceUri != null
         ? Uri.parse(vmServiceUri)
         : await waitForVmServiceInfoFile(logger, File(vmServiceInfoFile!));
@@ -190,11 +185,13 @@
   Future<void> launchInEditorTerminal(
     bool debug,
     String terminalKind,
-    String vmPath,
-    List<String> processArgs,
-  ) async {
+    String executable,
+    List<String> processArgs, {
+    required String? workingDirectory,
+    required Map<String, String>? env,
+  }) async {
     final args = this.args as DartLaunchRequestArguments;
-    logger?.call('Spawning $vmPath with $processArgs in ${args.cwd}'
+    logger?.call('Spawning $executable with $processArgs in $workingDirectory'
         ' via client ${terminalKind} terminal');
 
     // runInTerminal is a DAP request that goes from server-to-client that
@@ -203,8 +200,9 @@
     // for debugging will rely on the process writing the service-info file that
     // we can detect with the normal watching code.
     final requestArgs = RunInTerminalRequestArguments(
-      args: [vmPath, ...processArgs],
-      cwd: args.cwd ?? path.dirname(args.program),
+      args: [executable, ...processArgs],
+      cwd: workingDirectory ?? path.dirname(args.program),
+      env: env,
       kind: terminalKind,
       title: args.name ?? 'Dart',
     );
@@ -234,12 +232,18 @@
   ///
   /// Output to `stdout`/`stderr` will be sent to the editor using
   /// [OutputEvent]s.
-  Future<void> launchAsProcess(String vmPath, List<String> processArgs) async {
-    logger?.call('Spawning $vmPath with $processArgs in ${args.cwd}');
+  Future<void> launchAsProcess(
+    String executable,
+    List<String> processArgs, {
+    required String? workingDirectory,
+    required Map<String, String>? env,
+  }) async {
+    logger?.call('Spawning $executable with $processArgs in $workingDirectory');
     final process = await Process.start(
-      vmPath,
+      executable,
       processArgs,
-      workingDirectory: args.cwd,
+      workingDirectory: workingDirectory,
+      environment: env,
     );
     _process = process;
     pidsToTerminate.add(process.pid);
diff --git a/pkg/dds/lib/src/dap/adapters/dart_test_adapter.dart b/pkg/dds/lib/src/dap/adapters/dart_test_adapter.dart
index 9e517da..0f67af4 100644
--- a/pkg/dds/lib/src/dap/adapters/dart_test_adapter.dart
+++ b/pkg/dds/lib/src/dap/adapters/dart_test_adapter.dart
@@ -5,8 +5,8 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
+import 'dart:math' as math;
 
-import 'package:path/path.dart' as path;
 import 'package:pedantic/pedantic.dart';
 import 'package:vm_service/vm_service.dart' as vm;
 
@@ -73,7 +73,6 @@
   /// breakpoints, and resume.
   Future<void> launchImpl() async {
     final args = this.args as DartLaunchRequestArguments;
-    final vmPath = Platform.resolvedExecutable;
     File? vmServiceInfoFile;
 
     final debug = !(args.noDebug ?? false);
@@ -84,6 +83,7 @@
     }
 
     final vmArgs = <String>[
+      ...?args.vmAdditionalArgs,
       if (debug) ...[
         '--enable-vm-service=${args.vmServicePort ?? 0}${ipv6 ? '/::1' : ''}',
         '--pause_isolates_on_start',
@@ -111,6 +111,14 @@
       '-r',
       'json',
     ];
+
+    // Handle customTool and deletion of any arguments for it.
+    final executable = args.customTool ?? Platform.resolvedExecutable;
+    final removeArgs = args.customToolReplacesArgs;
+    if (args.customTool != null && removeArgs != null) {
+      vmArgs.removeRange(0, math.min(removeArgs, vmArgs.length));
+    }
+
     final processArgs = [
       ...vmArgs,
       ...?args.toolArgs,
@@ -118,25 +126,27 @@
       ...?args.args,
     ];
 
-    // Find the package_config file for this script.
-    // TODO(dantup): Remove this once
-    //   https://github.com/dart-lang/sdk/issues/45530 is done as it will not be
-    //   necessary.
-    var possibleRoot = path.isAbsolute(args.program)
-        ? path.dirname(args.program)
-        : path.dirname(path.normalize(path.join(args.cwd ?? '', args.program)));
-    final packageConfig = findPackageConfigFile(possibleRoot);
-    if (packageConfig != null) {
-      this.usePackageConfigFile(packageConfig);
-    }
-
-    // TODO(dantup): Support passing env to both of these.
-
-    logger?.call('Spawning $vmPath with $processArgs in ${args.cwd}');
-    final process = await Process.start(
-      vmPath,
+    await launchAsProcess(
+      executable,
       processArgs,
       workingDirectory: args.cwd,
+      env: args.env,
+    );
+  }
+
+  /// Launches the test script as a process controlled by the debug adapter.
+  Future<void> launchAsProcess(
+    String executable,
+    List<String> processArgs, {
+    required String? workingDirectory,
+    required Map<String, String>? env,
+  }) async {
+    logger?.call('Spawning $executable with $processArgs in $workingDirectory');
+    final process = await Process.start(
+      executable,
+      processArgs,
+      workingDirectory: workingDirectory,
+      environment: env,
     );
     _process = process;
     pidsToTerminate.add(process.pid);
diff --git a/pkg/dds/lib/src/dap/adapters/mixins.dart b/pkg/dds/lib/src/dap/adapters/mixins.dart
index 3b9991a..b9f307f 100644
--- a/pkg/dds/lib/src/dap/adapters/mixins.dart
+++ b/pkg/dds/lib/src/dap/adapters/mixins.dart
@@ -17,32 +17,13 @@
 mixin PackageConfigUtils {
   /// Find the `package_config.json` file for the program being launched.
   ///
-  /// TODO(dantup): Remove this once
-  ///   https://github.com/dart-lang/sdk/issues/45530 is done as it will not be
-  ///   necessary.
+  /// It is no longer necessary to call this method as the package config file
+  /// is no longer used. URI lookups are done via the VM Service.
+  @Deprecated('No longer necessary, URI lookups are done via VM Service')
   File? findPackageConfigFile(String possibleRoot) {
-    File? packageConfig;
-    while (true) {
-      packageConfig =
-          File(path.join(possibleRoot, '.dart_tool', 'package_config.json'));
-
-      // If this packageconfig exists, use it.
-      if (packageConfig.existsSync()) {
-        break;
-      }
-
-      final parent = path.dirname(possibleRoot);
-
-      // If we can't go up anymore, the search failed.
-      if (parent == possibleRoot) {
-        packageConfig = null;
-        break;
-      }
-
-      possibleRoot = parent;
-    }
-
-    return packageConfig;
+    // TODO(dantup): Remove this method after Flutter DA is updated not to use
+    // it.
+    return null;
   }
 }
 
diff --git a/pkg/dds/lib/src/dap/base_debug_adapter.dart b/pkg/dds/lib/src/dap/base_debug_adapter.dart
index 2d82bbd..215a975 100644
--- a/pkg/dds/lib/src/dap/base_debug_adapter.dart
+++ b/pkg/dds/lib/src/dap/base_debug_adapter.dart
@@ -376,7 +376,7 @@
   /// passes an unused arg so that `Function()` can be passed to a function
   /// accepting `Function<T>(T x)` where `T` happens to be `void`.
   ///
-  /// This allows handlers to simple call sendResponse() where they have no
+  /// This allows handlers to simply call sendResponse() where they have no
   /// return value but need to send a valid response.
   _VoidArgRequestHandler<TArg> _withVoidResponse<TArg>(
     _VoidNoArgRequestHandler<TArg> handler,
diff --git a/pkg/dds/lib/src/dap/isolate_manager.dart b/pkg/dds/lib/src/dap/isolate_manager.dart
index fd2d342..cbf2087 100644
--- a/pkg/dds/lib/src/dap/isolate_manager.dart
+++ b/pkg/dds/lib/src/dap/isolate_manager.dart
@@ -4,8 +4,10 @@
 
 import 'dart:async';
 import 'dart:convert';
+import 'dart:io';
 
 import 'package:collection/collection.dart';
+import 'package:path/path.dart' as path;
 import 'package:vm_service/vm_service.dart' as vm;
 
 import 'adapters/dart.dart';
@@ -53,6 +55,9 @@
   /// [debugExternalPackageLibraries] in one step.
   bool debugExternalPackageLibraries = true;
 
+  /// The root of the Dart SDK containing the VM running the debug adapter.
+  late final String sdkRoot;
+
   /// Tracks breakpoints last provided by the client so they can be sent to new
   /// isolates that appear after initial breakpoints were sent.
   final Map<String, List<SourceBreakpoint>> _clientBreakpointsByUri = {};
@@ -93,7 +98,10 @@
   /// Any leading character matched in place of the dollar is in the first capture.
   final _braceNotPrefixedByDollarOrBackslashPattern = RegExp(r'(^|[^\\\$]){');
 
-  IsolateManager(this._adapter);
+  IsolateManager(this._adapter) {
+    final vmPath = Platform.resolvedExecutable;
+    sdkRoot = path.dirname(path.dirname(vmPath));
+  }
 
   /// A list of all current active isolates.
   ///
@@ -110,7 +118,7 @@
     await Future.wait(_threadsByThreadId.values.map(
       // debuggable libraries is the only thing currently affected by these
       // changable options.
-      (isolate) => _sendLibraryDebuggables(isolate.isolate),
+      (thread) => _sendLibraryDebuggables(thread),
     ));
   }
 
@@ -136,10 +144,7 @@
     vm.Event event, {
     bool resumeIfStarting = true,
   }) async {
-    final isolateId = event.isolate?.id;
-    if (isolateId == null) {
-      return;
-    }
+    final isolateId = event.isolate?.id!;
 
     final eventKind = event.kind;
     if (eventKind == vm.EventKind.kIsolateStart ||
@@ -178,7 +183,7 @@
     final registrationCompleter =
         _isolateRegistrations.putIfAbsent(isolate.id!, () => Completer<void>());
 
-    final info = _threadsByIsolateId.putIfAbsent(
+    final thread = _threadsByIsolateId.putIfAbsent(
       isolate.id!,
       () {
         // The first time we see an isolate, start tracking it.
@@ -194,21 +199,25 @@
 
     // If it's just become runnable (IsolateRunnable), configure the isolate
     // by sending breakpoints etc.
-    if (eventKind == vm.EventKind.kIsolateRunnable && !info.runnable) {
-      info.runnable = true;
-      await _configureIsolate(isolate);
+    if (eventKind == vm.EventKind.kIsolateRunnable && !thread.runnable) {
+      thread.runnable = true;
+      await _configureIsolate(thread);
       registrationCompleter.complete();
     }
 
-    return info;
+    return thread;
+  }
+
+  /// Calls reloadSources for all isolates.
+  Future<void> reloadSources() async {
+    await Future.wait(_threadsByThreadId.values.map(
+      (isolate) => _reloadSources(isolate.isolate),
+    ));
   }
 
   Future<void> resumeIsolate(vm.IsolateRef isolateRef,
       [String? resumeType]) async {
-    final isolateId = isolateRef.id;
-    if (isolateId == null) {
-      return;
-    }
+    final isolateId = isolateRef.id!;
 
     final thread = _threadsByIsolateId[isolateId];
     if (thread == null) {
@@ -271,7 +280,7 @@
 
     // Send the breakpoints to all existing threads.
     await Future.wait(_threadsByThreadId.values
-        .map((isolate) => _sendBreakpoints(isolate.isolate, uri: uri)));
+        .map((thread) => _sendBreakpoints(thread, uri: uri)));
   }
 
   /// Records exception pause mode as one of 'None', 'Unhandled' or 'All'. All
@@ -281,7 +290,7 @@
 
     // Send to all existing threads.
     await Future.wait(_threadsByThreadId.values.map(
-      (isolate) => _sendExceptionPauseMode(isolate.isolate),
+      (thread) => _sendExceptionPauseMode(thread),
     ));
   }
 
@@ -319,12 +328,15 @@
 
   /// Configures a new isolate, setting it's exception-pause mode, which
   /// libraries are debuggable, and sending all breakpoints.
-  Future<void> _configureIsolate(vm.IsolateRef isolate) async {
+  Future<void> _configureIsolate(ThreadInfo thread) async {
+    // Libraries must be set as debuggable _before_ sending breakpoints, or
+    // they may fail for SDK sources.
     await Future.wait([
-      _sendLibraryDebuggables(isolate),
-      _sendExceptionPauseMode(isolate),
-      _sendBreakpoints(isolate),
+      _sendLibraryDebuggables(thread),
+      _sendExceptionPauseMode(thread),
     ], eagerError: true);
+
+    await _sendBreakpoints(thread);
   }
 
   /// Evaluates an expression, returning the result if it is a [vm.InstanceRef]
@@ -413,7 +425,7 @@
     // For PausePostRequest we need to re-send all breakpoints; this happens
     // after a hot restart.
     if (eventKind == vm.EventKind.kPausePostRequest) {
-      await _configureIsolate(isolate);
+      await _configureIsolate(thread);
       if (resumeIfStarting) {
         await resumeThread(thread.threadId);
       }
@@ -492,6 +504,26 @@
     }
   }
 
+  /// Attempts to resolve [uris] to file:/// URIs via the VM Service.
+  ///
+  /// This method calls the VM service directly. Most requests to resolve URIs
+  /// should go through [ThreadInfo]'s resolveXxx methods which perform caching
+  /// of results.
+  Future<List<Uri?>?> _lookupResolvedPackageUris<T extends vm.Response>(
+    vm.IsolateRef isolate,
+    List<Uri> uris,
+  ) async {
+    final isolateId = isolate.id!;
+    final uriStrings = uris.map((uri) => uri.toString()).toList();
+    final res = await _adapter.vmService
+        ?.lookupResolvedPackageUris(isolateId, uriStrings);
+
+    return res?.uris
+        ?.cast<String?>()
+        .map((uri) => uri != null ? Uri.parse(uri) : null)
+        .toList();
+  }
+
   /// Interpolates and prints messages for any log points.
   ///
   /// Log Points are breakpoints with string messages attached. When the VM hits
@@ -527,19 +559,31 @@
     }
   }
 
+  /// Calls reloadSources for the given isolate.
+  Future<void> _reloadSources(vm.IsolateRef isolateRef) async {
+    final service = _adapter.vmService;
+    if (!debug || service == null) {
+      return;
+    }
+
+    final isolateId = isolateRef.id!;
+
+    await service.reloadSources(isolateId);
+  }
+
   /// Sets breakpoints for an individual isolate.
   ///
   /// If [uri] is provided, only breakpoints for that URI will be sent (used
   /// when breakpoints are modified for a single file in the editor). Otherwise
   /// breakpoints for all previously set URIs will be sent (used for
   /// newly-created isolates).
-  Future<void> _sendBreakpoints(vm.IsolateRef isolate, {String? uri}) async {
+  Future<void> _sendBreakpoints(ThreadInfo thread, {String? uri}) async {
     final service = _adapter.vmService;
     if (!debug || service == null) {
       return;
     }
 
-    final isolateId = isolate.id!;
+    final isolateId = thread.isolate.id!;
 
     // If we were passed a single URI, we should send breakpoints only for that
     // (this means the request came from the client), otherwise we should send
@@ -559,8 +603,14 @@
       final newBreakpoints = _clientBreakpointsByUri[uri] ?? const [];
       await Future.forEach<SourceBreakpoint>(newBreakpoints, (bp) async {
         try {
+          // Some file URIs (like SDK sources) need to be converted to
+          // appropriate internal URIs to be able to set breakpoints.
+          final vmUri = await thread.resolvePathToUri(
+            Uri.parse(uri).toFilePath(),
+          );
+
           final vmBp = await service.addBreakpointWithScriptUri(
-              isolateId, uri, bp.line,
+              isolateId, vmUri.toString(), bp.line,
               column: bp.column);
           existingBreakpointsForIsolateAndUri.add(vmBp);
           _clientBreakpointsByVmId[vmBp.id!] = bp;
@@ -575,37 +625,47 @@
   }
 
   /// Sets the exception pause mode for an individual isolate.
-  Future<void> _sendExceptionPauseMode(vm.IsolateRef isolate) async {
+  Future<void> _sendExceptionPauseMode(ThreadInfo thread) async {
     final service = _adapter.vmService;
     if (!debug || service == null) {
       return;
     }
 
-    await service.setExceptionPauseMode(isolate.id!, _exceptionPauseMode);
+    await service.setIsolatePauseMode(
+      thread.isolate.id!,
+      exceptionPauseMode: _exceptionPauseMode,
+    );
   }
 
   /// Calls setLibraryDebuggable for all libraries in the given isolate based
   /// on the debug settings.
-  Future<void> _sendLibraryDebuggables(vm.IsolateRef isolateRef) async {
+  Future<void> _sendLibraryDebuggables(ThreadInfo thread) async {
     final service = _adapter.vmService;
     if (!debug || service == null) {
       return;
     }
 
-    final isolateId = isolateRef.id;
-    if (isolateId == null) {
-      return;
-    }
+    final isolateId = thread.isolate.id!;
 
     final isolate = await service.getIsolate(isolateId);
     final libraries = isolate.libraries;
     if (libraries == null) {
       return;
     }
+
+    // Pre-resolve all URIs in batch so the call below does not trigger
+    // many requests to the server.
+    final allUris = libraries
+        .map((library) => library.uri)
+        .whereNotNull()
+        .map(Uri.parse)
+        .toList();
+    await thread.resolveUrisToPackageLibPathsBatch(allUris);
+
     await Future.wait(libraries.map((library) async {
       final libraryUri = library.uri;
       final isDebuggable = libraryUri != null
-          ? _adapter.libaryIsDebuggable(Uri.parse(libraryUri))
+          ? await _adapter.libraryIsDebuggable(thread, Uri.parse(libraryUri))
           : false;
       await service.setLibraryDebuggable(isolateId, library.id!, isDebuggable);
     }));
@@ -660,14 +720,23 @@
   /// breakpoint or exception that occur early on.
   bool hasBeenStarted = false;
 
-  // The most recent pauseEvent for this isolate.
+  /// The most recent pauseEvent for this isolate.
   vm.Event? pauseEvent;
 
-  // A cache of requests (Futures) to fetch scripts, so that multiple requests
-  // that require scripts (for example looking up locations for stack frames from
-  // tokenPos) can share the same response.
+  /// A cache of requests (Futures) to fetch scripts, so that multiple requests
+  /// that require scripts (for example looking up locations for stack frames from
+  /// tokenPos) can share the same response.
   final _scripts = <String, Future<vm.Script>>{};
 
+  /// A cache of requests (Futures) to resolve URIs to their local file paths.
+  ///
+  /// Used so that multiple requests that require them (for example looking up
+  /// locations for stack frames from tokenPos) can share the same response.
+  ///
+  /// Keys are URIs in string form.
+  /// Values are file paths (not file URIs!).
+  final _resolvedPaths = <String, Future<String?>>{};
+
   /// Whether this isolate has an in-flight resume request that has not yet
   /// been responded to.
   var hasPendingResume = false;
@@ -686,9 +755,207 @@
     return _scripts.putIfAbsent(script.id!, () => getObject<vm.Script>(script));
   }
 
+  /// Resolves a source file path into a URI for the VM.
+  ///
+  /// sdk-path/lib/core/print.dart -> dart:core/print.dart
+  ///
+  /// This is required so that when the user sets a breakpoint in an SDK source
+  /// (which they may have nagivated to via the Analysis Server) we generate a
+  /// vaid URI that the VM would create a breakpoint for.
+  Future<Uri?> resolvePathToUri(String filePath) async {
+    // We don't currently need to call lookupPackageUris because the VM can
+    // handle incoming file:/// URIs for packages, and also the org-dartlang-sdk
+    // URIs directly for SDK sources (we do not need to convert to 'dart:'),
+    // however this method is Future-returning in case this changes in future
+    // and we need to include a call to lookupPackageUris here.
+    return _convertPathToOrgDartlangSdk(filePath) ?? Uri.file(filePath);
+  }
+
+  /// Batch resolves source URIs from the VM to a file path for the package lib
+  /// folder.
+  ///
+  /// This method is more performant than repeatedly calling
+  /// [resolveUrisToPackageLibPath] because it resolves multiple URIs in a
+  /// single request to the VM.
+  ///
+  /// Results are cached and shared with [resolveUrisToPackageLibPath] (and
+  /// [resolveUriToPath]) so it's reasonable to call this method up-front and
+  /// then use [resolveUrisToPackageLibPath] (and [resolveUriToPath]) to read
+  /// the results later.
+  Future<List<String?>> resolveUrisToPackageLibPathsBatch(
+    List<Uri> uris,
+  ) async {
+    final results = await resolveUrisToPathsBatch(uris);
+    return results
+        .mapIndexed((i, filePath) => _trimPathToLibFolder(filePath, uris[i]))
+        .toList();
+  }
+
+  /// Batch resolves source URIs from the VM to a file path.
+  ///
+  /// This method is more performant than repeatedly calling [resolveUriToPath]
+  /// because it resolves multiple URIs in a single request to the VM.
+  ///
+  /// Results are cached and shared with [resolveUriToPath] so it's reasonable
+  /// to call this method up-front and then use [resolveUriToPath] to read
+  /// the results later.
+  Future<List<String?>> resolveUrisToPathsBatch(List<Uri> uris) async {
+    // First find the set of URIs we don't already have results for.
+    final requiredUris = uris
+        .where((uri) => !uri.isScheme('file'))
+        .where((uri) => !_resolvedPaths.containsKey(uri.toString()))
+        .toSet() // Take only distinct values.
+        .toList();
+
+    if (requiredUris.isNotEmpty) {
+      // Populate completers for each URI before we start the request so that
+      // concurrent calls to this method will not start their own requests.
+      final completers = Map<String, Completer<String?>>.fromEntries(
+        requiredUris.map((uri) => MapEntry('$uri', Completer<String?>())),
+      );
+      completers.forEach(
+        (uri, completer) => _resolvedPaths[uri] = completer.future,
+      );
+      final results =
+          await _manager._lookupResolvedPackageUris(isolate, requiredUris);
+      if (results == null) {
+        // If no result, all of the results are null.
+        completers.forEach((uri, completer) => completer.complete(null));
+      } else {
+        // Otherwise, complete each one by index with the corresponding value.
+        results.map(_convertUriToFilePath).forEachIndexed((i, result) {
+          final uri = requiredUris[i].toString();
+          completers[uri]!.complete(result);
+        });
+      }
+    }
+
+    // Finally, assemble a list of the values by using the cached futures and
+    // the original list. Any non-file URI is guaranteed to be in [_resolvedPaths]
+    // because they were either filtered out of [requiredUris] because they were
+    // already there, or we then populated completers for them above.
+    final futures = uris.map((uri) async {
+      return uri.isScheme('file')
+          ? uri.toFilePath()
+          : await _resolvedPaths[uri.toString()]!;
+    });
+    return Future.wait(futures);
+  }
+
+  /// Resolves a source URI to a file path for the lib folder of its package.
+  ///
+  /// package:foo/a/b/c/d.dart -> /code/packages/foo/lib
+  ///
+  /// This method is an optimisation over calling [resolveUriToPath] where only
+  /// the package root is required (for example when determining whether a
+  /// package is within the users workspace). This method allows results to be
+  /// cached per-package to avoid hitting the VM Service for each individual
+  /// library within a package.
+  Future<String?> resolveUriToPackageLibPath(Uri uri) async {
+    final result = await resolveUrisToPackageLibPathsBatch([uri]);
+    return result.first;
+  }
+
+  /// Resolves a source URI from the VM to a file path.
+  ///
+  /// dart:core/print.dart -> sdk-path/lib/core/print.dart
+  ///
+  /// This is required so that when the user stops (or navigates via a stack
+  /// frame) we open the same file on their local disk. If we downloaded the
+  /// source from the VM, they would end up seeing two copies of files (and they
+  /// would each have their own breakpoints) which can be confusing.
+  Future<String?> resolveUriToPath(Uri uri) async {
+    final result = await resolveUrisToPathsBatch([uri]);
+    return result.first;
+  }
+
   /// Stores some basic data indexed by an integer for use in "reference" fields
   /// that are round-tripped to the client.
   int storeData(Object data) => _manager.storeData(this, data);
+
+  /// Converts a URI in the form org-dartlang-sdk:///sdk/lib/collection/hash_set.dart
+  /// to a local file path based on the current SDK.
+  String? _convertOrgDartlangSdkToPath(Uri uri) {
+    // org-dartlang-sdk URIs can be in multiple forms:
+    //
+    //   - org-dartlang-sdk:///sdk/lib/collection/hash_set.dart
+    //   - org-dartlang-sdk:///runtime/lib/convert_patch.dart
+    //
+    // We currently only handle the sdk folder, as we don't know which runtime
+    // is being used (this code is shared) and do not want to map to the wrong
+    // sources.
+    if (uri.pathSegments.isNotEmpty && uri.pathSegments.first == 'sdk') {
+      // TODO(dantup): Do we need to worry about this content not matching
+      //   up with what's local (eg. for Flutter the VM running the app is
+      //   on another device to the VM running this DA).
+      final sdkRoot = _manager.sdkRoot;
+      return path.joinAll([sdkRoot, ...uri.pathSegments.skip(1)]);
+    }
+
+    return null;
+  }
+
+  /// Converts a file path inside the current SDK root into a URI in the form
+  /// org-dartlang-sdk:///sdk/lib/collection/hash_set.dart.
+  Uri? _convertPathToOrgDartlangSdk(String input) {
+    final sdkRoot = _manager.sdkRoot;
+    if (path.isWithin(sdkRoot, input)) {
+      final relative = path.relative(input, from: sdkRoot);
+      return Uri(
+        scheme: 'org-dartlang-sdk',
+        host: '',
+        pathSegments: ['sdk', ...path.split(relative)],
+      );
+    }
+
+    return null;
+  }
+
+  /// Converts a URI to a file path.
+  ///
+  /// Supports file:// URIs and org-dartlang-sdk:// URIs.
+  String? _convertUriToFilePath(Uri? input) {
+    if (input == null) {
+      return null;
+    } else if (input.isScheme('file')) {
+      return input.toFilePath();
+    } else if (input.isScheme('org-dartlang-sdk')) {
+      return _convertOrgDartlangSdkToPath(input);
+    } else {
+      return null;
+    }
+  }
+
+  /// Helper to remove a libraries path from the a file path so it points at the
+  /// lib folder.
+  ///
+  /// [uri] should be the equivalent package: URI and is used to know how many
+  /// segments to remove from the file path to get to the lib folder.
+  String? _trimPathToLibFolder(String? filePath, Uri uri) {
+    if (filePath == null) {
+      return null;
+    }
+
+    final fileUri = Uri.file(filePath);
+
+    // Track how many segments from the path are from the lib folder to the
+    // library that will need to be removed later.
+    final libraryPathSegments = uri.pathSegments.length - 1;
+
+    // It should never be the case that the returned value doesn't have at
+    // least as many segments as the path of the URI.
+    assert(fileUri.pathSegments.length > libraryPathSegments);
+    if (fileUri.pathSegments.length <= libraryPathSegments) {
+      return filePath;
+    }
+
+    // Strip off the correct number of segments to the resulting path points
+    // to the root of the package:/ URI.
+    final keepSegments = fileUri.pathSegments.length - libraryPathSegments;
+    return fileUri
+        .replace(pathSegments: fileUri.pathSegments.sublist(0, keepSegments))
+        .toFilePath();
+  }
 }
 
 class _StoredData {
diff --git a/pkg/dds/lib/src/dap/protocol_converter.dart b/pkg/dds/lib/src/dap/protocol_converter.dart
index a3e836e..0bedd50 100644
--- a/pkg/dds/lib/src/dap/protocol_converter.dart
+++ b/pkg/dds/lib/src/dap/protocol_converter.dart
@@ -6,7 +6,6 @@
 import 'dart:io';
 
 import 'package:collection/collection.dart';
-import 'package:package_config/package_config_types.dart';
 import 'package:path/path.dart' as path;
 import 'package:vm_service/vm_service.dart' as vm;
 
@@ -26,11 +25,6 @@
   /// the debug session.
   final DartDebugAdapter _adapter;
 
-  /// Temporary PackageConfig used for resolving package: URIs.
-  /// TODO(dantup): Replace this implementation with one that calls the VM
-  ///   Service once https://github.com/dart-lang/sdk/issues/45530 is done.
-  PackageConfig packageConfig = PackageConfig.empty;
-
   ProtocolConverter(this._adapter);
 
   /// Converts an absolute path to one relative to the cwd used to launch the
@@ -388,13 +382,15 @@
     final tokenPos = location.tokenPos;
     final scriptRefUri = scriptRef?.uri;
     final uri = scriptRefUri != null ? Uri.parse(scriptRefUri) : null;
+    final uriIsDart = uri?.isScheme('dart') ?? false;
     final uriIsPackage = uri?.isScheme('package') ?? false;
-    final sourcePath = uri != null ? await convertVmUriToSourcePath(uri) : null;
+    final sourcePath = uri != null ? await thread.resolveUriToPath(uri) : null;
     var canShowSource = sourcePath != null && File(sourcePath).existsSync();
 
     // Download the source if from a "dart:" uri.
     int? sourceReference;
-    if (uri != null &&
+    if (!canShowSource &&
+        uri != null &&
         (uri.isScheme('dart') || uri.isScheme('org-dartlang-app')) &&
         scriptRef != null) {
       sourceReference = thread.storeData(scriptRef);
@@ -416,17 +412,18 @@
     // SDK and debugSdkLibraries=false) then we should also mark it as
     // deemphasized so that the editor can jump up the stack to the first frame
     // of debuggable code.
-    final isDebuggable = uri != null && _adapter.libaryIsDebuggable(uri);
+    final isDebuggable =
+        uri != null && await _adapter.libraryIsDebuggable(thread, uri);
     final presentationHint = isDebuggable ? null : 'deemphasize';
     final origin = uri != null && _adapter.isSdkLibrary(uri)
         ? 'from the SDK'
-        : uri != null && _adapter.isExternalPackageLibrary(uri)
+        : uri != null && await _adapter.isExternalPackageLibrary(thread, uri)
             ? 'from external packages'
             : null;
 
     final source = canShowSource
         ? dap.Source(
-            name: uriIsPackage
+            name: uriIsPackage || uriIsDart
                 ? uri!.toString()
                 : sourcePath != null
                     ? convertToRelativePath(sourcePath)
@@ -455,22 +452,6 @@
     );
   }
 
-  /// Converts the source URI from the VM to a file path.
-  ///
-  /// This is required so that when the user stops (or navigates via a stack
-  /// frame) we open the same file on their local disk. If we downloaded the
-  /// source from the VM, they would end up seeing two copies of files (and they
-  /// would each have their own breakpoints) which can be confusing.
-  Future<String?> convertVmUriToSourcePath(Uri uri) async {
-    if (uri.isScheme('file')) {
-      return uri.toFilePath();
-    } else if (uri.isScheme('package')) {
-      return resolvePackageUri(uri);
-    } else {
-      return null;
-    }
-  }
-
   /// Whether [kind] is a simple kind, and does not need to be mapped to a variable.
   bool isSimpleKind(String? kind) {
     return kind == 'String' ||
@@ -482,19 +463,6 @@
         kind == 'Closure';
   }
 
-  /// Resolves a `package: URI` to the real underlying source path.
-  ///
-  /// Returns `null` if no mapping was possible, for example if the package is
-  /// not in the package mapping file.
-  String? resolvePackageUri(Uri uri) {
-    // TODO(dantup): Replace this implementation with one that calls the VM
-    //   Service once https://github.com/dart-lang/sdk/issues/45530 is done.
-    // This implementation makes assumptions about the package file being used
-    // that might not be correct (for example if the user uses the --packages
-    // flag).
-    return packageConfig.resolve(uri)?.toFilePath();
-  }
-
   /// Invokes the toString() method on a [vm.InstanceRef] and converts the
   /// response to a user-friendly display string.
   ///
diff --git a/pkg/dds/lib/src/dap/protocol_stream_transformers.dart b/pkg/dds/lib/src/dap/protocol_stream_transformers.dart
index 424fa84..f166e55 100644
--- a/pkg/dds/lib/src/dap/protocol_stream_transformers.dart
+++ b/pkg/dds/lib/src/dap/protocol_stream_transformers.dart
@@ -87,8 +87,14 @@
 
   /// Decodes [buffer] into a String and returns the 'Content-Length' header value.
   static ProtocolHeaders _parseHeaders(List<int> buffer) {
-    // Headers are specified as always ASCII in LSP.
-    final asString = ascii.decode(buffer);
+    final String asString;
+    try {
+      // Headers are specified as always ASCII in LSP.
+      asString = ascii.decode(buffer);
+    } on FormatException {
+      throw FormatException('Unable to decode headers with ascii. '
+          'The stream has utf8 content:\n${utf8.decode(buffer)}');
+    }
     final headers = asString.split('\r\n');
     final lengthHeader =
         headers.firstWhere((h) => h.startsWith('Content-Length'));
diff --git a/pkg/dds/lib/src/isolate_manager.dart b/pkg/dds/lib/src/isolate_manager.dart
index 7522183..7808b2a 100644
--- a/pkg/dds/lib/src/isolate_manager.dart
+++ b/pkg/dds/lib/src/isolate_manager.dart
@@ -110,13 +110,14 @@
   /// Should always be called after an isolate is resumed.
   void clearResumeApprovals() => _resumeApprovalsByName.clear();
 
-  Map<String, dynamic> getCachedCpuSamples(String userTag) {
+  Future<Map<String, dynamic>> getCachedCpuSamples(String userTag) async {
     final repo = cpuSamplesManager.cpuSamplesCaches[userTag];
     if (repo == null) {
       throw json_rpc.RpcException.invalidParams(
         'CPU sample caching is not enabled for tag: "$userTag"',
       );
     }
+    await repo.populateFunctionDetails(isolateManager.dds, id);
     return repo.toJson();
   }
 
@@ -283,14 +284,15 @@
     );
   }
 
-  Map<String, dynamic> getCachedCpuSamples(json_rpc.Parameters parameters) {
+  Future<Map<String, dynamic>> getCachedCpuSamples(
+      json_rpc.Parameters parameters) async {
     final isolateId = parameters['isolateId'].asString;
     if (!isolates.containsKey(isolateId)) {
       return RPCResponses.collectedSentinel;
     }
     final isolate = isolates[isolateId]!;
     final userTag = parameters['userTag'].asString;
-    return isolate.getCachedCpuSamples(userTag);
+    return await isolate.getCachedCpuSamples(userTag);
   }
 
   /// Forwards a `resume` request to the VM service.
diff --git a/pkg/dds/pubspec.yaml b/pkg/dds/pubspec.yaml
index bafc2dc..ef5124d 100644
--- a/pkg/dds/pubspec.yaml
+++ b/pkg/dds/pubspec.yaml
@@ -3,7 +3,7 @@
   A library used to spawn the Dart Developer Service, used to communicate with
   a Dart VM Service instance.
 
-version: 2.1.4
+version: 2.1.5
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/dds
 
@@ -16,7 +16,6 @@
   devtools_shared: ^2.3.0
   json_rpc_2: ^3.0.0
   meta: ^1.1.8
-  package_config: ^2.0.0
   path: ^1.8.0
   pedantic: ^1.7.0
   shelf: ^1.0.0
@@ -25,7 +24,7 @@
   shelf_web_socket: ^1.0.0
   sse: ^4.0.0
   stream_channel: ^2.0.0
-  vm_service: ^7.2.0
+  vm_service: ^7.5.0
   web_socket_channel: ^2.0.0
 
 dev_dependencies:
diff --git a/pkg/dds/test/dap/dart_cli_test.dart b/pkg/dds/test/dap/dart_cli_test.dart
new file mode 100644
index 0000000..d07dc37
--- /dev/null
+++ b/pkg/dds/test/dap/dart_cli_test.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. 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:dds/dap.dart';
+import 'package:test/test.dart';
+
+import 'mocks.dart';
+
+main() {
+  group('dart cli adapter', () {
+    test('includes vmAdditionalArgs', () async {
+      final adapter = MockDartCliDebugAdapter();
+      final responseCompleter = Completer<void>();
+      final request = MockRequest();
+      final args = DartLaunchRequestArguments(
+        program: 'foo.dart',
+        vmAdditionalArgs: ['vm_arg'],
+        noDebug: true,
+      );
+
+      await adapter.configurationDoneRequest(request, null, () {});
+      await adapter.launchRequest(request, args, responseCompleter.complete);
+      await responseCompleter.future;
+
+      expect(adapter.executable, equals(Platform.resolvedExecutable));
+      expect(adapter.processArgs, containsAllInOrder(['vm_arg', 'foo.dart']));
+    });
+
+    test('includes toolArgs', () async {
+      final adapter = MockDartCliDebugAdapter();
+      final responseCompleter = Completer<void>();
+      final request = MockRequest();
+      final args = DartLaunchRequestArguments(
+        program: 'foo.dart',
+        toolArgs: ['tool_arg'],
+        noDebug: true,
+      );
+
+      await adapter.configurationDoneRequest(request, null, () {});
+      await adapter.launchRequest(request, args, responseCompleter.complete);
+      await responseCompleter.future;
+
+      expect(adapter.executable, equals(Platform.resolvedExecutable));
+      expect(adapter.processArgs, containsAllInOrder(['tool_arg', 'foo.dart']));
+    });
+
+    test('includes env', () async {
+      final adapter = MockDartCliDebugAdapter();
+      final responseCompleter = Completer<void>();
+      final request = MockRequest();
+      final args = DartLaunchRequestArguments(
+        program: 'foo.dart',
+        env: {
+          'ENV1': 'VAL1',
+          'ENV2': 'VAL2',
+        },
+        noDebug: true,
+      );
+
+      await adapter.configurationDoneRequest(request, null, () {});
+      await adapter.launchRequest(request, args, responseCompleter.complete);
+      await responseCompleter.future;
+
+      expect(adapter.executable, equals(Platform.resolvedExecutable));
+      expect(adapter.env!['ENV1'], 'VAL1');
+      expect(adapter.env!['ENV2'], 'VAL2');
+    });
+
+    group('includes customTool', () {
+      test('with no args replaced', () async {
+        final adapter = MockDartCliDebugAdapter();
+        final responseCompleter = Completer<void>();
+        final request = MockRequest();
+        final args = DartLaunchRequestArguments(
+          program: 'foo.dart',
+          customTool: '/custom/dart',
+          noDebug: true,
+          enableAsserts: true, // to check args are still passed through
+        );
+
+        await adapter.configurationDoneRequest(request, null, () {});
+        await adapter.launchRequest(request, args, responseCompleter.complete);
+        await responseCompleter.future;
+
+        expect(adapter.executable, equals('/custom/dart'));
+        // args should be in-tact
+        expect(adapter.processArgs, contains('--enable-asserts'));
+      });
+
+      test('with all args replaced', () async {
+        final adapter = MockDartCliDebugAdapter();
+        final responseCompleter = Completer<void>();
+        final request = MockRequest();
+        final args = DartLaunchRequestArguments(
+          program: 'foo.dart',
+          customTool: '/custom/dart',
+          customToolReplacesArgs: 9999, // replaces all built-in args
+          noDebug: true,
+          enableAsserts: true, // should not be in args
+          toolArgs: ['tool_args'], // should still be in args
+        );
+
+        await adapter.configurationDoneRequest(request, null, () {});
+        await adapter.launchRequest(request, args, responseCompleter.complete);
+        await responseCompleter.future;
+
+        expect(adapter.executable, equals('/custom/dart'));
+        // normal built-in args are replaced by customToolReplacesArgs, but
+        // user-provided toolArgs are not.
+        expect(adapter.processArgs, isNot(contains('--enable-asserts')));
+        expect(adapter.processArgs, contains('tool_args'));
+      });
+    });
+  });
+}
diff --git a/pkg/dds/test/dap/dart_test_test.dart b/pkg/dds/test/dap/dart_test_test.dart
new file mode 100644
index 0000000..defba7d
--- /dev/null
+++ b/pkg/dds/test/dap/dart_test_test.dart
@@ -0,0 +1,126 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. 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:dds/dap.dart';
+import 'package:test/test.dart';
+
+import 'mocks.dart';
+
+main() {
+  group('dart test adapter', () {
+    test('includes vmAdditionalArgs before run test:test', () async {
+      final adapter = MockDartTestDebugAdapter();
+      final responseCompleter = Completer<void>();
+      final request = MockRequest();
+      final args = DartLaunchRequestArguments(
+        program: 'foo.dart',
+        vmAdditionalArgs: ['vm_arg'],
+        noDebug: true,
+      );
+
+      await adapter.configurationDoneRequest(request, null, () {});
+      await adapter.launchRequest(request, args, responseCompleter.complete);
+      await responseCompleter.future;
+
+      expect(adapter.executable, equals(Platform.resolvedExecutable));
+      expect(
+        adapter.processArgs,
+        containsAllInOrder(['vm_arg', 'run', 'test:test', 'foo.dart']),
+      );
+    });
+
+    test('includes toolArgs after run test:test', () async {
+      final adapter = MockDartTestDebugAdapter();
+      final responseCompleter = Completer<void>();
+      final request = MockRequest();
+      final args = DartLaunchRequestArguments(
+        program: 'foo.dart',
+        toolArgs: ['tool_arg'],
+        noDebug: true,
+      );
+
+      await adapter.configurationDoneRequest(request, null, () {});
+      await adapter.launchRequest(request, args, responseCompleter.complete);
+      await responseCompleter.future;
+
+      expect(adapter.executable, equals(Platform.resolvedExecutable));
+      expect(
+        adapter.processArgs,
+        containsAllInOrder(['run', 'test:test', 'tool_arg', 'foo.dart']),
+      );
+    });
+
+    test('includes env', () async {
+      final adapter = MockDartTestDebugAdapter();
+      final responseCompleter = Completer<void>();
+      final request = MockRequest();
+      final args = DartLaunchRequestArguments(
+        program: 'foo.dart',
+        env: {
+          'ENV1': 'VAL1',
+          'ENV2': 'VAL2',
+        },
+        noDebug: true,
+      );
+
+      await adapter.configurationDoneRequest(request, null, () {});
+      await adapter.launchRequest(request, args, responseCompleter.complete);
+      await responseCompleter.future;
+
+      expect(adapter.executable, equals(Platform.resolvedExecutable));
+      expect(adapter.env!['ENV1'], 'VAL1');
+      expect(adapter.env!['ENV2'], 'VAL2');
+    });
+
+    group('includes customTool', () {
+      test('with no args replaced', () async {
+        final adapter = MockDartTestDebugAdapter();
+        final responseCompleter = Completer<void>();
+        final request = MockRequest();
+        final args = DartLaunchRequestArguments(
+          program: 'foo.dart',
+          customTool: '/custom/dart',
+          noDebug: true,
+        );
+
+        await adapter.configurationDoneRequest(request, null, () {});
+        await adapter.launchRequest(request, args, responseCompleter.complete);
+        await responseCompleter.future;
+
+        expect(adapter.executable, equals('/custom/dart'));
+        // args should be in-tact
+        expect(adapter.processArgs, containsAllInOrder(['run', 'test:test']));
+      });
+
+      test('with all args replaced', () async {
+        final adapter = MockDartTestDebugAdapter();
+        final responseCompleter = Completer<void>();
+        final request = MockRequest();
+        final args = DartLaunchRequestArguments(
+          program: 'foo.dart',
+          customTool: '/custom/dart',
+          customToolReplacesArgs: 9999, // replaces all built-in args
+          noDebug: true,
+          toolArgs: ['tool_args'], // should still be in args
+        );
+
+        await adapter.configurationDoneRequest(request, null, () {});
+        await adapter.launchRequest(request, args, responseCompleter.complete);
+        await responseCompleter.future;
+
+        expect(adapter.executable, equals('/custom/dart'));
+        // normal built-in args are replaced by customToolReplacesArgs, but
+        // user-provided toolArgs are not.
+        expect(
+          adapter.processArgs,
+          isNot(containsAllInOrder(['run', 'test:test'])),
+        );
+        expect(adapter.processArgs, contains('tool_args'));
+      });
+    });
+  });
+}
diff --git a/pkg/dds/test/dap/integration/debug_breakpoints_test.dart b/pkg/dds/test/dap/integration/debug_breakpoints_test.dart
index 8aee55c..03475cb 100644
--- a/pkg/dds/test/dap/integration/debug_breakpoints_test.dart
+++ b/pkg/dds/test/dap/integration/debug_breakpoints_test.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.
 
+import 'dart:io';
+
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 
 import 'test_client.dart';
@@ -24,6 +27,18 @@
       await client.hitBreakpoint(testFile, breakpointLine);
     });
 
+    test('stops at a line breakpoint in the SDK set via local sources',
+        () async {
+      final client = dap.client;
+      final testFile = dap.createTestFile(simpleBreakpointProgram);
+
+      // Add the breakpoint to the first line inside the SDK's print function.
+      final sdkFile = File(path.join(sdkRoot, 'lib', 'core', 'print.dart'));
+      final breakpointLine = lineWith(sdkFile, 'print(Object? object) {') + 1;
+
+      await client.hitBreakpoint(sdkFile, breakpointLine, entryFile: testFile);
+    });
+
     test('stops at a line breakpoint and can be resumed', () async {
       final client = dap.client;
       final testFile = dap.createTestFile(simpleBreakpointProgram);
diff --git a/pkg/dds/test/dap/integration/debug_test.dart b/pkg/dds/test/dap/integration/debug_test.dart
index 6e7565b..6655b58 100644
--- a/pkg/dds/test/dap/integration/debug_test.dart
+++ b/pkg/dds/test/dap/integration/debug_test.dart
@@ -2,9 +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.
 
+import 'dart:async';
 import 'dart:io';
 
 import 'package:dds/src/dap/protocol_generated.dart';
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 
 import 'test_client.dart';
@@ -158,6 +160,87 @@
       // Source code should contain the implementation/signature of print().
       final source = await client.getValidSource(topFrame.source!);
       expect(source.content, contains('void print(Object? object) {'));
+      // Skipped because this test is not currently valid as source for print
+      // is mapped to local sources.
+    }, skip: true);
+
+    test('can map SDK source code to a local path', () async {
+      final client = dap.client;
+      final testFile = dap.createTestFile(simpleBreakpointProgram);
+      final breakpointLine = lineWith(testFile, breakpointMarker);
+
+      // Hit the initial breakpoint.
+      final stop = await dap.client.hitBreakpoint(
+        testFile,
+        breakpointLine,
+        launch: () => client.launch(
+          testFile.path,
+          debugSdkLibraries: true,
+        ),
+      );
+
+      // Step in to go into print.
+      final responses = await Future.wait([
+        client.expectStop('step', sourceName: 'dart:core/print.dart'),
+        client.stepIn(stop.threadId!),
+      ], eagerError: true);
+      final stopResponse = responses.first as StoppedEventBody;
+
+      // Fetch the top stack frame (which should be inside print).
+      final stack = await client.getValidStack(
+        stopResponse.threadId!,
+        startFrame: 0,
+        numFrames: 1,
+      );
+      final topFrame = stack.stackFrames.first;
+
+      // SDK sources that have been mapped have no sourceReference but a path.
+      expect(
+        topFrame.source!.path,
+        equals(path.join(sdkRoot, 'lib', 'core', 'print.dart')),
+      );
+      expect(topFrame.source!.sourceReference, isNull);
+    });
+
+    test('can shutdown during startup', () async {
+      final testFile = dap.createTestFile(simpleArgPrintingProgram);
+
+      // Terminate the app immediately upon recieving the first Thread event.
+      // The DAP is also responding to this event to configure the isolate (eg.
+      // set breakpoints and exception pause behaviour) and will cause it to
+      // receive "Service has disappeared" responses if these are in-flight as
+      // the process terminates. These should not go unhandled since they are
+      // normal during shutdown.
+      unawaited(dap.client.event('thread').then((_) => dap.client.terminate()));
+      await dap.client.start(file: testFile);
+    });
+
+    test('can hot reload', () async {
+      const originalText = 'ORIGINAL TEXT';
+      const newText = 'NEW TEXT';
+
+      // Create a script that prints 'ORIGINAL TEXT'.
+      final testFile = dap.createTestFile(stringPrintingProgram(originalText));
+
+      // Start the program and wait for 'ORIGINAL TEXT' to be printed.
+      await Future.wait([
+        dap.client.initialize(),
+        dap.client.launch(testFile.path),
+      ], eagerError: true);
+
+      // Expect the original text.
+      await dap.client.outputEvents
+          .firstWhere((event) => event.output.trim() == originalText);
+
+      // Update the file and hot reload.
+      testFile.writeAsStringSync(stringPrintingProgram(newText));
+      await dap.client.hotReload();
+
+      // Expect the new text.
+      await dap.client.outputEvents
+          .firstWhere((event) => event.output.trim() == newText);
+
+      await dap.client.terminate();
     });
     // These tests can be slow due to starting up the external server process.
   }, timeout: Timeout.none);
diff --git a/pkg/dds/test/dap/integration/test_client.dart b/pkg/dds/test/dap/integration/test_client.dart
index 66f44da..d960bec 100644
--- a/pkg/dds/test/dap/integration/test_client.dart
+++ b/pkg/dds/test/dap/integration/test_client.dart
@@ -148,7 +148,7 @@
       sendRequest(ContinueArguments(threadId: threadId));
 
   /// Sends a custom request to the server and waits for a response.
-  Future<Response> custom(String name, Object? args) async {
+  Future<Response> custom(String name, [Object? args]) async {
     return sendRequest(args, overrideCommand: name);
   }
 
@@ -191,6 +191,11 @@
     _serverRequestHandlers[request] = handler;
   }
 
+  /// Send a custom 'hotReload' request to the server.
+  Future<Response> hotReload() async {
+    return custom('hotReload');
+  }
+
   /// Send an initialize request to the server.
   ///
   /// This occurs before the request to start running/debugging a script and is
@@ -399,7 +404,7 @@
       } else {
         completer.completeError(message);
       }
-    } else if (message is Event) {
+    } else if (message is Event && !_eventController.isClosed) {
       _eventController.add(message);
 
       // When we see a terminated event, close the event stream so if any
@@ -483,11 +488,13 @@
   Future<StoppedEventBody> hitBreakpoint(
     File file,
     int line, {
+    File? entryFile,
     String? condition,
     String? cwd,
     List<String>? args,
     Future<Response> Function()? launch,
   }) async {
+    entryFile ??= file;
     final stop = expectStop('breakpoint', file: file, line: line);
 
     await Future.wait([
@@ -498,7 +505,7 @@
           breakpoints: [SourceBreakpoint(line: line, condition: condition)],
         ),
       ),
-      launch?.call() ?? this.launch(file.path, cwd: cwd, args: args),
+      launch?.call() ?? this.launch(entryFile.path, cwd: cwd, args: args),
     ], eagerError: true);
 
     return stop;
diff --git a/pkg/dds/test/dap/integration/test_scripts.dart b/pkg/dds/test/dap/integration/test_scripts.dart
index 2b24727..59bc718 100644
--- a/pkg/dds/test/dap/integration/test_scripts.dart
+++ b/pkg/dds/test/dap/integration/test_scripts.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 'dart:convert';
+
 import 'package:test/test.dart';
 
 /// A marker used in some test scripts/tests for where to set breakpoints.
@@ -53,6 +55,24 @@
   }
 ''';
 
+/// Returns a simple Dart script that prints the provided string repeatedly.
+String stringPrintingProgram(String text) {
+  // jsonEncode the string to get it into a quoted/escaped form that can be
+  // embedded in the string.
+  final encodedTextString = jsonEncode(text);
+  return '''
+  import 'dart:async';
+
+  main() async {
+    Timer.periodic(Duration(milliseconds: 10), (_) => printSomething());
+  }
+
+  void printSomething() {
+    print($encodedTextString);
+  }
+''';
+}
+
 /// A simple async Dart script that when stopped at the line of '// BREAKPOINT'
 /// will contain multiple stack frames across some async boundaries.
 const simpleAsyncProgram = '''
diff --git a/pkg/dds/test/dap/integration/test_support.dart b/pkg/dds/test/dap/integration/test_support.dart
index 9201798..d4c2a8b 100644
--- a/pkg/dds/test/dap/integration/test_support.dart
+++ b/pkg/dds/test/dap/integration/test_support.dart
@@ -43,6 +43,9 @@
 /// by the VM when not using --write-service-info.
 final vmServiceBannerPattern = RegExp(r'Observatory listening on ([^\s]+)\s');
 
+/// The root of the SDK containing the current running VM.
+final sdkRoot = path.dirname(path.dirname(Platform.resolvedExecutable));
+
 /// Expects the lines in [actual] to match the relevant matcher in [expected],
 /// ignoring differences in line endings and trailing whitespace.
 void expectLines(String actual, List<Object> expected) {
diff --git a/pkg/dds/test/dap/mocks.dart b/pkg/dds/test/dap/mocks.dart
new file mode 100644
index 0000000..9afe079
--- /dev/null
+++ b/pkg/dds/test/dap/mocks.dart
@@ -0,0 +1,115 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. 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:dds/dap.dart';
+import 'package:dds/src/dap/adapters/dart_cli_adapter.dart';
+import 'package:dds/src/dap/adapters/dart_test_adapter.dart';
+
+/// A [DartCliDebugAdapter] that captures information about the process that
+/// will be launched.
+class MockDartCliDebugAdapter extends DartCliDebugAdapter {
+  final StreamSink<List<int>> stdin;
+  final Stream<List<int>> stdout;
+
+  late bool launchedInTerminal;
+  late String executable;
+  late List<String> processArgs;
+  late String? workingDirectory;
+  late Map<String, String>? env;
+
+  factory MockDartCliDebugAdapter() {
+    final stdinController = StreamController<List<int>>();
+    final stdoutController = StreamController<List<int>>();
+    final channel = ByteStreamServerChannel(
+        stdinController.stream, stdoutController.sink, null);
+
+    return MockDartCliDebugAdapter._(
+        stdinController.sink, stdoutController.stream, channel);
+  }
+
+  MockDartCliDebugAdapter._(
+      this.stdin, this.stdout, ByteStreamServerChannel channel)
+      : super(channel);
+
+  Future<void> launchAsProcess(
+    String executable,
+    List<String> processArgs, {
+    required String? workingDirectory,
+    required Map<String, String>? env,
+  }) async {
+    this.launchedInTerminal = false;
+    this.executable = executable;
+    this.processArgs = processArgs;
+    this.workingDirectory = workingDirectory;
+    this.env = env;
+  }
+
+  Future<void> launchInEditorTerminal(
+    bool debug,
+    String terminalKind,
+    String executable,
+    List<String> processArgs, {
+    required String? workingDirectory,
+    required Map<String, String>? env,
+  }) async {
+    this.launchedInTerminal = true;
+    this.executable = executable;
+    this.processArgs = processArgs;
+    this.workingDirectory = workingDirectory;
+    this.env = env;
+  }
+}
+
+/// A [DartTestDebugAdapter] that captures information about the process that
+/// will be launched.
+class MockDartTestDebugAdapter extends DartTestDebugAdapter {
+  final StreamSink<List<int>> stdin;
+  final Stream<List<int>> stdout;
+
+  late String executable;
+  late List<String> processArgs;
+  late String? workingDirectory;
+  late Map<String, String>? env;
+
+  factory MockDartTestDebugAdapter() {
+    final stdinController = StreamController<List<int>>();
+    final stdoutController = StreamController<List<int>>();
+    final channel = ByteStreamServerChannel(
+        stdinController.stream, stdoutController.sink, null);
+
+    return MockDartTestDebugAdapter._(
+      stdinController.sink,
+      stdoutController.stream,
+      channel,
+    );
+  }
+
+  MockDartTestDebugAdapter._(
+      this.stdin, this.stdout, ByteStreamServerChannel channel)
+      : super(channel);
+
+  Future<void> launchAsProcess(
+    String executable,
+    List<String> processArgs, {
+    required String? workingDirectory,
+    required Map<String, String>? env,
+  }) async {
+    this.executable = executable;
+    this.processArgs = processArgs;
+    this.workingDirectory = workingDirectory;
+    this.env = env;
+  }
+}
+
+class MockRequest extends Request {
+  static var _requestId = 1;
+  MockRequest()
+      : super.fromMap({
+          'command': 'mock_command',
+          'type': 'mock_type',
+          'seq': _requestId++,
+        });
+}
diff --git a/pkg/dds/test/get_cached_cpu_samples_test.dart b/pkg/dds/test/get_cached_cpu_samples_test.dart
index 77d2bdb..d8e900e 100644
--- a/pkg/dds/test/get_cached_cpu_samples_test.dart
+++ b/pkg/dds/test/get_cached_cpu_samples_test.dart
@@ -42,8 +42,15 @@
       final availableCaches = await service.getAvailableCachedCpuSamples();
       expect(availableCaches.cacheNames.length, 0);
 
-      final isolate = (await service.getVM()).isolates!.first;
-
+      IsolateRef isolate;
+      while (true) {
+        final vm = await service.getVM();
+        if (vm.isolates!.isNotEmpty) {
+          isolate = vm.isolates!.first;
+          break;
+        }
+        await Future.delayed(const Duration(seconds: 1));
+      }
       try {
         await service.getCachedCpuSamples(isolate.id!, 'Fake');
         fail('Invalid userTag did not cause an exception');
@@ -73,7 +80,18 @@
       expect(availableCaches.cacheNames.length, 1);
       expect(availableCaches.cacheNames.first, kUserTag);
 
-      final isolate = (await service.getVM()).isolates!.first;
+      IsolateRef isolate;
+      while (true) {
+        final vm = await service.getVM();
+        if (vm.isolates!.isNotEmpty) {
+          isolate = vm.isolates!.first;
+          isolate = await service.getIsolate(isolate.id!);
+          if ((isolate as Isolate).runnable!) {
+            break;
+          }
+        }
+        await Future.delayed(const Duration(seconds: 1));
+      }
 
       final completer = Completer<void>();
       int i = 0;
diff --git a/pkg/dds/tool/dap/README.md b/pkg/dds/tool/dap/README.md
index 216d648..26bbeb3 100644
--- a/pkg/dds/tool/dap/README.md
+++ b/pkg/dds/tool/dap/README.md
@@ -15,7 +15,7 @@
 
 For details on the standard DAP functionality, see [the Debug Adapter Protocol Overview](https://microsoft.github.io/debug-adapter-protocol/) and [the Debug Adapter Protocol Specification](https://microsoft.github.io/debug-adapter-protocol/specification). Custom extensions are detailed below.
 
-**Flutter**: To run Flutter apps, the equivalent command should be run through the `flutter` tool. This is unavailable at the time of writing, but details will be linked here once available.
+**Flutter**: Flutter apps should be run using the debug adapter in the `flutter` tool - [see this document](https://github.com/flutter/flutter/blob/master/packages/flutter_tools/lib/src/debug_adapters/README.md).
 
 ## Launch/Attach Arguments
 
@@ -29,15 +29,20 @@
 - `int? vmServicePort` - the port to bind the VM Service too
 - `List<String>? additionalProjectPaths` - paths of any projects (outside of `cwd`) that are open in the users workspace
 - `String? cwd` - the working directory for the Dart process to be spawned in
+- `Map<String, String>? env` - environment variables to be passed to any spawned process
 
 Arguments specific to `launchRequest` are:
 
 - `bool? noDebug` - whether to run in debug or noDebug mode (if not supplied, defaults to debug)
 - `String program` - the path of the Dart program to run
-- `List<String>? args` - arguments to be passed to the Dart program
-- `List<String>? toolArgs` - arguments for the Dart VM
+- `List<String>? args` - arguments to be passed to the Dart program (after the `program` on the command line)
+- `List<String>? toolArgs` - arguments passed after the tool that will run `program` (after `dart` for CLI scripts and after `dart run test:test` for test scripts)
+- `List<String>? vmAdditionalArgs` - arguments passed directly to the Dart VM (after `dart` for both CLI scripts and test scripts)
 - `String? console` - if set to `"terminal"` or `"externalTerminal"` will be run using the `runInTerminal` reverse-request; otherwise the debug adapter spawns the Dart process
 - `bool? enableAsserts` - whether to enable asserts (if not supplied, defaults to enabled)
+- `String? customTool` - an optional tool to run instead of `dart` - the custom tool must be completely compatible with the tool/command it is replacing
+- `int? customToolReplacesArgs` - the number of arguments to delete from the beginning of the argument list when invoking `customTool` - e.g. setting `customTool` to `dart_test` and
+  `customToolReplacesArgs` to `2` for a test run would invoke `dart_test foo_test.dart` instead of `dart run test:test foo_test.dart` (if larger than the number of computed arguments all arguments will be removed, if not supplied will default to `0`)
 
 Arguments specific to `attachRequest` are:
 
@@ -74,6 +79,17 @@
 }
 ```
 
+### `hotReload`
+
+`hotReload` calls the VM's `reloadSources` service for each active isolate, reloading all modified source files.
+
+```
+{
+	"method": "hotReload",
+	"params": null
+}
+```
+
 ## Custom Events
 
 The debug adapter may emit several custom events that are useful to clients.
diff --git a/pkg/dev_compiler/analysis_options.yaml b/pkg/dev_compiler/analysis_options.yaml
index c1925c0..f93da08 100644
--- a/pkg/dev_compiler/analysis_options.yaml
+++ b/pkg/dev_compiler/analysis_options.yaml
@@ -1,8 +1,8 @@
 include: package:lints/recommended.yaml
 
 analyzer:
-  strong-mode:
-    implicit-casts: false
+  language:
+    strict-casts: true
   errors:
     todo: ignore
     avoid_function_literals_in_foreach_calls: ignore
diff --git a/pkg/dev_compiler/bin/dartdevc.dart b/pkg/dev_compiler/bin/dartdevc.dart
old mode 100755
new mode 100644
index 4d8d197..09d9ca8
--- a/pkg/dev_compiler/bin/dartdevc.dart
+++ b/pkg/dev_compiler/bin/dartdevc.dart
@@ -1,5 +1,5 @@
 #!/usr/bin/env dart
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
 // for 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,106 +8,14 @@
 /// Command line entry point for Dart Development Compiler (dartdevc), used to
 /// compile a collection of dart libraries into a single JS module
 
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
 import 'dart:isolate';
-import 'package:bazel_worker/bazel_worker.dart';
-import 'package:dev_compiler/src/compiler/shared_command.dart';
-import 'package:dev_compiler/src/kernel/expression_compiler_worker.dart';
+
+import 'package:dev_compiler/ddc.dart' as ddc;
 
 /// The entry point for the Dart Dev Compiler.
 ///
 /// [sendPort] may be passed in when started in an isolate. If provided, it is
 /// used for bazel worker communication instead of stdin/stdout.
 Future main(List<String> args, [SendPort sendPort]) async {
-  // Always returns a new modifiable list.
-  var parsedArgs = ParsedArguments.from(args);
-
-  if (parsedArgs.isWorker) {
-    var workerConnection = sendPort == null
-        ? StdAsyncWorkerConnection()
-        : SendPortAsyncWorkerConnection(sendPort);
-    await _CompilerWorker(parsedArgs, workerConnection).run();
-  } else if (parsedArgs.isBatch) {
-    await runBatch(parsedArgs);
-  } else if (parsedArgs.isExpressionCompiler) {
-    await ExpressionCompilerWorker.createAndStart(parsedArgs.rest,
-        sendPort: sendPort);
-  } else {
-    var result = await compile(parsedArgs);
-    exitCode = result.exitCode;
-  }
-}
-
-/// Runs the compiler worker loop.
-class _CompilerWorker extends AsyncWorkerLoop {
-  /// The original args supplied to the executable.
-  final ParsedArguments _startupArgs;
-
-  _CompilerWorker(this._startupArgs, AsyncWorkerConnection workerConnection)
-      : super(connection: workerConnection);
-
-  /// Keeps track of our last compilation result so it can potentially be
-  /// re-used in a worker.
-  CompilerResult lastResult;
-
-  /// Performs each individual work request.
-  @override
-  Future<WorkResponse> performRequest(WorkRequest request) async {
-    var args = _startupArgs.merge(request.arguments);
-    var output = StringBuffer();
-    var context = args.reuseResult ? lastResult : null;
-
-    /// Build a map of uris to digests.
-    final inputDigests = <Uri, List<int>>{};
-    for (var input in request.inputs) {
-      inputDigests[sourcePathToUri(input.path)] = input.digest;
-    }
-
-    lastResult = await runZoned(
-        () =>
-            compile(args, previousResult: context, inputDigests: inputDigests),
-        zoneSpecification:
-            ZoneSpecification(print: (self, parent, zone, message) {
-      output.writeln(message.toString());
-    }));
-    return WorkResponse()
-      ..exitCode = lastResult.success ? 0 : 1
-      ..output = output.toString();
-  }
-}
-
-/// Runs DDC in Kernel batch mode for test.dart.
-Future runBatch(ParsedArguments batchArgs) async {
-  var totalTests = 0;
-  var failedTests = 0;
-  var watch = Stopwatch()..start();
-
-  print('>>> BATCH START');
-
-  String line;
-  CompilerResult result;
-
-  while ((line = stdin.readLineSync(encoding: utf8))?.isNotEmpty == true) {
-    totalTests++;
-    var args = batchArgs.merge(line.split(RegExp(r'\s+')));
-
-    String outcome;
-    try {
-      result = await compile(args, previousResult: result);
-      outcome = result.success ? 'PASS' : (result.crashed ? 'CRASH' : 'FAIL');
-    } catch (e, s) {
-      outcome = 'CRASH';
-      print('Unhandled exception:');
-      print(e);
-      print(s);
-    }
-
-    stderr.writeln('>>> EOF STDERR');
-    print('>>> TEST $outcome ${watch.elapsedMilliseconds}ms');
-  }
-
-  var time = watch.elapsedMilliseconds;
-  print('>>> BATCH END (${totalTests - failedTests})/$totalTests ${time}ms');
+  return ddc.internalMain(args, sendPort);
 }
diff --git a/pkg/dev_compiler/lib/ddc.dart b/pkg/dev_compiler/lib/ddc.dart
new file mode 100755
index 0000000..5911cd9
--- /dev/null
+++ b/pkg/dev_compiler/lib/ddc.dart
@@ -0,0 +1,113 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+/// Command line entry point for Dart Development Compiler (dartdevc), used to
+/// compile a collection of dart libraries into a single JS module
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+import 'dart:isolate';
+import 'package:bazel_worker/bazel_worker.dart';
+
+import 'src/compiler/shared_command.dart';
+import 'src/kernel/expression_compiler_worker.dart';
+
+/// The internal entry point for the Dart Dev Compiler.
+///
+/// [sendPort] may be passed in when started in an isolate. If provided, it is
+/// used for bazel worker communication instead of stdin/stdout.
+Future internalMain(List<String> args, [SendPort sendPort]) async {
+  // Always returns a new modifiable list.
+  var parsedArgs = ParsedArguments.from(args);
+
+  if (parsedArgs.isWorker) {
+    var workerConnection = sendPort == null
+        ? StdAsyncWorkerConnection()
+        : SendPortAsyncWorkerConnection(sendPort);
+    await _CompilerWorker(parsedArgs, workerConnection).run();
+  } else if (parsedArgs.isBatch) {
+    await runBatch(parsedArgs);
+  } else if (parsedArgs.isExpressionCompiler) {
+    await ExpressionCompilerWorker.createAndStart(parsedArgs.rest,
+        sendPort: sendPort);
+  } else {
+    var result = await compile(parsedArgs);
+    exitCode = result.exitCode;
+  }
+}
+
+/// Runs the compiler worker loop.
+class _CompilerWorker extends AsyncWorkerLoop {
+  /// The original args supplied to the executable.
+  final ParsedArguments _startupArgs;
+
+  _CompilerWorker(this._startupArgs, AsyncWorkerConnection workerConnection)
+      : super(connection: workerConnection);
+
+  /// Keeps track of our last compilation result so it can potentially be
+  /// re-used in a worker.
+  CompilerResult lastResult;
+
+  /// Performs each individual work request.
+  @override
+  Future<WorkResponse> performRequest(WorkRequest request) async {
+    var args = _startupArgs.merge(request.arguments);
+    var output = StringBuffer();
+    var context = args.reuseResult ? lastResult : null;
+
+    /// Build a map of uris to digests.
+    final inputDigests = <Uri, List<int>>{};
+    for (var input in request.inputs) {
+      inputDigests[sourcePathToUri(input.path)] = input.digest;
+    }
+
+    lastResult = await runZoned(
+        () =>
+            compile(args, previousResult: context, inputDigests: inputDigests),
+        zoneSpecification:
+            ZoneSpecification(print: (self, parent, zone, message) {
+      output.writeln(message.toString());
+    }));
+    return WorkResponse()
+      ..exitCode = lastResult.success ? 0 : 1
+      ..output = output.toString();
+  }
+}
+
+/// Runs DDC in Kernel batch mode for test.dart.
+Future runBatch(ParsedArguments batchArgs) async {
+  var totalTests = 0;
+  var failedTests = 0;
+  var watch = Stopwatch()..start();
+
+  print('>>> BATCH START');
+
+  String line;
+  CompilerResult result;
+
+  while ((line = stdin.readLineSync(encoding: utf8))?.isNotEmpty == true) {
+    totalTests++;
+    var args = batchArgs.merge(line.split(RegExp(r'\s+')));
+
+    String outcome;
+    try {
+      result = await compile(args, previousResult: result);
+      outcome = result.success ? 'PASS' : (result.crashed ? 'CRASH' : 'FAIL');
+    } catch (e, s) {
+      outcome = 'CRASH';
+      print('Unhandled exception:');
+      print(e);
+      print(s);
+    }
+
+    stderr.writeln('>>> EOF STDERR');
+    print('>>> TEST $outcome ${watch.elapsedMilliseconds}ms');
+  }
+
+  var time = watch.elapsedMilliseconds;
+  print('>>> BATCH END (${totalTests - failedTests})/$totalTests ${time}ms');
+}
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index d8435ca..5b514be 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -338,10 +338,16 @@
     result = await fe.compile(compilerState, inputs, diagnosticMessageHandler);
   } else {
     compilerState.options.onDiagnostic = diagnosticMessageHandler;
-    var incrementalComponent = await incrementalCompiler.computeDelta(
-        entryPoints: inputs, fullComponent: true);
-    result = fe.DdcResult(incrementalComponent, cachedSdkInput.component,
-        doneAdditionalDills, incrementalCompiler.userCode.loader.hierarchy);
+    var incrementalCompilerResult = await incrementalCompiler.computeDelta(
+        entryPoints: inputs,
+        fullComponent: true,
+        trackNeededDillLibraries: recordUsedInputs);
+    result = fe.DdcResult(
+        incrementalCompilerResult.component,
+        cachedSdkInput.component,
+        doneAdditionalDills,
+        incrementalCompilerResult.classHierarchy,
+        incrementalCompilerResult.neededDillLibraries);
   }
   compilerState.options.onDiagnostic = null; // See http://dartbug.com/36983.
 
@@ -476,9 +482,10 @@
   if (recordUsedInputs) {
     var usedOutlines = <Uri>{};
     if (useIncrementalCompiler) {
-      compilerState.incrementalCompiler
-          .updateNeededDillLibrariesWithHierarchy(result.classHierarchy, null);
-      for (var lib in compilerState.incrementalCompiler.neededDillLibraries) {
+      var neededDillLibraries = result.neededDillLibraries;
+      compilerState.incrementalCompiler.updateNeededDillLibrariesWithHierarchy(
+          neededDillLibraries, result.classHierarchy);
+      for (var lib in neededDillLibraries) {
         if (lib.importUri.scheme == 'dart') continue;
         var uri = compilerState.libraryToInputDill[lib.importUri];
         if (uri == null) {
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 131d308..a25692d 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -1612,14 +1612,12 @@
     var fn = node.function;
     var body = _emitArgumentInitializers(fn, node.name.text);
 
-    // Redirecting constructors: these are not allowed to have initializers,
-    // and the redirecting ctor invocation runs before field initializers.
-    var redirectCall = node.initializers
-            .firstWhere((i) => i is RedirectingInitializer, orElse: () => null)
-        as RedirectingInitializer;
-
-    if (redirectCall != null) {
-      body.add(_emitRedirectingConstructor(redirectCall, className));
+    // Redirecting constructors are not allowed to have conventional
+    // initializers but can have variable declarations in the form of
+    // initializers to support named arguments appearing anywhere in the
+    // arguments list.
+    if (node.initializers.any((i) => i is RedirectingInitializer)) {
+      body.add(_emitRedirectingConstructor(node.initializers, className));
       return body;
     }
 
@@ -1652,15 +1650,23 @@
   }
 
   js_ast.Statement _emitRedirectingConstructor(
-      RedirectingInitializer node, js_ast.Expression className) {
-    var ctor = node.target;
-    // We can't dispatch to the constructor with `this.new` as that might hit a
-    // derived class constructor with the same name.
-    return js.statement('#.#.call(this, #);', [
-      className,
-      _constructorName(ctor.name.text),
-      _emitArgumentList(node.arguments, types: false)
-    ]);
+      List<Initializer> initializers, js_ast.Expression className) {
+    var jsInitializers = <js_ast.Statement>[
+      for (var init in initializers)
+        if (init is LocalInitializer)
+          // Temporary locals are created when named arguments don't appear at
+          // the end of the arguments list.
+          visitVariableDeclaration(init.variable)
+        else if (init is RedirectingInitializer)
+          // We can't dispatch to the constructor with `this.new` as that might
+          // hit a derived class constructor with the same name.
+          js.statement('#.#.call(this, #);', [
+            className,
+            _constructorName(init.target.name.text),
+            _emitArgumentList(init.arguments, types: false)
+          ])
+    ];
+    return js_ast.Block(jsInitializers);
   }
 
   js_ast.Statement _emitSuperConstructorCallIfNeeded(
@@ -5373,7 +5379,16 @@
     // setter, or method. For the case of tearing off a `super` method in
     // contexts where `super` isn't allowed, see [_emitSuperTearoff].
     var name = member.name.text;
-    var jsMethod = _superHelpers.putIfAbsent(name, () {
+    var getter = (member is Field && !setter) ||
+        (member is Procedure && member.isGetter);
+    // Prefix applied to the name only used in the compiler for a map key. This
+    // name does not make its way into the compiled program.
+    var lookupPrefix = setter
+        ? r'set$'
+        : getter
+            ? r'get$'
+            : '';
+    var jsMethod = _superHelpers.putIfAbsent('$lookupPrefix$name', () {
       var isAccessor = member is Procedure ? member.isAccessor : true;
       if (isAccessor) {
         assert(member is Procedure
diff --git a/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart b/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
index 4e2cd32..a41722c 100644
--- a/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
@@ -310,7 +310,7 @@
 
       _log('Compiling expression \n$expression');
 
-      var dartScope = await _findScopeAt(Uri.parse(libraryUri), line, column);
+      var dartScope = _findScopeAt(Uri.parse(libraryUri), line, column);
       if (dartScope == null) {
         _log('Scope not found at $libraryUri:$line:$column');
         return null;
@@ -389,14 +389,14 @@
     }
   }
 
-  Future<DartScope> _findScopeAt(Uri libraryUri, int line, int column) async {
+  DartScope _findScopeAt(Uri libraryUri, int line, int column) {
     if (line < 0) {
       onDiagnostic(_createInternalError(
           libraryUri, line, column, 'Invalid source location'));
       return null;
     }
 
-    var library = await _getLibrary(libraryUri);
+    var library = _getLibrary(libraryUri);
     if (library == null) {
       onDiagnostic(_createInternalError(
           libraryUri, line, column, 'Dart library not found for location'));
@@ -415,19 +415,8 @@
     return scope;
   }
 
-  Future<Library> _getLibrary(Uri libraryUri) async {
-    return await _compiler.context.runInContext((_) async {
-      var builder = _compiler.userCode.loader.lookupLibraryBuilder(libraryUri);
-      if (builder != null) {
-        var library =
-            _compiler.userCode.loader.read(libraryUri, -1, accessor: builder);
-
-        return library.library;
-      }
-
-      _log('Loaded library for expression');
-      return null;
-    });
+  Library _getLibrary(Uri libraryUri) {
+    return _compiler.lookupLibrary(libraryUri);
   }
 
   /// Return a JS function that returns the evaluated results when called.
diff --git a/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart b/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
index 1068a8a..6d5c418 100644
--- a/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
+++ b/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
@@ -357,8 +357,9 @@
     var incrementalCompiler = IncrementalCompiler.forExpressionCompilationOnly(
         CompilerContext(_processedOptions), component, /*resetTicker*/ false);
 
-    var finalComponent = await incrementalCompiler
+    var incrementalCompilerResult = await incrementalCompiler
         .computeDelta(entryPoints: [libraryUri], fullComponent: true);
+    var finalComponent = incrementalCompilerResult.component;
     assert(!duplicateLibrariesReachable(finalComponent.libraries));
     assert(_canSerialize(finalComponent));
 
@@ -374,8 +375,8 @@
       };
     }
 
-    var coreTypes = incrementalCompiler.getCoreTypes();
-    var hierarchy = incrementalCompiler.getClassHierarchy();
+    var coreTypes = incrementalCompilerResult.coreTypes;
+    var hierarchy = incrementalCompilerResult.classHierarchy;
 
     var kernel2jsCompiler = ProgramCompiler(
       finalComponent,
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart
index bc5786d..90f0eef 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart
@@ -117,17 +117,19 @@
     // compilers/components/names per module.
     setup.options.packagesFileUri = packages;
     var compiler = DevelopmentIncrementalCompiler(setup.options, input);
-    var component = await compiler.computeDelta();
+    var compilerResult = await compiler.computeDelta();
+    var component = compilerResult.component;
     component.computeCanonicalNames();
     // Initialize DDC.
     var moduleName = p.basenameWithoutExtension(output.toFilePath());
 
-    var classHierarchy = compiler.getClassHierarchy();
+    var classHierarchy = compilerResult.classHierarchy;
     var compilerOptions = SharedCompilerOptions(
         replCompile: true,
         moduleName: moduleName,
-        soundNullSafety: setup.soundNullSafety);
-    var coreTypes = compiler.getCoreTypes();
+        soundNullSafety: setup.soundNullSafety,
+        emitDebugMetadata: true);
+    var coreTypes = compilerResult.coreTypes;
 
     final importToSummary = Map<Library, Component>.identity();
     final summaryToModule = Map<Component, String>.identity();
@@ -145,10 +147,10 @@
     var code = jsProgramToCode(
       module,
       setup.moduleFormat,
-      inlineSourceMap: true,
-      buildSourceMap: true,
-      emitDebugMetadata: true,
-      emitDebugSymbols: true,
+      inlineSourceMap: compilerOptions.inlineSourceMap,
+      buildSourceMap: compilerOptions.sourceMap,
+      emitDebugMetadata: compilerOptions.emitDebugMetadata,
+      emitDebugSymbols: compilerOptions.emitDebugSymbols,
       jsUrl: '$output',
       mapUrl: '$output.map',
       compiler: kernel2jsCompiler,
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart
index 66db5dd..8dc187d 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart
@@ -76,18 +76,19 @@
     // initialize incremental compiler and create component
     setup.options.packagesFileUri = packages;
     var compiler = DevelopmentIncrementalCompiler(setup.options, input);
-    var component = await compiler.computeDelta();
+    var compilerResult = await compiler.computeDelta();
+    var component = compilerResult.component;
     component.computeCanonicalNames();
 
     // initialize ddc
     var moduleName = 'foo.dart';
-    var classHierarchy = compiler.getClassHierarchy();
+    var classHierarchy = compilerResult.classHierarchy;
     var compilerOptions = SharedCompilerOptions(
         replCompile: true,
         moduleName: moduleName,
         soundNullSafety: setup.soundNullSafety,
         moduleFormats: [setup.moduleFormat]);
-    var coreTypes = compiler.getCoreTypes();
+    var coreTypes = compilerResult.coreTypes;
 
     final importToSummary = Map<Library, Component>.identity();
     final summaryToModule = Map<Component, String>.identity();
diff --git a/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart b/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart
index 4fb6eb6..b607f71 100644
--- a/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart
+++ b/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart
@@ -21,7 +21,8 @@
     // Initialize incremental compiler and create component.
     setup.options.packagesFileUri = packages;
     var compiler = DevelopmentIncrementalCompiler(setup.options, input);
-    var component = await compiler.computeDelta();
+    var compilerResult = await compiler.computeDelta();
+    var component = compilerResult.component;
     component.computeCanonicalNames();
     var errors = setup.errors.where((e) => e.contains('Error'));
     if (errors.isNotEmpty) {
@@ -30,14 +31,14 @@
 
     // Initialize DDC.
     var moduleName = 'foo.dart';
-    var classHierarchy = compiler.getClassHierarchy();
+    var classHierarchy = compilerResult.classHierarchy;
     var compilerOptions = SharedCompilerOptions(
         replCompile: true,
         moduleName: moduleName,
         soundNullSafety: setup.soundNullSafety,
         moduleFormats: [setup.moduleFormat],
         emitDebugSymbols: true);
-    var coreTypes = compiler.getCoreTypes();
+    var coreTypes = compilerResult.coreTypes;
 
     final importToSummary = Map<Library, Component>.identity();
     final summaryToModule = Map<Component, String>.identity();
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_async_star_yield.dart b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_async_star_yield.dart
index 82e0be2..ad18584 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_async_star_yield.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_async_star_yield.dart
@@ -5,7 +5,7 @@
 // @dart = 2.9
 
 void main() async {
-  await for (var i in foobar()) {
+  await for (var i in foobar() as Stream) {
     print(i);
   }
   print('Done!');
diff --git a/pkg/front_end/analysis_options_no_lints.yaml b/pkg/front_end/analysis_options_no_lints.yaml
index d699e16..cc832b8 100644
--- a/pkg/front_end/analysis_options_no_lints.yaml
+++ b/pkg/front_end/analysis_options_no_lints.yaml
@@ -4,6 +4,7 @@
 
 analyzer:
   exclude:
+    - outline_extraction_testcases/**
     - parser_testcases/**
     - test/analyser_ignored/**
     - test/class_hierarchy/data/**
@@ -11,6 +12,7 @@
     - test/extensions/data/**
     - test/id_testing/data/**
     - test/language_versioning/data/**
+    - test/macros/data/**
     - test/patching/data/**
     - test/predicates/data/**
     - test/static_types/data/**
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
index 4f3c912..50570c9 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
@@ -32,25 +32,25 @@
 }
 
 const Version enableAlternativeInvalidationStrategyVersion =
-    const Version(2, 15);
-const Version enableConstFunctionsVersion = const Version(2, 15);
+    const Version(2, 16);
+const Version enableConstFunctionsVersion = const Version(2, 16);
 const Version enableConstantUpdate2018Version = const Version(2, 0);
 const Version enableConstructorTearoffsVersion = const Version(2, 15);
 const Version enableControlFlowCollectionsVersion = const Version(2, 0);
-const Version enableEnhancedEnumsVersion = const Version(2, 15);
+const Version enableEnhancedEnumsVersion = const Version(2, 16);
 const Version enableExtensionMethodsVersion = const Version(2, 6);
-const Version enableExtensionTypesVersion = const Version(2, 15);
+const Version enableExtensionTypesVersion = const Version(2, 16);
 const Version enableGenericMetadataVersion = const Version(2, 14);
-const Version enableNamedArgumentsAnywhereVersion = const Version(2, 15);
+const Version enableNamedArgumentsAnywhereVersion = const Version(2, 16);
 const Version enableNonNullableVersion = const Version(2, 12);
 const Version enableNonfunctionTypeAliasesVersion = const Version(2, 13);
 const Version enableSetLiteralsVersion = const Version(2, 0);
 const Version enableSpreadCollectionsVersion = const Version(2, 0);
-const Version enableSuperParametersVersion = const Version(2, 15);
-const Version enableTestExperimentVersion = const Version(2, 15);
+const Version enableSuperParametersVersion = const Version(2, 16);
+const Version enableTestExperimentVersion = const Version(2, 16);
 const Version enableTripleShiftVersion = const Version(2, 14);
-const Version enableValueClassVersion = const Version(2, 15);
-const Version enableVarianceVersion = const Version(2, 15);
+const Version enableValueClassVersion = const Version(2, 16);
+const Version enableVarianceVersion = const Version(2, 16);
 
 ExperimentalFlag? parseExperimentalFlag(String flag) {
   switch (flag) {
@@ -141,47 +141,47 @@
 };
 
 const Map<ExperimentalFlag, Version> experimentEnabledVersion = {
-  ExperimentalFlag.alternativeInvalidationStrategy: const Version(2, 15),
-  ExperimentalFlag.constFunctions: const Version(2, 15),
+  ExperimentalFlag.alternativeInvalidationStrategy: const Version(2, 16),
+  ExperimentalFlag.constFunctions: const Version(2, 16),
   ExperimentalFlag.constantUpdate2018: const Version(2, 0),
   ExperimentalFlag.constructorTearoffs: const Version(2, 15),
   ExperimentalFlag.controlFlowCollections: const Version(2, 0),
-  ExperimentalFlag.enhancedEnums: const Version(2, 15),
+  ExperimentalFlag.enhancedEnums: const Version(2, 16),
   ExperimentalFlag.extensionMethods: const Version(2, 6),
-  ExperimentalFlag.extensionTypes: const Version(2, 15),
+  ExperimentalFlag.extensionTypes: const Version(2, 16),
   ExperimentalFlag.genericMetadata: const Version(2, 14),
-  ExperimentalFlag.namedArgumentsAnywhere: const Version(2, 15),
+  ExperimentalFlag.namedArgumentsAnywhere: const Version(2, 16),
   ExperimentalFlag.nonNullable: const Version(2, 12),
   ExperimentalFlag.nonfunctionTypeAliases: const Version(2, 13),
   ExperimentalFlag.setLiterals: const Version(2, 0),
   ExperimentalFlag.spreadCollections: const Version(2, 0),
-  ExperimentalFlag.superParameters: const Version(2, 15),
-  ExperimentalFlag.testExperiment: const Version(2, 15),
+  ExperimentalFlag.superParameters: const Version(2, 16),
+  ExperimentalFlag.testExperiment: const Version(2, 16),
   ExperimentalFlag.tripleShift: const Version(2, 14),
-  ExperimentalFlag.valueClass: const Version(2, 15),
-  ExperimentalFlag.variance: const Version(2, 15),
+  ExperimentalFlag.valueClass: const Version(2, 16),
+  ExperimentalFlag.variance: const Version(2, 16),
 };
 
 const Map<ExperimentalFlag, Version> experimentReleasedVersion = {
-  ExperimentalFlag.alternativeInvalidationStrategy: const Version(2, 15),
-  ExperimentalFlag.constFunctions: const Version(2, 15),
+  ExperimentalFlag.alternativeInvalidationStrategy: const Version(2, 16),
+  ExperimentalFlag.constFunctions: const Version(2, 16),
   ExperimentalFlag.constantUpdate2018: const Version(2, 0),
   ExperimentalFlag.constructorTearoffs: const Version(2, 15),
   ExperimentalFlag.controlFlowCollections: const Version(2, 0),
-  ExperimentalFlag.enhancedEnums: const Version(2, 15),
+  ExperimentalFlag.enhancedEnums: const Version(2, 16),
   ExperimentalFlag.extensionMethods: const Version(2, 6),
-  ExperimentalFlag.extensionTypes: const Version(2, 15),
+  ExperimentalFlag.extensionTypes: const Version(2, 16),
   ExperimentalFlag.genericMetadata: const Version(2, 14),
-  ExperimentalFlag.namedArgumentsAnywhere: const Version(2, 15),
+  ExperimentalFlag.namedArgumentsAnywhere: const Version(2, 16),
   ExperimentalFlag.nonNullable: const Version(2, 10),
   ExperimentalFlag.nonfunctionTypeAliases: const Version(2, 13),
   ExperimentalFlag.setLiterals: const Version(2, 0),
   ExperimentalFlag.spreadCollections: const Version(2, 0),
-  ExperimentalFlag.superParameters: const Version(2, 15),
-  ExperimentalFlag.testExperiment: const Version(2, 15),
+  ExperimentalFlag.superParameters: const Version(2, 16),
+  ExperimentalFlag.testExperiment: const Version(2, 16),
   ExperimentalFlag.tripleShift: const Version(2, 14),
-  ExperimentalFlag.valueClass: const Version(2, 15),
-  ExperimentalFlag.variance: const Version(2, 15),
+  ExperimentalFlag.valueClass: const Version(2, 16),
+  ExperimentalFlag.variance: const Version(2, 16),
 };
 
 const AllowedExperimentalFlags defaultAllowedExperimentalFlags =
diff --git a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
index d28d71c..ae632ec 100644
--- a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
@@ -10,7 +10,7 @@
 import 'package:kernel/core_types.dart' show CoreTypes;
 
 import 'package:kernel/kernel.dart'
-    show Component, Procedure, DartType, TypeParameter;
+    show Component, Library, Procedure, DartType, TypeParameter;
 
 import '../base/processed_options.dart' show ProcessedOptions;
 
@@ -70,17 +70,13 @@
         component);
   }
 
-  /// Returns a component whose libraries are the recompiled libraries,
-  /// or - in the case of [fullComponent] - a full Component.
-  Future<Component> computeDelta({List<Uri>? entryPoints, bool fullComponent});
-
-  /// Returns [CoreTypes] used during compilation.
-  /// Valid after [computeDelta] is called.
-  CoreTypes? getCoreTypes();
-
-  /// Returns [ClassHierarchy] used during compilation.
-  /// Valid after [computeDelta] is called.
-  ClassHierarchy? getClassHierarchy();
+  /// Returns an [IncrementalCompilerResult] with the component whose libraries
+  /// are the recompiled libraries, or - in the case of [fullComponent] - a full
+  /// Component.
+  Future<IncrementalCompilerResult> computeDelta(
+      {List<Uri>? entryPoints,
+      bool fullComponent: false,
+      bool trackNeededDillLibraries: false});
 
   /// Remove the file associated with the given file [uri] from the set of
   /// valid files.  This guarantees that those files will be re-read on the
@@ -149,3 +145,13 @@
 bool isLegalIdentifier(String identifier) {
   return StringScanner.isLegalIdentifier(identifier);
 }
+
+class IncrementalCompilerResult {
+  final Component component;
+  final ClassHierarchy? classHierarchy;
+  final CoreTypes? coreTypes;
+  final Set<Library>? neededDillLibraries;
+
+  IncrementalCompilerResult(this.component,
+      {this.classHierarchy, this.coreTypes, this.neededDillLibraries});
+}
diff --git a/pkg/front_end/lib/src/api_prototype/lowering_predicates.dart b/pkg/front_end/lib/src/api_prototype/lowering_predicates.dart
index 1375e06a..85f6052 100644
--- a/pkg/front_end/lib/src/api_prototype/lowering_predicates.dart
+++ b/pkg/front_end/lib/src/api_prototype/lowering_predicates.dart
@@ -5,6 +5,11 @@
 import 'package:kernel/ast.dart';
 import '../fasta/kernel/late_lowering.dart';
 import '../fasta/source/source_extension_builder.dart' show extensionThisName;
+export '../fasta/kernel/constructor_tearoff_lowering.dart'
+    show
+        isConstructorTearOffLowering,
+        isTearOffLowering,
+        isTypedefTearOffLowering;
 
 /// Returns `true` if [node] is the field holding the value of a lowered late
 /// field.
diff --git a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
index 7d167c4..217bb40 100644
--- a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
+++ b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
@@ -137,8 +137,9 @@
 
 Future<CompilerResult> _compile(InitializedCompilerState compilerState,
     List<Uri> inputs, DiagnosticMessageHandler diagnosticMessageHandler,
-    {bool? summaryOnly, bool includeOffsets: true}) {
-  summaryOnly ??= true;
+    {bool? buildSummary, bool? buildComponent, bool includeOffsets: true}) {
+  buildSummary ??= true;
+  buildComponent ??= true;
   CompilerOptions options = compilerState.options;
   options..onDiagnostic = diagnosticMessageHandler;
 
@@ -147,8 +148,8 @@
   processedOpts.inputs.addAll(inputs);
 
   return generateKernel(processedOpts,
-      buildSummary: summaryOnly,
-      buildComponent: !summaryOnly,
+      buildSummary: buildSummary,
+      buildComponent: buildComponent,
       includeOffsets: includeOffsets);
 }
 
@@ -157,15 +158,18 @@
     {bool includeOffsets: false}) async {
   CompilerResult result = await _compile(
       compilerState, inputs, diagnosticMessageHandler,
-      summaryOnly: true, includeOffsets: includeOffsets);
+      buildSummary: true,
+      buildComponent: false,
+      includeOffsets: includeOffsets);
   return result.summary;
 }
 
 Future<Component?> compileComponent(InitializedCompilerState compilerState,
-    List<Uri> inputs, DiagnosticMessageHandler diagnosticMessageHandler) async {
+    List<Uri> inputs, DiagnosticMessageHandler diagnosticMessageHandler,
+    {bool buildSummary: true}) async {
   CompilerResult result = await _compile(
       compilerState, inputs, diagnosticMessageHandler,
-      summaryOnly: false);
+      buildSummary: buildSummary, buildComponent: true);
 
   Component? component = result.component;
   if (component != null) {
diff --git a/pkg/front_end/lib/src/api_unstable/ddc.dart b/pkg/front_end/lib/src/api_unstable/ddc.dart
index 0d7c334..2ebfdf1 100644
--- a/pkg/front_end/lib/src/api_unstable/ddc.dart
+++ b/pkg/front_end/lib/src/api_unstable/ddc.dart
@@ -85,9 +85,10 @@
   final Component? sdkSummary;
   final List<Component> additionalDills;
   final ClassHierarchy classHierarchy;
+  final Set<Library>? neededDillLibraries;
 
   DdcResult(this.component, this.sdkSummary, this.additionalDills,
-      this.classHierarchy)
+      this.classHierarchy, this.neededDillLibraries)
       // ignore: unnecessary_null_comparison
       : assert(classHierarchy != null);
 
@@ -221,5 +222,5 @@
   Component? sdkSummary = await processedOpts.loadSdkSummary(null);
   List<Component> summaries = await processedOpts.loadAdditionalDills(null);
   return new DdcResult(
-      component, sdkSummary, summaries, compilerResult.classHierarchy!);
+      component, sdkSummary, summaries, compilerResult.classHierarchy!, null);
 }
diff --git a/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart b/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
index 65eceae..346a4ae 100644
--- a/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
+++ b/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
@@ -121,7 +121,6 @@
             new CompilerContext(processedOpts),
             cachedSdkInput.component,
             outlineOnly);
-        incrementalCompiler.trackNeededDillLibraries = trackNeededDillLibraries;
       } else {
         options = oldState.options;
         processedOpts = oldState.processedOpts;
@@ -144,7 +143,6 @@
         // Reuse the incremental compiler, but reset as needed.
         incrementalCompiler = oldState.incrementalCompiler!;
         incrementalCompiler.invalidateAllSources();
-        incrementalCompiler.trackNeededDillLibraries = trackNeededDillLibraries;
         options.packagesFileUri = packagesFile;
         options.fileSystem = fileSystem;
         processedOpts.clearFileSystemCache();
diff --git a/pkg/front_end/lib/src/api_unstable/vm.dart b/pkg/front_end/lib/src/api_unstable/vm.dart
index 141014c..b9b4ca7 100644
--- a/pkg/front_end/lib/src/api_unstable/vm.dart
+++ b/pkg/front_end/lib/src/api_unstable/vm.dart
@@ -24,7 +24,11 @@
 export '../api_prototype/front_end.dart' show CompilerResult;
 
 export '../api_prototype/incremental_kernel_generator.dart'
-    show IncrementalKernelGenerator, IncrementalSerializer, isLegalIdentifier;
+    show
+        IncrementalCompilerResult,
+        IncrementalKernelGenerator,
+        IncrementalSerializer,
+        isLegalIdentifier;
 
 export '../api_prototype/kernel_generator.dart'
     show kernelForModule, kernelForProgram;
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index 2a94404..ecc964c 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -120,7 +120,8 @@
       int startCharOffset,
       int charOffset,
       int charEndOffset,
-      IndexedClass? referencesFromIndexed) {
+      IndexedClass? referencesFromIndexed,
+      Scope scope) {
     assert(enumConstantInfos == null || enumConstantInfos.isNotEmpty);
 
     Uri fileUri = parent.fileUri;
@@ -170,6 +171,7 @@
         reference: referencesFromIndexed?.cls.reference,
         fileUri: fileUri);
     Map<String, MemberBuilder> members = <String, MemberBuilder>{};
+    Map<String, MemberBuilder> setters = <String, MemberBuilder>{};
     Map<String, MemberBuilder> constructors = <String, MemberBuilder>{};
     NamedTypeBuilder selfType = new NamedTypeBuilder(
         name,
@@ -357,11 +359,18 @@
     }
     final int startCharOffsetComputed =
         metadata == null ? startCharOffset : metadata.first.charOffset;
+    scope.forEachLocalMember((name, member) {
+      members[name] = member as MemberBuilder;
+    });
+    scope.forEachLocalSetter((name, member) {
+      setters[name] = member;
+    });
     EnumBuilder enumBuilder = new EnumBuilder.internal(
         metadata,
         name,
         new Scope(
             local: members,
+            setters: setters,
             parent: parent.scope,
             debugName: "enum $name",
             isModifiable: false),
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 73cabf5..1672a7d 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -220,7 +220,7 @@
   bool get isPart => false;
 
   @override
-  String get debugName => "LibraryBuilder";
+  String get debugName => "$runtimeType";
 
   @override
   Loader get loader;
@@ -435,6 +435,11 @@
         ? const NullabilityBuilder.nullable()
         : const NullabilityBuilder.omitted();
   }
+
+  @override
+  StringBuffer printOn(StringBuffer buffer) {
+    return buffer..write(name ?? importUri);
+  }
 }
 
 class LibraryLocalDeclarationIterator implements Iterator<Builder> {
diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
index 0bfffd5..306c9aa 100644
--- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
@@ -285,6 +285,10 @@
       Uri fileUri,
       TypeAliasBuilder aliasBuilder,
       DartType type) {
+    // Don't report the error in case of InvalidType. An error has already been
+    // reported in this case.
+    if (type is InvalidType) return null;
+
     Message message;
     if (declaration!.isTypeVariable) {
       message =
@@ -400,7 +404,7 @@
         // from ClassHierarchyBuilder.
         TypeDeclarationBuilder? unaliasedDeclaration = this.declaration;
         // The following code assumes that the declaration is a TypeAliasBuilder
-        // that through a chain of other TypeAliasBuilders (possibly, the chian
+        // that through a chain of other TypeAliasBuilders (possibly, the chain
         // length is 0) references a ClassBuilder of the Null class.  Otherwise,
         // it won't produce the NullType on the output.
         while (unaliasedDeclaration is TypeAliasBuilder) {
@@ -421,7 +425,7 @@
         // class from ClassHierarchyBuilder.
         TypeDeclarationBuilder? unaliasedDeclaration = this.declaration;
         // The following code assumes that the declaration is a TypeAliasBuilder
-        // that through a chain of other TypeAliasBuilders (possibly, the chian
+        // that through a chain of other TypeAliasBuilders (possibly, the chain
         // length is 0) references a ClassBuilder of the FutureOr class.
         // Otherwise, it won't produce the FutureOrType on the output.
         while (unaliasedDeclaration is TypeAliasBuilder) {
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 61bdb2e..03b4da8 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -9,18 +9,6 @@
 import 'package:_fe_analyzer_shared/src/scanner/abstract_scanner.dart'
     show ScannerConfiguration;
 
-import 'package:front_end/src/api_prototype/experimental_flags.dart';
-
-import 'package:front_end/src/api_prototype/lowering_predicates.dart'
-    show isExtensionThisName;
-
-import 'package:front_end/src/base/nnbd_mode.dart';
-
-import 'package:front_end/src/fasta/builder/member_builder.dart'
-    show MemberBuilder;
-
-import 'package:front_end/src/fasta/fasta_codes.dart';
-import 'package:front_end/src/fasta/source/source_loader.dart';
 import 'package:kernel/binary/ast_from_binary.dart'
     show
         BinaryBuilderWithMetadata,
@@ -33,8 +21,6 @@
 import 'package:kernel/class_hierarchy.dart'
     show ClassHierarchy, ClosedWorldClassHierarchy;
 
-import 'package:kernel/core_types.dart' show CoreTypes;
-
 import 'package:kernel/kernel.dart'
     show
         Class,
@@ -69,13 +55,22 @@
 
 import 'package:package_config/package_config.dart' show Package, PackageConfig;
 
+import '../api_prototype/experimental_flags.dart';
+
 import '../api_prototype/file_system.dart' show FileSystem, FileSystemEntity;
 
 import '../api_prototype/incremental_kernel_generator.dart'
-    show IncrementalKernelGenerator, isLegalIdentifier;
+    show
+        IncrementalCompilerResult,
+        IncrementalKernelGenerator,
+        isLegalIdentifier;
+
+import '../api_prototype/lowering_predicates.dart' show isExtensionThisName;
 
 import '../api_prototype/memory_file_system.dart' show MemoryFileSystem;
 
+import '../base/nnbd_mode.dart';
+
 import 'builder/builder.dart' show Builder;
 
 import 'builder/class_builder.dart' show ClassBuilder;
@@ -86,6 +81,8 @@
 
 import 'builder/library_builder.dart' show LibraryBuilder;
 
+import 'builder/member_builder.dart' show MemberBuilder;
+
 import 'builder/name_iterator.dart' show NameIterator;
 
 import 'builder/type_builder.dart' show TypeBuilder;
@@ -107,6 +104,8 @@
 
 import 'export.dart' show Export;
 
+import 'fasta_codes.dart';
+
 import 'import.dart' show Import;
 
 import 'incremental_serializer.dart' show IncrementalSerializer;
@@ -134,6 +133,8 @@
 import 'source/source_library_builder.dart'
     show ImplicitLanguageVersion, SourceLibraryBuilder;
 
+import 'source/source_loader.dart';
+
 import 'ticker.dart' show Ticker;
 
 import 'uri_translator.dart' show UriTranslator;
@@ -143,78 +144,99 @@
 class IncrementalCompiler implements IncrementalKernelGenerator {
   final CompilerContext context;
 
-  final Ticker ticker;
-  final bool resetTicker;
+  final Ticker _ticker;
+  final bool _resetTicker;
   final bool outlineOnly;
-  bool trackNeededDillLibraries = false;
-  Set<Library>? neededDillLibraries;
 
-  Set<Uri?> invalidatedUris = new Set<Uri?>();
+  Set<Uri?> _invalidatedUris = new Set<Uri?>();
 
-  DillTarget? dillLoadedData;
-  List<LibraryBuilder>? platformBuilders;
-  Map<Uri, LibraryBuilder>? userBuilders;
-  final Uri? initializeFromDillUri;
-  Component? componentToInitializeFrom;
-  bool initializedFromDill = false;
-  bool initializedIncrementalSerializer = false;
-  Uri? previousPackagesUri;
-  Map<String, Package>? previousPackagesMap;
-  Map<String, Package>? currentPackagesMap;
-  bool hasToCheckPackageUris = false;
-  final bool initializedForExpressionCompilationOnly;
-  bool computeDeltaRunOnce = false;
-  Map<Uri, List<DiagnosticMessageFromJson>> remainingComponentProblems =
-      new Map<Uri, List<DiagnosticMessageFromJson>>();
-  List<Component>? modulesToLoad;
-  IncrementalSerializer? incrementalSerializer;
+  DillTarget? _dillLoadedData;
+  List<LibraryBuilder>? _platformBuilders;
+  Map<Uri, LibraryBuilder>? _userBuilders;
+
+  final _InitializationStrategy _initializationStrategy;
+
+  Uri? _previousPackagesUri;
+  Map<String, Package>? _previousPackagesMap;
+  Map<String, Package>? _currentPackagesMap;
+  bool _hasToCheckPackageUris = false;
+  final bool _initializedForExpressionCompilationOnly;
+  bool _computeDeltaRunOnce = false;
+  List<Component>? _modulesToLoad;
+  final IncrementalSerializer? _incrementalSerializer;
+  final _ComponentProblems _componentProblems = new _ComponentProblems();
+
+  RecorderForTesting? get recorderForTesting => null;
 
   static final Uri debugExprUri =
       new Uri(scheme: "org-dartlang-debug", path: "synthetic_debug_expression");
 
-  IncrementalKernelTarget? userCode;
-  Set<Library>? previousSourceBuilders;
+  IncrementalKernelTarget? _lastGoodKernelTarget;
+  Set<Library>? _previousSourceBuilders;
 
   /// Guard against multiple computeDelta calls at the same time (possibly
   /// caused by lacking awaits etc).
-  Completer<dynamic>? currentlyCompiling;
+  Completer<dynamic>? _currentlyCompiling;
 
   IncrementalCompiler.fromComponent(
-      this.context, this.componentToInitializeFrom,
-      [bool? outlineOnly, this.incrementalSerializer])
-      : ticker = context.options.ticker,
-        resetTicker = true,
-        initializeFromDillUri = null,
+      this.context, Component? _componentToInitializeFrom,
+      [bool? outlineOnly, this._incrementalSerializer])
+      : _ticker = context.options.ticker,
+        _resetTicker = true,
+        _initializationStrategy = new _InitializationStrategy.fromComponent(
+            _componentToInitializeFrom),
         this.outlineOnly = outlineOnly ?? false,
-        this.initializedForExpressionCompilationOnly = false {
-    enableExperimentsBasedOnEnvironment();
+        this._initializedForExpressionCompilationOnly = false {
+    _enableExperimentsBasedOnEnvironment();
   }
 
   IncrementalCompiler(this.context,
-      [this.initializeFromDillUri,
+      [Uri? _initializeFromDillUri,
       bool? outlineOnly,
-      this.incrementalSerializer])
-      : ticker = context.options.ticker,
-        resetTicker = true,
-        componentToInitializeFrom = null,
+      this._incrementalSerializer])
+      : _ticker = context.options.ticker,
+        _resetTicker = true,
+        _initializationStrategy =
+            new _InitializationStrategy.fromUri(_initializeFromDillUri),
         this.outlineOnly = outlineOnly ?? false,
-        this.initializedForExpressionCompilationOnly = false {
-    enableExperimentsBasedOnEnvironment();
+        this._initializedForExpressionCompilationOnly = false {
+    _enableExperimentsBasedOnEnvironment();
   }
 
   IncrementalCompiler.forExpressionCompilationOnly(
-      this.context, this.componentToInitializeFrom,
+      this.context, Component? _componentToInitializeFrom,
       [bool? resetTicker])
-      : ticker = context.options.ticker,
-        this.resetTicker = resetTicker ?? true,
-        initializeFromDillUri = null,
+      : _ticker = context.options.ticker,
+        this._resetTicker = resetTicker ?? true,
+        _initializationStrategy = new _InitializationStrategy.fromComponent(
+            _componentToInitializeFrom),
         this.outlineOnly = false,
-        this.incrementalSerializer = null,
-        this.initializedForExpressionCompilationOnly = true {
-    enableExperimentsBasedOnEnvironment();
+        this._incrementalSerializer = null,
+        this._initializedForExpressionCompilationOnly = true {
+    _enableExperimentsBasedOnEnvironment();
   }
 
-  void enableExperimentsBasedOnEnvironment({Set<String>? enabledExperiments}) {
+  bool get initializedFromDillForTesting =>
+      _initializationStrategy.initializedFromDillForTesting;
+
+  bool get initializedIncrementalSerializerForTesting =>
+      _initializationStrategy.initializedIncrementalSerializerForTesting;
+
+  DillTarget? get dillTargetForTesting => _dillLoadedData;
+
+  IncrementalKernelTarget? get kernelTargetForTesting => _lastGoodKernelTarget;
+
+  /// Returns the [Package] used for the package [packageName] in the most
+  /// recent compilation.
+  Package? getPackageForPackageName(String packageName) =>
+      _currentPackagesMap?[packageName];
+
+  /// Returns the [Library] with the given [importUri] from the most recent
+  /// compilation.
+  Library? lookupLibrary(Uri importUri) =>
+      _lastGoodKernelTarget?.loader.lookupLibraryBuilder(importUri)?.library;
+
+  void _enableExperimentsBasedOnEnvironment({Set<String>? enabledExperiments}) {
     // Note that these are all experimental. Use at your own risk.
     enabledExperiments ??= getExperimentEnvironment();
     // Currently there's no live experiments.
@@ -222,36 +244,45 @@
 
   @override
   void setExperimentalFeaturesForTesting(Set<String> features) {
-    enableExperimentsBasedOnEnvironment(enabledExperiments: features);
+    _enableExperimentsBasedOnEnvironment(enabledExperiments: features);
   }
 
   @override
-  Future<Component> computeDelta(
-      {List<Uri>? entryPoints, bool fullComponent: false}) async {
-    while (currentlyCompiling != null) {
-      await currentlyCompiling!.future;
+  Future<IncrementalCompilerResult> computeDelta(
+      {List<Uri>? entryPoints,
+      bool fullComponent: false,
+      bool trackNeededDillLibraries: false}) async {
+    while (_currentlyCompiling != null) {
+      await _currentlyCompiling!.future;
     }
-    currentlyCompiling = new Completer();
-    if (resetTicker) {
-      ticker.reset();
+    _currentlyCompiling = new Completer();
+    if (_resetTicker) {
+      _ticker.reset();
     }
     entryPoints ??= context.options.inputs;
-    return context.runInContext<Component>((CompilerContext c) async {
-      if (computeDeltaRunOnce && initializedForExpressionCompilationOnly) {
+    return context
+        .runInContext<IncrementalCompilerResult>((CompilerContext c) async {
+      if (_computeDeltaRunOnce && _initializedForExpressionCompilationOnly) {
         throw new StateError("Initialized for expression compilation: "
             "cannot do another general compile.");
       }
-      computeDeltaRunOnce = true;
+      _computeDeltaRunOnce = true;
+      IncrementalKernelTarget? lastGoodKernelTarget = _lastGoodKernelTarget;
+
       // Initial setup: Load platform, initialize from dill or component etc.
-      UriTranslator uriTranslator = await setupPackagesAndUriTranslator(c);
+      UriTranslator uriTranslator = await _setupPackagesAndUriTranslator(c);
       IncrementalCompilerData data =
-          await ensurePlatformAndInitialize(uriTranslator, c);
+          await _ensurePlatformAndInitialize(uriTranslator, c);
 
       // Figure out what to keep and what to throw away.
-      Set<Uri?> invalidatedUris = this.invalidatedUris.toSet();
-      invalidateNotKeptUserBuilders(invalidatedUris);
-      ReusageResult? reusedResult =
-          computeReusedLibraries(invalidatedUris, uriTranslator, entryPoints!);
+      Set<Uri?> invalidatedUris = this._invalidatedUris.toSet();
+      _invalidateNotKeptUserBuilders(invalidatedUris);
+      ReusageResult? reusedResult = _computeReusedLibraries(
+          lastGoodKernelTarget,
+          _userBuilders,
+          invalidatedUris,
+          uriTranslator,
+          entryPoints!);
 
       // Use the reused libraries to re-write entry-points.
       if (reusedResult.arePartsUsedAsEntryPoints()) {
@@ -267,43 +298,49 @@
 
       // Experimental invalidation initialization (e.g. figure out if we can).
       ExperimentalInvalidation? experimentalInvalidation =
-          await initializeExperimentalInvalidation(reusedResult, c);
-      recordRebuildBodiesCountForTesting(
+          await _initializeExperimentalInvalidation(reusedResult, c);
+      recorderForTesting?.recordRebuildBodiesCount(
           experimentalInvalidation?.missingSources.length ?? 0);
 
       // Cleanup: After (potentially) removing builders we have stuff to cleanup
       // to not leak, and we might need to re-create the dill target.
-      cleanupRemovedBuilders(reusedResult, uriTranslator);
-      recreateDillTargetIfPackageWasUpdated(uriTranslator, c);
-      ClassHierarchy? hierarchy = userCode?.loader.hierarchy;
-      cleanupHierarchy(hierarchy, experimentalInvalidation, reusedResult);
+      _cleanupRemovedBuilders(
+          lastGoodKernelTarget, reusedResult, uriTranslator);
+      _recreateDillTargetIfPackageWasUpdated(uriTranslator, c);
+      ClassHierarchy? hierarchy = lastGoodKernelTarget?.loader.hierarchy;
+      _cleanupHierarchy(hierarchy, experimentalInvalidation, reusedResult);
       List<LibraryBuilder> reusedLibraries = reusedResult.reusedLibraries;
       reusedResult = null;
 
-      // TODO(jensj): Given the code below, [userCode] is assumed always to be
-      // non-null.
-      if (userCode != null) {
-        ticker.logMs("Decided to reuse ${reusedLibraries.length}"
-            " of ${userCode!.loader.libraryBuilders.length} libraries");
+      if (lastGoodKernelTarget != null) {
+        _ticker.logMs("Decided to reuse ${reusedLibraries.length}"
+            " of ${lastGoodKernelTarget.loader.libraryBuilders.length}"
+            " libraries");
       }
 
       // For modular compilation we can be asked to load components and track
       // which libraries we actually use for the compilation. Set that up now.
-      loadEnsureLoadedComponents(reusedLibraries);
-      resetTrackingOfUsedLibraries(hierarchy);
+      _loadEnsureLoadedComponents(reusedLibraries);
+      if (trackNeededDillLibraries) {
+        _resetTrackingOfUsedLibraries(hierarchy);
+      }
 
-      // For each computeDelta call we create a new userCode object which needs
+      // For each computeDelta call we create a new kernel target which needs
       // to be setup, and in the case of experimental invalidation some of the
       // builders needs to be patched up.
-      IncrementalKernelTarget? userCodeOld = userCode;
-      setupNewUserCode(c, uriTranslator, hierarchy, reusedLibraries,
-          experimentalInvalidation, entryPoints!.first);
+      IncrementalKernelTarget currentKernelTarget = _setupNewKernelTarget(
+          c,
+          uriTranslator,
+          hierarchy,
+          reusedLibraries,
+          experimentalInvalidation,
+          entryPoints!.first);
       Map<LibraryBuilder, List<LibraryBuilder>>? rebuildBodiesMap =
-          experimentalInvalidationCreateRebuildBodiesBuilders(
-              experimentalInvalidation, uriTranslator);
-      entryPoints = userCode!.setEntryPoints(entryPoints!);
-      await userCode!.loader.buildOutlines();
-      experimentalInvalidationPatchUpScopes(
+          _experimentalInvalidationCreateRebuildBodiesBuilders(
+              currentKernelTarget, experimentalInvalidation, uriTranslator);
+      entryPoints = currentKernelTarget.setEntryPoints(entryPoints!);
+      await currentKernelTarget.loader.buildOutlines();
+      _experimentalInvalidationPatchUpScopes(
           experimentalInvalidation, rebuildBodiesMap);
       rebuildBodiesMap = null;
 
@@ -311,50 +348,55 @@
       // Note that the [Component] is not the "full" component.
       // It is a component consisting of all newly compiled libraries and all
       // libraries loaded from .dill files or directly from components.
-      // Technically, it's the combination of userCode.loader.libraries and
-      // dillLoadedData.loader.libraries.
-      Component? componentWithDill = await userCode!.buildOutlines();
+      // Technically, it's the combination of
+      // `currentKernelTarget.loader.libraries` and
+      // `_dillLoadedData.loader.libraries`.
+      Component? componentWithDill = await currentKernelTarget.buildOutlines();
 
       if (!outlineOnly) {
         // Checkpoint: Build the actual bodies.
         componentWithDill =
-            await userCode!.buildComponent(verify: c.options.verify);
+            await currentKernelTarget.buildComponent(verify: c.options.verify);
       }
-      hierarchy ??= userCode!.loader.hierarchy;
-      // ignore: unnecessary_null_comparison
-      if (hierarchy != null) {
-        if (userCode!.classHierarchyChanges != null) {
-          hierarchy.applyTreeChanges([], [], userCode!.classHierarchyChanges!);
-        }
-        if (userCode!.classMemberChanges != null) {
-          hierarchy.applyMemberChanges(userCode!.classMemberChanges!,
-              findDescendants: true);
-        }
+      hierarchy ??= currentKernelTarget.loader.hierarchy;
+      if (currentKernelTarget.classHierarchyChanges != null) {
+        hierarchy.applyTreeChanges(
+            [], [], currentKernelTarget.classHierarchyChanges!);
       }
-      recordNonFullComponentForTesting(componentWithDill!);
+      if (currentKernelTarget.classMemberChanges != null) {
+        hierarchy.applyMemberChanges(currentKernelTarget.classMemberChanges!,
+            findDescendants: true);
+      }
+      recorderForTesting?.recordNonFullComponent(componentWithDill!);
 
-      // Perform actual dill usage tracking.
-      performDillUsageTracking(hierarchy);
+      Set<Library>? neededDillLibraries;
+      if (trackNeededDillLibraries) {
+        // Perform actual dill usage tracking.
+        neededDillLibraries =
+            _performDillUsageTracking(currentKernelTarget, hierarchy);
+      }
 
-      // If we actually got a result we can throw away the old userCode and the
-      // list of invalidated uris.
-      // ignore: unnecessary_null_comparison
+      // If we actually got a result we can throw away the
+      // [lastGoodKernelTarget] and the list of invalidated uris.
+      // TODO(jensj,johnniwinther): Given the code below, [componentWithDill] is
+      // assumed always to be non-null.
       if (componentWithDill != null) {
-        this.invalidatedUris.clear();
-        hasToCheckPackageUris = false;
-        userCodeOld?.loader.releaseAncillaryResources();
-        userCodeOld = null;
+        this._invalidatedUris.clear();
+        _hasToCheckPackageUris = false;
+        lastGoodKernelTarget?.loader.releaseAncillaryResources();
+        lastGoodKernelTarget = null;
       }
 
       // Compute which libraries to output and which (previous) errors/warnings
       // we have to reissue. In the process do some cleanup too.
       List<Library> compiledLibraries =
-          new List<Library>.from(userCode!.loader.libraries);
-      Map<Uri, Source> uriToSource = componentWithDill.uriToSource;
-      experimentalCompilationPostCompilePatchup(
+          new List<Library>.from(currentKernelTarget.loader.libraries);
+      Map<Uri, Source> uriToSource = componentWithDill!.uriToSource;
+      _experimentalCompilationPostCompilePatchup(
           experimentalInvalidation, compiledLibraries, uriToSource);
       List<Library> outputLibraries =
-          calculateOutputLibrariesAndIssueLibraryProblems(
+          _calculateOutputLibrariesAndIssueLibraryProblems(
+              currentKernelTarget,
               data.component != null || fullComponent,
               compiledLibraries,
               entryPoints!,
@@ -363,18 +405,20 @@
               uriTranslator,
               uriToSource,
               c);
-      List<String> problemsAsJson = reissueComponentProblems(componentWithDill);
+      List<String> problemsAsJson = _componentProblems.reissueProblems(
+          context, currentKernelTarget, componentWithDill);
 
       // If we didn't get a result, go back to the previous one so expression
       // calculation has the potential to work.
       // ignore: unnecessary_null_comparison
       if (componentWithDill == null) {
-        userCode!.loader.clearLibraryBuilders();
-        userCode = userCodeOld;
-        dillLoadedData!.loader.currentSourceLoader = userCode!.loader;
+        currentKernelTarget.loader.clearLibraryBuilders();
+        currentKernelTarget = lastGoodKernelTarget!;
+        _dillLoadedData!.loader.currentSourceLoader =
+            currentKernelTarget.loader;
       } else {
-        previousSourceBuilders =
-            convertSourceLibraryBuildersToDill(experimentalInvalidation);
+        _previousSourceBuilders = _convertSourceLibraryBuildersToDill(
+            currentKernelTarget, experimentalInvalidation);
       }
 
       experimentalInvalidation = null;
@@ -394,11 +438,15 @@
         ..problemsAsJson = problemsAsJson;
 
       // We're now done. Allow any waiting compile to start.
-      Completer<dynamic> currentlyCompilingLocal = currentlyCompiling!;
-      currentlyCompiling = null;
+      Completer<dynamic> currentlyCompilingLocal = _currentlyCompiling!;
+      _currentlyCompiling = null;
       currentlyCompilingLocal.complete();
 
-      return result;
+      _lastGoodKernelTarget = currentKernelTarget;
+      return new IncrementalCompilerResult(result,
+          classHierarchy: currentKernelTarget.loader.hierarchy,
+          coreTypes: currentKernelTarget.loader.coreTypes,
+          neededDillLibraries: neededDillLibraries);
     });
   }
 
@@ -410,26 +458,25 @@
   /// source builders and they will thus be patched up here too.
   ///
   /// Returns the set of Libraries that now has new (dill) builders.
-  Set<Library> convertSourceLibraryBuildersToDill(
+  Set<Library> _convertSourceLibraryBuildersToDill(
+      IncrementalKernelTarget nextGoodKernelTarget,
       ExperimentalInvalidation? experimentalInvalidation) {
     bool changed = false;
     Set<Library> newDillLibraryBuilders = new Set<Library>();
-    userBuilders ??= <Uri, LibraryBuilder>{};
+    _userBuilders ??= <Uri, LibraryBuilder>{};
     Map<LibraryBuilder, List<LibraryBuilder>>? convertedLibraries;
-    for (LibraryBuilder builder in userCode!.loader.libraryBuilders) {
+    for (LibraryBuilder builder
+        in nextGoodKernelTarget.loader.libraryBuilders) {
       if (builder is SourceLibraryBuilder) {
         DillLibraryBuilder dillBuilder =
-            dillLoadedData!.loader.appendLibrary(builder.library);
-        userCode!.loader.registerLibraryBuilder(
+            _dillLoadedData!.loader.appendLibrary(builder.library);
+        nextGoodKernelTarget.loader.registerLibraryBuilder(
             // TODO(johnniwinther): Why do we need to create
             //  [DillLibraryBuilder]s for the patch library file uris?
             dillBuilder,
             builder.isPatch ? builder.fileUri : null);
-        userBuilders![builder.importUri] = dillBuilder;
+        _userBuilders![builder.importUri] = dillBuilder;
         newDillLibraryBuilders.add(builder.library);
-        if (userCode!.loader.first == builder) {
-          userCode!.loader.first = dillBuilder;
-        }
         changed = true;
         if (experimentalInvalidation != null) {
           convertedLibraries ??=
@@ -441,8 +488,9 @@
     if (changed) {
       // We suppress finalization errors because they have already been
       // reported.
-      dillLoadedData!.buildOutlines(suppressFinalizationErrors: true);
-      assert(_checkEquivalentScopes(userCode!.loader, dillLoadedData!.loader));
+      _dillLoadedData!.buildOutlines(suppressFinalizationErrors: true);
+      assert(_checkEquivalentScopes(
+          nextGoodKernelTarget.loader, _dillLoadedData!.loader));
 
       if (experimentalInvalidation != null) {
         /// If doing experimental invalidation that means that some of the old
@@ -455,7 +503,7 @@
         // Maps from old library builder to map of new content.
         Map<LibraryBuilder, Map<String, Builder>>? replacementSettersMap = {};
 
-        experimentalInvalidationFillReplacementMaps(
+        _experimentalInvalidationFillReplacementMaps(
             convertedLibraries!, replacementMap, replacementSettersMap);
 
         for (LibraryBuilder builder
@@ -478,12 +526,12 @@
         replacementSettersMap = null;
       }
     }
-    userCode!.loader.buildersCreatedWithReferences.clear();
-    userCode!.loader.builderHierarchy.clear();
-    userCode!.loader.referenceFromIndex = null;
+    nextGoodKernelTarget.loader.buildersCreatedWithReferences.clear();
+    nextGoodKernelTarget.loader.builderHierarchy.clear();
+    nextGoodKernelTarget.loader.referenceFromIndex = null;
     convertedLibraries = null;
     experimentalInvalidation = null;
-    if (userBuilders!.isEmpty) userBuilders = null;
+    if (_userBuilders!.isEmpty) _userBuilders = null;
     return newDillLibraryBuilders;
   }
 
@@ -565,7 +613,8 @@
 
   /// Compute which libraries to output and which (previous) errors/warnings we
   /// have to reissue. In the process do some cleanup too.
-  List<Library> calculateOutputLibrariesAndIssueLibraryProblems(
+  List<Library> _calculateOutputLibrariesAndIssueLibraryProblems(
+      IncrementalKernelTarget currentKernelTarget,
       bool fullComponent,
       List<Library> compiledLibraries,
       List<Uri> entryPoints,
@@ -577,18 +626,25 @@
     List<Library> outputLibraries;
     Set<Library> allLibraries;
     if (fullComponent) {
-      outputLibraries = computeTransitiveClosure(compiledLibraries, entryPoints,
-          reusedLibraries, hierarchy, uriTranslator, uriToSource);
+      outputLibraries = _computeTransitiveClosure(
+          currentKernelTarget,
+          compiledLibraries,
+          entryPoints,
+          reusedLibraries,
+          hierarchy,
+          uriTranslator,
+          uriToSource);
       allLibraries = outputLibraries.toSet();
       if (!c.options.omitPlatform) {
-        for (int i = 0; i < platformBuilders!.length; i++) {
-          Library lib = platformBuilders![i].library;
+        for (int i = 0; i < _platformBuilders!.length; i++) {
+          Library lib = _platformBuilders![i].library;
           outputLibraries.add(lib);
         }
       }
     } else {
       outputLibraries = <Library>[];
-      allLibraries = computeTransitiveClosure(
+      allLibraries = _computeTransitiveClosure(
+              currentKernelTarget,
               compiledLibraries,
               entryPoints,
               reusedLibraries,
@@ -599,7 +655,7 @@
           .toSet();
     }
 
-    reissueLibraryProblems(allLibraries, compiledLibraries);
+    _reissueLibraryProblems(allLibraries, compiledLibraries);
     return outputLibraries;
   }
 
@@ -610,7 +666,7 @@
   /// contain all the libraries that would normally have been recompiled.
   /// This might be a temporary thing, but we need to figure out if the VM
   /// can (always) work with only getting the actually rebuild stuff.
-  void experimentalCompilationPostCompilePatchup(
+  void _experimentalCompilationPostCompilePatchup(
       ExperimentalInvalidation? experimentalInvalidation,
       List<Library> compiledLibraries,
       Map<Uri, Source> uriToSource) {
@@ -628,32 +684,33 @@
   /// Perform dill usage tracking if asked. Use the marking on dill builders as
   /// well as the class hierarchy to figure out which dill libraries was
   /// actually used by the compilation.
-  void performDillUsageTracking(ClassHierarchy hierarchy) {
-    if (trackNeededDillLibraries) {
-      // Which dill builders were built?
-      neededDillLibraries = new Set<Library>();
+  Set<Library> _performDillUsageTracking(
+      IncrementalKernelTarget target, ClassHierarchy hierarchy) {
+    // Which dill builders were built?
+    Set<Library> neededDillLibraries = {};
 
-      // Propagate data from constant evaluator: Libraries used in the constant
-      // evaluator - that comes from dill - are marked.
-      Set<Library> librariesUsedByConstantEvaluator = userCode!.librariesUsed;
+    // Propagate data from constant evaluator: Libraries used in the constant
+    // evaluator - that comes from dill - are marked.
+    Set<Library> librariesUsedByConstantEvaluator = target.librariesUsed;
 
-      for (LibraryBuilder builder in dillLoadedData!.loader.libraryBuilders) {
-        if (builder is DillLibraryBuilder) {
-          if (builder.isBuiltAndMarked ||
-              librariesUsedByConstantEvaluator.contains(builder.library)) {
-            neededDillLibraries!.add(builder.library);
-          }
+    for (LibraryBuilder builder in _dillLoadedData!.loader.libraryBuilders) {
+      if (builder is DillLibraryBuilder) {
+        if (builder.isBuiltAndMarked ||
+            librariesUsedByConstantEvaluator.contains(builder.library)) {
+          neededDillLibraries.add(builder.library);
         }
       }
-
-      updateNeededDillLibrariesWithHierarchy(
-          hierarchy, userCode!.loader.builderHierarchy);
     }
+
+    updateNeededDillLibrariesWithHierarchy(
+        neededDillLibraries, hierarchy, target.loader.builderHierarchy);
+
+    return neededDillLibraries;
   }
 
   /// Fill in the replacement maps that describe the replacements that need to
   /// happen because of experimental invalidation.
-  void experimentalInvalidationFillReplacementMaps(
+  void _experimentalInvalidationFillReplacementMaps(
       Map<LibraryBuilder, List<LibraryBuilder>> rebuildBodiesMap,
       Map<LibraryBuilder, Map<String, Builder>> replacementMap,
       Map<LibraryBuilder, Map<String, Builder>> replacementSettersMap) {
@@ -687,10 +744,12 @@
   }
 
   /// When doing experimental invalidation, we have some builders that needs to
-  /// be rebuild special, namely they have to be [userCode.loader.read] with
-  /// references from the original [Library] for things to work.
+  /// be rebuild special, namely they have to be
+  /// [currentKernelTarget.loader.read] with references from the original
+  /// [Library] for things to work.
   Map<LibraryBuilder, List<LibraryBuilder>>
-      experimentalInvalidationCreateRebuildBodiesBuilders(
+      _experimentalInvalidationCreateRebuildBodiesBuilders(
+          IncrementalKernelTarget currentKernelTarget,
           ExperimentalInvalidation? experimentalInvalidation,
           UriTranslator uriTranslator) {
     // Any builder(s) in [rebuildBodies] should be semi-reused: Create source
@@ -700,8 +759,9 @@
         new Map<LibraryBuilder, List<LibraryBuilder>>.identity();
     if (experimentalInvalidation != null) {
       for (LibraryBuilder library in experimentalInvalidation.rebuildBodies) {
-        LibraryBuilder newBuilder = userCode!.loader.read(library.importUri, -1,
-            accessor: userCode!.loader.first,
+        LibraryBuilder newBuilder = currentKernelTarget.loader.read(
+            library.importUri, -1,
+            accessorUri: currentKernelTarget.loader.firstUri,
             fileUri: library.fileUri,
             referencesFrom: library.library);
         List<LibraryBuilder> builders = [newBuilder];
@@ -713,8 +773,9 @@
           // libraries.
           Uri partUri = getPartUri(library.importUri, part);
           Uri? fileUri =
-              getPartFileUri(library.library.fileUri, part, uriTranslator);
-          LibraryBuilder newPartBuilder = userCode!.loader.read(partUri, -1,
+              uriTranslator.getPartFileUri(library.library.fileUri, part);
+          LibraryBuilder newPartBuilder = currentKernelTarget.loader.read(
+              partUri, -1,
               accessor: library,
               fileUri: fileUri,
               referencesFrom: library.library,
@@ -729,7 +790,7 @@
   /// When doing experimental invalidation we have to patch up the scopes of the
   /// the libraries we're not recompiling but should have recompiled if we
   /// didn't do anything special.
-  void experimentalInvalidationPatchUpScopes(
+  void _experimentalInvalidationPatchUpScopes(
       ExperimentalInvalidation? experimentalInvalidation,
       Map<LibraryBuilder, List<LibraryBuilder>> rebuildBodiesMap) {
     if (experimentalInvalidation != null) {
@@ -739,7 +800,7 @@
       // Maps from old library builder to map of new content.
       Map<LibraryBuilder, Map<String, Builder>> replacementSettersMap = {};
 
-      experimentalInvalidationFillReplacementMaps(
+      _experimentalInvalidationFillReplacementMaps(
           rebuildBodiesMap, replacementMap, replacementSettersMap);
 
       for (LibraryBuilder builder
@@ -777,20 +838,20 @@
             Builder childBuilder = iterator.current;
             if (childBuilder is SourceClassBuilder) {
               TypeBuilder? typeBuilder = childBuilder.supertypeBuilder;
-              replaceTypeBuilder(
+              _replaceTypeBuilder(
                   replacementMap, replacementSettersMap, typeBuilder);
               typeBuilder = childBuilder.mixedInTypeBuilder;
-              replaceTypeBuilder(
+              _replaceTypeBuilder(
                   replacementMap, replacementSettersMap, typeBuilder);
               if (childBuilder.onTypes != null) {
                 for (typeBuilder in childBuilder.onTypes!) {
-                  replaceTypeBuilder(
+                  _replaceTypeBuilder(
                       replacementMap, replacementSettersMap, typeBuilder);
                 }
               }
               if (childBuilder.interfaceBuilders != null) {
                 for (typeBuilder in childBuilder.interfaceBuilders!) {
-                  replaceTypeBuilder(
+                  _replaceTypeBuilder(
                       replacementMap, replacementSettersMap, typeBuilder);
                 }
               }
@@ -820,30 +881,31 @@
         fileSystem, includeComments, dillTarget, uriTranslator);
   }
 
-  /// Create a new [userCode] object, and add the reused builders to it.
-  void setupNewUserCode(
+  /// Create a new [IncrementalKernelTarget] object, and add the reused builders
+  /// to it.
+  IncrementalKernelTarget _setupNewKernelTarget(
       CompilerContext c,
       UriTranslator uriTranslator,
       ClassHierarchy? hierarchy,
       List<LibraryBuilder> reusedLibraries,
       ExperimentalInvalidation? experimentalInvalidation,
       Uri firstEntryPoint) {
-    userCode = createIncrementalKernelTarget(
+    IncrementalKernelTarget kernelTarget = createIncrementalKernelTarget(
         new HybridFileSystem(
             new MemoryFileSystem(
                 new Uri(scheme: "org-dartlang-debug", path: "/")),
             c.fileSystem),
         false,
-        dillLoadedData!,
+        _dillLoadedData!,
         uriTranslator);
-    userCode!.loader.hierarchy = hierarchy;
-    dillLoadedData!.loader.currentSourceLoader = userCode!.loader;
+    kernelTarget.loader.hierarchy = hierarchy;
+    _dillLoadedData!.loader.currentSourceLoader = kernelTarget.loader;
 
     // Re-use the libraries we've deemed re-usable.
     List<bool> seenModes = [false, false, false, false];
     for (LibraryBuilder library in reusedLibraries) {
       seenModes[library.library.nonNullableByDefaultCompiledMode.index] = true;
-      userCode!.loader.registerLibraryBuilder(library);
+      kernelTarget.loader.registerLibraryBuilder(library);
     }
     // Check compilation mode up against what we've seen here and set
     // `hasInvalidNnbdModeLibrary` accordingly.
@@ -853,14 +915,14 @@
           // Don't expect strong or invalid.
           if (seenModes[NonNullableByDefaultCompiledMode.Strong.index] ||
               seenModes[NonNullableByDefaultCompiledMode.Invalid.index]) {
-            userCode!.loader.hasInvalidNnbdModeLibrary = true;
+            kernelTarget.loader.hasInvalidNnbdModeLibrary = true;
           }
           break;
         case NnbdMode.Strong:
           // Don't expect weak or invalid.
           if (seenModes[NonNullableByDefaultCompiledMode.Weak.index] ||
               seenModes[NonNullableByDefaultCompiledMode.Invalid.index]) {
-            userCode!.loader.hasInvalidNnbdModeLibrary = true;
+            kernelTarget.loader.hasInvalidNnbdModeLibrary = true;
           }
           break;
         case NnbdMode.Agnostic:
@@ -868,7 +930,7 @@
           if (seenModes[NonNullableByDefaultCompiledMode.Strong.index] ||
               seenModes[NonNullableByDefaultCompiledMode.Weak.index] ||
               seenModes[NonNullableByDefaultCompiledMode.Invalid.index]) {
-            userCode!.loader.hasInvalidNnbdModeLibrary = true;
+            kernelTarget.loader.hasInvalidNnbdModeLibrary = true;
           }
           break;
       }
@@ -876,75 +938,46 @@
       // Don't expect strong or invalid.
       if (seenModes[NonNullableByDefaultCompiledMode.Strong.index] ||
           seenModes[NonNullableByDefaultCompiledMode.Invalid.index]) {
-        userCode!.loader.hasInvalidNnbdModeLibrary = true;
+        kernelTarget.loader.hasInvalidNnbdModeLibrary = true;
       }
     }
 
-    // The entry point(s) has to be set first for loader.first to be setup
-    // correctly. If the first one is in the rebuildBodies, we have to add it
-    // from there first.
-    Uri firstEntryPointImportUri =
-        userCode!.getEntryPointUri(firstEntryPoint, issueProblem: false);
-    bool wasFirstSet = false;
-    if (experimentalInvalidation != null) {
-      for (LibraryBuilder library in experimentalInvalidation.rebuildBodies) {
-        if (library.importUri == firstEntryPointImportUri) {
-          userCode!.loader.read(library.importUri, -1,
-              accessor: userCode!.loader.first,
-              fileUri: library.fileUri,
-              referencesFrom: library.library);
-          wasFirstSet = true;
-          break;
-        }
-      }
-    }
-    if (!wasFirstSet) {
-      userCode!.loader.read(firstEntryPointImportUri, -1,
-          accessor: userCode!.loader.first,
-          fileUri: firstEntryPointImportUri != firstEntryPoint
-              ? firstEntryPoint
-              : null);
-    }
-    if (userCode!.loader.first == null) {
-      LibraryBuilder? libraryBuilder =
-          userCode!.loader.lookupLibraryBuilder(firstEntryPointImportUri);
-      if (libraryBuilder != null) {
-        userCode!.loader.first = libraryBuilder;
-      }
-    }
+    // The entry point(s) has to be set first for loader.firstUri to be setup
+    // correctly.
+    kernelTarget.loader.firstUri =
+        kernelTarget.getEntryPointUri(firstEntryPoint, issueProblem: false);
+    return kernelTarget;
   }
 
   /// When tracking used libraries we mark them when we use them. To track
   /// correctly we have to unmark before the next iteration to not have too much
   /// marked and therefore incorrectly marked something as used when it is not.
-  void resetTrackingOfUsedLibraries(ClassHierarchy? hierarchy) {
-    if (trackNeededDillLibraries) {
-      // Reset dill loaders and kernel class hierarchy.
-      for (LibraryBuilder builder in dillLoadedData!.loader.libraryBuilders) {
-        if (builder is DillLibraryBuilder) {
-          if (builder.isBuiltAndMarked) {
-            // Clear cached calculations in classes which upon calculation can
-            // mark things as needed.
-            for (Builder builder in builder.scope.localMembers) {
-              if (builder is DillClassBuilder) {
-                builder.clearCachedValues();
-              }
+  void _resetTrackingOfUsedLibraries(ClassHierarchy? hierarchy) {
+    // Reset dill loaders and kernel class hierarchy.
+    for (LibraryBuilder builder in _dillLoadedData!.loader.libraryBuilders) {
+      if (builder is DillLibraryBuilder) {
+        if (builder.isBuiltAndMarked) {
+          // Clear cached calculations in classes which upon calculation can
+          // mark things as needed.
+          for (Builder builder in builder.scope.localMembers) {
+            if (builder is DillClassBuilder) {
+              builder.clearCachedValues();
             }
-            builder.isBuiltAndMarked = false;
           }
+          builder.isBuiltAndMarked = false;
         }
       }
+    }
 
-      if (hierarchy is ClosedWorldClassHierarchy) {
-        hierarchy.resetUsed();
-      }
+    if (hierarchy is ClosedWorldClassHierarchy) {
+      hierarchy.resetUsed();
     }
   }
 
   /// Cleanup the hierarchy to no longer reference libraries that we are
   /// invalidating (or would normally have invalidated if we hadn't done any
   /// experimental invalidation).
-  void cleanupHierarchy(
+  void _cleanupHierarchy(
       ClassHierarchy? hierarchy,
       ExperimentalInvalidation? experimentalInvalidation,
       ReusageResult reusedResult) {
@@ -970,19 +1003,20 @@
   /// If the package uris needs to be re-checked the uri translator has changed,
   /// and the [DillTarget] needs to get the new uri translator. We do that
   /// by creating a new one.
-  void recreateDillTargetIfPackageWasUpdated(
+  void _recreateDillTargetIfPackageWasUpdated(
       UriTranslator uriTranslator, CompilerContext c) {
-    if (hasToCheckPackageUris) {
+    if (_hasToCheckPackageUris) {
       // The package file was changed.
       // Make sure the dill loader is on the same page.
-      DillTarget oldDillLoadedData = dillLoadedData!;
-      dillLoadedData = new DillTarget(ticker, uriTranslator, c.options.target);
+      DillTarget oldDillLoadedData = _dillLoadedData!;
+      DillTarget newDillLoadedData = _dillLoadedData =
+          new DillTarget(_ticker, uriTranslator, c.options.target);
       for (DillLibraryBuilder library
           in oldDillLoadedData.loader.libraryBuilders) {
-        dillLoadedData!.loader.registerLibraryBuilder(library);
+        newDillLoadedData.loader.registerLibraryBuilder(library);
       }
-      dillLoadedData!.loader.first = oldDillLoadedData.loader.first;
-      dillLoadedData!.loader.libraries
+      newDillLoadedData.loader.first = oldDillLoadedData.loader.first;
+      newDillLoadedData.loader.libraries
           .addAll(oldDillLoadedData.loader.libraries);
     }
   }
@@ -994,37 +1028,34 @@
   /// We also have to remove any component problems beloning to any such
   /// no-longer-used library (to avoid re-issuing errors about no longer
   /// relevant stuff).
-  void cleanupRemovedBuilders(
+  void _cleanupRemovedBuilders(IncrementalKernelTarget? lastGoodKernelTarget,
       ReusageResult reusedResult, UriTranslator uriTranslator) {
     bool removedDillBuilders = false;
     for (LibraryBuilder builder in reusedResult.notReusedLibraries) {
-      cleanupSourcesForBuilder(reusedResult, builder, uriTranslator,
-          CompilerContext.current.uriToSource);
-      incrementalSerializer?.invalidate(builder.fileUri);
+      _cleanupSourcesForBuilder(lastGoodKernelTarget, reusedResult, builder,
+          uriTranslator, CompilerContext.current.uriToSource);
+      _incrementalSerializer?.invalidate(builder.fileUri);
 
       LibraryBuilder? dillBuilder =
-          dillLoadedData!.loader.deregisterLibraryBuilder(builder.importUri);
+          _dillLoadedData!.loader.deregisterLibraryBuilder(builder.importUri);
       if (dillBuilder != null) {
         removedDillBuilders = true;
-        userBuilders?.remove(builder.importUri);
+        _userBuilders?.remove(builder.importUri);
       }
 
       // Remove component problems for libraries we don't reuse.
-      if (remainingComponentProblems.isNotEmpty) {
-        Library lib = builder.library;
-        removeLibraryFromRemainingComponentProblems(lib, uriTranslator);
-      }
+      _componentProblems.removeLibrary(builder.library, uriTranslator);
     }
 
     if (removedDillBuilders) {
-      makeDillLoaderLibrariesUpToDateWithBuildersMap();
+      _makeDillLoaderLibrariesUpToDateWithBuildersMap();
     }
   }
 
   bool _importsFfi() {
-    if (userBuilders == null) return false;
+    if (_userBuilders == null) return false;
     final Uri dartFfiUri = Uri.parse("dart:ffi");
-    for (LibraryBuilder builder in userBuilders!.values) {
+    for (LibraryBuilder builder in _userBuilders!.values) {
       Library lib = builder.library;
       for (LibraryDependency dependency in lib.dependencies) {
         if (dependency.targetLibrary.importUri == dartFfiUri) {
@@ -1038,7 +1069,7 @@
   /// Figure out if we can (and was asked to) do experimental invalidation.
   /// Note that this returns (future or) [null] if we're not doing experimental
   /// invalidation.
-  Future<ExperimentalInvalidation?> initializeExperimentalInvalidation(
+  Future<ExperimentalInvalidation?> _initializeExperimentalInvalidation(
       ReusageResult reusedResult, CompilerContext c) async {
     Set<LibraryBuilder>? rebuildBodies;
     Set<LibraryBuilder> originalNotReusedLibraries;
@@ -1046,7 +1077,7 @@
 
     if (!context.options.isExperimentEnabledGlobally(
         ExperimentalFlag.alternativeInvalidationStrategy)) return null;
-    if (modulesToLoad != null) return null;
+    if (_modulesToLoad != null) return null;
     if (reusedResult.directlyInvalidated.isEmpty) return null;
     if (reusedResult.invalidatedBecauseOfPackageUpdate) return null;
 
@@ -1185,29 +1216,30 @@
 
   /// Get UriTranslator, and figure out if the packages file was (potentially)
   /// changed.
-  Future<UriTranslator> setupPackagesAndUriTranslator(CompilerContext c) async {
+  Future<UriTranslator> _setupPackagesAndUriTranslator(
+      CompilerContext c) async {
     bool bypassCache = false;
-    if (!identical(previousPackagesUri, c.options.packagesUriRaw)) {
-      previousPackagesUri = c.options.packagesUriRaw;
+    if (!identical(_previousPackagesUri, c.options.packagesUriRaw)) {
+      _previousPackagesUri = c.options.packagesUriRaw;
       bypassCache = true;
-    } else if (this.invalidatedUris.contains(c.options.packagesUri)) {
+    } else if (this._invalidatedUris.contains(c.options.packagesUri)) {
       bypassCache = true;
     }
     UriTranslator uriTranslator =
         await c.options.getUriTranslator(bypassCache: bypassCache);
-    previousPackagesMap = currentPackagesMap;
-    currentPackagesMap = createPackagesMap(uriTranslator.packages);
+    _previousPackagesMap = _currentPackagesMap;
+    _currentPackagesMap = _createPackagesMap(uriTranslator.packages);
     // TODO(jensj): We can probably (from the maps above) figure out if anything
     // changed and only set this to true if it did.
-    hasToCheckPackageUris = hasToCheckPackageUris || bypassCache;
-    ticker.logMs("Read packages file");
-    if (initializedForExpressionCompilationOnly) {
-      hasToCheckPackageUris = false;
+    _hasToCheckPackageUris = _hasToCheckPackageUris || bypassCache;
+    _ticker.logMs("Read packages file");
+    if (_initializedForExpressionCompilationOnly) {
+      _hasToCheckPackageUris = false;
     }
     return uriTranslator;
   }
 
-  Map<String, Package> createPackagesMap(PackageConfig packages) {
+  Map<String, Package> _createPackagesMap(PackageConfig packages) {
     Map<String, Package> result = new Map<String, Package>();
     for (Package package in packages.packages) {
       result[package.name] = package;
@@ -1217,88 +1249,42 @@
 
   /// Load platform and (potentially) initialize from dill,
   /// or initialize from component.
-  Future<IncrementalCompilerData> ensurePlatformAndInitialize(
-      UriTranslator uriTranslator, CompilerContext c) async {
+  Future<IncrementalCompilerData> _ensurePlatformAndInitialize(
+      UriTranslator uriTranslator, CompilerContext context) async {
     IncrementalCompilerData data = new IncrementalCompilerData();
-    if (dillLoadedData == null) {
-      int bytesLength = 0;
-      if (componentToInitializeFrom != null) {
-        // If initializing from a component it has to include the sdk,
-        // so we explicitly don't load it here.
-        initializeFromComponent(uriTranslator, c, data);
-        componentToInitializeFrom = null;
-      } else {
-        List<int>? summaryBytes = await c.options.loadSdkSummaryBytes();
-        bytesLength = prepareSummary(summaryBytes, uriTranslator, c, data);
-        if (initializeFromDillUri != null) {
-          try {
-            bytesLength += await initializeFromDill(uriTranslator, c, data);
-          } catch (e, st) {
-            // We might have loaded x out of y libraries into the component.
-            // To avoid any unforeseen problems start over.
-            bytesLength = prepareSummary(summaryBytes, uriTranslator, c, data);
-
-            if (e is InvalidKernelVersionError ||
-                e is InvalidKernelSdkVersionError ||
-                e is PackageChangedError ||
-                e is CanonicalNameSdkError ||
-                e is CompilationModeError) {
-              // Don't report any warning.
-            } else {
-              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",
-                        "$st",
-                        gzInitializedFrom)
-                    : templateInitializeFromDillUnknownProblemNoDump
-                        .withArguments(
-                            initializeFromDillUri.toString(), "$e", "$st");
-                dillLoadedData!.loader
-                    .addProblem(message, TreeNode.noOffset, 1, null);
-              }
-            }
-          }
-        }
-      }
-      appendLibraries(data, bytesLength);
+    if (_dillLoadedData == null) {
+      DillTarget dillLoadedData = _dillLoadedData =
+          new DillTarget(_ticker, uriTranslator, context.options.target);
+      int bytesLength = await _initializationStrategy.initialize(
+          dillLoadedData,
+          uriTranslator,
+          context,
+          data,
+          _componentProblems,
+          _incrementalSerializer,
+          recorderForTesting);
+      _appendLibraries(data, bytesLength);
 
       // We suppress finalization errors because they will reported via
       // problemsAsJson fields (with better precision).
-      dillLoadedData!.buildOutlines(suppressFinalizationErrors: true);
-      userBuilders = <Uri, LibraryBuilder>{};
-      platformBuilders = <LibraryBuilder>[];
+      dillLoadedData.buildOutlines(suppressFinalizationErrors: true);
+      _userBuilders = <Uri, LibraryBuilder>{};
+      _platformBuilders = <LibraryBuilder>[];
       for (DillLibraryBuilder builder
-          in dillLoadedData!.loader.libraryBuilders) {
+          in dillLoadedData.loader.libraryBuilders) {
         if (builder.importUri.scheme == "dart") {
-          platformBuilders!.add(builder);
+          _platformBuilders!.add(builder);
         } else {
-          userBuilders![builder.importUri] = builder;
+          _userBuilders![builder.importUri] = builder;
         }
       }
-      if (userBuilders!.isEmpty) userBuilders = null;
+      if (_userBuilders!.isEmpty) _userBuilders = null;
     }
     data.initializationBytes = null;
     return data;
   }
 
-  void replaceTypeBuilder(
+  void _replaceTypeBuilder(
       Map<LibraryBuilder, Map<String, Builder>> replacementMap,
       Map<LibraryBuilder, Map<String, Builder>> replacementSettersMap,
       TypeBuilder? typeBuilder) {
@@ -1319,12 +1305,6 @@
     typeBuilder!.bind(replacement as TypeDeclarationBuilder);
   }
 
-  @override
-  CoreTypes? getCoreTypes() => userCode?.loader.coreTypes;
-
-  @override
-  ClassHierarchy? getClassHierarchy() => userCode?.loader.hierarchy;
-
   /// Allows for updating the list of needed libraries.
   ///
   /// Useful if a class hierarchy has been used externally.
@@ -1337,9 +1317,9 @@
   /// (though handling of the case where all bets are off should probably still
   /// live locally).
   void updateNeededDillLibrariesWithHierarchy(
-      ClassHierarchy hierarchy, ClassHierarchyBuilder? builderHierarchy) {
+      Set<Library> neededDillLibraries, ClassHierarchy hierarchy,
+      [ClassHierarchyBuilder? builderHierarchy]) {
     if (hierarchy is ClosedWorldClassHierarchy && !hierarchy.allBetsOff) {
-      neededDillLibraries ??= new Set<Library>();
       Set<Class> classes = new Set<Class>();
       List<Class> worklist = <Class>[];
       // Get all classes touched by kernel class hierarchy.
@@ -1380,35 +1360,35 @@
         Library library = c.enclosingLibrary;
         // Only add if loaded from a dill file (and wasn't a 'dill' that was
         // converted from source builders to dill builders).
-        if (dillLoadedData!.loader.containsLibraryBuilder(library.importUri) &&
-            (previousSourceBuilders == null ||
-                !previousSourceBuilders!.contains(library))) {
-          neededDillLibraries!.add(library);
+        if (_dillLoadedData!.loader.containsLibraryBuilder(library.importUri) &&
+            (_previousSourceBuilders == null ||
+                !_previousSourceBuilders!.contains(library))) {
+          neededDillLibraries.add(library);
         }
       }
     } else {
       // Cannot track in other kernel class hierarchies or
       // if all bets are off: Add everything (except for the libraries we just
       // converted from source builders to dill builders).
-      neededDillLibraries = new Set<Library>();
+      neededDillLibraries.clear();
       for (DillLibraryBuilder builder
-          in dillLoadedData!.loader.libraryBuilders) {
-        if (previousSourceBuilders == null ||
-            !previousSourceBuilders!.contains(builder.library)) {
-          neededDillLibraries!.add(builder.library);
+          in _dillLoadedData!.loader.libraryBuilders) {
+        if (_previousSourceBuilders == null ||
+            !_previousSourceBuilders!.contains(builder.library)) {
+          neededDillLibraries.add(builder.library);
         }
       }
     }
   }
 
   /// Internal method.
-  void invalidateNotKeptUserBuilders(Set<Uri?> invalidatedUris) {
-    if (modulesToLoad != null && userBuilders != null) {
+  void _invalidateNotKeptUserBuilders(Set<Uri?> invalidatedUris) {
+    if (_modulesToLoad != null && _userBuilders != null) {
       Set<Library> loadedNotKept = new Set<Library>();
-      for (LibraryBuilder builder in userBuilders!.values) {
+      for (LibraryBuilder builder in _userBuilders!.values) {
         loadedNotKept.add(builder.library);
       }
-      for (Component module in modulesToLoad!) {
+      for (Component module in _modulesToLoad!) {
         loadedNotKept.removeAll(module.libraries);
       }
       for (Library lib in loadedNotKept) {
@@ -1418,43 +1398,44 @@
   }
 
   /// Internal method.
-  void loadEnsureLoadedComponents(List<LibraryBuilder> reusedLibraries) {
-    if (modulesToLoad != null) {
+  void _loadEnsureLoadedComponents(List<LibraryBuilder> reusedLibraries) {
+    if (_modulesToLoad != null) {
       bool loadedAnything = false;
-      for (Component module in modulesToLoad!) {
+      for (Component module in _modulesToLoad!) {
         bool usedComponent = false;
         for (Library lib in module.libraries) {
-          if (!dillLoadedData!.loader.containsLibraryBuilder(lib.importUri)) {
-            dillLoadedData!.loader.libraries.add(lib);
-            dillLoadedData!.loader.registerKnownLibrary(lib);
-            reusedLibraries.add(dillLoadedData!.loader.read(lib.importUri, -1));
+          if (!_dillLoadedData!.loader.containsLibraryBuilder(lib.importUri)) {
+            _dillLoadedData!.loader.libraries.add(lib);
+            _dillLoadedData!.loader.registerKnownLibrary(lib);
+            reusedLibraries
+                .add(_dillLoadedData!.loader.read(lib.importUri, -1));
             usedComponent = true;
           }
         }
         if (usedComponent) {
-          dillLoadedData!.uriToSource.addAll(module.uriToSource);
+          _dillLoadedData!.uriToSource.addAll(module.uriToSource);
           loadedAnything = true;
         }
       }
       if (loadedAnything) {
         // We suppress finalization errors because they will reported via
         // problemsAsJson fields (with better precision).
-        dillLoadedData!.buildOutlines(suppressFinalizationErrors: true);
-        userBuilders = <Uri, LibraryBuilder>{};
-        platformBuilders = <LibraryBuilder>[];
+        _dillLoadedData!.buildOutlines(suppressFinalizationErrors: true);
+        _userBuilders = <Uri, LibraryBuilder>{};
+        _platformBuilders = <LibraryBuilder>[];
         for (DillLibraryBuilder builder
-            in dillLoadedData!.loader.libraryBuilders) {
+            in _dillLoadedData!.loader.libraryBuilders) {
           if (builder.importUri.scheme == "dart") {
-            platformBuilders!.add(builder);
+            _platformBuilders!.add(builder);
           } else {
-            userBuilders![builder.importUri] = builder;
+            _userBuilders![builder.importUri] = builder;
           }
         }
-        if (userBuilders!.isEmpty) {
-          userBuilders = null;
+        if (_userBuilders!.isEmpty) {
+          _userBuilders = null;
         }
       }
-      modulesToLoad = null;
+      _modulesToLoad = null;
     }
   }
 
@@ -1463,7 +1444,7 @@
   }
 
   /// Internal method.
-  void reissueLibraryProblems(
+  void _reissueLibraryProblems(
       Set<Library> allLibraries, List<Library> compiledLibraries) {
     // The newly-compiled libraries have issued problems already. Re-issue
     // problems for the libraries that weren't re-compiled (ignore compile
@@ -1484,75 +1465,12 @@
   }
 
   /// Internal method.
-  /// Re-issue problems on the component and return the filtered list.
-  List<String> reissueComponentProblems(Component componentWithDill) {
-    // These problems have already been reported.
-    Set<String> issuedProblems = new Set<String>();
-    if (componentWithDill.problemsAsJson != null) {
-      issuedProblems.addAll(componentWithDill.problemsAsJson!);
-    }
-
-    // Report old problems that wasn't reported again.
-    Set<Uri>? strongModeNNBDPackageOptOutUris;
-    for (MapEntry<Uri, List<DiagnosticMessageFromJson>> entry
-        in remainingComponentProblems.entries) {
-      List<DiagnosticMessageFromJson> messages = entry.value;
-      for (int i = 0; i < messages.length; i++) {
-        DiagnosticMessageFromJson message = messages[i];
-        if (message.codeName == "StrongModeNNBDPackageOptOut") {
-          // Special case this: Don't issue them here; instead collect them
-          // to get their uris and re-issue a new error.
-          strongModeNNBDPackageOptOutUris ??= {};
-          strongModeNNBDPackageOptOutUris.add(entry.key);
-          continue;
-        }
-        if (issuedProblems.add(message.toJsonString())) {
-          context.options.reportDiagnosticMessage(message);
-        }
-      }
-    }
-    if (strongModeNNBDPackageOptOutUris != null) {
-      // Get the builders for these uris; then call
-      // `SourceLoader.giveCombinedErrorForNonStrongLibraries` on them to issue
-      // a new error.
-      Set<LibraryBuilder> builders = {};
-      SourceLoader loader = userCode!.loader;
-      for (LibraryBuilder builder in loader.libraryBuilders) {
-        if (strongModeNNBDPackageOptOutUris.contains(builder.fileUri)) {
-          builders.add(builder);
-        }
-      }
-      FormattedMessage message = loader.giveCombinedErrorForNonStrongLibraries(
-          builders,
-          emitNonPackageErrors: false)!;
-      issuedProblems.add(message.toJsonString());
-      // The problem was issued by the call so don't re-issue it here.
-    }
-
-    // Save any new component-problems.
-    _addProblemsAsJsonToRemainingProblems(componentWithDill.problemsAsJson);
-    return new List<String>.from(issuedProblems);
-  }
-
-  /// Internal method.
-  Uri? getPartFileUri(
-      Uri parentFileUri, LibraryPart part, UriTranslator uriTranslator) {
-    Uri? fileUri = getPartUri(parentFileUri, part);
-    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(fileUri, false);
-    }
-    return fileUri;
-  }
-
-  /// Internal method.
   /// Compute the transitive closure.
   ///
   /// As a side-effect, this also cleans-up now-unreferenced builders as well as
   /// any saved component problems for such builders.
-  List<Library> computeTransitiveClosure(
+  List<Library> _computeTransitiveClosure(
+      IncrementalKernelTarget currentKernelTarget,
       List<Library> inputLibraries,
       List<Uri> entryPoints,
       List<LibraryBuilder> reusedLibraries,
@@ -1622,7 +1540,7 @@
           }
           for (LibraryPart part in library.parts) {
             Uri? partFileUri =
-                getPartFileUri(library.fileUri, part, uriTranslator);
+                uriTranslator.getPartFileUri(library.fileUri, part);
             partsUsed.add(partFileUri);
           }
         }
@@ -1633,26 +1551,32 @@
     bool removedDillBuilders = false;
     for (Uri uri in potentiallyReferencedLibraries.keys) {
       if (uri.scheme == "package") continue;
-      LibraryBuilder? builder = userCode!.loader.deregisterLibraryBuilder(uri);
+      LibraryBuilder? builder =
+          currentKernelTarget.loader.deregisterLibraryBuilder(uri);
       if (builder != null) {
         Library lib = builder.library;
         removedLibraries.add(lib);
-        if (dillLoadedData!.loader.deregisterLibraryBuilder(uri) != null) {
+        if (_dillLoadedData!.loader.deregisterLibraryBuilder(uri) != null) {
           removedDillBuilders = true;
         }
-        cleanupSourcesForBuilder(null, builder, uriTranslator,
-            CompilerContext.current.uriToSource, uriToSource, partsUsed);
-        userBuilders?.remove(uri);
-        removeLibraryFromRemainingComponentProblems(
-            lib, uriTranslator, partsUsed);
+        _cleanupSourcesForBuilder(
+            currentKernelTarget,
+            null,
+            builder,
+            uriTranslator,
+            CompilerContext.current.uriToSource,
+            uriToSource,
+            partsUsed);
+        _userBuilders?.remove(uri);
+        _componentProblems.removeLibrary(lib, uriTranslator, partsUsed);
 
         // Technically this isn't necessary as the uri is not a package-uri.
-        incrementalSerializer?.invalidate(builder.fileUri);
+        _incrementalSerializer?.invalidate(builder.fileUri);
       }
     }
     hierarchy.applyTreeChanges(removedLibraries, const [], const []);
     if (removedDillBuilders) {
-      makeDillLoaderLibrariesUpToDateWithBuildersMap();
+      _makeDillLoaderLibrariesUpToDateWithBuildersMap();
     }
 
     return result;
@@ -1663,10 +1587,10 @@
   /// will still hang around and be linked into the Component created internally
   /// in the compilation process.
   /// This method syncs the [libraries] list with the data in [builders].
-  void makeDillLoaderLibrariesUpToDateWithBuildersMap() {
-    dillLoadedData!.loader.libraries.clear();
-    for (LibraryBuilder builder in dillLoadedData!.loader.libraryBuilders) {
-      dillLoadedData!.loader.libraries.add(builder.library);
+  void _makeDillLoaderLibrariesUpToDateWithBuildersMap() {
+    _dillLoadedData!.loader.libraries.clear();
+    for (LibraryBuilder builder in _dillLoadedData!.loader.libraryBuilders) {
+      _dillLoadedData!.loader.libraries.add(builder.library);
     }
   }
 
@@ -1675,7 +1599,8 @@
   /// [partsUsed] indicates part uris that are used by (other/alive) libraries.
   /// Those parts will not be cleaned up. This is useful when a part has been
   /// "moved" to be part of another library.
-  void cleanupSourcesForBuilder(
+  void _cleanupSourcesForBuilder(
+      IncrementalKernelTarget? lastGoodKernelTarget,
       ReusageResult? reusedResult,
       LibraryBuilder builder,
       UriTranslator uriTranslator,
@@ -1686,20 +1611,21 @@
     uriToSourceExtra?.remove(builder.fileUri);
     Library lib = builder.library;
     for (LibraryPart part in lib.parts) {
-      Uri? partFileUri = getPartFileUri(lib.fileUri, part, uriTranslator);
+      Uri? partFileUri = uriTranslator.getPartFileUri(lib.fileUri, part);
       if (partsUsed != null && partsUsed.contains(partFileUri)) continue;
 
       // If the builders map contain the "parts" import uri, it's a real library
       // (erroneously) used as a part so we don't want to remove that.
-      if (userCode?.loader != null) {
+      if (lastGoodKernelTarget?.loader != null) {
         Uri? partImportUri = uriToSource[partFileUri]?.importUri;
         if (partImportUri != null &&
-            userCode!.loader.containsLibraryBuilder(partImportUri)) {
+            lastGoodKernelTarget!.loader
+                .containsLibraryBuilder(partImportUri)) {
           continue;
         }
       } else if (reusedResult != null) {
-        // We've just launched and don't have userCode yet. Search reusedResult
-        // for a kept library with this uri.
+        // We've just launched and don't have [lastGoodKernelTarget] yet. Search
+        // reusedResult for a kept library with this uri.
         bool found = false;
         for (int i = 0; i < reusedResult.reusedLibraries.length; i++) {
           LibraryBuilder reusedLibrary = reusedResult.reusedLibraries[i];
@@ -1718,195 +1644,12 @@
   }
 
   /// Internal method.
-  ///
-  /// [partsUsed] indicates part uris that are used by (other/alive) libraries.
-  /// Those parts will not be removed from the component problems.
-  /// This is useful when a part has been "moved" to be part of another library.
-  void removeLibraryFromRemainingComponentProblems(
-      Library lib, UriTranslator uriTranslator,
-      [Set<Uri?>? partsUsed]) {
-    remainingComponentProblems.remove(lib.fileUri);
-    // Remove parts too.
-    for (LibraryPart part in lib.parts) {
-      Uri? partFileUri = getPartFileUri(lib.fileUri, part, uriTranslator);
-      remainingComponentProblems.remove(partFileUri);
-    }
-  }
-
-  /// Internal method.
-  int prepareSummary(List<int>? summaryBytes, UriTranslator uriTranslator,
-      CompilerContext c, IncrementalCompilerData data) {
-    dillLoadedData = new DillTarget(ticker, uriTranslator, c.options.target);
-    int bytesLength = 0;
-
-    data.component = c.options.target.configureComponent(new Component());
-    if (summaryBytes != null) {
-      ticker.logMs("Read ${c.options.sdkSummary}");
-      new BinaryBuilderWithMetadata(summaryBytes,
-              disableLazyReading: false, disableLazyClassReading: true)
-          .readComponent(data.component!);
-      ticker.logMs("Deserialized ${c.options.sdkSummary}");
-      bytesLength += summaryBytes.length;
-    }
-
-    return bytesLength;
-  }
-
-  /// Internal method.
-  // This procedure will try to load the dill file and will crash if it cannot.
-  Future<int> initializeFromDill(UriTranslator uriTranslator, CompilerContext c,
-      IncrementalCompilerData data) async {
-    int bytesLength = 0;
-    FileSystemEntity entity =
-        c.options.fileSystem.entityForUri(initializeFromDillUri!);
-    if (await entity.exists()) {
-      List<int> initializationBytes = await entity.readAsBytes();
-      // ignore: unnecessary_null_comparison
-      if (initializationBytes != null && initializationBytes.isNotEmpty) {
-        ticker.logMs("Read $initializeFromDillUri");
-        data.initializationBytes = initializationBytes;
-
-        // We're going to output all we read here so lazy loading it
-        // doesn't make sense.
-        List<SubComponentView> views = new BinaryBuilderWithMetadata(
-                initializationBytes,
-                disableLazyReading: true)
-            .readComponent(data.component!,
-                checkCanonicalNames: true, createView: true)!;
-
-        // Compute "output nnbd mode".
-        NonNullableByDefaultCompiledMode compiledMode;
-        if (c.options
-            .isExperimentEnabledGlobally(ExperimentalFlag.nonNullable)) {
-          switch (c.options.nnbdMode) {
-            case NnbdMode.Weak:
-              compiledMode = NonNullableByDefaultCompiledMode.Weak;
-              break;
-            case NnbdMode.Strong:
-              compiledMode = NonNullableByDefaultCompiledMode.Strong;
-              break;
-            case NnbdMode.Agnostic:
-              compiledMode = NonNullableByDefaultCompiledMode.Agnostic;
-              break;
-          }
-        } else {
-          compiledMode = NonNullableByDefaultCompiledMode.Weak;
-        }
-
-        // Check the any package-urls still point to the same file
-        // (e.g. the package still exists and hasn't been updated).
-        // Also verify NNBD settings.
-        for (Library lib in data.component!.libraries) {
-          if (lib.importUri.scheme == "package" &&
-              uriTranslator.translate(lib.importUri, false) != lib.fileUri) {
-            // Package has been removed or updated.
-            // This library should be thrown away.
-            // Everything that depends on it should be thrown away.
-            // TODO(jensj): Anything that doesn't depend on it can be kept.
-            // For now just don't initialize from this dill.
-            throw const PackageChangedError();
-          }
-          // Note: If a library has a NonNullableByDefaultCompiledMode.invalid
-          // we will throw and we won't initialize from it.
-          // That's wanted behavior.
-          if (compiledMode !=
-              mergeCompilationModeOrThrow(
-                  compiledMode, lib.nonNullableByDefaultCompiledMode)) {
-            throw new CompilationModeError(
-                "Can't compile to $compiledMode with library with mode "
-                "${lib.nonNullableByDefaultCompiledMode}.");
-          }
-        }
-
-        // Only initialize the incremental serializer when we know we'll
-        // actually use the data loaded from dill.
-        initializedIncrementalSerializer =
-            incrementalSerializer?.initialize(initializationBytes, views) ??
-                false;
-
-        initializedFromDill = true;
-        bytesLength += initializationBytes.length;
-        saveComponentProblems(data);
-      }
-    }
-    return bytesLength;
-  }
-
-  /// Internal method.
-  void saveComponentProblems(IncrementalCompilerData data) {
-    List<String>? problemsAsJson = data.component!.problemsAsJson;
-    _addProblemsAsJsonToRemainingProblems(problemsAsJson);
-  }
-
-  void _addProblemsAsJsonToRemainingProblems(List<String>? problemsAsJson) {
-    if (problemsAsJson != null) {
-      for (String jsonString in problemsAsJson) {
-        DiagnosticMessageFromJson message =
-            new DiagnosticMessageFromJson.fromJson(jsonString);
-        assert(message.uri != null ||
-            (message.involvedFiles != null &&
-                message.involvedFiles!.isNotEmpty));
-        if (message.uri != null) {
-          List<DiagnosticMessageFromJson> messages =
-              remainingComponentProblems[message.uri!] ??=
-                  <DiagnosticMessageFromJson>[];
-          messages.add(message);
-        }
-        if (message.involvedFiles != null) {
-          // This indexes the same message under several uris - this way it will
-          // be issued as long as it's a problem. It will because of
-          // deduplication when we re-issue these (in reissueComponentProblems)
-          // only be reported once.
-          for (Uri uri in message.involvedFiles!) {
-            List<DiagnosticMessageFromJson> messages =
-                remainingComponentProblems[uri] ??=
-                    <DiagnosticMessageFromJson>[];
-            messages.add(message);
-          }
-        }
-      }
-    }
-  }
-
-  /// Internal method.
-  // This procedure will set up compiler from [componentToInitializeFrom].
-  void initializeFromComponent(UriTranslator uriTranslator, CompilerContext c,
-      IncrementalCompilerData data) {
-    ticker.logMs("About to initializeFromComponent");
-
-    dillLoadedData = new DillTarget(ticker, uriTranslator, c.options.target);
-    data.component = new Component(
-        libraries: componentToInitializeFrom!.libraries,
-        uriToSource: componentToInitializeFrom!.uriToSource)
-      ..setMainMethodAndMode(componentToInitializeFrom!.mainMethod?.reference,
-          true, componentToInitializeFrom!.mode);
-    saveComponentProblems(data);
-
-    bool foundDartCore = false;
-    for (int i = 0; i < data.component!.libraries.length; i++) {
-      Library library = data.component!.libraries[i];
-      if (library.importUri.scheme == "dart" &&
-          library.importUri.path == "core") {
-        foundDartCore = true;
-        break;
-      }
-    }
-
-    if (!foundDartCore) {
-      throw const InitializeFromComponentError("Did not find dart:core when "
-          "tried to initialize from component.");
-    }
-
-    ticker.logMs("Ran initializeFromComponent");
-  }
-
-  /// Internal method.
-  void appendLibraries(IncrementalCompilerData data, int bytesLength) {
+  void _appendLibraries(IncrementalCompilerData data, int bytesLength) {
     if (data.component != null) {
-      dillLoadedData!.loader
+      _dillLoadedData!.loader
           .appendLibraries(data.component!, byteCount: bytesLength);
     }
-    ticker.logMs("Appended libraries");
+    _ticker.logMs("Appended libraries");
   }
 
   @override
@@ -1919,12 +1662,14 @@
       {String? className,
       String? methodName,
       bool isStatic = false}) async {
-    assert(dillLoadedData != null && userCode != null);
+    IncrementalKernelTarget? lastGoodKernelTarget = this._lastGoodKernelTarget;
+    assert(_dillLoadedData != null && lastGoodKernelTarget != null);
 
     return await context.runInContext((_) async {
-      LibraryBuilder libraryBuilder = userCode!.loader
-          .read(libraryUri, -1, accessor: userCode!.loader.first);
-      ticker.logMs("Loaded library $libraryUri");
+      LibraryBuilder libraryBuilder = lastGoodKernelTarget!.loader.read(
+          libraryUri, -1,
+          accessorUri: lastGoodKernelTarget.loader.firstUri);
+      _ticker.logMs("Loaded library $libraryUri");
 
       Class? cls;
       if (className != null) {
@@ -1954,11 +1699,11 @@
         }
       }
 
-      userCode!.loader.resetSeenMessages();
+      lastGoodKernelTarget.loader.resetSeenMessages();
 
       for (TypeParameter typeParam in typeDefinitions) {
         if (!isLegalIdentifier(typeParam.name!)) {
-          userCode!.loader.addProblem(
+          lastGoodKernelTarget.loader.addProblem(
               templateIncrementalCompilerIllegalTypeParameter
                   .withArguments('$typeParam'),
               typeParam.fileOffset,
@@ -1975,7 +1720,7 @@
                 !isStatic &&
                 index == 1 &&
                 isExtensionThisName(name)))) {
-          userCode!.loader.addProblem(
+          lastGoodKernelTarget.loader.addProblem(
               templateIncrementalCompilerIllegalParameter.withArguments(name),
               // TODO: pass variable declarations instead of
               // parameter names for proper location detection.
@@ -1992,12 +1737,12 @@
         debugExprUri,
         /*packageUri*/ null,
         new ImplicitLanguageVersion(libraryBuilder.library.languageVersion),
-        userCode!.loader,
+        lastGoodKernelTarget.loader,
         null,
         scope: libraryBuilder.scope.createNestedScope("expression"),
         nameOrigin: libraryBuilder,
       );
-      ticker.logMs("Created debug library");
+      _ticker.logMs("Created debug library");
 
       if (libraryBuilder is DillLibraryBuilder) {
         for (LibraryDependency dependency
@@ -2030,10 +1775,11 @@
         }
 
         debugLibrary.addImportsToScope();
-        ticker.logMs("Added imports");
+        _ticker.logMs("Added imports");
       }
 
-      HybridFileSystem hfs = userCode!.fileSystem as HybridFileSystem;
+      HybridFileSystem hfs =
+          lastGoodKernelTarget.fileSystem as HybridFileSystem;
       MemoryFileSystem fs = hfs.memory;
       fs.entityForUri(debugExprUri).writeAsStringSync(expression);
 
@@ -2061,13 +1807,15 @@
         }
       }
 
-      debugLibrary.build(userCode!.loader.coreLibrary, modifyTarget: false);
-      Expression compiledExpression = await userCode!.loader.buildExpression(
-          debugLibrary,
-          className ?? extensionName,
-          (className != null && !isStatic) || extensionThis != null,
-          parameters,
-          extensionThis);
+      debugLibrary.build(lastGoodKernelTarget.loader.coreLibrary,
+          modifyTarget: false);
+      Expression compiledExpression = await lastGoodKernelTarget.loader
+          .buildExpression(
+              debugLibrary,
+              className ?? extensionName,
+              (className != null && !isStatic) || extensionThis != null,
+              parameters,
+              extensionThis);
 
       Procedure procedure = new Procedure(
           new Name(syntheticProcedureName), ProcedureKind.Method, parameters,
@@ -2080,21 +1828,21 @@
       procedure.fileUri = debugLibrary.fileUri;
       procedure.parent = cls ?? libraryBuilder.library;
 
-      userCode!.uriToSource.remove(debugExprUri);
-      userCode!.loader.sourceBytes.remove(debugExprUri);
+      lastGoodKernelTarget.uriToSource.remove(debugExprUri);
+      lastGoodKernelTarget.loader.sourceBytes.remove(debugExprUri);
 
       // Make sure the library has a canonical name.
       Component c = new Component(libraries: [debugLibrary.library]);
       c.computeCanonicalNames();
-      ticker.logMs("Built debug library");
+      _ticker.logMs("Built debug library");
 
-      userCode!.runProcedureTransformations(procedure);
+      lastGoodKernelTarget.runProcedureTransformations(procedure);
 
       return procedure;
     });
   }
 
-  bool packagesEqual(Package? a, Package? b) {
+  bool _packagesEqual(Package? a, Package? b) {
     if (a == null || b == null) return false;
     if (a.name != b.name) return false;
     if (a.root != b.root) return false;
@@ -2105,16 +1853,20 @@
   }
 
   /// Internal method.
-  ReusageResult computeReusedLibraries(Set<Uri?> invalidatedUris,
-      UriTranslator uriTranslator, List<Uri> entryPoints) {
+  ReusageResult _computeReusedLibraries(
+      IncrementalKernelTarget? lastGoodKernelTarget,
+      Map<Uri, LibraryBuilder>? _userBuilders,
+      Set<Uri?> invalidatedUris,
+      UriTranslator uriTranslator,
+      List<Uri> entryPoints) {
     Set<Uri> seenUris = new Set<Uri>();
     List<LibraryBuilder> reusedLibraries = <LibraryBuilder>[];
-    for (int i = 0; i < platformBuilders!.length; i++) {
-      LibraryBuilder builder = platformBuilders![i];
+    for (int i = 0; i < _platformBuilders!.length; i++) {
+      LibraryBuilder builder = _platformBuilders![i];
       if (!seenUris.add(builder.importUri)) continue;
       reusedLibraries.add(builder);
     }
-    if (userCode == null && userBuilders == null) {
+    if (lastGoodKernelTarget == null && _userBuilders == null) {
       return new ReusageResult.reusedLibrariesOnly(reusedLibraries);
     }
     bool invalidatedBecauseOfPackageUpdate = false;
@@ -2134,16 +1886,16 @@
       if (importUri != fileUri && invalidatedUris.contains(fileUri)) {
         return true;
       }
-      if (hasToCheckPackageUris && importUri.scheme == "package") {
+      if (_hasToCheckPackageUris && importUri.scheme == "package") {
         // Get package name, check if the base URI has changed for the package,
         // if it has, translate the URI again,
         // otherwise the URI cannot have changed.
         String path = importUri.path;
         int firstSlash = path.indexOf('/');
         String packageName = path.substring(0, firstSlash);
-        if (previousPackagesMap == null ||
-            !packagesEqual(previousPackagesMap![packageName],
-                currentPackagesMap![packageName])) {
+        if (_previousPackagesMap == null ||
+            !_packagesEqual(_previousPackagesMap![packageName],
+                _currentPackagesMap![packageName])) {
           Uri? newFileUri = uriTranslator.translate(importUri, false);
           if (newFileUri != fileUri) {
             invalidatedBecauseOfPackageUpdate = true;
@@ -2179,8 +1931,8 @@
       } else if (libraryBuilder is DillLibraryBuilder) {
         for (LibraryPart part in libraryBuilder.library.parts) {
           Uri partUri = getPartUri(libraryBuilder.importUri, part);
-          Uri? fileUri = getPartFileUri(
-              libraryBuilder.library.fileUri, part, uriTranslator);
+          Uri? fileUri = uriTranslator.getPartFileUri(
+              libraryBuilder.library.fileUri, part);
           partUriToParent[partUri] = libraryBuilder;
           partUriToParent[fileUri] = libraryBuilder;
 
@@ -2198,19 +1950,21 @@
       }
     }
 
-    if (userCode != null) {
-      // userCode already contains the builders from userBuilders.
-      for (LibraryBuilder libraryBuilder in userCode!.loader.libraryBuilders) {
+    if (lastGoodKernelTarget != null) {
+      // [lastGoodKernelTarget] already contains the builders from
+      // [userBuilders].
+      for (LibraryBuilder libraryBuilder
+          in lastGoodKernelTarget.loader.libraryBuilders) {
         addBuilderAndInvalidateUris(libraryBuilder.importUri, libraryBuilder);
       }
     } else {
-      // userCode was null so we explicitly have to add the builders from
-      // userBuilders (which cannot be null as we checked initially that one of
-      // them was non-null).
-      userBuilders!.forEach(addBuilderAndInvalidateUris);
+      // [lastGoodKernelTarget] was null so we explicitly have to add the
+      // builders from [userBuilders] (which cannot be null as we checked
+      // initially that one of them was non-null).
+      _userBuilders!.forEach(addBuilderAndInvalidateUris);
     }
 
-    recordInvalidatedImportUrisForTesting(invalidatedImportUris);
+    recorderForTesting?.recordInvalidatedImportUris(invalidatedImportUris);
     for (Uri uri in invalidatedImportUris) {
       directlyInvalidated.add(builders[uri]!);
     }
@@ -2286,39 +2040,29 @@
 
   @override
   void invalidate(Uri? uri) {
-    invalidatedUris.add(uri);
+    _invalidatedUris.add(uri);
   }
 
   @override
   void invalidateAllSources() {
-    if (userCode != null) {
-      Set<Uri> uris = new Set<Uri>.from(userCode!.loader.libraryImportUris);
-      uris.removeAll(dillLoadedData!.loader.libraryImportUris);
-      if (previousSourceBuilders != null) {
-        for (Library library in previousSourceBuilders!) {
+    IncrementalKernelTarget? lastGoodKernelTarget = this._lastGoodKernelTarget;
+    if (lastGoodKernelTarget != null) {
+      Set<Uri> uris =
+          new Set<Uri>.from(lastGoodKernelTarget.loader.libraryImportUris);
+      uris.removeAll(_dillLoadedData!.loader.libraryImportUris);
+      if (_previousSourceBuilders != null) {
+        for (Library library in _previousSourceBuilders!) {
           uris.add(library.importUri);
         }
       }
-      invalidatedUris.addAll(uris);
+      _invalidatedUris.addAll(uris);
     }
   }
 
   @override
   void setModulesToLoadOnNextComputeDelta(List<Component> components) {
-    modulesToLoad = components.toList();
+    _modulesToLoad = components.toList();
   }
-
-  /// Internal method.
-  void recordNonFullComponentForTesting(Component component) {}
-
-  /// Internal method.
-  void recordInvalidatedImportUrisForTesting(List<Uri> uris) {}
-
-  /// Internal method.
-  void recordRebuildBodiesCountForTesting(int count) {}
-
-  /// Internal method.
-  void recordTemporaryFileForTesting(Uri uri) {}
 }
 
 /// Translate a parts "partUri" to an actual uri with handling of invalid uris.
@@ -2482,3 +2226,412 @@
     librariesUsed.addAll(visitedLibraries);
   }
 }
+
+abstract class _InitializationStrategy {
+  const _InitializationStrategy();
+
+  factory _InitializationStrategy.fromComponent(Component? component) {
+    return component != null
+        ? new _InitializationFromComponent(component)
+        : const _InitializationFromSdkSummary();
+  }
+
+  factory _InitializationStrategy.fromUri(Uri? uri) {
+    return uri != null
+        ? new _InitializationFromUri(uri)
+        : const _InitializationFromSdkSummary();
+  }
+
+  bool get initializedFromDillForTesting => false;
+
+  bool get initializedIncrementalSerializerForTesting => false;
+
+  Future<int> initialize(
+      DillTarget dillLoadedData,
+      UriTranslator uriTranslator,
+      CompilerContext context,
+      IncrementalCompilerData data,
+      _ComponentProblems componentProblems,
+      IncrementalSerializer? incrementalSerializer,
+      RecorderForTesting? recorderForTesting);
+}
+
+class _InitializationFromSdkSummary extends _InitializationStrategy {
+  const _InitializationFromSdkSummary();
+
+  @override
+  Future<int> initialize(
+      DillTarget dillLoadedData,
+      UriTranslator uriTranslator,
+      CompilerContext context,
+      IncrementalCompilerData data,
+      _ComponentProblems componentProblems,
+      IncrementalSerializer? incrementalSerializer,
+      RecorderForTesting? recorderForTesting) async {
+    List<int>? summaryBytes = await context.options.loadSdkSummaryBytes();
+    return _prepareSummary(
+        dillLoadedData, summaryBytes, uriTranslator, context, data);
+  }
+
+  int _prepareSummary(
+      DillTarget dillLoadedTarget,
+      List<int>? summaryBytes,
+      UriTranslator uriTranslator,
+      CompilerContext context,
+      IncrementalCompilerData data) {
+    int bytesLength = 0;
+
+    data.component = context.options.target.configureComponent(new Component());
+    if (summaryBytes != null) {
+      dillLoadedTarget.ticker.logMs("Read ${context.options.sdkSummary}");
+      new BinaryBuilderWithMetadata(summaryBytes,
+              disableLazyReading: false, disableLazyClassReading: true)
+          .readComponent(data.component!);
+      dillLoadedTarget.ticker
+          .logMs("Deserialized ${context.options.sdkSummary}");
+      bytesLength += summaryBytes.length;
+    }
+
+    return bytesLength;
+  }
+}
+
+class _InitializationFromComponent extends _InitializationStrategy {
+  Component componentToInitializeFrom;
+
+  _InitializationFromComponent(this.componentToInitializeFrom);
+
+  @override
+  Future<int> initialize(
+      DillTarget dillLoadedData,
+      UriTranslator uriTranslator,
+      CompilerContext context,
+      IncrementalCompilerData data,
+      _ComponentProblems componentProblems,
+      IncrementalSerializer? incrementalSerializer,
+      RecorderForTesting? recorderForTesting) {
+    dillLoadedData.ticker.logMs("About to initializeFromComponent");
+
+    Component component = data.component = new Component(
+        libraries: componentToInitializeFrom.libraries,
+        uriToSource: componentToInitializeFrom.uriToSource)
+      ..setMainMethodAndMode(componentToInitializeFrom.mainMethod?.reference,
+          true, componentToInitializeFrom.mode);
+    componentProblems.saveComponentProblems(component);
+
+    bool foundDartCore = false;
+    for (int i = 0; i < component.libraries.length; i++) {
+      Library library = component.libraries[i];
+      if (library.importUri.scheme == "dart" &&
+          library.importUri.path == "core") {
+        foundDartCore = true;
+        break;
+      }
+    }
+
+    if (!foundDartCore) {
+      throw const InitializeFromComponentError("Did not find dart:core when "
+          "tried to initialize from component.");
+    }
+
+    dillLoadedData.ticker.logMs("Ran initializeFromComponent");
+    return new Future<int>.value(0);
+  }
+}
+
+class _InitializationFromUri extends _InitializationFromSdkSummary {
+  Uri initializeFromDillUri;
+
+  _InitializationFromUri(this.initializeFromDillUri);
+
+  @override
+  Future<int> initialize(
+      DillTarget dillLoadedData,
+      UriTranslator uriTranslator,
+      CompilerContext context,
+      IncrementalCompilerData data,
+      _ComponentProblems componentProblems,
+      IncrementalSerializer? incrementalSerializer,
+      RecorderForTesting? recorderForTesting) async {
+    List<int>? summaryBytes = await context.options.loadSdkSummaryBytes();
+    int bytesLength = _prepareSummary(
+        dillLoadedData, summaryBytes, uriTranslator, context, data);
+    try {
+      bytesLength += await _initializeFromDill(
+          dillLoadedData,
+          initializeFromDillUri,
+          uriTranslator,
+          context,
+          data,
+          componentProblems,
+          incrementalSerializer);
+    } catch (e, st) {
+      // We might have loaded x out of y libraries into the component.
+      // To avoid any unforeseen problems start over.
+      bytesLength = _prepareSummary(
+          dillLoadedData, summaryBytes, uriTranslator, context, data);
+
+      if (e is InvalidKernelVersionError ||
+          e is InvalidKernelSdkVersionError ||
+          e is PackageChangedError ||
+          e is CanonicalNameSdkError ||
+          e is CompilationModeError) {
+        // Don't report any warning.
+      } else {
+        Uri? gzInitializedFrom;
+        if (context.options.writeFileOnCrashReport) {
+          gzInitializedFrom =
+              saveAsGzip(data.initializationBytes!, "initialize_from.dill");
+          recorderForTesting?.recordTemporaryFile(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",
+                  "$st",
+                  gzInitializedFrom)
+              : templateInitializeFromDillUnknownProblemNoDump.withArguments(
+                  initializeFromDillUri.toString(), "$e", "$st");
+          dillLoadedData.loader.addProblem(message, TreeNode.noOffset, 1, null);
+        }
+      }
+    }
+    return bytesLength;
+  }
+
+  bool _initializedFromDill = false;
+  bool _initializedIncrementalSerializer = false;
+
+  @override
+  bool get initializedFromDillForTesting => _initializedFromDill;
+
+  @override
+  bool get initializedIncrementalSerializerForTesting =>
+      _initializedIncrementalSerializer;
+
+  // This procedure will try to load the dill file and will crash if it cannot.
+  Future<int> _initializeFromDill(
+      DillTarget dillLoadedData,
+      Uri initializeFromDillUri,
+      UriTranslator uriTranslator,
+      CompilerContext context,
+      IncrementalCompilerData data,
+      _ComponentProblems _componentProblems,
+      IncrementalSerializer? incrementalSerializer) async {
+    int bytesLength = 0;
+    FileSystemEntity entity =
+        context.options.fileSystem.entityForUri(initializeFromDillUri);
+    if (await entity.exists()) {
+      List<int> initializationBytes = await entity.readAsBytes();
+      // ignore: unnecessary_null_comparison
+      if (initializationBytes != null && initializationBytes.isNotEmpty) {
+        dillLoadedData.ticker.logMs("Read $initializeFromDillUri");
+        data.initializationBytes = initializationBytes;
+
+        // We're going to output all we read here so lazy loading it
+        // doesn't make sense.
+        List<SubComponentView> views = new BinaryBuilderWithMetadata(
+                initializationBytes,
+                disableLazyReading: true)
+            .readComponent(data.component!,
+                checkCanonicalNames: true, createView: true)!;
+
+        // Compute "output nnbd mode".
+        NonNullableByDefaultCompiledMode compiledMode;
+        if (context.options
+            .isExperimentEnabledGlobally(ExperimentalFlag.nonNullable)) {
+          switch (context.options.nnbdMode) {
+            case NnbdMode.Weak:
+              compiledMode = NonNullableByDefaultCompiledMode.Weak;
+              break;
+            case NnbdMode.Strong:
+              compiledMode = NonNullableByDefaultCompiledMode.Strong;
+              break;
+            case NnbdMode.Agnostic:
+              compiledMode = NonNullableByDefaultCompiledMode.Agnostic;
+              break;
+          }
+        } else {
+          compiledMode = NonNullableByDefaultCompiledMode.Weak;
+        }
+
+        // Check the any package-urls still point to the same file
+        // (e.g. the package still exists and hasn't been updated).
+        // Also verify NNBD settings.
+        for (Library lib in data.component!.libraries) {
+          if (lib.importUri.scheme == "package" &&
+              uriTranslator.translate(lib.importUri, false) != lib.fileUri) {
+            // Package has been removed or updated.
+            // This library should be thrown away.
+            // Everything that depends on it should be thrown away.
+            // TODO(jensj): Anything that doesn't depend on it can be kept.
+            // For now just don't initialize from this dill.
+            throw const PackageChangedError();
+          }
+          // Note: If a library has a NonNullableByDefaultCompiledMode.invalid
+          // we will throw and we won't initialize from it.
+          // That's wanted behavior.
+          if (compiledMode !=
+              mergeCompilationModeOrThrow(
+                  compiledMode, lib.nonNullableByDefaultCompiledMode)) {
+            throw new CompilationModeError(
+                "Can't compile to $compiledMode with library with mode "
+                "${lib.nonNullableByDefaultCompiledMode}.");
+          }
+        }
+
+        // Only initialize the incremental serializer when we know we'll
+        // actually use the data loaded from dill.
+        _initializedIncrementalSerializer =
+            incrementalSerializer?.initialize(initializationBytes, views) ??
+                false;
+
+        _initializedFromDill = true;
+        bytesLength += initializationBytes.length;
+        _componentProblems.saveComponentProblems(data.component!);
+      }
+    }
+    return bytesLength;
+  }
+}
+
+class _ComponentProblems {
+  Map<Uri, List<DiagnosticMessageFromJson>> _remainingComponentProblems =
+      new Map<Uri, List<DiagnosticMessageFromJson>>();
+
+  /// [partsUsed] indicates part uris that are used by (other/alive) libraries.
+  /// Those parts will not be removed from the component problems.
+  /// This is useful when a part has been "moved" to be part of another library.
+  void removeLibrary(Library lib, UriTranslator uriTranslator,
+      [Set<Uri?>? partsUsed]) {
+    if (_remainingComponentProblems.isNotEmpty) {
+      _remainingComponentProblems.remove(lib.fileUri);
+      // Remove parts too.
+      for (LibraryPart part in lib.parts) {
+        Uri? partFileUri = uriTranslator.getPartFileUri(lib.fileUri, part);
+        _remainingComponentProblems.remove(partFileUri);
+      }
+    }
+  }
+
+  /// Re-issue problems on the component and return the filtered list.
+  List<String> reissueProblems(
+      CompilerContext context,
+      IncrementalKernelTarget currentKernelTarget,
+      Component componentWithDill) {
+    // These problems have already been reported.
+    Set<String> issuedProblems = new Set<String>();
+    if (componentWithDill.problemsAsJson != null) {
+      issuedProblems.addAll(componentWithDill.problemsAsJson!);
+    }
+
+    // Report old problems that wasn't reported again.
+    Set<Uri>? strongModeNNBDPackageOptOutUris;
+    for (MapEntry<Uri, List<DiagnosticMessageFromJson>> entry
+        in _remainingComponentProblems.entries) {
+      List<DiagnosticMessageFromJson> messages = entry.value;
+      for (int i = 0; i < messages.length; i++) {
+        DiagnosticMessageFromJson message = messages[i];
+        if (message.codeName == "StrongModeNNBDPackageOptOut") {
+          // Special case this: Don't issue them here; instead collect them
+          // to get their uris and re-issue a new error.
+          strongModeNNBDPackageOptOutUris ??= {};
+          strongModeNNBDPackageOptOutUris.add(entry.key);
+          continue;
+        }
+        if (issuedProblems.add(message.toJsonString())) {
+          context.options.reportDiagnosticMessage(message);
+        }
+      }
+    }
+    if (strongModeNNBDPackageOptOutUris != null) {
+      // Get the builders for these uris; then call
+      // `SourceLoader.giveCombinedErrorForNonStrongLibraries` on them to issue
+      // a new error.
+      Set<LibraryBuilder> builders = {};
+      SourceLoader loader = currentKernelTarget.loader;
+      for (LibraryBuilder builder in loader.libraryBuilders) {
+        if (strongModeNNBDPackageOptOutUris.contains(builder.fileUri)) {
+          builders.add(builder);
+        }
+      }
+      FormattedMessage message = loader.giveCombinedErrorForNonStrongLibraries(
+          builders,
+          emitNonPackageErrors: false)!;
+      issuedProblems.add(message.toJsonString());
+      // The problem was issued by the call so don't re-issue it here.
+    }
+
+    // Save any new component-problems.
+    _addProblemsAsJson(componentWithDill.problemsAsJson);
+    return new List<String>.from(issuedProblems);
+  }
+
+  void saveComponentProblems(Component component) {
+    _addProblemsAsJson(component.problemsAsJson);
+  }
+
+  void _addProblemsAsJson(List<String>? problemsAsJson) {
+    if (problemsAsJson != null) {
+      for (String jsonString in problemsAsJson) {
+        DiagnosticMessageFromJson message =
+            new DiagnosticMessageFromJson.fromJson(jsonString);
+        assert(message.uri != null ||
+            (message.involvedFiles != null &&
+                message.involvedFiles!.isNotEmpty));
+        if (message.uri != null) {
+          List<DiagnosticMessageFromJson> messages =
+              _remainingComponentProblems[message.uri!] ??=
+                  <DiagnosticMessageFromJson>[];
+          messages.add(message);
+        }
+        if (message.involvedFiles != null) {
+          // This indexes the same message under several uris - this way it will
+          // be issued as long as it's a problem. It will because of
+          // deduplication when we re-issue these (in reissueComponentProblems)
+          // only be reported once.
+          for (Uri uri in message.involvedFiles!) {
+            List<DiagnosticMessageFromJson> messages =
+                _remainingComponentProblems[uri] ??=
+                    <DiagnosticMessageFromJson>[];
+            messages.add(message);
+          }
+        }
+      }
+    }
+  }
+}
+
+extension on UriTranslator {
+  Uri? getPartFileUri(Uri parentFileUri, LibraryPart part) {
+    Uri? fileUri = getPartUri(parentFileUri, part);
+    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 = translate(fileUri, false);
+    }
+    return fileUri;
+  }
+}
+
+class RecorderForTesting {
+  const RecorderForTesting();
+
+  void recordNonFullComponent(Component component) {}
+
+  void recordInvalidatedImportUris(List<Uri> uris) {}
+
+  void recordRebuildBodiesCount(int count) {}
+
+  void recordTemporaryFile(Uri uri) {}
+}
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 c19ef88..dad946b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -4013,7 +4013,8 @@
   @override
   void endFormalParameter(
       Token? thisKeyword,
-      Token? periodAfterThis,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
       Token? initializerStart,
       Token? initializerEnd,
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 9e0e011..9440adf 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -316,7 +316,7 @@
           getEntryPointUri(entryPoint, issueProblem: true);
       result.add(translatedEntryPoint);
       loader.read(translatedEntryPoint, -1,
-          accessor: loader.first,
+          accessorUri: loader.firstUri,
           fileUri: translatedEntryPoint != entryPoint ? entryPoint : null);
     }
     return result;
@@ -402,7 +402,6 @@
     if (loader.first == null) return null;
     return withCrashReporting<Component?>(() async {
       await loader.buildOutlines();
-      loader.createTypeInferenceEngine();
       loader.coreLibrary.becomeCoreLibrary();
       loader.resolveParts();
       loader.computeLibraryScopes();
@@ -411,30 +410,33 @@
       loader.computeVariances();
       loader.computeDefaultTypes(
           dynamicType, nullType, bottomType, objectClassBuilder);
-      List<SourceClassBuilder> myClasses =
+      List<SourceClassBuilder> sourceClassBuilders =
           loader.checkSemantics(objectClassBuilder);
+      loader.computeMacroDeclarations(sourceClassBuilders);
       loader.finishTypeVariables(objectClassBuilder, dynamicType);
+      loader.createTypeInferenceEngine();
       loader.buildComponent();
       installDefaultSupertypes();
-      installSyntheticConstructors(myClasses);
+      installSyntheticConstructors(sourceClassBuilders);
       loader.resolveConstructors();
       component =
           link(new List<Library>.from(loader.libraries), nameRoot: nameRoot);
       computeCoreTypes();
-      loader.buildClassHierarchy(myClasses, objectClassBuilder);
+      loader.buildClassHierarchy(sourceClassBuilders, objectClassBuilder);
       loader.computeHierarchy();
       loader.computeShowHideElements();
       loader.installTypedefTearOffs();
-      loader.performTopLevelInference(myClasses);
-      loader.checkSupertypes(myClasses);
-      loader.checkOverrides(myClasses);
-      loader.checkAbstractMembers(myClasses);
-      loader.addNoSuchMethodForwarders(myClasses);
-      loader.checkMixins(myClasses);
+      loader.performTopLevelInference(sourceClassBuilders);
+      loader.checkSupertypes(sourceClassBuilders);
+      loader.checkOverrides(sourceClassBuilders);
+      loader.checkAbstractMembers(sourceClassBuilders);
+      loader.addNoSuchMethodForwarders(sourceClassBuilders);
+      loader.checkMixins(sourceClassBuilders);
       loader.buildOutlineExpressions(
           loader.coreTypes, synthesizedFunctionNodes);
+      loader.computeMacroApplications();
       loader.checkTypes();
-      loader.checkRedirectingFactories(myClasses);
+      loader.checkRedirectingFactories(sourceClassBuilders);
       loader.checkMainMethods();
       installAllComponentProblems(loader.allComponentProblems);
       loader.allComponentProblems.clear();
@@ -809,7 +811,8 @@
         supertype is TypeVariableBuilder ||
         supertype is DynamicTypeDeclarationBuilder ||
         supertype is VoidTypeDeclarationBuilder ||
-        supertype is NeverTypeDeclarationBuilder) {
+        supertype is NeverTypeDeclarationBuilder ||
+        supertype is TypeAliasBuilder) {
       builder.addSyntheticConstructor(_makeDefaultConstructor(
           builder, constructorReference, tearOffReference));
     } else {
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro.dart b/pkg/front_end/lib/src/fasta/kernel/macro.dart
new file mode 100644
index 0000000..afa9dca
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/macro.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All 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';
+
+bool enableMacros = false;
+
+final Uri macroLibraryUri = Uri.parse('package:macro_builder/src/macro.dart');
+const String macroClassName = 'Macro';
+
+class MacroDeclarationData {
+  bool macrosAreAvailable = false;
+  Map<Uri, List<String>> macroDeclarations = {};
+  List<List<Uri>>? compilationSequence;
+}
+
+class MacroApplicationData {
+  Map<Library, LibraryMacroApplicationData> libraryData = {};
+}
+
+class MacroApplications {
+  final List<Class> macros;
+
+  MacroApplications(this.macros);
+}
+
+class LibraryMacroApplicationData {
+  MacroApplications? libraryApplications;
+  Map<Class, ClassMacroApplicationData> classData = {};
+  Map<Typedef, MacroApplications> typedefApplications = {};
+  Map<Member, MacroApplications> memberApplications = {};
+}
+
+class ClassMacroApplicationData {
+  MacroApplications? classApplications;
+  Map<Member, MacroApplications> memberApplications = {};
+}
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 a1e2b88..86edd9f 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -176,6 +176,11 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    debugEvent("NoTypeNameInConstructorReference");
+  }
+
+  @override
   void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
     debugEvent("NoConstructorReferenceContinuationAfterTypeArguments");
   }
@@ -212,11 +217,26 @@
   }
 
   @override
+  void handleEnumWithClause(Token withKeyword) {
+    debugEvent("EnumWithClause");
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    debugEvent("EnumNoWithClause");
+  }
+
+  @override
   void endTypeArguments(int count, Token beginToken, Token endToken) {
     debugEvent("TypeArguments");
   }
 
   @override
+  void endArguments(int count, Token beginToken, Token endToken) {
+    debugEvent("Arguments");
+  }
+
+  @override
   void handleInvalidTypeArguments(Token token) {
     debugEvent("InvalidTypeArguments");
   }
@@ -939,12 +959,103 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void beginEnum(Token enumKeyword) {
+    assert(checkState(enumKeyword, [ValueKinds.NameOrParserRecovery]));
     debugEvent("Enum");
-    const FixedNullableList<Object>().pop(stack, count * 2);
-    pop(); // Name.
-    pop(); // Annotations begin token.
+    Object? name = pop();
+
+    assert(currentDeclaration == null);
+    assert(memberScope == libraryBuilder.scope);
+
+    if (name is ParserRecovery) {
+      currentClassIsParserRecovery = true;
+      return;
+    }
+
+    currentDeclaration =
+        lookupBuilder(enumKeyword, null, name as String) as DeclarationBuilder;
+    memberScope = currentDeclaration!.scope;
+  }
+
+  @override
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
+    debugEvent("Enum");
     checkEmpty(enumKeyword.charOffset);
+    currentDeclaration = null;
+    memberScope = libraryBuilder.scope;
+  }
+
+  @override
+  void handleEnumElement(Token beginKeyword) {
+    debugEvent("EnumElement");
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    debugEvent("EnumElements");
+    const FixedNullableList<Object>().pop(stack, elementsCount * 2);
+    pop(); // Annotations begin token.
+    checkEmpty(elementsEndToken.charOffset);
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    debugEvent("EnumHeader");
+  }
+
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    // TODO(chloestefantsova): Call endClassConstructor instead.
+    debugEvent("EnumConstructor");
+    pop(); // bodyToken
+    pop(); // name
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    // Skip the declaration. An error as already been produced by the parser.
+  }
+
+  @override
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    // TODO(chloestefantsova): Call endClassFactoryMethod instead.
+    debugEvent("EnumFactoryMethod");
+    pop(); // bodyToken
+    pop(); // name
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    // Skip the declaration. An error as already been produced by the parser.
+  }
+
+  @override
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    // TODO(chloestefantsova): Call endClassMethod instead.
+    debugEvent("EnumMethod");
+    pop(); // bodyToken
+    pop(); // name
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    // Skip the declaration. An error as already been produced by the parser.
+  }
+
+  @override
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    // TODO(chloestefantsova): Call endClassFields instead.
+    debugEvent("EnumFields");
+    const FixedNullableList<String>().pop(stack, count); // names
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    // Skip the declaration. An error as already been produced by the parser.
   }
 
   @override
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 63f5779..0d7fc82 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -309,6 +309,33 @@
   /// This includes type of the declaration but excludes annotations on the
   /// field declaration itself, which are seen in the [ExtensionBody] context.
   ExtensionStaticField,
+
+  /// In a generative constructor declaration inside an enum declaration.
+  EnumConstructor,
+
+  /// In a static method declaration inside an enum declaration.
+  EnumStaticMethod,
+
+  /// In a static field declaration inside an enum declaration.
+  EnumStaticField,
+
+  /// In an instance method declaration inside an enum declaration.
+  EnumInstanceMethod,
+
+  /// In an instance field declaration inside an enum declaration.
+  EnumInstanceField,
+
+  /// In a factory constructor declaration inside an enum declaration. This
+  /// is an error case.
+  ///
+  /// This excludes annotations on the constructor declaration itself, which
+  /// are seen in the [EnumBody] context.
+  EnumFactory,
+
+  /// In an enum declaration body.
+  ///
+  /// This includes annotations on extension member declarations.
+  EnumBody,
 }
 
 extension on DeclarationContext {
@@ -318,7 +345,6 @@
       case DeclarationContext.Typedef:
       case DeclarationContext.TopLevelMethod:
       case DeclarationContext.TopLevelField:
-      case DeclarationContext.Enum:
         return InstanceTypeVariableAccessState.Unexpected;
       case DeclarationContext.ClassOrMixinOrNamedMixinApplication:
       case DeclarationContext.NamedMixinApplication:
@@ -327,6 +353,10 @@
       case DeclarationContext.ClassFactory:
       case DeclarationContext.ClassInstanceMethod:
       case DeclarationContext.ClassInstanceField:
+      case DeclarationContext.Enum:
+      case DeclarationContext.EnumConstructor:
+      case DeclarationContext.EnumInstanceField:
+      case DeclarationContext.EnumInstanceMethod:
       case DeclarationContext.Mixin:
       case DeclarationContext.MixinInstanceMethod:
       case DeclarationContext.MixinInstanceField:
@@ -337,6 +367,9 @@
       case DeclarationContext.ClassBody:
       case DeclarationContext.ClassStaticMethod:
       case DeclarationContext.ClassStaticField:
+      case DeclarationContext.EnumStaticField:
+      case DeclarationContext.EnumStaticMethod:
+      case DeclarationContext.EnumBody:
       case DeclarationContext.MixinBody:
       case DeclarationContext.MixinStaticMethod:
       case DeclarationContext.MixinStaticField:
@@ -349,6 +382,7 @@
       case DeclarationContext.ExtensionConstructor:
       case DeclarationContext.ExtensionFactory:
       case DeclarationContext.ExtensionInstanceField:
+      case DeclarationContext.EnumFactory:
         return InstanceTypeVariableAccessState.Invalid;
     }
   }
@@ -824,6 +858,9 @@
       case DeclarationKind.Extension:
         declarationContext = DeclarationContext.ExtensionBody;
         break;
+      case DeclarationKind.Enum:
+        declarationContext = DeclarationContext.Enum;
+        break;
     }
     pushDeclarationContext(declarationContext);
     if (kind == DeclarationKind.Extension) {
@@ -876,12 +913,21 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    debugEvent("ClassOrMixinImplements");
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    debugEvent("Implements");
     push(const FixedNullableList<TypeBuilder>()
             .popNonNullable(stack, interfacesCount, dummyTypeBuilder) ??
         NullValue.TypeBuilderList);
+
+    if (!libraryBuilder.enableEnhancedEnumsInLibrary &&
+        implementsKeyword != null &&
+        declarationContext == DeclarationContext.Enum) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          implementsKeyword.charOffset,
+          -1);
+    }
   }
 
   @override
@@ -1457,6 +1503,14 @@
           declarationContext = DeclarationContext.ExtensionInstanceMethod;
         }
         break;
+      case DeclarationKind.Enum:
+        if (inConstructor) {
+          declarationContext = DeclarationContext.EnumConstructor;
+        } else if (staticToken != null) {
+          declarationContext = DeclarationContext.EnumStaticMethod;
+        } else {
+          declarationContext = DeclarationContext.EnumInstanceMethod;
+        }
     }
     pushDeclarationContext(declarationContext);
 
@@ -1910,6 +1964,12 @@
   }
 
   @override
+  void endArguments(int count, Token beginToken, Token endToken) {
+    debugEvent("Arguments");
+    push(NullValue.Arguments);
+  }
+
+  @override
   void handleInvalidTypeArguments(Token token) {
     debugEvent("InvalidTypeArguments");
     pop(NullValue.TypeArguments);
@@ -1959,12 +2019,31 @@
   }
 
   @override
+  void handleNoArguments(Token token) {
+    debugEvent("NoArguments");
+    push(NullValue.Arguments);
+  }
+
+  @override
   void handleNoTypeVariables(Token token) {
     super.handleNoTypeVariables(token);
     inConstructorName = false;
   }
 
   @override
+  void handleNoTypeArguments(Token token) {
+    debugEvent("NoTypeArguments");
+    push(NullValue.TypeArguments);
+  }
+
+  @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    debugEvent("NoTypeNameInConstructorReference");
+    push(NullValue.Name);
+    push(token.charOffset);
+  }
+
+  @override
   void handleVoidKeyword(Token token) {
     debugEvent("VoidKeyword");
     push(libraryBuilder.addVoidType(token.charOffset));
@@ -1991,13 +2070,26 @@
   @override
   void endFormalParameter(
       Token? thisKeyword,
-      Token? periodAfterThis,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
       Token? initializerStart,
       Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
     debugEvent("FormalParameter");
+
+    if (superKeyword != null &&
+        !libraryBuilder.enableSuperParametersInLibrary) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments(
+              'super-parameters',
+              libraryBuilder.enableConstructorTearOffsVersionInLibrary
+                  .toText()),
+          superKeyword.charOffset,
+          superKeyword.length);
+    }
+
     int charOffset = popCharOffset();
     Object? name = pop();
     TypeBuilder? type = nullIfParserRecovery(pop()) as TypeBuilder?;
@@ -2155,23 +2247,70 @@
 
   @override
   void beginEnum(Token enumKeyword) {
+    assert(checkState(
+        enumKeyword, [ValueKinds.Integer, ValueKinds.NameOrParserRecovery]));
+    int offset = pop() as int;
+    Object? name = pop();
+    push(name);
+    push(offset);
+
+    String declarationName;
+    if (name is String) {
+      declarationName = name;
+    } else {
+      declarationName = '#enum';
+    }
     pushDeclarationContext(DeclarationContext.Enum);
+    libraryBuilder.beginNestedDeclaration(
+        TypeParameterScopeKind.enumDeclaration, declarationName);
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
-    debugEvent("Enum");
+  void handleEnumElement(Token beginToken) {
+    debugEvent("EnumElements");
+    pop(); // arguments.
+    pop(); // constructor reference.
+    // Keep on the stack the EnumConstantInfo created in handleIdentifier.
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    debugEvent("EnumHeader");
+    push(enumKeyword.charOffset); // start char offset.
+    push(leftBrace.endGroup!.charOffset); // end char offset.
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    debugEvent("EnumElements");
     List<EnumConstantInfo?>? enumConstantInfos =
-        const FixedNullableList<EnumConstantInfo>().pop(stack, count);
+        const FixedNullableList<EnumConstantInfo>().pop(stack, elementsCount);
+    int endCharOffset = popCharOffset();
+    int startCharOffset = popCharOffset();
+    pop() as List<TypeBuilder>?; // interfaces.
+    pop() as List<TypeBuilder>?; // mixins.
+    List<TypeVariableBuilder>? typeVariables =
+        pop() as List<TypeVariableBuilder>?;
     int charOffset = popCharOffset(); // identifier char offset.
-    int startCharOffset = enumKeyword.charOffset;
     Object? name = pop();
     List<MetadataBuilder>? metadata = pop() as List<MetadataBuilder>?;
-    checkEmpty(enumKeyword.charOffset);
+    checkEmpty(startCharOffset);
+
     if (name is! ParserRecovery) {
       libraryBuilder.addEnum(metadata, name as String, enumConstantInfos,
-          startCharOffset, charOffset, leftBrace.endGroup!.charOffset);
+          startCharOffset, charOffset, endCharOffset);
+    } else {
+      libraryBuilder
+          .endNestedDeclaration(
+              TypeParameterScopeKind.enumDeclaration, "<syntax-error>")
+          .resolveNamedTypes(typeVariables, libraryBuilder);
     }
+  }
+
+  @override
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
+    debugEvent("Enum");
+    checkEmpty(enumKeyword.charOffset);
     popDeclarationContext(DeclarationContext.Enum);
   }
 
@@ -2247,7 +2386,7 @@
     List<TypeVariableBuilder>? typeVariables;
     Object? name;
     int charOffset;
-    TypeBuilder? aliasedType;
+    TypeBuilder aliasedType;
     if (equals == null) {
       List<FormalParameterBuilder>? formals =
           pop() as List<FormalParameterBuilder>?;
@@ -2297,6 +2436,14 @@
           // elsewhere.
           addProblem(
               messageTypedefNullableType, equals.charOffset, equals.length);
+          aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
+              new InvalidTypeDeclarationBuilder(
+                  "${name}",
+                  messageTypedefNullableType.withLocation(
+                      uri, equals.charOffset, equals.length)),
+              const NullabilityBuilder.omitted(),
+              instanceTypeVariableAccess:
+                  InstanceTypeVariableAccessState.Allowed);
         } else {
           // TODO(ahe): We need to start a nested declaration when parsing the
           // formals and return type so we can correctly bind
@@ -2310,18 +2457,40 @@
           aliasedType = type;
         } else {
           addProblem(messageTypedefNotType, equals.charOffset, equals.length);
+          aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
+              new InvalidTypeDeclarationBuilder(
+                  "${name}",
+                  messageTypedefNotType.withLocation(
+                      uri, equals.charOffset, equals.length)),
+              const NullabilityBuilder.omitted(),
+              instanceTypeVariableAccess:
+                  InstanceTypeVariableAccessState.Allowed);
         }
       } else {
+        assert(type is! FunctionTypeBuilder);
         // TODO(ahe): Improve this error message.
-        addProblem(messageTypedefNotFunction, equals.charOffset, equals.length);
-        aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
-            new InvalidTypeDeclarationBuilder(
-                "${name}",
-                messageTypedefNotType.withLocation(
-                    uri, equals.charOffset, equals.length)),
-            const NullabilityBuilder.omitted(),
-            instanceTypeVariableAccess:
-                InstanceTypeVariableAccessState.Allowed);
+        if (type is TypeBuilder) {
+          addProblem(
+              messageTypedefNotFunction, equals.charOffset, equals.length);
+          aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
+              new InvalidTypeDeclarationBuilder(
+                  "${name}",
+                  messageTypedefNotFunction.withLocation(
+                      uri, equals.charOffset, equals.length)),
+              const NullabilityBuilder.omitted(),
+              instanceTypeVariableAccess:
+                  InstanceTypeVariableAccessState.Allowed);
+        } else {
+          addProblem(messageTypedefNotType, equals.charOffset, equals.length);
+          aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
+              new InvalidTypeDeclarationBuilder(
+                  "${name}",
+                  messageTypedefNotType.withLocation(
+                      uri, equals.charOffset, equals.length)),
+              const NullabilityBuilder.omitted(),
+              instanceTypeVariableAccess:
+                  InstanceTypeVariableAccessState.Allowed);
+        }
       }
     }
     List<MetadataBuilder>? metadata = pop() as List<MetadataBuilder>?;
@@ -2370,6 +2539,12 @@
           declarationContext = DeclarationContext.ExtensionInstanceField;
         }
         break;
+      case DeclarationKind.Enum:
+        if (staticToken != null) {
+          declarationContext = DeclarationContext.EnumStaticMethod;
+        } else {
+          declarationContext = DeclarationContext.EnumInstanceMethod;
+        }
     }
     pushDeclarationContext(declarationContext);
   }
@@ -2545,6 +2720,15 @@
   void endTypeVariables(Token beginToken, Token endToken) {
     debugEvent("endTypeVariables");
 
+    if (!libraryBuilder.enableEnhancedEnumsInLibrary &&
+        declarationContext == DeclarationContext.Enum) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          beginToken.charOffset,
+          -1);
+    }
+
     // Peek to leave type parameters on top of stack.
     List<TypeVariableBuilder>? typeParameters =
         peek() as List<TypeVariableBuilder>?;
@@ -2638,12 +2822,44 @@
     String? suffix = popIfNotNull(periodBeforeName) as String?;
     List<TypeBuilder>? typeArguments = pop() as List<TypeBuilder>?;
     int charOffset = popCharOffset();
-    Object name = pop()!;
+    Object? name = pop();
     if (name is ParserRecovery) {
       push(name);
-    } else {
+    } else if (name != null) {
       push(libraryBuilder.addConstructorReference(
           name, typeArguments, suffix, charOffset));
+    } else {
+      assert(name == null);
+      // At the moment, the name of the type in a constructor reference can be
+      // omitted only within an enum element declaration.
+      if (libraryBuilder.currentTypeParameterScopeBuilder.kind ==
+          TypeParameterScopeKind.enumDeclaration) {
+        if (libraryBuilder.enableEnhancedEnumsInLibrary) {
+          push(libraryBuilder.addConstructorReference(
+              libraryBuilder.currentTypeParameterScopeBuilder.name,
+              typeArguments,
+              suffix,
+              charOffset));
+        } else {
+          // For entries that consist of their name only, all of the elements
+          // of the constructor reference should be null.
+          if (typeArguments != null || suffix != null) {
+            addProblem(
+                templateExperimentNotEnabled.withArguments(
+                    'enhanced-enums',
+                    libraryBuilder.enableEnhancedEnumsVersionInLibrary
+                        .toText()),
+                charOffset,
+                -1);
+          }
+          push(NullValue.ConstructorReference);
+        }
+      } else {
+        internalProblem(
+            messageInternalProblemOmittedTypeNameInConstructorReference,
+            charOffset,
+            uri);
+      }
     }
   }
 
@@ -2663,6 +2879,9 @@
       case DeclarationKind.Extension:
         declarationContext = DeclarationContext.ExtensionFactory;
         break;
+      case DeclarationKind.Enum:
+        declarationContext = DeclarationContext.EnumFactory;
+        break;
     }
 
     pushDeclarationContext(declarationContext);
@@ -2737,6 +2956,150 @@
   }
 
   @override
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    // TODO(cstefantsova): Call endClassFactoryMethod instead.
+    debugEvent("EnumFactoryMethod");
+    MethodBody bodyKind = pop() as MethodBody;
+    if (bodyKind == MethodBody.RedirectingFactoryBody) {
+      pop(); // reference
+    }
+    pop(); // async marker
+    pop(); // formals
+    popCharOffset(); // formals char offset
+    pop(); // type variables
+    popCharOffset(); // char offset
+    pop(); // name
+    pop(); // modifiers
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    popDeclarationContext();
+    // TODO(cstefantsova): Use actual type parameters.
+    libraryBuilder
+        .endNestedDeclaration(
+            TypeParameterScopeKind.factoryMethod, "#factory_method")
+        .resolveNamedTypes([], libraryBuilder);
+    // Skip the declaration. An error as already been produced by the parser.
+
+    if (libraryBuilder.enableEnhancedEnumsInLibrary) {
+      addProblem(messageEnumDeclaresFactory, beginToken.charOffset, -1);
+    } else {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          beginToken.charOffset,
+          -1);
+    }
+  }
+
+  @override
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    // TODO(cstefantsova): Call endClassMethod instead.
+    debugEvent("EnumMethod");
+    MethodBody bodyKind = pop() as MethodBody;
+    if (bodyKind == MethodBody.RedirectingFactoryBody) {
+      pop(); // reference
+    }
+    pop(); // async marker
+    pop(); // formals
+    popCharOffset(); // formals char offset
+    pop(); // type variables
+    popCharOffset(); // char offset
+    pop(); // name
+    pop(); // return type
+    int modifiers = Modifier.toMask(pop() as List<Modifier>?);
+    popCharOffset(); // final or const offset
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    popDeclarationContext();
+    TypeParameterScopeKind scopeKind;
+    if ((modifiers & staticMask) != 0) {
+      scopeKind = TypeParameterScopeKind.staticMethod;
+    } else {
+      scopeKind = TypeParameterScopeKind.instanceMethod;
+    }
+    // TODO(cstefantsova): Use actual type parameters.
+    libraryBuilder
+        .endNestedDeclaration(scopeKind, "#method")
+        .resolveNamedTypes([], libraryBuilder);
+    // Skip the declaration. An error as already been produced by the parser.
+
+    if (!libraryBuilder.enableEnhancedEnumsInLibrary) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          beginToken.charOffset,
+          -1);
+    }
+  }
+
+  @override
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    // TODO(cstefantsova): Call endClassFields instead.
+    debugEvent("EnumFields");
+    popFieldInfos(count); // field infos
+    pop(); // type
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    popDeclarationContext();
+    // Skip the declaration. An error as already been produced by the parser.
+
+    if (!libraryBuilder.enableEnhancedEnumsInLibrary) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          beginToken.charOffset,
+          -1);
+    }
+  }
+
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    // TODO(cstefantsova): Call endClassConstructor instead.
+    debugEvent("EnumMethod");
+    MethodBody bodyKind = pop() as MethodBody;
+    if (bodyKind == MethodBody.RedirectingFactoryBody) {
+      pop(); // reference
+    }
+    pop(); // async marker
+    pop(); // formals
+    popCharOffset(); // formals char offset
+    pop(); // type variables
+    popCharOffset(); // char offset
+    pop(); // name
+    pop(); // return type
+    pop(); // modifiers
+    popCharOffset(); // final or const offset
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    popDeclarationContext();
+    // TODO(cstefantsova): Use actual type parameters.
+    libraryBuilder
+        .endNestedDeclaration(TypeParameterScopeKind.instanceMethod, "#method")
+        .resolveNamedTypes([], libraryBuilder);
+    // Skip the declaration. An error as already been produced by the parser.
+
+    if (!libraryBuilder.enableEnhancedEnumsInLibrary) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          beginToken.charOffset,
+          -1);
+    }
+  }
+
+  @override
   void endRedirectingFactoryBody(Token beginToken, Token endToken) {
     debugEvent("RedirectingFactoryBody");
     push(MethodBody.RedirectingFactoryBody);
@@ -2826,6 +3189,33 @@
   }
 
   @override
+  void handleEnumWithClause(Token withKeyword) {
+    debugEvent("EnumWithClause");
+
+    if (!libraryBuilder.enableEnhancedEnumsInLibrary) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          withKeyword.charOffset,
+          -1);
+    }
+
+    Object? mixins = pop();
+    if (mixins is ParserRecovery) {
+      push(new ParserRecovery(withKeyword.charOffset));
+    } else {
+      // TODO(cstefantsova): Handle enum mixins here.
+      push(mixins);
+    }
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    debugEvent("EnumNoWithClause");
+    push(NullValue.TypeBuilderList);
+  }
+
+  @override
   void handleClassHeader(Token begin, Token classKeyword, Token? nativeToken) {
     debugEvent("ClassHeader");
     nativeMethodName = null;
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 da6208a..cf7b0ba 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
@@ -318,12 +318,16 @@
   Version? _enableConstructorTearoffsVersionInLibrary;
   Version? _enableExtensionTypesVersionInLibrary;
   Version? _enableNamedArgumentsAnywhereVersionInLibrary;
+  Version? _enableSuperParametersVersionInLibrary;
+  Version? _enableEnhancedEnumsVersionInLibrary;
   bool? _enableTripleShiftInLibrary;
   bool? _enableExtensionMethodsInLibrary;
   bool? _enableGenericMetadataInLibrary;
   bool? _enableExtensionTypesInLibrary;
+  bool? _enableEnhancedEnumsInLibrary;
   bool? _enableConstructorTearOffsInLibrary;
   bool? _enableNamedArgumentsAnywhereInLibrary;
+  bool? _enableSuperParametersInLibrary;
 
   bool get enableConstFunctionsInLibrary => _enableConstFunctionsInLibrary ??=
       loader.target.isExperimentEnabledInLibraryByVersion(
@@ -411,6 +415,28 @@
               ExperimentalFlag.namedArgumentsAnywhere,
               _packageUri ?? importUri);
 
+  bool get enableSuperParametersInLibrary => _enableSuperParametersInLibrary ??=
+      loader.target.isExperimentEnabledInLibraryByVersion(
+          ExperimentalFlag.superParameters,
+          _packageUri ?? importUri,
+          languageVersion.version);
+
+  Version get enableSuperParametersVersionInLibrary =>
+      _enableSuperParametersVersionInLibrary ??= loader.target
+          .getExperimentEnabledVersionInLibrary(
+              ExperimentalFlag.superParameters, _packageUri ?? importUri);
+
+  bool get enableEnhancedEnumsInLibrary => _enableEnhancedEnumsInLibrary ??=
+      loader.target.isExperimentEnabledInLibraryByVersion(
+          ExperimentalFlag.enhancedEnums,
+          _packageUri ?? importUri,
+          languageVersion.version);
+
+  Version get enableEnhancedEnumsVersionInLibrary =>
+      _enableEnhancedEnumsVersionInLibrary ??= loader.target
+          .getExperimentEnabledVersionInLibrary(
+              ExperimentalFlag.enhancedEnums, _packageUri ?? importUri);
+
   void _updateLibraryNNBDSettings() {
     library.isNonNullableByDefault = isNonNullableByDefault;
     switch (loader.nnbdMode) {
@@ -698,7 +724,7 @@
           resolve(this.importUri,
               new Uri(scheme: "dart", path: "core").toString(), -1),
           -1,
-          accessor: loader.first);
+          accessorUri: loader.firstUri);
       imported = coreLibrary.loader
           .lookupLibraryBuilder(new Uri(scheme: 'dart', path: dottedName));
     }
@@ -774,13 +800,7 @@
     if (uri != null) {
       partOfUri = resolve(this.importUri, 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;
-      }
+      loader.read(partOfUri!, uriOffset, fileUri: newFileUri, accessor: this);
     }
   }
 
@@ -2670,6 +2690,11 @@
       referencesFromIndexedClass =
           referencesFromIndexed!.lookupIndexedClass(name);
     }
+    // Nested declaration began in `OutlineBuilder.beginEnum`.
+    // TODO(cstefantsova): Use actual type variables here.
+    TypeParameterScopeBuilder declaration =
+        endNestedDeclaration(TypeParameterScopeKind.enumDeclaration, name)
+          ..resolveNamedTypes([], this);
     EnumBuilder builder = new EnumBuilder(
         metadata,
         name,
@@ -2678,7 +2703,13 @@
         startCharOffset,
         charOffset,
         charEndOffset,
-        referencesFromIndexedClass);
+        referencesFromIndexedClass,
+        new Scope(
+            local: declaration.members!,
+            setters: declaration.setters!,
+            parent: scope.withTypeVariables(<TypeVariableBuilder>[]),
+            debugName: "enum $name",
+            isModifiable: false));
     addBuilder(name, builder, charOffset,
         getterReference: referencesFromIndexedClass?.cls.reference);
   }
@@ -4579,6 +4610,7 @@
   topLevelMethod,
   factoryMethod,
   functionType,
+  enumDeclaration,
 }
 
 /// A builder object preparing for building declarations that can introduce type
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 29c7861..4043a0a4 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -27,6 +27,7 @@
 import 'package:kernel/core_types.dart' show CoreTypes;
 import 'package:kernel/reference_from_index.dart' show ReferenceFromIndex;
 import 'package:kernel/type_environment.dart';
+import 'package:kernel/util/graph.dart';
 import 'package:package_config/package_config.dart' as package_config;
 
 import '../../api_prototype/experimental_flags.dart';
@@ -34,7 +35,9 @@
 import '../../base/common.dart';
 import '../../base/instrumentation.dart' show Instrumentation;
 import '../../base/nnbd_mode.dart';
+import '../dill/dill_class_builder.dart';
 import '../dill/dill_library_builder.dart';
+import '../builder_graph.dart';
 import '../builder/builder.dart';
 import '../builder/class_builder.dart';
 import '../builder/constructor_builder.dart';
@@ -64,6 +67,7 @@
 import '../kernel/kernel_helper.dart'
     show SynthesizedFunctionNode, TypeDependency;
 import '../kernel/kernel_target.dart' show KernelTarget;
+import '../kernel/macro.dart';
 import '../kernel/transform_collections.dart' show CollectionTransformer;
 import '../kernel/transform_set_literals.dart' show SetLiteralTransformer;
 import '../kernel/type_builder_computer.dart' show TypeBuilderComputer;
@@ -193,12 +197,22 @@
 
   /// The first library that we've been asked to compile. When compiling a
   /// program (aka script), this is the library that should have a main method.
-  LibraryBuilder? first;
+  Uri? _firstUri;
+
+  LibraryBuilder? get first => _builders[_firstUri];
+
+  Uri? get firstUri => _firstUri;
+
+  void set firstUri(Uri? value) {
+    _firstUri = value;
+  }
 
   int byteCount = 0;
 
   Uri? currentUriForCrashReporting;
 
+  ClassBuilder? _macroClassBuilder;
+
   SourceLoader(this.fileSystem, this.includeComments, this.target)
       : dataForTesting =
             retainDataForTesting ? new SourceLoaderDataForTesting() : null;
@@ -367,7 +381,7 @@
     // firstSourceUri and first library should be done as early as
     // possible.
     firstSourceUri ??= uri;
-    first ??= libraryBuilder;
+    firstUri ??= libraryBuilder.importUri;
 
     _checkForDartCore(uri, libraryBuilder);
 
@@ -467,6 +481,7 @@
   LibraryBuilder read(Uri uri, int charOffset,
       {Uri? fileUri,
       LibraryBuilder? accessor,
+      Uri? accessorUri,
       LibraryBuilder? origin,
       Library? referencesFrom,
       bool? referenceIsPartOwner}) {
@@ -486,6 +501,7 @@
 
       _builders[uri] = libraryBuilder;
     }
+    accessor ??= _builders[accessorUri];
     if (accessor == null) {
       if (libraryBuilder.loader == this && first != libraryBuilder) {
         unhandled("null", "accessor", charOffset, uri);
@@ -505,11 +521,11 @@
 
   void _ensureCoreLibrary() {
     if (_coreLibrary == null) {
-      read(Uri.parse("dart:core"), 0, accessor: first);
+      read(Uri.parse("dart:core"), 0, accessorUri: firstUri);
       // TODO(askesc): When all backends support set literals, we no longer
       // need to index dart:collection, as it is only needed for desugaring of
       // const sets. We can remove it from this list at that time.
-      read(Uri.parse("dart:collection"), 0, accessor: first);
+      read(Uri.parse("dart:collection"), 0, accessorUri: firstUri);
       assert(_coreLibrary != null);
     }
   }
@@ -828,7 +844,7 @@
     _typeInferenceEngine!.typeDependencies[member] = typeDependency;
   }
 
-  Future<Null> buildOutlines() async {
+  Future<void> buildOutlines() async {
     _ensureCoreLibrary();
     while (_unparsedLibraries.isNotEmpty) {
       LibraryBuilder library = _unparsedLibraries.removeFirst();
@@ -1061,7 +1077,10 @@
     }
     for (Uri uri in parts) {
       if (usedParts.contains(uri)) {
-        _builders.remove(uri);
+        LibraryBuilder? part = _builders.remove(uri);
+        if (_firstUri == uri) {
+          firstUri = part!.partOfLibrary!.importUri;
+        }
       } else {
         SourceLibraryBuilder part =
             lookupLibraryBuilder(uri) as SourceLibraryBuilder;
@@ -1168,6 +1187,191 @@
     ticker.logMs("Resolved $typeCount types");
   }
 
+  void computeMacroDeclarations(List<SourceClassBuilder> sourceClassBuilders) {
+    if (!enableMacros) return;
+
+    LibraryBuilder? macroLibraryBuilder = lookupLibraryBuilder(macroLibraryUri);
+    if (macroLibraryBuilder == null) return;
+
+    Builder? macroClassBuilder =
+        macroLibraryBuilder.lookupLocalMember(macroClassName);
+    if (macroClassBuilder is! ClassBuilder) {
+      // TODO(johnniwinther): Report this when the actual macro builder package
+      // exists. It should at least be a warning.
+      return;
+    }
+
+    _macroClassBuilder = macroClassBuilder;
+    if (retainDataForTesting) {
+      dataForTesting!.macroDeclarationData.macrosAreAvailable = true;
+    }
+
+    Set<ClassBuilder> macroClasses = {macroClassBuilder};
+    Set<Uri> macroLibraries = {macroLibraryBuilder.importUri};
+
+    bool isMacroClass(TypeDeclarationBuilder? typeDeclarationBuilder) {
+      if (typeDeclarationBuilder == null) return false;
+      while (typeDeclarationBuilder is TypeAliasBuilder) {
+        typeDeclarationBuilder =
+            typeDeclarationBuilder.unaliasDeclaration(null);
+      }
+      if (typeDeclarationBuilder is ClassBuilder) {
+        if (macroClasses.contains(typeDeclarationBuilder)) return true;
+        if (typeDeclarationBuilder is DillClassBuilder) {
+          // TODO(johnniwinther): Recognize macro classes from dill.
+        }
+      }
+      return false;
+    }
+
+    for (SourceClassBuilder sourceClassBuilder in sourceClassBuilders) {
+      bool isMacro =
+          isMacroClass(sourceClassBuilder.supertypeBuilder?.declaration);
+      if (!isMacro && sourceClassBuilder.interfaceBuilders != null) {
+        for (TypeBuilder interfaceBuilder
+            in sourceClassBuilder.interfaceBuilders!) {
+          if (isMacroClass(interfaceBuilder.declaration)) {
+            isMacro = true;
+            break;
+          }
+        }
+      }
+      isMacro = isMacro ||
+          isMacroClass(sourceClassBuilder.mixedInTypeBuilder?.declaration);
+      if (isMacro) {
+        macroClasses.add(sourceClassBuilder);
+        macroLibraries.add(sourceClassBuilder.library.importUri);
+        if (retainDataForTesting) {
+          (dataForTesting!.macroDeclarationData.macroDeclarations[
+                  sourceClassBuilder.library.importUri] ??= [])
+              .add(sourceClassBuilder.name);
+        }
+      }
+    }
+
+    bool isDillLibrary(Uri uri) => _builders[uri]?.loader != this;
+
+    List<List<Uri>> computeCompilationSequence(Graph<Uri> libraryGraph,
+        {required bool Function(Uri) filter}) {
+      List<List<Uri>> stronglyConnectedComponents =
+          computeStrongComponents(libraryGraph);
+
+      Graph<List<Uri>> strongGraph =
+          new StrongComponentGraph(libraryGraph, stronglyConnectedComponents);
+      List<List<List<Uri>>> componentLayers =
+          topologicalSort(strongGraph).layers;
+      List<List<Uri>> layeredComponents = [];
+      List<Uri> currentLayer = [];
+      for (List<List<Uri>> layer in componentLayers) {
+        bool declaresMacro = false;
+        for (List<Uri> component in layer) {
+          for (Uri uri in component) {
+            if (filter(uri)) continue;
+            if (macroLibraries.contains(uri)) {
+              declaresMacro = true;
+            }
+            currentLayer.add(uri);
+          }
+        }
+        if (declaresMacro) {
+          layeredComponents.add(currentLayer);
+          currentLayer = [];
+        }
+      }
+      if (currentLayer.isNotEmpty) {
+        layeredComponents.add(currentLayer);
+      }
+      return layeredComponents;
+    }
+
+    List<List<Uri>> compilationSteps = computeCompilationSequence(
+        new BuilderGraph(_builders),
+        filter: isDillLibrary);
+    if (retainDataForTesting) {
+      dataForTesting!.macroDeclarationData.compilationSequence =
+          compilationSteps;
+    }
+  }
+
+  void computeMacroApplications() {
+    if (!enableMacros || _macroClassBuilder == null) return;
+    Class macroClass = _macroClassBuilder!.cls;
+
+    Class? computeApplication(Expression expression) {
+      if (expression is ConstructorInvocation) {
+        Class cls = expression.target.enclosingClass;
+        if (hierarchy.isSubtypeOf(cls, macroClass)) {
+          return cls;
+        }
+      }
+      return null;
+    }
+
+    MacroApplications? computeApplications(List<Expression> annotations) {
+      List<Class> macros = [];
+      for (Expression annotation in annotations) {
+        Class? cls = computeApplication(annotation);
+        if (cls != null) {
+          macros.add(cls);
+        }
+      }
+      return macros.isNotEmpty ? new MacroApplications(macros) : null;
+    }
+
+    for (LibraryBuilder libraryBuilder in libraryBuilders) {
+      if (libraryBuilder.loader != this) continue;
+      LibraryMacroApplicationData libraryMacroApplicationData =
+          new LibraryMacroApplicationData();
+      Library library = libraryBuilder.library;
+      libraryMacroApplicationData.libraryApplications =
+          computeApplications(library.annotations);
+      for (Class cls in library.classes) {
+        ClassMacroApplicationData classMacroApplicationData =
+            new ClassMacroApplicationData();
+        classMacroApplicationData.classApplications =
+            computeApplications(cls.annotations);
+        for (Member member in cls.members) {
+          MacroApplications? macroApplications =
+              computeApplications(member.annotations);
+          if (macroApplications != null) {
+            classMacroApplicationData.memberApplications[member] =
+                macroApplications;
+          }
+        }
+        if (classMacroApplicationData.classApplications != null ||
+            classMacroApplicationData.memberApplications.isNotEmpty) {
+          libraryMacroApplicationData.classData[cls] =
+              classMacroApplicationData;
+        }
+      }
+      for (Member member in library.members) {
+        MacroApplications? macroApplications =
+            computeApplications(member.annotations);
+        if (macroApplications != null) {
+          libraryMacroApplicationData.memberApplications[member] =
+              macroApplications;
+        }
+      }
+      for (Typedef typedef in library.typedefs) {
+        MacroApplications? macroApplications =
+            computeApplications(typedef.annotations);
+        if (macroApplications != null) {
+          libraryMacroApplicationData.typedefApplications[typedef] =
+              macroApplications;
+        }
+      }
+      if (libraryMacroApplicationData.libraryApplications != null ||
+          libraryMacroApplicationData.classData.isNotEmpty ||
+          libraryMacroApplicationData.typedefApplications.isNotEmpty ||
+          libraryMacroApplicationData.memberApplications.isNotEmpty) {
+        if (retainDataForTesting) {
+          dataForTesting!.macroApplicationData.libraryData[library] =
+              libraryMacroApplicationData;
+        }
+      }
+    }
+  }
+
   void finishDeferredLoadTearoffs() {
     int count = 0;
     for (LibraryBuilder library in libraryBuilders) {
@@ -1289,20 +1493,6 @@
   /// 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 libraryBuilders) {
-      if (library.loader == this) {
-        Iterator<Builder> members = library.iterator;
-        while (members.moveNext()) {
-          Builder member = members.current;
-          if (member is SourceClassBuilder) {
-            workList.add(member);
-          }
-        }
-      }
-    }
-
     Set<ClassBuilder> denyListedClasses = new Set<ClassBuilder>();
     for (int i = 0; i < denylistedCoreClasses.length; i++) {
       denyListedClasses.add(coreLibrary.lookupLocalMember(
@@ -1319,42 +1509,16 @@
     }
 
     // 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];
-        Map<TypeDeclarationBuilder?, TypeAliasBuilder?> directSupertypeMap =
-            cls.computeDirectSupertypes(objectClass);
-        List<TypeDeclarationBuilder?> directSupertypes =
-            directSupertypeMap.keys.toList();
-        bool allSupertypesProcessed = true;
-        for (int i = 0; i < directSupertypes.length; i++) {
-          Builder? supertype = directSupertypes[i];
-          if (supertype is SourceClassBuilder &&
-              supertype.library.loader == this &&
-              !topologicallySortedClasses.contains(supertype)) {
-            allSupertypesProcessed = false;
-            break;
-          }
-        }
-        if (allSupertypesProcessed && cls.isPatch) {
-          allSupertypesProcessed =
-              topologicallySortedClasses.contains(cls.origin);
-        }
-        if (allSupertypesProcessed) {
-          topologicallySortedClasses.add(cls);
-          checkClassSupertypes(cls, directSupertypeMap, denyListedClasses);
-        } else {
-          workList.add(cls);
-        }
-      }
-    } while (previousWorkList.length != workList.length);
-    List<SourceClassBuilder> classes = topologicallySortedClasses.toList();
-    List<SourceClassBuilder> classesWithCycles = previousWorkList;
+    _SourceClassGraph classGraph = new _SourceClassGraph(this, objectClass);
+    TopologicalSortResult<SourceClassBuilder> result =
+        topologicalSort(classGraph);
+    List<SourceClassBuilder> classes = result.sortedVertices;
+    for (SourceClassBuilder cls in classes) {
+      checkClassSupertypes(
+          cls, classGraph.directSupertypeMap[cls]!, denyListedClasses);
+    }
+
+    List<SourceClassBuilder> classesWithCycles = result.cyclicVertices;
 
     // Once the work list doesn't change in size, it's either empty, or
     // contains all classes with cycles.
@@ -1970,7 +2134,7 @@
     _typeInferenceEngine = null;
     _builders.clear();
     libraries.clear();
-    first = null;
+    firstUri = null;
     sourceBytes.clear();
     target.releaseAncillaryResources();
     _coreTypes = null;
@@ -2269,4 +2433,49 @@
   TreeNode toOriginal(TreeNode alias) {
     return _aliasMap[alias] ?? alias;
   }
+
+  final MacroDeclarationData macroDeclarationData = new MacroDeclarationData();
+
+  final MacroApplicationData macroApplicationData = new MacroApplicationData();
+}
+
+class _SourceClassGraph implements Graph<SourceClassBuilder> {
+  @override
+  final List<SourceClassBuilder> vertices = [];
+  final ClassBuilder _objectClass;
+  final Map<SourceClassBuilder, Map<TypeDeclarationBuilder?, TypeAliasBuilder?>>
+      directSupertypeMap = {};
+  final Map<SourceClassBuilder, List<SourceClassBuilder>> _supertypeMap = {};
+
+  _SourceClassGraph(SourceLoader loader, this._objectClass) {
+    // Compute the vertices as all classes declared in this loader.
+    for (LibraryBuilder library in loader.libraryBuilders) {
+      if (library.loader == loader) {
+        Iterator<Builder> members = library.iterator;
+        while (members.moveNext()) {
+          Builder member = members.current;
+          if (member is SourceClassBuilder && !member.isPatch) {
+            vertices.add(member);
+          }
+        }
+      }
+    }
+  }
+
+  List<SourceClassBuilder> computeSuperClasses(SourceClassBuilder cls) {
+    Map<TypeDeclarationBuilder?, TypeAliasBuilder?> directSupertypes =
+        directSupertypeMap[cls] = cls.computeDirectSupertypes(_objectClass);
+    List<SourceClassBuilder> superClasses = [];
+    for (TypeDeclarationBuilder? directSupertype in directSupertypes.keys) {
+      if (directSupertype is SourceClassBuilder) {
+        superClasses.add(directSupertype);
+      }
+    }
+    return superClasses;
+  }
+
+  @override
+  Iterable<SourceClassBuilder> neighborsOf(SourceClassBuilder vertex) {
+    return _supertypeMap[vertex] ??= computeSuperClasses(vertex);
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/util/abstracted_ast_nodes.dart b/pkg/front_end/lib/src/fasta/util/abstracted_ast_nodes.dart
new file mode 100644
index 0000000..e731acd
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/util/abstracted_ast_nodes.dart
@@ -0,0 +1,864 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:_fe_analyzer_shared/src/scanner/token.dart';
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart';
+
+enum Coloring { Untouched, Marked }
+
+abstract class AstNode {
+  Map<String, List<AstNode>> scope = {};
+  Container? parent;
+  ParserAstNode get node;
+  Token get startInclusive;
+  Token get endInclusive;
+
+  Coloring marked = Coloring.Untouched;
+
+  StringBuffer toStringInternal(StringBuffer sb, int indent);
+
+  void buildScope();
+  Map<String, AstNode> selfScope();
+
+  List<AstNode>? findInScope(String name) {
+    return scope[name] ?? parent?.findInScope(name);
+  }
+}
+
+abstract class Container extends AstNode {
+  List<AstNode> _children = [];
+  Iterable<AstNode> get children => _children;
+
+  void addChild(AstNode child, Map<ParserAstNode, AstNode> map) {
+    child.parent = this;
+    _children.add(child);
+    map[child.node] = child;
+  }
+}
+
+class TopLevel extends Container {
+  final String sourceText;
+  final Uri uri;
+
+  @override
+  final ParserAstNode node;
+
+  final Map<ParserAstNode, AstNode> map;
+
+  TopLevel(this.sourceText, this.uri, this.node, this.map);
+
+  @override
+  String toString() => toStringInternal(new StringBuffer(), 0).toString();
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    if (_children.isEmpty) {
+      String stringIndent = " " * ((indent + 1) * 2);
+      sb.write(stringIndent);
+      sb.writeln("(empty)");
+    } else {
+      for (AstNode node in _children) {
+        sb.write(stringIndent);
+        node.toStringInternal(sb, indent + 1);
+      }
+    }
+    return sb;
+  }
+
+  @override
+  void buildScope() {
+    for (AstNode child in _children) {
+      child.buildScope();
+      for (MapEntry<String, AstNode> entry in child.selfScope().entries) {
+        (scope[entry.key] ??= []).add(entry.value);
+      }
+    }
+  }
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return const {};
+  }
+
+  @override
+  Token get endInclusive => throw new UnimplementedError();
+
+  @override
+  Token get startInclusive => throw new UnimplementedError();
+}
+
+class Class extends Container {
+  @override
+  final TopLevelDeclarationEnd node;
+  final String name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  Class(this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Class $name");
+    if (_children.isEmpty) {
+      String stringIndent = " " * ((indent + 1) * 2);
+      sb.write(stringIndent);
+      sb.writeln("(empty)");
+    } else {
+      for (AstNode node in _children) {
+        node.toStringInternal(sb, indent + 1);
+      }
+    }
+    return sb;
+  }
+
+  @override
+  void buildScope() {
+    for (AstNode child in _children) {
+      child.buildScope();
+      for (MapEntry<String, AstNode> entry in child.selfScope().entries) {
+        (scope[entry.key] ??= []).add(entry.value);
+      }
+    }
+  }
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return {name: this};
+  }
+}
+
+class Mixin extends Container {
+  @override
+  final TopLevelDeclarationEnd node;
+  final String name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  Mixin(this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Mixin $name");
+    if (_children.isEmpty) {
+      String stringIndent = " " * ((indent + 1) * 2);
+      sb.write(stringIndent);
+      sb.writeln("(empty)");
+    } else {
+      for (AstNode node in _children) {
+        node.toStringInternal(sb, indent + 1);
+      }
+    }
+    return sb;
+  }
+
+  @override
+  void buildScope() {
+    for (AstNode child in _children) {
+      child.buildScope();
+      for (MapEntry<String, AstNode> entry in child.selfScope().entries) {
+        (scope[entry.key] ??= []).add(entry.value);
+      }
+    }
+  }
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return {name: this};
+  }
+}
+
+class Extension extends Container {
+  @override
+  final TopLevelDeclarationEnd node;
+  final String? name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  Extension(this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Extension $name");
+    if (_children.isEmpty) {
+      String stringIndent = " " * ((indent + 1) * 2);
+      sb.write(stringIndent);
+      sb.writeln("(empty)");
+    } else {
+      for (AstNode node in _children) {
+        node.toStringInternal(sb, indent + 1);
+      }
+    }
+    return sb;
+  }
+
+  @override
+  void buildScope() {
+    for (AstNode child in _children) {
+      child.buildScope();
+      for (MapEntry<String, AstNode> entry in child.selfScope().entries) {
+        (scope[entry.key] ??= []).add(entry.value);
+      }
+    }
+  }
+
+  @override
+  Map<String, AstNode> selfScope() {
+    if (name != null) {
+      return {name!: this};
+    } else {
+      return const {};
+    }
+  }
+}
+
+class ClassConstructor extends AstNode {
+  @override
+  final ClassConstructorEnd node;
+  final String name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  ClassConstructor(
+      this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Class constructor $name");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    // TODO: Possibly this should be different...
+    return {name: this};
+  }
+}
+
+class ClassFactoryMethod extends AstNode {
+  @override
+  final ClassFactoryMethodEnd node;
+  final String name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  ClassFactoryMethod(
+      this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Class factory constructor $name");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    // TODO: Possibly this should be different...
+    return {name: this};
+  }
+}
+
+class ClassMethod extends AstNode {
+  @override
+  final ClassMethodEnd node;
+  final String name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  ClassMethod(this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Class method $name");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return {name: this};
+  }
+}
+
+class ExtensionMethod extends AstNode {
+  @override
+  final ExtensionMethodEnd node;
+  final String name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  ExtensionMethod(this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Extension method $name");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return {name: this};
+  }
+}
+
+class MixinMethod extends AstNode {
+  @override
+  final MixinMethodEnd node;
+  final String name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  MixinMethod(this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Mixin method $name");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return {name: this};
+  }
+}
+
+class Enum extends AstNode {
+  @override
+  final EnumEnd node;
+  final String name;
+  final List<String> members;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  Enum(this.node, this.name, this.members, this.startInclusive,
+      this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Enum $name with members $members");
+    return sb;
+  }
+
+  @override
+  void buildScope() {
+    for (String child in members) {
+      scope[child] = [this];
+    }
+  }
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return {name: this};
+  }
+}
+
+class Import extends AstNode {
+  @override
+  final ImportEnd node;
+  final Uri firstUri;
+  final List<Uri>? conditionalUris;
+  final String? asName;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  Import(this.node, this.firstUri, this.conditionalUris, this.asName,
+      this.startInclusive, this.endInclusive);
+
+  List<Uri> get uris => [firstUri, ...?conditionalUris];
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    if (asName == null) {
+      sb.writeln("Import of $uris");
+    } else {
+      sb.writeln("Import of $uris as '$asName'");
+    }
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    if (asName != null) {
+      return {asName!: this};
+    }
+    return const {};
+  }
+}
+
+class Export extends AstNode {
+  @override
+  final ExportEnd node;
+  final Uri firstUri;
+  final List<Uri>? conditionalUris;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  Export(this.node, this.firstUri, this.conditionalUris, this.startInclusive,
+      this.endInclusive);
+
+  List<Uri> get uris => [firstUri, ...?conditionalUris];
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Export of $uris");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return const {};
+  }
+}
+
+class Part extends AstNode {
+  @override
+  final PartEnd node;
+  final Uri uri;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  Part(this.node, this.uri, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Part $uri");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return const {};
+  }
+}
+
+class TopLevelFields extends AstNode {
+  @override
+  final TopLevelFieldsEnd node;
+  final List<String> names;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  TopLevelFields(this.node, this.names, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Top level field(s) ${names.join(", ")}");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    Map<String, AstNode> scope = {};
+    for (String name in names) {
+      scope[name] = this;
+    }
+    return scope;
+  }
+}
+
+class TopLevelMethod extends AstNode {
+  @override
+  final TopLevelMethodEnd node;
+  final String name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  TopLevelMethod(this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Top level method $name");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return {name: this};
+  }
+}
+
+class Typedef extends AstNode {
+  @override
+  final TypedefEnd node;
+  final String name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  Typedef(this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Top level method $name");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return {name: this};
+  }
+}
+
+class ClassFields extends AstNode {
+  @override
+  final ClassFieldsEnd node;
+  final List<String> names;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  ClassFields(this.node, this.names, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Class field(s) ${names.join(", ")}");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    Map<String, AstNode> scope = {};
+    for (String name in names) {
+      scope[name] = this;
+    }
+    return scope;
+  }
+}
+
+class MixinFields extends AstNode {
+  @override
+  final MixinFieldsEnd node;
+  final List<String> names;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  MixinFields(this.node, this.names, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Mixin field(s) ${names.join(", ")}");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    Map<String, AstNode> scope = {};
+    for (String name in names) {
+      scope[name] = this;
+    }
+    return scope;
+  }
+}
+
+class ExtensionFields extends AstNode {
+  @override
+  final ExtensionFieldsEnd node;
+  final List<String> names;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  ExtensionFields(
+      this.node, this.names, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Extension field(s) ${names.join(", ")}");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    Map<String, AstNode> scope = {};
+    for (String name in names) {
+      scope[name] = this;
+    }
+    return scope;
+  }
+}
+
+class Metadata extends AstNode {
+  @override
+  final MetadataEnd node;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  Metadata(this.node, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("metadata");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return const {};
+  }
+}
+
+class LibraryName extends AstNode {
+  @override
+  final LibraryNameEnd node;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  LibraryName(this.node, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("library name");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return const {};
+  }
+}
+
+class PartOf extends AstNode {
+  @override
+  final PartOfEnd node;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+  final Uri partOfUri;
+
+  PartOf(this.node, this.partOfUri, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("part of");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return const {};
+  }
+}
+
+class LanguageVersion extends AstNode {
+  @override
+  final ParserAstNode node;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  LanguageVersion(this.node, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("$startInclusive");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return const {};
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart b/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart
deleted file mode 100644
index 94a1865..0000000
--- a/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart
+++ /dev/null
@@ -1,1292 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. 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' show Uint8List;
-
-import 'dart:io' show File;
-
-import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
-    show ScannerConfiguration;
-
-import 'package:_fe_analyzer_shared/src/parser/parser.dart'
-    show ClassMemberParser, Parser;
-
-import 'package:_fe_analyzer_shared/src/scanner/utf8_bytes_scanner.dart'
-    show Utf8BytesScanner;
-
-import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
-
-import '../source/diet_parser.dart';
-
-import 'direct_parser_ast_helper.dart';
-
-DirectParserASTContentCompilationUnitEnd getAST(List<int> rawBytes,
-    {bool includeBody: true,
-    bool includeComments: false,
-    bool enableExtensionMethods: false,
-    bool enableNonNullable: false,
-    bool enableTripleShift: false}) {
-  Uint8List bytes = new Uint8List(rawBytes.length + 1);
-  bytes.setRange(0, rawBytes.length, rawBytes);
-
-  ScannerConfiguration scannerConfiguration = new ScannerConfiguration(
-      enableExtensionMethods: enableExtensionMethods,
-      enableNonNullable: enableNonNullable,
-      enableTripleShift: enableTripleShift);
-
-  Utf8BytesScanner scanner = new Utf8BytesScanner(
-    bytes,
-    includeComments: includeComments,
-    configuration: scannerConfiguration,
-    languageVersionChanged: (scanner, languageVersion) {
-      // For now don't do anything, but having it (making it non-null) means the
-      // configuration won't be reset.
-    },
-  );
-  Token firstToken = scanner.tokenize();
-  // ignore: unnecessary_null_comparison
-  if (firstToken == null) {
-    throw "firstToken is null";
-  }
-
-  DirectParserASTListener listener = new DirectParserASTListener();
-  Parser parser;
-  if (includeBody) {
-    parser = new Parser(listener,
-        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
-  } else {
-    parser = new ClassMemberParser(listener,
-        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
-  }
-  parser.parseUnit(firstToken);
-  return listener.data.single as DirectParserASTContentCompilationUnitEnd;
-}
-
-/// Best-effort visitor for DirectParserASTContent that visits top-level entries
-/// and class members only (i.e. no bodies, no field initializer content, no
-/// names etc).
-class DirectParserASTContentVisitor {
-  void accept(DirectParserASTContent node) {
-    if (node is DirectParserASTContentCompilationUnitEnd ||
-        node is DirectParserASTContentTopLevelDeclarationEnd ||
-        node is DirectParserASTContentClassOrMixinOrExtensionBodyEnd ||
-        node is DirectParserASTContentMemberEnd) {
-      visitChildren(node);
-      return;
-    }
-
-    if (node.type == DirectParserASTType.BEGIN) {
-      // Ignored. These are basically just dummy nodes anyway.
-      assert(node.children == null);
-      return;
-    }
-    if (node.type == DirectParserASTType.HANDLE) {
-      // Ignored at least for know.
-      assert(node.children == null);
-      return;
-    }
-    if (node is DirectParserASTContentTypeVariablesEnd ||
-        node is DirectParserASTContentTypeArgumentsEnd ||
-        node is DirectParserASTContentTypeListEnd ||
-        node is DirectParserASTContentFunctionTypeEnd ||
-        node is DirectParserASTContentBlockEnd) {
-      // Ignored at least for know.
-      return;
-    }
-    if (node is DirectParserASTContentMetadataStarEnd) {
-      DirectParserASTContentMetadataStarEnd metadata = node;
-      visitMetadataStar(metadata);
-      return;
-    }
-    if (node is DirectParserASTContentTypedefEnd) {
-      DirectParserASTContentTypedefEnd typedefDecl = node;
-      visitTypedef(
-          typedefDecl, typedefDecl.typedefKeyword, typedefDecl.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentClassDeclarationEnd) {
-      DirectParserASTContentClassDeclarationEnd cls = node;
-      visitClass(cls, cls.beginToken, cls.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentTopLevelMethodEnd) {
-      DirectParserASTContentTopLevelMethodEnd method = node;
-      visitTopLevelMethod(method, method.beginToken, method.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentClassMethodEnd) {
-      DirectParserASTContentClassMethodEnd method = node;
-      visitClassMethod(method, method.beginToken, method.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentExtensionMethodEnd) {
-      DirectParserASTContentExtensionMethodEnd method = node;
-      visitExtensionMethod(method, method.beginToken, method.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentMixinMethodEnd) {
-      DirectParserASTContentMixinMethodEnd method = node;
-      visitMixinMethod(method, method.beginToken, method.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentImportEnd) {
-      DirectParserASTContentImportEnd import = node;
-      visitImport(import, import.importKeyword, import.semicolon);
-      return;
-    }
-    if (node is DirectParserASTContentExportEnd) {
-      DirectParserASTContentExportEnd export = node;
-      visitExport(export, export.exportKeyword, export.semicolon);
-      return;
-    }
-    if (node is DirectParserASTContentTopLevelFieldsEnd) {
-      // TODO(jensj): Possibly this could go into more details too
-      // (e.g. to split up a field declaration).
-      DirectParserASTContentTopLevelFieldsEnd fields = node;
-      visitTopLevelFields(fields, fields.beginToken, fields.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentClassFieldsEnd) {
-      // TODO(jensj): Possibly this could go into more details too
-      // (e.g. to split up a field declaration).
-      DirectParserASTContentClassFieldsEnd fields = node;
-      visitClassFields(fields, fields.beginToken, fields.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentExtensionFieldsEnd) {
-      // TODO(jensj): Possibly this could go into more details too
-      // (e.g. to split up a field declaration).
-      DirectParserASTContentExtensionFieldsEnd fields = node;
-      visitExtensionFields(fields, fields.beginToken, fields.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentMixinFieldsEnd) {
-      // TODO(jensj): Possibly this could go into more details too
-      // (e.g. to split up a field declaration).
-      DirectParserASTContentMixinFieldsEnd fields = node;
-      visitMixinFields(fields, fields.beginToken, fields.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentNamedMixinApplicationEnd) {
-      DirectParserASTContentNamedMixinApplicationEnd namedMixin = node;
-      visitNamedMixin(namedMixin, namedMixin.begin, namedMixin.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentMixinDeclarationEnd) {
-      DirectParserASTContentMixinDeclarationEnd declaration = node;
-      visitMixin(declaration, declaration.mixinKeyword, declaration.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentEnumEnd) {
-      DirectParserASTContentEnumEnd declaration = node;
-      visitEnum(declaration, declaration.enumKeyword,
-          declaration.leftBrace.endGroup!);
-      return;
-    }
-    if (node is DirectParserASTContentLibraryNameEnd) {
-      DirectParserASTContentLibraryNameEnd name = node;
-      visitLibraryName(name, name.libraryKeyword, name.semicolon);
-      return;
-    }
-    if (node is DirectParserASTContentPartEnd) {
-      DirectParserASTContentPartEnd part = node;
-      visitPart(part, part.partKeyword, part.semicolon);
-      return;
-    }
-    if (node is DirectParserASTContentPartOfEnd) {
-      DirectParserASTContentPartOfEnd partOf = node;
-      visitPartOf(partOf, partOf.partKeyword, partOf.semicolon);
-      return;
-    }
-    if (node is DirectParserASTContentExtensionDeclarationEnd) {
-      DirectParserASTContentExtensionDeclarationEnd ext = node;
-      visitExtension(ext, ext.extensionKeyword, ext.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentClassConstructorEnd) {
-      DirectParserASTContentClassConstructorEnd decl = node;
-      visitClassConstructor(decl, decl.beginToken, decl.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentExtensionConstructorEnd) {
-      DirectParserASTContentExtensionConstructorEnd decl = node;
-      visitExtensionConstructor(decl, decl.beginToken, decl.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentClassFactoryMethodEnd) {
-      DirectParserASTContentClassFactoryMethodEnd decl = node;
-      visitClassFactoryMethod(decl, decl.beginToken, decl.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentExtensionFactoryMethodEnd) {
-      DirectParserASTContentExtensionFactoryMethodEnd decl = node;
-      visitExtensionFactoryMethod(decl, decl.beginToken, decl.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentMetadataEnd) {
-      DirectParserASTContentMetadataEnd decl = node;
-      // TODO(jensj): endToken is not part of the metadata! It's the first token
-      // of the next thing.
-      visitMetadata(decl, decl.beginToken, decl.endToken.previous!);
-      return;
-    }
-
-    throw "Unknown: $node (${node.runtimeType} @ ${node.what})";
-  }
-
-  void visitChildren(DirectParserASTContent node) {
-    if (node.children == null) return;
-    final int numChildren = node.children!.length;
-    for (int i = 0; i < numChildren; i++) {
-      DirectParserASTContent child = node.children![i];
-      accept(child);
-    }
-  }
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitImport(DirectParserASTContentImportEnd node, Token startInclusive,
-      Token? endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitExport(DirectParserASTContentExportEnd node, Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitTypedef(DirectParserASTContentTypedefEnd node, Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers can call visitChildren on this node.
-  void visitMetadataStar(DirectParserASTContentMetadataStarEnd node) {
-    visitChildren(node);
-  }
-
-  /// Note: Implementers can call visitChildren on this node.
-  void visitClass(DirectParserASTContentClassDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
-    visitChildren(node);
-  }
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitTopLevelMethod(DirectParserASTContentTopLevelMethodEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitClassMethod(DirectParserASTContentClassMethodEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitExtensionMethod(DirectParserASTContentExtensionMethodEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitMixinMethod(DirectParserASTContentMixinMethodEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitTopLevelFields(DirectParserASTContentTopLevelFieldsEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitClassFields(DirectParserASTContentClassFieldsEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitExtensionFields(DirectParserASTContentExtensionFieldsEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitMixinFields(DirectParserASTContentMixinFieldsEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers can call visitChildren on this node.
-  void visitNamedMixin(DirectParserASTContentNamedMixinApplicationEnd node,
-      Token startInclusive, Token endInclusive) {
-    visitChildren(node);
-  }
-
-  /// Note: Implementers can call visitChildren on this node.
-  void visitMixin(DirectParserASTContentMixinDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
-    visitChildren(node);
-  }
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitEnum(DirectParserASTContentEnumEnd node, Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitLibraryName(DirectParserASTContentLibraryNameEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitPart(DirectParserASTContentPartEnd node, Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitPartOf(DirectParserASTContentPartOfEnd node, Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers can call visitChildren on this node.
-  void visitExtension(DirectParserASTContentExtensionDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
-    visitChildren(node);
-  }
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitClassConstructor(DirectParserASTContentClassConstructorEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitExtensionConstructor(
-      DirectParserASTContentExtensionConstructorEnd node,
-      Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitClassFactoryMethod(DirectParserASTContentClassFactoryMethodEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitExtensionFactoryMethod(
-      DirectParserASTContentExtensionFactoryMethodEnd node,
-      Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitMetadata(DirectParserASTContentMetadataEnd node,
-      Token startInclusive, Token endInclusive) {}
-}
-
-extension GeneralASTContentExtension on DirectParserASTContent {
-  bool isClass() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        // ignore: lines_longer_than_80_chars
-        is! DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentClassDeclarationEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentClassDeclarationEnd asClass() {
-    if (!isClass()) throw "Not class";
-    return children!.last as DirectParserASTContentClassDeclarationEnd;
-  }
-
-  bool isImport() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentImportEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentImportEnd asImport() {
-    if (!isImport()) throw "Not import";
-    return children!.last as DirectParserASTContentImportEnd;
-  }
-
-  bool isExport() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentExportEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentExportEnd asExport() {
-    if (!isExport()) throw "Not export";
-    return children!.last as DirectParserASTContentExportEnd;
-  }
-
-  bool isEnum() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentEnumEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentEnumEnd asEnum() {
-    if (!isEnum()) throw "Not enum";
-    return children!.last as DirectParserASTContentEnumEnd;
-  }
-
-  bool isTypedef() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentTypedefEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentTypedefEnd asTypedef() {
-    if (!isTypedef()) throw "Not typedef";
-    return children!.last as DirectParserASTContentTypedefEnd;
-  }
-
-  bool isScript() {
-    if (this is! DirectParserASTContentScriptHandle) {
-      return false;
-    }
-    return true;
-  }
-
-  DirectParserASTContentScriptHandle asScript() {
-    if (!isScript()) throw "Not script";
-    return this as DirectParserASTContentScriptHandle;
-  }
-
-  bool isExtension() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentExtensionDeclarationPreludeBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentExtensionDeclarationEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentExtensionDeclarationEnd asExtension() {
-    if (!isExtension()) throw "Not extension";
-    return children!.last as DirectParserASTContentExtensionDeclarationEnd;
-  }
-
-  bool isInvalidTopLevelDeclaration() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first is! DirectParserASTContentTopLevelMemberBegin) {
-      return false;
-    }
-    if (children!.last
-        is! DirectParserASTContentInvalidTopLevelDeclarationHandle) {
-      return false;
-    }
-
-    return true;
-  }
-
-  bool isRecoverableError() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentRecoverableErrorHandle) {
-      return false;
-    }
-
-    return true;
-  }
-
-  bool isRecoverImport() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentRecoverImportHandle) {
-      return false;
-    }
-
-    return true;
-  }
-
-  bool isMixinDeclaration() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        // ignore: lines_longer_than_80_chars
-        is! DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentMixinDeclarationEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentMixinDeclarationEnd asMixinDeclaration() {
-    if (!isMixinDeclaration()) throw "Not mixin declaration";
-    return children!.last as DirectParserASTContentMixinDeclarationEnd;
-  }
-
-  bool isNamedMixinDeclaration() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        // ignore: lines_longer_than_80_chars
-        is! DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentNamedMixinApplicationEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentNamedMixinApplicationEnd asNamedMixinDeclaration() {
-    if (!isNamedMixinDeclaration()) throw "Not named mixin declaration";
-    return children!.last as DirectParserASTContentNamedMixinApplicationEnd;
-  }
-
-  bool isTopLevelMethod() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first is! DirectParserASTContentTopLevelMemberBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentTopLevelMethodEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentTopLevelMethodEnd asTopLevelMethod() {
-    if (!isTopLevelMethod()) throw "Not top level method";
-    return children!.last as DirectParserASTContentTopLevelMethodEnd;
-  }
-
-  bool isTopLevelFields() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first is! DirectParserASTContentTopLevelMemberBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentTopLevelFieldsEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentTopLevelFieldsEnd asTopLevelFields() {
-    if (!isTopLevelFields()) throw "Not top level fields";
-    return children!.last as DirectParserASTContentTopLevelFieldsEnd;
-  }
-
-  bool isLibraryName() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentLibraryNameEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentLibraryNameEnd asLibraryName() {
-    if (!isLibraryName()) throw "Not library name";
-    return children!.last as DirectParserASTContentLibraryNameEnd;
-  }
-
-  bool isPart() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentPartEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentPartEnd asPart() {
-    if (!isPart()) throw "Not part";
-    return children!.last as DirectParserASTContentPartEnd;
-  }
-
-  bool isPartOf() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentPartOfEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentPartOfEnd asPartOf() {
-    if (!isPartOf()) throw "Not part of";
-    return children!.last as DirectParserASTContentPartOfEnd;
-  }
-
-  bool isMetadata() {
-    if (this is! DirectParserASTContentMetadataStarEnd) {
-      return false;
-    }
-    if (children!.first is! DirectParserASTContentMetadataStarBegin) {
-      return false;
-    }
-    return true;
-  }
-
-  DirectParserASTContentMetadataStarEnd asMetadata() {
-    if (!isMetadata()) throw "Not metadata";
-    return this as DirectParserASTContentMetadataStarEnd;
-  }
-
-  bool isFunctionBody() {
-    if (this is DirectParserASTContentBlockFunctionBodyEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentBlockFunctionBodyEnd asFunctionBody() {
-    if (!isFunctionBody()) throw "Not function body";
-    return this as DirectParserASTContentBlockFunctionBodyEnd;
-  }
-
-  List<E> recursivelyFind<E extends DirectParserASTContent>() {
-    Set<E> result = {};
-    _recursivelyFindInternal(this, result);
-    return result.toList();
-  }
-
-  static void _recursivelyFindInternal<E extends DirectParserASTContent>(
-      DirectParserASTContent node, Set<E> result) {
-    if (node is E) {
-      result.add(node);
-      return;
-    }
-    if (node.children == null) return;
-    for (DirectParserASTContent child in node.children!) {
-      _recursivelyFindInternal(child, result);
-    }
-  }
-
-  void debugDumpNodeRecursively({String indent = ""}) {
-    print("$indent${runtimeType} (${what}) "
-        "(${deprecatedArguments})");
-    if (children == null) return;
-    for (DirectParserASTContent child in children!) {
-      child.debugDumpNodeRecursively(indent: "  $indent");
-    }
-  }
-}
-
-extension MetadataStarExtension on DirectParserASTContentMetadataStarEnd {
-  List<DirectParserASTContentMetadataEnd> getMetadataEntries() {
-    List<DirectParserASTContentMetadataEnd> result = [];
-    for (DirectParserASTContent topLevel in children!) {
-      if (topLevel is! DirectParserASTContentMetadataEnd) continue;
-      result.add(topLevel);
-    }
-    return result;
-  }
-}
-
-extension CompilationUnitExtension on DirectParserASTContentCompilationUnitEnd {
-  List<DirectParserASTContentTopLevelDeclarationEnd> getClasses() {
-    List<DirectParserASTContentTopLevelDeclarationEnd> result = [];
-    for (DirectParserASTContent topLevel in children!) {
-      if (!topLevel.isClass()) continue;
-      result.add(topLevel as DirectParserASTContentTopLevelDeclarationEnd);
-    }
-    return result;
-  }
-
-  List<DirectParserASTContentTopLevelDeclarationEnd> getMixinDeclarations() {
-    List<DirectParserASTContentTopLevelDeclarationEnd> result = [];
-    for (DirectParserASTContent topLevel in children!) {
-      if (!topLevel.isMixinDeclaration()) continue;
-      result.add(topLevel as DirectParserASTContentTopLevelDeclarationEnd);
-    }
-    return result;
-  }
-
-  List<DirectParserASTContentImportEnd> getImports() {
-    List<DirectParserASTContentImportEnd> result = [];
-    for (DirectParserASTContent topLevel in children!) {
-      if (!topLevel.isImport()) continue;
-      result.add(topLevel.children!.last as DirectParserASTContentImportEnd);
-    }
-    return result;
-  }
-
-  List<DirectParserASTContentExportEnd> getExports() {
-    List<DirectParserASTContentExportEnd> result = [];
-    for (DirectParserASTContent topLevel in children!) {
-      if (!topLevel.isExport()) continue;
-      result.add(topLevel.children!.last as DirectParserASTContentExportEnd);
-    }
-    return result;
-  }
-
-  // List<DirectParserASTContentMetadataStarEnd> getMetadata() {
-  //   List<DirectParserASTContentMetadataStarEnd> result = [];
-  //   for (DirectParserASTContent topLevel in children) {
-  //     if (!topLevel.isMetadata()) continue;
-  //     result.add(topLevel);
-  //   }
-  //   return result;
-  // }
-
-  // List<DirectParserASTContentEnumEnd> getEnums() {
-  //   List<DirectParserASTContentEnumEnd> result = [];
-  //   for (DirectParserASTContent topLevel in children) {
-  //     if (!topLevel.isEnum()) continue;
-  //     result.add(topLevel.children.last);
-  //   }
-  //   return result;
-  // }
-
-  // List<DirectParserASTContentFunctionTypeAliasEnd> getTypedefs() {
-  //   List<DirectParserASTContentFunctionTypeAliasEnd> result = [];
-  //   for (DirectParserASTContent topLevel in children) {
-  //     if (!topLevel.isTypedef()) continue;
-  //     result.add(topLevel.children.last);
-  //   }
-  //   return result;
-  // }
-
-  // List<DirectParserASTContentMixinDeclarationEnd> getMixinDeclarations() {
-  //   List<DirectParserASTContentMixinDeclarationEnd> result = [];
-  //   for (DirectParserASTContent topLevel in children) {
-  //     if (!topLevel.isMixinDeclaration()) continue;
-  //     result.add(topLevel.children.last);
-  //   }
-  //   return result;
-  // }
-
-  // List<DirectParserASTContentTopLevelMethodEnd> getTopLevelMethods() {
-  //   List<DirectParserASTContentTopLevelMethodEnd> result = [];
-  //   for (DirectParserASTContent topLevel in children) {
-  //     if (!topLevel.isTopLevelMethod()) continue;
-  //     result.add(topLevel.children.last);
-  //   }
-  //   return result;
-  // }
-
-  DirectParserASTContentCompilationUnitBegin getBegin() {
-    return children!.first as DirectParserASTContentCompilationUnitBegin;
-  }
-}
-
-extension TopLevelDeclarationExtension
-    on DirectParserASTContentTopLevelDeclarationEnd {
-  DirectParserASTContentIdentifierHandle getIdentifier() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentIdentifierHandle) return child;
-    }
-    throw "Not found.";
-  }
-
-  DirectParserASTContentClassDeclarationEnd getClassDeclaration() {
-    if (!isClass()) {
-      throw "Not a class";
-    }
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentClassDeclarationEnd) {
-        return child;
-      }
-    }
-    throw "Not found.";
-  }
-}
-
-extension MixinDeclarationExtension
-    on DirectParserASTContentMixinDeclarationEnd {
-  DirectParserASTContentClassOrMixinOrExtensionBodyEnd
-      getClassOrMixinOrExtensionBody() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentClassOrMixinOrExtensionBodyEnd) {
-        return child;
-      }
-    }
-    throw "Not found.";
-  }
-}
-
-extension ClassDeclarationExtension
-    on DirectParserASTContentClassDeclarationEnd {
-  DirectParserASTContentClassOrMixinOrExtensionBodyEnd
-      getClassOrMixinOrExtensionBody() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentClassOrMixinOrExtensionBodyEnd) {
-        return child;
-      }
-    }
-    throw "Not found.";
-  }
-
-  DirectParserASTContentClassExtendsHandle getClassExtends() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentClassExtendsHandle) return child;
-    }
-    throw "Not found.";
-  }
-
-  DirectParserASTContentClassOrMixinImplementsHandle getClassImplements() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentClassOrMixinImplementsHandle) {
-        return child;
-      }
-    }
-    throw "Not found.";
-  }
-
-  DirectParserASTContentClassWithClauseHandle? getClassWithClause() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentClassWithClauseHandle) {
-        return child;
-      }
-    }
-    return null;
-  }
-}
-
-extension ClassOrMixinBodyExtension
-    on DirectParserASTContentClassOrMixinOrExtensionBodyEnd {
-  List<DirectParserASTContentMemberEnd> getMembers() {
-    List<DirectParserASTContentMemberEnd> members = [];
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentMemberEnd) {
-        members.add(child);
-      }
-    }
-    return members;
-  }
-}
-
-extension MemberExtension on DirectParserASTContentMemberEnd {
-  bool isClassConstructor() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassConstructorEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentClassConstructorEnd getClassConstructor() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassConstructorEnd) return child;
-    throw "Not found";
-  }
-
-  bool isClassFactoryMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassFactoryMethodEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentClassFactoryMethodEnd getClassFactoryMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassFactoryMethodEnd) return child;
-    throw "Not found";
-  }
-
-  bool isClassFields() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassFieldsEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentClassFieldsEnd getClassFields() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassFieldsEnd) return child;
-    throw "Not found";
-  }
-
-  bool isMixinFields() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinFieldsEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentMixinFieldsEnd getMixinFields() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinFieldsEnd) return child;
-    throw "Not found";
-  }
-
-  bool isMixinMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinMethodEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentMixinMethodEnd getMixinMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinMethodEnd) return child;
-    throw "Not found";
-  }
-
-  bool isMixinFactoryMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinFactoryMethodEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentMixinFactoryMethodEnd getMixinFactoryMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinFactoryMethodEnd) return child;
-    throw "Not found";
-  }
-
-  bool isMixinConstructor() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinConstructorEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentMixinConstructorEnd getMixinConstructor() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinConstructorEnd) return child;
-    throw "Not found";
-  }
-
-  bool isClassMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassMethodEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentClassMethodEnd getClassMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassMethodEnd) return child;
-    throw "Not found";
-  }
-
-  bool isClassRecoverableError() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentRecoverableErrorHandle) return true;
-    return false;
-  }
-}
-
-extension ClassFieldsExtension on DirectParserASTContentClassFieldsEnd {
-  List<DirectParserASTContentIdentifierHandle?> getFieldIdentifiers() {
-    // For now blindly assume that the last count identifiers are the names
-    // of the fields.
-    int countLeft = count;
-    List<DirectParserASTContentIdentifierHandle>? identifiers;
-    for (int i = children!.length - 1; i >= 0; i--) {
-      DirectParserASTContent child = children![i];
-      if (child is DirectParserASTContentIdentifierHandle) {
-        countLeft--;
-        if (identifiers == null) {
-          identifiers = new List<DirectParserASTContentIdentifierHandle>.filled(
-              count, child);
-        } else {
-          identifiers[countLeft] = child;
-        }
-        if (countLeft == 0) break;
-      }
-    }
-    if (countLeft != 0) throw "Didn't find the expected number of identifiers";
-    return identifiers ?? [];
-  }
-
-  DirectParserASTContentTypeHandle? getFirstType() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentTypeHandle) return child;
-    }
-    return null;
-  }
-
-  DirectParserASTContentFieldInitializerEnd? getFieldInitializer() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentFieldInitializerEnd) return child;
-    }
-    return null;
-  }
-}
-
-extension ClassMethodExtension on DirectParserASTContentClassMethodEnd {
-  DirectParserASTContentBlockFunctionBodyEnd? getBlockFunctionBody() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentBlockFunctionBodyEnd) {
-        return child;
-      }
-    }
-    return null;
-  }
-}
-
-extension ClassConstructorExtension
-    on DirectParserASTContentClassConstructorEnd {
-  DirectParserASTContentFormalParametersEnd getFormalParameters() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentFormalParametersEnd) {
-        return child;
-      }
-    }
-    throw "Not found";
-  }
-
-  DirectParserASTContentInitializersEnd? getInitializers() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentInitializersEnd) {
-        return child;
-      }
-    }
-    return null;
-  }
-
-  DirectParserASTContentBlockFunctionBodyEnd? getBlockFunctionBody() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentBlockFunctionBodyEnd) {
-        return child;
-      }
-    }
-    return null;
-  }
-}
-
-extension FormalParametersExtension
-    on DirectParserASTContentFormalParametersEnd {
-  List<DirectParserASTContentFormalParameterEnd> getFormalParameters() {
-    List<DirectParserASTContentFormalParameterEnd> result = [];
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentFormalParameterEnd) {
-        result.add(child);
-      }
-    }
-    return result;
-  }
-
-  DirectParserASTContentOptionalFormalParametersEnd?
-      getOptionalFormalParameters() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentOptionalFormalParametersEnd) {
-        return child;
-      }
-    }
-    return null;
-  }
-}
-
-extension FormalParameterExtension on DirectParserASTContentFormalParameterEnd {
-  DirectParserASTContentFormalParameterBegin getBegin() {
-    return children!.first as DirectParserASTContentFormalParameterBegin;
-  }
-}
-
-extension OptionalFormalParametersExtension
-    on DirectParserASTContentOptionalFormalParametersEnd {
-  List<DirectParserASTContentFormalParameterEnd> getFormalParameters() {
-    List<DirectParserASTContentFormalParameterEnd> result = [];
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentFormalParameterEnd) {
-        result.add(child);
-      }
-    }
-    return result;
-  }
-}
-
-extension InitializersExtension on DirectParserASTContentInitializersEnd {
-  List<DirectParserASTContentInitializerEnd> getInitializers() {
-    List<DirectParserASTContentInitializerEnd> result = [];
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentInitializerEnd) {
-        result.add(child);
-      }
-    }
-    return result;
-  }
-
-  DirectParserASTContentInitializersBegin getBegin() {
-    return children!.first as DirectParserASTContentInitializersBegin;
-  }
-}
-
-extension InitializerExtension on DirectParserASTContentInitializerEnd {
-  DirectParserASTContentInitializerBegin getBegin() {
-    return children!.first as DirectParserASTContentInitializerBegin;
-  }
-}
-
-void main(List<String> args) {
-  File f = new File(args[0]);
-  Uint8List data = f.readAsBytesSync();
-  DirectParserASTContent ast = getAST(data);
-  if (args.length > 1 && args[1] == "--benchmark") {
-    Stopwatch stopwatch = new Stopwatch()..start();
-    int numRuns = 100;
-    for (int i = 0; i < numRuns; i++) {
-      DirectParserASTContent ast2 = getAST(data);
-      if (ast.what != ast2.what) {
-        throw "Not the same result every time";
-      }
-    }
-    stopwatch.stop();
-    print("First $numRuns took ${stopwatch.elapsedMilliseconds} ms "
-        "(i.e. ${stopwatch.elapsedMilliseconds / numRuns}ms/iteration)");
-    stopwatch = new Stopwatch()..start();
-    numRuns = 2500;
-    for (int i = 0; i < numRuns; i++) {
-      DirectParserASTContent ast2 = getAST(data);
-      if (ast.what != ast2.what) {
-        throw "Not the same result every time";
-      }
-    }
-    stopwatch.stop();
-    print("Next $numRuns took ${stopwatch.elapsedMilliseconds} ms "
-        "(i.e. ${stopwatch.elapsedMilliseconds / numRuns}ms/iteration)");
-  } else {
-    print(ast);
-  }
-}
-
-class DirectParserASTListener extends AbstractDirectParserASTListener {
-  @override
-  void seen(DirectParserASTContent entry) {
-    switch (entry.type) {
-      case DirectParserASTType.BEGIN:
-      case DirectParserASTType.HANDLE:
-        // This just adds stuff.
-        data.add(entry);
-        break;
-      case DirectParserASTType.END:
-        // End should gobble up everything until the corresponding begin (which
-        // should be the latest begin).
-        int? beginIndex;
-        for (int i = data.length - 1; i >= 0; i--) {
-          if (data[i].type == DirectParserASTType.BEGIN) {
-            beginIndex = i;
-            break;
-          }
-        }
-        if (beginIndex == null) {
-          throw "Couldn't find a begin for ${entry.what}. Has:\n"
-              "${data.map((e) => "${e.what}: ${e.type}").join("\n")}";
-        }
-        String begin = data[beginIndex].what;
-        String end = entry.what;
-        if (begin == end) {
-          // Exact match.
-        } else if (end == "TopLevelDeclaration" &&
-            (begin == "ExtensionDeclarationPrelude" ||
-                begin == "ClassOrMixinOrNamedMixinApplicationPrelude" ||
-                begin == "TopLevelMember" ||
-                begin == "UncategorizedTopLevelDeclaration")) {
-          // endTopLevelDeclaration is started by one of
-          // beginExtensionDeclarationPrelude,
-          // beginClassOrNamedMixinApplicationPrelude
-          // beginTopLevelMember or beginUncategorizedTopLevelDeclaration.
-        } else if (begin == "Method" &&
-            (end == "ClassConstructor" ||
-                end == "ClassMethod" ||
-                end == "ExtensionConstructor" ||
-                end == "ExtensionMethod" ||
-                end == "MixinConstructor" ||
-                end == "MixinMethod")) {
-          // beginMethod is ended by one of endClassConstructor, endClassMethod,
-          // endExtensionMethod, endMixinConstructor or endMixinMethod.
-        } else if (begin == "Fields" &&
-            (end == "TopLevelFields" ||
-                end == "ClassFields" ||
-                end == "MixinFields" ||
-                end == "ExtensionFields")) {
-          // beginFields is ended by one of endTopLevelFields, endMixinFields or
-          // endExtensionFields.
-        } else if (begin == "ForStatement" && end == "ForIn") {
-          // beginForStatement is ended by either endForStatement or endForIn.
-        } else if (begin == "FactoryMethod" &&
-            (end == "ClassFactoryMethod" ||
-                end == "MixinFactoryMethod" ||
-                end == "ExtensionFactoryMethod")) {
-          // beginFactoryMethod is ended by either endClassFactoryMethod,
-          // endMixinFactoryMethod or endExtensionFactoryMethod.
-        } else if (begin == "ForControlFlow" && (end == "ForInControlFlow")) {
-          // beginForControlFlow is ended by either endForControlFlow or
-          // endForInControlFlow.
-        } else if (begin == "IfControlFlow" && (end == "IfElseControlFlow")) {
-          // beginIfControlFlow is ended by either endIfControlFlow or
-          // endIfElseControlFlow.
-        } else if (begin == "AwaitExpression" &&
-            (end == "InvalidAwaitExpression")) {
-          // beginAwaitExpression is ended by either endAwaitExpression or
-          // endInvalidAwaitExpression.
-        } else if (begin == "YieldStatement" &&
-            (end == "InvalidYieldStatement")) {
-          // beginYieldStatement is ended by either endYieldStatement or
-          // endInvalidYieldStatement.
-        } else {
-          throw "Unknown combination: begin$begin and end$end";
-        }
-        List<DirectParserASTContent> children = data.sublist(beginIndex);
-        data.length = beginIndex;
-        data.add(entry..children = children);
-        break;
-    }
-  }
-
-  @override
-  void reportVarianceModifierNotEnabled(Token? variance) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  Uri get uri => throw new UnimplementedError();
-
-  @override
-  void logEvent(String name) {
-    throw new UnimplementedError();
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart b/pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart
deleted file mode 100644
index 4fedb0b..0000000
--- a/pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart
+++ /dev/null
@@ -1,7636 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:_fe_analyzer_shared/src/parser/assert.dart';
-import 'package:_fe_analyzer_shared/src/parser/block_kind.dart';
-import 'package:_fe_analyzer_shared/src/parser/constructor_reference_context.dart';
-import 'package:_fe_analyzer_shared/src/parser/declaration_kind.dart';
-import 'package:_fe_analyzer_shared/src/parser/formal_parameter_kind.dart';
-import 'package:_fe_analyzer_shared/src/parser/identifier_context.dart';
-import 'package:_fe_analyzer_shared/src/parser/listener.dart';
-import 'package:_fe_analyzer_shared/src/parser/member_kind.dart';
-import 'package:_fe_analyzer_shared/src/scanner/error_token.dart';
-import 'package:_fe_analyzer_shared/src/scanner/token.dart';
-import 'package:front_end/src/fasta/messages.dart';
-
-// ignore_for_file: lines_longer_than_80_chars
-
-// THIS FILE IS AUTO GENERATED BY
-// 'tool/_fasta/direct_parser_ast_helper_creator.dart'
-// Run this command to update it:
-// 'dart pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart'
-
-abstract class DirectParserASTContent {
-  final String what;
-  final DirectParserASTType type;
-  Map<String, Object?> get deprecatedArguments;
-  List<DirectParserASTContent>? children;
-
-  DirectParserASTContent(this.what, this.type);
-
-  // TODO(jensj): Compare two ASTs.
-}
-
-enum DirectParserASTType { BEGIN, END, HANDLE }
-
-abstract class AbstractDirectParserASTListener implements Listener {
-  List<DirectParserASTContent> data = [];
-
-  void seen(DirectParserASTContent entry);
-
-  @override
-  void beginArguments(Token token) {
-    DirectParserASTContentArgumentsBegin data =
-        new DirectParserASTContentArgumentsBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endArguments(int count, Token beginToken, Token endToken) {
-    DirectParserASTContentArgumentsEnd data =
-        new DirectParserASTContentArgumentsEnd(DirectParserASTType.END,
-            count: count, beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleAsyncModifier(Token? asyncToken, Token? starToken) {
-    DirectParserASTContentAsyncModifierHandle data =
-        new DirectParserASTContentAsyncModifierHandle(
-            DirectParserASTType.HANDLE,
-            asyncToken: asyncToken,
-            starToken: starToken);
-    seen(data);
-  }
-
-  @override
-  void beginAwaitExpression(Token token) {
-    DirectParserASTContentAwaitExpressionBegin data =
-        new DirectParserASTContentAwaitExpressionBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endAwaitExpression(Token beginToken, Token endToken) {
-    DirectParserASTContentAwaitExpressionEnd data =
-        new DirectParserASTContentAwaitExpressionEnd(DirectParserASTType.END,
-            beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endInvalidAwaitExpression(
-      Token beginToken, Token endToken, MessageCode errorCode) {
-    DirectParserASTContentInvalidAwaitExpressionEnd data =
-        new DirectParserASTContentInvalidAwaitExpressionEnd(
-            DirectParserASTType.END,
-            beginToken: beginToken,
-            endToken: endToken,
-            errorCode: errorCode);
-    seen(data);
-  }
-
-  @override
-  void beginBlock(Token token, BlockKind blockKind) {
-    DirectParserASTContentBlockBegin data =
-        new DirectParserASTContentBlockBegin(DirectParserASTType.BEGIN,
-            token: token, blockKind: blockKind);
-    seen(data);
-  }
-
-  @override
-  void endBlock(
-      int count, Token beginToken, Token endToken, BlockKind blockKind) {
-    DirectParserASTContentBlockEnd data = new DirectParserASTContentBlockEnd(
-        DirectParserASTType.END,
-        count: count,
-        beginToken: beginToken,
-        endToken: endToken,
-        blockKind: blockKind);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidTopLevelBlock(Token token) {
-    DirectParserASTContentInvalidTopLevelBlockHandle data =
-        new DirectParserASTContentInvalidTopLevelBlockHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginCascade(Token token) {
-    DirectParserASTContentCascadeBegin data =
-        new DirectParserASTContentCascadeBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endCascade() {
-    DirectParserASTContentCascadeEnd data =
-        new DirectParserASTContentCascadeEnd(DirectParserASTType.END);
-    seen(data);
-  }
-
-  @override
-  void beginCaseExpression(Token caseKeyword) {
-    DirectParserASTContentCaseExpressionBegin data =
-        new DirectParserASTContentCaseExpressionBegin(DirectParserASTType.BEGIN,
-            caseKeyword: caseKeyword);
-    seen(data);
-  }
-
-  @override
-  void endCaseExpression(Token colon) {
-    DirectParserASTContentCaseExpressionEnd data =
-        new DirectParserASTContentCaseExpressionEnd(DirectParserASTType.END,
-            colon: colon);
-    seen(data);
-  }
-
-  @override
-  void beginClassOrMixinOrExtensionBody(DeclarationKind kind, Token token) {
-    DirectParserASTContentClassOrMixinOrExtensionBodyBegin data =
-        new DirectParserASTContentClassOrMixinOrExtensionBodyBegin(
-            DirectParserASTType.BEGIN,
-            kind: kind,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endClassOrMixinOrExtensionBody(
-      DeclarationKind kind, int memberCount, Token beginToken, Token endToken) {
-    DirectParserASTContentClassOrMixinOrExtensionBodyEnd data =
-        new DirectParserASTContentClassOrMixinOrExtensionBodyEnd(
-            DirectParserASTType.END,
-            kind: kind,
-            memberCount: memberCount,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginClassOrMixinOrNamedMixinApplicationPrelude(Token token) {
-    DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin data =
-        new DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginClassDeclaration(Token begin, Token? abstractToken, Token name) {
-    DirectParserASTContentClassDeclarationBegin data =
-        new DirectParserASTContentClassDeclarationBegin(
-            DirectParserASTType.BEGIN,
-            begin: begin,
-            abstractToken: abstractToken,
-            name: name);
-    seen(data);
-  }
-
-  @override
-  void handleClassExtends(Token? extendsKeyword, int typeCount) {
-    DirectParserASTContentClassExtendsHandle data =
-        new DirectParserASTContentClassExtendsHandle(DirectParserASTType.HANDLE,
-            extendsKeyword: extendsKeyword, typeCount: typeCount);
-    seen(data);
-  }
-
-  @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    DirectParserASTContentClassOrMixinImplementsHandle data =
-        new DirectParserASTContentClassOrMixinImplementsHandle(
-            DirectParserASTType.HANDLE,
-            implementsKeyword: implementsKeyword,
-            interfacesCount: interfacesCount);
-    seen(data);
-  }
-
-  @override
-  void handleExtensionShowHide(Token? showKeyword, int showElementCount,
-      Token? hideKeyword, int hideElementCount) {
-    DirectParserASTContentExtensionShowHideHandle data =
-        new DirectParserASTContentExtensionShowHideHandle(
-            DirectParserASTType.HANDLE,
-            showKeyword: showKeyword,
-            showElementCount: showElementCount,
-            hideKeyword: hideKeyword,
-            hideElementCount: hideElementCount);
-    seen(data);
-  }
-
-  @override
-  void handleClassHeader(Token begin, Token classKeyword, Token? nativeToken) {
-    DirectParserASTContentClassHeaderHandle data =
-        new DirectParserASTContentClassHeaderHandle(DirectParserASTType.HANDLE,
-            begin: begin, classKeyword: classKeyword, nativeToken: nativeToken);
-    seen(data);
-  }
-
-  @override
-  void handleRecoverClassHeader() {
-    DirectParserASTContentRecoverClassHeaderHandle data =
-        new DirectParserASTContentRecoverClassHeaderHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void endClassDeclaration(Token beginToken, Token endToken) {
-    DirectParserASTContentClassDeclarationEnd data =
-        new DirectParserASTContentClassDeclarationEnd(DirectParserASTType.END,
-            beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginMixinDeclaration(Token mixinKeyword, Token name) {
-    DirectParserASTContentMixinDeclarationBegin data =
-        new DirectParserASTContentMixinDeclarationBegin(
-            DirectParserASTType.BEGIN,
-            mixinKeyword: mixinKeyword,
-            name: name);
-    seen(data);
-  }
-
-  @override
-  void handleMixinOn(Token? onKeyword, int typeCount) {
-    DirectParserASTContentMixinOnHandle data =
-        new DirectParserASTContentMixinOnHandle(DirectParserASTType.HANDLE,
-            onKeyword: onKeyword, typeCount: typeCount);
-    seen(data);
-  }
-
-  @override
-  void handleMixinHeader(Token mixinKeyword) {
-    DirectParserASTContentMixinHeaderHandle data =
-        new DirectParserASTContentMixinHeaderHandle(DirectParserASTType.HANDLE,
-            mixinKeyword: mixinKeyword);
-    seen(data);
-  }
-
-  @override
-  void handleRecoverMixinHeader() {
-    DirectParserASTContentRecoverMixinHeaderHandle data =
-        new DirectParserASTContentRecoverMixinHeaderHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void endMixinDeclaration(Token mixinKeyword, Token endToken) {
-    DirectParserASTContentMixinDeclarationEnd data =
-        new DirectParserASTContentMixinDeclarationEnd(DirectParserASTType.END,
-            mixinKeyword: mixinKeyword, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginUncategorizedTopLevelDeclaration(Token token) {
-    DirectParserASTContentUncategorizedTopLevelDeclarationBegin data =
-        new DirectParserASTContentUncategorizedTopLevelDeclarationBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginExtensionDeclarationPrelude(Token extensionKeyword) {
-    DirectParserASTContentExtensionDeclarationPreludeBegin data =
-        new DirectParserASTContentExtensionDeclarationPreludeBegin(
-            DirectParserASTType.BEGIN,
-            extensionKeyword: extensionKeyword);
-    seen(data);
-  }
-
-  @override
-  void beginExtensionDeclaration(Token extensionKeyword, Token? name) {
-    DirectParserASTContentExtensionDeclarationBegin data =
-        new DirectParserASTContentExtensionDeclarationBegin(
-            DirectParserASTType.BEGIN,
-            extensionKeyword: extensionKeyword,
-            name: name);
-    seen(data);
-  }
-
-  @override
-  void endExtensionDeclaration(Token extensionKeyword, Token? typeKeyword,
-      Token onKeyword, Token? showKeyword, Token? hideKeyword, Token endToken) {
-    DirectParserASTContentExtensionDeclarationEnd data =
-        new DirectParserASTContentExtensionDeclarationEnd(
-            DirectParserASTType.END,
-            extensionKeyword: extensionKeyword,
-            typeKeyword: typeKeyword,
-            onKeyword: onKeyword,
-            showKeyword: showKeyword,
-            hideKeyword: hideKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginCombinators(Token token) {
-    DirectParserASTContentCombinatorsBegin data =
-        new DirectParserASTContentCombinatorsBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endCombinators(int count) {
-    DirectParserASTContentCombinatorsEnd data =
-        new DirectParserASTContentCombinatorsEnd(DirectParserASTType.END,
-            count: count);
-    seen(data);
-  }
-
-  @override
-  void beginCompilationUnit(Token token) {
-    DirectParserASTContentCompilationUnitBegin data =
-        new DirectParserASTContentCompilationUnitBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleDirectivesOnly() {
-    DirectParserASTContentDirectivesOnlyHandle data =
-        new DirectParserASTContentDirectivesOnlyHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void endCompilationUnit(int count, Token token) {
-    DirectParserASTContentCompilationUnitEnd data =
-        new DirectParserASTContentCompilationUnitEnd(DirectParserASTType.END,
-            count: count, token: token);
-    seen(data);
-  }
-
-  @override
-  void beginConstLiteral(Token token) {
-    DirectParserASTContentConstLiteralBegin data =
-        new DirectParserASTContentConstLiteralBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endConstLiteral(Token token) {
-    DirectParserASTContentConstLiteralEnd data =
-        new DirectParserASTContentConstLiteralEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginConstructorReference(Token start) {
-    DirectParserASTContentConstructorReferenceBegin data =
-        new DirectParserASTContentConstructorReferenceBegin(
-            DirectParserASTType.BEGIN,
-            start: start);
-    seen(data);
-  }
-
-  @override
-  void endConstructorReference(Token start, Token? periodBeforeName,
-      Token endToken, ConstructorReferenceContext constructorReferenceContext) {
-    DirectParserASTContentConstructorReferenceEnd data =
-        new DirectParserASTContentConstructorReferenceEnd(
-            DirectParserASTType.END,
-            start: start,
-            periodBeforeName: periodBeforeName,
-            endToken: endToken,
-            constructorReferenceContext: constructorReferenceContext);
-    seen(data);
-  }
-
-  @override
-  void beginDoWhileStatement(Token token) {
-    DirectParserASTContentDoWhileStatementBegin data =
-        new DirectParserASTContentDoWhileStatementBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endDoWhileStatement(
-      Token doKeyword, Token whileKeyword, Token endToken) {
-    DirectParserASTContentDoWhileStatementEnd data =
-        new DirectParserASTContentDoWhileStatementEnd(DirectParserASTType.END,
-            doKeyword: doKeyword,
-            whileKeyword: whileKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginDoWhileStatementBody(Token token) {
-    DirectParserASTContentDoWhileStatementBodyBegin data =
-        new DirectParserASTContentDoWhileStatementBodyBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endDoWhileStatementBody(Token token) {
-    DirectParserASTContentDoWhileStatementBodyEnd data =
-        new DirectParserASTContentDoWhileStatementBodyEnd(
-            DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginWhileStatementBody(Token token) {
-    DirectParserASTContentWhileStatementBodyBegin data =
-        new DirectParserASTContentWhileStatementBodyBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endWhileStatementBody(Token token) {
-    DirectParserASTContentWhileStatementBodyEnd data =
-        new DirectParserASTContentWhileStatementBodyEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginEnum(Token enumKeyword) {
-    DirectParserASTContentEnumBegin data = new DirectParserASTContentEnumBegin(
-        DirectParserASTType.BEGIN,
-        enumKeyword: enumKeyword);
-    seen(data);
-  }
-
-  @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
-    DirectParserASTContentEnumEnd data = new DirectParserASTContentEnumEnd(
-        DirectParserASTType.END,
-        enumKeyword: enumKeyword,
-        leftBrace: leftBrace,
-        count: count);
-    seen(data);
-  }
-
-  @override
-  void beginExport(Token token) {
-    DirectParserASTContentExportBegin data =
-        new DirectParserASTContentExportBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endExport(Token exportKeyword, Token semicolon) {
-    DirectParserASTContentExportEnd data = new DirectParserASTContentExportEnd(
-        DirectParserASTType.END,
-        exportKeyword: exportKeyword,
-        semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleExtraneousExpression(Token token, Message message) {
-    DirectParserASTContentExtraneousExpressionHandle data =
-        new DirectParserASTContentExtraneousExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            message: message);
-    seen(data);
-  }
-
-  @override
-  void handleExpressionStatement(Token token) {
-    DirectParserASTContentExpressionStatementHandle data =
-        new DirectParserASTContentExpressionStatementHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginFactoryMethod(DeclarationKind declarationKind, Token lastConsumed,
-      Token? externalToken, Token? constToken) {
-    DirectParserASTContentFactoryMethodBegin data =
-        new DirectParserASTContentFactoryMethodBegin(DirectParserASTType.BEGIN,
-            declarationKind: declarationKind,
-            lastConsumed: lastConsumed,
-            externalToken: externalToken,
-            constToken: constToken);
-    seen(data);
-  }
-
-  @override
-  void endClassFactoryMethod(
-      Token beginToken, Token factoryKeyword, Token endToken) {
-    DirectParserASTContentClassFactoryMethodEnd data =
-        new DirectParserASTContentClassFactoryMethodEnd(DirectParserASTType.END,
-            beginToken: beginToken,
-            factoryKeyword: factoryKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endMixinFactoryMethod(
-      Token beginToken, Token factoryKeyword, Token endToken) {
-    DirectParserASTContentMixinFactoryMethodEnd data =
-        new DirectParserASTContentMixinFactoryMethodEnd(DirectParserASTType.END,
-            beginToken: beginToken,
-            factoryKeyword: factoryKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endExtensionFactoryMethod(
-      Token beginToken, Token factoryKeyword, Token endToken) {
-    DirectParserASTContentExtensionFactoryMethodEnd data =
-        new DirectParserASTContentExtensionFactoryMethodEnd(
-            DirectParserASTType.END,
-            beginToken: beginToken,
-            factoryKeyword: factoryKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginFormalParameter(Token token, MemberKind kind, Token? requiredToken,
-      Token? covariantToken, Token? varFinalOrConst) {
-    DirectParserASTContentFormalParameterBegin data =
-        new DirectParserASTContentFormalParameterBegin(
-            DirectParserASTType.BEGIN,
-            token: token,
-            kind: kind,
-            requiredToken: requiredToken,
-            covariantToken: covariantToken,
-            varFinalOrConst: varFinalOrConst);
-    seen(data);
-  }
-
-  @override
-  void endFormalParameter(
-      Token? thisKeyword,
-      Token? periodAfterThis,
-      Token nameToken,
-      Token? initializerStart,
-      Token? initializerEnd,
-      FormalParameterKind kind,
-      MemberKind memberKind) {
-    DirectParserASTContentFormalParameterEnd data =
-        new DirectParserASTContentFormalParameterEnd(DirectParserASTType.END,
-            thisKeyword: thisKeyword,
-            periodAfterThis: periodAfterThis,
-            nameToken: nameToken,
-            initializerStart: initializerStart,
-            initializerEnd: initializerEnd,
-            kind: kind,
-            memberKind: memberKind);
-    seen(data);
-  }
-
-  @override
-  void handleNoFormalParameters(Token token, MemberKind kind) {
-    DirectParserASTContentNoFormalParametersHandle data =
-        new DirectParserASTContentNoFormalParametersHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            kind: kind);
-    seen(data);
-  }
-
-  @override
-  void beginFormalParameters(Token token, MemberKind kind) {
-    DirectParserASTContentFormalParametersBegin data =
-        new DirectParserASTContentFormalParametersBegin(
-            DirectParserASTType.BEGIN,
-            token: token,
-            kind: kind);
-    seen(data);
-  }
-
-  @override
-  void endFormalParameters(
-      int count, Token beginToken, Token endToken, MemberKind kind) {
-    DirectParserASTContentFormalParametersEnd data =
-        new DirectParserASTContentFormalParametersEnd(DirectParserASTType.END,
-            count: count,
-            beginToken: beginToken,
-            endToken: endToken,
-            kind: kind);
-    seen(data);
-  }
-
-  @override
-  void endClassFields(
-      Token? abstractToken,
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? lateToken,
-      Token? varFinalOrConst,
-      int count,
-      Token beginToken,
-      Token endToken) {
-    DirectParserASTContentClassFieldsEnd data =
-        new DirectParserASTContentClassFieldsEnd(DirectParserASTType.END,
-            abstractToken: abstractToken,
-            externalToken: externalToken,
-            staticToken: staticToken,
-            covariantToken: covariantToken,
-            lateToken: lateToken,
-            varFinalOrConst: varFinalOrConst,
-            count: count,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endMixinFields(
-      Token? abstractToken,
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? lateToken,
-      Token? varFinalOrConst,
-      int count,
-      Token beginToken,
-      Token endToken) {
-    DirectParserASTContentMixinFieldsEnd data =
-        new DirectParserASTContentMixinFieldsEnd(DirectParserASTType.END,
-            abstractToken: abstractToken,
-            externalToken: externalToken,
-            staticToken: staticToken,
-            covariantToken: covariantToken,
-            lateToken: lateToken,
-            varFinalOrConst: varFinalOrConst,
-            count: count,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endExtensionFields(
-      Token? abstractToken,
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? lateToken,
-      Token? varFinalOrConst,
-      int count,
-      Token beginToken,
-      Token endToken) {
-    DirectParserASTContentExtensionFieldsEnd data =
-        new DirectParserASTContentExtensionFieldsEnd(DirectParserASTType.END,
-            abstractToken: abstractToken,
-            externalToken: externalToken,
-            staticToken: staticToken,
-            covariantToken: covariantToken,
-            lateToken: lateToken,
-            varFinalOrConst: varFinalOrConst,
-            count: count,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleForInitializerEmptyStatement(Token token) {
-    DirectParserASTContentForInitializerEmptyStatementHandle data =
-        new DirectParserASTContentForInitializerEmptyStatementHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleForInitializerExpressionStatement(Token token, bool forIn) {
-    DirectParserASTContentForInitializerExpressionStatementHandle data =
-        new DirectParserASTContentForInitializerExpressionStatementHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            forIn: forIn);
-    seen(data);
-  }
-
-  @override
-  void handleForInitializerLocalVariableDeclaration(Token token, bool forIn) {
-    DirectParserASTContentForInitializerLocalVariableDeclarationHandle data =
-        new DirectParserASTContentForInitializerLocalVariableDeclarationHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            forIn: forIn);
-    seen(data);
-  }
-
-  @override
-  void beginForStatement(Token token) {
-    DirectParserASTContentForStatementBegin data =
-        new DirectParserASTContentForStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleForLoopParts(Token forKeyword, Token leftParen,
-      Token leftSeparator, int updateExpressionCount) {
-    DirectParserASTContentForLoopPartsHandle data =
-        new DirectParserASTContentForLoopPartsHandle(DirectParserASTType.HANDLE,
-            forKeyword: forKeyword,
-            leftParen: leftParen,
-            leftSeparator: leftSeparator,
-            updateExpressionCount: updateExpressionCount);
-    seen(data);
-  }
-
-  @override
-  void endForStatement(Token endToken) {
-    DirectParserASTContentForStatementEnd data =
-        new DirectParserASTContentForStatementEnd(DirectParserASTType.END,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginForStatementBody(Token token) {
-    DirectParserASTContentForStatementBodyBegin data =
-        new DirectParserASTContentForStatementBodyBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endForStatementBody(Token token) {
-    DirectParserASTContentForStatementBodyEnd data =
-        new DirectParserASTContentForStatementBodyEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleForInLoopParts(Token? awaitToken, Token forToken,
-      Token leftParenthesis, Token inKeyword) {
-    DirectParserASTContentForInLoopPartsHandle data =
-        new DirectParserASTContentForInLoopPartsHandle(
-            DirectParserASTType.HANDLE,
-            awaitToken: awaitToken,
-            forToken: forToken,
-            leftParenthesis: leftParenthesis,
-            inKeyword: inKeyword);
-    seen(data);
-  }
-
-  @override
-  void endForIn(Token endToken) {
-    DirectParserASTContentForInEnd data = new DirectParserASTContentForInEnd(
-        DirectParserASTType.END,
-        endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginForInExpression(Token token) {
-    DirectParserASTContentForInExpressionBegin data =
-        new DirectParserASTContentForInExpressionBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endForInExpression(Token token) {
-    DirectParserASTContentForInExpressionEnd data =
-        new DirectParserASTContentForInExpressionEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginForInBody(Token token) {
-    DirectParserASTContentForInBodyBegin data =
-        new DirectParserASTContentForInBodyBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endForInBody(Token token) {
-    DirectParserASTContentForInBodyEnd data =
-        new DirectParserASTContentForInBodyEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginNamedFunctionExpression(Token token) {
-    DirectParserASTContentNamedFunctionExpressionBegin data =
-        new DirectParserASTContentNamedFunctionExpressionBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endNamedFunctionExpression(Token endToken) {
-    DirectParserASTContentNamedFunctionExpressionEnd data =
-        new DirectParserASTContentNamedFunctionExpressionEnd(
-            DirectParserASTType.END,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginLocalFunctionDeclaration(Token token) {
-    DirectParserASTContentLocalFunctionDeclarationBegin data =
-        new DirectParserASTContentLocalFunctionDeclarationBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endLocalFunctionDeclaration(Token endToken) {
-    DirectParserASTContentLocalFunctionDeclarationEnd data =
-        new DirectParserASTContentLocalFunctionDeclarationEnd(
-            DirectParserASTType.END,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginBlockFunctionBody(Token token) {
-    DirectParserASTContentBlockFunctionBodyBegin data =
-        new DirectParserASTContentBlockFunctionBodyBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endBlockFunctionBody(int count, Token beginToken, Token endToken) {
-    DirectParserASTContentBlockFunctionBodyEnd data =
-        new DirectParserASTContentBlockFunctionBodyEnd(DirectParserASTType.END,
-            count: count, beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleNoFunctionBody(Token token) {
-    DirectParserASTContentNoFunctionBodyHandle data =
-        new DirectParserASTContentNoFunctionBodyHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleFunctionBodySkipped(Token token, bool isExpressionBody) {
-    DirectParserASTContentFunctionBodySkippedHandle data =
-        new DirectParserASTContentFunctionBodySkippedHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            isExpressionBody: isExpressionBody);
-    seen(data);
-  }
-
-  @override
-  void beginFunctionName(Token token) {
-    DirectParserASTContentFunctionNameBegin data =
-        new DirectParserASTContentFunctionNameBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endFunctionName(Token beginToken, Token token) {
-    DirectParserASTContentFunctionNameEnd data =
-        new DirectParserASTContentFunctionNameEnd(DirectParserASTType.END,
-            beginToken: beginToken, token: token);
-    seen(data);
-  }
-
-  @override
-  void beginTypedef(Token token) {
-    DirectParserASTContentTypedefBegin data =
-        new DirectParserASTContentTypedefBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endTypedef(Token typedefKeyword, Token? equals, Token endToken) {
-    DirectParserASTContentTypedefEnd data =
-        new DirectParserASTContentTypedefEnd(DirectParserASTType.END,
-            typedefKeyword: typedefKeyword, equals: equals, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleClassWithClause(Token withKeyword) {
-    DirectParserASTContentClassWithClauseHandle data =
-        new DirectParserASTContentClassWithClauseHandle(
-            DirectParserASTType.HANDLE,
-            withKeyword: withKeyword);
-    seen(data);
-  }
-
-  @override
-  void handleClassNoWithClause() {
-    DirectParserASTContentClassNoWithClauseHandle data =
-        new DirectParserASTContentClassNoWithClauseHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void beginNamedMixinApplication(
-      Token begin, Token? abstractToken, Token name) {
-    DirectParserASTContentNamedMixinApplicationBegin data =
-        new DirectParserASTContentNamedMixinApplicationBegin(
-            DirectParserASTType.BEGIN,
-            begin: begin,
-            abstractToken: abstractToken,
-            name: name);
-    seen(data);
-  }
-
-  @override
-  void handleNamedMixinApplicationWithClause(Token withKeyword) {
-    DirectParserASTContentNamedMixinApplicationWithClauseHandle data =
-        new DirectParserASTContentNamedMixinApplicationWithClauseHandle(
-            DirectParserASTType.HANDLE,
-            withKeyword: withKeyword);
-    seen(data);
-  }
-
-  @override
-  void endNamedMixinApplication(Token begin, Token classKeyword, Token equals,
-      Token? implementsKeyword, Token endToken) {
-    DirectParserASTContentNamedMixinApplicationEnd data =
-        new DirectParserASTContentNamedMixinApplicationEnd(
-            DirectParserASTType.END,
-            begin: begin,
-            classKeyword: classKeyword,
-            equals: equals,
-            implementsKeyword: implementsKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginHide(Token hideKeyword) {
-    DirectParserASTContentHideBegin data = new DirectParserASTContentHideBegin(
-        DirectParserASTType.BEGIN,
-        hideKeyword: hideKeyword);
-    seen(data);
-  }
-
-  @override
-  void endHide(Token hideKeyword) {
-    DirectParserASTContentHideEnd data = new DirectParserASTContentHideEnd(
-        DirectParserASTType.END,
-        hideKeyword: hideKeyword);
-    seen(data);
-  }
-
-  @override
-  void handleIdentifierList(int count) {
-    DirectParserASTContentIdentifierListHandle data =
-        new DirectParserASTContentIdentifierListHandle(
-            DirectParserASTType.HANDLE,
-            count: count);
-    seen(data);
-  }
-
-  @override
-  void beginTypeList(Token token) {
-    DirectParserASTContentTypeListBegin data =
-        new DirectParserASTContentTypeListBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endTypeList(int count) {
-    DirectParserASTContentTypeListEnd data =
-        new DirectParserASTContentTypeListEnd(DirectParserASTType.END,
-            count: count);
-    seen(data);
-  }
-
-  @override
-  void beginIfStatement(Token token) {
-    DirectParserASTContentIfStatementBegin data =
-        new DirectParserASTContentIfStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endIfStatement(Token ifToken, Token? elseToken) {
-    DirectParserASTContentIfStatementEnd data =
-        new DirectParserASTContentIfStatementEnd(DirectParserASTType.END,
-            ifToken: ifToken, elseToken: elseToken);
-    seen(data);
-  }
-
-  @override
-  void beginThenStatement(Token token) {
-    DirectParserASTContentThenStatementBegin data =
-        new DirectParserASTContentThenStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endThenStatement(Token token) {
-    DirectParserASTContentThenStatementEnd data =
-        new DirectParserASTContentThenStatementEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginElseStatement(Token token) {
-    DirectParserASTContentElseStatementBegin data =
-        new DirectParserASTContentElseStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endElseStatement(Token token) {
-    DirectParserASTContentElseStatementEnd data =
-        new DirectParserASTContentElseStatementEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginImport(Token importKeyword) {
-    DirectParserASTContentImportBegin data =
-        new DirectParserASTContentImportBegin(DirectParserASTType.BEGIN,
-            importKeyword: importKeyword);
-    seen(data);
-  }
-
-  @override
-  void handleImportPrefix(Token? deferredKeyword, Token? asKeyword) {
-    DirectParserASTContentImportPrefixHandle data =
-        new DirectParserASTContentImportPrefixHandle(DirectParserASTType.HANDLE,
-            deferredKeyword: deferredKeyword, asKeyword: asKeyword);
-    seen(data);
-  }
-
-  @override
-  void endImport(Token importKeyword, Token? semicolon) {
-    DirectParserASTContentImportEnd data = new DirectParserASTContentImportEnd(
-        DirectParserASTType.END,
-        importKeyword: importKeyword,
-        semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleRecoverImport(Token? semicolon) {
-    DirectParserASTContentRecoverImportHandle data =
-        new DirectParserASTContentRecoverImportHandle(
-            DirectParserASTType.HANDLE,
-            semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void beginConditionalUris(Token token) {
-    DirectParserASTContentConditionalUrisBegin data =
-        new DirectParserASTContentConditionalUrisBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endConditionalUris(int count) {
-    DirectParserASTContentConditionalUrisEnd data =
-        new DirectParserASTContentConditionalUrisEnd(DirectParserASTType.END,
-            count: count);
-    seen(data);
-  }
-
-  @override
-  void beginConditionalUri(Token ifKeyword) {
-    DirectParserASTContentConditionalUriBegin data =
-        new DirectParserASTContentConditionalUriBegin(DirectParserASTType.BEGIN,
-            ifKeyword: ifKeyword);
-    seen(data);
-  }
-
-  @override
-  void endConditionalUri(Token ifKeyword, Token leftParen, Token? equalSign) {
-    DirectParserASTContentConditionalUriEnd data =
-        new DirectParserASTContentConditionalUriEnd(DirectParserASTType.END,
-            ifKeyword: ifKeyword, leftParen: leftParen, equalSign: equalSign);
-    seen(data);
-  }
-
-  @override
-  void handleDottedName(int count, Token firstIdentifier) {
-    DirectParserASTContentDottedNameHandle data =
-        new DirectParserASTContentDottedNameHandle(DirectParserASTType.HANDLE,
-            count: count, firstIdentifier: firstIdentifier);
-    seen(data);
-  }
-
-  @override
-  void beginImplicitCreationExpression(Token token) {
-    DirectParserASTContentImplicitCreationExpressionBegin data =
-        new DirectParserASTContentImplicitCreationExpressionBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endImplicitCreationExpression(Token token, Token openAngleBracket) {
-    DirectParserASTContentImplicitCreationExpressionEnd data =
-        new DirectParserASTContentImplicitCreationExpressionEnd(
-            DirectParserASTType.END,
-            token: token,
-            openAngleBracket: openAngleBracket);
-    seen(data);
-  }
-
-  @override
-  void beginInitializedIdentifier(Token token) {
-    DirectParserASTContentInitializedIdentifierBegin data =
-        new DirectParserASTContentInitializedIdentifierBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endInitializedIdentifier(Token nameToken) {
-    DirectParserASTContentInitializedIdentifierEnd data =
-        new DirectParserASTContentInitializedIdentifierEnd(
-            DirectParserASTType.END,
-            nameToken: nameToken);
-    seen(data);
-  }
-
-  @override
-  void beginFieldInitializer(Token token) {
-    DirectParserASTContentFieldInitializerBegin data =
-        new DirectParserASTContentFieldInitializerBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endFieldInitializer(Token assignment, Token token) {
-    DirectParserASTContentFieldInitializerEnd data =
-        new DirectParserASTContentFieldInitializerEnd(DirectParserASTType.END,
-            assignment: assignment, token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNoFieldInitializer(Token token) {
-    DirectParserASTContentNoFieldInitializerHandle data =
-        new DirectParserASTContentNoFieldInitializerHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginVariableInitializer(Token token) {
-    DirectParserASTContentVariableInitializerBegin data =
-        new DirectParserASTContentVariableInitializerBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endVariableInitializer(Token assignmentOperator) {
-    DirectParserASTContentVariableInitializerEnd data =
-        new DirectParserASTContentVariableInitializerEnd(
-            DirectParserASTType.END,
-            assignmentOperator: assignmentOperator);
-    seen(data);
-  }
-
-  @override
-  void handleNoVariableInitializer(Token token) {
-    DirectParserASTContentNoVariableInitializerHandle data =
-        new DirectParserASTContentNoVariableInitializerHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginInitializer(Token token) {
-    DirectParserASTContentInitializerBegin data =
-        new DirectParserASTContentInitializerBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endInitializer(Token token) {
-    DirectParserASTContentInitializerEnd data =
-        new DirectParserASTContentInitializerEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginInitializers(Token token) {
-    DirectParserASTContentInitializersBegin data =
-        new DirectParserASTContentInitializersBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endInitializers(int count, Token beginToken, Token endToken) {
-    DirectParserASTContentInitializersEnd data =
-        new DirectParserASTContentInitializersEnd(DirectParserASTType.END,
-            count: count, beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleNoInitializers() {
-    DirectParserASTContentNoInitializersHandle data =
-        new DirectParserASTContentNoInitializersHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidExpression(Token token) {
-    DirectParserASTContentInvalidExpressionHandle data =
-        new DirectParserASTContentInvalidExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidFunctionBody(Token token) {
-    DirectParserASTContentInvalidFunctionBodyHandle data =
-        new DirectParserASTContentInvalidFunctionBodyHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidTypeReference(Token token) {
-    DirectParserASTContentInvalidTypeReferenceHandle data =
-        new DirectParserASTContentInvalidTypeReferenceHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleLabel(Token token) {
-    DirectParserASTContentLabelHandle data =
-        new DirectParserASTContentLabelHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginLabeledStatement(Token token, int labelCount) {
-    DirectParserASTContentLabeledStatementBegin data =
-        new DirectParserASTContentLabeledStatementBegin(
-            DirectParserASTType.BEGIN,
-            token: token,
-            labelCount: labelCount);
-    seen(data);
-  }
-
-  @override
-  void endLabeledStatement(int labelCount) {
-    DirectParserASTContentLabeledStatementEnd data =
-        new DirectParserASTContentLabeledStatementEnd(DirectParserASTType.END,
-            labelCount: labelCount);
-    seen(data);
-  }
-
-  @override
-  void beginLibraryName(Token token) {
-    DirectParserASTContentLibraryNameBegin data =
-        new DirectParserASTContentLibraryNameBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endLibraryName(Token libraryKeyword, Token semicolon) {
-    DirectParserASTContentLibraryNameEnd data =
-        new DirectParserASTContentLibraryNameEnd(DirectParserASTType.END,
-            libraryKeyword: libraryKeyword, semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralMapEntry(Token colon, Token endToken) {
-    DirectParserASTContentLiteralMapEntryHandle data =
-        new DirectParserASTContentLiteralMapEntryHandle(
-            DirectParserASTType.HANDLE,
-            colon: colon,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginLiteralString(Token token) {
-    DirectParserASTContentLiteralStringBegin data =
-        new DirectParserASTContentLiteralStringBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleInterpolationExpression(Token leftBracket, Token? rightBracket) {
-    DirectParserASTContentInterpolationExpressionHandle data =
-        new DirectParserASTContentInterpolationExpressionHandle(
-            DirectParserASTType.HANDLE,
-            leftBracket: leftBracket,
-            rightBracket: rightBracket);
-    seen(data);
-  }
-
-  @override
-  void endLiteralString(int interpolationCount, Token endToken) {
-    DirectParserASTContentLiteralStringEnd data =
-        new DirectParserASTContentLiteralStringEnd(DirectParserASTType.END,
-            interpolationCount: interpolationCount, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleStringJuxtaposition(Token startToken, int literalCount) {
-    DirectParserASTContentStringJuxtapositionHandle data =
-        new DirectParserASTContentStringJuxtapositionHandle(
-            DirectParserASTType.HANDLE,
-            startToken: startToken,
-            literalCount: literalCount);
-    seen(data);
-  }
-
-  @override
-  void beginMember() {
-    DirectParserASTContentMemberBegin data =
-        new DirectParserASTContentMemberBegin(DirectParserASTType.BEGIN);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidMember(Token endToken) {
-    DirectParserASTContentInvalidMemberHandle data =
-        new DirectParserASTContentInvalidMemberHandle(
-            DirectParserASTType.HANDLE,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endMember() {
-    DirectParserASTContentMemberEnd data =
-        new DirectParserASTContentMemberEnd(DirectParserASTType.END);
-    seen(data);
-  }
-
-  @override
-  void beginMethod(
-      DeclarationKind declarationKind,
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? varFinalOrConst,
-      Token? getOrSet,
-      Token name) {
-    DirectParserASTContentMethodBegin data =
-        new DirectParserASTContentMethodBegin(DirectParserASTType.BEGIN,
-            declarationKind: declarationKind,
-            externalToken: externalToken,
-            staticToken: staticToken,
-            covariantToken: covariantToken,
-            varFinalOrConst: varFinalOrConst,
-            getOrSet: getOrSet,
-            name: name);
-    seen(data);
-  }
-
-  @override
-  void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
-      Token? beginInitializers, Token endToken) {
-    DirectParserASTContentClassMethodEnd data =
-        new DirectParserASTContentClassMethodEnd(DirectParserASTType.END,
-            getOrSet: getOrSet,
-            beginToken: beginToken,
-            beginParam: beginParam,
-            beginInitializers: beginInitializers,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endMixinMethod(Token? getOrSet, Token beginToken, Token beginParam,
-      Token? beginInitializers, Token endToken) {
-    DirectParserASTContentMixinMethodEnd data =
-        new DirectParserASTContentMixinMethodEnd(DirectParserASTType.END,
-            getOrSet: getOrSet,
-            beginToken: beginToken,
-            beginParam: beginParam,
-            beginInitializers: beginInitializers,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endExtensionMethod(Token? getOrSet, Token beginToken, Token beginParam,
-      Token? beginInitializers, Token endToken) {
-    DirectParserASTContentExtensionMethodEnd data =
-        new DirectParserASTContentExtensionMethodEnd(DirectParserASTType.END,
-            getOrSet: getOrSet,
-            beginToken: beginToken,
-            beginParam: beginParam,
-            beginInitializers: beginInitializers,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endClassConstructor(Token? getOrSet, Token beginToken, Token beginParam,
-      Token? beginInitializers, Token endToken) {
-    DirectParserASTContentClassConstructorEnd data =
-        new DirectParserASTContentClassConstructorEnd(DirectParserASTType.END,
-            getOrSet: getOrSet,
-            beginToken: beginToken,
-            beginParam: beginParam,
-            beginInitializers: beginInitializers,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endMixinConstructor(Token? getOrSet, Token beginToken, Token beginParam,
-      Token? beginInitializers, Token endToken) {
-    DirectParserASTContentMixinConstructorEnd data =
-        new DirectParserASTContentMixinConstructorEnd(DirectParserASTType.END,
-            getOrSet: getOrSet,
-            beginToken: beginToken,
-            beginParam: beginParam,
-            beginInitializers: beginInitializers,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endExtensionConstructor(Token? getOrSet, Token beginToken,
-      Token beginParam, Token? beginInitializers, Token endToken) {
-    DirectParserASTContentExtensionConstructorEnd data =
-        new DirectParserASTContentExtensionConstructorEnd(
-            DirectParserASTType.END,
-            getOrSet: getOrSet,
-            beginToken: beginToken,
-            beginParam: beginParam,
-            beginInitializers: beginInitializers,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginMetadataStar(Token token) {
-    DirectParserASTContentMetadataStarBegin data =
-        new DirectParserASTContentMetadataStarBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endMetadataStar(int count) {
-    DirectParserASTContentMetadataStarEnd data =
-        new DirectParserASTContentMetadataStarEnd(DirectParserASTType.END,
-            count: count);
-    seen(data);
-  }
-
-  @override
-  void beginMetadata(Token token) {
-    DirectParserASTContentMetadataBegin data =
-        new DirectParserASTContentMetadataBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endMetadata(Token beginToken, Token? periodBeforeName, Token endToken) {
-    DirectParserASTContentMetadataEnd data =
-        new DirectParserASTContentMetadataEnd(DirectParserASTType.END,
-            beginToken: beginToken,
-            periodBeforeName: periodBeforeName,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginOptionalFormalParameters(Token token) {
-    DirectParserASTContentOptionalFormalParametersBegin data =
-        new DirectParserASTContentOptionalFormalParametersBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endOptionalFormalParameters(
-      int count, Token beginToken, Token endToken) {
-    DirectParserASTContentOptionalFormalParametersEnd data =
-        new DirectParserASTContentOptionalFormalParametersEnd(
-            DirectParserASTType.END,
-            count: count,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginPart(Token token) {
-    DirectParserASTContentPartBegin data = new DirectParserASTContentPartBegin(
-        DirectParserASTType.BEGIN,
-        token: token);
-    seen(data);
-  }
-
-  @override
-  void endPart(Token partKeyword, Token semicolon) {
-    DirectParserASTContentPartEnd data = new DirectParserASTContentPartEnd(
-        DirectParserASTType.END,
-        partKeyword: partKeyword,
-        semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void beginPartOf(Token token) {
-    DirectParserASTContentPartOfBegin data =
-        new DirectParserASTContentPartOfBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endPartOf(
-      Token partKeyword, Token ofKeyword, Token semicolon, bool hasName) {
-    DirectParserASTContentPartOfEnd data = new DirectParserASTContentPartOfEnd(
-        DirectParserASTType.END,
-        partKeyword: partKeyword,
-        ofKeyword: ofKeyword,
-        semicolon: semicolon,
-        hasName: hasName);
-    seen(data);
-  }
-
-  @override
-  void beginRedirectingFactoryBody(Token token) {
-    DirectParserASTContentRedirectingFactoryBodyBegin data =
-        new DirectParserASTContentRedirectingFactoryBodyBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endRedirectingFactoryBody(Token beginToken, Token endToken) {
-    DirectParserASTContentRedirectingFactoryBodyEnd data =
-        new DirectParserASTContentRedirectingFactoryBodyEnd(
-            DirectParserASTType.END,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginReturnStatement(Token token) {
-    DirectParserASTContentReturnStatementBegin data =
-        new DirectParserASTContentReturnStatementBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNativeFunctionBody(Token nativeToken, Token semicolon) {
-    DirectParserASTContentNativeFunctionBodyHandle data =
-        new DirectParserASTContentNativeFunctionBodyHandle(
-            DirectParserASTType.HANDLE,
-            nativeToken: nativeToken,
-            semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleNativeFunctionBodyIgnored(Token nativeToken, Token semicolon) {
-    DirectParserASTContentNativeFunctionBodyIgnoredHandle data =
-        new DirectParserASTContentNativeFunctionBodyIgnoredHandle(
-            DirectParserASTType.HANDLE,
-            nativeToken: nativeToken,
-            semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleNativeFunctionBodySkipped(Token nativeToken, Token semicolon) {
-    DirectParserASTContentNativeFunctionBodySkippedHandle data =
-        new DirectParserASTContentNativeFunctionBodySkippedHandle(
-            DirectParserASTType.HANDLE,
-            nativeToken: nativeToken,
-            semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleEmptyFunctionBody(Token semicolon) {
-    DirectParserASTContentEmptyFunctionBodyHandle data =
-        new DirectParserASTContentEmptyFunctionBodyHandle(
-            DirectParserASTType.HANDLE,
-            semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleExpressionFunctionBody(Token arrowToken, Token? endToken) {
-    DirectParserASTContentExpressionFunctionBodyHandle data =
-        new DirectParserASTContentExpressionFunctionBodyHandle(
-            DirectParserASTType.HANDLE,
-            arrowToken: arrowToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endReturnStatement(
-      bool hasExpression, Token beginToken, Token endToken) {
-    DirectParserASTContentReturnStatementEnd data =
-        new DirectParserASTContentReturnStatementEnd(DirectParserASTType.END,
-            hasExpression: hasExpression,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleSend(Token beginToken, Token endToken) {
-    DirectParserASTContentSendHandle data =
-        new DirectParserASTContentSendHandle(DirectParserASTType.HANDLE,
-            beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginShow(Token showKeyword) {
-    DirectParserASTContentShowBegin data = new DirectParserASTContentShowBegin(
-        DirectParserASTType.BEGIN,
-        showKeyword: showKeyword);
-    seen(data);
-  }
-
-  @override
-  void endShow(Token showKeyword) {
-    DirectParserASTContentShowEnd data = new DirectParserASTContentShowEnd(
-        DirectParserASTType.END,
-        showKeyword: showKeyword);
-    seen(data);
-  }
-
-  @override
-  void beginSwitchStatement(Token token) {
-    DirectParserASTContentSwitchStatementBegin data =
-        new DirectParserASTContentSwitchStatementBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endSwitchStatement(Token switchKeyword, Token endToken) {
-    DirectParserASTContentSwitchStatementEnd data =
-        new DirectParserASTContentSwitchStatementEnd(DirectParserASTType.END,
-            switchKeyword: switchKeyword, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginSwitchBlock(Token token) {
-    DirectParserASTContentSwitchBlockBegin data =
-        new DirectParserASTContentSwitchBlockBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endSwitchBlock(int caseCount, Token beginToken, Token endToken) {
-    DirectParserASTContentSwitchBlockEnd data =
-        new DirectParserASTContentSwitchBlockEnd(DirectParserASTType.END,
-            caseCount: caseCount, beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginLiteralSymbol(Token token) {
-    DirectParserASTContentLiteralSymbolBegin data =
-        new DirectParserASTContentLiteralSymbolBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endLiteralSymbol(Token hashToken, int identifierCount) {
-    DirectParserASTContentLiteralSymbolEnd data =
-        new DirectParserASTContentLiteralSymbolEnd(DirectParserASTType.END,
-            hashToken: hashToken, identifierCount: identifierCount);
-    seen(data);
-  }
-
-  @override
-  void handleThrowExpression(Token throwToken, Token endToken) {
-    DirectParserASTContentThrowExpressionHandle data =
-        new DirectParserASTContentThrowExpressionHandle(
-            DirectParserASTType.HANDLE,
-            throwToken: throwToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginRethrowStatement(Token token) {
-    DirectParserASTContentRethrowStatementBegin data =
-        new DirectParserASTContentRethrowStatementBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endRethrowStatement(Token rethrowToken, Token endToken) {
-    DirectParserASTContentRethrowStatementEnd data =
-        new DirectParserASTContentRethrowStatementEnd(DirectParserASTType.END,
-            rethrowToken: rethrowToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endTopLevelDeclaration(Token nextToken) {
-    DirectParserASTContentTopLevelDeclarationEnd data =
-        new DirectParserASTContentTopLevelDeclarationEnd(
-            DirectParserASTType.END,
-            nextToken: nextToken);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidTopLevelDeclaration(Token endToken) {
-    DirectParserASTContentInvalidTopLevelDeclarationHandle data =
-        new DirectParserASTContentInvalidTopLevelDeclarationHandle(
-            DirectParserASTType.HANDLE,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginTopLevelMember(Token token) {
-    DirectParserASTContentTopLevelMemberBegin data =
-        new DirectParserASTContentTopLevelMemberBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginFields(
-      DeclarationKind declarationKind,
-      Token? abstractToken,
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? lateToken,
-      Token? varFinalOrConst,
-      Token lastConsumed) {
-    DirectParserASTContentFieldsBegin data =
-        new DirectParserASTContentFieldsBegin(DirectParserASTType.BEGIN,
-            declarationKind: declarationKind,
-            abstractToken: abstractToken,
-            externalToken: externalToken,
-            staticToken: staticToken,
-            covariantToken: covariantToken,
-            lateToken: lateToken,
-            varFinalOrConst: varFinalOrConst,
-            lastConsumed: lastConsumed);
-    seen(data);
-  }
-
-  @override
-  void endTopLevelFields(
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? lateToken,
-      Token? varFinalOrConst,
-      int count,
-      Token beginToken,
-      Token endToken) {
-    DirectParserASTContentTopLevelFieldsEnd data =
-        new DirectParserASTContentTopLevelFieldsEnd(DirectParserASTType.END,
-            externalToken: externalToken,
-            staticToken: staticToken,
-            covariantToken: covariantToken,
-            lateToken: lateToken,
-            varFinalOrConst: varFinalOrConst,
-            count: count,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginTopLevelMethod(Token lastConsumed, Token? externalToken) {
-    DirectParserASTContentTopLevelMethodBegin data =
-        new DirectParserASTContentTopLevelMethodBegin(DirectParserASTType.BEGIN,
-            lastConsumed: lastConsumed, externalToken: externalToken);
-    seen(data);
-  }
-
-  @override
-  void endTopLevelMethod(Token beginToken, Token? getOrSet, Token endToken) {
-    DirectParserASTContentTopLevelMethodEnd data =
-        new DirectParserASTContentTopLevelMethodEnd(DirectParserASTType.END,
-            beginToken: beginToken, getOrSet: getOrSet, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginTryStatement(Token token) {
-    DirectParserASTContentTryStatementBegin data =
-        new DirectParserASTContentTryStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleCaseMatch(Token caseKeyword, Token colon) {
-    DirectParserASTContentCaseMatchHandle data =
-        new DirectParserASTContentCaseMatchHandle(DirectParserASTType.HANDLE,
-            caseKeyword: caseKeyword, colon: colon);
-    seen(data);
-  }
-
-  @override
-  void beginCatchClause(Token token) {
-    DirectParserASTContentCatchClauseBegin data =
-        new DirectParserASTContentCatchClauseBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endCatchClause(Token token) {
-    DirectParserASTContentCatchClauseEnd data =
-        new DirectParserASTContentCatchClauseEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleCatchBlock(Token? onKeyword, Token? catchKeyword, Token? comma) {
-    DirectParserASTContentCatchBlockHandle data =
-        new DirectParserASTContentCatchBlockHandle(DirectParserASTType.HANDLE,
-            onKeyword: onKeyword, catchKeyword: catchKeyword, comma: comma);
-    seen(data);
-  }
-
-  @override
-  void handleFinallyBlock(Token finallyKeyword) {
-    DirectParserASTContentFinallyBlockHandle data =
-        new DirectParserASTContentFinallyBlockHandle(DirectParserASTType.HANDLE,
-            finallyKeyword: finallyKeyword);
-    seen(data);
-  }
-
-  @override
-  void endTryStatement(
-      int catchCount, Token tryKeyword, Token? finallyKeyword) {
-    DirectParserASTContentTryStatementEnd data =
-        new DirectParserASTContentTryStatementEnd(DirectParserASTType.END,
-            catchCount: catchCount,
-            tryKeyword: tryKeyword,
-            finallyKeyword: finallyKeyword);
-    seen(data);
-  }
-
-  @override
-  void handleType(Token beginToken, Token? questionMark) {
-    DirectParserASTContentTypeHandle data =
-        new DirectParserASTContentTypeHandle(DirectParserASTType.HANDLE,
-            beginToken: beginToken, questionMark: questionMark);
-    seen(data);
-  }
-
-  @override
-  void handleNonNullAssertExpression(Token bang) {
-    DirectParserASTContentNonNullAssertExpressionHandle data =
-        new DirectParserASTContentNonNullAssertExpressionHandle(
-            DirectParserASTType.HANDLE,
-            bang: bang);
-    seen(data);
-  }
-
-  @override
-  void handleNoName(Token token) {
-    DirectParserASTContentNoNameHandle data =
-        new DirectParserASTContentNoNameHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginFunctionType(Token beginToken) {
-    DirectParserASTContentFunctionTypeBegin data =
-        new DirectParserASTContentFunctionTypeBegin(DirectParserASTType.BEGIN,
-            beginToken: beginToken);
-    seen(data);
-  }
-
-  @override
-  void endFunctionType(Token functionToken, Token? questionMark) {
-    DirectParserASTContentFunctionTypeEnd data =
-        new DirectParserASTContentFunctionTypeEnd(DirectParserASTType.END,
-            functionToken: functionToken, questionMark: questionMark);
-    seen(data);
-  }
-
-  @override
-  void beginTypeArguments(Token token) {
-    DirectParserASTContentTypeArgumentsBegin data =
-        new DirectParserASTContentTypeArgumentsBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endTypeArguments(int count, Token beginToken, Token endToken) {
-    DirectParserASTContentTypeArgumentsEnd data =
-        new DirectParserASTContentTypeArgumentsEnd(DirectParserASTType.END,
-            count: count, beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidTypeArguments(Token token) {
-    DirectParserASTContentInvalidTypeArgumentsHandle data =
-        new DirectParserASTContentInvalidTypeArgumentsHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNoTypeArguments(Token token) {
-    DirectParserASTContentNoTypeArgumentsHandle data =
-        new DirectParserASTContentNoTypeArgumentsHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginTypeVariable(Token token) {
-    DirectParserASTContentTypeVariableBegin data =
-        new DirectParserASTContentTypeVariableBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleTypeVariablesDefined(Token token, int count) {
-    DirectParserASTContentTypeVariablesDefinedHandle data =
-        new DirectParserASTContentTypeVariablesDefinedHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            count: count);
-    seen(data);
-  }
-
-  @override
-  void endTypeVariable(
-      Token token, int index, Token? extendsOrSuper, Token? variance) {
-    DirectParserASTContentTypeVariableEnd data =
-        new DirectParserASTContentTypeVariableEnd(DirectParserASTType.END,
-            token: token,
-            index: index,
-            extendsOrSuper: extendsOrSuper,
-            variance: variance);
-    seen(data);
-  }
-
-  @override
-  void beginTypeVariables(Token token) {
-    DirectParserASTContentTypeVariablesBegin data =
-        new DirectParserASTContentTypeVariablesBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endTypeVariables(Token beginToken, Token endToken) {
-    DirectParserASTContentTypeVariablesEnd data =
-        new DirectParserASTContentTypeVariablesEnd(DirectParserASTType.END,
-            beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginFunctionExpression(Token token) {
-    DirectParserASTContentFunctionExpressionBegin data =
-        new DirectParserASTContentFunctionExpressionBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endFunctionExpression(Token beginToken, Token token) {
-    DirectParserASTContentFunctionExpressionEnd data =
-        new DirectParserASTContentFunctionExpressionEnd(DirectParserASTType.END,
-            beginToken: beginToken, token: token);
-    seen(data);
-  }
-
-  @override
-  void beginVariablesDeclaration(
-      Token token, Token? lateToken, Token? varFinalOrConst) {
-    DirectParserASTContentVariablesDeclarationBegin data =
-        new DirectParserASTContentVariablesDeclarationBegin(
-            DirectParserASTType.BEGIN,
-            token: token,
-            lateToken: lateToken,
-            varFinalOrConst: varFinalOrConst);
-    seen(data);
-  }
-
-  @override
-  void endVariablesDeclaration(int count, Token? endToken) {
-    DirectParserASTContentVariablesDeclarationEnd data =
-        new DirectParserASTContentVariablesDeclarationEnd(
-            DirectParserASTType.END,
-            count: count,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginWhileStatement(Token token) {
-    DirectParserASTContentWhileStatementBegin data =
-        new DirectParserASTContentWhileStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endWhileStatement(Token whileKeyword, Token endToken) {
-    DirectParserASTContentWhileStatementEnd data =
-        new DirectParserASTContentWhileStatementEnd(DirectParserASTType.END,
-            whileKeyword: whileKeyword, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginAsOperatorType(Token operator) {
-    DirectParserASTContentAsOperatorTypeBegin data =
-        new DirectParserASTContentAsOperatorTypeBegin(DirectParserASTType.BEGIN,
-            operator: operator);
-    seen(data);
-  }
-
-  @override
-  void endAsOperatorType(Token operator) {
-    DirectParserASTContentAsOperatorTypeEnd data =
-        new DirectParserASTContentAsOperatorTypeEnd(DirectParserASTType.END,
-            operator: operator);
-    seen(data);
-  }
-
-  @override
-  void handleAsOperator(Token operator) {
-    DirectParserASTContentAsOperatorHandle data =
-        new DirectParserASTContentAsOperatorHandle(DirectParserASTType.HANDLE,
-            operator: operator);
-    seen(data);
-  }
-
-  @override
-  void handleAssignmentExpression(Token token) {
-    DirectParserASTContentAssignmentExpressionHandle data =
-        new DirectParserASTContentAssignmentExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginBinaryExpression(Token token) {
-    DirectParserASTContentBinaryExpressionBegin data =
-        new DirectParserASTContentBinaryExpressionBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endBinaryExpression(Token token) {
-    DirectParserASTContentBinaryExpressionEnd data =
-        new DirectParserASTContentBinaryExpressionEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleEndingBinaryExpression(Token token) {
-    DirectParserASTContentEndingBinaryExpressionHandle data =
-        new DirectParserASTContentEndingBinaryExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginConditionalExpression(Token question) {
-    DirectParserASTContentConditionalExpressionBegin data =
-        new DirectParserASTContentConditionalExpressionBegin(
-            DirectParserASTType.BEGIN,
-            question: question);
-    seen(data);
-  }
-
-  @override
-  void handleConditionalExpressionColon() {
-    DirectParserASTContentConditionalExpressionColonHandle data =
-        new DirectParserASTContentConditionalExpressionColonHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void endConditionalExpression(Token question, Token colon) {
-    DirectParserASTContentConditionalExpressionEnd data =
-        new DirectParserASTContentConditionalExpressionEnd(
-            DirectParserASTType.END,
-            question: question,
-            colon: colon);
-    seen(data);
-  }
-
-  @override
-  void beginConstExpression(Token constKeyword) {
-    DirectParserASTContentConstExpressionBegin data =
-        new DirectParserASTContentConstExpressionBegin(
-            DirectParserASTType.BEGIN,
-            constKeyword: constKeyword);
-    seen(data);
-  }
-
-  @override
-  void endConstExpression(Token token) {
-    DirectParserASTContentConstExpressionEnd data =
-        new DirectParserASTContentConstExpressionEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleConstFactory(Token constKeyword) {
-    DirectParserASTContentConstFactoryHandle data =
-        new DirectParserASTContentConstFactoryHandle(DirectParserASTType.HANDLE,
-            constKeyword: constKeyword);
-    seen(data);
-  }
-
-  @override
-  void beginForControlFlow(Token? awaitToken, Token forToken) {
-    DirectParserASTContentForControlFlowBegin data =
-        new DirectParserASTContentForControlFlowBegin(DirectParserASTType.BEGIN,
-            awaitToken: awaitToken, forToken: forToken);
-    seen(data);
-  }
-
-  @override
-  void endForControlFlow(Token token) {
-    DirectParserASTContentForControlFlowEnd data =
-        new DirectParserASTContentForControlFlowEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endForInControlFlow(Token token) {
-    DirectParserASTContentForInControlFlowEnd data =
-        new DirectParserASTContentForInControlFlowEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginIfControlFlow(Token ifToken) {
-    DirectParserASTContentIfControlFlowBegin data =
-        new DirectParserASTContentIfControlFlowBegin(DirectParserASTType.BEGIN,
-            ifToken: ifToken);
-    seen(data);
-  }
-
-  @override
-  void handleThenControlFlow(Token token) {
-    DirectParserASTContentThenControlFlowHandle data =
-        new DirectParserASTContentThenControlFlowHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleElseControlFlow(Token elseToken) {
-    DirectParserASTContentElseControlFlowHandle data =
-        new DirectParserASTContentElseControlFlowHandle(
-            DirectParserASTType.HANDLE,
-            elseToken: elseToken);
-    seen(data);
-  }
-
-  @override
-  void endIfControlFlow(Token token) {
-    DirectParserASTContentIfControlFlowEnd data =
-        new DirectParserASTContentIfControlFlowEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endIfElseControlFlow(Token token) {
-    DirectParserASTContentIfElseControlFlowEnd data =
-        new DirectParserASTContentIfElseControlFlowEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleSpreadExpression(Token spreadToken) {
-    DirectParserASTContentSpreadExpressionHandle data =
-        new DirectParserASTContentSpreadExpressionHandle(
-            DirectParserASTType.HANDLE,
-            spreadToken: spreadToken);
-    seen(data);
-  }
-
-  @override
-  void beginFunctionTypedFormalParameter(Token token) {
-    DirectParserASTContentFunctionTypedFormalParameterBegin data =
-        new DirectParserASTContentFunctionTypedFormalParameterBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endFunctionTypedFormalParameter(Token nameToken, Token? question) {
-    DirectParserASTContentFunctionTypedFormalParameterEnd data =
-        new DirectParserASTContentFunctionTypedFormalParameterEnd(
-            DirectParserASTType.END,
-            nameToken: nameToken,
-            question: question);
-    seen(data);
-  }
-
-  @override
-  void handleIdentifier(Token token, IdentifierContext context) {
-    DirectParserASTContentIdentifierHandle data =
-        new DirectParserASTContentIdentifierHandle(DirectParserASTType.HANDLE,
-            token: token, context: context);
-    seen(data);
-  }
-
-  @override
-  void handleShowHideIdentifier(Token? modifier, Token identifier) {
-    DirectParserASTContentShowHideIdentifierHandle data =
-        new DirectParserASTContentShowHideIdentifierHandle(
-            DirectParserASTType.HANDLE,
-            modifier: modifier,
-            identifier: identifier);
-    seen(data);
-  }
-
-  @override
-  void handleIndexedExpression(
-      Token? question, Token openSquareBracket, Token closeSquareBracket) {
-    DirectParserASTContentIndexedExpressionHandle data =
-        new DirectParserASTContentIndexedExpressionHandle(
-            DirectParserASTType.HANDLE,
-            question: question,
-            openSquareBracket: openSquareBracket,
-            closeSquareBracket: closeSquareBracket);
-    seen(data);
-  }
-
-  @override
-  void beginIsOperatorType(Token operator) {
-    DirectParserASTContentIsOperatorTypeBegin data =
-        new DirectParserASTContentIsOperatorTypeBegin(DirectParserASTType.BEGIN,
-            operator: operator);
-    seen(data);
-  }
-
-  @override
-  void endIsOperatorType(Token operator) {
-    DirectParserASTContentIsOperatorTypeEnd data =
-        new DirectParserASTContentIsOperatorTypeEnd(DirectParserASTType.END,
-            operator: operator);
-    seen(data);
-  }
-
-  @override
-  void handleIsOperator(Token isOperator, Token? not) {
-    DirectParserASTContentIsOperatorHandle data =
-        new DirectParserASTContentIsOperatorHandle(DirectParserASTType.HANDLE,
-            isOperator: isOperator, not: not);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralBool(Token token) {
-    DirectParserASTContentLiteralBoolHandle data =
-        new DirectParserASTContentLiteralBoolHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleBreakStatement(
-      bool hasTarget, Token breakKeyword, Token endToken) {
-    DirectParserASTContentBreakStatementHandle data =
-        new DirectParserASTContentBreakStatementHandle(
-            DirectParserASTType.HANDLE,
-            hasTarget: hasTarget,
-            breakKeyword: breakKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleContinueStatement(
-      bool hasTarget, Token continueKeyword, Token endToken) {
-    DirectParserASTContentContinueStatementHandle data =
-        new DirectParserASTContentContinueStatementHandle(
-            DirectParserASTType.HANDLE,
-            hasTarget: hasTarget,
-            continueKeyword: continueKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleEmptyStatement(Token token) {
-    DirectParserASTContentEmptyStatementHandle data =
-        new DirectParserASTContentEmptyStatementHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginAssert(Token assertKeyword, Assert kind) {
-    DirectParserASTContentAssertBegin data =
-        new DirectParserASTContentAssertBegin(DirectParserASTType.BEGIN,
-            assertKeyword: assertKeyword, kind: kind);
-    seen(data);
-  }
-
-  @override
-  void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
-      Token? commaToken, Token semicolonToken) {
-    DirectParserASTContentAssertEnd data = new DirectParserASTContentAssertEnd(
-        DirectParserASTType.END,
-        assertKeyword: assertKeyword,
-        kind: kind,
-        leftParenthesis: leftParenthesis,
-        commaToken: commaToken,
-        semicolonToken: semicolonToken);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralDouble(Token token) {
-    DirectParserASTContentLiteralDoubleHandle data =
-        new DirectParserASTContentLiteralDoubleHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralInt(Token token) {
-    DirectParserASTContentLiteralIntHandle data =
-        new DirectParserASTContentLiteralIntHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralList(
-      int count, Token leftBracket, Token? constKeyword, Token rightBracket) {
-    DirectParserASTContentLiteralListHandle data =
-        new DirectParserASTContentLiteralListHandle(DirectParserASTType.HANDLE,
-            count: count,
-            leftBracket: leftBracket,
-            constKeyword: constKeyword,
-            rightBracket: rightBracket);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralSetOrMap(
-    int count,
-    Token leftBrace,
-    Token? constKeyword,
-    Token rightBrace,
-    bool hasSetEntry,
-  ) {
-    DirectParserASTContentLiteralSetOrMapHandle data =
-        new DirectParserASTContentLiteralSetOrMapHandle(
-            DirectParserASTType.HANDLE,
-            count: count,
-            leftBrace: leftBrace,
-            constKeyword: constKeyword,
-            rightBrace: rightBrace,
-            hasSetEntry: hasSetEntry);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralNull(Token token) {
-    DirectParserASTContentLiteralNullHandle data =
-        new DirectParserASTContentLiteralNullHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNativeClause(Token nativeToken, bool hasName) {
-    DirectParserASTContentNativeClauseHandle data =
-        new DirectParserASTContentNativeClauseHandle(DirectParserASTType.HANDLE,
-            nativeToken: nativeToken, hasName: hasName);
-    seen(data);
-  }
-
-  @override
-  void handleNamedArgument(Token colon) {
-    DirectParserASTContentNamedArgumentHandle data =
-        new DirectParserASTContentNamedArgumentHandle(
-            DirectParserASTType.HANDLE,
-            colon: colon);
-    seen(data);
-  }
-
-  @override
-  void beginNewExpression(Token token) {
-    DirectParserASTContentNewExpressionBegin data =
-        new DirectParserASTContentNewExpressionBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endNewExpression(Token token) {
-    DirectParserASTContentNewExpressionEnd data =
-        new DirectParserASTContentNewExpressionEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNoArguments(Token token) {
-    DirectParserASTContentNoArgumentsHandle data =
-        new DirectParserASTContentNoArgumentsHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
-    DirectParserASTContentNoConstructorReferenceContinuationAfterTypeArgumentsHandle
-        data =
-        new DirectParserASTContentNoConstructorReferenceContinuationAfterTypeArgumentsHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNoType(Token lastConsumed) {
-    DirectParserASTContentNoTypeHandle data =
-        new DirectParserASTContentNoTypeHandle(DirectParserASTType.HANDLE,
-            lastConsumed: lastConsumed);
-    seen(data);
-  }
-
-  @override
-  void handleNoTypeVariables(Token token) {
-    DirectParserASTContentNoTypeVariablesHandle data =
-        new DirectParserASTContentNoTypeVariablesHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleOperator(Token token) {
-    DirectParserASTContentOperatorHandle data =
-        new DirectParserASTContentOperatorHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleSymbolVoid(Token token) {
-    DirectParserASTContentSymbolVoidHandle data =
-        new DirectParserASTContentSymbolVoidHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleOperatorName(Token operatorKeyword, Token token) {
-    DirectParserASTContentOperatorNameHandle data =
-        new DirectParserASTContentOperatorNameHandle(DirectParserASTType.HANDLE,
-            operatorKeyword: operatorKeyword, token: token);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidOperatorName(Token operatorKeyword, Token token) {
-    DirectParserASTContentInvalidOperatorNameHandle data =
-        new DirectParserASTContentInvalidOperatorNameHandle(
-            DirectParserASTType.HANDLE,
-            operatorKeyword: operatorKeyword,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleParenthesizedCondition(Token token) {
-    DirectParserASTContentParenthesizedConditionHandle data =
-        new DirectParserASTContentParenthesizedConditionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleParenthesizedExpression(Token token) {
-    DirectParserASTContentParenthesizedExpressionHandle data =
-        new DirectParserASTContentParenthesizedExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleQualified(Token period) {
-    DirectParserASTContentQualifiedHandle data =
-        new DirectParserASTContentQualifiedHandle(DirectParserASTType.HANDLE,
-            period: period);
-    seen(data);
-  }
-
-  @override
-  void handleStringPart(Token token) {
-    DirectParserASTContentStringPartHandle data =
-        new DirectParserASTContentStringPartHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleSuperExpression(Token token, IdentifierContext context) {
-    DirectParserASTContentSuperExpressionHandle data =
-        new DirectParserASTContentSuperExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            context: context);
-    seen(data);
-  }
-
-  @override
-  void beginSwitchCase(int labelCount, int expressionCount, Token firstToken) {
-    DirectParserASTContentSwitchCaseBegin data =
-        new DirectParserASTContentSwitchCaseBegin(DirectParserASTType.BEGIN,
-            labelCount: labelCount,
-            expressionCount: expressionCount,
-            firstToken: firstToken);
-    seen(data);
-  }
-
-  @override
-  void endSwitchCase(
-      int labelCount,
-      int expressionCount,
-      Token? defaultKeyword,
-      Token? colonAfterDefault,
-      int statementCount,
-      Token firstToken,
-      Token endToken) {
-    DirectParserASTContentSwitchCaseEnd data =
-        new DirectParserASTContentSwitchCaseEnd(DirectParserASTType.END,
-            labelCount: labelCount,
-            expressionCount: expressionCount,
-            defaultKeyword: defaultKeyword,
-            colonAfterDefault: colonAfterDefault,
-            statementCount: statementCount,
-            firstToken: firstToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleThisExpression(Token token, IdentifierContext context) {
-    DirectParserASTContentThisExpressionHandle data =
-        new DirectParserASTContentThisExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            context: context);
-    seen(data);
-  }
-
-  @override
-  void handleUnaryPostfixAssignmentExpression(Token token) {
-    DirectParserASTContentUnaryPostfixAssignmentExpressionHandle data =
-        new DirectParserASTContentUnaryPostfixAssignmentExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleUnaryPrefixExpression(Token token) {
-    DirectParserASTContentUnaryPrefixExpressionHandle data =
-        new DirectParserASTContentUnaryPrefixExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleUnaryPrefixAssignmentExpression(Token token) {
-    DirectParserASTContentUnaryPrefixAssignmentExpressionHandle data =
-        new DirectParserASTContentUnaryPrefixAssignmentExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginFormalParameterDefaultValueExpression() {
-    DirectParserASTContentFormalParameterDefaultValueExpressionBegin data =
-        new DirectParserASTContentFormalParameterDefaultValueExpressionBegin(
-            DirectParserASTType.BEGIN);
-    seen(data);
-  }
-
-  @override
-  void endFormalParameterDefaultValueExpression() {
-    DirectParserASTContentFormalParameterDefaultValueExpressionEnd data =
-        new DirectParserASTContentFormalParameterDefaultValueExpressionEnd(
-            DirectParserASTType.END);
-    seen(data);
-  }
-
-  @override
-  void handleValuedFormalParameter(Token equals, Token token) {
-    DirectParserASTContentValuedFormalParameterHandle data =
-        new DirectParserASTContentValuedFormalParameterHandle(
-            DirectParserASTType.HANDLE,
-            equals: equals,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleFormalParameterWithoutValue(Token token) {
-    DirectParserASTContentFormalParameterWithoutValueHandle data =
-        new DirectParserASTContentFormalParameterWithoutValueHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleVoidKeyword(Token token) {
-    DirectParserASTContentVoidKeywordHandle data =
-        new DirectParserASTContentVoidKeywordHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleVoidKeywordWithTypeArguments(Token token) {
-    DirectParserASTContentVoidKeywordWithTypeArgumentsHandle data =
-        new DirectParserASTContentVoidKeywordWithTypeArgumentsHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginYieldStatement(Token token) {
-    DirectParserASTContentYieldStatementBegin data =
-        new DirectParserASTContentYieldStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endYieldStatement(Token yieldToken, Token? starToken, Token endToken) {
-    DirectParserASTContentYieldStatementEnd data =
-        new DirectParserASTContentYieldStatementEnd(DirectParserASTType.END,
-            yieldToken: yieldToken, starToken: starToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endInvalidYieldStatement(Token beginToken, Token? starToken,
-      Token endToken, MessageCode errorCode) {
-    DirectParserASTContentInvalidYieldStatementEnd data =
-        new DirectParserASTContentInvalidYieldStatementEnd(
-            DirectParserASTType.END,
-            beginToken: beginToken,
-            starToken: starToken,
-            endToken: endToken,
-            errorCode: errorCode);
-    seen(data);
-  }
-
-  @override
-  void handleRecoverableError(
-      Message message, Token startToken, Token endToken) {
-    DirectParserASTContentRecoverableErrorHandle data =
-        new DirectParserASTContentRecoverableErrorHandle(
-            DirectParserASTType.HANDLE,
-            message: message,
-            startToken: startToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleErrorToken(ErrorToken token) {
-    DirectParserASTContentErrorTokenHandle data =
-        new DirectParserASTContentErrorTokenHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleUnescapeError(
-      Message message, Token location, int stringOffset, int length) {
-    DirectParserASTContentUnescapeErrorHandle data =
-        new DirectParserASTContentUnescapeErrorHandle(
-            DirectParserASTType.HANDLE,
-            message: message,
-            location: location,
-            stringOffset: stringOffset,
-            length: length);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidStatement(Token token, Message message) {
-    DirectParserASTContentInvalidStatementHandle data =
-        new DirectParserASTContentInvalidStatementHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            message: message);
-    seen(data);
-  }
-
-  @override
-  void handleScript(Token token) {
-    DirectParserASTContentScriptHandle data =
-        new DirectParserASTContentScriptHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleCommentReferenceText(String referenceSource, int referenceOffset) {
-    DirectParserASTContentCommentReferenceTextHandle data =
-        new DirectParserASTContentCommentReferenceTextHandle(
-            DirectParserASTType.HANDLE,
-            referenceSource: referenceSource,
-            referenceOffset: referenceOffset);
-    seen(data);
-  }
-
-  @override
-  void handleCommentReference(
-      Token? newKeyword, Token? prefix, Token? period, Token token) {
-    DirectParserASTContentCommentReferenceHandle data =
-        new DirectParserASTContentCommentReferenceHandle(
-            DirectParserASTType.HANDLE,
-            newKeyword: newKeyword,
-            prefix: prefix,
-            period: period,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNoCommentReference() {
-    DirectParserASTContentNoCommentReferenceHandle data =
-        new DirectParserASTContentNoCommentReferenceHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void handleTypeArgumentApplication(Token openAngleBracket) {
-    DirectParserASTContentTypeArgumentApplicationHandle data =
-        new DirectParserASTContentTypeArgumentApplicationHandle(
-            DirectParserASTType.HANDLE,
-            openAngleBracket: openAngleBracket);
-    seen(data);
-  }
-
-  @override
-  void handleNewAsIdentifier(Token token) {
-    DirectParserASTContentNewAsIdentifierHandle data =
-        new DirectParserASTContentNewAsIdentifierHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-}
-
-class DirectParserASTContentArgumentsBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentArgumentsBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Arguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentArgumentsEnd extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentArgumentsEnd(DirectParserASTType type,
-      {required this.count, required this.beginToken, required this.endToken})
-      : super("Arguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentAsyncModifierHandle extends DirectParserASTContent {
-  final Token? asyncToken;
-  final Token? starToken;
-
-  DirectParserASTContentAsyncModifierHandle(DirectParserASTType type,
-      {this.asyncToken, this.starToken})
-      : super("AsyncModifier", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "asyncToken": asyncToken,
-        "starToken": starToken,
-      };
-}
-
-class DirectParserASTContentAwaitExpressionBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentAwaitExpressionBegin(DirectParserASTType type,
-      {required this.token})
-      : super("AwaitExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentAwaitExpressionEnd extends DirectParserASTContent {
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentAwaitExpressionEnd(DirectParserASTType type,
-      {required this.beginToken, required this.endToken})
-      : super("AwaitExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentInvalidAwaitExpressionEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token endToken;
-  final MessageCode errorCode;
-
-  DirectParserASTContentInvalidAwaitExpressionEnd(DirectParserASTType type,
-      {required this.beginToken,
-      required this.endToken,
-      required this.errorCode})
-      : super("InvalidAwaitExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "endToken": endToken,
-        "errorCode": errorCode,
-      };
-}
-
-class DirectParserASTContentBlockBegin extends DirectParserASTContent {
-  final Token token;
-  final BlockKind blockKind;
-
-  DirectParserASTContentBlockBegin(DirectParserASTType type,
-      {required this.token, required this.blockKind})
-      : super("Block", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "blockKind": blockKind,
-      };
-}
-
-class DirectParserASTContentBlockEnd extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-  final BlockKind blockKind;
-
-  DirectParserASTContentBlockEnd(DirectParserASTType type,
-      {required this.count,
-      required this.beginToken,
-      required this.endToken,
-      required this.blockKind})
-      : super("Block", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-        "blockKind": blockKind,
-      };
-}
-
-class DirectParserASTContentInvalidTopLevelBlockHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInvalidTopLevelBlockHandle(DirectParserASTType type,
-      {required this.token})
-      : super("InvalidTopLevelBlock", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCascadeBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentCascadeBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Cascade", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCascadeEnd extends DirectParserASTContent {
-  DirectParserASTContentCascadeEnd(DirectParserASTType type)
-      : super("Cascade", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentCaseExpressionBegin extends DirectParserASTContent {
-  final Token caseKeyword;
-
-  DirectParserASTContentCaseExpressionBegin(DirectParserASTType type,
-      {required this.caseKeyword})
-      : super("CaseExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "caseKeyword": caseKeyword,
-      };
-}
-
-class DirectParserASTContentCaseExpressionEnd extends DirectParserASTContent {
-  final Token colon;
-
-  DirectParserASTContentCaseExpressionEnd(DirectParserASTType type,
-      {required this.colon})
-      : super("CaseExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "colon": colon,
-      };
-}
-
-class DirectParserASTContentClassOrMixinOrExtensionBodyBegin
-    extends DirectParserASTContent {
-  final DeclarationKind kind;
-  final Token token;
-
-  DirectParserASTContentClassOrMixinOrExtensionBodyBegin(
-      DirectParserASTType type,
-      {required this.kind,
-      required this.token})
-      : super("ClassOrMixinOrExtensionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "kind": kind,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentClassOrMixinOrExtensionBodyEnd
-    extends DirectParserASTContent {
-  final DeclarationKind kind;
-  final int memberCount;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentClassOrMixinOrExtensionBodyEnd(DirectParserASTType type,
-      {required this.kind,
-      required this.memberCount,
-      required this.beginToken,
-      required this.endToken})
-      : super("ClassOrMixinOrExtensionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "kind": kind,
-        "memberCount": memberCount,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin(
-      DirectParserASTType type,
-      {required this.token})
-      : super("ClassOrMixinOrNamedMixinApplicationPrelude", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentClassDeclarationBegin
-    extends DirectParserASTContent {
-  final Token begin;
-  final Token? abstractToken;
-  final Token name;
-
-  DirectParserASTContentClassDeclarationBegin(DirectParserASTType type,
-      {required this.begin, this.abstractToken, required this.name})
-      : super("ClassDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "begin": begin,
-        "abstractToken": abstractToken,
-        "name": name,
-      };
-}
-
-class DirectParserASTContentClassExtendsHandle extends DirectParserASTContent {
-  final Token? extendsKeyword;
-  final int typeCount;
-
-  DirectParserASTContentClassExtendsHandle(DirectParserASTType type,
-      {this.extendsKeyword, required this.typeCount})
-      : super("ClassExtends", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "extendsKeyword": extendsKeyword,
-        "typeCount": typeCount,
-      };
-}
-
-class DirectParserASTContentClassOrMixinImplementsHandle
-    extends DirectParserASTContent {
-  final Token? implementsKeyword;
-  final int interfacesCount;
-
-  DirectParserASTContentClassOrMixinImplementsHandle(DirectParserASTType type,
-      {this.implementsKeyword, required this.interfacesCount})
-      : super("ClassOrMixinImplements", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "implementsKeyword": implementsKeyword,
-        "interfacesCount": interfacesCount,
-      };
-}
-
-class DirectParserASTContentExtensionShowHideHandle
-    extends DirectParserASTContent {
-  final Token? showKeyword;
-  final int showElementCount;
-  final Token? hideKeyword;
-  final int hideElementCount;
-
-  DirectParserASTContentExtensionShowHideHandle(DirectParserASTType type,
-      {this.showKeyword,
-      required this.showElementCount,
-      this.hideKeyword,
-      required this.hideElementCount})
-      : super("ExtensionShowHide", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "showKeyword": showKeyword,
-        "showElementCount": showElementCount,
-        "hideKeyword": hideKeyword,
-        "hideElementCount": hideElementCount,
-      };
-}
-
-class DirectParserASTContentClassHeaderHandle extends DirectParserASTContent {
-  final Token begin;
-  final Token classKeyword;
-  final Token? nativeToken;
-
-  DirectParserASTContentClassHeaderHandle(DirectParserASTType type,
-      {required this.begin, required this.classKeyword, this.nativeToken})
-      : super("ClassHeader", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "begin": begin,
-        "classKeyword": classKeyword,
-        "nativeToken": nativeToken,
-      };
-}
-
-class DirectParserASTContentRecoverClassHeaderHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentRecoverClassHeaderHandle(DirectParserASTType type)
-      : super("RecoverClassHeader", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentClassDeclarationEnd extends DirectParserASTContent {
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentClassDeclarationEnd(DirectParserASTType type,
-      {required this.beginToken, required this.endToken})
-      : super("ClassDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMixinDeclarationBegin
-    extends DirectParserASTContent {
-  final Token mixinKeyword;
-  final Token name;
-
-  DirectParserASTContentMixinDeclarationBegin(DirectParserASTType type,
-      {required this.mixinKeyword, required this.name})
-      : super("MixinDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "mixinKeyword": mixinKeyword,
-        "name": name,
-      };
-}
-
-class DirectParserASTContentMixinOnHandle extends DirectParserASTContent {
-  final Token? onKeyword;
-  final int typeCount;
-
-  DirectParserASTContentMixinOnHandle(DirectParserASTType type,
-      {this.onKeyword, required this.typeCount})
-      : super("MixinOn", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "onKeyword": onKeyword,
-        "typeCount": typeCount,
-      };
-}
-
-class DirectParserASTContentMixinHeaderHandle extends DirectParserASTContent {
-  final Token mixinKeyword;
-
-  DirectParserASTContentMixinHeaderHandle(DirectParserASTType type,
-      {required this.mixinKeyword})
-      : super("MixinHeader", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "mixinKeyword": mixinKeyword,
-      };
-}
-
-class DirectParserASTContentRecoverMixinHeaderHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentRecoverMixinHeaderHandle(DirectParserASTType type)
-      : super("RecoverMixinHeader", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentMixinDeclarationEnd extends DirectParserASTContent {
-  final Token mixinKeyword;
-  final Token endToken;
-
-  DirectParserASTContentMixinDeclarationEnd(DirectParserASTType type,
-      {required this.mixinKeyword, required this.endToken})
-      : super("MixinDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "mixinKeyword": mixinKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentUncategorizedTopLevelDeclarationBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentUncategorizedTopLevelDeclarationBegin(
-      DirectParserASTType type,
-      {required this.token})
-      : super("UncategorizedTopLevelDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentExtensionDeclarationPreludeBegin
-    extends DirectParserASTContent {
-  final Token extensionKeyword;
-
-  DirectParserASTContentExtensionDeclarationPreludeBegin(
-      DirectParserASTType type,
-      {required this.extensionKeyword})
-      : super("ExtensionDeclarationPrelude", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "extensionKeyword": extensionKeyword,
-      };
-}
-
-class DirectParserASTContentExtensionDeclarationBegin
-    extends DirectParserASTContent {
-  final Token extensionKeyword;
-  final Token? name;
-
-  DirectParserASTContentExtensionDeclarationBegin(DirectParserASTType type,
-      {required this.extensionKeyword, this.name})
-      : super("ExtensionDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "extensionKeyword": extensionKeyword,
-        "name": name,
-      };
-}
-
-class DirectParserASTContentExtensionDeclarationEnd
-    extends DirectParserASTContent {
-  final Token extensionKeyword;
-  final Token? typeKeyword;
-  final Token onKeyword;
-  final Token? showKeyword;
-  final Token? hideKeyword;
-  final Token endToken;
-
-  DirectParserASTContentExtensionDeclarationEnd(DirectParserASTType type,
-      {required this.extensionKeyword,
-      this.typeKeyword,
-      required this.onKeyword,
-      this.showKeyword,
-      this.hideKeyword,
-      required this.endToken})
-      : super("ExtensionDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "extensionKeyword": extensionKeyword,
-        "typeKeyword": typeKeyword,
-        "onKeyword": onKeyword,
-        "showKeyword": showKeyword,
-        "hideKeyword": hideKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentCombinatorsBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentCombinatorsBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Combinators", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCombinatorsEnd extends DirectParserASTContent {
-  final int count;
-
-  DirectParserASTContentCombinatorsEnd(DirectParserASTType type,
-      {required this.count})
-      : super("Combinators", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-      };
-}
-
-class DirectParserASTContentCompilationUnitBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentCompilationUnitBegin(DirectParserASTType type,
-      {required this.token})
-      : super("CompilationUnit", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentDirectivesOnlyHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentDirectivesOnlyHandle(DirectParserASTType type)
-      : super("DirectivesOnly", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentCompilationUnitEnd extends DirectParserASTContent {
-  final int count;
-  final Token token;
-
-  DirectParserASTContentCompilationUnitEnd(DirectParserASTType type,
-      {required this.count, required this.token})
-      : super("CompilationUnit", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentConstLiteralBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentConstLiteralBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ConstLiteral", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentConstLiteralEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentConstLiteralEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ConstLiteral", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentConstructorReferenceBegin
-    extends DirectParserASTContent {
-  final Token start;
-
-  DirectParserASTContentConstructorReferenceBegin(DirectParserASTType type,
-      {required this.start})
-      : super("ConstructorReference", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "start": start,
-      };
-}
-
-class DirectParserASTContentConstructorReferenceEnd
-    extends DirectParserASTContent {
-  final Token start;
-  final Token? periodBeforeName;
-  final Token endToken;
-  final ConstructorReferenceContext constructorReferenceContext;
-
-  DirectParserASTContentConstructorReferenceEnd(DirectParserASTType type,
-      {required this.start,
-      this.periodBeforeName,
-      required this.endToken,
-      required this.constructorReferenceContext})
-      : super("ConstructorReference", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "start": start,
-        "periodBeforeName": periodBeforeName,
-        "endToken": endToken,
-        "constructorReferenceContext": constructorReferenceContext,
-      };
-}
-
-class DirectParserASTContentDoWhileStatementBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentDoWhileStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("DoWhileStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentDoWhileStatementEnd extends DirectParserASTContent {
-  final Token doKeyword;
-  final Token whileKeyword;
-  final Token endToken;
-
-  DirectParserASTContentDoWhileStatementEnd(DirectParserASTType type,
-      {required this.doKeyword,
-      required this.whileKeyword,
-      required this.endToken})
-      : super("DoWhileStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "doKeyword": doKeyword,
-        "whileKeyword": whileKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentDoWhileStatementBodyBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentDoWhileStatementBodyBegin(DirectParserASTType type,
-      {required this.token})
-      : super("DoWhileStatementBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentDoWhileStatementBodyEnd
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentDoWhileStatementBodyEnd(DirectParserASTType type,
-      {required this.token})
-      : super("DoWhileStatementBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentWhileStatementBodyBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentWhileStatementBodyBegin(DirectParserASTType type,
-      {required this.token})
-      : super("WhileStatementBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentWhileStatementBodyEnd
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentWhileStatementBodyEnd(DirectParserASTType type,
-      {required this.token})
-      : super("WhileStatementBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentEnumBegin extends DirectParserASTContent {
-  final Token enumKeyword;
-
-  DirectParserASTContentEnumBegin(DirectParserASTType type,
-      {required this.enumKeyword})
-      : super("Enum", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "enumKeyword": enumKeyword,
-      };
-}
-
-class DirectParserASTContentEnumEnd extends DirectParserASTContent {
-  final Token enumKeyword;
-  final Token leftBrace;
-  final int count;
-
-  DirectParserASTContentEnumEnd(DirectParserASTType type,
-      {required this.enumKeyword, required this.leftBrace, required this.count})
-      : super("Enum", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "enumKeyword": enumKeyword,
-        "leftBrace": leftBrace,
-        "count": count,
-      };
-}
-
-class DirectParserASTContentExportBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentExportBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Export", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentExportEnd extends DirectParserASTContent {
-  final Token exportKeyword;
-  final Token semicolon;
-
-  DirectParserASTContentExportEnd(DirectParserASTType type,
-      {required this.exportKeyword, required this.semicolon})
-      : super("Export", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "exportKeyword": exportKeyword,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentExtraneousExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final Message message;
-
-  DirectParserASTContentExtraneousExpressionHandle(DirectParserASTType type,
-      {required this.token, required this.message})
-      : super("ExtraneousExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "message": message,
-      };
-}
-
-class DirectParserASTContentExpressionStatementHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentExpressionStatementHandle(DirectParserASTType type,
-      {required this.token})
-      : super("ExpressionStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFactoryMethodBegin extends DirectParserASTContent {
-  final DeclarationKind declarationKind;
-  final Token lastConsumed;
-  final Token? externalToken;
-  final Token? constToken;
-
-  DirectParserASTContentFactoryMethodBegin(DirectParserASTType type,
-      {required this.declarationKind,
-      required this.lastConsumed,
-      this.externalToken,
-      this.constToken})
-      : super("FactoryMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "declarationKind": declarationKind,
-        "lastConsumed": lastConsumed,
-        "externalToken": externalToken,
-        "constToken": constToken,
-      };
-}
-
-class DirectParserASTContentClassFactoryMethodEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token factoryKeyword;
-  final Token endToken;
-
-  DirectParserASTContentClassFactoryMethodEnd(DirectParserASTType type,
-      {required this.beginToken,
-      required this.factoryKeyword,
-      required this.endToken})
-      : super("ClassFactoryMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "factoryKeyword": factoryKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMixinFactoryMethodEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token factoryKeyword;
-  final Token endToken;
-
-  DirectParserASTContentMixinFactoryMethodEnd(DirectParserASTType type,
-      {required this.beginToken,
-      required this.factoryKeyword,
-      required this.endToken})
-      : super("MixinFactoryMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "factoryKeyword": factoryKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentExtensionFactoryMethodEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token factoryKeyword;
-  final Token endToken;
-
-  DirectParserASTContentExtensionFactoryMethodEnd(DirectParserASTType type,
-      {required this.beginToken,
-      required this.factoryKeyword,
-      required this.endToken})
-      : super("ExtensionFactoryMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "factoryKeyword": factoryKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentFormalParameterBegin
-    extends DirectParserASTContent {
-  final Token token;
-  final MemberKind kind;
-  final Token? requiredToken;
-  final Token? covariantToken;
-  final Token? varFinalOrConst;
-
-  DirectParserASTContentFormalParameterBegin(DirectParserASTType type,
-      {required this.token,
-      required this.kind,
-      this.requiredToken,
-      this.covariantToken,
-      this.varFinalOrConst})
-      : super("FormalParameter", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "kind": kind,
-        "requiredToken": requiredToken,
-        "covariantToken": covariantToken,
-        "varFinalOrConst": varFinalOrConst,
-      };
-}
-
-class DirectParserASTContentFormalParameterEnd extends DirectParserASTContent {
-  final Token? thisKeyword;
-  final Token? periodAfterThis;
-  final Token nameToken;
-  final Token? initializerStart;
-  final Token? initializerEnd;
-  final FormalParameterKind kind;
-  final MemberKind memberKind;
-
-  DirectParserASTContentFormalParameterEnd(DirectParserASTType type,
-      {this.thisKeyword,
-      this.periodAfterThis,
-      required this.nameToken,
-      this.initializerStart,
-      this.initializerEnd,
-      required this.kind,
-      required this.memberKind})
-      : super("FormalParameter", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "thisKeyword": thisKeyword,
-        "periodAfterThis": periodAfterThis,
-        "nameToken": nameToken,
-        "initializerStart": initializerStart,
-        "initializerEnd": initializerEnd,
-        "kind": kind,
-        "memberKind": memberKind,
-      };
-}
-
-class DirectParserASTContentNoFormalParametersHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final MemberKind kind;
-
-  DirectParserASTContentNoFormalParametersHandle(DirectParserASTType type,
-      {required this.token, required this.kind})
-      : super("NoFormalParameters", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "kind": kind,
-      };
-}
-
-class DirectParserASTContentFormalParametersBegin
-    extends DirectParserASTContent {
-  final Token token;
-  final MemberKind kind;
-
-  DirectParserASTContentFormalParametersBegin(DirectParserASTType type,
-      {required this.token, required this.kind})
-      : super("FormalParameters", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "kind": kind,
-      };
-}
-
-class DirectParserASTContentFormalParametersEnd extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-  final MemberKind kind;
-
-  DirectParserASTContentFormalParametersEnd(DirectParserASTType type,
-      {required this.count,
-      required this.beginToken,
-      required this.endToken,
-      required this.kind})
-      : super("FormalParameters", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-        "kind": kind,
-      };
-}
-
-class DirectParserASTContentClassFieldsEnd extends DirectParserASTContent {
-  final Token? abstractToken;
-  final Token? externalToken;
-  final Token? staticToken;
-  final Token? covariantToken;
-  final Token? lateToken;
-  final Token? varFinalOrConst;
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentClassFieldsEnd(DirectParserASTType type,
-      {this.abstractToken,
-      this.externalToken,
-      this.staticToken,
-      this.covariantToken,
-      this.lateToken,
-      this.varFinalOrConst,
-      required this.count,
-      required this.beginToken,
-      required this.endToken})
-      : super("ClassFields", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "abstractToken": abstractToken,
-        "externalToken": externalToken,
-        "staticToken": staticToken,
-        "covariantToken": covariantToken,
-        "lateToken": lateToken,
-        "varFinalOrConst": varFinalOrConst,
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMixinFieldsEnd extends DirectParserASTContent {
-  final Token? abstractToken;
-  final Token? externalToken;
-  final Token? staticToken;
-  final Token? covariantToken;
-  final Token? lateToken;
-  final Token? varFinalOrConst;
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentMixinFieldsEnd(DirectParserASTType type,
-      {this.abstractToken,
-      this.externalToken,
-      this.staticToken,
-      this.covariantToken,
-      this.lateToken,
-      this.varFinalOrConst,
-      required this.count,
-      required this.beginToken,
-      required this.endToken})
-      : super("MixinFields", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "abstractToken": abstractToken,
-        "externalToken": externalToken,
-        "staticToken": staticToken,
-        "covariantToken": covariantToken,
-        "lateToken": lateToken,
-        "varFinalOrConst": varFinalOrConst,
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentExtensionFieldsEnd extends DirectParserASTContent {
-  final Token? abstractToken;
-  final Token? externalToken;
-  final Token? staticToken;
-  final Token? covariantToken;
-  final Token? lateToken;
-  final Token? varFinalOrConst;
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentExtensionFieldsEnd(DirectParserASTType type,
-      {this.abstractToken,
-      this.externalToken,
-      this.staticToken,
-      this.covariantToken,
-      this.lateToken,
-      this.varFinalOrConst,
-      required this.count,
-      required this.beginToken,
-      required this.endToken})
-      : super("ExtensionFields", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "abstractToken": abstractToken,
-        "externalToken": externalToken,
-        "staticToken": staticToken,
-        "covariantToken": covariantToken,
-        "lateToken": lateToken,
-        "varFinalOrConst": varFinalOrConst,
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentForInitializerEmptyStatementHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForInitializerEmptyStatementHandle(
-      DirectParserASTType type,
-      {required this.token})
-      : super("ForInitializerEmptyStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForInitializerExpressionStatementHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final bool forIn;
-
-  DirectParserASTContentForInitializerExpressionStatementHandle(
-      DirectParserASTType type,
-      {required this.token,
-      required this.forIn})
-      : super("ForInitializerExpressionStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "forIn": forIn,
-      };
-}
-
-class DirectParserASTContentForInitializerLocalVariableDeclarationHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final bool forIn;
-
-  DirectParserASTContentForInitializerLocalVariableDeclarationHandle(
-      DirectParserASTType type,
-      {required this.token,
-      required this.forIn})
-      : super("ForInitializerLocalVariableDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "forIn": forIn,
-      };
-}
-
-class DirectParserASTContentForStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ForStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForLoopPartsHandle extends DirectParserASTContent {
-  final Token forKeyword;
-  final Token leftParen;
-  final Token leftSeparator;
-  final int updateExpressionCount;
-
-  DirectParserASTContentForLoopPartsHandle(DirectParserASTType type,
-      {required this.forKeyword,
-      required this.leftParen,
-      required this.leftSeparator,
-      required this.updateExpressionCount})
-      : super("ForLoopParts", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "forKeyword": forKeyword,
-        "leftParen": leftParen,
-        "leftSeparator": leftSeparator,
-        "updateExpressionCount": updateExpressionCount,
-      };
-}
-
-class DirectParserASTContentForStatementEnd extends DirectParserASTContent {
-  final Token endToken;
-
-  DirectParserASTContentForStatementEnd(DirectParserASTType type,
-      {required this.endToken})
-      : super("ForStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentForStatementBodyBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForStatementBodyBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ForStatementBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForStatementBodyEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForStatementBodyEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ForStatementBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForInLoopPartsHandle
-    extends DirectParserASTContent {
-  final Token? awaitToken;
-  final Token forToken;
-  final Token leftParenthesis;
-  final Token inKeyword;
-
-  DirectParserASTContentForInLoopPartsHandle(DirectParserASTType type,
-      {this.awaitToken,
-      required this.forToken,
-      required this.leftParenthesis,
-      required this.inKeyword})
-      : super("ForInLoopParts", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "awaitToken": awaitToken,
-        "forToken": forToken,
-        "leftParenthesis": leftParenthesis,
-        "inKeyword": inKeyword,
-      };
-}
-
-class DirectParserASTContentForInEnd extends DirectParserASTContent {
-  final Token endToken;
-
-  DirectParserASTContentForInEnd(DirectParserASTType type,
-      {required this.endToken})
-      : super("ForIn", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentForInExpressionBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForInExpressionBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ForInExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForInExpressionEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForInExpressionEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ForInExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForInBodyBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForInBodyBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ForInBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForInBodyEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForInBodyEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ForInBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNamedFunctionExpressionBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNamedFunctionExpressionBegin(DirectParserASTType type,
-      {required this.token})
-      : super("NamedFunctionExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNamedFunctionExpressionEnd
-    extends DirectParserASTContent {
-  final Token endToken;
-
-  DirectParserASTContentNamedFunctionExpressionEnd(DirectParserASTType type,
-      {required this.endToken})
-      : super("NamedFunctionExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentLocalFunctionDeclarationBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLocalFunctionDeclarationBegin(DirectParserASTType type,
-      {required this.token})
-      : super("LocalFunctionDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLocalFunctionDeclarationEnd
-    extends DirectParserASTContent {
-  final Token endToken;
-
-  DirectParserASTContentLocalFunctionDeclarationEnd(DirectParserASTType type,
-      {required this.endToken})
-      : super("LocalFunctionDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentBlockFunctionBodyBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentBlockFunctionBodyBegin(DirectParserASTType type,
-      {required this.token})
-      : super("BlockFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentBlockFunctionBodyEnd
-    extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentBlockFunctionBodyEnd(DirectParserASTType type,
-      {required this.count, required this.beginToken, required this.endToken})
-      : super("BlockFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentNoFunctionBodyHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoFunctionBodyHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFunctionBodySkippedHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final bool isExpressionBody;
-
-  DirectParserASTContentFunctionBodySkippedHandle(DirectParserASTType type,
-      {required this.token, required this.isExpressionBody})
-      : super("FunctionBodySkipped", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "isExpressionBody": isExpressionBody,
-      };
-}
-
-class DirectParserASTContentFunctionNameBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentFunctionNameBegin(DirectParserASTType type,
-      {required this.token})
-      : super("FunctionName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFunctionNameEnd extends DirectParserASTContent {
-  final Token beginToken;
-  final Token token;
-
-  DirectParserASTContentFunctionNameEnd(DirectParserASTType type,
-      {required this.beginToken, required this.token})
-      : super("FunctionName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypedefBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTypedefBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Typedef", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypedefEnd extends DirectParserASTContent {
-  final Token typedefKeyword;
-  final Token? equals;
-  final Token endToken;
-
-  DirectParserASTContentTypedefEnd(DirectParserASTType type,
-      {required this.typedefKeyword, this.equals, required this.endToken})
-      : super("Typedef", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "typedefKeyword": typedefKeyword,
-        "equals": equals,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentClassWithClauseHandle
-    extends DirectParserASTContent {
-  final Token withKeyword;
-
-  DirectParserASTContentClassWithClauseHandle(DirectParserASTType type,
-      {required this.withKeyword})
-      : super("ClassWithClause", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "withKeyword": withKeyword,
-      };
-}
-
-class DirectParserASTContentClassNoWithClauseHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentClassNoWithClauseHandle(DirectParserASTType type)
-      : super("ClassNoWithClause", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentNamedMixinApplicationBegin
-    extends DirectParserASTContent {
-  final Token begin;
-  final Token? abstractToken;
-  final Token name;
-
-  DirectParserASTContentNamedMixinApplicationBegin(DirectParserASTType type,
-      {required this.begin, this.abstractToken, required this.name})
-      : super("NamedMixinApplication", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "begin": begin,
-        "abstractToken": abstractToken,
-        "name": name,
-      };
-}
-
-class DirectParserASTContentNamedMixinApplicationWithClauseHandle
-    extends DirectParserASTContent {
-  final Token withKeyword;
-
-  DirectParserASTContentNamedMixinApplicationWithClauseHandle(
-      DirectParserASTType type,
-      {required this.withKeyword})
-      : super("NamedMixinApplicationWithClause", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "withKeyword": withKeyword,
-      };
-}
-
-class DirectParserASTContentNamedMixinApplicationEnd
-    extends DirectParserASTContent {
-  final Token begin;
-  final Token classKeyword;
-  final Token equals;
-  final Token? implementsKeyword;
-  final Token endToken;
-
-  DirectParserASTContentNamedMixinApplicationEnd(DirectParserASTType type,
-      {required this.begin,
-      required this.classKeyword,
-      required this.equals,
-      this.implementsKeyword,
-      required this.endToken})
-      : super("NamedMixinApplication", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "begin": begin,
-        "classKeyword": classKeyword,
-        "equals": equals,
-        "implementsKeyword": implementsKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentHideBegin extends DirectParserASTContent {
-  final Token hideKeyword;
-
-  DirectParserASTContentHideBegin(DirectParserASTType type,
-      {required this.hideKeyword})
-      : super("Hide", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "hideKeyword": hideKeyword,
-      };
-}
-
-class DirectParserASTContentHideEnd extends DirectParserASTContent {
-  final Token hideKeyword;
-
-  DirectParserASTContentHideEnd(DirectParserASTType type,
-      {required this.hideKeyword})
-      : super("Hide", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "hideKeyword": hideKeyword,
-      };
-}
-
-class DirectParserASTContentIdentifierListHandle
-    extends DirectParserASTContent {
-  final int count;
-
-  DirectParserASTContentIdentifierListHandle(DirectParserASTType type,
-      {required this.count})
-      : super("IdentifierList", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-      };
-}
-
-class DirectParserASTContentTypeListBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTypeListBegin(DirectParserASTType type,
-      {required this.token})
-      : super("TypeList", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypeListEnd extends DirectParserASTContent {
-  final int count;
-
-  DirectParserASTContentTypeListEnd(DirectParserASTType type,
-      {required this.count})
-      : super("TypeList", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-      };
-}
-
-class DirectParserASTContentIfStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentIfStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("IfStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentIfStatementEnd extends DirectParserASTContent {
-  final Token ifToken;
-  final Token? elseToken;
-
-  DirectParserASTContentIfStatementEnd(DirectParserASTType type,
-      {required this.ifToken, this.elseToken})
-      : super("IfStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "ifToken": ifToken,
-        "elseToken": elseToken,
-      };
-}
-
-class DirectParserASTContentThenStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentThenStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ThenStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentThenStatementEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentThenStatementEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ThenStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentElseStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentElseStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ElseStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentElseStatementEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentElseStatementEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ElseStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentImportBegin extends DirectParserASTContent {
-  final Token importKeyword;
-
-  DirectParserASTContentImportBegin(DirectParserASTType type,
-      {required this.importKeyword})
-      : super("Import", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "importKeyword": importKeyword,
-      };
-}
-
-class DirectParserASTContentImportPrefixHandle extends DirectParserASTContent {
-  final Token? deferredKeyword;
-  final Token? asKeyword;
-
-  DirectParserASTContentImportPrefixHandle(DirectParserASTType type,
-      {this.deferredKeyword, this.asKeyword})
-      : super("ImportPrefix", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "deferredKeyword": deferredKeyword,
-        "asKeyword": asKeyword,
-      };
-}
-
-class DirectParserASTContentImportEnd extends DirectParserASTContent {
-  final Token importKeyword;
-  final Token? semicolon;
-
-  DirectParserASTContentImportEnd(DirectParserASTType type,
-      {required this.importKeyword, this.semicolon})
-      : super("Import", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "importKeyword": importKeyword,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentRecoverImportHandle extends DirectParserASTContent {
-  final Token? semicolon;
-
-  DirectParserASTContentRecoverImportHandle(DirectParserASTType type,
-      {this.semicolon})
-      : super("RecoverImport", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentConditionalUrisBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentConditionalUrisBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ConditionalUris", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentConditionalUrisEnd extends DirectParserASTContent {
-  final int count;
-
-  DirectParserASTContentConditionalUrisEnd(DirectParserASTType type,
-      {required this.count})
-      : super("ConditionalUris", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-      };
-}
-
-class DirectParserASTContentConditionalUriBegin extends DirectParserASTContent {
-  final Token ifKeyword;
-
-  DirectParserASTContentConditionalUriBegin(DirectParserASTType type,
-      {required this.ifKeyword})
-      : super("ConditionalUri", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "ifKeyword": ifKeyword,
-      };
-}
-
-class DirectParserASTContentConditionalUriEnd extends DirectParserASTContent {
-  final Token ifKeyword;
-  final Token leftParen;
-  final Token? equalSign;
-
-  DirectParserASTContentConditionalUriEnd(DirectParserASTType type,
-      {required this.ifKeyword, required this.leftParen, this.equalSign})
-      : super("ConditionalUri", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "ifKeyword": ifKeyword,
-        "leftParen": leftParen,
-        "equalSign": equalSign,
-      };
-}
-
-class DirectParserASTContentDottedNameHandle extends DirectParserASTContent {
-  final int count;
-  final Token firstIdentifier;
-
-  DirectParserASTContentDottedNameHandle(DirectParserASTType type,
-      {required this.count, required this.firstIdentifier})
-      : super("DottedName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "firstIdentifier": firstIdentifier,
-      };
-}
-
-class DirectParserASTContentImplicitCreationExpressionBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentImplicitCreationExpressionBegin(
-      DirectParserASTType type,
-      {required this.token})
-      : super("ImplicitCreationExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentImplicitCreationExpressionEnd
-    extends DirectParserASTContent {
-  final Token token;
-  final Token openAngleBracket;
-
-  DirectParserASTContentImplicitCreationExpressionEnd(DirectParserASTType type,
-      {required this.token, required this.openAngleBracket})
-      : super("ImplicitCreationExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "openAngleBracket": openAngleBracket,
-      };
-}
-
-class DirectParserASTContentInitializedIdentifierBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInitializedIdentifierBegin(DirectParserASTType type,
-      {required this.token})
-      : super("InitializedIdentifier", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInitializedIdentifierEnd
-    extends DirectParserASTContent {
-  final Token nameToken;
-
-  DirectParserASTContentInitializedIdentifierEnd(DirectParserASTType type,
-      {required this.nameToken})
-      : super("InitializedIdentifier", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nameToken": nameToken,
-      };
-}
-
-class DirectParserASTContentFieldInitializerBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentFieldInitializerBegin(DirectParserASTType type,
-      {required this.token})
-      : super("FieldInitializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFieldInitializerEnd extends DirectParserASTContent {
-  final Token assignment;
-  final Token token;
-
-  DirectParserASTContentFieldInitializerEnd(DirectParserASTType type,
-      {required this.assignment, required this.token})
-      : super("FieldInitializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "assignment": assignment,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNoFieldInitializerHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoFieldInitializerHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoFieldInitializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentVariableInitializerBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentVariableInitializerBegin(DirectParserASTType type,
-      {required this.token})
-      : super("VariableInitializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentVariableInitializerEnd
-    extends DirectParserASTContent {
-  final Token assignmentOperator;
-
-  DirectParserASTContentVariableInitializerEnd(DirectParserASTType type,
-      {required this.assignmentOperator})
-      : super("VariableInitializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "assignmentOperator": assignmentOperator,
-      };
-}
-
-class DirectParserASTContentNoVariableInitializerHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoVariableInitializerHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoVariableInitializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInitializerBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInitializerBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Initializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInitializerEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInitializerEnd(DirectParserASTType type,
-      {required this.token})
-      : super("Initializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInitializersBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInitializersBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Initializers", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInitializersEnd extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentInitializersEnd(DirectParserASTType type,
-      {required this.count, required this.beginToken, required this.endToken})
-      : super("Initializers", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentNoInitializersHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentNoInitializersHandle(DirectParserASTType type)
-      : super("NoInitializers", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentInvalidExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInvalidExpressionHandle(DirectParserASTType type,
-      {required this.token})
-      : super("InvalidExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInvalidFunctionBodyHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInvalidFunctionBodyHandle(DirectParserASTType type,
-      {required this.token})
-      : super("InvalidFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInvalidTypeReferenceHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInvalidTypeReferenceHandle(DirectParserASTType type,
-      {required this.token})
-      : super("InvalidTypeReference", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLabelHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLabelHandle(DirectParserASTType type,
-      {required this.token})
-      : super("Label", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLabeledStatementBegin
-    extends DirectParserASTContent {
-  final Token token;
-  final int labelCount;
-
-  DirectParserASTContentLabeledStatementBegin(DirectParserASTType type,
-      {required this.token, required this.labelCount})
-      : super("LabeledStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "labelCount": labelCount,
-      };
-}
-
-class DirectParserASTContentLabeledStatementEnd extends DirectParserASTContent {
-  final int labelCount;
-
-  DirectParserASTContentLabeledStatementEnd(DirectParserASTType type,
-      {required this.labelCount})
-      : super("LabeledStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "labelCount": labelCount,
-      };
-}
-
-class DirectParserASTContentLibraryNameBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLibraryNameBegin(DirectParserASTType type,
-      {required this.token})
-      : super("LibraryName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLibraryNameEnd extends DirectParserASTContent {
-  final Token libraryKeyword;
-  final Token semicolon;
-
-  DirectParserASTContentLibraryNameEnd(DirectParserASTType type,
-      {required this.libraryKeyword, required this.semicolon})
-      : super("LibraryName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "libraryKeyword": libraryKeyword,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentLiteralMapEntryHandle
-    extends DirectParserASTContent {
-  final Token colon;
-  final Token endToken;
-
-  DirectParserASTContentLiteralMapEntryHandle(DirectParserASTType type,
-      {required this.colon, required this.endToken})
-      : super("LiteralMapEntry", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "colon": colon,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentLiteralStringBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLiteralStringBegin(DirectParserASTType type,
-      {required this.token})
-      : super("LiteralString", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInterpolationExpressionHandle
-    extends DirectParserASTContent {
-  final Token leftBracket;
-  final Token? rightBracket;
-
-  DirectParserASTContentInterpolationExpressionHandle(DirectParserASTType type,
-      {required this.leftBracket, this.rightBracket})
-      : super("InterpolationExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "leftBracket": leftBracket,
-        "rightBracket": rightBracket,
-      };
-}
-
-class DirectParserASTContentLiteralStringEnd extends DirectParserASTContent {
-  final int interpolationCount;
-  final Token endToken;
-
-  DirectParserASTContentLiteralStringEnd(DirectParserASTType type,
-      {required this.interpolationCount, required this.endToken})
-      : super("LiteralString", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "interpolationCount": interpolationCount,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentStringJuxtapositionHandle
-    extends DirectParserASTContent {
-  final Token startToken;
-  final int literalCount;
-
-  DirectParserASTContentStringJuxtapositionHandle(DirectParserASTType type,
-      {required this.startToken, required this.literalCount})
-      : super("StringJuxtaposition", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "startToken": startToken,
-        "literalCount": literalCount,
-      };
-}
-
-class DirectParserASTContentMemberBegin extends DirectParserASTContent {
-  DirectParserASTContentMemberBegin(DirectParserASTType type)
-      : super("Member", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentInvalidMemberHandle extends DirectParserASTContent {
-  final Token endToken;
-
-  DirectParserASTContentInvalidMemberHandle(DirectParserASTType type,
-      {required this.endToken})
-      : super("InvalidMember", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMemberEnd extends DirectParserASTContent {
-  DirectParserASTContentMemberEnd(DirectParserASTType type)
-      : super("Member", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentMethodBegin extends DirectParserASTContent {
-  final DeclarationKind declarationKind;
-  final Token? externalToken;
-  final Token? staticToken;
-  final Token? covariantToken;
-  final Token? varFinalOrConst;
-  final Token? getOrSet;
-  final Token name;
-
-  DirectParserASTContentMethodBegin(DirectParserASTType type,
-      {required this.declarationKind,
-      this.externalToken,
-      this.staticToken,
-      this.covariantToken,
-      this.varFinalOrConst,
-      this.getOrSet,
-      required this.name})
-      : super("Method", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "declarationKind": declarationKind,
-        "externalToken": externalToken,
-        "staticToken": staticToken,
-        "covariantToken": covariantToken,
-        "varFinalOrConst": varFinalOrConst,
-        "getOrSet": getOrSet,
-        "name": name,
-      };
-}
-
-class DirectParserASTContentClassMethodEnd extends DirectParserASTContent {
-  final Token? getOrSet;
-  final Token beginToken;
-  final Token beginParam;
-  final Token? beginInitializers;
-  final Token endToken;
-
-  DirectParserASTContentClassMethodEnd(DirectParserASTType type,
-      {this.getOrSet,
-      required this.beginToken,
-      required this.beginParam,
-      this.beginInitializers,
-      required this.endToken})
-      : super("ClassMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "getOrSet": getOrSet,
-        "beginToken": beginToken,
-        "beginParam": beginParam,
-        "beginInitializers": beginInitializers,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMixinMethodEnd extends DirectParserASTContent {
-  final Token? getOrSet;
-  final Token beginToken;
-  final Token beginParam;
-  final Token? beginInitializers;
-  final Token endToken;
-
-  DirectParserASTContentMixinMethodEnd(DirectParserASTType type,
-      {this.getOrSet,
-      required this.beginToken,
-      required this.beginParam,
-      this.beginInitializers,
-      required this.endToken})
-      : super("MixinMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "getOrSet": getOrSet,
-        "beginToken": beginToken,
-        "beginParam": beginParam,
-        "beginInitializers": beginInitializers,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentExtensionMethodEnd extends DirectParserASTContent {
-  final Token? getOrSet;
-  final Token beginToken;
-  final Token beginParam;
-  final Token? beginInitializers;
-  final Token endToken;
-
-  DirectParserASTContentExtensionMethodEnd(DirectParserASTType type,
-      {this.getOrSet,
-      required this.beginToken,
-      required this.beginParam,
-      this.beginInitializers,
-      required this.endToken})
-      : super("ExtensionMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "getOrSet": getOrSet,
-        "beginToken": beginToken,
-        "beginParam": beginParam,
-        "beginInitializers": beginInitializers,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentClassConstructorEnd extends DirectParserASTContent {
-  final Token? getOrSet;
-  final Token beginToken;
-  final Token beginParam;
-  final Token? beginInitializers;
-  final Token endToken;
-
-  DirectParserASTContentClassConstructorEnd(DirectParserASTType type,
-      {this.getOrSet,
-      required this.beginToken,
-      required this.beginParam,
-      this.beginInitializers,
-      required this.endToken})
-      : super("ClassConstructor", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "getOrSet": getOrSet,
-        "beginToken": beginToken,
-        "beginParam": beginParam,
-        "beginInitializers": beginInitializers,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMixinConstructorEnd extends DirectParserASTContent {
-  final Token? getOrSet;
-  final Token beginToken;
-  final Token beginParam;
-  final Token? beginInitializers;
-  final Token endToken;
-
-  DirectParserASTContentMixinConstructorEnd(DirectParserASTType type,
-      {this.getOrSet,
-      required this.beginToken,
-      required this.beginParam,
-      this.beginInitializers,
-      required this.endToken})
-      : super("MixinConstructor", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "getOrSet": getOrSet,
-        "beginToken": beginToken,
-        "beginParam": beginParam,
-        "beginInitializers": beginInitializers,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentExtensionConstructorEnd
-    extends DirectParserASTContent {
-  final Token? getOrSet;
-  final Token beginToken;
-  final Token beginParam;
-  final Token? beginInitializers;
-  final Token endToken;
-
-  DirectParserASTContentExtensionConstructorEnd(DirectParserASTType type,
-      {this.getOrSet,
-      required this.beginToken,
-      required this.beginParam,
-      this.beginInitializers,
-      required this.endToken})
-      : super("ExtensionConstructor", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "getOrSet": getOrSet,
-        "beginToken": beginToken,
-        "beginParam": beginParam,
-        "beginInitializers": beginInitializers,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMetadataStarBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentMetadataStarBegin(DirectParserASTType type,
-      {required this.token})
-      : super("MetadataStar", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentMetadataStarEnd extends DirectParserASTContent {
-  final int count;
-
-  DirectParserASTContentMetadataStarEnd(DirectParserASTType type,
-      {required this.count})
-      : super("MetadataStar", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-      };
-}
-
-class DirectParserASTContentMetadataBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentMetadataBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Metadata", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentMetadataEnd extends DirectParserASTContent {
-  final Token beginToken;
-  final Token? periodBeforeName;
-  final Token endToken;
-
-  DirectParserASTContentMetadataEnd(DirectParserASTType type,
-      {required this.beginToken, this.periodBeforeName, required this.endToken})
-      : super("Metadata", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "periodBeforeName": periodBeforeName,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentOptionalFormalParametersBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentOptionalFormalParametersBegin(DirectParserASTType type,
-      {required this.token})
-      : super("OptionalFormalParameters", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentOptionalFormalParametersEnd
-    extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentOptionalFormalParametersEnd(DirectParserASTType type,
-      {required this.count, required this.beginToken, required this.endToken})
-      : super("OptionalFormalParameters", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentPartBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentPartBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Part", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentPartEnd extends DirectParserASTContent {
-  final Token partKeyword;
-  final Token semicolon;
-
-  DirectParserASTContentPartEnd(DirectParserASTType type,
-      {required this.partKeyword, required this.semicolon})
-      : super("Part", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "partKeyword": partKeyword,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentPartOfBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentPartOfBegin(DirectParserASTType type,
-      {required this.token})
-      : super("PartOf", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentPartOfEnd extends DirectParserASTContent {
-  final Token partKeyword;
-  final Token ofKeyword;
-  final Token semicolon;
-  final bool hasName;
-
-  DirectParserASTContentPartOfEnd(DirectParserASTType type,
-      {required this.partKeyword,
-      required this.ofKeyword,
-      required this.semicolon,
-      required this.hasName})
-      : super("PartOf", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "partKeyword": partKeyword,
-        "ofKeyword": ofKeyword,
-        "semicolon": semicolon,
-        "hasName": hasName,
-      };
-}
-
-class DirectParserASTContentRedirectingFactoryBodyBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentRedirectingFactoryBodyBegin(DirectParserASTType type,
-      {required this.token})
-      : super("RedirectingFactoryBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentRedirectingFactoryBodyEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentRedirectingFactoryBodyEnd(DirectParserASTType type,
-      {required this.beginToken, required this.endToken})
-      : super("RedirectingFactoryBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentReturnStatementBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentReturnStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ReturnStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNativeFunctionBodyHandle
-    extends DirectParserASTContent {
-  final Token nativeToken;
-  final Token semicolon;
-
-  DirectParserASTContentNativeFunctionBodyHandle(DirectParserASTType type,
-      {required this.nativeToken, required this.semicolon})
-      : super("NativeFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nativeToken": nativeToken,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentNativeFunctionBodyIgnoredHandle
-    extends DirectParserASTContent {
-  final Token nativeToken;
-  final Token semicolon;
-
-  DirectParserASTContentNativeFunctionBodyIgnoredHandle(
-      DirectParserASTType type,
-      {required this.nativeToken,
-      required this.semicolon})
-      : super("NativeFunctionBodyIgnored", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nativeToken": nativeToken,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentNativeFunctionBodySkippedHandle
-    extends DirectParserASTContent {
-  final Token nativeToken;
-  final Token semicolon;
-
-  DirectParserASTContentNativeFunctionBodySkippedHandle(
-      DirectParserASTType type,
-      {required this.nativeToken,
-      required this.semicolon})
-      : super("NativeFunctionBodySkipped", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nativeToken": nativeToken,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentEmptyFunctionBodyHandle
-    extends DirectParserASTContent {
-  final Token semicolon;
-
-  DirectParserASTContentEmptyFunctionBodyHandle(DirectParserASTType type,
-      {required this.semicolon})
-      : super("EmptyFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentExpressionFunctionBodyHandle
-    extends DirectParserASTContent {
-  final Token arrowToken;
-  final Token? endToken;
-
-  DirectParserASTContentExpressionFunctionBodyHandle(DirectParserASTType type,
-      {required this.arrowToken, this.endToken})
-      : super("ExpressionFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "arrowToken": arrowToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentReturnStatementEnd extends DirectParserASTContent {
-  final bool hasExpression;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentReturnStatementEnd(DirectParserASTType type,
-      {required this.hasExpression,
-      required this.beginToken,
-      required this.endToken})
-      : super("ReturnStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "hasExpression": hasExpression,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentSendHandle extends DirectParserASTContent {
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentSendHandle(DirectParserASTType type,
-      {required this.beginToken, required this.endToken})
-      : super("Send", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentShowBegin extends DirectParserASTContent {
-  final Token showKeyword;
-
-  DirectParserASTContentShowBegin(DirectParserASTType type,
-      {required this.showKeyword})
-      : super("Show", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "showKeyword": showKeyword,
-      };
-}
-
-class DirectParserASTContentShowEnd extends DirectParserASTContent {
-  final Token showKeyword;
-
-  DirectParserASTContentShowEnd(DirectParserASTType type,
-      {required this.showKeyword})
-      : super("Show", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "showKeyword": showKeyword,
-      };
-}
-
-class DirectParserASTContentSwitchStatementBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentSwitchStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("SwitchStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentSwitchStatementEnd extends DirectParserASTContent {
-  final Token switchKeyword;
-  final Token endToken;
-
-  DirectParserASTContentSwitchStatementEnd(DirectParserASTType type,
-      {required this.switchKeyword, required this.endToken})
-      : super("SwitchStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "switchKeyword": switchKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentSwitchBlockBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentSwitchBlockBegin(DirectParserASTType type,
-      {required this.token})
-      : super("SwitchBlock", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentSwitchBlockEnd extends DirectParserASTContent {
-  final int caseCount;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentSwitchBlockEnd(DirectParserASTType type,
-      {required this.caseCount,
-      required this.beginToken,
-      required this.endToken})
-      : super("SwitchBlock", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "caseCount": caseCount,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentLiteralSymbolBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLiteralSymbolBegin(DirectParserASTType type,
-      {required this.token})
-      : super("LiteralSymbol", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLiteralSymbolEnd extends DirectParserASTContent {
-  final Token hashToken;
-  final int identifierCount;
-
-  DirectParserASTContentLiteralSymbolEnd(DirectParserASTType type,
-      {required this.hashToken, required this.identifierCount})
-      : super("LiteralSymbol", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "hashToken": hashToken,
-        "identifierCount": identifierCount,
-      };
-}
-
-class DirectParserASTContentThrowExpressionHandle
-    extends DirectParserASTContent {
-  final Token throwToken;
-  final Token endToken;
-
-  DirectParserASTContentThrowExpressionHandle(DirectParserASTType type,
-      {required this.throwToken, required this.endToken})
-      : super("ThrowExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "throwToken": throwToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentRethrowStatementBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentRethrowStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("RethrowStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentRethrowStatementEnd extends DirectParserASTContent {
-  final Token rethrowToken;
-  final Token endToken;
-
-  DirectParserASTContentRethrowStatementEnd(DirectParserASTType type,
-      {required this.rethrowToken, required this.endToken})
-      : super("RethrowStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "rethrowToken": rethrowToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentTopLevelDeclarationEnd
-    extends DirectParserASTContent {
-  final Token nextToken;
-
-  DirectParserASTContentTopLevelDeclarationEnd(DirectParserASTType type,
-      {required this.nextToken})
-      : super("TopLevelDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nextToken": nextToken,
-      };
-}
-
-class DirectParserASTContentInvalidTopLevelDeclarationHandle
-    extends DirectParserASTContent {
-  final Token endToken;
-
-  DirectParserASTContentInvalidTopLevelDeclarationHandle(
-      DirectParserASTType type,
-      {required this.endToken})
-      : super("InvalidTopLevelDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentTopLevelMemberBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTopLevelMemberBegin(DirectParserASTType type,
-      {required this.token})
-      : super("TopLevelMember", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFieldsBegin extends DirectParserASTContent {
-  final DeclarationKind declarationKind;
-  final Token? abstractToken;
-  final Token? externalToken;
-  final Token? staticToken;
-  final Token? covariantToken;
-  final Token? lateToken;
-  final Token? varFinalOrConst;
-  final Token lastConsumed;
-
-  DirectParserASTContentFieldsBegin(DirectParserASTType type,
-      {required this.declarationKind,
-      this.abstractToken,
-      this.externalToken,
-      this.staticToken,
-      this.covariantToken,
-      this.lateToken,
-      this.varFinalOrConst,
-      required this.lastConsumed})
-      : super("Fields", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "declarationKind": declarationKind,
-        "abstractToken": abstractToken,
-        "externalToken": externalToken,
-        "staticToken": staticToken,
-        "covariantToken": covariantToken,
-        "lateToken": lateToken,
-        "varFinalOrConst": varFinalOrConst,
-        "lastConsumed": lastConsumed,
-      };
-}
-
-class DirectParserASTContentTopLevelFieldsEnd extends DirectParserASTContent {
-  final Token? externalToken;
-  final Token? staticToken;
-  final Token? covariantToken;
-  final Token? lateToken;
-  final Token? varFinalOrConst;
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentTopLevelFieldsEnd(DirectParserASTType type,
-      {this.externalToken,
-      this.staticToken,
-      this.covariantToken,
-      this.lateToken,
-      this.varFinalOrConst,
-      required this.count,
-      required this.beginToken,
-      required this.endToken})
-      : super("TopLevelFields", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "externalToken": externalToken,
-        "staticToken": staticToken,
-        "covariantToken": covariantToken,
-        "lateToken": lateToken,
-        "varFinalOrConst": varFinalOrConst,
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentTopLevelMethodBegin extends DirectParserASTContent {
-  final Token lastConsumed;
-  final Token? externalToken;
-
-  DirectParserASTContentTopLevelMethodBegin(DirectParserASTType type,
-      {required this.lastConsumed, this.externalToken})
-      : super("TopLevelMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "lastConsumed": lastConsumed,
-        "externalToken": externalToken,
-      };
-}
-
-class DirectParserASTContentTopLevelMethodEnd extends DirectParserASTContent {
-  final Token beginToken;
-  final Token? getOrSet;
-  final Token endToken;
-
-  DirectParserASTContentTopLevelMethodEnd(DirectParserASTType type,
-      {required this.beginToken, this.getOrSet, required this.endToken})
-      : super("TopLevelMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "getOrSet": getOrSet,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentTryStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTryStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("TryStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCaseMatchHandle extends DirectParserASTContent {
-  final Token caseKeyword;
-  final Token colon;
-
-  DirectParserASTContentCaseMatchHandle(DirectParserASTType type,
-      {required this.caseKeyword, required this.colon})
-      : super("CaseMatch", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "caseKeyword": caseKeyword,
-        "colon": colon,
-      };
-}
-
-class DirectParserASTContentCatchClauseBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentCatchClauseBegin(DirectParserASTType type,
-      {required this.token})
-      : super("CatchClause", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCatchClauseEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentCatchClauseEnd(DirectParserASTType type,
-      {required this.token})
-      : super("CatchClause", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCatchBlockHandle extends DirectParserASTContent {
-  final Token? onKeyword;
-  final Token? catchKeyword;
-  final Token? comma;
-
-  DirectParserASTContentCatchBlockHandle(DirectParserASTType type,
-      {this.onKeyword, this.catchKeyword, this.comma})
-      : super("CatchBlock", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "onKeyword": onKeyword,
-        "catchKeyword": catchKeyword,
-        "comma": comma,
-      };
-}
-
-class DirectParserASTContentFinallyBlockHandle extends DirectParserASTContent {
-  final Token finallyKeyword;
-
-  DirectParserASTContentFinallyBlockHandle(DirectParserASTType type,
-      {required this.finallyKeyword})
-      : super("FinallyBlock", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "finallyKeyword": finallyKeyword,
-      };
-}
-
-class DirectParserASTContentTryStatementEnd extends DirectParserASTContent {
-  final int catchCount;
-  final Token tryKeyword;
-  final Token? finallyKeyword;
-
-  DirectParserASTContentTryStatementEnd(DirectParserASTType type,
-      {required this.catchCount, required this.tryKeyword, this.finallyKeyword})
-      : super("TryStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "catchCount": catchCount,
-        "tryKeyword": tryKeyword,
-        "finallyKeyword": finallyKeyword,
-      };
-}
-
-class DirectParserASTContentTypeHandle extends DirectParserASTContent {
-  final Token beginToken;
-  final Token? questionMark;
-
-  DirectParserASTContentTypeHandle(DirectParserASTType type,
-      {required this.beginToken, this.questionMark})
-      : super("Type", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "questionMark": questionMark,
-      };
-}
-
-class DirectParserASTContentNonNullAssertExpressionHandle
-    extends DirectParserASTContent {
-  final Token bang;
-
-  DirectParserASTContentNonNullAssertExpressionHandle(DirectParserASTType type,
-      {required this.bang})
-      : super("NonNullAssertExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "bang": bang,
-      };
-}
-
-class DirectParserASTContentNoNameHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoNameHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFunctionTypeBegin extends DirectParserASTContent {
-  final Token beginToken;
-
-  DirectParserASTContentFunctionTypeBegin(DirectParserASTType type,
-      {required this.beginToken})
-      : super("FunctionType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-      };
-}
-
-class DirectParserASTContentFunctionTypeEnd extends DirectParserASTContent {
-  final Token functionToken;
-  final Token? questionMark;
-
-  DirectParserASTContentFunctionTypeEnd(DirectParserASTType type,
-      {required this.functionToken, this.questionMark})
-      : super("FunctionType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "functionToken": functionToken,
-        "questionMark": questionMark,
-      };
-}
-
-class DirectParserASTContentTypeArgumentsBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTypeArgumentsBegin(DirectParserASTType type,
-      {required this.token})
-      : super("TypeArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypeArgumentsEnd extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentTypeArgumentsEnd(DirectParserASTType type,
-      {required this.count, required this.beginToken, required this.endToken})
-      : super("TypeArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentInvalidTypeArgumentsHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInvalidTypeArgumentsHandle(DirectParserASTType type,
-      {required this.token})
-      : super("InvalidTypeArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNoTypeArgumentsHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoTypeArgumentsHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoTypeArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypeVariableBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTypeVariableBegin(DirectParserASTType type,
-      {required this.token})
-      : super("TypeVariable", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypeVariablesDefinedHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final int count;
-
-  DirectParserASTContentTypeVariablesDefinedHandle(DirectParserASTType type,
-      {required this.token, required this.count})
-      : super("TypeVariablesDefined", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "count": count,
-      };
-}
-
-class DirectParserASTContentTypeVariableEnd extends DirectParserASTContent {
-  final Token token;
-  final int index;
-  final Token? extendsOrSuper;
-  final Token? variance;
-
-  DirectParserASTContentTypeVariableEnd(DirectParserASTType type,
-      {required this.token,
-      required this.index,
-      this.extendsOrSuper,
-      this.variance})
-      : super("TypeVariable", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "index": index,
-        "extendsOrSuper": extendsOrSuper,
-        "variance": variance,
-      };
-}
-
-class DirectParserASTContentTypeVariablesBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTypeVariablesBegin(DirectParserASTType type,
-      {required this.token})
-      : super("TypeVariables", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypeVariablesEnd extends DirectParserASTContent {
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentTypeVariablesEnd(DirectParserASTType type,
-      {required this.beginToken, required this.endToken})
-      : super("TypeVariables", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentFunctionExpressionBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentFunctionExpressionBegin(DirectParserASTType type,
-      {required this.token})
-      : super("FunctionExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFunctionExpressionEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token token;
-
-  DirectParserASTContentFunctionExpressionEnd(DirectParserASTType type,
-      {required this.beginToken, required this.token})
-      : super("FunctionExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentVariablesDeclarationBegin
-    extends DirectParserASTContent {
-  final Token token;
-  final Token? lateToken;
-  final Token? varFinalOrConst;
-
-  DirectParserASTContentVariablesDeclarationBegin(DirectParserASTType type,
-      {required this.token, this.lateToken, this.varFinalOrConst})
-      : super("VariablesDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "lateToken": lateToken,
-        "varFinalOrConst": varFinalOrConst,
-      };
-}
-
-class DirectParserASTContentVariablesDeclarationEnd
-    extends DirectParserASTContent {
-  final int count;
-  final Token? endToken;
-
-  DirectParserASTContentVariablesDeclarationEnd(DirectParserASTType type,
-      {required this.count, this.endToken})
-      : super("VariablesDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentWhileStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentWhileStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("WhileStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentWhileStatementEnd extends DirectParserASTContent {
-  final Token whileKeyword;
-  final Token endToken;
-
-  DirectParserASTContentWhileStatementEnd(DirectParserASTType type,
-      {required this.whileKeyword, required this.endToken})
-      : super("WhileStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "whileKeyword": whileKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentAsOperatorTypeBegin extends DirectParserASTContent {
-  final Token operator;
-
-  DirectParserASTContentAsOperatorTypeBegin(DirectParserASTType type,
-      {required this.operator})
-      : super("AsOperatorType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operator": operator,
-      };
-}
-
-class DirectParserASTContentAsOperatorTypeEnd extends DirectParserASTContent {
-  final Token operator;
-
-  DirectParserASTContentAsOperatorTypeEnd(DirectParserASTType type,
-      {required this.operator})
-      : super("AsOperatorType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operator": operator,
-      };
-}
-
-class DirectParserASTContentAsOperatorHandle extends DirectParserASTContent {
-  final Token operator;
-
-  DirectParserASTContentAsOperatorHandle(DirectParserASTType type,
-      {required this.operator})
-      : super("AsOperator", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operator": operator,
-      };
-}
-
-class DirectParserASTContentAssignmentExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentAssignmentExpressionHandle(DirectParserASTType type,
-      {required this.token})
-      : super("AssignmentExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentBinaryExpressionBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentBinaryExpressionBegin(DirectParserASTType type,
-      {required this.token})
-      : super("BinaryExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentBinaryExpressionEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentBinaryExpressionEnd(DirectParserASTType type,
-      {required this.token})
-      : super("BinaryExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentEndingBinaryExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentEndingBinaryExpressionHandle(DirectParserASTType type,
-      {required this.token})
-      : super("EndingBinaryExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentConditionalExpressionBegin
-    extends DirectParserASTContent {
-  final Token question;
-
-  DirectParserASTContentConditionalExpressionBegin(DirectParserASTType type,
-      {required this.question})
-      : super("ConditionalExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "question": question,
-      };
-}
-
-class DirectParserASTContentConditionalExpressionColonHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentConditionalExpressionColonHandle(
-      DirectParserASTType type)
-      : super("ConditionalExpressionColon", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentConditionalExpressionEnd
-    extends DirectParserASTContent {
-  final Token question;
-  final Token colon;
-
-  DirectParserASTContentConditionalExpressionEnd(DirectParserASTType type,
-      {required this.question, required this.colon})
-      : super("ConditionalExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "question": question,
-        "colon": colon,
-      };
-}
-
-class DirectParserASTContentConstExpressionBegin
-    extends DirectParserASTContent {
-  final Token constKeyword;
-
-  DirectParserASTContentConstExpressionBegin(DirectParserASTType type,
-      {required this.constKeyword})
-      : super("ConstExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "constKeyword": constKeyword,
-      };
-}
-
-class DirectParserASTContentConstExpressionEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentConstExpressionEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ConstExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentConstFactoryHandle extends DirectParserASTContent {
-  final Token constKeyword;
-
-  DirectParserASTContentConstFactoryHandle(DirectParserASTType type,
-      {required this.constKeyword})
-      : super("ConstFactory", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "constKeyword": constKeyword,
-      };
-}
-
-class DirectParserASTContentForControlFlowBegin extends DirectParserASTContent {
-  final Token? awaitToken;
-  final Token forToken;
-
-  DirectParserASTContentForControlFlowBegin(DirectParserASTType type,
-      {this.awaitToken, required this.forToken})
-      : super("ForControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "awaitToken": awaitToken,
-        "forToken": forToken,
-      };
-}
-
-class DirectParserASTContentForControlFlowEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForControlFlowEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ForControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForInControlFlowEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForInControlFlowEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ForInControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentIfControlFlowBegin extends DirectParserASTContent {
-  final Token ifToken;
-
-  DirectParserASTContentIfControlFlowBegin(DirectParserASTType type,
-      {required this.ifToken})
-      : super("IfControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "ifToken": ifToken,
-      };
-}
-
-class DirectParserASTContentThenControlFlowHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentThenControlFlowHandle(DirectParserASTType type,
-      {required this.token})
-      : super("ThenControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentElseControlFlowHandle
-    extends DirectParserASTContent {
-  final Token elseToken;
-
-  DirectParserASTContentElseControlFlowHandle(DirectParserASTType type,
-      {required this.elseToken})
-      : super("ElseControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "elseToken": elseToken,
-      };
-}
-
-class DirectParserASTContentIfControlFlowEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentIfControlFlowEnd(DirectParserASTType type,
-      {required this.token})
-      : super("IfControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentIfElseControlFlowEnd
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentIfElseControlFlowEnd(DirectParserASTType type,
-      {required this.token})
-      : super("IfElseControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentSpreadExpressionHandle
-    extends DirectParserASTContent {
-  final Token spreadToken;
-
-  DirectParserASTContentSpreadExpressionHandle(DirectParserASTType type,
-      {required this.spreadToken})
-      : super("SpreadExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "spreadToken": spreadToken,
-      };
-}
-
-class DirectParserASTContentFunctionTypedFormalParameterBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentFunctionTypedFormalParameterBegin(
-      DirectParserASTType type,
-      {required this.token})
-      : super("FunctionTypedFormalParameter", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFunctionTypedFormalParameterEnd
-    extends DirectParserASTContent {
-  final Token nameToken;
-  final Token? question;
-
-  DirectParserASTContentFunctionTypedFormalParameterEnd(
-      DirectParserASTType type,
-      {required this.nameToken,
-      this.question})
-      : super("FunctionTypedFormalParameter", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nameToken": nameToken,
-        "question": question,
-      };
-}
-
-class DirectParserASTContentIdentifierHandle extends DirectParserASTContent {
-  final Token token;
-  final IdentifierContext context;
-
-  DirectParserASTContentIdentifierHandle(DirectParserASTType type,
-      {required this.token, required this.context})
-      : super("Identifier", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "context": context,
-      };
-}
-
-class DirectParserASTContentShowHideIdentifierHandle
-    extends DirectParserASTContent {
-  final Token? modifier;
-  final Token identifier;
-
-  DirectParserASTContentShowHideIdentifierHandle(DirectParserASTType type,
-      {this.modifier, required this.identifier})
-      : super("ShowHideIdentifier", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "modifier": modifier,
-        "identifier": identifier,
-      };
-}
-
-class DirectParserASTContentIndexedExpressionHandle
-    extends DirectParserASTContent {
-  final Token? question;
-  final Token openSquareBracket;
-  final Token closeSquareBracket;
-
-  DirectParserASTContentIndexedExpressionHandle(DirectParserASTType type,
-      {this.question,
-      required this.openSquareBracket,
-      required this.closeSquareBracket})
-      : super("IndexedExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "question": question,
-        "openSquareBracket": openSquareBracket,
-        "closeSquareBracket": closeSquareBracket,
-      };
-}
-
-class DirectParserASTContentIsOperatorTypeBegin extends DirectParserASTContent {
-  final Token operator;
-
-  DirectParserASTContentIsOperatorTypeBegin(DirectParserASTType type,
-      {required this.operator})
-      : super("IsOperatorType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operator": operator,
-      };
-}
-
-class DirectParserASTContentIsOperatorTypeEnd extends DirectParserASTContent {
-  final Token operator;
-
-  DirectParserASTContentIsOperatorTypeEnd(DirectParserASTType type,
-      {required this.operator})
-      : super("IsOperatorType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operator": operator,
-      };
-}
-
-class DirectParserASTContentIsOperatorHandle extends DirectParserASTContent {
-  final Token isOperator;
-  final Token? not;
-
-  DirectParserASTContentIsOperatorHandle(DirectParserASTType type,
-      {required this.isOperator, this.not})
-      : super("IsOperator", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "isOperator": isOperator,
-        "not": not,
-      };
-}
-
-class DirectParserASTContentLiteralBoolHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLiteralBoolHandle(DirectParserASTType type,
-      {required this.token})
-      : super("LiteralBool", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentBreakStatementHandle
-    extends DirectParserASTContent {
-  final bool hasTarget;
-  final Token breakKeyword;
-  final Token endToken;
-
-  DirectParserASTContentBreakStatementHandle(DirectParserASTType type,
-      {required this.hasTarget,
-      required this.breakKeyword,
-      required this.endToken})
-      : super("BreakStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "hasTarget": hasTarget,
-        "breakKeyword": breakKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentContinueStatementHandle
-    extends DirectParserASTContent {
-  final bool hasTarget;
-  final Token continueKeyword;
-  final Token endToken;
-
-  DirectParserASTContentContinueStatementHandle(DirectParserASTType type,
-      {required this.hasTarget,
-      required this.continueKeyword,
-      required this.endToken})
-      : super("ContinueStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "hasTarget": hasTarget,
-        "continueKeyword": continueKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentEmptyStatementHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentEmptyStatementHandle(DirectParserASTType type,
-      {required this.token})
-      : super("EmptyStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentAssertBegin extends DirectParserASTContent {
-  final Token assertKeyword;
-  final Assert kind;
-
-  DirectParserASTContentAssertBegin(DirectParserASTType type,
-      {required this.assertKeyword, required this.kind})
-      : super("Assert", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "assertKeyword": assertKeyword,
-        "kind": kind,
-      };
-}
-
-class DirectParserASTContentAssertEnd extends DirectParserASTContent {
-  final Token assertKeyword;
-  final Assert kind;
-  final Token leftParenthesis;
-  final Token? commaToken;
-  final Token semicolonToken;
-
-  DirectParserASTContentAssertEnd(DirectParserASTType type,
-      {required this.assertKeyword,
-      required this.kind,
-      required this.leftParenthesis,
-      this.commaToken,
-      required this.semicolonToken})
-      : super("Assert", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "assertKeyword": assertKeyword,
-        "kind": kind,
-        "leftParenthesis": leftParenthesis,
-        "commaToken": commaToken,
-        "semicolonToken": semicolonToken,
-      };
-}
-
-class DirectParserASTContentLiteralDoubleHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLiteralDoubleHandle(DirectParserASTType type,
-      {required this.token})
-      : super("LiteralDouble", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLiteralIntHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLiteralIntHandle(DirectParserASTType type,
-      {required this.token})
-      : super("LiteralInt", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLiteralListHandle extends DirectParserASTContent {
-  final int count;
-  final Token leftBracket;
-  final Token? constKeyword;
-  final Token rightBracket;
-
-  DirectParserASTContentLiteralListHandle(DirectParserASTType type,
-      {required this.count,
-      required this.leftBracket,
-      this.constKeyword,
-      required this.rightBracket})
-      : super("LiteralList", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "leftBracket": leftBracket,
-        "constKeyword": constKeyword,
-        "rightBracket": rightBracket,
-      };
-}
-
-class DirectParserASTContentLiteralSetOrMapHandle
-    extends DirectParserASTContent {
-  final int count;
-  final Token leftBrace;
-  final Token? constKeyword;
-  final Token rightBrace;
-  final bool hasSetEntry;
-
-  DirectParserASTContentLiteralSetOrMapHandle(DirectParserASTType type,
-      {required this.count,
-      required this.leftBrace,
-      this.constKeyword,
-      required this.rightBrace,
-      required this.hasSetEntry})
-      : super("LiteralSetOrMap", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "leftBrace": leftBrace,
-        "constKeyword": constKeyword,
-        "rightBrace": rightBrace,
-        "hasSetEntry": hasSetEntry,
-      };
-}
-
-class DirectParserASTContentLiteralNullHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLiteralNullHandle(DirectParserASTType type,
-      {required this.token})
-      : super("LiteralNull", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNativeClauseHandle extends DirectParserASTContent {
-  final Token nativeToken;
-  final bool hasName;
-
-  DirectParserASTContentNativeClauseHandle(DirectParserASTType type,
-      {required this.nativeToken, required this.hasName})
-      : super("NativeClause", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nativeToken": nativeToken,
-        "hasName": hasName,
-      };
-}
-
-class DirectParserASTContentNamedArgumentHandle extends DirectParserASTContent {
-  final Token colon;
-
-  DirectParserASTContentNamedArgumentHandle(DirectParserASTType type,
-      {required this.colon})
-      : super("NamedArgument", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "colon": colon,
-      };
-}
-
-class DirectParserASTContentNewExpressionBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNewExpressionBegin(DirectParserASTType type,
-      {required this.token})
-      : super("NewExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNewExpressionEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNewExpressionEnd(DirectParserASTType type,
-      {required this.token})
-      : super("NewExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNoArgumentsHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoArgumentsHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNoConstructorReferenceContinuationAfterTypeArgumentsHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoConstructorReferenceContinuationAfterTypeArgumentsHandle(
-      DirectParserASTType type,
-      {required this.token})
-      : super("NoConstructorReferenceContinuationAfterTypeArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNoTypeHandle extends DirectParserASTContent {
-  final Token lastConsumed;
-
-  DirectParserASTContentNoTypeHandle(DirectParserASTType type,
-      {required this.lastConsumed})
-      : super("NoType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "lastConsumed": lastConsumed,
-      };
-}
-
-class DirectParserASTContentNoTypeVariablesHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoTypeVariablesHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoTypeVariables", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentOperatorHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentOperatorHandle(DirectParserASTType type,
-      {required this.token})
-      : super("Operator", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentSymbolVoidHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentSymbolVoidHandle(DirectParserASTType type,
-      {required this.token})
-      : super("SymbolVoid", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentOperatorNameHandle extends DirectParserASTContent {
-  final Token operatorKeyword;
-  final Token token;
-
-  DirectParserASTContentOperatorNameHandle(DirectParserASTType type,
-      {required this.operatorKeyword, required this.token})
-      : super("OperatorName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operatorKeyword": operatorKeyword,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInvalidOperatorNameHandle
-    extends DirectParserASTContent {
-  final Token operatorKeyword;
-  final Token token;
-
-  DirectParserASTContentInvalidOperatorNameHandle(DirectParserASTType type,
-      {required this.operatorKeyword, required this.token})
-      : super("InvalidOperatorName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operatorKeyword": operatorKeyword,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentParenthesizedConditionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentParenthesizedConditionHandle(DirectParserASTType type,
-      {required this.token})
-      : super("ParenthesizedCondition", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentParenthesizedExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentParenthesizedExpressionHandle(DirectParserASTType type,
-      {required this.token})
-      : super("ParenthesizedExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentQualifiedHandle extends DirectParserASTContent {
-  final Token period;
-
-  DirectParserASTContentQualifiedHandle(DirectParserASTType type,
-      {required this.period})
-      : super("Qualified", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "period": period,
-      };
-}
-
-class DirectParserASTContentStringPartHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentStringPartHandle(DirectParserASTType type,
-      {required this.token})
-      : super("StringPart", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentSuperExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final IdentifierContext context;
-
-  DirectParserASTContentSuperExpressionHandle(DirectParserASTType type,
-      {required this.token, required this.context})
-      : super("SuperExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "context": context,
-      };
-}
-
-class DirectParserASTContentSwitchCaseBegin extends DirectParserASTContent {
-  final int labelCount;
-  final int expressionCount;
-  final Token firstToken;
-
-  DirectParserASTContentSwitchCaseBegin(DirectParserASTType type,
-      {required this.labelCount,
-      required this.expressionCount,
-      required this.firstToken})
-      : super("SwitchCase", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "labelCount": labelCount,
-        "expressionCount": expressionCount,
-        "firstToken": firstToken,
-      };
-}
-
-class DirectParserASTContentSwitchCaseEnd extends DirectParserASTContent {
-  final int labelCount;
-  final int expressionCount;
-  final Token? defaultKeyword;
-  final Token? colonAfterDefault;
-  final int statementCount;
-  final Token firstToken;
-  final Token endToken;
-
-  DirectParserASTContentSwitchCaseEnd(DirectParserASTType type,
-      {required this.labelCount,
-      required this.expressionCount,
-      this.defaultKeyword,
-      this.colonAfterDefault,
-      required this.statementCount,
-      required this.firstToken,
-      required this.endToken})
-      : super("SwitchCase", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "labelCount": labelCount,
-        "expressionCount": expressionCount,
-        "defaultKeyword": defaultKeyword,
-        "colonAfterDefault": colonAfterDefault,
-        "statementCount": statementCount,
-        "firstToken": firstToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentThisExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final IdentifierContext context;
-
-  DirectParserASTContentThisExpressionHandle(DirectParserASTType type,
-      {required this.token, required this.context})
-      : super("ThisExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "context": context,
-      };
-}
-
-class DirectParserASTContentUnaryPostfixAssignmentExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentUnaryPostfixAssignmentExpressionHandle(
-      DirectParserASTType type,
-      {required this.token})
-      : super("UnaryPostfixAssignmentExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentUnaryPrefixExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentUnaryPrefixExpressionHandle(DirectParserASTType type,
-      {required this.token})
-      : super("UnaryPrefixExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentUnaryPrefixAssignmentExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentUnaryPrefixAssignmentExpressionHandle(
-      DirectParserASTType type,
-      {required this.token})
-      : super("UnaryPrefixAssignmentExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFormalParameterDefaultValueExpressionBegin
-    extends DirectParserASTContent {
-  DirectParserASTContentFormalParameterDefaultValueExpressionBegin(
-      DirectParserASTType type)
-      : super("FormalParameterDefaultValueExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentFormalParameterDefaultValueExpressionEnd
-    extends DirectParserASTContent {
-  DirectParserASTContentFormalParameterDefaultValueExpressionEnd(
-      DirectParserASTType type)
-      : super("FormalParameterDefaultValueExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentValuedFormalParameterHandle
-    extends DirectParserASTContent {
-  final Token equals;
-  final Token token;
-
-  DirectParserASTContentValuedFormalParameterHandle(DirectParserASTType type,
-      {required this.equals, required this.token})
-      : super("ValuedFormalParameter", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "equals": equals,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFormalParameterWithoutValueHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentFormalParameterWithoutValueHandle(
-      DirectParserASTType type,
-      {required this.token})
-      : super("FormalParameterWithoutValue", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentVoidKeywordHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentVoidKeywordHandle(DirectParserASTType type,
-      {required this.token})
-      : super("VoidKeyword", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentVoidKeywordWithTypeArgumentsHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentVoidKeywordWithTypeArgumentsHandle(
-      DirectParserASTType type,
-      {required this.token})
-      : super("VoidKeywordWithTypeArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentYieldStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentYieldStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("YieldStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentYieldStatementEnd extends DirectParserASTContent {
-  final Token yieldToken;
-  final Token? starToken;
-  final Token endToken;
-
-  DirectParserASTContentYieldStatementEnd(DirectParserASTType type,
-      {required this.yieldToken, this.starToken, required this.endToken})
-      : super("YieldStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "yieldToken": yieldToken,
-        "starToken": starToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentInvalidYieldStatementEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token? starToken;
-  final Token endToken;
-  final MessageCode errorCode;
-
-  DirectParserASTContentInvalidYieldStatementEnd(DirectParserASTType type,
-      {required this.beginToken,
-      this.starToken,
-      required this.endToken,
-      required this.errorCode})
-      : super("InvalidYieldStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "starToken": starToken,
-        "endToken": endToken,
-        "errorCode": errorCode,
-      };
-}
-
-class DirectParserASTContentRecoverableErrorHandle
-    extends DirectParserASTContent {
-  final Message message;
-  final Token startToken;
-  final Token endToken;
-
-  DirectParserASTContentRecoverableErrorHandle(DirectParserASTType type,
-      {required this.message, required this.startToken, required this.endToken})
-      : super("RecoverableError", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "message": message,
-        "startToken": startToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentErrorTokenHandle extends DirectParserASTContent {
-  final ErrorToken token;
-
-  DirectParserASTContentErrorTokenHandle(DirectParserASTType type,
-      {required this.token})
-      : super("ErrorToken", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentUnescapeErrorHandle extends DirectParserASTContent {
-  final Message message;
-  final Token location;
-  final int stringOffset;
-  final int length;
-
-  DirectParserASTContentUnescapeErrorHandle(DirectParserASTType type,
-      {required this.message,
-      required this.location,
-      required this.stringOffset,
-      required this.length})
-      : super("UnescapeError", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "message": message,
-        "location": location,
-        "stringOffset": stringOffset,
-        "length": length,
-      };
-}
-
-class DirectParserASTContentInvalidStatementHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final Message message;
-
-  DirectParserASTContentInvalidStatementHandle(DirectParserASTType type,
-      {required this.token, required this.message})
-      : super("InvalidStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "message": message,
-      };
-}
-
-class DirectParserASTContentScriptHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentScriptHandle(DirectParserASTType type,
-      {required this.token})
-      : super("Script", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCommentReferenceTextHandle
-    extends DirectParserASTContent {
-  final String referenceSource;
-  final int referenceOffset;
-
-  DirectParserASTContentCommentReferenceTextHandle(DirectParserASTType type,
-      {required this.referenceSource, required this.referenceOffset})
-      : super("CommentReferenceText", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "referenceSource": referenceSource,
-        "referenceOffset": referenceOffset,
-      };
-}
-
-class DirectParserASTContentCommentReferenceHandle
-    extends DirectParserASTContent {
-  final Token? newKeyword;
-  final Token? prefix;
-  final Token? period;
-  final Token token;
-
-  DirectParserASTContentCommentReferenceHandle(DirectParserASTType type,
-      {this.newKeyword, this.prefix, this.period, required this.token})
-      : super("CommentReference", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "newKeyword": newKeyword,
-        "prefix": prefix,
-        "period": period,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNoCommentReferenceHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentNoCommentReferenceHandle(DirectParserASTType type)
-      : super("NoCommentReference", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentTypeArgumentApplicationHandle
-    extends DirectParserASTContent {
-  final Token openAngleBracket;
-
-  DirectParserASTContentTypeArgumentApplicationHandle(DirectParserASTType type,
-      {required this.openAngleBracket})
-      : super("TypeArgumentApplication", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "openAngleBracket": openAngleBracket,
-      };
-}
-
-class DirectParserASTContentNewAsIdentifierHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNewAsIdentifierHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NewAsIdentifier", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
diff --git a/pkg/front_end/lib/src/fasta/util/outline_extractor.dart b/pkg/front_end/lib/src/fasta/util/outline_extractor.dart
new file mode 100644
index 0000000..8caa3f6
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/util/outline_extractor.dart
@@ -0,0 +1,941 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. 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:_fe_analyzer_shared/src/scanner/token.dart';
+import 'package:_fe_analyzer_shared/src/scanner/abstract_scanner.dart'
+    show ScannerConfiguration;
+import 'package:front_end/src/api_prototype/compiler_options.dart';
+import 'package:front_end/src/api_prototype/file_system.dart';
+import 'package:front_end/src/base/processed_options.dart';
+import 'package:front_end/src/fasta/compiler_context.dart';
+import 'package:front_end/src/fasta/uri_translator.dart';
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart';
+import 'package:front_end/src/fasta/util/textual_outline.dart';
+import 'package:_fe_analyzer_shared/src/parser/identifier_context.dart';
+import 'package:kernel/target/targets.dart';
+
+import "parser_ast.dart";
+import "abstracted_ast_nodes.dart";
+
+// Overall TODO(s):
+// * If entry is given as fileuri but exists as different import uri...
+//   Does that matter?
+// * Setters vs non-setters with naming conflicts.
+// * -> also these might be found on "different levels", e.g. the setter might
+//      be in the class and the getter might be in an import.
+// * show/hide on imports and exports.
+// * Handle importing/exporting non-existing files.
+// * Tests.
+// * Maybe bypass the direct-from-parser-ast stuff for speed?
+// * Probably some of the special classes can be combined if we want to
+//   (e.g. Class and Mixin).
+// * Extensions --- we currently basically mark all we see.
+//    => Could be perhaps only include them if the class they're talking about
+//       is included? (or we don't know).
+// * E.g. "factory Abc.b() => Abc3();" is the same as
+//   "factory Abc.b() { return Abc3(); }" and Abc3 shouldn't be marked by it.
+//    -> This is basically a rough edge on the textual outline though.
+//    -> Also, the same applies to other instances of "=>".
+// * It shouldn't lookup private stuff in other libraries.
+// * Could there be made a distinction between for instance
+//   `IdentifierContext.typeReference` and `IdentifierContext.expression`?
+//   => one might not have to include content of classes that only talk about
+//      typeReference I think.
+
+Future<void> main(List<String> args) async {
+  if (args.length != 2) {
+    throw "Needs 2 arguments: packages file/dir and file to process.";
+  }
+  Uri packages = Uri.base.resolve(args[0]);
+  Uri file = Uri.base.resolve(args[1]);
+  for (int i = 0; i < 1; i++) {
+    Stopwatch stopwatch = new Stopwatch()..start();
+    await extractOutline([file], packages: packages, verbosityLevel: 40);
+    print("Finished in ${stopwatch.elapsedMilliseconds} ms "
+        "(textual outline was "
+        "${latestProcessor!.textualOutlineStopwatch.elapsedMilliseconds} ms)"
+        "(get ast was "
+        "${latestProcessor!.getAstStopwatch.elapsedMilliseconds} ms)"
+        "(extract identifier was "
+        "${latestProcessor!.extractIdentifierStopwatch.elapsedMilliseconds} ms)"
+        "");
+  }
+}
+
+_Processor? latestProcessor;
+
+Future<Map<Uri, String>> extractOutline(List<Uri> entryPointUris,
+    {Uri? sdk,
+    required Uri? packages,
+    Uri? platform,
+    Target? target,
+    int verbosityLevel: 0}) {
+  CompilerOptions options = new CompilerOptions()
+    ..target = target
+    ..packagesFileUri = packages
+    ..sdkSummary = platform
+    ..sdkRoot = sdk;
+  ProcessedOptions pOptions =
+      new ProcessedOptions(options: options, inputs: entryPointUris);
+  return CompilerContext.runWithOptions(pOptions, (CompilerContext c) async {
+    FileSystem fileSystem = c.options.fileSystem;
+    UriTranslator uriTranslator = await c.options.getUriTranslator();
+    _Processor processor =
+        new _Processor(verbosityLevel, fileSystem, uriTranslator);
+    latestProcessor = processor;
+    List<TopLevel> entryPoints = [];
+    for (Uri entryPointUri in entryPointUris) {
+      TopLevel entryPoint = await processor.preprocessUri(entryPointUri);
+      entryPoints.add(entryPoint);
+    }
+    return await processor.calculate(entryPoints);
+  });
+}
+
+class _Processor {
+  final FileSystem fileSystem;
+  final UriTranslator uriTranslator;
+  final int verbosityLevel;
+
+  final Stopwatch textualOutlineStopwatch = new Stopwatch();
+  final Stopwatch getAstStopwatch = new Stopwatch();
+  final Stopwatch extractIdentifierStopwatch = new Stopwatch();
+
+  Map<Uri, TopLevel> parsed = {};
+
+  _Processor(this.verbosityLevel, this.fileSystem, this.uriTranslator);
+
+  void log(String s) {
+    if (verbosityLevel <= 0) return;
+    print(s);
+  }
+
+  Future<TopLevel> preprocessUri(Uri importUri, {Uri? partOf}) async {
+    if (verbosityLevel >= 20) log("$importUri =>");
+    Uri fileUri = importUri;
+    if (importUri.scheme == "package") {
+      fileUri = uriTranslator.translate(importUri)!;
+    }
+    if (verbosityLevel >= 20) log("$fileUri");
+    final List<int> bytes =
+        await fileSystem.entityForUri(fileUri).readAsBytes();
+    // TODO: Support updating the configuration; also default it to match
+    // the package version.
+    final ScannerConfiguration configuration = new ScannerConfiguration(
+        enableExtensionMethods: true,
+        enableNonNullable: true,
+        enableTripleShift: true);
+    textualOutlineStopwatch.start();
+    final String? outlined = textualOutline(bytes, configuration);
+    textualOutlineStopwatch.stop();
+    if (outlined == null) throw "Textual outline returned null";
+    final List<int> bytes2 = utf8.encode(outlined);
+    getAstStopwatch.start();
+    List<Token> languageVersionsSeen = [];
+    final ParserAstNode ast = getAST(bytes2,
+        enableExtensionMethods: configuration.enableExtensionMethods,
+        enableNonNullable: configuration.enableNonNullable,
+        enableTripleShift: configuration.enableTripleShift,
+        languageVersionsSeen: languageVersionsSeen);
+    getAstStopwatch.stop();
+
+    _ParserAstVisitor visitor = new _ParserAstVisitor(
+        verbosityLevel, outlined, importUri, partOf, ast, languageVersionsSeen);
+    TopLevel topLevel = visitor.currentContainer as TopLevel;
+    if (parsed[importUri] != null) throw "$importUri already set?!?";
+    parsed[importUri] = topLevel;
+    visitor.accept(ast);
+    topLevel.buildScope();
+
+    _IdentifierExtractor identifierExtractor = new _IdentifierExtractor();
+    extractIdentifierStopwatch.start();
+    identifierExtractor.extract(ast);
+    extractIdentifierStopwatch.stop();
+    for (IdentifierHandle identifier in identifierExtractor.identifiers) {
+      if (identifier.context == IdentifierContext.typeVariableDeclaration) {
+        // Hack: Put type variable declarations into scope so any overlap in
+        // name doesn't mark usages (e.g. a class E shouldn't be marked if we're
+        // talking about the type variable E).
+        ParserAstNode content = identifier;
+        AstNode? nearestAstNode = visitor.map[content];
+        while (nearestAstNode == null && content.parent != null) {
+          content = content.parent!;
+          nearestAstNode = visitor.map[content];
+        }
+        if (nearestAstNode == null) {
+          content = identifier;
+          nearestAstNode = visitor.map[content];
+          while (nearestAstNode == null && content.parent != null) {
+            content = content.parent!;
+            nearestAstNode = visitor.map[content];
+          }
+
+          StringBuffer sb = new StringBuffer();
+          Token t = identifier.token;
+          // for(int i = 0; i < 10; i++) {
+          //   t = t.previous!;
+          // }
+          for (int i = 0; i < 20; i++) {
+            sb.write("$t ");
+            t = t.next!;
+          }
+          throw "$fileUri --- couldn't even find nearest ast node for "
+              "${identifier.token} :( -- context $sb";
+        }
+        (nearestAstNode.scope[identifier.token.lexeme] ??= [])
+            .add(nearestAstNode);
+      }
+    }
+
+    return topLevel;
+  }
+
+  Future<void> _premarkTopLevel(List<_TopLevelAndAstNode> worklist,
+      Set<TopLevel> closed, TopLevel entrypointish) async {
+    if (!closed.add(entrypointish)) return;
+
+    for (AstNode child in entrypointish.children) {
+      child.marked = Coloring.Marked;
+      worklist.add(new _TopLevelAndAstNode(entrypointish, child));
+
+      if (child is Part) {
+        if (child.uri.scheme != "dart") {
+          TopLevel partTopLevel = parsed[child.uri] ??
+              await preprocessUri(child.uri, partOf: entrypointish.uri);
+          await _premarkTopLevel(worklist, closed, partTopLevel);
+        }
+      } else if (child is Export) {
+        for (Uri importedUri in child.uris) {
+          if (importedUri.scheme != "dart") {
+            TopLevel exportTopLevel =
+                parsed[importedUri] ?? await preprocessUri(importedUri);
+            await _premarkTopLevel(worklist, closed, exportTopLevel);
+          }
+        }
+      }
+    }
+  }
+
+  Future<List<TopLevel>> _preprocessImportsAsNeeded(
+      Map<TopLevel, List<TopLevel>> imports, TopLevel topLevel) async {
+    List<TopLevel>? imported = imports[topLevel];
+    if (imported == null) {
+      // Process all imports.
+      imported = [];
+      imports[topLevel] = imported;
+      for (AstNode child in topLevel.children) {
+        if (child is Import) {
+          child.marked = Coloring.Marked;
+          for (Uri importedUri in child.uris) {
+            if (importedUri.scheme != "dart") {
+              TopLevel importedTopLevel =
+                  parsed[importedUri] ?? await preprocessUri(importedUri);
+              imported.add(importedTopLevel);
+            }
+          }
+        } else if (child is PartOf) {
+          child.marked = Coloring.Marked;
+          if (child.partOfUri.scheme != "dart") {
+            TopLevel part = parsed[child.partOfUri]!;
+            List<TopLevel> importsFromPart =
+                await _preprocessImportsAsNeeded(imports, part);
+            imported.addAll(importsFromPart);
+          }
+        }
+      }
+    }
+    return imported;
+  }
+
+  Future<Map<Uri, String>> calculate(List<TopLevel> entryPoints) async {
+    List<_TopLevelAndAstNode> worklist = [];
+    Map<TopLevel, List<TopLevel>> imports = {};
+
+    // Mark all top-level in entry point. Also include parts and exports (and
+    // exports exports etc) of the entry point.
+    Set<TopLevel> closed = {};
+    for (TopLevel entryPoint in entryPoints) {
+      await _premarkTopLevel(worklist, closed, entryPoint);
+    }
+
+    Map<TopLevel, Set<String>> lookupsAll = {};
+    Map<TopLevel, List<String>> lookupsWorklist = {};
+    while (worklist.isNotEmpty || lookupsWorklist.isNotEmpty) {
+      while (worklist.isNotEmpty) {
+        _TopLevelAndAstNode entry = worklist.removeLast();
+        if (verbosityLevel >= 20) {
+          log("\n-----\nProcessing ${entry.entry.node.toString()}");
+        }
+        _IdentifierExtractor identifierExtractor = new _IdentifierExtractor();
+        identifierExtractor.extract(entry.entry.node);
+        if (verbosityLevel >= 20) {
+          log("Found ${identifierExtractor.identifiers}");
+        }
+        List<AstNode>? prevLookupResult;
+        nextIdentifier:
+        for (IdentifierHandle identifier in identifierExtractor.identifiers) {
+          ParserAstNode content = identifier;
+          AstNode? nearestAstNode = entry.topLevel.map[content];
+          while (nearestAstNode == null && content.parent != null) {
+            content = content.parent!;
+            nearestAstNode = entry.topLevel.map[content];
+          }
+          if (nearestAstNode == null) {
+            throw "couldn't even find nearest ast node for "
+                "${identifier.token} :(";
+          }
+
+          if (identifier.context == IdentifierContext.typeReference ||
+              identifier.context == IdentifierContext.prefixedTypeReference ||
+              identifier.context ==
+                  IdentifierContext.typeReferenceContinuation ||
+              identifier.context == IdentifierContext.constructorReference ||
+              identifier.context ==
+                  IdentifierContext.constructorReferenceContinuation ||
+              identifier.context == IdentifierContext.expression ||
+              identifier.context == IdentifierContext.expressionContinuation ||
+              identifier.context == IdentifierContext.metadataReference ||
+              identifier.context == IdentifierContext.metadataContinuation) {
+            bool lookupInThisScope = true;
+            if (!identifier.context.isContinuation) {
+              prevLookupResult = null;
+            } else if (prevLookupResult != null) {
+              // In continuation.
+              // either 0 or all should be imports.
+              for (AstNode prevResult in prevLookupResult) {
+                if (prevResult is Import) {
+                  lookupInThisScope = false;
+                } else {
+                  continue nextIdentifier;
+                }
+              }
+            } else {
+              // Still in continuation --- but prev lookup didn't yield
+              // anything. We shouldn't search for the continuation part in this
+              // scope (and thus skip looking in imports).
+              lookupInThisScope = false;
+            }
+            if (verbosityLevel >= 20) {
+              log("${identifier.token} (${identifier.context})");
+            }
+
+            // Now we need parts at this point. Either we're in the entry point
+            // in which case parts was read by [_premarkTopLevel], or we're here
+            // via lookups on an import, where parts were read too.
+            List<AstNode>? lookedUp;
+            if (lookupInThisScope) {
+              lookedUp = findInScope(
+                  identifier.token.lexeme, nearestAstNode, entry.topLevel);
+              prevLookupResult = lookedUp;
+            }
+            if (lookedUp != null) {
+              for (AstNode found in lookedUp) {
+                if (verbosityLevel >= 20) log(" => found $found");
+                if (found.marked == Coloring.Untouched) {
+                  found.marked = Coloring.Marked;
+                  TopLevel foundTopLevel = entry.topLevel;
+                  if (found.parent is TopLevel) {
+                    foundTopLevel = found.parent as TopLevel;
+                  }
+                  worklist.add(new _TopLevelAndAstNode(foundTopLevel, found));
+                }
+              }
+            } else {
+              if (verbosityLevel >= 20) {
+                log("=> Should find this via an import probably?");
+              }
+
+              List<TopLevel> imported =
+                  await _preprocessImportsAsNeeded(imports, entry.topLevel);
+
+              Set<Uri>? wantedImportUrls;
+              if (!lookupInThisScope && prevLookupResult != null) {
+                for (AstNode castMeAsImport in prevLookupResult) {
+                  Import import = castMeAsImport as Import;
+                  assert(import.asName != null);
+                  (wantedImportUrls ??= {}).addAll(import.uris);
+                }
+              }
+
+              for (TopLevel other in imported) {
+                if (!lookupInThisScope && prevLookupResult != null) {
+                  assert(wantedImportUrls != null);
+                  if (!wantedImportUrls!.contains(other.uri)) continue;
+                }
+
+                Set<String> lookupStrings = lookupsAll[other] ??= {};
+                if (lookupStrings.add(identifier.token.lexeme)) {
+                  List<String> lookupStringsWorklist =
+                      lookupsWorklist[other] ??= [];
+                  lookupStringsWorklist.add(identifier.token.lexeme);
+                }
+              }
+            }
+          } else {
+            if (verbosityLevel >= 30) {
+              log("Ignoring ${identifier.token} as it's a "
+                  "${identifier.context}");
+            }
+          }
+        }
+      }
+      Map<TopLevel, List<String>> lookupsWorklistTmp = {};
+      for (MapEntry<TopLevel, List<String>> lookups
+          in lookupsWorklist.entries) {
+        TopLevel topLevel = lookups.key;
+        // We have to make the same lookups in parts and exports too.
+        for (AstNode child in topLevel.children) {
+          TopLevel? other;
+          if (child is Part) {
+            child.marked = Coloring.Marked;
+            // do stuff to part.
+            if (child.uri.scheme != "dart") {
+              other = parsed[child.uri] ??
+                  await preprocessUri(child.uri, partOf: topLevel.uri);
+            }
+          } else if (child is Export) {
+            child.marked = Coloring.Marked;
+            // do stuff to export.
+            for (Uri importedUri in child.uris) {
+              if (importedUri.scheme != "dart") {
+                other = parsed[importedUri] ?? await preprocessUri(importedUri);
+              }
+            }
+          } else if (child is Extension) {
+            // TODO: Maybe put on a list to process later and only include if
+            // the on-class is included?
+            if (child.marked == Coloring.Untouched) {
+              child.marked = Coloring.Marked;
+              worklist.add(new _TopLevelAndAstNode(topLevel, child));
+            }
+          }
+          if (other != null) {
+            Set<String> lookupStrings = lookupsAll[other] ??= {};
+            for (String identifier in lookups.value) {
+              if (lookupStrings.add(identifier)) {
+                List<String> lookupStringsWorklist =
+                    lookupsWorklistTmp[other] ??= [];
+                lookupStringsWorklist.add(identifier);
+              }
+            }
+          }
+        }
+
+        for (String identifier in lookups.value) {
+          List<AstNode>? foundInScope = topLevel.findInScope(identifier);
+          if (foundInScope != null) {
+            for (AstNode found in foundInScope) {
+              if (found.marked == Coloring.Untouched) {
+                found.marked = Coloring.Marked;
+                worklist.add(new _TopLevelAndAstNode(topLevel, found));
+              }
+              if (verbosityLevel >= 20) {
+                log(" => found $found via import (${found.marked})");
+              }
+            }
+          }
+        }
+      }
+      lookupsWorklist = lookupsWorklistTmp;
+    }
+
+    if (verbosityLevel >= 40) {
+      log("\n\n---------\n\n");
+      log(parsed.toString());
+      log("\n\n---------\n\n");
+    }
+
+    // Extract.
+    int count = 0;
+    Map<Uri, String> result = {};
+    // We only read imports if we need to lookup in them, but if a import
+    // statement is included in the output the file has to exist if it actually
+    // exists to not get a compilation error.
+    Set<Uri> imported = {};
+    for (MapEntry<Uri, TopLevel> entry in parsed.entries) {
+      if (verbosityLevel >= 40) log("${entry.key}:");
+      StringBuffer sb = new StringBuffer();
+      for (AstNode child in entry.value.children) {
+        if (child.marked == Coloring.Marked) {
+          String substring = entry.value.sourceText.substring(
+              child.startInclusive.charOffset, child.endInclusive.charEnd);
+          sb.writeln(substring);
+          if (verbosityLevel >= 40) {
+            log(substring);
+          }
+          if (child is Import) {
+            for (Uri importedUri in child.uris) {
+              if (importedUri.scheme != "dart") {
+                imported.add(importedUri);
+              }
+            }
+          }
+        }
+      }
+      if (sb.isNotEmpty) count++;
+      Uri uri = entry.key;
+      Uri fileUri = uri;
+      if (uri.scheme == "package") {
+        fileUri = uriTranslator.translate(uri)!;
+      }
+      result[fileUri] = sb.toString();
+    }
+    for (Uri uri in imported) {
+      TopLevel? topLevel = parsed[uri];
+      if (topLevel != null) continue;
+      // uri imports a file we haven't read. Check if it exists and include it
+      // as an empty file if it does.
+      Uri fileUri = uri;
+      if (uri.scheme == "package") {
+        fileUri = uriTranslator.translate(uri)!;
+      }
+      if (await fileSystem.entityForUri(fileUri).exists()) {
+        result[fileUri] = "";
+      }
+    }
+
+    print("=> Long story short got it to $count non-empty files...");
+
+    return result;
+  }
+
+  List<AstNode>? findInScope(
+      String name, AstNode nearestAstNode, TopLevel topLevel,
+      {Set<TopLevel>? visited}) {
+    List<AstNode>? result;
+    result = nearestAstNode.findInScope(name);
+    if (result != null) return result;
+    for (AstNode child in topLevel.children) {
+      if (child is Part) {
+        visited ??= {topLevel};
+        TopLevel partTopLevel = parsed[child.uri]!;
+        if (visited.add(partTopLevel)) {
+          result =
+              findInScope(name, partTopLevel, partTopLevel, visited: visited);
+          if (result != null) return result;
+        }
+      } else if (child is PartOf) {
+        visited ??= {topLevel};
+        TopLevel partOwnerTopLevel = parsed[child.partOfUri]!;
+        if (visited.add(partOwnerTopLevel)) {
+          result = findInScope(name, partOwnerTopLevel, partOwnerTopLevel,
+              visited: visited);
+          if (result != null) return result;
+        }
+      }
+    }
+  }
+}
+
+class _TopLevelAndAstNode {
+  final TopLevel topLevel;
+  final AstNode entry;
+
+  _TopLevelAndAstNode(this.topLevel, this.entry);
+}
+
+class _IdentifierExtractor {
+  List<IdentifierHandle> identifiers = [];
+
+  void extract(ParserAstNode ast) {
+    if (ast is IdentifierHandle) {
+      identifiers.add(ast);
+    }
+    List<ParserAstNode>? children = ast.children;
+    if (children != null) {
+      for (ParserAstNode child in children) {
+        extract(child);
+      }
+    }
+  }
+}
+
+class _ParserAstVisitor extends ParserAstVisitor {
+  final Uri uri;
+  final Uri? partOfUri;
+  late Container currentContainer;
+  final Map<ParserAstNode, AstNode> map = {};
+  final int verbosityLevel;
+  final List<Token> languageVersionsSeen;
+
+  _ParserAstVisitor(this.verbosityLevel, String sourceText, this.uri,
+      this.partOfUri, ParserAstNode rootAst, this.languageVersionsSeen) {
+    currentContainer = new TopLevel(sourceText, uri, rootAst, map);
+    if (languageVersionsSeen.isNotEmpty) {
+      // Use first one.
+      Token languageVersion = languageVersionsSeen.first;
+      ParserAstNode dummyNode = new NoInitializersHandle(ParserAstType.HANDLE);
+      LanguageVersion version =
+          new LanguageVersion(dummyNode, languageVersion, languageVersion);
+      version.marked = Coloring.Marked;
+      currentContainer.addChild(version, map);
+    }
+  }
+
+  void log(String s) {
+    if (verbosityLevel <= 0) return;
+    Container? x = currentContainer.parent;
+    int level = 0;
+    while (x != null) {
+      level++;
+      x = x.parent;
+    }
+    print(" " * level + s);
+  }
+
+  @override
+  void visitClass(
+      ClassDeclarationEnd node, Token startInclusive, Token endInclusive) {
+    TopLevelDeclarationEnd parent = node.parent! as TopLevelDeclarationEnd;
+    IdentifierHandle identifier = parent.getIdentifier();
+
+    log("Hello from class ${identifier.token}");
+
+    Class cls = new Class(
+        parent, identifier.token.lexeme, startInclusive, endInclusive);
+    currentContainer.addChild(cls, map);
+
+    Container previousContainer = currentContainer;
+    currentContainer = cls;
+    super.visitClass(node, startInclusive, endInclusive);
+    currentContainer = previousContainer;
+  }
+
+  @override
+  void visitClassConstructor(
+      ClassConstructorEnd node, Token startInclusive, Token endInclusive) {
+    assert(currentContainer is Class);
+    List<IdentifierHandle> ids = node.getIdentifiers();
+    if (ids.length == 1) {
+      ClassConstructor classConstructor = new ClassConstructor(
+          node, ids.single.token.lexeme, startInclusive, endInclusive);
+      currentContainer.addChild(classConstructor, map);
+      log("Hello from constructor ${ids.single.token}");
+    } else if (ids.length == 2) {
+      ClassConstructor classConstructor = new ClassConstructor(node,
+          "${ids.first.token}.${ids.last.token}", startInclusive, endInclusive);
+      map[node] = classConstructor;
+      currentContainer.addChild(classConstructor, map);
+      log("Hello from constructor ${ids.first.token}.${ids.last.token}");
+    } else {
+      throw "Unexpected identifiers in class constructor";
+    }
+
+    super.visitClassConstructor(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitClassFactoryMethod(
+      ClassFactoryMethodEnd node, Token startInclusive, Token endInclusive) {
+    assert(currentContainer is Class);
+    List<IdentifierHandle> ids = node.getIdentifiers();
+    if (ids.length == 1) {
+      ClassFactoryMethod classFactoryMethod = new ClassFactoryMethod(
+          node, ids.single.token.lexeme, startInclusive, endInclusive);
+      currentContainer.addChild(classFactoryMethod, map);
+      log("Hello from factory method ${ids.single.token}");
+    } else if (ids.length == 2) {
+      ClassFactoryMethod classFactoryMethod = new ClassFactoryMethod(node,
+          "${ids.first.token}.${ids.last.token}", startInclusive, endInclusive);
+      map[node] = classFactoryMethod;
+      currentContainer.addChild(classFactoryMethod, map);
+      log("Hello from factory method ${ids.first.token}.${ids.last.token}");
+    } else {
+      Container findTopLevel = currentContainer;
+      while (findTopLevel is! TopLevel) {
+        findTopLevel = findTopLevel.parent!;
+      }
+      String src = findTopLevel.sourceText
+          .substring(startInclusive.charOffset, endInclusive.charEnd);
+      throw "Unexpected identifiers in class factory method: $ids "
+          "(${ids.map((e) => e.token.lexeme).toList()}) --- "
+          "error on source ${src} --- "
+          "${node.children}";
+    }
+
+    super.visitClassFactoryMethod(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitClassFields(
+      ClassFieldsEnd node, Token startInclusive, Token endInclusive) {
+    assert(currentContainer is Class);
+    List<String> fields =
+        node.getFieldIdentifiers().map((e) => e.token.lexeme).toList();
+    ClassFields classFields =
+        new ClassFields(node, fields, startInclusive, endInclusive);
+    currentContainer.addChild(classFields, map);
+    log("Hello from class fields ${fields.join(", ")}");
+    super.visitClassFields(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitClassMethod(
+      ClassMethodEnd node, Token startInclusive, Token endInclusive) {
+    assert(currentContainer is Class);
+
+    String identifier;
+    try {
+      identifier = node.getNameIdentifier();
+    } catch (e) {
+      Container findTopLevel = currentContainer;
+      while (findTopLevel is! TopLevel) {
+        findTopLevel = findTopLevel.parent!;
+      }
+      String src = findTopLevel.sourceText
+          .substring(startInclusive.charOffset, endInclusive.charEnd);
+      throw "Unexpected identifiers in visitClassMethod --- "
+          "error on source ${src} --- "
+          "${node.children}";
+    }
+    ClassMethod classMethod =
+        new ClassMethod(node, identifier, startInclusive, endInclusive);
+    currentContainer.addChild(classMethod, map);
+    log("Hello from class method $identifier");
+    super.visitClassMethod(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitEnum(EnumEnd node, Token startInclusive, Token endInclusive) {
+    List<IdentifierHandle> ids = node.getIdentifiers();
+
+    Enum e = new Enum(
+        node,
+        ids.first.token.lexeme,
+        ids.skip(1).map((e) => e.token.lexeme).toList(),
+        startInclusive,
+        endInclusive);
+    currentContainer.addChild(e, map);
+
+    log("Hello from enum ${ids.first.token} with content "
+        "${ids.skip(1).map((e) => e.token).join(", ")}");
+    super.visitEnum(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitExport(ExportEnd node, Token startInclusive, Token endInclusive) {
+    String uriString = node.getExportUriString();
+    Uri exportUri = uri.resolve(uriString);
+    List<String>? conditionalUriStrings = node.getConditionalExportUriStrings();
+    List<Uri>? conditionalUris;
+    if (conditionalUriStrings != null) {
+      conditionalUris = [];
+      for (String conditionalUri in conditionalUriStrings) {
+        conditionalUris.add(uri.resolve(conditionalUri));
+      }
+    }
+    // TODO: Use 'show' and 'hide' stuff.
+    Export e = new Export(
+        node, exportUri, conditionalUris, startInclusive, endInclusive);
+    currentContainer.addChild(e, map);
+    log("Hello export");
+  }
+
+  @override
+  void visitExtension(
+      ExtensionDeclarationEnd node, Token startInclusive, Token endInclusive) {
+    ExtensionDeclarationBegin begin =
+        node.children!.first as ExtensionDeclarationBegin;
+    TopLevelDeclarationEnd parent = node.parent! as TopLevelDeclarationEnd;
+    log("Hello from extension ${begin.name}");
+    Extension extension =
+        new Extension(parent, begin.name?.lexeme, startInclusive, endInclusive);
+    currentContainer.addChild(extension, map);
+
+    Container previousContainer = currentContainer;
+    currentContainer = extension;
+    super.visitExtension(node, startInclusive, endInclusive);
+    currentContainer = previousContainer;
+  }
+
+  @override
+  void visitExtensionConstructor(
+      ExtensionConstructorEnd node, Token startInclusive, Token endInclusive) {
+    // TODO: implement visitExtensionConstructor
+    throw node;
+  }
+
+  @override
+  void visitExtensionFactoryMethod(ExtensionFactoryMethodEnd node,
+      Token startInclusive, Token endInclusive) {
+    // TODO: implement visitExtensionFactoryMethod
+    throw node;
+  }
+
+  @override
+  void visitExtensionFields(
+      ExtensionFieldsEnd node, Token startInclusive, Token endInclusive) {
+    assert(currentContainer is Extension);
+    List<String> fields =
+        node.getFieldIdentifiers().map((e) => e.token.lexeme).toList();
+    ExtensionFields classFields =
+        new ExtensionFields(node, fields, startInclusive, endInclusive);
+    currentContainer.addChild(classFields, map);
+    log("Hello from extension fields ${fields.join(", ")}");
+    super.visitExtensionFields(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitExtensionMethod(
+      ExtensionMethodEnd node, Token startInclusive, Token endInclusive) {
+    assert(currentContainer is Extension);
+    ExtensionMethod extensionMethod = new ExtensionMethod(
+        node, node.getNameIdentifier(), startInclusive, endInclusive);
+    currentContainer.addChild(extensionMethod, map);
+    log("Hello from extension method ${node.getNameIdentifier()}");
+    super.visitExtensionMethod(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitImport(ImportEnd node, Token startInclusive, Token? endInclusive) {
+    IdentifierHandle? prefix = node.getImportPrefix();
+    String uriString = node.getImportUriString();
+    Uri importUri = uri.resolve(uriString);
+    List<String>? conditionalUriStrings = node.getConditionalImportUriStrings();
+    List<Uri>? conditionalUris;
+    if (conditionalUriStrings != null) {
+      conditionalUris = [];
+      for (String conditionalUri in conditionalUriStrings) {
+        conditionalUris.add(uri.resolve(conditionalUri));
+      }
+    }
+    // TODO: Use 'show' and 'hide' stuff.
+
+    // endInclusive can be null on syntax errors and there's recovery of the
+    // import. For now we'll ignore this.
+    Import i = new Import(node, importUri, conditionalUris,
+        prefix?.token.lexeme, startInclusive, endInclusive!);
+    currentContainer.addChild(i, map);
+    if (prefix == null) {
+      log("Hello import");
+    } else {
+      log("Hello import as '${prefix.token}'");
+    }
+  }
+
+  @override
+  void visitLibraryName(
+      LibraryNameEnd node, Token startInclusive, Token endInclusive) {
+    LibraryName name = new LibraryName(node, startInclusive, endInclusive);
+    name.marked = Coloring.Marked;
+    currentContainer.addChild(name, map);
+  }
+
+  @override
+  void visitMetadata(
+      MetadataEnd node, Token startInclusive, Token endInclusive) {
+    Metadata m = new Metadata(node, startInclusive, endInclusive);
+    currentContainer.addChild(m, map);
+  }
+
+  @override
+  void visitMixin(
+      MixinDeclarationEnd node, Token startInclusive, Token endInclusive) {
+    TopLevelDeclarationEnd parent = node.parent! as TopLevelDeclarationEnd;
+    IdentifierHandle identifier = parent.getIdentifier();
+    log("Hello from mixin ${identifier.token}");
+
+    Mixin mixin = new Mixin(
+        parent, identifier.token.lexeme, startInclusive, endInclusive);
+    currentContainer.addChild(mixin, map);
+
+    Container previousContainer = currentContainer;
+    currentContainer = mixin;
+    super.visitMixin(node, startInclusive, endInclusive);
+    currentContainer = previousContainer;
+  }
+
+  @override
+  void visitMixinFields(
+      MixinFieldsEnd node, Token startInclusive, Token endInclusive) {
+    assert(currentContainer is Mixin);
+    List<String> fields =
+        node.getFieldIdentifiers().map((e) => e.token.lexeme).toList();
+    MixinFields mixinFields =
+        new MixinFields(node, fields, startInclusive, endInclusive);
+    currentContainer.addChild(mixinFields, map);
+    log("Hello from mixin fields ${fields.join(", ")}");
+    super.visitMixinFields(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitMixinMethod(
+      MixinMethodEnd node, Token startInclusive, Token endInclusive) {
+    assert(currentContainer is Mixin);
+    MixinMethod classMethod = new MixinMethod(
+        node, node.getNameIdentifier(), startInclusive, endInclusive);
+    currentContainer.addChild(classMethod, map);
+    log("Hello from mixin method ${node.getNameIdentifier()}");
+    super.visitMixinMethod(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitNamedMixin(
+      NamedMixinApplicationEnd node, Token startInclusive, Token endInclusive) {
+    TopLevelDeclarationEnd parent = node.parent! as TopLevelDeclarationEnd;
+    IdentifierHandle identifier = parent.getIdentifier();
+    log("Hello from named mixin ${identifier.token}");
+
+    Mixin mixin = new Mixin(
+        parent, identifier.token.lexeme, startInclusive, endInclusive);
+    currentContainer.addChild(mixin, map);
+
+    Container previousContainer = currentContainer;
+    currentContainer = mixin;
+    super.visitNamedMixin(node, startInclusive, endInclusive);
+    currentContainer = previousContainer;
+  }
+
+  @override
+  void visitPart(PartEnd node, Token startInclusive, Token endInclusive) {
+    String uriString = node.getPartUriString();
+    Uri partUri = uri.resolve(uriString);
+
+    Part i = new Part(node, partUri, startInclusive, endInclusive);
+    currentContainer.addChild(i, map);
+    log("Hello part");
+  }
+
+  @override
+  void visitPartOf(PartOfEnd node, Token startInclusive, Token endInclusive) {
+    // We'll assume we've gotten here via a "part" so we'll ignore that for now.
+    // TODO: partOfUri could - in an error case - be null.
+    PartOf partof = new PartOf(node, partOfUri!, startInclusive, endInclusive);
+    partof.marked = Coloring.Marked;
+    currentContainer.addChild(partof, map);
+  }
+
+  @override
+  void visitTopLevelFields(
+      TopLevelFieldsEnd node, Token startInclusive, Token endInclusive) {
+    List<String> fields =
+        node.getFieldIdentifiers().map((e) => e.token.lexeme).toList();
+    TopLevelFields f =
+        new TopLevelFields(node, fields, startInclusive, endInclusive);
+    currentContainer.addChild(f, map);
+    log("Hello from top level fields ${fields.join(", ")}");
+    super.visitTopLevelFields(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitTopLevelMethod(
+      TopLevelMethodEnd node, Token startInclusive, Token endInclusive) {
+    TopLevelMethod m = new TopLevelMethod(node,
+        node.getNameIdentifier().token.lexeme, startInclusive, endInclusive);
+    currentContainer.addChild(m, map);
+    log("Hello from top level method ${node.getNameIdentifier().token}");
+    super.visitTopLevelMethod(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitTypedef(TypedefEnd node, Token startInclusive, Token endInclusive) {
+    Typedef t = new Typedef(node, node.getNameIdentifier().token.lexeme,
+        startInclusive, endInclusive);
+    currentContainer.addChild(t, map);
+    log("Hello from typedef ${node.getNameIdentifier().token}");
+    super.visitTypedef(node, startInclusive, endInclusive);
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/util/parser_ast.dart b/pkg/front_end/lib/src/fasta/util/parser_ast.dart
new file mode 100644
index 0000000..b648bfc
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/util/parser_ast.dart
@@ -0,0 +1,1578 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. 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' show Uint8List;
+
+import 'dart:io' show File;
+
+import 'package:_fe_analyzer_shared/src/messages/codes.dart';
+import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
+    show ScannerConfiguration;
+
+import 'package:_fe_analyzer_shared/src/parser/parser.dart'
+    show ClassMemberParser, Parser;
+
+import 'package:_fe_analyzer_shared/src/scanner/utf8_bytes_scanner.dart'
+    show Utf8BytesScanner;
+
+import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
+
+import 'package:_fe_analyzer_shared/src/parser/listener.dart'
+    show UnescapeErrorListener;
+
+import 'package:_fe_analyzer_shared/src/parser/identifier_context.dart';
+
+import 'package:_fe_analyzer_shared/src/parser/quote.dart' show unescapeString;
+
+import '../source/diet_parser.dart';
+
+import 'parser_ast_helper.dart';
+
+CompilationUnitEnd getAST(List<int> rawBytes,
+    {bool includeBody: true,
+    bool includeComments: false,
+    bool enableExtensionMethods: false,
+    bool enableNonNullable: false,
+    bool enableTripleShift: false,
+    List<Token>? languageVersionsSeen}) {
+  Uint8List bytes = new Uint8List(rawBytes.length + 1);
+  bytes.setRange(0, rawBytes.length, rawBytes);
+
+  ScannerConfiguration scannerConfiguration = new ScannerConfiguration(
+      enableExtensionMethods: enableExtensionMethods,
+      enableNonNullable: enableNonNullable,
+      enableTripleShift: enableTripleShift);
+
+  Utf8BytesScanner scanner = new Utf8BytesScanner(
+    bytes,
+    includeComments: includeComments,
+    configuration: scannerConfiguration,
+    languageVersionChanged: (scanner, languageVersion) {
+      // For now don't do anything, but having it (making it non-null) means the
+      // configuration won't be reset.
+      languageVersionsSeen?.add(languageVersion);
+    },
+  );
+  Token firstToken = scanner.tokenize();
+  // ignore: unnecessary_null_comparison
+  if (firstToken == null) {
+    throw "firstToken is null";
+  }
+
+  ParserASTListener listener = new ParserASTListener();
+  Parser parser;
+  if (includeBody) {
+    parser = new Parser(listener,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
+  } else {
+    parser = new ClassMemberParser(listener,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
+  }
+  parser.parseUnit(firstToken);
+  return listener.data.single as CompilationUnitEnd;
+}
+
+/// Best-effort visitor for ParserAstNode that visits top-level entries
+/// and class members only (i.e. no bodies, no field initializer content, no
+/// names etc).
+class ParserAstVisitor {
+  void accept(ParserAstNode node) {
+    if (node is CompilationUnitEnd ||
+        node is TopLevelDeclarationEnd ||
+        node is ClassOrMixinOrExtensionBodyEnd ||
+        node is MemberEnd) {
+      visitChildren(node);
+      return;
+    }
+
+    if (node.type == ParserAstType.BEGIN) {
+      // Ignored. These are basically just dummy nodes anyway.
+      assert(node.children == null);
+      return;
+    }
+    if (node.type == ParserAstType.HANDLE) {
+      // Ignored at least for know.
+      assert(node.children == null);
+      return;
+    }
+    if (node is TypeVariablesEnd ||
+        node is TypeArgumentsEnd ||
+        node is TypeListEnd ||
+        node is FunctionTypeEnd ||
+        node is BlockEnd) {
+      // Ignored at least for know.
+      return;
+    }
+    if (node is MetadataStarEnd) {
+      MetadataStarEnd metadata = node;
+      visitMetadataStar(metadata);
+      return;
+    }
+    if (node is TypedefEnd) {
+      TypedefEnd typedefDecl = node;
+      visitTypedef(
+          typedefDecl, typedefDecl.typedefKeyword, typedefDecl.endToken);
+      return;
+    }
+    if (node is ClassDeclarationEnd) {
+      ClassDeclarationEnd cls = node;
+      visitClass(cls, cls.beginToken, cls.endToken);
+      return;
+    }
+    if (node is TopLevelMethodEnd) {
+      TopLevelMethodEnd method = node;
+      visitTopLevelMethod(method, method.beginToken, method.endToken);
+      return;
+    }
+    if (node is ClassMethodEnd) {
+      ClassMethodEnd method = node;
+      visitClassMethod(method, method.beginToken, method.endToken);
+      return;
+    }
+    if (node is ExtensionMethodEnd) {
+      ExtensionMethodEnd method = node;
+      visitExtensionMethod(method, method.beginToken, method.endToken);
+      return;
+    }
+    if (node is MixinMethodEnd) {
+      MixinMethodEnd method = node;
+      visitMixinMethod(method, method.beginToken, method.endToken);
+      return;
+    }
+    if (node is ImportEnd) {
+      ImportEnd import = node;
+      visitImport(import, import.importKeyword, import.semicolon);
+      return;
+    }
+    if (node is ExportEnd) {
+      ExportEnd export = node;
+      visitExport(export, export.exportKeyword, export.semicolon);
+      return;
+    }
+    if (node is TopLevelFieldsEnd) {
+      // TODO(jensj): Possibly this could go into more details too
+      // (e.g. to split up a field declaration).
+      TopLevelFieldsEnd fields = node;
+      visitTopLevelFields(fields, fields.beginToken, fields.endToken);
+      return;
+    }
+    if (node is ClassFieldsEnd) {
+      // TODO(jensj): Possibly this could go into more details too
+      // (e.g. to split up a field declaration).
+      ClassFieldsEnd fields = node;
+      visitClassFields(fields, fields.beginToken, fields.endToken);
+      return;
+    }
+    if (node is ExtensionFieldsEnd) {
+      // TODO(jensj): Possibly this could go into more details too
+      // (e.g. to split up a field declaration).
+      ExtensionFieldsEnd fields = node;
+      visitExtensionFields(fields, fields.beginToken, fields.endToken);
+      return;
+    }
+    if (node is MixinFieldsEnd) {
+      // TODO(jensj): Possibly this could go into more details too
+      // (e.g. to split up a field declaration).
+      MixinFieldsEnd fields = node;
+      visitMixinFields(fields, fields.beginToken, fields.endToken);
+      return;
+    }
+    if (node is NamedMixinApplicationEnd) {
+      NamedMixinApplicationEnd namedMixin = node;
+      visitNamedMixin(namedMixin, namedMixin.begin, namedMixin.endToken);
+      return;
+    }
+    if (node is MixinDeclarationEnd) {
+      MixinDeclarationEnd declaration = node;
+      visitMixin(declaration, declaration.mixinKeyword, declaration.endToken);
+      return;
+    }
+    if (node is EnumEnd) {
+      EnumEnd declaration = node;
+      visitEnum(declaration, declaration.enumKeyword,
+          declaration.leftBrace.endGroup!);
+      return;
+    }
+    if (node is LibraryNameEnd) {
+      LibraryNameEnd name = node;
+      visitLibraryName(name, name.libraryKeyword, name.semicolon);
+      return;
+    }
+    if (node is PartEnd) {
+      PartEnd part = node;
+      visitPart(part, part.partKeyword, part.semicolon);
+      return;
+    }
+    if (node is PartOfEnd) {
+      PartOfEnd partOf = node;
+      visitPartOf(partOf, partOf.partKeyword, partOf.semicolon);
+      return;
+    }
+    if (node is ExtensionDeclarationEnd) {
+      ExtensionDeclarationEnd ext = node;
+      visitExtension(ext, ext.extensionKeyword, ext.endToken);
+      return;
+    }
+    if (node is ClassConstructorEnd) {
+      ClassConstructorEnd decl = node;
+      visitClassConstructor(decl, decl.beginToken, decl.endToken);
+      return;
+    }
+    if (node is ExtensionConstructorEnd) {
+      ExtensionConstructorEnd decl = node;
+      visitExtensionConstructor(decl, decl.beginToken, decl.endToken);
+      return;
+    }
+    if (node is ClassFactoryMethodEnd) {
+      ClassFactoryMethodEnd decl = node;
+      visitClassFactoryMethod(decl, decl.beginToken, decl.endToken);
+      return;
+    }
+    if (node is ExtensionFactoryMethodEnd) {
+      ExtensionFactoryMethodEnd decl = node;
+      visitExtensionFactoryMethod(decl, decl.beginToken, decl.endToken);
+      return;
+    }
+    if (node is MetadataEnd) {
+      MetadataEnd decl = node;
+      // TODO(jensj): endToken is not part of the metadata! It's the first token
+      // of the next thing.
+      visitMetadata(decl, decl.beginToken, decl.endToken.previous!);
+      return;
+    }
+
+    throw "Unknown: $node (${node.runtimeType} @ ${node.what})";
+  }
+
+  void visitChildren(ParserAstNode node) {
+    if (node.children == null) return;
+    final int numChildren = node.children!.length;
+    for (int i = 0; i < numChildren; i++) {
+      ParserAstNode child = node.children![i];
+      accept(child);
+    }
+  }
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitImport(ImportEnd node, Token startInclusive, Token? endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitExport(ExportEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitTypedef(
+      TypedefEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers can call visitChildren on this node.
+  void visitMetadataStar(MetadataStarEnd node) {
+    visitChildren(node);
+  }
+
+  /// Note: Implementers can call visitChildren on this node.
+  void visitClass(
+      ClassDeclarationEnd node, Token startInclusive, Token endInclusive) {
+    visitChildren(node);
+  }
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitTopLevelMethod(
+      TopLevelMethodEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitClassMethod(
+      ClassMethodEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitExtensionMethod(
+      ExtensionMethodEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitMixinMethod(
+      MixinMethodEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitTopLevelFields(
+      TopLevelFieldsEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitClassFields(
+      ClassFieldsEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitExtensionFields(
+      ExtensionFieldsEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitMixinFields(
+      MixinFieldsEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers can call visitChildren on this node.
+  void visitNamedMixin(
+      NamedMixinApplicationEnd node, Token startInclusive, Token endInclusive) {
+    visitChildren(node);
+  }
+
+  /// Note: Implementers can call visitChildren on this node.
+  void visitMixin(
+      MixinDeclarationEnd node, Token startInclusive, Token endInclusive) {
+    visitChildren(node);
+  }
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitEnum(EnumEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitLibraryName(
+      LibraryNameEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitPart(PartEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitPartOf(PartOfEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers can call visitChildren on this node.
+  void visitExtension(
+      ExtensionDeclarationEnd node, Token startInclusive, Token endInclusive) {
+    visitChildren(node);
+  }
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitClassConstructor(
+      ClassConstructorEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitExtensionConstructor(
+      ExtensionConstructorEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitClassFactoryMethod(
+      ClassFactoryMethodEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitExtensionFactoryMethod(ExtensionFactoryMethodEnd node,
+      Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitMetadata(
+      MetadataEnd node, Token startInclusive, Token endInclusive) {}
+}
+
+extension GeneralASTContentExtension on ParserAstNode {
+  bool isClass() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first
+        // ignore: lines_longer_than_80_chars
+        is! ClassOrMixinOrNamedMixinApplicationPreludeBegin) {
+      return false;
+    }
+    if (children!.last is! ClassDeclarationEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  ClassDeclarationEnd asClass() {
+    if (!isClass()) throw "Not class";
+    return children!.last as ClassDeclarationEnd;
+  }
+
+  bool isImport() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! ImportEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  ImportEnd asImport() {
+    if (!isImport()) throw "Not import";
+    return children!.last as ImportEnd;
+  }
+
+  bool isExport() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! ExportEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  ExportEnd asExport() {
+    if (!isExport()) throw "Not export";
+    return children!.last as ExportEnd;
+  }
+
+  bool isEnum() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! EnumEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  EnumEnd asEnum() {
+    if (!isEnum()) throw "Not enum";
+    return children!.last as EnumEnd;
+  }
+
+  bool isTypedef() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! TypedefEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  TypedefEnd asTypedef() {
+    if (!isTypedef()) throw "Not typedef";
+    return children!.last as TypedefEnd;
+  }
+
+  bool isScript() {
+    if (this is! ScriptHandle) {
+      return false;
+    }
+    return true;
+  }
+
+  ScriptHandle asScript() {
+    if (!isScript()) throw "Not script";
+    return this as ScriptHandle;
+  }
+
+  bool isExtension() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! ExtensionDeclarationPreludeBegin) {
+      return false;
+    }
+    if (children!.last is! ExtensionDeclarationEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  ExtensionDeclarationEnd asExtension() {
+    if (!isExtension()) throw "Not extension";
+    return children!.last as ExtensionDeclarationEnd;
+  }
+
+  bool isInvalidTopLevelDeclaration() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! TopLevelMemberBegin) {
+      return false;
+    }
+    if (children!.last is! InvalidTopLevelDeclarationHandle) {
+      return false;
+    }
+
+    return true;
+  }
+
+  bool isRecoverableError() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! RecoverableErrorHandle) {
+      return false;
+    }
+
+    return true;
+  }
+
+  bool isRecoverImport() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! RecoverImportHandle) {
+      return false;
+    }
+
+    return true;
+  }
+
+  bool isMixinDeclaration() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first
+        // ignore: lines_longer_than_80_chars
+        is! ClassOrMixinOrNamedMixinApplicationPreludeBegin) {
+      return false;
+    }
+    if (children!.last is! MixinDeclarationEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  MixinDeclarationEnd asMixinDeclaration() {
+    if (!isMixinDeclaration()) throw "Not mixin declaration";
+    return children!.last as MixinDeclarationEnd;
+  }
+
+  bool isNamedMixinDeclaration() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first
+        // ignore: lines_longer_than_80_chars
+        is! ClassOrMixinOrNamedMixinApplicationPreludeBegin) {
+      return false;
+    }
+    if (children!.last is! NamedMixinApplicationEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  NamedMixinApplicationEnd asNamedMixinDeclaration() {
+    if (!isNamedMixinDeclaration()) throw "Not named mixin declaration";
+    return children!.last as NamedMixinApplicationEnd;
+  }
+
+  bool isTopLevelMethod() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! TopLevelMemberBegin) {
+      return false;
+    }
+    if (children!.last is! TopLevelMethodEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  TopLevelMethodEnd asTopLevelMethod() {
+    if (!isTopLevelMethod()) throw "Not top level method";
+    return children!.last as TopLevelMethodEnd;
+  }
+
+  bool isTopLevelFields() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! TopLevelMemberBegin) {
+      return false;
+    }
+    if (children!.last is! TopLevelFieldsEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  TopLevelFieldsEnd asTopLevelFields() {
+    if (!isTopLevelFields()) throw "Not top level fields";
+    return children!.last as TopLevelFieldsEnd;
+  }
+
+  bool isLibraryName() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! LibraryNameEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  LibraryNameEnd asLibraryName() {
+    if (!isLibraryName()) throw "Not library name";
+    return children!.last as LibraryNameEnd;
+  }
+
+  bool isPart() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! PartEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  PartEnd asPart() {
+    if (!isPart()) throw "Not part";
+    return children!.last as PartEnd;
+  }
+
+  bool isPartOf() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! PartOfEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  PartOfEnd asPartOf() {
+    if (!isPartOf()) throw "Not part of";
+    return children!.last as PartOfEnd;
+  }
+
+  bool isMetadata() {
+    if (this is! MetadataStarEnd) {
+      return false;
+    }
+    if (children!.first is! MetadataStarBegin) {
+      return false;
+    }
+    return true;
+  }
+
+  MetadataStarEnd asMetadata() {
+    if (!isMetadata()) throw "Not metadata";
+    return this as MetadataStarEnd;
+  }
+
+  bool isFunctionBody() {
+    if (this is BlockFunctionBodyEnd) return true;
+    return false;
+  }
+
+  BlockFunctionBodyEnd asFunctionBody() {
+    if (!isFunctionBody()) throw "Not function body";
+    return this as BlockFunctionBodyEnd;
+  }
+
+  List<E> recursivelyFind<E extends ParserAstNode>() {
+    Set<E> result = {};
+    _recursivelyFindInternal(this, result);
+    return result.toList();
+  }
+
+  static void _recursivelyFindInternal<E extends ParserAstNode>(
+      ParserAstNode node, Set<E> result) {
+    if (node is E) {
+      result.add(node);
+      return;
+    }
+    if (node.children == null) return;
+    for (ParserAstNode child in node.children!) {
+      _recursivelyFindInternal(child, result);
+    }
+  }
+
+  void debugDumpNodeRecursively({String indent = ""}) {
+    print("$indent${runtimeType} (${what}) "
+        "(${deprecatedArguments})");
+    if (children == null) return;
+    for (ParserAstNode child in children!) {
+      child.debugDumpNodeRecursively(indent: "  $indent");
+    }
+  }
+}
+
+extension MetadataStarExtension on MetadataStarEnd {
+  List<MetadataEnd> getMetadataEntries() {
+    List<MetadataEnd> result = [];
+    for (ParserAstNode topLevel in children!) {
+      if (topLevel is! MetadataEnd) continue;
+      result.add(topLevel);
+    }
+    return result;
+  }
+}
+
+extension CompilationUnitExtension on CompilationUnitEnd {
+  List<TopLevelDeclarationEnd> getClasses() {
+    List<TopLevelDeclarationEnd> result = [];
+    for (ParserAstNode topLevel in children!) {
+      if (!topLevel.isClass()) continue;
+      result.add(topLevel as TopLevelDeclarationEnd);
+    }
+    return result;
+  }
+
+  List<TopLevelDeclarationEnd> getMixinDeclarations() {
+    List<TopLevelDeclarationEnd> result = [];
+    for (ParserAstNode topLevel in children!) {
+      if (!topLevel.isMixinDeclaration()) continue;
+      result.add(topLevel as TopLevelDeclarationEnd);
+    }
+    return result;
+  }
+
+  List<ImportEnd> getImports() {
+    List<ImportEnd> result = [];
+    for (ParserAstNode topLevel in children!) {
+      if (!topLevel.isImport()) continue;
+      result.add(topLevel.children!.last as ImportEnd);
+    }
+    return result;
+  }
+
+  List<ExportEnd> getExports() {
+    List<ExportEnd> result = [];
+    for (ParserAstNode topLevel in children!) {
+      if (!topLevel.isExport()) continue;
+      result.add(topLevel.children!.last as ExportEnd);
+    }
+    return result;
+  }
+
+  // List<MetadataStarEnd> getMetadata() {
+  //   List<MetadataStarEnd> result = [];
+  //   for (ParserAstNode topLevel in children) {
+  //     if (!topLevel.isMetadata()) continue;
+  //     result.add(topLevel);
+  //   }
+  //   return result;
+  // }
+
+  // List<EnumEnd> getEnums() {
+  //   List<EnumEnd> result = [];
+  //   for (ParserAstNode topLevel in children) {
+  //     if (!topLevel.isEnum()) continue;
+  //     result.add(topLevel.children.last);
+  //   }
+  //   return result;
+  // }
+
+  // List<FunctionTypeAliasEnd> getTypedefs() {
+  //   List<FunctionTypeAliasEnd> result = [];
+  //   for (ParserAstNode topLevel in children) {
+  //     if (!topLevel.isTypedef()) continue;
+  //     result.add(topLevel.children.last);
+  //   }
+  //   return result;
+  // }
+
+  // List<MixinDeclarationEnd> getMixinDeclarations() {
+  //   List<MixinDeclarationEnd> result = [];
+  //   for (ParserAstNode topLevel in children) {
+  //     if (!topLevel.isMixinDeclaration()) continue;
+  //     result.add(topLevel.children.last);
+  //   }
+  //   return result;
+  // }
+
+  // List<TopLevelMethodEnd> getTopLevelMethods() {
+  //   List<TopLevelMethodEnd> result = [];
+  //   for (ParserAstNode topLevel in children) {
+  //     if (!topLevel.isTopLevelMethod()) continue;
+  //     result.add(topLevel.children.last);
+  //   }
+  //   return result;
+  // }
+
+  CompilationUnitBegin getBegin() {
+    return children!.first as CompilationUnitBegin;
+  }
+}
+
+extension TopLevelDeclarationExtension on TopLevelDeclarationEnd {
+  IdentifierHandle getIdentifier() {
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) return child;
+    }
+    throw "Not found.";
+  }
+
+  ClassDeclarationEnd getClassDeclaration() {
+    if (!isClass()) {
+      throw "Not a class";
+    }
+    for (ParserAstNode child in children!) {
+      if (child is ClassDeclarationEnd) {
+        return child;
+      }
+    }
+    throw "Not found.";
+  }
+}
+
+extension MixinDeclarationExtension on MixinDeclarationEnd {
+  ClassOrMixinOrExtensionBodyEnd getClassOrMixinOrExtensionBody() {
+    for (ParserAstNode child in children!) {
+      if (child is ClassOrMixinOrExtensionBodyEnd) {
+        return child;
+      }
+    }
+    throw "Not found.";
+  }
+}
+
+extension ClassDeclarationExtension on ClassDeclarationEnd {
+  ClassOrMixinOrExtensionBodyEnd getClassOrMixinOrExtensionBody() {
+    for (ParserAstNode child in children!) {
+      if (child is ClassOrMixinOrExtensionBodyEnd) {
+        return child;
+      }
+    }
+    throw "Not found.";
+  }
+
+  ClassExtendsHandle getClassExtends() {
+    for (ParserAstNode child in children!) {
+      if (child is ClassExtendsHandle) return child;
+    }
+    throw "Not found.";
+  }
+
+  ImplementsHandle getClassImplements() {
+    for (ParserAstNode child in children!) {
+      if (child is ImplementsHandle) {
+        return child;
+      }
+    }
+    throw "Not found.";
+  }
+
+  ClassWithClauseHandle? getClassWithClause() {
+    for (ParserAstNode child in children!) {
+      if (child is ClassWithClauseHandle) {
+        return child;
+      }
+    }
+    return null;
+  }
+}
+
+extension ClassOrMixinBodyExtension on ClassOrMixinOrExtensionBodyEnd {
+  List<MemberEnd> getMembers() {
+    List<MemberEnd> members = [];
+    for (ParserAstNode child in children!) {
+      if (child is MemberEnd) {
+        members.add(child);
+      }
+    }
+    return members;
+  }
+}
+
+extension MemberExtension on MemberEnd {
+  bool isClassConstructor() {
+    ParserAstNode child = children![1];
+    if (child is ClassConstructorEnd) return true;
+    return false;
+  }
+
+  ClassConstructorEnd getClassConstructor() {
+    ParserAstNode child = children![1];
+    if (child is ClassConstructorEnd) return child;
+    throw "Not found";
+  }
+
+  bool isClassFactoryMethod() {
+    ParserAstNode child = children![1];
+    if (child is ClassFactoryMethodEnd) return true;
+    return false;
+  }
+
+  ClassFactoryMethodEnd getClassFactoryMethod() {
+    ParserAstNode child = children![1];
+    if (child is ClassFactoryMethodEnd) return child;
+    throw "Not found";
+  }
+
+  bool isClassFields() {
+    ParserAstNode child = children![1];
+    if (child is ClassFieldsEnd) return true;
+    return false;
+  }
+
+  ClassFieldsEnd getClassFields() {
+    ParserAstNode child = children![1];
+    if (child is ClassFieldsEnd) return child;
+    throw "Not found";
+  }
+
+  bool isMixinFields() {
+    ParserAstNode child = children![1];
+    if (child is MixinFieldsEnd) return true;
+    return false;
+  }
+
+  MixinFieldsEnd getMixinFields() {
+    ParserAstNode child = children![1];
+    if (child is MixinFieldsEnd) return child;
+    throw "Not found";
+  }
+
+  bool isMixinMethod() {
+    ParserAstNode child = children![1];
+    if (child is MixinMethodEnd) return true;
+    return false;
+  }
+
+  MixinMethodEnd getMixinMethod() {
+    ParserAstNode child = children![1];
+    if (child is MixinMethodEnd) return child;
+    throw "Not found";
+  }
+
+  bool isMixinFactoryMethod() {
+    ParserAstNode child = children![1];
+    if (child is MixinFactoryMethodEnd) return true;
+    return false;
+  }
+
+  MixinFactoryMethodEnd getMixinFactoryMethod() {
+    ParserAstNode child = children![1];
+    if (child is MixinFactoryMethodEnd) return child;
+    throw "Not found";
+  }
+
+  bool isMixinConstructor() {
+    ParserAstNode child = children![1];
+    if (child is MixinConstructorEnd) return true;
+    return false;
+  }
+
+  MixinConstructorEnd getMixinConstructor() {
+    ParserAstNode child = children![1];
+    if (child is MixinConstructorEnd) return child;
+    throw "Not found";
+  }
+
+  bool isClassMethod() {
+    ParserAstNode child = children![1];
+    if (child is ClassMethodEnd) return true;
+    return false;
+  }
+
+  ClassMethodEnd getClassMethod() {
+    ParserAstNode child = children![1];
+    if (child is ClassMethodEnd) return child;
+    throw "Not found";
+  }
+
+  bool isClassRecoverableError() {
+    ParserAstNode child = children![1];
+    if (child is RecoverableErrorHandle) return true;
+    return false;
+  }
+}
+
+extension MixinFieldsExtension on MixinFieldsEnd {
+  List<IdentifierHandle> getFieldIdentifiers() {
+    int countLeft = count;
+    List<IdentifierHandle>? identifiers;
+    for (int i = children!.length - 1; i >= 0; i--) {
+      ParserAstNode child = children![i];
+      if (child is IdentifierHandle &&
+          child.context == IdentifierContext.fieldDeclaration) {
+        countLeft--;
+        if (identifiers == null) {
+          identifiers = new List<IdentifierHandle>.filled(count, child);
+        } else {
+          identifiers[countLeft] = child;
+        }
+        if (countLeft == 0) break;
+      }
+    }
+    if (countLeft != 0) throw "Didn't find the expected number of identifiers";
+    return identifiers ?? [];
+  }
+}
+
+extension ExtensionFieldsExtension on ExtensionFieldsEnd {
+  List<IdentifierHandle> getFieldIdentifiers() {
+    int countLeft = count;
+    List<IdentifierHandle>? identifiers;
+    for (int i = children!.length - 1; i >= 0; i--) {
+      ParserAstNode child = children![i];
+      if (child is IdentifierHandle &&
+          child.context == IdentifierContext.fieldDeclaration) {
+        countLeft--;
+        if (identifiers == null) {
+          identifiers = new List<IdentifierHandle>.filled(count, child);
+        } else {
+          identifiers[countLeft] = child;
+        }
+        if (countLeft == 0) break;
+      }
+    }
+    if (countLeft != 0) throw "Didn't find the expected number of identifiers";
+    return identifiers ?? [];
+  }
+}
+
+extension ClassFieldsExtension on ClassFieldsEnd {
+  List<IdentifierHandle> getFieldIdentifiers() {
+    int countLeft = count;
+    List<IdentifierHandle>? identifiers;
+    for (int i = children!.length - 1; i >= 0; i--) {
+      ParserAstNode child = children![i];
+      if (child is IdentifierHandle &&
+          child.context == IdentifierContext.fieldDeclaration) {
+        countLeft--;
+        if (identifiers == null) {
+          identifiers = new List<IdentifierHandle>.filled(count, child);
+        } else {
+          identifiers[countLeft] = child;
+        }
+        if (countLeft == 0) break;
+      }
+    }
+    if (countLeft != 0) throw "Didn't find the expected number of identifiers";
+    return identifiers ?? [];
+  }
+
+  TypeHandle? getFirstType() {
+    for (ParserAstNode child in children!) {
+      if (child is TypeHandle) return child;
+    }
+    return null;
+  }
+
+  FieldInitializerEnd? getFieldInitializer() {
+    for (ParserAstNode child in children!) {
+      if (child is FieldInitializerEnd) return child;
+    }
+    return null;
+  }
+}
+
+extension EnumExtension on EnumEnd {
+  List<IdentifierHandle> getIdentifiers() {
+    List<IdentifierHandle> ids = [];
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) ids.add(child);
+    }
+    return ids;
+  }
+}
+
+extension ExtensionDeclarationExtension on ExtensionDeclarationEnd {
+  List<IdentifierHandle> getIdentifiers() {
+    List<IdentifierHandle> ids = [];
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) ids.add(child);
+    }
+    return ids;
+  }
+}
+
+extension TopLevelMethodExtension on TopLevelMethodEnd {
+  IdentifierHandle getNameIdentifier() {
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) {
+        if (child.context == IdentifierContext.topLevelFunctionDeclaration) {
+          return child;
+        }
+      }
+    }
+    throw "Didn't find the name identifier!";
+  }
+}
+
+extension TypedefExtension on TypedefEnd {
+  IdentifierHandle getNameIdentifier() {
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) {
+        if (child.context == IdentifierContext.typedefDeclaration) {
+          return child;
+        }
+      }
+    }
+    throw "Didn't find the name identifier!";
+  }
+}
+
+extension ImportExtension on ImportEnd {
+  IdentifierHandle? getImportPrefix() {
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) {
+        if (child.context == IdentifierContext.importPrefixDeclaration) {
+          return child;
+        }
+      }
+    }
+  }
+
+  String getImportUriString() {
+    StringBuffer sb = new StringBuffer();
+    bool foundOne = false;
+    for (ParserAstNode child in children!) {
+      if (child is LiteralStringEnd) {
+        LiteralStringBegin uri = child.children!.single as LiteralStringBegin;
+        sb.write(unescapeString(
+            uri.token.lexeme, uri.token, const UnescapeErrorListenerDummy()));
+        foundOne = true;
+      }
+    }
+    if (!foundOne) throw "Didn't find any";
+    return sb.toString();
+  }
+
+  List<String>? getConditionalImportUriStrings() {
+    List<String>? result;
+    for (ParserAstNode child in children!) {
+      if (child is ConditionalUrisEnd) {
+        for (ParserAstNode child2 in child.children!) {
+          if (child2 is ConditionalUriEnd) {
+            LiteralStringEnd end = child2.children!.last as LiteralStringEnd;
+            LiteralStringBegin uri = end.children!.single as LiteralStringBegin;
+            (result ??= []).add(unescapeString(uri.token.lexeme, uri.token,
+                const UnescapeErrorListenerDummy()));
+          }
+        }
+        return result;
+      }
+    }
+    return result;
+  }
+}
+
+extension ExportExtension on ExportEnd {
+  String getExportUriString() {
+    StringBuffer sb = new StringBuffer();
+    bool foundOne = false;
+    for (ParserAstNode child in children!) {
+      if (child is LiteralStringEnd) {
+        LiteralStringBegin uri = child.children!.single as LiteralStringBegin;
+        sb.write(unescapeString(
+            uri.token.lexeme, uri.token, const UnescapeErrorListenerDummy()));
+        foundOne = true;
+      }
+    }
+    if (!foundOne) throw "Didn't find any";
+    return sb.toString();
+  }
+
+  List<String>? getConditionalExportUriStrings() {
+    List<String>? result;
+    for (ParserAstNode child in children!) {
+      if (child is ConditionalUrisEnd) {
+        for (ParserAstNode child2 in child.children!) {
+          if (child2 is ConditionalUriEnd) {
+            LiteralStringEnd end = child2.children!.last as LiteralStringEnd;
+            LiteralStringBegin uri = end.children!.single as LiteralStringBegin;
+            (result ??= []).add(unescapeString(uri.token.lexeme, uri.token,
+                const UnescapeErrorListenerDummy()));
+          }
+        }
+        return result;
+      }
+    }
+    return result;
+  }
+}
+
+extension PartExtension on PartEnd {
+  String getPartUriString() {
+    StringBuffer sb = new StringBuffer();
+    bool foundOne = false;
+    for (ParserAstNode child in children!) {
+      if (child is LiteralStringEnd) {
+        LiteralStringBegin uri = child.children!.single as LiteralStringBegin;
+        sb.write(unescapeString(
+            uri.token.lexeme, uri.token, const UnescapeErrorListenerDummy()));
+        foundOne = true;
+      }
+    }
+    if (!foundOne) throw "Didn't find any";
+    return sb.toString();
+  }
+}
+
+class UnescapeErrorListenerDummy implements UnescapeErrorListener {
+  const UnescapeErrorListenerDummy();
+
+  @override
+  void handleUnescapeError(
+      Message message, covariant location, int offset, int length) {
+    // Purposely doesn't do anything.
+  }
+}
+
+extension TopLevelFieldsExtension on TopLevelFieldsEnd {
+  List<IdentifierHandle> getFieldIdentifiers() {
+    int countLeft = count;
+    List<IdentifierHandle>? identifiers;
+    for (int i = children!.length - 1; i >= 0; i--) {
+      ParserAstNode child = children![i];
+      if (child is IdentifierHandle &&
+          child.context == IdentifierContext.topLevelVariableDeclaration) {
+        countLeft--;
+        if (identifiers == null) {
+          identifiers = new List<IdentifierHandle>.filled(count, child);
+        } else {
+          identifiers[countLeft] = child;
+        }
+        if (countLeft == 0) break;
+      }
+    }
+    if (countLeft != 0) throw "Didn't find the expected number of identifiers";
+    return identifiers ?? [];
+  }
+}
+
+extension ClassMethodExtension on ClassMethodEnd {
+  BlockFunctionBodyEnd? getBlockFunctionBody() {
+    for (ParserAstNode child in children!) {
+      if (child is BlockFunctionBodyEnd) {
+        return child;
+      }
+    }
+    return null;
+  }
+
+  String getNameIdentifier() {
+    bool foundType = false;
+    for (ParserAstNode child in children!) {
+      if (child is TypeHandle ||
+          child is NoTypeHandle ||
+          child is VoidKeywordHandle ||
+          child is FunctionTypeEnd) {
+        foundType = true;
+      }
+      if (foundType && child is IdentifierHandle) {
+        return child.token.lexeme;
+      } else if (foundType && child is OperatorNameHandle) {
+        return child.token.lexeme;
+      }
+    }
+    throw "No identifier found: $children";
+  }
+}
+
+extension MixinMethodExtension on MixinMethodEnd {
+  String getNameIdentifier() {
+    bool foundType = false;
+    for (ParserAstNode child in children!) {
+      if (child is TypeHandle ||
+          child is NoTypeHandle ||
+          child is VoidKeywordHandle) {
+        foundType = true;
+      }
+      if (foundType && child is IdentifierHandle) {
+        return child.token.lexeme;
+      } else if (foundType && child is OperatorNameHandle) {
+        return child.token.lexeme;
+      }
+    }
+    throw "No identifier found: $children";
+  }
+}
+
+extension ExtensionMethodExtension on ExtensionMethodEnd {
+  String getNameIdentifier() {
+    bool foundType = false;
+    for (ParserAstNode child in children!) {
+      if (child is TypeHandle ||
+          child is NoTypeHandle ||
+          child is VoidKeywordHandle) {
+        foundType = true;
+      }
+      if (foundType && child is IdentifierHandle) {
+        return child.token.lexeme;
+      } else if (foundType && child is OperatorNameHandle) {
+        return child.token.lexeme;
+      }
+    }
+    throw "No identifier found: $children";
+  }
+}
+
+extension ClassFactoryMethodExtension on ClassFactoryMethodEnd {
+  List<IdentifierHandle> getIdentifiers() {
+    List<IdentifierHandle> result = [];
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) {
+        result.add(child);
+      } else if (child is FormalParametersEnd) {
+        break;
+      }
+    }
+    return result;
+  }
+}
+
+extension ClassConstructorExtension on ClassConstructorEnd {
+  FormalParametersEnd getFormalParameters() {
+    for (ParserAstNode child in children!) {
+      if (child is FormalParametersEnd) {
+        return child;
+      }
+    }
+    throw "Not found";
+  }
+
+  InitializersEnd? getInitializers() {
+    for (ParserAstNode child in children!) {
+      if (child is InitializersEnd) {
+        return child;
+      }
+    }
+    return null;
+  }
+
+  BlockFunctionBodyEnd? getBlockFunctionBody() {
+    for (ParserAstNode child in children!) {
+      if (child is BlockFunctionBodyEnd) {
+        return child;
+      }
+    }
+    return null;
+  }
+
+  List<IdentifierHandle> getIdentifiers() {
+    List<IdentifierHandle> result = [];
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) {
+        result.add(child);
+      }
+    }
+    return result;
+  }
+}
+
+extension FormalParametersExtension on FormalParametersEnd {
+  List<FormalParameterEnd> getFormalParameters() {
+    List<FormalParameterEnd> result = [];
+    for (ParserAstNode child in children!) {
+      if (child is FormalParameterEnd) {
+        result.add(child);
+      }
+    }
+    return result;
+  }
+
+  OptionalFormalParametersEnd? getOptionalFormalParameters() {
+    for (ParserAstNode child in children!) {
+      if (child is OptionalFormalParametersEnd) {
+        return child;
+      }
+    }
+    return null;
+  }
+}
+
+extension FormalParameterExtension on FormalParameterEnd {
+  FormalParameterBegin getBegin() {
+    return children!.first as FormalParameterBegin;
+  }
+}
+
+extension OptionalFormalParametersExtension on OptionalFormalParametersEnd {
+  List<FormalParameterEnd> getFormalParameters() {
+    List<FormalParameterEnd> result = [];
+    for (ParserAstNode child in children!) {
+      if (child is FormalParameterEnd) {
+        result.add(child);
+      }
+    }
+    return result;
+  }
+}
+
+extension InitializersExtension on InitializersEnd {
+  List<InitializerEnd> getInitializers() {
+    List<InitializerEnd> result = [];
+    for (ParserAstNode child in children!) {
+      if (child is InitializerEnd) {
+        result.add(child);
+      }
+    }
+    return result;
+  }
+
+  InitializersBegin getBegin() {
+    return children!.first as InitializersBegin;
+  }
+}
+
+extension InitializerExtension on InitializerEnd {
+  InitializerBegin getBegin() {
+    return children!.first as InitializerBegin;
+  }
+}
+
+void main(List<String> args) {
+  File f = new File(args[0]);
+  Uint8List data = f.readAsBytesSync();
+  ParserAstNode ast = getAST(data);
+  if (args.length > 1 && args[1] == "--benchmark") {
+    Stopwatch stopwatch = new Stopwatch()..start();
+    int numRuns = 100;
+    for (int i = 0; i < numRuns; i++) {
+      ParserAstNode ast2 = getAST(data);
+      if (ast.what != ast2.what) {
+        throw "Not the same result every time";
+      }
+    }
+    stopwatch.stop();
+    print("First $numRuns took ${stopwatch.elapsedMilliseconds} ms "
+        "(i.e. ${stopwatch.elapsedMilliseconds / numRuns}ms/iteration)");
+    stopwatch = new Stopwatch()..start();
+    numRuns = 2500;
+    for (int i = 0; i < numRuns; i++) {
+      ParserAstNode ast2 = getAST(data);
+      if (ast.what != ast2.what) {
+        throw "Not the same result every time";
+      }
+    }
+    stopwatch.stop();
+    print("Next $numRuns took ${stopwatch.elapsedMilliseconds} ms "
+        "(i.e. ${stopwatch.elapsedMilliseconds / numRuns}ms/iteration)");
+  } else {
+    print(ast);
+  }
+}
+
+class ParserASTListener extends AbstractParserAstListener {
+  @override
+  void seen(ParserAstNode entry) {
+    switch (entry.type) {
+      case ParserAstType.BEGIN:
+      case ParserAstType.HANDLE:
+        // This just adds stuff.
+        data.add(entry);
+        break;
+      case ParserAstType.END:
+        // End should gobble up everything until the corresponding begin (which
+        // should be the latest begin).
+        int? beginIndex;
+        for (int i = data.length - 1; i >= 0; i--) {
+          if (data[i].type == ParserAstType.BEGIN) {
+            beginIndex = i;
+            break;
+          }
+        }
+        if (beginIndex == null) {
+          throw "Couldn't find a begin for ${entry.what}. Has:\n"
+              "${data.map((e) => "${e.what}: ${e.type}").join("\n")}";
+        }
+        String begin = data[beginIndex].what;
+        String end = entry.what;
+        if (begin == end) {
+          // Exact match.
+        } else if (end == "TopLevelDeclaration" &&
+            (begin == "ExtensionDeclarationPrelude" ||
+                begin == "ClassOrMixinOrNamedMixinApplicationPrelude" ||
+                begin == "TopLevelMember" ||
+                begin == "UncategorizedTopLevelDeclaration")) {
+          // endTopLevelDeclaration is started by one of
+          // beginExtensionDeclarationPrelude,
+          // beginClassOrNamedMixinApplicationPrelude
+          // beginTopLevelMember or beginUncategorizedTopLevelDeclaration.
+        } else if (begin == "Method" &&
+            (end == "ClassConstructor" ||
+                end == "ClassMethod" ||
+                end == "ExtensionConstructor" ||
+                end == "ExtensionMethod" ||
+                end == "MixinConstructor" ||
+                end == "MixinMethod" ||
+                end == "EnumConstructor" ||
+                end == "EnumMethod")) {
+          // beginMethod is ended by one of endClassConstructor,
+          // endClassMethod, endExtensionMethod, endMixinConstructor,
+          // endMixinMethod, endEnumMethod or endEnumConstructor.
+        } else if (begin == "Fields" &&
+            (end == "TopLevelFields" ||
+                end == "ClassFields" ||
+                end == "MixinFields" ||
+                end == "ExtensionFields" ||
+                end == "EnumFields")) {
+          // beginFields is ended by one of endTopLevelFields, endMixinFields,
+          // endEnumFields or endExtensionFields.
+        } else if (begin == "ForStatement" && end == "ForIn") {
+          // beginForStatement is ended by either endForStatement or endForIn.
+        } else if (begin == "FactoryMethod" &&
+            (end == "ClassFactoryMethod" ||
+                end == "MixinFactoryMethod" ||
+                end == "ExtensionFactoryMethod" ||
+                end == "EnumFactoryMethod")) {
+          // beginFactoryMethod is ended by either endClassFactoryMethod,
+          // endMixinFactoryMethod, endExtensionFactoryMethod, or
+          // endEnumFactoryMethod.
+        } else if (begin == "ForControlFlow" && (end == "ForInControlFlow")) {
+          // beginForControlFlow is ended by either endForControlFlow or
+          // endForInControlFlow.
+        } else if (begin == "IfControlFlow" && (end == "IfElseControlFlow")) {
+          // beginIfControlFlow is ended by either endIfControlFlow or
+          // endIfElseControlFlow.
+        } else if (begin == "AwaitExpression" &&
+            (end == "InvalidAwaitExpression")) {
+          // beginAwaitExpression is ended by either endAwaitExpression or
+          // endInvalidAwaitExpression.
+        } else if (begin == "YieldStatement" &&
+            (end == "InvalidYieldStatement")) {
+          // beginYieldStatement is ended by either endYieldStatement or
+          // endInvalidYieldStatement.
+        } else {
+          throw "Unknown combination: begin$begin and end$end";
+        }
+        List<ParserAstNode> children = data.sublist(beginIndex);
+        for (ParserAstNode child in children) {
+          child.parent = entry;
+        }
+        data.length = beginIndex;
+        data.add(entry..children = children);
+        break;
+    }
+  }
+
+  @override
+  void reportVarianceModifierNotEnabled(Token? variance) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  Uri get uri => throw new UnimplementedError();
+
+  @override
+  void logEvent(String name) {
+    throw new UnimplementedError();
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart b/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart
new file mode 100644
index 0000000..13348fd
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart
@@ -0,0 +1,7167 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:_fe_analyzer_shared/src/parser/assert.dart';
+import 'package:_fe_analyzer_shared/src/parser/block_kind.dart';
+import 'package:_fe_analyzer_shared/src/parser/constructor_reference_context.dart';
+import 'package:_fe_analyzer_shared/src/parser/declaration_kind.dart';
+import 'package:_fe_analyzer_shared/src/parser/formal_parameter_kind.dart';
+import 'package:_fe_analyzer_shared/src/parser/identifier_context.dart';
+import 'package:_fe_analyzer_shared/src/parser/listener.dart';
+import 'package:_fe_analyzer_shared/src/parser/member_kind.dart';
+import 'package:_fe_analyzer_shared/src/scanner/error_token.dart';
+import 'package:_fe_analyzer_shared/src/scanner/token.dart';
+import 'package:front_end/src/fasta/messages.dart';
+
+// ignore_for_file: lines_longer_than_80_chars
+
+// THIS FILE IS AUTO GENERATED BY
+// 'tool/_fasta/parser_ast_helper_creator.dart'
+// Run this command to update it:
+// 'dart pkg/front_end/tool/_fasta/parser_ast_helper_creator.dart'
+
+abstract class ParserAstNode {
+  final String what;
+  final ParserAstType type;
+  Map<String, Object?> get deprecatedArguments;
+  List<ParserAstNode>? children;
+  ParserAstNode? parent;
+
+  ParserAstNode(this.what, this.type);
+
+  // TODO(jensj): Compare two ASTs.
+}
+
+enum ParserAstType { BEGIN, END, HANDLE }
+
+abstract class AbstractParserAstListener implements Listener {
+  List<ParserAstNode> data = [];
+
+  void seen(ParserAstNode entry);
+
+  @override
+  void beginArguments(Token token) {
+    ArgumentsBegin data = new ArgumentsBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endArguments(int count, Token beginToken, Token endToken) {
+    ArgumentsEnd data = new ArgumentsEnd(ParserAstType.END,
+        count: count, beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleAsyncModifier(Token? asyncToken, Token? starToken) {
+    AsyncModifierHandle data = new AsyncModifierHandle(ParserAstType.HANDLE,
+        asyncToken: asyncToken, starToken: starToken);
+    seen(data);
+  }
+
+  @override
+  void beginAwaitExpression(Token token) {
+    AwaitExpressionBegin data =
+        new AwaitExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endAwaitExpression(Token beginToken, Token endToken) {
+    AwaitExpressionEnd data = new AwaitExpressionEnd(ParserAstType.END,
+        beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endInvalidAwaitExpression(
+      Token beginToken, Token endToken, MessageCode errorCode) {
+    InvalidAwaitExpressionEnd data = new InvalidAwaitExpressionEnd(
+        ParserAstType.END,
+        beginToken: beginToken,
+        endToken: endToken,
+        errorCode: errorCode);
+    seen(data);
+  }
+
+  @override
+  void beginBlock(Token token, BlockKind blockKind) {
+    BlockBegin data =
+        new BlockBegin(ParserAstType.BEGIN, token: token, blockKind: blockKind);
+    seen(data);
+  }
+
+  @override
+  void endBlock(
+      int count, Token beginToken, Token endToken, BlockKind blockKind) {
+    BlockEnd data = new BlockEnd(ParserAstType.END,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken,
+        blockKind: blockKind);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidTopLevelBlock(Token token) {
+    InvalidTopLevelBlockHandle data =
+        new InvalidTopLevelBlockHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginCascade(Token token) {
+    CascadeBegin data = new CascadeBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endCascade() {
+    CascadeEnd data = new CascadeEnd(ParserAstType.END);
+    seen(data);
+  }
+
+  @override
+  void beginCaseExpression(Token caseKeyword) {
+    CaseExpressionBegin data =
+        new CaseExpressionBegin(ParserAstType.BEGIN, caseKeyword: caseKeyword);
+    seen(data);
+  }
+
+  @override
+  void endCaseExpression(Token colon) {
+    CaseExpressionEnd data =
+        new CaseExpressionEnd(ParserAstType.END, colon: colon);
+    seen(data);
+  }
+
+  @override
+  void beginClassOrMixinOrExtensionBody(DeclarationKind kind, Token token) {
+    ClassOrMixinOrExtensionBodyBegin data =
+        new ClassOrMixinOrExtensionBodyBegin(ParserAstType.BEGIN,
+            kind: kind, token: token);
+    seen(data);
+  }
+
+  @override
+  void endClassOrMixinOrExtensionBody(
+      DeclarationKind kind, int memberCount, Token beginToken, Token endToken) {
+    ClassOrMixinOrExtensionBodyEnd data = new ClassOrMixinOrExtensionBodyEnd(
+        ParserAstType.END,
+        kind: kind,
+        memberCount: memberCount,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginClassOrMixinOrNamedMixinApplicationPrelude(Token token) {
+    ClassOrMixinOrNamedMixinApplicationPreludeBegin data =
+        new ClassOrMixinOrNamedMixinApplicationPreludeBegin(ParserAstType.BEGIN,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void beginClassDeclaration(Token begin, Token? abstractToken, Token name) {
+    ClassDeclarationBegin data = new ClassDeclarationBegin(ParserAstType.BEGIN,
+        begin: begin, abstractToken: abstractToken, name: name);
+    seen(data);
+  }
+
+  @override
+  void handleClassExtends(Token? extendsKeyword, int typeCount) {
+    ClassExtendsHandle data = new ClassExtendsHandle(ParserAstType.HANDLE,
+        extendsKeyword: extendsKeyword, typeCount: typeCount);
+    seen(data);
+  }
+
+  @override
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    ImplementsHandle data = new ImplementsHandle(ParserAstType.HANDLE,
+        implementsKeyword: implementsKeyword, interfacesCount: interfacesCount);
+    seen(data);
+  }
+
+  @override
+  void handleExtensionShowHide(Token? showKeyword, int showElementCount,
+      Token? hideKeyword, int hideElementCount) {
+    ExtensionShowHideHandle data = new ExtensionShowHideHandle(
+        ParserAstType.HANDLE,
+        showKeyword: showKeyword,
+        showElementCount: showElementCount,
+        hideKeyword: hideKeyword,
+        hideElementCount: hideElementCount);
+    seen(data);
+  }
+
+  @override
+  void handleClassHeader(Token begin, Token classKeyword, Token? nativeToken) {
+    ClassHeaderHandle data = new ClassHeaderHandle(ParserAstType.HANDLE,
+        begin: begin, classKeyword: classKeyword, nativeToken: nativeToken);
+    seen(data);
+  }
+
+  @override
+  void handleRecoverClassHeader() {
+    RecoverClassHeaderHandle data =
+        new RecoverClassHeaderHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void endClassDeclaration(Token beginToken, Token endToken) {
+    ClassDeclarationEnd data = new ClassDeclarationEnd(ParserAstType.END,
+        beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginMixinDeclaration(Token mixinKeyword, Token name) {
+    MixinDeclarationBegin data = new MixinDeclarationBegin(ParserAstType.BEGIN,
+        mixinKeyword: mixinKeyword, name: name);
+    seen(data);
+  }
+
+  @override
+  void handleMixinOn(Token? onKeyword, int typeCount) {
+    MixinOnHandle data = new MixinOnHandle(ParserAstType.HANDLE,
+        onKeyword: onKeyword, typeCount: typeCount);
+    seen(data);
+  }
+
+  @override
+  void handleMixinHeader(Token mixinKeyword) {
+    MixinHeaderHandle data =
+        new MixinHeaderHandle(ParserAstType.HANDLE, mixinKeyword: mixinKeyword);
+    seen(data);
+  }
+
+  @override
+  void handleRecoverMixinHeader() {
+    RecoverMixinHeaderHandle data =
+        new RecoverMixinHeaderHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void endMixinDeclaration(Token mixinKeyword, Token endToken) {
+    MixinDeclarationEnd data = new MixinDeclarationEnd(ParserAstType.END,
+        mixinKeyword: mixinKeyword, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginUncategorizedTopLevelDeclaration(Token token) {
+    UncategorizedTopLevelDeclarationBegin data =
+        new UncategorizedTopLevelDeclarationBegin(ParserAstType.BEGIN,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void beginExtensionDeclarationPrelude(Token extensionKeyword) {
+    ExtensionDeclarationPreludeBegin data =
+        new ExtensionDeclarationPreludeBegin(ParserAstType.BEGIN,
+            extensionKeyword: extensionKeyword);
+    seen(data);
+  }
+
+  @override
+  void beginExtensionDeclaration(Token extensionKeyword, Token? name) {
+    ExtensionDeclarationBegin data = new ExtensionDeclarationBegin(
+        ParserAstType.BEGIN,
+        extensionKeyword: extensionKeyword,
+        name: name);
+    seen(data);
+  }
+
+  @override
+  void endExtensionDeclaration(Token extensionKeyword, Token? typeKeyword,
+      Token onKeyword, Token? showKeyword, Token? hideKeyword, Token endToken) {
+    ExtensionDeclarationEnd data = new ExtensionDeclarationEnd(
+        ParserAstType.END,
+        extensionKeyword: extensionKeyword,
+        typeKeyword: typeKeyword,
+        onKeyword: onKeyword,
+        showKeyword: showKeyword,
+        hideKeyword: hideKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginCombinators(Token token) {
+    CombinatorsBegin data =
+        new CombinatorsBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endCombinators(int count) {
+    CombinatorsEnd data = new CombinatorsEnd(ParserAstType.END, count: count);
+    seen(data);
+  }
+
+  @override
+  void beginCompilationUnit(Token token) {
+    CompilationUnitBegin data =
+        new CompilationUnitBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleDirectivesOnly() {
+    DirectivesOnlyHandle data = new DirectivesOnlyHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void endCompilationUnit(int count, Token token) {
+    CompilationUnitEnd data =
+        new CompilationUnitEnd(ParserAstType.END, count: count, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginConstLiteral(Token token) {
+    ConstLiteralBegin data =
+        new ConstLiteralBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endConstLiteral(Token token) {
+    ConstLiteralEnd data = new ConstLiteralEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginConstructorReference(Token start) {
+    ConstructorReferenceBegin data =
+        new ConstructorReferenceBegin(ParserAstType.BEGIN, start: start);
+    seen(data);
+  }
+
+  @override
+  void endConstructorReference(Token start, Token? periodBeforeName,
+      Token endToken, ConstructorReferenceContext constructorReferenceContext) {
+    ConstructorReferenceEnd data = new ConstructorReferenceEnd(
+        ParserAstType.END,
+        start: start,
+        periodBeforeName: periodBeforeName,
+        endToken: endToken,
+        constructorReferenceContext: constructorReferenceContext);
+    seen(data);
+  }
+
+  @override
+  void beginDoWhileStatement(Token token) {
+    DoWhileStatementBegin data =
+        new DoWhileStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endDoWhileStatement(
+      Token doKeyword, Token whileKeyword, Token endToken) {
+    DoWhileStatementEnd data = new DoWhileStatementEnd(ParserAstType.END,
+        doKeyword: doKeyword, whileKeyword: whileKeyword, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginDoWhileStatementBody(Token token) {
+    DoWhileStatementBodyBegin data =
+        new DoWhileStatementBodyBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endDoWhileStatementBody(Token token) {
+    DoWhileStatementBodyEnd data =
+        new DoWhileStatementBodyEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginWhileStatementBody(Token token) {
+    WhileStatementBodyBegin data =
+        new WhileStatementBodyBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endWhileStatementBody(Token token) {
+    WhileStatementBodyEnd data =
+        new WhileStatementBodyEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginEnum(Token enumKeyword) {
+    EnumBegin data =
+        new EnumBegin(ParserAstType.BEGIN, enumKeyword: enumKeyword);
+    seen(data);
+  }
+
+  @override
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
+    EnumEnd data = new EnumEnd(ParserAstType.END,
+        enumKeyword: enumKeyword,
+        leftBrace: leftBrace,
+        memberCount: memberCount);
+    seen(data);
+  }
+
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    EnumConstructorEnd data = new EnumConstructorEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    EnumElementsHandle data = new EnumElementsHandle(ParserAstType.HANDLE,
+        elementsEndToken: elementsEndToken, elementsCount: elementsCount);
+    seen(data);
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    EnumHeaderHandle data = new EnumHeaderHandle(ParserAstType.HANDLE,
+        enumKeyword: enumKeyword, leftBrace: leftBrace);
+    seen(data);
+  }
+
+  @override
+  void handleEnumElement(Token beginToken) {
+    EnumElementHandle data =
+        new EnumElementHandle(ParserAstType.HANDLE, beginToken: beginToken);
+    seen(data);
+  }
+
+  @override
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    EnumFactoryMethodEnd data = new EnumFactoryMethodEnd(ParserAstType.END,
+        beginToken: beginToken,
+        factoryKeyword: factoryKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginExport(Token token) {
+    ExportBegin data = new ExportBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endExport(Token exportKeyword, Token semicolon) {
+    ExportEnd data = new ExportEnd(ParserAstType.END,
+        exportKeyword: exportKeyword, semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleExtraneousExpression(Token token, Message message) {
+    ExtraneousExpressionHandle data = new ExtraneousExpressionHandle(
+        ParserAstType.HANDLE,
+        token: token,
+        message: message);
+    seen(data);
+  }
+
+  @override
+  void handleExpressionStatement(Token token) {
+    ExpressionStatementHandle data =
+        new ExpressionStatementHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginFactoryMethod(DeclarationKind declarationKind, Token lastConsumed,
+      Token? externalToken, Token? constToken) {
+    FactoryMethodBegin data = new FactoryMethodBegin(ParserAstType.BEGIN,
+        declarationKind: declarationKind,
+        lastConsumed: lastConsumed,
+        externalToken: externalToken,
+        constToken: constToken);
+    seen(data);
+  }
+
+  @override
+  void endClassFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    ClassFactoryMethodEnd data = new ClassFactoryMethodEnd(ParserAstType.END,
+        beginToken: beginToken,
+        factoryKeyword: factoryKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endMixinFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    MixinFactoryMethodEnd data = new MixinFactoryMethodEnd(ParserAstType.END,
+        beginToken: beginToken,
+        factoryKeyword: factoryKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endExtensionFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    ExtensionFactoryMethodEnd data = new ExtensionFactoryMethodEnd(
+        ParserAstType.END,
+        beginToken: beginToken,
+        factoryKeyword: factoryKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginFormalParameter(Token token, MemberKind kind, Token? requiredToken,
+      Token? covariantToken, Token? varFinalOrConst) {
+    FormalParameterBegin data = new FormalParameterBegin(ParserAstType.BEGIN,
+        token: token,
+        kind: kind,
+        requiredToken: requiredToken,
+        covariantToken: covariantToken,
+        varFinalOrConst: varFinalOrConst);
+    seen(data);
+  }
+
+  @override
+  void endFormalParameter(
+      Token? thisKeyword,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
+      Token nameToken,
+      Token? initializerStart,
+      Token? initializerEnd,
+      FormalParameterKind kind,
+      MemberKind memberKind) {
+    FormalParameterEnd data = new FormalParameterEnd(ParserAstType.END,
+        thisKeyword: thisKeyword,
+        superKeyword: superKeyword,
+        periodAfterThisOrSuper: periodAfterThisOrSuper,
+        nameToken: nameToken,
+        initializerStart: initializerStart,
+        initializerEnd: initializerEnd,
+        kind: kind,
+        memberKind: memberKind);
+    seen(data);
+  }
+
+  @override
+  void handleNoFormalParameters(Token token, MemberKind kind) {
+    NoFormalParametersHandle data = new NoFormalParametersHandle(
+        ParserAstType.HANDLE,
+        token: token,
+        kind: kind);
+    seen(data);
+  }
+
+  @override
+  void beginFormalParameters(Token token, MemberKind kind) {
+    FormalParametersBegin data = new FormalParametersBegin(ParserAstType.BEGIN,
+        token: token, kind: kind);
+    seen(data);
+  }
+
+  @override
+  void endFormalParameters(
+      int count, Token beginToken, Token endToken, MemberKind kind) {
+    FormalParametersEnd data = new FormalParametersEnd(ParserAstType.END,
+        count: count, beginToken: beginToken, endToken: endToken, kind: kind);
+    seen(data);
+  }
+
+  @override
+  void endClassFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    ClassFieldsEnd data = new ClassFieldsEnd(ParserAstType.END,
+        abstractToken: abstractToken,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endMixinFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    MixinFieldsEnd data = new MixinFieldsEnd(ParserAstType.END,
+        abstractToken: abstractToken,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endExtensionFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    ExtensionFieldsEnd data = new ExtensionFieldsEnd(ParserAstType.END,
+        abstractToken: abstractToken,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    EnumFieldsEnd data = new EnumFieldsEnd(ParserAstType.END,
+        abstractToken: abstractToken,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    EnumMethodEnd data = new EnumMethodEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleForInitializerEmptyStatement(Token token) {
+    ForInitializerEmptyStatementHandle data =
+        new ForInitializerEmptyStatementHandle(ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void handleForInitializerExpressionStatement(Token token, bool forIn) {
+    ForInitializerExpressionStatementHandle data =
+        new ForInitializerExpressionStatementHandle(ParserAstType.HANDLE,
+            token: token, forIn: forIn);
+    seen(data);
+  }
+
+  @override
+  void handleForInitializerLocalVariableDeclaration(Token token, bool forIn) {
+    ForInitializerLocalVariableDeclarationHandle data =
+        new ForInitializerLocalVariableDeclarationHandle(ParserAstType.HANDLE,
+            token: token, forIn: forIn);
+    seen(data);
+  }
+
+  @override
+  void beginForStatement(Token token) {
+    ForStatementBegin data =
+        new ForStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleForLoopParts(Token forKeyword, Token leftParen,
+      Token leftSeparator, int updateExpressionCount) {
+    ForLoopPartsHandle data = new ForLoopPartsHandle(ParserAstType.HANDLE,
+        forKeyword: forKeyword,
+        leftParen: leftParen,
+        leftSeparator: leftSeparator,
+        updateExpressionCount: updateExpressionCount);
+    seen(data);
+  }
+
+  @override
+  void endForStatement(Token endToken) {
+    ForStatementEnd data =
+        new ForStatementEnd(ParserAstType.END, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginForStatementBody(Token token) {
+    ForStatementBodyBegin data =
+        new ForStatementBodyBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endForStatementBody(Token token) {
+    ForStatementBodyEnd data =
+        new ForStatementBodyEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleForInLoopParts(Token? awaitToken, Token forToken,
+      Token leftParenthesis, Token inKeyword) {
+    ForInLoopPartsHandle data = new ForInLoopPartsHandle(ParserAstType.HANDLE,
+        awaitToken: awaitToken,
+        forToken: forToken,
+        leftParenthesis: leftParenthesis,
+        inKeyword: inKeyword);
+    seen(data);
+  }
+
+  @override
+  void endForIn(Token endToken) {
+    ForInEnd data = new ForInEnd(ParserAstType.END, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginForInExpression(Token token) {
+    ForInExpressionBegin data =
+        new ForInExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endForInExpression(Token token) {
+    ForInExpressionEnd data =
+        new ForInExpressionEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginForInBody(Token token) {
+    ForInBodyBegin data = new ForInBodyBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endForInBody(Token token) {
+    ForInBodyEnd data = new ForInBodyEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginNamedFunctionExpression(Token token) {
+    NamedFunctionExpressionBegin data =
+        new NamedFunctionExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endNamedFunctionExpression(Token endToken) {
+    NamedFunctionExpressionEnd data =
+        new NamedFunctionExpressionEnd(ParserAstType.END, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginLocalFunctionDeclaration(Token token) {
+    LocalFunctionDeclarationBegin data =
+        new LocalFunctionDeclarationBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endLocalFunctionDeclaration(Token endToken) {
+    LocalFunctionDeclarationEnd data =
+        new LocalFunctionDeclarationEnd(ParserAstType.END, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginBlockFunctionBody(Token token) {
+    BlockFunctionBodyBegin data =
+        new BlockFunctionBodyBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endBlockFunctionBody(int count, Token beginToken, Token endToken) {
+    BlockFunctionBodyEnd data = new BlockFunctionBodyEnd(ParserAstType.END,
+        count: count, beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleNoFunctionBody(Token token) {
+    NoFunctionBodyHandle data =
+        new NoFunctionBodyHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleFunctionBodySkipped(Token token, bool isExpressionBody) {
+    FunctionBodySkippedHandle data = new FunctionBodySkippedHandle(
+        ParserAstType.HANDLE,
+        token: token,
+        isExpressionBody: isExpressionBody);
+    seen(data);
+  }
+
+  @override
+  void beginFunctionName(Token token) {
+    FunctionNameBegin data =
+        new FunctionNameBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endFunctionName(Token beginToken, Token token) {
+    FunctionNameEnd data = new FunctionNameEnd(ParserAstType.END,
+        beginToken: beginToken, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginTypedef(Token token) {
+    TypedefBegin data = new TypedefBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endTypedef(Token typedefKeyword, Token? equals, Token endToken) {
+    TypedefEnd data = new TypedefEnd(ParserAstType.END,
+        typedefKeyword: typedefKeyword, equals: equals, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleClassWithClause(Token withKeyword) {
+    ClassWithClauseHandle data = new ClassWithClauseHandle(ParserAstType.HANDLE,
+        withKeyword: withKeyword);
+    seen(data);
+  }
+
+  @override
+  void handleClassNoWithClause() {
+    ClassNoWithClauseHandle data =
+        new ClassNoWithClauseHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void handleEnumWithClause(Token withKeyword) {
+    EnumWithClauseHandle data = new EnumWithClauseHandle(ParserAstType.HANDLE,
+        withKeyword: withKeyword);
+    seen(data);
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    EnumNoWithClauseHandle data =
+        new EnumNoWithClauseHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void beginNamedMixinApplication(
+      Token begin, Token? abstractToken, Token name) {
+    NamedMixinApplicationBegin data = new NamedMixinApplicationBegin(
+        ParserAstType.BEGIN,
+        begin: begin,
+        abstractToken: abstractToken,
+        name: name);
+    seen(data);
+  }
+
+  @override
+  void handleNamedMixinApplicationWithClause(Token withKeyword) {
+    NamedMixinApplicationWithClauseHandle data =
+        new NamedMixinApplicationWithClauseHandle(ParserAstType.HANDLE,
+            withKeyword: withKeyword);
+    seen(data);
+  }
+
+  @override
+  void endNamedMixinApplication(Token begin, Token classKeyword, Token equals,
+      Token? implementsKeyword, Token endToken) {
+    NamedMixinApplicationEnd data = new NamedMixinApplicationEnd(
+        ParserAstType.END,
+        begin: begin,
+        classKeyword: classKeyword,
+        equals: equals,
+        implementsKeyword: implementsKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginHide(Token hideKeyword) {
+    HideBegin data =
+        new HideBegin(ParserAstType.BEGIN, hideKeyword: hideKeyword);
+    seen(data);
+  }
+
+  @override
+  void endHide(Token hideKeyword) {
+    HideEnd data = new HideEnd(ParserAstType.END, hideKeyword: hideKeyword);
+    seen(data);
+  }
+
+  @override
+  void handleIdentifierList(int count) {
+    IdentifierListHandle data =
+        new IdentifierListHandle(ParserAstType.HANDLE, count: count);
+    seen(data);
+  }
+
+  @override
+  void beginTypeList(Token token) {
+    TypeListBegin data = new TypeListBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endTypeList(int count) {
+    TypeListEnd data = new TypeListEnd(ParserAstType.END, count: count);
+    seen(data);
+  }
+
+  @override
+  void beginIfStatement(Token token) {
+    IfStatementBegin data =
+        new IfStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endIfStatement(Token ifToken, Token? elseToken) {
+    IfStatementEnd data = new IfStatementEnd(ParserAstType.END,
+        ifToken: ifToken, elseToken: elseToken);
+    seen(data);
+  }
+
+  @override
+  void beginThenStatement(Token token) {
+    ThenStatementBegin data =
+        new ThenStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endThenStatement(Token token) {
+    ThenStatementEnd data =
+        new ThenStatementEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginElseStatement(Token token) {
+    ElseStatementBegin data =
+        new ElseStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endElseStatement(Token token) {
+    ElseStatementEnd data =
+        new ElseStatementEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginImport(Token importKeyword) {
+    ImportBegin data =
+        new ImportBegin(ParserAstType.BEGIN, importKeyword: importKeyword);
+    seen(data);
+  }
+
+  @override
+  void handleImportPrefix(Token? deferredKeyword, Token? asKeyword) {
+    ImportPrefixHandle data = new ImportPrefixHandle(ParserAstType.HANDLE,
+        deferredKeyword: deferredKeyword, asKeyword: asKeyword);
+    seen(data);
+  }
+
+  @override
+  void endImport(Token importKeyword, Token? semicolon) {
+    ImportEnd data = new ImportEnd(ParserAstType.END,
+        importKeyword: importKeyword, semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleRecoverImport(Token? semicolon) {
+    RecoverImportHandle data =
+        new RecoverImportHandle(ParserAstType.HANDLE, semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void beginConditionalUris(Token token) {
+    ConditionalUrisBegin data =
+        new ConditionalUrisBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endConditionalUris(int count) {
+    ConditionalUrisEnd data =
+        new ConditionalUrisEnd(ParserAstType.END, count: count);
+    seen(data);
+  }
+
+  @override
+  void beginConditionalUri(Token ifKeyword) {
+    ConditionalUriBegin data =
+        new ConditionalUriBegin(ParserAstType.BEGIN, ifKeyword: ifKeyword);
+    seen(data);
+  }
+
+  @override
+  void endConditionalUri(Token ifKeyword, Token leftParen, Token? equalSign) {
+    ConditionalUriEnd data = new ConditionalUriEnd(ParserAstType.END,
+        ifKeyword: ifKeyword, leftParen: leftParen, equalSign: equalSign);
+    seen(data);
+  }
+
+  @override
+  void handleDottedName(int count, Token firstIdentifier) {
+    DottedNameHandle data = new DottedNameHandle(ParserAstType.HANDLE,
+        count: count, firstIdentifier: firstIdentifier);
+    seen(data);
+  }
+
+  @override
+  void beginImplicitCreationExpression(Token token) {
+    ImplicitCreationExpressionBegin data =
+        new ImplicitCreationExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endImplicitCreationExpression(Token token, Token openAngleBracket) {
+    ImplicitCreationExpressionEnd data = new ImplicitCreationExpressionEnd(
+        ParserAstType.END,
+        token: token,
+        openAngleBracket: openAngleBracket);
+    seen(data);
+  }
+
+  @override
+  void beginInitializedIdentifier(Token token) {
+    InitializedIdentifierBegin data =
+        new InitializedIdentifierBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endInitializedIdentifier(Token nameToken) {
+    InitializedIdentifierEnd data =
+        new InitializedIdentifierEnd(ParserAstType.END, nameToken: nameToken);
+    seen(data);
+  }
+
+  @override
+  void beginFieldInitializer(Token token) {
+    FieldInitializerBegin data =
+        new FieldInitializerBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endFieldInitializer(Token assignment, Token token) {
+    FieldInitializerEnd data = new FieldInitializerEnd(ParserAstType.END,
+        assignment: assignment, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoFieldInitializer(Token token) {
+    NoFieldInitializerHandle data =
+        new NoFieldInitializerHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginVariableInitializer(Token token) {
+    VariableInitializerBegin data =
+        new VariableInitializerBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endVariableInitializer(Token assignmentOperator) {
+    VariableInitializerEnd data = new VariableInitializerEnd(ParserAstType.END,
+        assignmentOperator: assignmentOperator);
+    seen(data);
+  }
+
+  @override
+  void handleNoVariableInitializer(Token token) {
+    NoVariableInitializerHandle data =
+        new NoVariableInitializerHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginInitializer(Token token) {
+    InitializerBegin data =
+        new InitializerBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endInitializer(Token token) {
+    InitializerEnd data = new InitializerEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginInitializers(Token token) {
+    InitializersBegin data =
+        new InitializersBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endInitializers(int count, Token beginToken, Token endToken) {
+    InitializersEnd data = new InitializersEnd(ParserAstType.END,
+        count: count, beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleNoInitializers() {
+    NoInitializersHandle data = new NoInitializersHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidExpression(Token token) {
+    InvalidExpressionHandle data =
+        new InvalidExpressionHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidFunctionBody(Token token) {
+    InvalidFunctionBodyHandle data =
+        new InvalidFunctionBodyHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidTypeReference(Token token) {
+    InvalidTypeReferenceHandle data =
+        new InvalidTypeReferenceHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleLabel(Token token) {
+    LabelHandle data = new LabelHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginLabeledStatement(Token token, int labelCount) {
+    LabeledStatementBegin data = new LabeledStatementBegin(ParserAstType.BEGIN,
+        token: token, labelCount: labelCount);
+    seen(data);
+  }
+
+  @override
+  void endLabeledStatement(int labelCount) {
+    LabeledStatementEnd data =
+        new LabeledStatementEnd(ParserAstType.END, labelCount: labelCount);
+    seen(data);
+  }
+
+  @override
+  void beginLibraryName(Token token) {
+    LibraryNameBegin data =
+        new LibraryNameBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endLibraryName(Token libraryKeyword, Token semicolon) {
+    LibraryNameEnd data = new LibraryNameEnd(ParserAstType.END,
+        libraryKeyword: libraryKeyword, semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralMapEntry(Token colon, Token endToken) {
+    LiteralMapEntryHandle data = new LiteralMapEntryHandle(ParserAstType.HANDLE,
+        colon: colon, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginLiteralString(Token token) {
+    LiteralStringBegin data =
+        new LiteralStringBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleInterpolationExpression(Token leftBracket, Token? rightBracket) {
+    InterpolationExpressionHandle data = new InterpolationExpressionHandle(
+        ParserAstType.HANDLE,
+        leftBracket: leftBracket,
+        rightBracket: rightBracket);
+    seen(data);
+  }
+
+  @override
+  void endLiteralString(int interpolationCount, Token endToken) {
+    LiteralStringEnd data = new LiteralStringEnd(ParserAstType.END,
+        interpolationCount: interpolationCount, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleStringJuxtaposition(Token startToken, int literalCount) {
+    StringJuxtapositionHandle data = new StringJuxtapositionHandle(
+        ParserAstType.HANDLE,
+        startToken: startToken,
+        literalCount: literalCount);
+    seen(data);
+  }
+
+  @override
+  void beginMember() {
+    MemberBegin data = new MemberBegin(ParserAstType.BEGIN);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidMember(Token endToken) {
+    InvalidMemberHandle data =
+        new InvalidMemberHandle(ParserAstType.HANDLE, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endMember() {
+    MemberEnd data = new MemberEnd(ParserAstType.END);
+    seen(data);
+  }
+
+  @override
+  void beginMethod(
+      DeclarationKind declarationKind,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? varFinalOrConst,
+      Token? getOrSet,
+      Token name) {
+    MethodBegin data = new MethodBegin(ParserAstType.BEGIN,
+        declarationKind: declarationKind,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        varFinalOrConst: varFinalOrConst,
+        getOrSet: getOrSet,
+        name: name);
+    seen(data);
+  }
+
+  @override
+  void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    ClassMethodEnd data = new ClassMethodEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endMixinMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    MixinMethodEnd data = new MixinMethodEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endExtensionMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    ExtensionMethodEnd data = new ExtensionMethodEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endClassConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    ClassConstructorEnd data = new ClassConstructorEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endMixinConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    MixinConstructorEnd data = new MixinConstructorEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endExtensionConstructor(Token? getOrSet, Token beginToken,
+      Token beginParam, Token? beginInitializers, Token endToken) {
+    ExtensionConstructorEnd data = new ExtensionConstructorEnd(
+        ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginMetadataStar(Token token) {
+    MetadataStarBegin data =
+        new MetadataStarBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endMetadataStar(int count) {
+    MetadataStarEnd data = new MetadataStarEnd(ParserAstType.END, count: count);
+    seen(data);
+  }
+
+  @override
+  void beginMetadata(Token token) {
+    MetadataBegin data = new MetadataBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endMetadata(Token beginToken, Token? periodBeforeName, Token endToken) {
+    MetadataEnd data = new MetadataEnd(ParserAstType.END,
+        beginToken: beginToken,
+        periodBeforeName: periodBeforeName,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginOptionalFormalParameters(Token token) {
+    OptionalFormalParametersBegin data =
+        new OptionalFormalParametersBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endOptionalFormalParameters(
+      int count, Token beginToken, Token endToken) {
+    OptionalFormalParametersEnd data = new OptionalFormalParametersEnd(
+        ParserAstType.END,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginPart(Token token) {
+    PartBegin data = new PartBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endPart(Token partKeyword, Token semicolon) {
+    PartEnd data = new PartEnd(ParserAstType.END,
+        partKeyword: partKeyword, semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void beginPartOf(Token token) {
+    PartOfBegin data = new PartOfBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endPartOf(
+      Token partKeyword, Token ofKeyword, Token semicolon, bool hasName) {
+    PartOfEnd data = new PartOfEnd(ParserAstType.END,
+        partKeyword: partKeyword,
+        ofKeyword: ofKeyword,
+        semicolon: semicolon,
+        hasName: hasName);
+    seen(data);
+  }
+
+  @override
+  void beginRedirectingFactoryBody(Token token) {
+    RedirectingFactoryBodyBegin data =
+        new RedirectingFactoryBodyBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endRedirectingFactoryBody(Token beginToken, Token endToken) {
+    RedirectingFactoryBodyEnd data = new RedirectingFactoryBodyEnd(
+        ParserAstType.END,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginReturnStatement(Token token) {
+    ReturnStatementBegin data =
+        new ReturnStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNativeFunctionBody(Token nativeToken, Token semicolon) {
+    NativeFunctionBodyHandle data = new NativeFunctionBodyHandle(
+        ParserAstType.HANDLE,
+        nativeToken: nativeToken,
+        semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleNativeFunctionBodyIgnored(Token nativeToken, Token semicolon) {
+    NativeFunctionBodyIgnoredHandle data = new NativeFunctionBodyIgnoredHandle(
+        ParserAstType.HANDLE,
+        nativeToken: nativeToken,
+        semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleNativeFunctionBodySkipped(Token nativeToken, Token semicolon) {
+    NativeFunctionBodySkippedHandle data = new NativeFunctionBodySkippedHandle(
+        ParserAstType.HANDLE,
+        nativeToken: nativeToken,
+        semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleEmptyFunctionBody(Token semicolon) {
+    EmptyFunctionBodyHandle data =
+        new EmptyFunctionBodyHandle(ParserAstType.HANDLE, semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleExpressionFunctionBody(Token arrowToken, Token? endToken) {
+    ExpressionFunctionBodyHandle data = new ExpressionFunctionBodyHandle(
+        ParserAstType.HANDLE,
+        arrowToken: arrowToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endReturnStatement(
+      bool hasExpression, Token beginToken, Token endToken) {
+    ReturnStatementEnd data = new ReturnStatementEnd(ParserAstType.END,
+        hasExpression: hasExpression,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleSend(Token beginToken, Token endToken) {
+    SendHandle data = new SendHandle(ParserAstType.HANDLE,
+        beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginShow(Token showKeyword) {
+    ShowBegin data =
+        new ShowBegin(ParserAstType.BEGIN, showKeyword: showKeyword);
+    seen(data);
+  }
+
+  @override
+  void endShow(Token showKeyword) {
+    ShowEnd data = new ShowEnd(ParserAstType.END, showKeyword: showKeyword);
+    seen(data);
+  }
+
+  @override
+  void beginSwitchStatement(Token token) {
+    SwitchStatementBegin data =
+        new SwitchStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endSwitchStatement(Token switchKeyword, Token endToken) {
+    SwitchStatementEnd data = new SwitchStatementEnd(ParserAstType.END,
+        switchKeyword: switchKeyword, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginSwitchBlock(Token token) {
+    SwitchBlockBegin data =
+        new SwitchBlockBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endSwitchBlock(int caseCount, Token beginToken, Token endToken) {
+    SwitchBlockEnd data = new SwitchBlockEnd(ParserAstType.END,
+        caseCount: caseCount, beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginLiteralSymbol(Token token) {
+    LiteralSymbolBegin data =
+        new LiteralSymbolBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endLiteralSymbol(Token hashToken, int identifierCount) {
+    LiteralSymbolEnd data = new LiteralSymbolEnd(ParserAstType.END,
+        hashToken: hashToken, identifierCount: identifierCount);
+    seen(data);
+  }
+
+  @override
+  void handleThrowExpression(Token throwToken, Token endToken) {
+    ThrowExpressionHandle data = new ThrowExpressionHandle(ParserAstType.HANDLE,
+        throwToken: throwToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginRethrowStatement(Token token) {
+    RethrowStatementBegin data =
+        new RethrowStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endRethrowStatement(Token rethrowToken, Token endToken) {
+    RethrowStatementEnd data = new RethrowStatementEnd(ParserAstType.END,
+        rethrowToken: rethrowToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endTopLevelDeclaration(Token nextToken) {
+    TopLevelDeclarationEnd data =
+        new TopLevelDeclarationEnd(ParserAstType.END, nextToken: nextToken);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidTopLevelDeclaration(Token endToken) {
+    InvalidTopLevelDeclarationHandle data =
+        new InvalidTopLevelDeclarationHandle(ParserAstType.HANDLE,
+            endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginTopLevelMember(Token token) {
+    TopLevelMemberBegin data =
+        new TopLevelMemberBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginFields(
+      DeclarationKind declarationKind,
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      Token lastConsumed) {
+    FieldsBegin data = new FieldsBegin(ParserAstType.BEGIN,
+        declarationKind: declarationKind,
+        abstractToken: abstractToken,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst,
+        lastConsumed: lastConsumed);
+    seen(data);
+  }
+
+  @override
+  void endTopLevelFields(
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    TopLevelFieldsEnd data = new TopLevelFieldsEnd(ParserAstType.END,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginTopLevelMethod(Token lastConsumed, Token? externalToken) {
+    TopLevelMethodBegin data = new TopLevelMethodBegin(ParserAstType.BEGIN,
+        lastConsumed: lastConsumed, externalToken: externalToken);
+    seen(data);
+  }
+
+  @override
+  void endTopLevelMethod(Token beginToken, Token? getOrSet, Token endToken) {
+    TopLevelMethodEnd data = new TopLevelMethodEnd(ParserAstType.END,
+        beginToken: beginToken, getOrSet: getOrSet, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginTryStatement(Token token) {
+    TryStatementBegin data =
+        new TryStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleCaseMatch(Token caseKeyword, Token colon) {
+    CaseMatchHandle data = new CaseMatchHandle(ParserAstType.HANDLE,
+        caseKeyword: caseKeyword, colon: colon);
+    seen(data);
+  }
+
+  @override
+  void beginCatchClause(Token token) {
+    CatchClauseBegin data =
+        new CatchClauseBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endCatchClause(Token token) {
+    CatchClauseEnd data = new CatchClauseEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleCatchBlock(Token? onKeyword, Token? catchKeyword, Token? comma) {
+    CatchBlockHandle data = new CatchBlockHandle(ParserAstType.HANDLE,
+        onKeyword: onKeyword, catchKeyword: catchKeyword, comma: comma);
+    seen(data);
+  }
+
+  @override
+  void handleFinallyBlock(Token finallyKeyword) {
+    FinallyBlockHandle data = new FinallyBlockHandle(ParserAstType.HANDLE,
+        finallyKeyword: finallyKeyword);
+    seen(data);
+  }
+
+  @override
+  void endTryStatement(
+      int catchCount, Token tryKeyword, Token? finallyKeyword) {
+    TryStatementEnd data = new TryStatementEnd(ParserAstType.END,
+        catchCount: catchCount,
+        tryKeyword: tryKeyword,
+        finallyKeyword: finallyKeyword);
+    seen(data);
+  }
+
+  @override
+  void handleType(Token beginToken, Token? questionMark) {
+    TypeHandle data = new TypeHandle(ParserAstType.HANDLE,
+        beginToken: beginToken, questionMark: questionMark);
+    seen(data);
+  }
+
+  @override
+  void handleNonNullAssertExpression(Token bang) {
+    NonNullAssertExpressionHandle data =
+        new NonNullAssertExpressionHandle(ParserAstType.HANDLE, bang: bang);
+    seen(data);
+  }
+
+  @override
+  void handleNoName(Token token) {
+    NoNameHandle data = new NoNameHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginFunctionType(Token beginToken) {
+    FunctionTypeBegin data =
+        new FunctionTypeBegin(ParserAstType.BEGIN, beginToken: beginToken);
+    seen(data);
+  }
+
+  @override
+  void endFunctionType(Token functionToken, Token? questionMark) {
+    FunctionTypeEnd data = new FunctionTypeEnd(ParserAstType.END,
+        functionToken: functionToken, questionMark: questionMark);
+    seen(data);
+  }
+
+  @override
+  void beginTypeArguments(Token token) {
+    TypeArgumentsBegin data =
+        new TypeArgumentsBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endTypeArguments(int count, Token beginToken, Token endToken) {
+    TypeArgumentsEnd data = new TypeArgumentsEnd(ParserAstType.END,
+        count: count, beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidTypeArguments(Token token) {
+    InvalidTypeArgumentsHandle data =
+        new InvalidTypeArgumentsHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoTypeArguments(Token token) {
+    NoTypeArgumentsHandle data =
+        new NoTypeArgumentsHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginTypeVariable(Token token) {
+    TypeVariableBegin data =
+        new TypeVariableBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleTypeVariablesDefined(Token token, int count) {
+    TypeVariablesDefinedHandle data = new TypeVariablesDefinedHandle(
+        ParserAstType.HANDLE,
+        token: token,
+        count: count);
+    seen(data);
+  }
+
+  @override
+  void endTypeVariable(
+      Token token, int index, Token? extendsOrSuper, Token? variance) {
+    TypeVariableEnd data = new TypeVariableEnd(ParserAstType.END,
+        token: token,
+        index: index,
+        extendsOrSuper: extendsOrSuper,
+        variance: variance);
+    seen(data);
+  }
+
+  @override
+  void beginTypeVariables(Token token) {
+    TypeVariablesBegin data =
+        new TypeVariablesBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endTypeVariables(Token beginToken, Token endToken) {
+    TypeVariablesEnd data = new TypeVariablesEnd(ParserAstType.END,
+        beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginFunctionExpression(Token token) {
+    FunctionExpressionBegin data =
+        new FunctionExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endFunctionExpression(Token beginToken, Token token) {
+    FunctionExpressionEnd data = new FunctionExpressionEnd(ParserAstType.END,
+        beginToken: beginToken, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginVariablesDeclaration(
+      Token token, Token? lateToken, Token? varFinalOrConst) {
+    VariablesDeclarationBegin data = new VariablesDeclarationBegin(
+        ParserAstType.BEGIN,
+        token: token,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst);
+    seen(data);
+  }
+
+  @override
+  void endVariablesDeclaration(int count, Token? endToken) {
+    VariablesDeclarationEnd data = new VariablesDeclarationEnd(
+        ParserAstType.END,
+        count: count,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginWhileStatement(Token token) {
+    WhileStatementBegin data =
+        new WhileStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endWhileStatement(Token whileKeyword, Token endToken) {
+    WhileStatementEnd data = new WhileStatementEnd(ParserAstType.END,
+        whileKeyword: whileKeyword, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginAsOperatorType(Token operator) {
+    AsOperatorTypeBegin data =
+        new AsOperatorTypeBegin(ParserAstType.BEGIN, operator: operator);
+    seen(data);
+  }
+
+  @override
+  void endAsOperatorType(Token operator) {
+    AsOperatorTypeEnd data =
+        new AsOperatorTypeEnd(ParserAstType.END, operator: operator);
+    seen(data);
+  }
+
+  @override
+  void handleAsOperator(Token operator) {
+    AsOperatorHandle data =
+        new AsOperatorHandle(ParserAstType.HANDLE, operator: operator);
+    seen(data);
+  }
+
+  @override
+  void handleAssignmentExpression(Token token) {
+    AssignmentExpressionHandle data =
+        new AssignmentExpressionHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginBinaryExpression(Token token) {
+    BinaryExpressionBegin data =
+        new BinaryExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endBinaryExpression(Token token) {
+    BinaryExpressionEnd data =
+        new BinaryExpressionEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleEndingBinaryExpression(Token token) {
+    EndingBinaryExpressionHandle data =
+        new EndingBinaryExpressionHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginConditionalExpression(Token question) {
+    ConditionalExpressionBegin data =
+        new ConditionalExpressionBegin(ParserAstType.BEGIN, question: question);
+    seen(data);
+  }
+
+  @override
+  void handleConditionalExpressionColon() {
+    ConditionalExpressionColonHandle data =
+        new ConditionalExpressionColonHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void endConditionalExpression(Token question, Token colon) {
+    ConditionalExpressionEnd data = new ConditionalExpressionEnd(
+        ParserAstType.END,
+        question: question,
+        colon: colon);
+    seen(data);
+  }
+
+  @override
+  void beginConstExpression(Token constKeyword) {
+    ConstExpressionBegin data = new ConstExpressionBegin(ParserAstType.BEGIN,
+        constKeyword: constKeyword);
+    seen(data);
+  }
+
+  @override
+  void endConstExpression(Token token) {
+    ConstExpressionEnd data =
+        new ConstExpressionEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleConstFactory(Token constKeyword) {
+    ConstFactoryHandle data = new ConstFactoryHandle(ParserAstType.HANDLE,
+        constKeyword: constKeyword);
+    seen(data);
+  }
+
+  @override
+  void beginForControlFlow(Token? awaitToken, Token forToken) {
+    ForControlFlowBegin data = new ForControlFlowBegin(ParserAstType.BEGIN,
+        awaitToken: awaitToken, forToken: forToken);
+    seen(data);
+  }
+
+  @override
+  void endForControlFlow(Token token) {
+    ForControlFlowEnd data =
+        new ForControlFlowEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void endForInControlFlow(Token token) {
+    ForInControlFlowEnd data =
+        new ForInControlFlowEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginIfControlFlow(Token ifToken) {
+    IfControlFlowBegin data =
+        new IfControlFlowBegin(ParserAstType.BEGIN, ifToken: ifToken);
+    seen(data);
+  }
+
+  @override
+  void handleThenControlFlow(Token token) {
+    ThenControlFlowHandle data =
+        new ThenControlFlowHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleElseControlFlow(Token elseToken) {
+    ElseControlFlowHandle data =
+        new ElseControlFlowHandle(ParserAstType.HANDLE, elseToken: elseToken);
+    seen(data);
+  }
+
+  @override
+  void endIfControlFlow(Token token) {
+    IfControlFlowEnd data =
+        new IfControlFlowEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void endIfElseControlFlow(Token token) {
+    IfElseControlFlowEnd data =
+        new IfElseControlFlowEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleSpreadExpression(Token spreadToken) {
+    SpreadExpressionHandle data = new SpreadExpressionHandle(
+        ParserAstType.HANDLE,
+        spreadToken: spreadToken);
+    seen(data);
+  }
+
+  @override
+  void beginFunctionTypedFormalParameter(Token token) {
+    FunctionTypedFormalParameterBegin data =
+        new FunctionTypedFormalParameterBegin(ParserAstType.BEGIN,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void endFunctionTypedFormalParameter(Token nameToken, Token? question) {
+    FunctionTypedFormalParameterEnd data = new FunctionTypedFormalParameterEnd(
+        ParserAstType.END,
+        nameToken: nameToken,
+        question: question);
+    seen(data);
+  }
+
+  @override
+  void handleIdentifier(Token token, IdentifierContext context) {
+    IdentifierHandle data = new IdentifierHandle(ParserAstType.HANDLE,
+        token: token, context: context);
+    seen(data);
+  }
+
+  @override
+  void handleShowHideIdentifier(Token? modifier, Token identifier) {
+    ShowHideIdentifierHandle data = new ShowHideIdentifierHandle(
+        ParserAstType.HANDLE,
+        modifier: modifier,
+        identifier: identifier);
+    seen(data);
+  }
+
+  @override
+  void handleIndexedExpression(
+      Token? question, Token openSquareBracket, Token closeSquareBracket) {
+    IndexedExpressionHandle data = new IndexedExpressionHandle(
+        ParserAstType.HANDLE,
+        question: question,
+        openSquareBracket: openSquareBracket,
+        closeSquareBracket: closeSquareBracket);
+    seen(data);
+  }
+
+  @override
+  void beginIsOperatorType(Token operator) {
+    IsOperatorTypeBegin data =
+        new IsOperatorTypeBegin(ParserAstType.BEGIN, operator: operator);
+    seen(data);
+  }
+
+  @override
+  void endIsOperatorType(Token operator) {
+    IsOperatorTypeEnd data =
+        new IsOperatorTypeEnd(ParserAstType.END, operator: operator);
+    seen(data);
+  }
+
+  @override
+  void handleIsOperator(Token isOperator, Token? not) {
+    IsOperatorHandle data = new IsOperatorHandle(ParserAstType.HANDLE,
+        isOperator: isOperator, not: not);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralBool(Token token) {
+    LiteralBoolHandle data =
+        new LiteralBoolHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleBreakStatement(
+      bool hasTarget, Token breakKeyword, Token endToken) {
+    BreakStatementHandle data = new BreakStatementHandle(ParserAstType.HANDLE,
+        hasTarget: hasTarget, breakKeyword: breakKeyword, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleContinueStatement(
+      bool hasTarget, Token continueKeyword, Token endToken) {
+    ContinueStatementHandle data = new ContinueStatementHandle(
+        ParserAstType.HANDLE,
+        hasTarget: hasTarget,
+        continueKeyword: continueKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleEmptyStatement(Token token) {
+    EmptyStatementHandle data =
+        new EmptyStatementHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginAssert(Token assertKeyword, Assert kind) {
+    AssertBegin data = new AssertBegin(ParserAstType.BEGIN,
+        assertKeyword: assertKeyword, kind: kind);
+    seen(data);
+  }
+
+  @override
+  void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
+      Token? commaToken, Token semicolonToken) {
+    AssertEnd data = new AssertEnd(ParserAstType.END,
+        assertKeyword: assertKeyword,
+        kind: kind,
+        leftParenthesis: leftParenthesis,
+        commaToken: commaToken,
+        semicolonToken: semicolonToken);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralDouble(Token token) {
+    LiteralDoubleHandle data =
+        new LiteralDoubleHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralInt(Token token) {
+    LiteralIntHandle data =
+        new LiteralIntHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralList(
+      int count, Token leftBracket, Token? constKeyword, Token rightBracket) {
+    LiteralListHandle data = new LiteralListHandle(ParserAstType.HANDLE,
+        count: count,
+        leftBracket: leftBracket,
+        constKeyword: constKeyword,
+        rightBracket: rightBracket);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralSetOrMap(
+    int count,
+    Token leftBrace,
+    Token? constKeyword,
+    Token rightBrace,
+    bool hasSetEntry,
+  ) {
+    LiteralSetOrMapHandle data = new LiteralSetOrMapHandle(ParserAstType.HANDLE,
+        count: count,
+        leftBrace: leftBrace,
+        constKeyword: constKeyword,
+        rightBrace: rightBrace,
+        hasSetEntry: hasSetEntry);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralNull(Token token) {
+    LiteralNullHandle data =
+        new LiteralNullHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNativeClause(Token nativeToken, bool hasName) {
+    NativeClauseHandle data = new NativeClauseHandle(ParserAstType.HANDLE,
+        nativeToken: nativeToken, hasName: hasName);
+    seen(data);
+  }
+
+  @override
+  void handleNamedArgument(Token colon) {
+    NamedArgumentHandle data =
+        new NamedArgumentHandle(ParserAstType.HANDLE, colon: colon);
+    seen(data);
+  }
+
+  @override
+  void beginNewExpression(Token token) {
+    NewExpressionBegin data =
+        new NewExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endNewExpression(Token token) {
+    NewExpressionEnd data =
+        new NewExpressionEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoArguments(Token token) {
+    NoArgumentsHandle data =
+        new NoArgumentsHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
+    NoConstructorReferenceContinuationAfterTypeArgumentsHandle data =
+        new NoConstructorReferenceContinuationAfterTypeArgumentsHandle(
+            ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    NoTypeNameInConstructorReferenceHandle data =
+        new NoTypeNameInConstructorReferenceHandle(ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoType(Token lastConsumed) {
+    NoTypeHandle data =
+        new NoTypeHandle(ParserAstType.HANDLE, lastConsumed: lastConsumed);
+    seen(data);
+  }
+
+  @override
+  void handleNoTypeVariables(Token token) {
+    NoTypeVariablesHandle data =
+        new NoTypeVariablesHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleOperator(Token token) {
+    OperatorHandle data =
+        new OperatorHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleSymbolVoid(Token token) {
+    SymbolVoidHandle data =
+        new SymbolVoidHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleOperatorName(Token operatorKeyword, Token token) {
+    OperatorNameHandle data = new OperatorNameHandle(ParserAstType.HANDLE,
+        operatorKeyword: operatorKeyword, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidOperatorName(Token operatorKeyword, Token token) {
+    InvalidOperatorNameHandle data = new InvalidOperatorNameHandle(
+        ParserAstType.HANDLE,
+        operatorKeyword: operatorKeyword,
+        token: token);
+    seen(data);
+  }
+
+  @override
+  void handleParenthesizedCondition(Token token) {
+    ParenthesizedConditionHandle data =
+        new ParenthesizedConditionHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleParenthesizedExpression(Token token) {
+    ParenthesizedExpressionHandle data =
+        new ParenthesizedExpressionHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleQualified(Token period) {
+    QualifiedHandle data =
+        new QualifiedHandle(ParserAstType.HANDLE, period: period);
+    seen(data);
+  }
+
+  @override
+  void handleStringPart(Token token) {
+    StringPartHandle data =
+        new StringPartHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleSuperExpression(Token token, IdentifierContext context) {
+    SuperExpressionHandle data = new SuperExpressionHandle(ParserAstType.HANDLE,
+        token: token, context: context);
+    seen(data);
+  }
+
+  @override
+  void beginSwitchCase(int labelCount, int expressionCount, Token firstToken) {
+    SwitchCaseBegin data = new SwitchCaseBegin(ParserAstType.BEGIN,
+        labelCount: labelCount,
+        expressionCount: expressionCount,
+        firstToken: firstToken);
+    seen(data);
+  }
+
+  @override
+  void endSwitchCase(
+      int labelCount,
+      int expressionCount,
+      Token? defaultKeyword,
+      Token? colonAfterDefault,
+      int statementCount,
+      Token firstToken,
+      Token endToken) {
+    SwitchCaseEnd data = new SwitchCaseEnd(ParserAstType.END,
+        labelCount: labelCount,
+        expressionCount: expressionCount,
+        defaultKeyword: defaultKeyword,
+        colonAfterDefault: colonAfterDefault,
+        statementCount: statementCount,
+        firstToken: firstToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleThisExpression(Token token, IdentifierContext context) {
+    ThisExpressionHandle data = new ThisExpressionHandle(ParserAstType.HANDLE,
+        token: token, context: context);
+    seen(data);
+  }
+
+  @override
+  void handleUnaryPostfixAssignmentExpression(Token token) {
+    UnaryPostfixAssignmentExpressionHandle data =
+        new UnaryPostfixAssignmentExpressionHandle(ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void handleUnaryPrefixExpression(Token token) {
+    UnaryPrefixExpressionHandle data =
+        new UnaryPrefixExpressionHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleUnaryPrefixAssignmentExpression(Token token) {
+    UnaryPrefixAssignmentExpressionHandle data =
+        new UnaryPrefixAssignmentExpressionHandle(ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void beginFormalParameterDefaultValueExpression() {
+    FormalParameterDefaultValueExpressionBegin data =
+        new FormalParameterDefaultValueExpressionBegin(ParserAstType.BEGIN);
+    seen(data);
+  }
+
+  @override
+  void endFormalParameterDefaultValueExpression() {
+    FormalParameterDefaultValueExpressionEnd data =
+        new FormalParameterDefaultValueExpressionEnd(ParserAstType.END);
+    seen(data);
+  }
+
+  @override
+  void handleValuedFormalParameter(Token equals, Token token) {
+    ValuedFormalParameterHandle data = new ValuedFormalParameterHandle(
+        ParserAstType.HANDLE,
+        equals: equals,
+        token: token);
+    seen(data);
+  }
+
+  @override
+  void handleFormalParameterWithoutValue(Token token) {
+    FormalParameterWithoutValueHandle data =
+        new FormalParameterWithoutValueHandle(ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void handleVoidKeyword(Token token) {
+    VoidKeywordHandle data =
+        new VoidKeywordHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleVoidKeywordWithTypeArguments(Token token) {
+    VoidKeywordWithTypeArgumentsHandle data =
+        new VoidKeywordWithTypeArgumentsHandle(ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void beginYieldStatement(Token token) {
+    YieldStatementBegin data =
+        new YieldStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endYieldStatement(Token yieldToken, Token? starToken, Token endToken) {
+    YieldStatementEnd data = new YieldStatementEnd(ParserAstType.END,
+        yieldToken: yieldToken, starToken: starToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endInvalidYieldStatement(Token beginToken, Token? starToken,
+      Token endToken, MessageCode errorCode) {
+    InvalidYieldStatementEnd data = new InvalidYieldStatementEnd(
+        ParserAstType.END,
+        beginToken: beginToken,
+        starToken: starToken,
+        endToken: endToken,
+        errorCode: errorCode);
+    seen(data);
+  }
+
+  @override
+  void handleRecoverableError(
+      Message message, Token startToken, Token endToken) {
+    RecoverableErrorHandle data = new RecoverableErrorHandle(
+        ParserAstType.HANDLE,
+        message: message,
+        startToken: startToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleErrorToken(ErrorToken token) {
+    ErrorTokenHandle data =
+        new ErrorTokenHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleUnescapeError(
+      Message message, Token location, int stringOffset, int length) {
+    UnescapeErrorHandle data = new UnescapeErrorHandle(ParserAstType.HANDLE,
+        message: message,
+        location: location,
+        stringOffset: stringOffset,
+        length: length);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidStatement(Token token, Message message) {
+    InvalidStatementHandle data = new InvalidStatementHandle(
+        ParserAstType.HANDLE,
+        token: token,
+        message: message);
+    seen(data);
+  }
+
+  @override
+  void handleScript(Token token) {
+    ScriptHandle data = new ScriptHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleCommentReferenceText(String referenceSource, int referenceOffset) {
+    CommentReferenceTextHandle data = new CommentReferenceTextHandle(
+        ParserAstType.HANDLE,
+        referenceSource: referenceSource,
+        referenceOffset: referenceOffset);
+    seen(data);
+  }
+
+  @override
+  void handleCommentReference(
+      Token? newKeyword, Token? prefix, Token? period, Token token) {
+    CommentReferenceHandle data = new CommentReferenceHandle(
+        ParserAstType.HANDLE,
+        newKeyword: newKeyword,
+        prefix: prefix,
+        period: period,
+        token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoCommentReference() {
+    NoCommentReferenceHandle data =
+        new NoCommentReferenceHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void handleTypeArgumentApplication(Token openAngleBracket) {
+    TypeArgumentApplicationHandle data = new TypeArgumentApplicationHandle(
+        ParserAstType.HANDLE,
+        openAngleBracket: openAngleBracket);
+    seen(data);
+  }
+
+  @override
+  void handleNewAsIdentifier(Token token) {
+    NewAsIdentifierHandle data =
+        new NewAsIdentifierHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+}
+
+class ArgumentsBegin extends ParserAstNode {
+  final Token token;
+
+  ArgumentsBegin(ParserAstType type, {required this.token})
+      : super("Arguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ArgumentsEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  ArgumentsEnd(ParserAstType type,
+      {required this.count, required this.beginToken, required this.endToken})
+      : super("Arguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class AsyncModifierHandle extends ParserAstNode {
+  final Token? asyncToken;
+  final Token? starToken;
+
+  AsyncModifierHandle(ParserAstType type, {this.asyncToken, this.starToken})
+      : super("AsyncModifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "asyncToken": asyncToken,
+        "starToken": starToken,
+      };
+}
+
+class AwaitExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  AwaitExpressionBegin(ParserAstType type, {required this.token})
+      : super("AwaitExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class AwaitExpressionEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token endToken;
+
+  AwaitExpressionEnd(ParserAstType type,
+      {required this.beginToken, required this.endToken})
+      : super("AwaitExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class InvalidAwaitExpressionEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token endToken;
+  final MessageCode errorCode;
+
+  InvalidAwaitExpressionEnd(ParserAstType type,
+      {required this.beginToken,
+      required this.endToken,
+      required this.errorCode})
+      : super("InvalidAwaitExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "endToken": endToken,
+        "errorCode": errorCode,
+      };
+}
+
+class BlockBegin extends ParserAstNode {
+  final Token token;
+  final BlockKind blockKind;
+
+  BlockBegin(ParserAstType type, {required this.token, required this.blockKind})
+      : super("Block", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "blockKind": blockKind,
+      };
+}
+
+class BlockEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+  final BlockKind blockKind;
+
+  BlockEnd(ParserAstType type,
+      {required this.count,
+      required this.beginToken,
+      required this.endToken,
+      required this.blockKind})
+      : super("Block", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+        "blockKind": blockKind,
+      };
+}
+
+class InvalidTopLevelBlockHandle extends ParserAstNode {
+  final Token token;
+
+  InvalidTopLevelBlockHandle(ParserAstType type, {required this.token})
+      : super("InvalidTopLevelBlock", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CascadeBegin extends ParserAstNode {
+  final Token token;
+
+  CascadeBegin(ParserAstType type, {required this.token})
+      : super("Cascade", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CascadeEnd extends ParserAstNode {
+  CascadeEnd(ParserAstType type) : super("Cascade", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class CaseExpressionBegin extends ParserAstNode {
+  final Token caseKeyword;
+
+  CaseExpressionBegin(ParserAstType type, {required this.caseKeyword})
+      : super("CaseExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "caseKeyword": caseKeyword,
+      };
+}
+
+class CaseExpressionEnd extends ParserAstNode {
+  final Token colon;
+
+  CaseExpressionEnd(ParserAstType type, {required this.colon})
+      : super("CaseExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "colon": colon,
+      };
+}
+
+class ClassOrMixinOrExtensionBodyBegin extends ParserAstNode {
+  final DeclarationKind kind;
+  final Token token;
+
+  ClassOrMixinOrExtensionBodyBegin(ParserAstType type,
+      {required this.kind, required this.token})
+      : super("ClassOrMixinOrExtensionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "kind": kind,
+        "token": token,
+      };
+}
+
+class ClassOrMixinOrExtensionBodyEnd extends ParserAstNode {
+  final DeclarationKind kind;
+  final int memberCount;
+  final Token beginToken;
+  final Token endToken;
+
+  ClassOrMixinOrExtensionBodyEnd(ParserAstType type,
+      {required this.kind,
+      required this.memberCount,
+      required this.beginToken,
+      required this.endToken})
+      : super("ClassOrMixinOrExtensionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "kind": kind,
+        "memberCount": memberCount,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class ClassOrMixinOrNamedMixinApplicationPreludeBegin extends ParserAstNode {
+  final Token token;
+
+  ClassOrMixinOrNamedMixinApplicationPreludeBegin(ParserAstType type,
+      {required this.token})
+      : super("ClassOrMixinOrNamedMixinApplicationPrelude", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ClassDeclarationBegin extends ParserAstNode {
+  final Token begin;
+  final Token? abstractToken;
+  final Token name;
+
+  ClassDeclarationBegin(ParserAstType type,
+      {required this.begin, this.abstractToken, required this.name})
+      : super("ClassDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "begin": begin,
+        "abstractToken": abstractToken,
+        "name": name,
+      };
+}
+
+class ClassExtendsHandle extends ParserAstNode {
+  final Token? extendsKeyword;
+  final int typeCount;
+
+  ClassExtendsHandle(ParserAstType type,
+      {this.extendsKeyword, required this.typeCount})
+      : super("ClassExtends", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "extendsKeyword": extendsKeyword,
+        "typeCount": typeCount,
+      };
+}
+
+class ImplementsHandle extends ParserAstNode {
+  final Token? implementsKeyword;
+  final int interfacesCount;
+
+  ImplementsHandle(ParserAstType type,
+      {this.implementsKeyword, required this.interfacesCount})
+      : super("Implements", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "implementsKeyword": implementsKeyword,
+        "interfacesCount": interfacesCount,
+      };
+}
+
+class ExtensionShowHideHandle extends ParserAstNode {
+  final Token? showKeyword;
+  final int showElementCount;
+  final Token? hideKeyword;
+  final int hideElementCount;
+
+  ExtensionShowHideHandle(ParserAstType type,
+      {this.showKeyword,
+      required this.showElementCount,
+      this.hideKeyword,
+      required this.hideElementCount})
+      : super("ExtensionShowHide", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "showKeyword": showKeyword,
+        "showElementCount": showElementCount,
+        "hideKeyword": hideKeyword,
+        "hideElementCount": hideElementCount,
+      };
+}
+
+class ClassHeaderHandle extends ParserAstNode {
+  final Token begin;
+  final Token classKeyword;
+  final Token? nativeToken;
+
+  ClassHeaderHandle(ParserAstType type,
+      {required this.begin, required this.classKeyword, this.nativeToken})
+      : super("ClassHeader", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "begin": begin,
+        "classKeyword": classKeyword,
+        "nativeToken": nativeToken,
+      };
+}
+
+class RecoverClassHeaderHandle extends ParserAstNode {
+  RecoverClassHeaderHandle(ParserAstType type)
+      : super("RecoverClassHeader", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class ClassDeclarationEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token endToken;
+
+  ClassDeclarationEnd(ParserAstType type,
+      {required this.beginToken, required this.endToken})
+      : super("ClassDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class MixinDeclarationBegin extends ParserAstNode {
+  final Token mixinKeyword;
+  final Token name;
+
+  MixinDeclarationBegin(ParserAstType type,
+      {required this.mixinKeyword, required this.name})
+      : super("MixinDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "mixinKeyword": mixinKeyword,
+        "name": name,
+      };
+}
+
+class MixinOnHandle extends ParserAstNode {
+  final Token? onKeyword;
+  final int typeCount;
+
+  MixinOnHandle(ParserAstType type, {this.onKeyword, required this.typeCount})
+      : super("MixinOn", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "onKeyword": onKeyword,
+        "typeCount": typeCount,
+      };
+}
+
+class MixinHeaderHandle extends ParserAstNode {
+  final Token mixinKeyword;
+
+  MixinHeaderHandle(ParserAstType type, {required this.mixinKeyword})
+      : super("MixinHeader", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "mixinKeyword": mixinKeyword,
+      };
+}
+
+class RecoverMixinHeaderHandle extends ParserAstNode {
+  RecoverMixinHeaderHandle(ParserAstType type)
+      : super("RecoverMixinHeader", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class MixinDeclarationEnd extends ParserAstNode {
+  final Token mixinKeyword;
+  final Token endToken;
+
+  MixinDeclarationEnd(ParserAstType type,
+      {required this.mixinKeyword, required this.endToken})
+      : super("MixinDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "mixinKeyword": mixinKeyword,
+        "endToken": endToken,
+      };
+}
+
+class UncategorizedTopLevelDeclarationBegin extends ParserAstNode {
+  final Token token;
+
+  UncategorizedTopLevelDeclarationBegin(ParserAstType type,
+      {required this.token})
+      : super("UncategorizedTopLevelDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ExtensionDeclarationPreludeBegin extends ParserAstNode {
+  final Token extensionKeyword;
+
+  ExtensionDeclarationPreludeBegin(ParserAstType type,
+      {required this.extensionKeyword})
+      : super("ExtensionDeclarationPrelude", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "extensionKeyword": extensionKeyword,
+      };
+}
+
+class ExtensionDeclarationBegin extends ParserAstNode {
+  final Token extensionKeyword;
+  final Token? name;
+
+  ExtensionDeclarationBegin(ParserAstType type,
+      {required this.extensionKeyword, this.name})
+      : super("ExtensionDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "extensionKeyword": extensionKeyword,
+        "name": name,
+      };
+}
+
+class ExtensionDeclarationEnd extends ParserAstNode {
+  final Token extensionKeyword;
+  final Token? typeKeyword;
+  final Token onKeyword;
+  final Token? showKeyword;
+  final Token? hideKeyword;
+  final Token endToken;
+
+  ExtensionDeclarationEnd(ParserAstType type,
+      {required this.extensionKeyword,
+      this.typeKeyword,
+      required this.onKeyword,
+      this.showKeyword,
+      this.hideKeyword,
+      required this.endToken})
+      : super("ExtensionDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "extensionKeyword": extensionKeyword,
+        "typeKeyword": typeKeyword,
+        "onKeyword": onKeyword,
+        "showKeyword": showKeyword,
+        "hideKeyword": hideKeyword,
+        "endToken": endToken,
+      };
+}
+
+class CombinatorsBegin extends ParserAstNode {
+  final Token token;
+
+  CombinatorsBegin(ParserAstType type, {required this.token})
+      : super("Combinators", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CombinatorsEnd extends ParserAstNode {
+  final int count;
+
+  CombinatorsEnd(ParserAstType type, {required this.count})
+      : super("Combinators", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+      };
+}
+
+class CompilationUnitBegin extends ParserAstNode {
+  final Token token;
+
+  CompilationUnitBegin(ParserAstType type, {required this.token})
+      : super("CompilationUnit", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class DirectivesOnlyHandle extends ParserAstNode {
+  DirectivesOnlyHandle(ParserAstType type) : super("DirectivesOnly", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class CompilationUnitEnd extends ParserAstNode {
+  final int count;
+  final Token token;
+
+  CompilationUnitEnd(ParserAstType type,
+      {required this.count, required this.token})
+      : super("CompilationUnit", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "token": token,
+      };
+}
+
+class ConstLiteralBegin extends ParserAstNode {
+  final Token token;
+
+  ConstLiteralBegin(ParserAstType type, {required this.token})
+      : super("ConstLiteral", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ConstLiteralEnd extends ParserAstNode {
+  final Token token;
+
+  ConstLiteralEnd(ParserAstType type, {required this.token})
+      : super("ConstLiteral", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ConstructorReferenceBegin extends ParserAstNode {
+  final Token start;
+
+  ConstructorReferenceBegin(ParserAstType type, {required this.start})
+      : super("ConstructorReference", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "start": start,
+      };
+}
+
+class ConstructorReferenceEnd extends ParserAstNode {
+  final Token start;
+  final Token? periodBeforeName;
+  final Token endToken;
+  final ConstructorReferenceContext constructorReferenceContext;
+
+  ConstructorReferenceEnd(ParserAstType type,
+      {required this.start,
+      this.periodBeforeName,
+      required this.endToken,
+      required this.constructorReferenceContext})
+      : super("ConstructorReference", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "start": start,
+        "periodBeforeName": periodBeforeName,
+        "endToken": endToken,
+        "constructorReferenceContext": constructorReferenceContext,
+      };
+}
+
+class DoWhileStatementBegin extends ParserAstNode {
+  final Token token;
+
+  DoWhileStatementBegin(ParserAstType type, {required this.token})
+      : super("DoWhileStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class DoWhileStatementEnd extends ParserAstNode {
+  final Token doKeyword;
+  final Token whileKeyword;
+  final Token endToken;
+
+  DoWhileStatementEnd(ParserAstType type,
+      {required this.doKeyword,
+      required this.whileKeyword,
+      required this.endToken})
+      : super("DoWhileStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "doKeyword": doKeyword,
+        "whileKeyword": whileKeyword,
+        "endToken": endToken,
+      };
+}
+
+class DoWhileStatementBodyBegin extends ParserAstNode {
+  final Token token;
+
+  DoWhileStatementBodyBegin(ParserAstType type, {required this.token})
+      : super("DoWhileStatementBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class DoWhileStatementBodyEnd extends ParserAstNode {
+  final Token token;
+
+  DoWhileStatementBodyEnd(ParserAstType type, {required this.token})
+      : super("DoWhileStatementBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class WhileStatementBodyBegin extends ParserAstNode {
+  final Token token;
+
+  WhileStatementBodyBegin(ParserAstType type, {required this.token})
+      : super("WhileStatementBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class WhileStatementBodyEnd extends ParserAstNode {
+  final Token token;
+
+  WhileStatementBodyEnd(ParserAstType type, {required this.token})
+      : super("WhileStatementBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class EnumBegin extends ParserAstNode {
+  final Token enumKeyword;
+
+  EnumBegin(ParserAstType type, {required this.enumKeyword})
+      : super("Enum", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "enumKeyword": enumKeyword,
+      };
+}
+
+class EnumEnd extends ParserAstNode {
+  final Token enumKeyword;
+  final Token leftBrace;
+  final int memberCount;
+
+  EnumEnd(ParserAstType type,
+      {required this.enumKeyword,
+      required this.leftBrace,
+      required this.memberCount})
+      : super("Enum", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "enumKeyword": enumKeyword,
+        "leftBrace": leftBrace,
+        "memberCount": memberCount,
+      };
+}
+
+class EnumConstructorEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  EnumConstructorEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("EnumConstructor", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class EnumElementsHandle extends ParserAstNode {
+  final Token elementsEndToken;
+  final int elementsCount;
+
+  EnumElementsHandle(ParserAstType type,
+      {required this.elementsEndToken, required this.elementsCount})
+      : super("EnumElements", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "elementsEndToken": elementsEndToken,
+        "elementsCount": elementsCount,
+      };
+}
+
+class EnumHeaderHandle extends ParserAstNode {
+  final Token enumKeyword;
+  final Token leftBrace;
+
+  EnumHeaderHandle(ParserAstType type,
+      {required this.enumKeyword, required this.leftBrace})
+      : super("EnumHeader", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "enumKeyword": enumKeyword,
+        "leftBrace": leftBrace,
+      };
+}
+
+class EnumElementHandle extends ParserAstNode {
+  final Token beginToken;
+
+  EnumElementHandle(ParserAstType type, {required this.beginToken})
+      : super("EnumElement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+      };
+}
+
+class EnumFactoryMethodEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token factoryKeyword;
+  final Token endToken;
+
+  EnumFactoryMethodEnd(ParserAstType type,
+      {required this.beginToken,
+      required this.factoryKeyword,
+      required this.endToken})
+      : super("EnumFactoryMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "factoryKeyword": factoryKeyword,
+        "endToken": endToken,
+      };
+}
+
+class ExportBegin extends ParserAstNode {
+  final Token token;
+
+  ExportBegin(ParserAstType type, {required this.token})
+      : super("Export", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ExportEnd extends ParserAstNode {
+  final Token exportKeyword;
+  final Token semicolon;
+
+  ExportEnd(ParserAstType type,
+      {required this.exportKeyword, required this.semicolon})
+      : super("Export", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "exportKeyword": exportKeyword,
+        "semicolon": semicolon,
+      };
+}
+
+class ExtraneousExpressionHandle extends ParserAstNode {
+  final Token token;
+  final Message message;
+
+  ExtraneousExpressionHandle(ParserAstType type,
+      {required this.token, required this.message})
+      : super("ExtraneousExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "message": message,
+      };
+}
+
+class ExpressionStatementHandle extends ParserAstNode {
+  final Token token;
+
+  ExpressionStatementHandle(ParserAstType type, {required this.token})
+      : super("ExpressionStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FactoryMethodBegin extends ParserAstNode {
+  final DeclarationKind declarationKind;
+  final Token lastConsumed;
+  final Token? externalToken;
+  final Token? constToken;
+
+  FactoryMethodBegin(ParserAstType type,
+      {required this.declarationKind,
+      required this.lastConsumed,
+      this.externalToken,
+      this.constToken})
+      : super("FactoryMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "declarationKind": declarationKind,
+        "lastConsumed": lastConsumed,
+        "externalToken": externalToken,
+        "constToken": constToken,
+      };
+}
+
+class ClassFactoryMethodEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token factoryKeyword;
+  final Token endToken;
+
+  ClassFactoryMethodEnd(ParserAstType type,
+      {required this.beginToken,
+      required this.factoryKeyword,
+      required this.endToken})
+      : super("ClassFactoryMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "factoryKeyword": factoryKeyword,
+        "endToken": endToken,
+      };
+}
+
+class MixinFactoryMethodEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token factoryKeyword;
+  final Token endToken;
+
+  MixinFactoryMethodEnd(ParserAstType type,
+      {required this.beginToken,
+      required this.factoryKeyword,
+      required this.endToken})
+      : super("MixinFactoryMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "factoryKeyword": factoryKeyword,
+        "endToken": endToken,
+      };
+}
+
+class ExtensionFactoryMethodEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token factoryKeyword;
+  final Token endToken;
+
+  ExtensionFactoryMethodEnd(ParserAstType type,
+      {required this.beginToken,
+      required this.factoryKeyword,
+      required this.endToken})
+      : super("ExtensionFactoryMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "factoryKeyword": factoryKeyword,
+        "endToken": endToken,
+      };
+}
+
+class FormalParameterBegin extends ParserAstNode {
+  final Token token;
+  final MemberKind kind;
+  final Token? requiredToken;
+  final Token? covariantToken;
+  final Token? varFinalOrConst;
+
+  FormalParameterBegin(ParserAstType type,
+      {required this.token,
+      required this.kind,
+      this.requiredToken,
+      this.covariantToken,
+      this.varFinalOrConst})
+      : super("FormalParameter", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "kind": kind,
+        "requiredToken": requiredToken,
+        "covariantToken": covariantToken,
+        "varFinalOrConst": varFinalOrConst,
+      };
+}
+
+class FormalParameterEnd extends ParserAstNode {
+  final Token? thisKeyword;
+  final Token? superKeyword;
+  final Token? periodAfterThisOrSuper;
+  final Token nameToken;
+  final Token? initializerStart;
+  final Token? initializerEnd;
+  final FormalParameterKind kind;
+  final MemberKind memberKind;
+
+  FormalParameterEnd(ParserAstType type,
+      {this.thisKeyword,
+      this.superKeyword,
+      this.periodAfterThisOrSuper,
+      required this.nameToken,
+      this.initializerStart,
+      this.initializerEnd,
+      required this.kind,
+      required this.memberKind})
+      : super("FormalParameter", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "thisKeyword": thisKeyword,
+        "superKeyword": superKeyword,
+        "periodAfterThisOrSuper": periodAfterThisOrSuper,
+        "nameToken": nameToken,
+        "initializerStart": initializerStart,
+        "initializerEnd": initializerEnd,
+        "kind": kind,
+        "memberKind": memberKind,
+      };
+}
+
+class NoFormalParametersHandle extends ParserAstNode {
+  final Token token;
+  final MemberKind kind;
+
+  NoFormalParametersHandle(ParserAstType type,
+      {required this.token, required this.kind})
+      : super("NoFormalParameters", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "kind": kind,
+      };
+}
+
+class FormalParametersBegin extends ParserAstNode {
+  final Token token;
+  final MemberKind kind;
+
+  FormalParametersBegin(ParserAstType type,
+      {required this.token, required this.kind})
+      : super("FormalParameters", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "kind": kind,
+      };
+}
+
+class FormalParametersEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+  final MemberKind kind;
+
+  FormalParametersEnd(ParserAstType type,
+      {required this.count,
+      required this.beginToken,
+      required this.endToken,
+      required this.kind})
+      : super("FormalParameters", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+        "kind": kind,
+      };
+}
+
+class ClassFieldsEnd extends ParserAstNode {
+  final Token? abstractToken;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  ClassFieldsEnd(ParserAstType type,
+      {this.abstractToken,
+      this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.lateToken,
+      this.varFinalOrConst,
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
+      : super("ClassFields", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "abstractToken": abstractToken,
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class MixinFieldsEnd extends ParserAstNode {
+  final Token? abstractToken;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  MixinFieldsEnd(ParserAstType type,
+      {this.abstractToken,
+      this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.lateToken,
+      this.varFinalOrConst,
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
+      : super("MixinFields", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "abstractToken": abstractToken,
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class ExtensionFieldsEnd extends ParserAstNode {
+  final Token? abstractToken;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  ExtensionFieldsEnd(ParserAstType type,
+      {this.abstractToken,
+      this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.lateToken,
+      this.varFinalOrConst,
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
+      : super("ExtensionFields", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "abstractToken": abstractToken,
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class EnumFieldsEnd extends ParserAstNode {
+  final Token? abstractToken;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  EnumFieldsEnd(ParserAstType type,
+      {this.abstractToken,
+      this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.lateToken,
+      this.varFinalOrConst,
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
+      : super("EnumFields", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "abstractToken": abstractToken,
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class EnumMethodEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  EnumMethodEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("EnumMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class ForInitializerEmptyStatementHandle extends ParserAstNode {
+  final Token token;
+
+  ForInitializerEmptyStatementHandle(ParserAstType type, {required this.token})
+      : super("ForInitializerEmptyStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForInitializerExpressionStatementHandle extends ParserAstNode {
+  final Token token;
+  final bool forIn;
+
+  ForInitializerExpressionStatementHandle(ParserAstType type,
+      {required this.token, required this.forIn})
+      : super("ForInitializerExpressionStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "forIn": forIn,
+      };
+}
+
+class ForInitializerLocalVariableDeclarationHandle extends ParserAstNode {
+  final Token token;
+  final bool forIn;
+
+  ForInitializerLocalVariableDeclarationHandle(ParserAstType type,
+      {required this.token, required this.forIn})
+      : super("ForInitializerLocalVariableDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "forIn": forIn,
+      };
+}
+
+class ForStatementBegin extends ParserAstNode {
+  final Token token;
+
+  ForStatementBegin(ParserAstType type, {required this.token})
+      : super("ForStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForLoopPartsHandle extends ParserAstNode {
+  final Token forKeyword;
+  final Token leftParen;
+  final Token leftSeparator;
+  final int updateExpressionCount;
+
+  ForLoopPartsHandle(ParserAstType type,
+      {required this.forKeyword,
+      required this.leftParen,
+      required this.leftSeparator,
+      required this.updateExpressionCount})
+      : super("ForLoopParts", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "forKeyword": forKeyword,
+        "leftParen": leftParen,
+        "leftSeparator": leftSeparator,
+        "updateExpressionCount": updateExpressionCount,
+      };
+}
+
+class ForStatementEnd extends ParserAstNode {
+  final Token endToken;
+
+  ForStatementEnd(ParserAstType type, {required this.endToken})
+      : super("ForStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "endToken": endToken,
+      };
+}
+
+class ForStatementBodyBegin extends ParserAstNode {
+  final Token token;
+
+  ForStatementBodyBegin(ParserAstType type, {required this.token})
+      : super("ForStatementBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForStatementBodyEnd extends ParserAstNode {
+  final Token token;
+
+  ForStatementBodyEnd(ParserAstType type, {required this.token})
+      : super("ForStatementBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForInLoopPartsHandle extends ParserAstNode {
+  final Token? awaitToken;
+  final Token forToken;
+  final Token leftParenthesis;
+  final Token inKeyword;
+
+  ForInLoopPartsHandle(ParserAstType type,
+      {this.awaitToken,
+      required this.forToken,
+      required this.leftParenthesis,
+      required this.inKeyword})
+      : super("ForInLoopParts", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "awaitToken": awaitToken,
+        "forToken": forToken,
+        "leftParenthesis": leftParenthesis,
+        "inKeyword": inKeyword,
+      };
+}
+
+class ForInEnd extends ParserAstNode {
+  final Token endToken;
+
+  ForInEnd(ParserAstType type, {required this.endToken}) : super("ForIn", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "endToken": endToken,
+      };
+}
+
+class ForInExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  ForInExpressionBegin(ParserAstType type, {required this.token})
+      : super("ForInExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForInExpressionEnd extends ParserAstNode {
+  final Token token;
+
+  ForInExpressionEnd(ParserAstType type, {required this.token})
+      : super("ForInExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForInBodyBegin extends ParserAstNode {
+  final Token token;
+
+  ForInBodyBegin(ParserAstType type, {required this.token})
+      : super("ForInBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForInBodyEnd extends ParserAstNode {
+  final Token token;
+
+  ForInBodyEnd(ParserAstType type, {required this.token})
+      : super("ForInBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NamedFunctionExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  NamedFunctionExpressionBegin(ParserAstType type, {required this.token})
+      : super("NamedFunctionExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NamedFunctionExpressionEnd extends ParserAstNode {
+  final Token endToken;
+
+  NamedFunctionExpressionEnd(ParserAstType type, {required this.endToken})
+      : super("NamedFunctionExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "endToken": endToken,
+      };
+}
+
+class LocalFunctionDeclarationBegin extends ParserAstNode {
+  final Token token;
+
+  LocalFunctionDeclarationBegin(ParserAstType type, {required this.token})
+      : super("LocalFunctionDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LocalFunctionDeclarationEnd extends ParserAstNode {
+  final Token endToken;
+
+  LocalFunctionDeclarationEnd(ParserAstType type, {required this.endToken})
+      : super("LocalFunctionDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "endToken": endToken,
+      };
+}
+
+class BlockFunctionBodyBegin extends ParserAstNode {
+  final Token token;
+
+  BlockFunctionBodyBegin(ParserAstType type, {required this.token})
+      : super("BlockFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class BlockFunctionBodyEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  BlockFunctionBodyEnd(ParserAstType type,
+      {required this.count, required this.beginToken, required this.endToken})
+      : super("BlockFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class NoFunctionBodyHandle extends ParserAstNode {
+  final Token token;
+
+  NoFunctionBodyHandle(ParserAstType type, {required this.token})
+      : super("NoFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FunctionBodySkippedHandle extends ParserAstNode {
+  final Token token;
+  final bool isExpressionBody;
+
+  FunctionBodySkippedHandle(ParserAstType type,
+      {required this.token, required this.isExpressionBody})
+      : super("FunctionBodySkipped", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "isExpressionBody": isExpressionBody,
+      };
+}
+
+class FunctionNameBegin extends ParserAstNode {
+  final Token token;
+
+  FunctionNameBegin(ParserAstType type, {required this.token})
+      : super("FunctionName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FunctionNameEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token token;
+
+  FunctionNameEnd(ParserAstType type,
+      {required this.beginToken, required this.token})
+      : super("FunctionName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "token": token,
+      };
+}
+
+class TypedefBegin extends ParserAstNode {
+  final Token token;
+
+  TypedefBegin(ParserAstType type, {required this.token})
+      : super("Typedef", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class TypedefEnd extends ParserAstNode {
+  final Token typedefKeyword;
+  final Token? equals;
+  final Token endToken;
+
+  TypedefEnd(ParserAstType type,
+      {required this.typedefKeyword, this.equals, required this.endToken})
+      : super("Typedef", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "typedefKeyword": typedefKeyword,
+        "equals": equals,
+        "endToken": endToken,
+      };
+}
+
+class ClassWithClauseHandle extends ParserAstNode {
+  final Token withKeyword;
+
+  ClassWithClauseHandle(ParserAstType type, {required this.withKeyword})
+      : super("ClassWithClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "withKeyword": withKeyword,
+      };
+}
+
+class ClassNoWithClauseHandle extends ParserAstNode {
+  ClassNoWithClauseHandle(ParserAstType type)
+      : super("ClassNoWithClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class EnumWithClauseHandle extends ParserAstNode {
+  final Token withKeyword;
+
+  EnumWithClauseHandle(ParserAstType type, {required this.withKeyword})
+      : super("EnumWithClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "withKeyword": withKeyword,
+      };
+}
+
+class EnumNoWithClauseHandle extends ParserAstNode {
+  EnumNoWithClauseHandle(ParserAstType type) : super("EnumNoWithClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class NamedMixinApplicationBegin extends ParserAstNode {
+  final Token begin;
+  final Token? abstractToken;
+  final Token name;
+
+  NamedMixinApplicationBegin(ParserAstType type,
+      {required this.begin, this.abstractToken, required this.name})
+      : super("NamedMixinApplication", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "begin": begin,
+        "abstractToken": abstractToken,
+        "name": name,
+      };
+}
+
+class NamedMixinApplicationWithClauseHandle extends ParserAstNode {
+  final Token withKeyword;
+
+  NamedMixinApplicationWithClauseHandle(ParserAstType type,
+      {required this.withKeyword})
+      : super("NamedMixinApplicationWithClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "withKeyword": withKeyword,
+      };
+}
+
+class NamedMixinApplicationEnd extends ParserAstNode {
+  final Token begin;
+  final Token classKeyword;
+  final Token equals;
+  final Token? implementsKeyword;
+  final Token endToken;
+
+  NamedMixinApplicationEnd(ParserAstType type,
+      {required this.begin,
+      required this.classKeyword,
+      required this.equals,
+      this.implementsKeyword,
+      required this.endToken})
+      : super("NamedMixinApplication", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "begin": begin,
+        "classKeyword": classKeyword,
+        "equals": equals,
+        "implementsKeyword": implementsKeyword,
+        "endToken": endToken,
+      };
+}
+
+class HideBegin extends ParserAstNode {
+  final Token hideKeyword;
+
+  HideBegin(ParserAstType type, {required this.hideKeyword})
+      : super("Hide", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "hideKeyword": hideKeyword,
+      };
+}
+
+class HideEnd extends ParserAstNode {
+  final Token hideKeyword;
+
+  HideEnd(ParserAstType type, {required this.hideKeyword})
+      : super("Hide", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "hideKeyword": hideKeyword,
+      };
+}
+
+class IdentifierListHandle extends ParserAstNode {
+  final int count;
+
+  IdentifierListHandle(ParserAstType type, {required this.count})
+      : super("IdentifierList", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+      };
+}
+
+class TypeListBegin extends ParserAstNode {
+  final Token token;
+
+  TypeListBegin(ParserAstType type, {required this.token})
+      : super("TypeList", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class TypeListEnd extends ParserAstNode {
+  final int count;
+
+  TypeListEnd(ParserAstType type, {required this.count})
+      : super("TypeList", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+      };
+}
+
+class IfStatementBegin extends ParserAstNode {
+  final Token token;
+
+  IfStatementBegin(ParserAstType type, {required this.token})
+      : super("IfStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class IfStatementEnd extends ParserAstNode {
+  final Token ifToken;
+  final Token? elseToken;
+
+  IfStatementEnd(ParserAstType type, {required this.ifToken, this.elseToken})
+      : super("IfStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "ifToken": ifToken,
+        "elseToken": elseToken,
+      };
+}
+
+class ThenStatementBegin extends ParserAstNode {
+  final Token token;
+
+  ThenStatementBegin(ParserAstType type, {required this.token})
+      : super("ThenStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ThenStatementEnd extends ParserAstNode {
+  final Token token;
+
+  ThenStatementEnd(ParserAstType type, {required this.token})
+      : super("ThenStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ElseStatementBegin extends ParserAstNode {
+  final Token token;
+
+  ElseStatementBegin(ParserAstType type, {required this.token})
+      : super("ElseStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ElseStatementEnd extends ParserAstNode {
+  final Token token;
+
+  ElseStatementEnd(ParserAstType type, {required this.token})
+      : super("ElseStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ImportBegin extends ParserAstNode {
+  final Token importKeyword;
+
+  ImportBegin(ParserAstType type, {required this.importKeyword})
+      : super("Import", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "importKeyword": importKeyword,
+      };
+}
+
+class ImportPrefixHandle extends ParserAstNode {
+  final Token? deferredKeyword;
+  final Token? asKeyword;
+
+  ImportPrefixHandle(ParserAstType type, {this.deferredKeyword, this.asKeyword})
+      : super("ImportPrefix", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "deferredKeyword": deferredKeyword,
+        "asKeyword": asKeyword,
+      };
+}
+
+class ImportEnd extends ParserAstNode {
+  final Token importKeyword;
+  final Token? semicolon;
+
+  ImportEnd(ParserAstType type, {required this.importKeyword, this.semicolon})
+      : super("Import", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "importKeyword": importKeyword,
+        "semicolon": semicolon,
+      };
+}
+
+class RecoverImportHandle extends ParserAstNode {
+  final Token? semicolon;
+
+  RecoverImportHandle(ParserAstType type, {this.semicolon})
+      : super("RecoverImport", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "semicolon": semicolon,
+      };
+}
+
+class ConditionalUrisBegin extends ParserAstNode {
+  final Token token;
+
+  ConditionalUrisBegin(ParserAstType type, {required this.token})
+      : super("ConditionalUris", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ConditionalUrisEnd extends ParserAstNode {
+  final int count;
+
+  ConditionalUrisEnd(ParserAstType type, {required this.count})
+      : super("ConditionalUris", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+      };
+}
+
+class ConditionalUriBegin extends ParserAstNode {
+  final Token ifKeyword;
+
+  ConditionalUriBegin(ParserAstType type, {required this.ifKeyword})
+      : super("ConditionalUri", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "ifKeyword": ifKeyword,
+      };
+}
+
+class ConditionalUriEnd extends ParserAstNode {
+  final Token ifKeyword;
+  final Token leftParen;
+  final Token? equalSign;
+
+  ConditionalUriEnd(ParserAstType type,
+      {required this.ifKeyword, required this.leftParen, this.equalSign})
+      : super("ConditionalUri", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "ifKeyword": ifKeyword,
+        "leftParen": leftParen,
+        "equalSign": equalSign,
+      };
+}
+
+class DottedNameHandle extends ParserAstNode {
+  final int count;
+  final Token firstIdentifier;
+
+  DottedNameHandle(ParserAstType type,
+      {required this.count, required this.firstIdentifier})
+      : super("DottedName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "firstIdentifier": firstIdentifier,
+      };
+}
+
+class ImplicitCreationExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  ImplicitCreationExpressionBegin(ParserAstType type, {required this.token})
+      : super("ImplicitCreationExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ImplicitCreationExpressionEnd extends ParserAstNode {
+  final Token token;
+  final Token openAngleBracket;
+
+  ImplicitCreationExpressionEnd(ParserAstType type,
+      {required this.token, required this.openAngleBracket})
+      : super("ImplicitCreationExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "openAngleBracket": openAngleBracket,
+      };
+}
+
+class InitializedIdentifierBegin extends ParserAstNode {
+  final Token token;
+
+  InitializedIdentifierBegin(ParserAstType type, {required this.token})
+      : super("InitializedIdentifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InitializedIdentifierEnd extends ParserAstNode {
+  final Token nameToken;
+
+  InitializedIdentifierEnd(ParserAstType type, {required this.nameToken})
+      : super("InitializedIdentifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nameToken": nameToken,
+      };
+}
+
+class FieldInitializerBegin extends ParserAstNode {
+  final Token token;
+
+  FieldInitializerBegin(ParserAstType type, {required this.token})
+      : super("FieldInitializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FieldInitializerEnd extends ParserAstNode {
+  final Token assignment;
+  final Token token;
+
+  FieldInitializerEnd(ParserAstType type,
+      {required this.assignment, required this.token})
+      : super("FieldInitializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "assignment": assignment,
+        "token": token,
+      };
+}
+
+class NoFieldInitializerHandle extends ParserAstNode {
+  final Token token;
+
+  NoFieldInitializerHandle(ParserAstType type, {required this.token})
+      : super("NoFieldInitializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class VariableInitializerBegin extends ParserAstNode {
+  final Token token;
+
+  VariableInitializerBegin(ParserAstType type, {required this.token})
+      : super("VariableInitializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class VariableInitializerEnd extends ParserAstNode {
+  final Token assignmentOperator;
+
+  VariableInitializerEnd(ParserAstType type, {required this.assignmentOperator})
+      : super("VariableInitializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "assignmentOperator": assignmentOperator,
+      };
+}
+
+class NoVariableInitializerHandle extends ParserAstNode {
+  final Token token;
+
+  NoVariableInitializerHandle(ParserAstType type, {required this.token})
+      : super("NoVariableInitializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InitializerBegin extends ParserAstNode {
+  final Token token;
+
+  InitializerBegin(ParserAstType type, {required this.token})
+      : super("Initializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InitializerEnd extends ParserAstNode {
+  final Token token;
+
+  InitializerEnd(ParserAstType type, {required this.token})
+      : super("Initializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InitializersBegin extends ParserAstNode {
+  final Token token;
+
+  InitializersBegin(ParserAstType type, {required this.token})
+      : super("Initializers", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InitializersEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  InitializersEnd(ParserAstType type,
+      {required this.count, required this.beginToken, required this.endToken})
+      : super("Initializers", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class NoInitializersHandle extends ParserAstNode {
+  NoInitializersHandle(ParserAstType type) : super("NoInitializers", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class InvalidExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  InvalidExpressionHandle(ParserAstType type, {required this.token})
+      : super("InvalidExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InvalidFunctionBodyHandle extends ParserAstNode {
+  final Token token;
+
+  InvalidFunctionBodyHandle(ParserAstType type, {required this.token})
+      : super("InvalidFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InvalidTypeReferenceHandle extends ParserAstNode {
+  final Token token;
+
+  InvalidTypeReferenceHandle(ParserAstType type, {required this.token})
+      : super("InvalidTypeReference", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LabelHandle extends ParserAstNode {
+  final Token token;
+
+  LabelHandle(ParserAstType type, {required this.token}) : super("Label", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LabeledStatementBegin extends ParserAstNode {
+  final Token token;
+  final int labelCount;
+
+  LabeledStatementBegin(ParserAstType type,
+      {required this.token, required this.labelCount})
+      : super("LabeledStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "labelCount": labelCount,
+      };
+}
+
+class LabeledStatementEnd extends ParserAstNode {
+  final int labelCount;
+
+  LabeledStatementEnd(ParserAstType type, {required this.labelCount})
+      : super("LabeledStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "labelCount": labelCount,
+      };
+}
+
+class LibraryNameBegin extends ParserAstNode {
+  final Token token;
+
+  LibraryNameBegin(ParserAstType type, {required this.token})
+      : super("LibraryName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LibraryNameEnd extends ParserAstNode {
+  final Token libraryKeyword;
+  final Token semicolon;
+
+  LibraryNameEnd(ParserAstType type,
+      {required this.libraryKeyword, required this.semicolon})
+      : super("LibraryName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "libraryKeyword": libraryKeyword,
+        "semicolon": semicolon,
+      };
+}
+
+class LiteralMapEntryHandle extends ParserAstNode {
+  final Token colon;
+  final Token endToken;
+
+  LiteralMapEntryHandle(ParserAstType type,
+      {required this.colon, required this.endToken})
+      : super("LiteralMapEntry", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "colon": colon,
+        "endToken": endToken,
+      };
+}
+
+class LiteralStringBegin extends ParserAstNode {
+  final Token token;
+
+  LiteralStringBegin(ParserAstType type, {required this.token})
+      : super("LiteralString", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InterpolationExpressionHandle extends ParserAstNode {
+  final Token leftBracket;
+  final Token? rightBracket;
+
+  InterpolationExpressionHandle(ParserAstType type,
+      {required this.leftBracket, this.rightBracket})
+      : super("InterpolationExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "leftBracket": leftBracket,
+        "rightBracket": rightBracket,
+      };
+}
+
+class LiteralStringEnd extends ParserAstNode {
+  final int interpolationCount;
+  final Token endToken;
+
+  LiteralStringEnd(ParserAstType type,
+      {required this.interpolationCount, required this.endToken})
+      : super("LiteralString", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "interpolationCount": interpolationCount,
+        "endToken": endToken,
+      };
+}
+
+class StringJuxtapositionHandle extends ParserAstNode {
+  final Token startToken;
+  final int literalCount;
+
+  StringJuxtapositionHandle(ParserAstType type,
+      {required this.startToken, required this.literalCount})
+      : super("StringJuxtaposition", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "startToken": startToken,
+        "literalCount": literalCount,
+      };
+}
+
+class MemberBegin extends ParserAstNode {
+  MemberBegin(ParserAstType type) : super("Member", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class InvalidMemberHandle extends ParserAstNode {
+  final Token endToken;
+
+  InvalidMemberHandle(ParserAstType type, {required this.endToken})
+      : super("InvalidMember", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "endToken": endToken,
+      };
+}
+
+class MemberEnd extends ParserAstNode {
+  MemberEnd(ParserAstType type) : super("Member", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class MethodBegin extends ParserAstNode {
+  final DeclarationKind declarationKind;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? varFinalOrConst;
+  final Token? getOrSet;
+  final Token name;
+
+  MethodBegin(ParserAstType type,
+      {required this.declarationKind,
+      this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.varFinalOrConst,
+      this.getOrSet,
+      required this.name})
+      : super("Method", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "declarationKind": declarationKind,
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "varFinalOrConst": varFinalOrConst,
+        "getOrSet": getOrSet,
+        "name": name,
+      };
+}
+
+class ClassMethodEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  ClassMethodEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("ClassMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class MixinMethodEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  MixinMethodEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("MixinMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class ExtensionMethodEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  ExtensionMethodEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("ExtensionMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class ClassConstructorEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  ClassConstructorEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("ClassConstructor", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class MixinConstructorEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  MixinConstructorEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("MixinConstructor", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class ExtensionConstructorEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  ExtensionConstructorEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("ExtensionConstructor", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class MetadataStarBegin extends ParserAstNode {
+  final Token token;
+
+  MetadataStarBegin(ParserAstType type, {required this.token})
+      : super("MetadataStar", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class MetadataStarEnd extends ParserAstNode {
+  final int count;
+
+  MetadataStarEnd(ParserAstType type, {required this.count})
+      : super("MetadataStar", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+      };
+}
+
+class MetadataBegin extends ParserAstNode {
+  final Token token;
+
+  MetadataBegin(ParserAstType type, {required this.token})
+      : super("Metadata", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class MetadataEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token? periodBeforeName;
+  final Token endToken;
+
+  MetadataEnd(ParserAstType type,
+      {required this.beginToken, this.periodBeforeName, required this.endToken})
+      : super("Metadata", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "periodBeforeName": periodBeforeName,
+        "endToken": endToken,
+      };
+}
+
+class OptionalFormalParametersBegin extends ParserAstNode {
+  final Token token;
+
+  OptionalFormalParametersBegin(ParserAstType type, {required this.token})
+      : super("OptionalFormalParameters", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class OptionalFormalParametersEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  OptionalFormalParametersEnd(ParserAstType type,
+      {required this.count, required this.beginToken, required this.endToken})
+      : super("OptionalFormalParameters", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class PartBegin extends ParserAstNode {
+  final Token token;
+
+  PartBegin(ParserAstType type, {required this.token}) : super("Part", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class PartEnd extends ParserAstNode {
+  final Token partKeyword;
+  final Token semicolon;
+
+  PartEnd(ParserAstType type,
+      {required this.partKeyword, required this.semicolon})
+      : super("Part", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "partKeyword": partKeyword,
+        "semicolon": semicolon,
+      };
+}
+
+class PartOfBegin extends ParserAstNode {
+  final Token token;
+
+  PartOfBegin(ParserAstType type, {required this.token})
+      : super("PartOf", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class PartOfEnd extends ParserAstNode {
+  final Token partKeyword;
+  final Token ofKeyword;
+  final Token semicolon;
+  final bool hasName;
+
+  PartOfEnd(ParserAstType type,
+      {required this.partKeyword,
+      required this.ofKeyword,
+      required this.semicolon,
+      required this.hasName})
+      : super("PartOf", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "partKeyword": partKeyword,
+        "ofKeyword": ofKeyword,
+        "semicolon": semicolon,
+        "hasName": hasName,
+      };
+}
+
+class RedirectingFactoryBodyBegin extends ParserAstNode {
+  final Token token;
+
+  RedirectingFactoryBodyBegin(ParserAstType type, {required this.token})
+      : super("RedirectingFactoryBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class RedirectingFactoryBodyEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token endToken;
+
+  RedirectingFactoryBodyEnd(ParserAstType type,
+      {required this.beginToken, required this.endToken})
+      : super("RedirectingFactoryBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class ReturnStatementBegin extends ParserAstNode {
+  final Token token;
+
+  ReturnStatementBegin(ParserAstType type, {required this.token})
+      : super("ReturnStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NativeFunctionBodyHandle extends ParserAstNode {
+  final Token nativeToken;
+  final Token semicolon;
+
+  NativeFunctionBodyHandle(ParserAstType type,
+      {required this.nativeToken, required this.semicolon})
+      : super("NativeFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nativeToken": nativeToken,
+        "semicolon": semicolon,
+      };
+}
+
+class NativeFunctionBodyIgnoredHandle extends ParserAstNode {
+  final Token nativeToken;
+  final Token semicolon;
+
+  NativeFunctionBodyIgnoredHandle(ParserAstType type,
+      {required this.nativeToken, required this.semicolon})
+      : super("NativeFunctionBodyIgnored", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nativeToken": nativeToken,
+        "semicolon": semicolon,
+      };
+}
+
+class NativeFunctionBodySkippedHandle extends ParserAstNode {
+  final Token nativeToken;
+  final Token semicolon;
+
+  NativeFunctionBodySkippedHandle(ParserAstType type,
+      {required this.nativeToken, required this.semicolon})
+      : super("NativeFunctionBodySkipped", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nativeToken": nativeToken,
+        "semicolon": semicolon,
+      };
+}
+
+class EmptyFunctionBodyHandle extends ParserAstNode {
+  final Token semicolon;
+
+  EmptyFunctionBodyHandle(ParserAstType type, {required this.semicolon})
+      : super("EmptyFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "semicolon": semicolon,
+      };
+}
+
+class ExpressionFunctionBodyHandle extends ParserAstNode {
+  final Token arrowToken;
+  final Token? endToken;
+
+  ExpressionFunctionBodyHandle(ParserAstType type,
+      {required this.arrowToken, this.endToken})
+      : super("ExpressionFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "arrowToken": arrowToken,
+        "endToken": endToken,
+      };
+}
+
+class ReturnStatementEnd extends ParserAstNode {
+  final bool hasExpression;
+  final Token beginToken;
+  final Token endToken;
+
+  ReturnStatementEnd(ParserAstType type,
+      {required this.hasExpression,
+      required this.beginToken,
+      required this.endToken})
+      : super("ReturnStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "hasExpression": hasExpression,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class SendHandle extends ParserAstNode {
+  final Token beginToken;
+  final Token endToken;
+
+  SendHandle(ParserAstType type,
+      {required this.beginToken, required this.endToken})
+      : super("Send", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class ShowBegin extends ParserAstNode {
+  final Token showKeyword;
+
+  ShowBegin(ParserAstType type, {required this.showKeyword})
+      : super("Show", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "showKeyword": showKeyword,
+      };
+}
+
+class ShowEnd extends ParserAstNode {
+  final Token showKeyword;
+
+  ShowEnd(ParserAstType type, {required this.showKeyword})
+      : super("Show", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "showKeyword": showKeyword,
+      };
+}
+
+class SwitchStatementBegin extends ParserAstNode {
+  final Token token;
+
+  SwitchStatementBegin(ParserAstType type, {required this.token})
+      : super("SwitchStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class SwitchStatementEnd extends ParserAstNode {
+  final Token switchKeyword;
+  final Token endToken;
+
+  SwitchStatementEnd(ParserAstType type,
+      {required this.switchKeyword, required this.endToken})
+      : super("SwitchStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "switchKeyword": switchKeyword,
+        "endToken": endToken,
+      };
+}
+
+class SwitchBlockBegin extends ParserAstNode {
+  final Token token;
+
+  SwitchBlockBegin(ParserAstType type, {required this.token})
+      : super("SwitchBlock", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class SwitchBlockEnd extends ParserAstNode {
+  final int caseCount;
+  final Token beginToken;
+  final Token endToken;
+
+  SwitchBlockEnd(ParserAstType type,
+      {required this.caseCount,
+      required this.beginToken,
+      required this.endToken})
+      : super("SwitchBlock", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "caseCount": caseCount,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class LiteralSymbolBegin extends ParserAstNode {
+  final Token token;
+
+  LiteralSymbolBegin(ParserAstType type, {required this.token})
+      : super("LiteralSymbol", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LiteralSymbolEnd extends ParserAstNode {
+  final Token hashToken;
+  final int identifierCount;
+
+  LiteralSymbolEnd(ParserAstType type,
+      {required this.hashToken, required this.identifierCount})
+      : super("LiteralSymbol", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "hashToken": hashToken,
+        "identifierCount": identifierCount,
+      };
+}
+
+class ThrowExpressionHandle extends ParserAstNode {
+  final Token throwToken;
+  final Token endToken;
+
+  ThrowExpressionHandle(ParserAstType type,
+      {required this.throwToken, required this.endToken})
+      : super("ThrowExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "throwToken": throwToken,
+        "endToken": endToken,
+      };
+}
+
+class RethrowStatementBegin extends ParserAstNode {
+  final Token token;
+
+  RethrowStatementBegin(ParserAstType type, {required this.token})
+      : super("RethrowStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class RethrowStatementEnd extends ParserAstNode {
+  final Token rethrowToken;
+  final Token endToken;
+
+  RethrowStatementEnd(ParserAstType type,
+      {required this.rethrowToken, required this.endToken})
+      : super("RethrowStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "rethrowToken": rethrowToken,
+        "endToken": endToken,
+      };
+}
+
+class TopLevelDeclarationEnd extends ParserAstNode {
+  final Token nextToken;
+
+  TopLevelDeclarationEnd(ParserAstType type, {required this.nextToken})
+      : super("TopLevelDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nextToken": nextToken,
+      };
+}
+
+class InvalidTopLevelDeclarationHandle extends ParserAstNode {
+  final Token endToken;
+
+  InvalidTopLevelDeclarationHandle(ParserAstType type, {required this.endToken})
+      : super("InvalidTopLevelDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "endToken": endToken,
+      };
+}
+
+class TopLevelMemberBegin extends ParserAstNode {
+  final Token token;
+
+  TopLevelMemberBegin(ParserAstType type, {required this.token})
+      : super("TopLevelMember", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FieldsBegin extends ParserAstNode {
+  final DeclarationKind declarationKind;
+  final Token? abstractToken;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+  final Token lastConsumed;
+
+  FieldsBegin(ParserAstType type,
+      {required this.declarationKind,
+      this.abstractToken,
+      this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.lateToken,
+      this.varFinalOrConst,
+      required this.lastConsumed})
+      : super("Fields", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "declarationKind": declarationKind,
+        "abstractToken": abstractToken,
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+        "lastConsumed": lastConsumed,
+      };
+}
+
+class TopLevelFieldsEnd extends ParserAstNode {
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  TopLevelFieldsEnd(ParserAstType type,
+      {this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.lateToken,
+      this.varFinalOrConst,
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
+      : super("TopLevelFields", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class TopLevelMethodBegin extends ParserAstNode {
+  final Token lastConsumed;
+  final Token? externalToken;
+
+  TopLevelMethodBegin(ParserAstType type,
+      {required this.lastConsumed, this.externalToken})
+      : super("TopLevelMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "lastConsumed": lastConsumed,
+        "externalToken": externalToken,
+      };
+}
+
+class TopLevelMethodEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token? getOrSet;
+  final Token endToken;
+
+  TopLevelMethodEnd(ParserAstType type,
+      {required this.beginToken, this.getOrSet, required this.endToken})
+      : super("TopLevelMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "getOrSet": getOrSet,
+        "endToken": endToken,
+      };
+}
+
+class TryStatementBegin extends ParserAstNode {
+  final Token token;
+
+  TryStatementBegin(ParserAstType type, {required this.token})
+      : super("TryStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CaseMatchHandle extends ParserAstNode {
+  final Token caseKeyword;
+  final Token colon;
+
+  CaseMatchHandle(ParserAstType type,
+      {required this.caseKeyword, required this.colon})
+      : super("CaseMatch", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "caseKeyword": caseKeyword,
+        "colon": colon,
+      };
+}
+
+class CatchClauseBegin extends ParserAstNode {
+  final Token token;
+
+  CatchClauseBegin(ParserAstType type, {required this.token})
+      : super("CatchClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CatchClauseEnd extends ParserAstNode {
+  final Token token;
+
+  CatchClauseEnd(ParserAstType type, {required this.token})
+      : super("CatchClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CatchBlockHandle extends ParserAstNode {
+  final Token? onKeyword;
+  final Token? catchKeyword;
+  final Token? comma;
+
+  CatchBlockHandle(ParserAstType type,
+      {this.onKeyword, this.catchKeyword, this.comma})
+      : super("CatchBlock", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "onKeyword": onKeyword,
+        "catchKeyword": catchKeyword,
+        "comma": comma,
+      };
+}
+
+class FinallyBlockHandle extends ParserAstNode {
+  final Token finallyKeyword;
+
+  FinallyBlockHandle(ParserAstType type, {required this.finallyKeyword})
+      : super("FinallyBlock", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "finallyKeyword": finallyKeyword,
+      };
+}
+
+class TryStatementEnd extends ParserAstNode {
+  final int catchCount;
+  final Token tryKeyword;
+  final Token? finallyKeyword;
+
+  TryStatementEnd(ParserAstType type,
+      {required this.catchCount, required this.tryKeyword, this.finallyKeyword})
+      : super("TryStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "catchCount": catchCount,
+        "tryKeyword": tryKeyword,
+        "finallyKeyword": finallyKeyword,
+      };
+}
+
+class TypeHandle extends ParserAstNode {
+  final Token beginToken;
+  final Token? questionMark;
+
+  TypeHandle(ParserAstType type, {required this.beginToken, this.questionMark})
+      : super("Type", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "questionMark": questionMark,
+      };
+}
+
+class NonNullAssertExpressionHandle extends ParserAstNode {
+  final Token bang;
+
+  NonNullAssertExpressionHandle(ParserAstType type, {required this.bang})
+      : super("NonNullAssertExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "bang": bang,
+      };
+}
+
+class NoNameHandle extends ParserAstNode {
+  final Token token;
+
+  NoNameHandle(ParserAstType type, {required this.token})
+      : super("NoName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FunctionTypeBegin extends ParserAstNode {
+  final Token beginToken;
+
+  FunctionTypeBegin(ParserAstType type, {required this.beginToken})
+      : super("FunctionType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+      };
+}
+
+class FunctionTypeEnd extends ParserAstNode {
+  final Token functionToken;
+  final Token? questionMark;
+
+  FunctionTypeEnd(ParserAstType type,
+      {required this.functionToken, this.questionMark})
+      : super("FunctionType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "functionToken": functionToken,
+        "questionMark": questionMark,
+      };
+}
+
+class TypeArgumentsBegin extends ParserAstNode {
+  final Token token;
+
+  TypeArgumentsBegin(ParserAstType type, {required this.token})
+      : super("TypeArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class TypeArgumentsEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  TypeArgumentsEnd(ParserAstType type,
+      {required this.count, required this.beginToken, required this.endToken})
+      : super("TypeArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class InvalidTypeArgumentsHandle extends ParserAstNode {
+  final Token token;
+
+  InvalidTypeArgumentsHandle(ParserAstType type, {required this.token})
+      : super("InvalidTypeArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NoTypeArgumentsHandle extends ParserAstNode {
+  final Token token;
+
+  NoTypeArgumentsHandle(ParserAstType type, {required this.token})
+      : super("NoTypeArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class TypeVariableBegin extends ParserAstNode {
+  final Token token;
+
+  TypeVariableBegin(ParserAstType type, {required this.token})
+      : super("TypeVariable", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class TypeVariablesDefinedHandle extends ParserAstNode {
+  final Token token;
+  final int count;
+
+  TypeVariablesDefinedHandle(ParserAstType type,
+      {required this.token, required this.count})
+      : super("TypeVariablesDefined", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "count": count,
+      };
+}
+
+class TypeVariableEnd extends ParserAstNode {
+  final Token token;
+  final int index;
+  final Token? extendsOrSuper;
+  final Token? variance;
+
+  TypeVariableEnd(ParserAstType type,
+      {required this.token,
+      required this.index,
+      this.extendsOrSuper,
+      this.variance})
+      : super("TypeVariable", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "index": index,
+        "extendsOrSuper": extendsOrSuper,
+        "variance": variance,
+      };
+}
+
+class TypeVariablesBegin extends ParserAstNode {
+  final Token token;
+
+  TypeVariablesBegin(ParserAstType type, {required this.token})
+      : super("TypeVariables", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class TypeVariablesEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token endToken;
+
+  TypeVariablesEnd(ParserAstType type,
+      {required this.beginToken, required this.endToken})
+      : super("TypeVariables", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class FunctionExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  FunctionExpressionBegin(ParserAstType type, {required this.token})
+      : super("FunctionExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FunctionExpressionEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token token;
+
+  FunctionExpressionEnd(ParserAstType type,
+      {required this.beginToken, required this.token})
+      : super("FunctionExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "token": token,
+      };
+}
+
+class VariablesDeclarationBegin extends ParserAstNode {
+  final Token token;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+
+  VariablesDeclarationBegin(ParserAstType type,
+      {required this.token, this.lateToken, this.varFinalOrConst})
+      : super("VariablesDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+      };
+}
+
+class VariablesDeclarationEnd extends ParserAstNode {
+  final int count;
+  final Token? endToken;
+
+  VariablesDeclarationEnd(ParserAstType type,
+      {required this.count, this.endToken})
+      : super("VariablesDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "endToken": endToken,
+      };
+}
+
+class WhileStatementBegin extends ParserAstNode {
+  final Token token;
+
+  WhileStatementBegin(ParserAstType type, {required this.token})
+      : super("WhileStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class WhileStatementEnd extends ParserAstNode {
+  final Token whileKeyword;
+  final Token endToken;
+
+  WhileStatementEnd(ParserAstType type,
+      {required this.whileKeyword, required this.endToken})
+      : super("WhileStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "whileKeyword": whileKeyword,
+        "endToken": endToken,
+      };
+}
+
+class AsOperatorTypeBegin extends ParserAstNode {
+  final Token operator;
+
+  AsOperatorTypeBegin(ParserAstType type, {required this.operator})
+      : super("AsOperatorType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operator": operator,
+      };
+}
+
+class AsOperatorTypeEnd extends ParserAstNode {
+  final Token operator;
+
+  AsOperatorTypeEnd(ParserAstType type, {required this.operator})
+      : super("AsOperatorType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operator": operator,
+      };
+}
+
+class AsOperatorHandle extends ParserAstNode {
+  final Token operator;
+
+  AsOperatorHandle(ParserAstType type, {required this.operator})
+      : super("AsOperator", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operator": operator,
+      };
+}
+
+class AssignmentExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  AssignmentExpressionHandle(ParserAstType type, {required this.token})
+      : super("AssignmentExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class BinaryExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  BinaryExpressionBegin(ParserAstType type, {required this.token})
+      : super("BinaryExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class BinaryExpressionEnd extends ParserAstNode {
+  final Token token;
+
+  BinaryExpressionEnd(ParserAstType type, {required this.token})
+      : super("BinaryExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class EndingBinaryExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  EndingBinaryExpressionHandle(ParserAstType type, {required this.token})
+      : super("EndingBinaryExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ConditionalExpressionBegin extends ParserAstNode {
+  final Token question;
+
+  ConditionalExpressionBegin(ParserAstType type, {required this.question})
+      : super("ConditionalExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "question": question,
+      };
+}
+
+class ConditionalExpressionColonHandle extends ParserAstNode {
+  ConditionalExpressionColonHandle(ParserAstType type)
+      : super("ConditionalExpressionColon", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class ConditionalExpressionEnd extends ParserAstNode {
+  final Token question;
+  final Token colon;
+
+  ConditionalExpressionEnd(ParserAstType type,
+      {required this.question, required this.colon})
+      : super("ConditionalExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "question": question,
+        "colon": colon,
+      };
+}
+
+class ConstExpressionBegin extends ParserAstNode {
+  final Token constKeyword;
+
+  ConstExpressionBegin(ParserAstType type, {required this.constKeyword})
+      : super("ConstExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "constKeyword": constKeyword,
+      };
+}
+
+class ConstExpressionEnd extends ParserAstNode {
+  final Token token;
+
+  ConstExpressionEnd(ParserAstType type, {required this.token})
+      : super("ConstExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ConstFactoryHandle extends ParserAstNode {
+  final Token constKeyword;
+
+  ConstFactoryHandle(ParserAstType type, {required this.constKeyword})
+      : super("ConstFactory", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "constKeyword": constKeyword,
+      };
+}
+
+class ForControlFlowBegin extends ParserAstNode {
+  final Token? awaitToken;
+  final Token forToken;
+
+  ForControlFlowBegin(ParserAstType type,
+      {this.awaitToken, required this.forToken})
+      : super("ForControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "awaitToken": awaitToken,
+        "forToken": forToken,
+      };
+}
+
+class ForControlFlowEnd extends ParserAstNode {
+  final Token token;
+
+  ForControlFlowEnd(ParserAstType type, {required this.token})
+      : super("ForControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForInControlFlowEnd extends ParserAstNode {
+  final Token token;
+
+  ForInControlFlowEnd(ParserAstType type, {required this.token})
+      : super("ForInControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class IfControlFlowBegin extends ParserAstNode {
+  final Token ifToken;
+
+  IfControlFlowBegin(ParserAstType type, {required this.ifToken})
+      : super("IfControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "ifToken": ifToken,
+      };
+}
+
+class ThenControlFlowHandle extends ParserAstNode {
+  final Token token;
+
+  ThenControlFlowHandle(ParserAstType type, {required this.token})
+      : super("ThenControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ElseControlFlowHandle extends ParserAstNode {
+  final Token elseToken;
+
+  ElseControlFlowHandle(ParserAstType type, {required this.elseToken})
+      : super("ElseControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "elseToken": elseToken,
+      };
+}
+
+class IfControlFlowEnd extends ParserAstNode {
+  final Token token;
+
+  IfControlFlowEnd(ParserAstType type, {required this.token})
+      : super("IfControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class IfElseControlFlowEnd extends ParserAstNode {
+  final Token token;
+
+  IfElseControlFlowEnd(ParserAstType type, {required this.token})
+      : super("IfElseControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class SpreadExpressionHandle extends ParserAstNode {
+  final Token spreadToken;
+
+  SpreadExpressionHandle(ParserAstType type, {required this.spreadToken})
+      : super("SpreadExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "spreadToken": spreadToken,
+      };
+}
+
+class FunctionTypedFormalParameterBegin extends ParserAstNode {
+  final Token token;
+
+  FunctionTypedFormalParameterBegin(ParserAstType type, {required this.token})
+      : super("FunctionTypedFormalParameter", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FunctionTypedFormalParameterEnd extends ParserAstNode {
+  final Token nameToken;
+  final Token? question;
+
+  FunctionTypedFormalParameterEnd(ParserAstType type,
+      {required this.nameToken, this.question})
+      : super("FunctionTypedFormalParameter", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nameToken": nameToken,
+        "question": question,
+      };
+}
+
+class IdentifierHandle extends ParserAstNode {
+  final Token token;
+  final IdentifierContext context;
+
+  IdentifierHandle(ParserAstType type,
+      {required this.token, required this.context})
+      : super("Identifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "context": context,
+      };
+}
+
+class ShowHideIdentifierHandle extends ParserAstNode {
+  final Token? modifier;
+  final Token identifier;
+
+  ShowHideIdentifierHandle(ParserAstType type,
+      {this.modifier, required this.identifier})
+      : super("ShowHideIdentifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "modifier": modifier,
+        "identifier": identifier,
+      };
+}
+
+class IndexedExpressionHandle extends ParserAstNode {
+  final Token? question;
+  final Token openSquareBracket;
+  final Token closeSquareBracket;
+
+  IndexedExpressionHandle(ParserAstType type,
+      {this.question,
+      required this.openSquareBracket,
+      required this.closeSquareBracket})
+      : super("IndexedExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "question": question,
+        "openSquareBracket": openSquareBracket,
+        "closeSquareBracket": closeSquareBracket,
+      };
+}
+
+class IsOperatorTypeBegin extends ParserAstNode {
+  final Token operator;
+
+  IsOperatorTypeBegin(ParserAstType type, {required this.operator})
+      : super("IsOperatorType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operator": operator,
+      };
+}
+
+class IsOperatorTypeEnd extends ParserAstNode {
+  final Token operator;
+
+  IsOperatorTypeEnd(ParserAstType type, {required this.operator})
+      : super("IsOperatorType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operator": operator,
+      };
+}
+
+class IsOperatorHandle extends ParserAstNode {
+  final Token isOperator;
+  final Token? not;
+
+  IsOperatorHandle(ParserAstType type, {required this.isOperator, this.not})
+      : super("IsOperator", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "isOperator": isOperator,
+        "not": not,
+      };
+}
+
+class LiteralBoolHandle extends ParserAstNode {
+  final Token token;
+
+  LiteralBoolHandle(ParserAstType type, {required this.token})
+      : super("LiteralBool", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class BreakStatementHandle extends ParserAstNode {
+  final bool hasTarget;
+  final Token breakKeyword;
+  final Token endToken;
+
+  BreakStatementHandle(ParserAstType type,
+      {required this.hasTarget,
+      required this.breakKeyword,
+      required this.endToken})
+      : super("BreakStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "hasTarget": hasTarget,
+        "breakKeyword": breakKeyword,
+        "endToken": endToken,
+      };
+}
+
+class ContinueStatementHandle extends ParserAstNode {
+  final bool hasTarget;
+  final Token continueKeyword;
+  final Token endToken;
+
+  ContinueStatementHandle(ParserAstType type,
+      {required this.hasTarget,
+      required this.continueKeyword,
+      required this.endToken})
+      : super("ContinueStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "hasTarget": hasTarget,
+        "continueKeyword": continueKeyword,
+        "endToken": endToken,
+      };
+}
+
+class EmptyStatementHandle extends ParserAstNode {
+  final Token token;
+
+  EmptyStatementHandle(ParserAstType type, {required this.token})
+      : super("EmptyStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class AssertBegin extends ParserAstNode {
+  final Token assertKeyword;
+  final Assert kind;
+
+  AssertBegin(ParserAstType type,
+      {required this.assertKeyword, required this.kind})
+      : super("Assert", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "assertKeyword": assertKeyword,
+        "kind": kind,
+      };
+}
+
+class AssertEnd extends ParserAstNode {
+  final Token assertKeyword;
+  final Assert kind;
+  final Token leftParenthesis;
+  final Token? commaToken;
+  final Token semicolonToken;
+
+  AssertEnd(ParserAstType type,
+      {required this.assertKeyword,
+      required this.kind,
+      required this.leftParenthesis,
+      this.commaToken,
+      required this.semicolonToken})
+      : super("Assert", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "assertKeyword": assertKeyword,
+        "kind": kind,
+        "leftParenthesis": leftParenthesis,
+        "commaToken": commaToken,
+        "semicolonToken": semicolonToken,
+      };
+}
+
+class LiteralDoubleHandle extends ParserAstNode {
+  final Token token;
+
+  LiteralDoubleHandle(ParserAstType type, {required this.token})
+      : super("LiteralDouble", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LiteralIntHandle extends ParserAstNode {
+  final Token token;
+
+  LiteralIntHandle(ParserAstType type, {required this.token})
+      : super("LiteralInt", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LiteralListHandle extends ParserAstNode {
+  final int count;
+  final Token leftBracket;
+  final Token? constKeyword;
+  final Token rightBracket;
+
+  LiteralListHandle(ParserAstType type,
+      {required this.count,
+      required this.leftBracket,
+      this.constKeyword,
+      required this.rightBracket})
+      : super("LiteralList", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "leftBracket": leftBracket,
+        "constKeyword": constKeyword,
+        "rightBracket": rightBracket,
+      };
+}
+
+class LiteralSetOrMapHandle extends ParserAstNode {
+  final int count;
+  final Token leftBrace;
+  final Token? constKeyword;
+  final Token rightBrace;
+  final bool hasSetEntry;
+
+  LiteralSetOrMapHandle(ParserAstType type,
+      {required this.count,
+      required this.leftBrace,
+      this.constKeyword,
+      required this.rightBrace,
+      required this.hasSetEntry})
+      : super("LiteralSetOrMap", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "leftBrace": leftBrace,
+        "constKeyword": constKeyword,
+        "rightBrace": rightBrace,
+        "hasSetEntry": hasSetEntry,
+      };
+}
+
+class LiteralNullHandle extends ParserAstNode {
+  final Token token;
+
+  LiteralNullHandle(ParserAstType type, {required this.token})
+      : super("LiteralNull", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NativeClauseHandle extends ParserAstNode {
+  final Token nativeToken;
+  final bool hasName;
+
+  NativeClauseHandle(ParserAstType type,
+      {required this.nativeToken, required this.hasName})
+      : super("NativeClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nativeToken": nativeToken,
+        "hasName": hasName,
+      };
+}
+
+class NamedArgumentHandle extends ParserAstNode {
+  final Token colon;
+
+  NamedArgumentHandle(ParserAstType type, {required this.colon})
+      : super("NamedArgument", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "colon": colon,
+      };
+}
+
+class NewExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  NewExpressionBegin(ParserAstType type, {required this.token})
+      : super("NewExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NewExpressionEnd extends ParserAstNode {
+  final Token token;
+
+  NewExpressionEnd(ParserAstType type, {required this.token})
+      : super("NewExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NoArgumentsHandle extends ParserAstNode {
+  final Token token;
+
+  NoArgumentsHandle(ParserAstType type, {required this.token})
+      : super("NoArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NoConstructorReferenceContinuationAfterTypeArgumentsHandle
+    extends ParserAstNode {
+  final Token token;
+
+  NoConstructorReferenceContinuationAfterTypeArgumentsHandle(ParserAstType type,
+      {required this.token})
+      : super("NoConstructorReferenceContinuationAfterTypeArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NoTypeNameInConstructorReferenceHandle extends ParserAstNode {
+  final Token token;
+
+  NoTypeNameInConstructorReferenceHandle(ParserAstType type,
+      {required this.token})
+      : super("NoTypeNameInConstructorReference", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NoTypeHandle extends ParserAstNode {
+  final Token lastConsumed;
+
+  NoTypeHandle(ParserAstType type, {required this.lastConsumed})
+      : super("NoType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "lastConsumed": lastConsumed,
+      };
+}
+
+class NoTypeVariablesHandle extends ParserAstNode {
+  final Token token;
+
+  NoTypeVariablesHandle(ParserAstType type, {required this.token})
+      : super("NoTypeVariables", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class OperatorHandle extends ParserAstNode {
+  final Token token;
+
+  OperatorHandle(ParserAstType type, {required this.token})
+      : super("Operator", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class SymbolVoidHandle extends ParserAstNode {
+  final Token token;
+
+  SymbolVoidHandle(ParserAstType type, {required this.token})
+      : super("SymbolVoid", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class OperatorNameHandle extends ParserAstNode {
+  final Token operatorKeyword;
+  final Token token;
+
+  OperatorNameHandle(ParserAstType type,
+      {required this.operatorKeyword, required this.token})
+      : super("OperatorName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operatorKeyword": operatorKeyword,
+        "token": token,
+      };
+}
+
+class InvalidOperatorNameHandle extends ParserAstNode {
+  final Token operatorKeyword;
+  final Token token;
+
+  InvalidOperatorNameHandle(ParserAstType type,
+      {required this.operatorKeyword, required this.token})
+      : super("InvalidOperatorName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operatorKeyword": operatorKeyword,
+        "token": token,
+      };
+}
+
+class ParenthesizedConditionHandle extends ParserAstNode {
+  final Token token;
+
+  ParenthesizedConditionHandle(ParserAstType type, {required this.token})
+      : super("ParenthesizedCondition", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ParenthesizedExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  ParenthesizedExpressionHandle(ParserAstType type, {required this.token})
+      : super("ParenthesizedExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class QualifiedHandle extends ParserAstNode {
+  final Token period;
+
+  QualifiedHandle(ParserAstType type, {required this.period})
+      : super("Qualified", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "period": period,
+      };
+}
+
+class StringPartHandle extends ParserAstNode {
+  final Token token;
+
+  StringPartHandle(ParserAstType type, {required this.token})
+      : super("StringPart", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class SuperExpressionHandle extends ParserAstNode {
+  final Token token;
+  final IdentifierContext context;
+
+  SuperExpressionHandle(ParserAstType type,
+      {required this.token, required this.context})
+      : super("SuperExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "context": context,
+      };
+}
+
+class SwitchCaseBegin extends ParserAstNode {
+  final int labelCount;
+  final int expressionCount;
+  final Token firstToken;
+
+  SwitchCaseBegin(ParserAstType type,
+      {required this.labelCount,
+      required this.expressionCount,
+      required this.firstToken})
+      : super("SwitchCase", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "labelCount": labelCount,
+        "expressionCount": expressionCount,
+        "firstToken": firstToken,
+      };
+}
+
+class SwitchCaseEnd extends ParserAstNode {
+  final int labelCount;
+  final int expressionCount;
+  final Token? defaultKeyword;
+  final Token? colonAfterDefault;
+  final int statementCount;
+  final Token firstToken;
+  final Token endToken;
+
+  SwitchCaseEnd(ParserAstType type,
+      {required this.labelCount,
+      required this.expressionCount,
+      this.defaultKeyword,
+      this.colonAfterDefault,
+      required this.statementCount,
+      required this.firstToken,
+      required this.endToken})
+      : super("SwitchCase", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "labelCount": labelCount,
+        "expressionCount": expressionCount,
+        "defaultKeyword": defaultKeyword,
+        "colonAfterDefault": colonAfterDefault,
+        "statementCount": statementCount,
+        "firstToken": firstToken,
+        "endToken": endToken,
+      };
+}
+
+class ThisExpressionHandle extends ParserAstNode {
+  final Token token;
+  final IdentifierContext context;
+
+  ThisExpressionHandle(ParserAstType type,
+      {required this.token, required this.context})
+      : super("ThisExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "context": context,
+      };
+}
+
+class UnaryPostfixAssignmentExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  UnaryPostfixAssignmentExpressionHandle(ParserAstType type,
+      {required this.token})
+      : super("UnaryPostfixAssignmentExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class UnaryPrefixExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  UnaryPrefixExpressionHandle(ParserAstType type, {required this.token})
+      : super("UnaryPrefixExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class UnaryPrefixAssignmentExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  UnaryPrefixAssignmentExpressionHandle(ParserAstType type,
+      {required this.token})
+      : super("UnaryPrefixAssignmentExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FormalParameterDefaultValueExpressionBegin extends ParserAstNode {
+  FormalParameterDefaultValueExpressionBegin(ParserAstType type)
+      : super("FormalParameterDefaultValueExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class FormalParameterDefaultValueExpressionEnd extends ParserAstNode {
+  FormalParameterDefaultValueExpressionEnd(ParserAstType type)
+      : super("FormalParameterDefaultValueExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class ValuedFormalParameterHandle extends ParserAstNode {
+  final Token equals;
+  final Token token;
+
+  ValuedFormalParameterHandle(ParserAstType type,
+      {required this.equals, required this.token})
+      : super("ValuedFormalParameter", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "equals": equals,
+        "token": token,
+      };
+}
+
+class FormalParameterWithoutValueHandle extends ParserAstNode {
+  final Token token;
+
+  FormalParameterWithoutValueHandle(ParserAstType type, {required this.token})
+      : super("FormalParameterWithoutValue", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class VoidKeywordHandle extends ParserAstNode {
+  final Token token;
+
+  VoidKeywordHandle(ParserAstType type, {required this.token})
+      : super("VoidKeyword", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class VoidKeywordWithTypeArgumentsHandle extends ParserAstNode {
+  final Token token;
+
+  VoidKeywordWithTypeArgumentsHandle(ParserAstType type, {required this.token})
+      : super("VoidKeywordWithTypeArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class YieldStatementBegin extends ParserAstNode {
+  final Token token;
+
+  YieldStatementBegin(ParserAstType type, {required this.token})
+      : super("YieldStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class YieldStatementEnd extends ParserAstNode {
+  final Token yieldToken;
+  final Token? starToken;
+  final Token endToken;
+
+  YieldStatementEnd(ParserAstType type,
+      {required this.yieldToken, this.starToken, required this.endToken})
+      : super("YieldStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "yieldToken": yieldToken,
+        "starToken": starToken,
+        "endToken": endToken,
+      };
+}
+
+class InvalidYieldStatementEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token? starToken;
+  final Token endToken;
+  final MessageCode errorCode;
+
+  InvalidYieldStatementEnd(ParserAstType type,
+      {required this.beginToken,
+      this.starToken,
+      required this.endToken,
+      required this.errorCode})
+      : super("InvalidYieldStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "starToken": starToken,
+        "endToken": endToken,
+        "errorCode": errorCode,
+      };
+}
+
+class RecoverableErrorHandle extends ParserAstNode {
+  final Message message;
+  final Token startToken;
+  final Token endToken;
+
+  RecoverableErrorHandle(ParserAstType type,
+      {required this.message, required this.startToken, required this.endToken})
+      : super("RecoverableError", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "message": message,
+        "startToken": startToken,
+        "endToken": endToken,
+      };
+}
+
+class ErrorTokenHandle extends ParserAstNode {
+  final ErrorToken token;
+
+  ErrorTokenHandle(ParserAstType type, {required this.token})
+      : super("ErrorToken", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class UnescapeErrorHandle extends ParserAstNode {
+  final Message message;
+  final Token location;
+  final int stringOffset;
+  final int length;
+
+  UnescapeErrorHandle(ParserAstType type,
+      {required this.message,
+      required this.location,
+      required this.stringOffset,
+      required this.length})
+      : super("UnescapeError", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "message": message,
+        "location": location,
+        "stringOffset": stringOffset,
+        "length": length,
+      };
+}
+
+class InvalidStatementHandle extends ParserAstNode {
+  final Token token;
+  final Message message;
+
+  InvalidStatementHandle(ParserAstType type,
+      {required this.token, required this.message})
+      : super("InvalidStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "message": message,
+      };
+}
+
+class ScriptHandle extends ParserAstNode {
+  final Token token;
+
+  ScriptHandle(ParserAstType type, {required this.token})
+      : super("Script", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CommentReferenceTextHandle extends ParserAstNode {
+  final String referenceSource;
+  final int referenceOffset;
+
+  CommentReferenceTextHandle(ParserAstType type,
+      {required this.referenceSource, required this.referenceOffset})
+      : super("CommentReferenceText", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "referenceSource": referenceSource,
+        "referenceOffset": referenceOffset,
+      };
+}
+
+class CommentReferenceHandle extends ParserAstNode {
+  final Token? newKeyword;
+  final Token? prefix;
+  final Token? period;
+  final Token token;
+
+  CommentReferenceHandle(ParserAstType type,
+      {this.newKeyword, this.prefix, this.period, required this.token})
+      : super("CommentReference", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "newKeyword": newKeyword,
+        "prefix": prefix,
+        "period": period,
+        "token": token,
+      };
+}
+
+class NoCommentReferenceHandle extends ParserAstNode {
+  NoCommentReferenceHandle(ParserAstType type)
+      : super("NoCommentReference", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class TypeArgumentApplicationHandle extends ParserAstNode {
+  final Token openAngleBracket;
+
+  TypeArgumentApplicationHandle(ParserAstType type,
+      {required this.openAngleBracket})
+      : super("TypeArgumentApplication", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "openAngleBracket": openAngleBracket,
+      };
+}
+
+class NewAsIdentifierHandle extends ParserAstNode {
+  final Token token;
+
+  NewAsIdentifierHandle(ParserAstType type, {required this.token})
+      : super("NewAsIdentifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
diff --git a/pkg/front_end/lib/src/fasta/util/textual_outline.dart b/pkg/front_end/lib/src/fasta/util/textual_outline.dart
index b72d8b6..e902eab 100644
--- a/pkg/front_end/lib/src/fasta/util/textual_outline.dart
+++ b/pkg/front_end/lib/src/fasta/util/textual_outline.dart
@@ -759,7 +759,7 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
     elementStartToChunk[enumKeyword] =
         new _EnumChunk(enumKeyword, leftBrace.endGroup!);
   }
diff --git a/pkg/front_end/lib/src/testing/id_testing_helper.dart b/pkg/front_end/lib/src/testing/id_testing_helper.dart
index 2a8c8c8..77a6a44 100644
--- a/pkg/front_end/lib/src/testing/id_testing_helper.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_helper.dart
@@ -52,6 +52,7 @@
   final Map<ExperimentalFlag, bool> explicitExperimentalFlags;
   final AllowedExperimentalFlags? allowedExperimentalFlags;
   final Uri? librariesSpecificationUri;
+  final Uri? packageConfigUri;
   // TODO(johnniwinther): Tailor support to redefine selected platform
   // classes/members only.
   final bool compileSdk;
@@ -62,6 +63,7 @@
       {this.explicitExperimentalFlags = const {},
       this.allowedExperimentalFlags,
       this.librariesSpecificationUri,
+      this.packageConfigUri,
       this.compileSdk: false,
       this.targetFlags: const TestTargetFlags(),
       this.nnbdMode: NnbdMode.Weak});
@@ -322,6 +324,7 @@
       options.compileSdk = config.compileSdk;
     }
   }
+  options.packagesFileUri = config.packageConfigUri;
   config.customizeCompilerOptions(options, testData);
   InternalCompilerResult compilerResult = await compileScript(
       testData.memorySourceFiles,
diff --git a/pkg/front_end/lib/widget_cache.dart b/pkg/front_end/lib/widget_cache.dart
index f80f493..752b969 100644
--- a/pkg/front_end/lib/widget_cache.dart
+++ b/pkg/front_end/lib/widget_cache.dart
@@ -59,7 +59,7 @@
   String? checkSingleWidgetTypeModified(
     Component? lastGoodComponent,
     Component partialComponent,
-    ClassHierarchy classHierarchy,
+    ClassHierarchy? classHierarchy,
   ) {
     if (!_frameworkTypesLocated ||
         lastGoodComponent == null ||
@@ -124,7 +124,7 @@
     }
 
     // Update the class references to stateless, stateful, and state classes.
-    for (Library library in classHierarchy.knownLibraries) {
+    for (Library library in classHierarchy!.knownLibraries) {
       if (library.importUri == _frameworkLibrary) {
         _locatedClassDeclarations(library);
       }
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index b217478..c7aca29 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -212,6 +212,8 @@
 DuplicatedParameterName/example: Fail
 Encoding/analyzerCode: Fail
 EnumConstantSameNameAsEnclosing/example: Fail
+EnumDeclaresFactory/analyzerCode: Fail
+EnumDeclaresFactory/example: Fail
 EnumInstantiation/example: Fail
 EqualityCannotBeEqualityOperand/part_wrapped_script1: Fail
 EqualityCannotBeEqualityOperand/part_wrapped_script2: Fail
@@ -525,10 +527,6 @@
 JsInteropExternalMemberNotJSAnnotated/example: Fail # Web compiler specific
 JsInteropIndexNotSupported/analyzerCode: Fail # Web compiler specific
 JsInteropIndexNotSupported/example: Fail # Web compiler specific
-JsInteropStaticInteropWithInstanceMembers/analyzerCode: Fail # Web compiler specific
-JsInteropStaticInteropWithInstanceMembers/example: Fail # Web compiler specific
-JsInteropStaticInteropWithNonStaticSupertype/analyzerCode: Fail # Web compiler specific
-JsInteropStaticInteropWithNonStaticSupertype/example: Fail # Web compiler specific
 JsInteropJSClassExtendsDartClass/analyzerCode: Fail # Web compiler specific
 JsInteropJSClassExtendsDartClass/example: Fail # Web compiler specific
 JsInteropNamedParameters/analyzerCode: Fail # Web compiler specific
@@ -539,6 +537,10 @@
 JsInteropNonExternalConstructor/example: Fail # Web compiler specific
 JsInteropNonExternalMember/analyzerCode: Fail # Web compiler specific
 JsInteropNonExternalMember/example: Fail # Web compiler specific
+JsInteropStaticInteropWithInstanceMembers/analyzerCode: Fail # Web compiler specific
+JsInteropStaticInteropWithInstanceMembers/example: Fail # Web compiler specific
+JsInteropStaticInteropWithNonStaticSupertype/analyzerCode: Fail # Web compiler specific
+JsInteropStaticInteropWithNonStaticSupertype/example: Fail # Web compiler specific
 LanguageVersionInvalidInDotPackages/analyzerCode: Fail
 LanguageVersionMismatchInPart/analyzerCode: Fail
 LanguageVersionMismatchInPart/part_wrapped_script: Fail # Part in (now) part.
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 5eac795..043ebae 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -929,7 +929,7 @@
 
 SuperInitializerNotLast:
   problemMessage: "Can't have initializers after 'super'."
-  analyzerCode: INVALID_SUPER_INVOCATION
+  analyzerCode: SUPER_INVOCATION_NOT_LAST
   script:
     - "class C { int x; C.bad() : super(), x = 5; }"
 
@@ -2069,6 +2069,10 @@
   problemMessage: "Unsupported nullability value '#string' on type '#type'."
   severity: INTERNAL_PROBLEM
 
+InternalProblemOmittedTypeNameInConstructorReference:
+  problemMessage: "Unsupported omission of the type name in a constructor reference outside of an enum element declaration."
+  severity: INTERNAL_PROBLEM
+
 IncrementalCompilerIllegalParameter:
   problemMessage: "Illegal parameter name '#string' found during expression compilation."
 
@@ -5436,3 +5440,7 @@
   experiments: constructor-tearoffs
   script: |
     method(dynamic d) => d.new;
+
+EnumDeclaresFactory:
+  problemMessage: "Enums can't declare factory constructors."
+  correctionMessage: "Try removing the factory constructor declaration."
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/a.dart b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/a.dart
new file mode 100644
index 0000000..4e6a6de
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/a.dart
@@ -0,0 +1 @@
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/a2.dart b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/a2.dart
new file mode 100644
index 0000000..8c26988
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/a2.dart
@@ -0,0 +1 @@
+class Foo2 {}
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/b.dart b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/b.dart
new file mode 100644
index 0000000..4e6a6de
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/b.dart
@@ -0,0 +1 @@
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/b2.dart b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/b2.dart
new file mode 100644
index 0000000..8c26988
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/b2.dart
@@ -0,0 +1 @@
+class Foo2 {}
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/c.dart b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/c.dart
new file mode 100644
index 0000000..4e6a6de
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/c.dart
@@ -0,0 +1 @@
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/c2.dart b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/c2.dart
new file mode 100644
index 0000000..8c26988
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/c2.dart
@@ -0,0 +1 @@
+class Foo2 {}
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/main.dart b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/main.dart
new file mode 100644
index 0000000..bc74a47
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/main.dart
@@ -0,0 +1,8 @@
+import 'a.dart' if (dart.library.html) 'b.dart' if (dart.library.io) 'c.dart';
+export 'a2.dart'
+    if (dart.library.html) 'b2.dart'
+    if (dart.library.io) 'c2.dart';
+
+Foo x() {
+  return new Foo();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/main.dart.outline_extracted
new file mode 100644
index 0000000..a516b91
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/main.dart.outline_extracted
@@ -0,0 +1,40 @@
+org-dartlang-testcase:///main.dart:
+import 'a.dart' if (dart.library.html) 'b.dart' if (dart.library.io) 'c.dart';
+export 'a2.dart' if (dart.library.html) 'b2.dart' if (dart.library.io) 'c2.dart';
+Foo x() {}
+
+
+
+
+org-dartlang-testcase:///a2.dart:
+class Foo2 {}
+
+
+
+
+org-dartlang-testcase:///b2.dart:
+class Foo2 {}
+
+
+
+
+org-dartlang-testcase:///c2.dart:
+class Foo2 {}
+
+
+
+
+org-dartlang-testcase:///a.dart:
+class Foo {}
+
+
+
+
+org-dartlang-testcase:///b.dart:
+class Foo {}
+
+
+
+
+org-dartlang-testcase:///c.dart:
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/exports_export_01/main.dart b/pkg/front_end/outline_extraction_testcases/exports_export_01/main.dart
new file mode 100644
index 0000000..997da89
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/exports_export_01/main.dart
@@ -0,0 +1,3 @@
+import "test8.dart";
+
+ClassFromImportsExportsExport? zyx____xyz;
diff --git a/pkg/front_end/outline_extraction_testcases/exports_export_01/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/exports_export_01/main.dart.outline_extracted
new file mode 100644
index 0000000..1f5cc58
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/exports_export_01/main.dart.outline_extracted
@@ -0,0 +1,22 @@
+org-dartlang-testcase:///main.dart:
+import "test8.dart";
+ClassFromImportsExportsExport? zyx____xyz;
+
+
+
+
+org-dartlang-testcase:///test8.dart:
+export "test9.dart";
+
+
+
+
+org-dartlang-testcase:///test9.dart:
+export "test10.dart";
+
+
+
+
+org-dartlang-testcase:///test10.dart:
+export "dart:async";
+class ClassFromImportsExportsExport {}
diff --git a/pkg/front_end/outline_extraction_testcases/exports_export_01/test10.dart b/pkg/front_end/outline_extraction_testcases/exports_export_01/test10.dart
new file mode 100644
index 0000000..8513138
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/exports_export_01/test10.dart
@@ -0,0 +1,5 @@
+export "dart:async";
+
+void test10Method() {}
+
+class ClassFromImportsExportsExport {}
diff --git a/pkg/front_end/outline_extraction_testcases/exports_export_01/test8.dart b/pkg/front_end/outline_extraction_testcases/exports_export_01/test8.dart
new file mode 100644
index 0000000..c83a90a
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/exports_export_01/test8.dart
@@ -0,0 +1,3 @@
+export "test9.dart";
+
+void test8Method() {}
diff --git a/pkg/front_end/outline_extraction_testcases/exports_export_01/test9.dart b/pkg/front_end/outline_extraction_testcases/exports_export_01/test9.dart
new file mode 100644
index 0000000..d0fcb31
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/exports_export_01/test9.dart
@@ -0,0 +1,3 @@
+export "test10.dart";
+
+void test9Method() {}
diff --git a/pkg/front_end/outline_extraction_testcases/exports_included/main.dart b/pkg/front_end/outline_extraction_testcases/exports_included/main.dart
new file mode 100644
index 0000000..52091d7
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/exports_included/main.dart
@@ -0,0 +1 @@
+export "test6.dart";
diff --git a/pkg/front_end/outline_extraction_testcases/exports_included/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/exports_included/main.dart.outline_extracted
new file mode 100644
index 0000000..c2b824d
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/exports_included/main.dart.outline_extracted
@@ -0,0 +1,15 @@
+org-dartlang-testcase:///main.dart:
+export "test6.dart";
+
+
+
+
+org-dartlang-testcase:///test6.dart:
+export "test7.dart";
+void test6() {}
+
+
+
+
+org-dartlang-testcase:///test7.dart:
+void test7() {}
diff --git a/pkg/front_end/outline_extraction_testcases/exports_included/test6.dart b/pkg/front_end/outline_extraction_testcases/exports_included/test6.dart
new file mode 100644
index 0000000..c130634
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/exports_included/test6.dart
@@ -0,0 +1,3 @@
+export "test7.dart";
+
+void test6() {}
diff --git a/pkg/front_end/outline_extraction_testcases/exports_included/test7.dart b/pkg/front_end/outline_extraction_testcases/exports_included/test7.dart
new file mode 100644
index 0000000..5b3e78d
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/exports_included/test7.dart
@@ -0,0 +1 @@
+void test7() {}
diff --git a/pkg/front_end/outline_extraction_testcases/extends/foo.dart b/pkg/front_end/outline_extraction_testcases/extends/foo.dart
new file mode 100644
index 0000000..4e6a6de
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/extends/foo.dart
@@ -0,0 +1 @@
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/extends/main.dart b/pkg/front_end/outline_extraction_testcases/extends/main.dart
new file mode 100644
index 0000000..a126b2a
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/extends/main.dart
@@ -0,0 +1,3 @@
+import "foo.dart";
+
+class X extends Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/extends/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/extends/main.dart.outline_extracted
new file mode 100644
index 0000000..09b7413
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/extends/main.dart.outline_extracted
@@ -0,0 +1,9 @@
+org-dartlang-testcase:///main.dart:
+import "foo.dart";
+class X extends Foo {}
+
+
+
+
+org-dartlang-testcase:///foo.dart:
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/factories/main.dart b/pkg/front_end/outline_extraction_testcases/factories/main.dart
new file mode 100644
index 0000000..316b9c5
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/factories/main.dart
@@ -0,0 +1,12 @@
+import 'package:foo/test11.dart';
+
+class Abc {
+  Abc() {}
+  factory Abc.a() {
+    return Abc2();
+  }
+  // Abc3 currently gets in --- it doesn't have to.
+  factory Abc.b() => Abc3();
+  var v1 = Abc4();
+  var v2 = new Abc5();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/factories/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/factories/main.dart.outline_extracted
new file mode 100644
index 0000000..4127b46
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/factories/main.dart.outline_extracted
@@ -0,0 +1,24 @@
+org-dartlang-testcase:///main.dart:
+import 'package:foo/test11.dart';
+class Abc {
+  Abc() {}
+  factory Abc.a() {}
+  factory Abc.b() => Abc3();
+  var v1 = Abc4();
+  var v2 = new Abc5();
+}
+
+
+
+
+org-dartlang-testcase:///test11.dart:
+import 'package:foo/main.dart';
+class Abc3 extends Abc {
+  Abc3() {}
+}
+class Abc4 extends Abc {
+  Abc4() {}
+}
+class Abc5 extends Abc {
+  Abc5() {}
+}
diff --git a/pkg/front_end/outline_extraction_testcases/factories/test11.dart b/pkg/front_end/outline_extraction_testcases/factories/test11.dart
new file mode 100644
index 0000000..105387c
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/factories/test11.dart
@@ -0,0 +1,21 @@
+import 'package:foo/main.dart';
+
+class Abc2 extends Abc {
+  Abc2() {}
+}
+
+class Abc3 extends Abc {
+  Abc3() {}
+}
+
+class Abc4 extends Abc {
+  Abc4() {}
+}
+
+class Abc5 extends Abc {
+  Abc5() {}
+}
+
+class Abc6 extends Abc {
+  Abc6() {}
+}
diff --git a/pkg/front_end/outline_extraction_testcases/field_dotting_in/b.dart b/pkg/front_end/outline_extraction_testcases/field_dotting_in/b.dart
new file mode 100644
index 0000000..112fdbc
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/field_dotting_in/b.dart
@@ -0,0 +1,9 @@
+import "c.dart";
+
+class B {
+  C c() {
+    return new C();
+  }
+}
+
+class BPrime {}
diff --git a/pkg/front_end/outline_extraction_testcases/field_dotting_in/c.dart b/pkg/front_end/outline_extraction_testcases/field_dotting_in/c.dart
new file mode 100644
index 0000000..356bd56
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/field_dotting_in/c.dart
@@ -0,0 +1,9 @@
+import "d.dart";
+
+class C {
+  D d() {
+    return new D();
+  }
+}
+
+class CPrime {}
diff --git a/pkg/front_end/outline_extraction_testcases/field_dotting_in/d.dart b/pkg/front_end/outline_extraction_testcases/field_dotting_in/d.dart
new file mode 100644
index 0000000..8655cd4
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/field_dotting_in/d.dart
@@ -0,0 +1,7 @@
+class D {
+  String d() {
+    return "hello";
+  }
+}
+
+class DPrime {}
diff --git a/pkg/front_end/outline_extraction_testcases/field_dotting_in/main.dart b/pkg/front_end/outline_extraction_testcases/field_dotting_in/main.dart
new file mode 100644
index 0000000..3d53be6
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/field_dotting_in/main.dart
@@ -0,0 +1,9 @@
+import "b.dart";
+
+var x = A.b().c().d;
+
+class A {
+  static B b() {
+    return new B();
+  }
+}
diff --git a/pkg/front_end/outline_extraction_testcases/field_dotting_in/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/field_dotting_in/main.dart.outline_extracted
new file mode 100644
index 0000000..e9a8f51
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/field_dotting_in/main.dart.outline_extracted
@@ -0,0 +1,32 @@
+org-dartlang-testcase:///main.dart:
+import "b.dart";
+var x = A.b().c().d;
+class A {
+  static B b() {}
+}
+
+
+
+
+org-dartlang-testcase:///b.dart:
+import "c.dart";
+class B {
+  C c() {}
+}
+
+
+
+
+org-dartlang-testcase:///c.dart:
+import "d.dart";
+class C {
+  D d() {}
+}
+
+
+
+
+org-dartlang-testcase:///d.dart:
+class D {
+  String d() {}
+}
diff --git a/pkg/front_end/outline_extraction_testcases/fields/bar.dart b/pkg/front_end/outline_extraction_testcases/fields/bar.dart
new file mode 100644
index 0000000..79f980a
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/fields/bar.dart
@@ -0,0 +1,11 @@
+class Bar {}
+
+class Bar2 {}
+
+class Bar3 {}
+
+class Bar4 {}
+
+class Foo3 {}
+
+class Foo4 {}
diff --git a/pkg/front_end/outline_extraction_testcases/fields/foo.dart b/pkg/front_end/outline_extraction_testcases/fields/foo.dart
new file mode 100644
index 0000000..43434c3
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/fields/foo.dart
@@ -0,0 +1,13 @@
+export "bar.dart";
+
+class Baz {}
+
+class Baz2 {}
+
+class Baz3 {}
+
+class Baz4 {}
+
+class Foo {}
+
+class Foo2 {}
diff --git a/pkg/front_end/outline_extraction_testcases/fields/main.dart b/pkg/front_end/outline_extraction_testcases/fields/main.dart
new file mode 100644
index 0000000..bf52fd9
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/fields/main.dart
@@ -0,0 +1,19 @@
+import "foo.dart";
+
+class A {
+  Bar field = new Bar();
+  Bar2 field2 = new Bar2();
+  var field3 = new Bar3(), field4 = new Bar4();
+}
+
+mixin A2 {
+  Baz field = new Baz();
+  Baz2 field2 = new Baz2();
+  var field3 = new Baz3(), field4 = new Baz4();
+}
+
+extension A3 on Object {
+  static Foo field = new Foo();
+  static Foo2 field2 = new Foo2();
+  static var field3 = new Foo3(), field4 = new Foo4();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/fields/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/fields/main.dart.outline_extracted
new file mode 100644
index 0000000..13e239a
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/fields/main.dart.outline_extracted
@@ -0,0 +1,40 @@
+org-dartlang-testcase:///main.dart:
+import "foo.dart";
+class A {
+  Bar field = new Bar();
+  Bar2 field2 = new Bar2();
+  var field3 = new Bar3(), field4 = new Bar4();
+}
+mixin A2 {
+  Baz field = new Baz();
+  Baz2 field2 = new Baz2();
+  var field3 = new Baz3(), field4 = new Baz4();
+}
+extension A3 on Object {
+  static Foo field = new Foo();
+  static Foo2 field2 = new Foo2();
+  static var field3 = new Foo3(), field4 = new Foo4();
+}
+
+
+
+
+org-dartlang-testcase:///foo.dart:
+export "bar.dart";
+class Baz {}
+class Baz2 {}
+class Baz3 {}
+class Baz4 {}
+class Foo {}
+class Foo2 {}
+
+
+
+
+org-dartlang-testcase:///bar.dart:
+class Bar {}
+class Bar2 {}
+class Bar3 {}
+class Bar4 {}
+class Foo3 {}
+class Foo4 {}
diff --git a/pkg/front_end/outline_extraction_testcases/import_prefix_overlap_with_field/main.dart b/pkg/front_end/outline_extraction_testcases/import_prefix_overlap_with_field/main.dart
new file mode 100644
index 0000000..3cfbb90
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_prefix_overlap_with_field/main.dart
@@ -0,0 +1,6 @@
+import "test16.dart" as test16;
+
+class Test16ClassHelper {
+  // the naming matching is what makes it annoying!
+  final test16toplevel = test16.test16toplevel("hello");
+}
diff --git a/pkg/front_end/outline_extraction_testcases/import_prefix_overlap_with_field/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/import_prefix_overlap_with_field/main.dart.outline_extracted
new file mode 100644
index 0000000..e0a42eb
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_prefix_overlap_with_field/main.dart.outline_extracted
@@ -0,0 +1,11 @@
+org-dartlang-testcase:///main.dart:
+import "test16.dart" as test16;
+class Test16ClassHelper {
+  final test16toplevel = test16.test16toplevel("hello");
+}
+
+
+
+
+org-dartlang-testcase:///test16.dart:
+String test16toplevel(String s) {}
diff --git a/pkg/front_end/outline_extraction_testcases/import_prefix_overlap_with_field/test16.dart b/pkg/front_end/outline_extraction_testcases/import_prefix_overlap_with_field/test16.dart
new file mode 100644
index 0000000..41d882e
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_prefix_overlap_with_field/test16.dart
@@ -0,0 +1,3 @@
+String test16toplevel(String s) {
+  return s * 2;
+}
diff --git a/pkg/front_end/outline_extraction_testcases/import_with_prefix/bar.dart b/pkg/front_end/outline_extraction_testcases/import_with_prefix/bar.dart
new file mode 100644
index 0000000..91b2144
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_with_prefix/bar.dart
@@ -0,0 +1,5 @@
+int bar() {
+  return 42;
+}
+
+class Baz {}
diff --git a/pkg/front_end/outline_extraction_testcases/import_with_prefix/foo.dart b/pkg/front_end/outline_extraction_testcases/import_with_prefix/foo.dart
new file mode 100644
index 0000000..0ec48dd
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_with_prefix/foo.dart
@@ -0,0 +1,5 @@
+String bar() {
+  return "hello";
+}
+
+class Baz {}
diff --git a/pkg/front_end/outline_extraction_testcases/import_with_prefix/main.dart b/pkg/front_end/outline_extraction_testcases/import_with_prefix/main.dart
new file mode 100644
index 0000000..aef942d
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_with_prefix/main.dart
@@ -0,0 +1,7 @@
+import 'foo.dart' as foo;
+// This import isn't used --- foo.bar below explicitly wants bar from foo.
+import 'bar.dart';
+
+var x = foo.bar();
+
+foo.Baz? baz;
diff --git a/pkg/front_end/outline_extraction_testcases/import_with_prefix/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/import_with_prefix/main.dart.outline_extracted
new file mode 100644
index 0000000..1c804cb
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_with_prefix/main.dart.outline_extracted
@@ -0,0 +1,17 @@
+org-dartlang-testcase:///main.dart:
+import 'foo.dart' as foo;
+import 'bar.dart';
+var x = foo.bar();
+foo.Baz? baz;
+
+
+
+
+org-dartlang-testcase:///foo.dart:
+String bar() {}
+class Baz {}
+
+
+
+
+org-dartlang-testcase:///bar.dart:
diff --git a/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/a.dart b/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/a.dart
new file mode 100644
index 0000000..ff840ec
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/a.dart
@@ -0,0 +1,3 @@
+String foo() {
+  return "foo";
+}
diff --git a/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/b.dart b/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/b.dart
new file mode 100644
index 0000000..07f55de
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/b.dart
@@ -0,0 +1,3 @@
+String bar() {
+  return "bar";
+}
diff --git a/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/main.dart b/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/main.dart
new file mode 100644
index 0000000..73d125a
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/main.dart
@@ -0,0 +1,5 @@
+import 'a.dart' as x;
+import 'b.dart' as x;
+
+var foo = x.foo();
+var bar = x.bar();
diff --git a/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/main.dart.outline_extracted
new file mode 100644
index 0000000..166189c
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/main.dart.outline_extracted
@@ -0,0 +1,17 @@
+org-dartlang-testcase:///main.dart:
+import 'a.dart' as x;
+import 'b.dart' as x;
+var foo = x.foo();
+var bar = x.bar();
+
+
+
+
+org-dartlang-testcase:///a.dart:
+String foo() {}
+
+
+
+
+org-dartlang-testcase:///b.dart:
+String bar() {}
diff --git a/pkg/front_end/outline_extraction_testcases/initial_various/main.dart b/pkg/front_end/outline_extraction_testcases/initial_various/main.dart
new file mode 100644
index 0000000..2ff0638
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/initial_various/main.dart
@@ -0,0 +1,28 @@
+import "main.dart" as self;
+import "test3.dart";
+
+class Foo<E> extends Bar<int> with Qux1<int> implements Baz<Bar<int>> {
+  Foo<E>? parent;
+
+  Foo() {}
+  Foo.bar() {}
+  F? fooMethod1<F>() {
+    print(foo);
+    print(F);
+    print(x.A);
+  }
+
+  E? fooMethod2() {
+    print(E);
+    print(x.A);
+  }
+
+  self.Foo? fooMethod3() {
+    print(E);
+    print(x.A);
+  }
+
+  x fooMethod4() {
+    return x.A;
+  }
+}
diff --git a/pkg/front_end/outline_extraction_testcases/initial_various/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/initial_various/main.dart.outline_extracted
new file mode 100644
index 0000000..3426756
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/initial_various/main.dart.outline_extracted
@@ -0,0 +1,24 @@
+org-dartlang-testcase:///main.dart:
+import "main.dart" as self;
+import "test3.dart";
+class Foo<E> extends Bar<int> with Qux1<int> implements Baz<Bar<int>> {
+  Foo<E>? parent;
+  Foo() {}
+  Foo.bar() {}
+  F? fooMethod1<F>() {}
+  E? fooMethod2() {}
+  self.Foo? fooMethod3() {}
+  x fooMethod4() {}
+}
+
+
+
+
+org-dartlang-testcase:///test3.dart:
+class Bar<E> {}
+class Baz<E> {}
+class Qux1<E> {
+  Qux1AndAHalf? qux1AndAHalf() {}
+}
+class Qux1AndAHalf<E> {}
+enum x { A, B, C }
diff --git a/pkg/front_end/outline_extraction_testcases/initial_various/test3.dart b/pkg/front_end/outline_extraction_testcases/initial_various/test3.dart
new file mode 100644
index 0000000..530644b
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/initial_various/test3.dart
@@ -0,0 +1,25 @@
+import "test4.dart";
+
+class Bar<E> {}
+
+class Baz<E> {}
+
+class Qux1<E> {
+  Qux1AndAHalf? qux1AndAHalf() {
+    // nothing...
+  }
+}
+
+class Qux1AndAHalf<E> {}
+
+class Qux2<E> {
+  Qux3? foo() {}
+}
+
+enum x { A, B, C }
+
+int foo() {
+  return 42;
+}
+
+int foo2 = foo() * 2, foo3 = foo() * 3;
diff --git a/pkg/front_end/outline_extraction_testcases/initial_various/test4.dart b/pkg/front_end/outline_extraction_testcases/initial_various/test4.dart
new file mode 100644
index 0000000..3215ebf
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/initial_various/test4.dart
@@ -0,0 +1,8 @@
+import "test5.dart";
+export "test5.dart";
+
+class Qux3<E> {
+  Qux4? foo() {}
+}
+
+class Qux4<E> {}
diff --git a/pkg/front_end/outline_extraction_testcases/initial_various/test5.dart b/pkg/front_end/outline_extraction_testcases/initial_various/test5.dart
new file mode 100644
index 0000000..0315739
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/initial_various/test5.dart
@@ -0,0 +1,5 @@
+class Qux3x<E> {
+  Qux4x? foo() {}
+}
+
+class Qux4x<E> {}
diff --git a/pkg/front_end/outline_extraction_testcases/keeps_dart_version/bar.dart b/pkg/front_end/outline_extraction_testcases/keeps_dart_version/bar.dart
new file mode 100644
index 0000000..62e4db2
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/keeps_dart_version/bar.dart
@@ -0,0 +1,5 @@
+// @dart = 2.12
+
+class Bar {}
+
+class Baz {}
diff --git a/pkg/front_end/outline_extraction_testcases/keeps_dart_version/main.dart b/pkg/front_end/outline_extraction_testcases/keeps_dart_version/main.dart
new file mode 100644
index 0000000..f20e3af
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/keeps_dart_version/main.dart
@@ -0,0 +1,3 @@
+import "bar.dart";
+
+void foo(Bar bar) {}
diff --git a/pkg/front_end/outline_extraction_testcases/keeps_dart_version/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/keeps_dart_version/main.dart.outline_extracted
new file mode 100644
index 0000000..9a0da03
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/keeps_dart_version/main.dart.outline_extracted
@@ -0,0 +1,10 @@
+org-dartlang-testcase:///main.dart:
+import "bar.dart";
+void foo(Bar bar) {}
+
+
+
+
+org-dartlang-testcase:///bar.dart:
+// @dart = 2.12
+class Bar {}
diff --git a/pkg/front_end/outline_extraction_testcases/metadata_01/a.dart b/pkg/front_end/outline_extraction_testcases/metadata_01/a.dart
new file mode 100644
index 0000000..e7267c5
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/metadata_01/a.dart
@@ -0,0 +1 @@
+class AUnused {}
diff --git a/pkg/front_end/outline_extraction_testcases/metadata_01/b.dart b/pkg/front_end/outline_extraction_testcases/metadata_01/b.dart
new file mode 100644
index 0000000..8b42bda
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/metadata_01/b.dart
@@ -0,0 +1,9 @@
+const AbcX = const _AbcX();
+
+class _AbcX {
+  const _AbcX();
+}
+
+class AbcX2 {
+  const AbcX2();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/metadata_01/main.dart b/pkg/front_end/outline_extraction_testcases/metadata_01/main.dart
new file mode 100644
index 0000000..a55d3df
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/metadata_01/main.dart
@@ -0,0 +1,5 @@
+import "a.dart";
+import "b.dart";
+
+@AbcX
+void foo() {}
diff --git a/pkg/front_end/outline_extraction_testcases/metadata_01/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/metadata_01/main.dart.outline_extracted
new file mode 100644
index 0000000..6d8ae63
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/metadata_01/main.dart.outline_extracted
@@ -0,0 +1,19 @@
+org-dartlang-testcase:///main.dart:
+import "a.dart";
+import "b.dart";
+@AbcX
+void foo() {}
+
+
+
+
+org-dartlang-testcase:///a.dart:
+
+
+
+
+org-dartlang-testcase:///b.dart:
+const AbcX = const _AbcX();
+class _AbcX {
+  const _AbcX();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/metadata_02/main.dart b/pkg/front_end/outline_extraction_testcases/metadata_02/main.dart
new file mode 100644
index 0000000..851e231
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/metadata_02/main.dart
@@ -0,0 +1,5 @@
+import "test15.dart" as $test15;
+import "nottest15.dart";
+
+@$test15.Test15()
+void test15thing() {}
diff --git a/pkg/front_end/outline_extraction_testcases/metadata_02/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/metadata_02/main.dart.outline_extracted
new file mode 100644
index 0000000..123667f
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/metadata_02/main.dart.outline_extracted
@@ -0,0 +1,18 @@
+org-dartlang-testcase:///main.dart:
+import "test15.dart" as $test15;
+import "nottest15.dart";
+@$test15.Test15()
+void test15thing() {}
+
+
+
+
+org-dartlang-testcase:///test15.dart:
+class Test15 {
+  const Test15();
+}
+
+
+
+
+org-dartlang-testcase:///nottest15.dart:
diff --git a/pkg/front_end/outline_extraction_testcases/metadata_02/nottest15.dart b/pkg/front_end/outline_extraction_testcases/metadata_02/nottest15.dart
new file mode 100644
index 0000000..41594d9
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/metadata_02/nottest15.dart
@@ -0,0 +1,7 @@
+class Test15 {
+  const Test15();
+}
+
+class Test16 {
+  const Test16();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/metadata_02/test15.dart b/pkg/front_end/outline_extraction_testcases/metadata_02/test15.dart
new file mode 100644
index 0000000..41594d9
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/metadata_02/test15.dart
@@ -0,0 +1,7 @@
+class Test15 {
+  const Test15();
+}
+
+class Test16 {
+  const Test16();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/a.dart b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/a.dart
new file mode 100644
index 0000000..bde7250
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/a.dart
@@ -0,0 +1,5 @@
+library foo.a;
+
+export 'b.dart';
+export 'c.dart';
+export 'd.dart';
diff --git a/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/b.dart b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/b.dart
new file mode 100644
index 0000000..3a43d09
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/b.dart
@@ -0,0 +1 @@
+class B {}
diff --git a/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/c.dart b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/c.dart
new file mode 100644
index 0000000..ed37d13
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/c.dart
@@ -0,0 +1,7 @@
+class C<T> {
+  const C.b();
+}
+
+class C2<T> {
+  const C2.b();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/d.dart b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/d.dart
new file mode 100644
index 0000000..40416ad
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/d.dart
@@ -0,0 +1 @@
+class D {}
diff --git a/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/main.dart b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/main.dart
new file mode 100644
index 0000000..afbc02d
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/main.dart
@@ -0,0 +1,6 @@
+import 'package:foo/a.dart' as foo;
+
+class A {
+  var c1 = foo.C<A>.b();
+  var c2 = new foo.C2<A>.b();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/main.dart.outline_extracted
new file mode 100644
index 0000000..c1a663e
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/main.dart.outline_extracted
@@ -0,0 +1,36 @@
+org-dartlang-testcase:///main.dart:
+import 'package:foo/a.dart' as foo;
+class A {
+  var c1 = foo.C<A>.b();
+  var c2 = new foo.C2<A>.b();
+}
+
+
+
+
+org-dartlang-testcase:///a.dart:
+library foo.a;
+export 'b.dart';
+export 'c.dart';
+export 'd.dart';
+
+
+
+
+org-dartlang-testcase:///b.dart:
+
+
+
+
+org-dartlang-testcase:///c.dart:
+class C<T> {
+  const C.b();
+}
+class C2<T> {
+  const C2.b();
+}
+
+
+
+
+org-dartlang-testcase:///d.dart:
diff --git a/pkg/front_end/outline_extraction_testcases/named_mixin/bar.dart b/pkg/front_end/outline_extraction_testcases/named_mixin/bar.dart
new file mode 100644
index 0000000..512eabb
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_mixin/bar.dart
@@ -0,0 +1,3 @@
+export "baz.dart";
+
+class Bar {}
diff --git a/pkg/front_end/outline_extraction_testcases/named_mixin/baz.dart b/pkg/front_end/outline_extraction_testcases/named_mixin/baz.dart
new file mode 100644
index 0000000..f1e00d1
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_mixin/baz.dart
@@ -0,0 +1 @@
+class Baz {}
diff --git a/pkg/front_end/outline_extraction_testcases/named_mixin/main.dart b/pkg/front_end/outline_extraction_testcases/named_mixin/main.dart
new file mode 100644
index 0000000..4e0e374
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_mixin/main.dart
@@ -0,0 +1,3 @@
+import "bar.dart";
+
+class Foo = Object with Bar implements Baz;
diff --git a/pkg/front_end/outline_extraction_testcases/named_mixin/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/named_mixin/main.dart.outline_extracted
new file mode 100644
index 0000000..5ff64b3
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_mixin/main.dart.outline_extracted
@@ -0,0 +1,16 @@
+org-dartlang-testcase:///main.dart:
+import "bar.dart";
+class Foo = Object with Bar implements Baz;
+
+
+
+
+org-dartlang-testcase:///bar.dart:
+export "baz.dart";
+class Bar {}
+
+
+
+
+org-dartlang-testcase:///baz.dart:
+class Baz {}
diff --git a/pkg/front_end/outline_extraction_testcases/outline_extractor.status b/pkg/front_end/outline_extraction_testcases/outline_extractor.status
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/outline_extractor.status
diff --git a/pkg/front_end/outline_extraction_testcases/part_01/main.dart b/pkg/front_end/outline_extraction_testcases/part_01/main.dart
new file mode 100644
index 0000000..1d7ff4e
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_01/main.dart
@@ -0,0 +1,4 @@
+import "test12.dart";
+
+void test12part1usage(Test12Part1 x) {}
+void secondtest12part1usage(SecondTest12 x) {}
diff --git a/pkg/front_end/outline_extraction_testcases/part_01/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/part_01/main.dart.outline_extracted
new file mode 100644
index 0000000..ee384f7
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_01/main.dart.outline_extracted
@@ -0,0 +1,47 @@
+org-dartlang-testcase:///main.dart:
+import "test12.dart";
+void test12part1usage(Test12Part1 x) {}
+void secondtest12part1usage(SecondTest12 x) {}
+
+
+
+
+org-dartlang-testcase:///test12.dart:
+import "test13.dart";
+import "test14.dart";
+part 'test12_part1.dart';
+part 'test12_part2.dart';
+class Test12 {}
+class SecondTest12 {
+  void foo(SecondTest12Part1 x) {}
+}
+
+
+
+
+org-dartlang-testcase:///test12_part1.dart:
+part of "test12.dart";
+class Test12Part1 {
+  void foo(Test12 x) {}
+  void bar(Test12Part2 x) {}
+  void baz(Test13 x) {}
+}
+class SecondTest12Part1 {}
+
+
+
+
+org-dartlang-testcase:///test12_part2.dart:
+part of "test12.dart";
+class Test12Part2 {}
+
+
+
+
+org-dartlang-testcase:///test13.dart:
+class Test13 {}
+
+
+
+
+org-dartlang-testcase:///test14.dart:
diff --git a/pkg/front_end/outline_extraction_testcases/part_01/test12.dart b/pkg/front_end/outline_extraction_testcases/part_01/test12.dart
new file mode 100644
index 0000000..07c621e
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_01/test12.dart
@@ -0,0 +1,11 @@
+import "test13.dart";
+import "test14.dart";
+
+part 'test12_part1.dart';
+part 'test12_part2.dart';
+
+class Test12 {}
+
+class SecondTest12 {
+  void foo(SecondTest12Part1 x) {}
+}
diff --git a/pkg/front_end/outline_extraction_testcases/part_01/test12_part1.dart b/pkg/front_end/outline_extraction_testcases/part_01/test12_part1.dart
new file mode 100644
index 0000000..44473ff
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_01/test12_part1.dart
@@ -0,0 +1,9 @@
+part of "test12.dart";
+
+class Test12Part1 {
+  void foo(Test12 x) {}
+  void bar(Test12Part2 x) {}
+  void baz(Test13 x) {}
+}
+
+class SecondTest12Part1 {}
diff --git a/pkg/front_end/outline_extraction_testcases/part_01/test12_part2.dart b/pkg/front_end/outline_extraction_testcases/part_01/test12_part2.dart
new file mode 100644
index 0000000..413d50d
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_01/test12_part2.dart
@@ -0,0 +1,3 @@
+part of "test12.dart";
+
+class Test12Part2 {}
diff --git a/pkg/front_end/outline_extraction_testcases/part_01/test13.dart b/pkg/front_end/outline_extraction_testcases/part_01/test13.dart
new file mode 100644
index 0000000..caa3ed4
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_01/test13.dart
@@ -0,0 +1,3 @@
+import "test13andahalf.dart";
+
+class Test13 {}
diff --git a/pkg/front_end/outline_extraction_testcases/part_01/test13andahalf.dart b/pkg/front_end/outline_extraction_testcases/part_01/test13andahalf.dart
new file mode 100644
index 0000000..16bc96b
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_01/test13andahalf.dart
@@ -0,0 +1 @@
+class Test13AndAHalf {}
diff --git a/pkg/front_end/outline_extraction_testcases/part_01/test14.dart b/pkg/front_end/outline_extraction_testcases/part_01/test14.dart
new file mode 100644
index 0000000..023fefd
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_01/test14.dart
@@ -0,0 +1 @@
+class Test14 {}
diff --git a/pkg/front_end/outline_extraction_testcases/part_and_library_name/main.dart b/pkg/front_end/outline_extraction_testcases/part_and_library_name/main.dart
new file mode 100644
index 0000000..d9163f5
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_and_library_name/main.dart
@@ -0,0 +1,3 @@
+import 'test3.dart';
+
+var x = test3partfoo();
diff --git a/pkg/front_end/outline_extraction_testcases/part_and_library_name/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/part_and_library_name/main.dart.outline_extracted
new file mode 100644
index 0000000..2d108c7
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_and_library_name/main.dart.outline_extracted
@@ -0,0 +1,17 @@
+org-dartlang-testcase:///main.dart:
+import 'test3.dart';
+var x = test3partfoo();
+
+
+
+
+org-dartlang-testcase:///test3.dart:
+library test3;
+part "test3_part.dart";
+
+
+
+
+org-dartlang-testcase:///test3_part.dart:
+part of test3;
+void test3partfoo() {}
diff --git a/pkg/front_end/outline_extraction_testcases/part_and_library_name/test3.dart b/pkg/front_end/outline_extraction_testcases/part_and_library_name/test3.dart
new file mode 100644
index 0000000..8fdefdd
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_and_library_name/test3.dart
@@ -0,0 +1,5 @@
+library test3;
+
+part "test3_part.dart";
+
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/part_and_library_name/test3_part.dart b/pkg/front_end/outline_extraction_testcases/part_and_library_name/test3_part.dart
new file mode 100644
index 0000000..e6e3fc4
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_and_library_name/test3_part.dart
@@ -0,0 +1,5 @@
+part of test3;
+
+void test3partfoo() {}
+
+class Bar {}
diff --git a/pkg/front_end/outline_extraction_testcases/split_import_export_part/foo.dart b/pkg/front_end/outline_extraction_testcases/split_import_export_part/foo.dart
new file mode 100644
index 0000000..4e6a6de
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/split_import_export_part/foo.dart
@@ -0,0 +1 @@
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/split_import_export_part/main.dart b/pkg/front_end/outline_extraction_testcases/split_import_export_part/main.dart
new file mode 100644
index 0000000..85d6722
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/split_import_export_part/main.dart
@@ -0,0 +1,25 @@
+import "package:f"
+    "oobar"
+    "/"
+    "foo"
+    ".dart";
+
+export "package:f"
+    "oobar"
+    "/"
+    "foo"
+    ".dart";
+
+part "package:f"
+    "oobar"
+    "/"
+    "part"
+    ".dart";
+
+Foo giveFoo() {
+  return new Foo();
+}
+
+Bar giveBar() {
+  return new Bar();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/split_import_export_part/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/split_import_export_part/main.dart.outline_extracted
new file mode 100644
index 0000000..ed23c5a
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/split_import_export_part/main.dart.outline_extracted
@@ -0,0 +1,19 @@
+org-dartlang-testcase:///main.dart:
+import "package:f" "oobar" "/" "foo" ".dart";
+export "package:f" "oobar" "/" "foo" ".dart";
+part "package:f" "oobar" "/" "part" ".dart";
+Foo giveFoo() {}
+Bar giveBar() {}
+
+
+
+
+org-dartlang-testcase:///foo.dart:
+class Foo {}
+
+
+
+
+org-dartlang-testcase:///part.dart:
+part of "package:f" "oobar" "/" "main" ".dart";
+class Bar {}
diff --git a/pkg/front_end/outline_extraction_testcases/split_import_export_part/part.dart b/pkg/front_end/outline_extraction_testcases/split_import_export_part/part.dart
new file mode 100644
index 0000000..009eb8e
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/split_import_export_part/part.dart
@@ -0,0 +1,7 @@
+part of "package:f"
+    "oobar"
+    "/"
+    "main"
+    ".dart";
+
+class Bar {}
diff --git a/pkg/front_end/outline_extraction_testcases/type_parameter_extends/bar.dart b/pkg/front_end/outline_extraction_testcases/type_parameter_extends/bar.dart
new file mode 100644
index 0000000..3507a7f
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/type_parameter_extends/bar.dart
@@ -0,0 +1,5 @@
+class Bar {}
+
+class Bar2 {}
+
+class Bar3 {}
diff --git a/pkg/front_end/outline_extraction_testcases/type_parameter_extends/foo.dart b/pkg/front_end/outline_extraction_testcases/type_parameter_extends/foo.dart
new file mode 100644
index 0000000..820b17e
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/type_parameter_extends/foo.dart
@@ -0,0 +1,7 @@
+export "bar.dart";
+
+class Baz {}
+
+class Baz2 {}
+
+class Baz3 {}
diff --git a/pkg/front_end/outline_extraction_testcases/type_parameter_extends/main.dart b/pkg/front_end/outline_extraction_testcases/type_parameter_extends/main.dart
new file mode 100644
index 0000000..73b5565
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/type_parameter_extends/main.dart
@@ -0,0 +1,16 @@
+import "foo.dart";
+
+class A<T extends Bar, U extends Baz> {
+  T? aMethod1() {}
+  U? aMethod2() {}
+}
+
+mixin A2<T extends Bar2, U extends Baz2> {
+  T? aMethod1() {}
+  U? aMethod2() {}
+}
+
+extension A3<T extends Bar3, U extends Baz3> on Object {
+  T? aMethod1() {}
+  U? aMethod2() {}
+}
diff --git a/pkg/front_end/outline_extraction_testcases/type_parameter_extends/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/type_parameter_extends/main.dart.outline_extracted
new file mode 100644
index 0000000..8b4f0c5
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/type_parameter_extends/main.dart.outline_extracted
@@ -0,0 +1,31 @@
+org-dartlang-testcase:///main.dart:
+import "foo.dart";
+class A<T extends Bar, U extends Baz> {
+  T? aMethod1() {}
+  U? aMethod2() {}
+}
+mixin A2<T extends Bar2, U extends Baz2> {
+  T? aMethod1() {}
+  U? aMethod2() {}
+}
+extension A3<T extends Bar3, U extends Baz3> on Object {
+  T? aMethod1() {}
+  U? aMethod2() {}
+}
+
+
+
+
+org-dartlang-testcase:///foo.dart:
+export "bar.dart";
+class Baz {}
+class Baz2 {}
+class Baz3 {}
+
+
+
+
+org-dartlang-testcase:///bar.dart:
+class Bar {}
+class Bar2 {}
+class Bar3 {}
diff --git a/pkg/front_end/outline_extraction_testcases/type_parameter_on_extension/main.dart b/pkg/front_end/outline_extraction_testcases/type_parameter_on_extension/main.dart
new file mode 100644
index 0000000..5093237
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/type_parameter_on_extension/main.dart
@@ -0,0 +1,5 @@
+class Foo<E> {}
+
+extension HiExtension<T extends Foo> on T {
+  void sayHi() {}
+}
diff --git a/pkg/front_end/outline_extraction_testcases/type_parameter_on_extension/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/type_parameter_on_extension/main.dart.outline_extracted
new file mode 100644
index 0000000..c561270
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/type_parameter_on_extension/main.dart.outline_extracted
@@ -0,0 +1,5 @@
+org-dartlang-testcase:///main.dart:
+class Foo<E> {}
+extension HiExtension<T extends Foo> on T {
+  void sayHi() {}
+}
diff --git a/pkg/front_end/outline_extraction_testcases/unused_import/foo.dart b/pkg/front_end/outline_extraction_testcases/unused_import/foo.dart
new file mode 100644
index 0000000..4e6a6de
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/unused_import/foo.dart
@@ -0,0 +1 @@
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/unused_import/main.dart b/pkg/front_end/outline_extraction_testcases/unused_import/main.dart
new file mode 100644
index 0000000..8713cd2
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/unused_import/main.dart
@@ -0,0 +1,6 @@
+import "foo.dart";
+
+void main() {
+  Foo foo = new Foo();
+  print(foo);
+}
diff --git a/pkg/front_end/outline_extraction_testcases/unused_import/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/unused_import/main.dart.outline_extracted
new file mode 100644
index 0000000..aea942e
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/unused_import/main.dart.outline_extracted
@@ -0,0 +1,8 @@
+org-dartlang-testcase:///main.dart:
+import "foo.dart";
+void main() {}
+
+
+
+
+org-dartlang-testcase:///foo.dart:
diff --git a/pkg/front_end/outline_extraction_testcases/unused_import_02/bar.dart b/pkg/front_end/outline_extraction_testcases/unused_import_02/bar.dart
new file mode 100644
index 0000000..5db1c42
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/unused_import_02/bar.dart
@@ -0,0 +1,8 @@
+import "baz.dart";
+
+class Bar {
+  void bar() {
+    Baz baz = new Baz();
+    print(baz);
+  }
+}
diff --git a/pkg/front_end/outline_extraction_testcases/unused_import_02/baz.dart b/pkg/front_end/outline_extraction_testcases/unused_import_02/baz.dart
new file mode 100644
index 0000000..f1e00d1
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/unused_import_02/baz.dart
@@ -0,0 +1 @@
+class Baz {}
diff --git a/pkg/front_end/outline_extraction_testcases/unused_import_02/foo.dart b/pkg/front_end/outline_extraction_testcases/unused_import_02/foo.dart
new file mode 100644
index 0000000..4e6a6de
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/unused_import_02/foo.dart
@@ -0,0 +1 @@
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/unused_import_02/main.dart b/pkg/front_end/outline_extraction_testcases/unused_import_02/main.dart
new file mode 100644
index 0000000..732d2c4
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/unused_import_02/main.dart
@@ -0,0 +1,8 @@
+import "dart:core";
+import "foo.dart";
+export "bar.dart";
+
+void main() {
+  Foo foo = new Foo();
+  print(foo);
+}
diff --git a/pkg/front_end/outline_extraction_testcases/unused_import_02/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/unused_import_02/main.dart.outline_extracted
new file mode 100644
index 0000000..5e0cec5
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/unused_import_02/main.dart.outline_extracted
@@ -0,0 +1,24 @@
+org-dartlang-testcase:///main.dart:
+import "dart:core";
+import "foo.dart";
+export "bar.dart";
+void main() {}
+
+
+
+
+org-dartlang-testcase:///bar.dart:
+import "baz.dart";
+class Bar {
+  void bar() {}
+}
+
+
+
+
+org-dartlang-testcase:///foo.dart:
+
+
+
+
+org-dartlang-testcase:///baz.dart:
diff --git a/pkg/front_end/outline_extraction_testcases/use_of_imported_extension/foo.dart b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension/foo.dart
new file mode 100644
index 0000000..9a99089
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension/foo.dart
@@ -0,0 +1,11 @@
+extension Foo on String {
+  int get giveInt => 42;
+}
+
+// The below doesn't have to be included.
+
+extension BarExtension on Bar {
+  int get giveInt => 42;
+}
+
+class Bar {}
diff --git a/pkg/front_end/outline_extraction_testcases/use_of_imported_extension/main.dart b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension/main.dart
new file mode 100644
index 0000000..1b39ff1
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension/main.dart
@@ -0,0 +1,5 @@
+import "foo.dart";
+
+int get giveInt => 43;
+
+var x = "hello".giveInt;
diff --git a/pkg/front_end/outline_extraction_testcases/use_of_imported_extension/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension/main.dart.outline_extracted
new file mode 100644
index 0000000..cb49619
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension/main.dart.outline_extracted
@@ -0,0 +1,16 @@
+org-dartlang-testcase:///main.dart:
+import "foo.dart";
+int get giveInt => 43;
+var x = "hello".giveInt;
+
+
+
+
+org-dartlang-testcase:///foo.dart:
+extension Foo on String {
+  int get giveInt => 42;
+}
+extension BarExtension on Bar {
+  int get giveInt => 42;
+}
+class Bar {}
diff --git a/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/foo.dart b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/foo.dart
new file mode 100644
index 0000000..bd036e7
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/foo.dart
@@ -0,0 +1,17 @@
+enum Foo {
+  a,
+  b,
+  c,
+  d,
+  e,
+}
+
+extension FooExtension on Foo {
+  int get giveInt => 42;
+}
+
+extension BarExtension on Bar {
+  int get giveInt => 42;
+}
+
+class Bar {}
diff --git a/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/main.dart b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/main.dart
new file mode 100644
index 0000000..5deb533
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/main.dart
@@ -0,0 +1,5 @@
+import "foo.dart";
+
+final foo = [Foo.d, Foo.b];
+
+final foo2 = foo.map((f) => f.giveInt).toList();
diff --git a/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/main.dart.outline_extracted
new file mode 100644
index 0000000..1b7506a
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/main.dart.outline_extracted
@@ -0,0 +1,17 @@
+org-dartlang-testcase:///main.dart:
+import "foo.dart";
+final foo = [Foo.d, Foo.b];
+final foo2 = foo.map((f) => f.giveInt).toList();
+
+
+
+
+org-dartlang-testcase:///foo.dart:
+enum Foo { a, b, c, d, e, }
+extension FooExtension on Foo {
+  int get giveInt => 42;
+}
+extension BarExtension on Bar {
+  int get giveInt => 42;
+}
+class Bar {}
diff --git a/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart
new file mode 100644
index 0000000..145b799
--- /dev/null
+++ b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart
@@ -0,0 +1,8 @@
+enum E<X, Y> {
+  one<int, String>(),
+  two<double, num>(),
+  three<int, int>.named(42);
+
+  const E();
+  const E.named(int value);
+}
diff --git a/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.expect b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.expect
new file mode 100644
index 0000000..69b148f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.expect
@@ -0,0 +1,122 @@
+beginCompilationUnit(enum)
+  beginMetadataStar(enum)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(enum)
+    handleIdentifier(E, enumDeclaration)
+    beginEnum(enum)
+      beginTypeVariables(<)
+        beginMetadataStar(X)
+        endMetadataStar(0)
+        handleIdentifier(X, typeVariableDeclaration)
+        beginTypeVariable(X)
+          beginMetadataStar(Y)
+          endMetadataStar(0)
+          handleIdentifier(Y, typeVariableDeclaration)
+          beginTypeVariable(Y)
+            handleTypeVariablesDefined(Y, 2)
+            handleNoType(Y)
+          endTypeVariable(>, 1, null, null)
+          handleNoType(X)
+        endTypeVariable(,, 0, null, null)
+      endTypeVariables(<, >)
+      handleEnumNoWithClause()
+      handleImplements(null, 0)
+      handleEnumHeader(enum, {)
+      beginMetadataStar(one)
+      endMetadataStar(0)
+      handleIdentifier(one, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(one)
+        beginTypeArguments(<)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(,)
+          handleType(int, null)
+          handleIdentifier(String, typeReference)
+          handleNoTypeArguments(>)
+          handleType(String, null)
+        endTypeArguments(2, <, >)
+        handleNoConstructorReferenceContinuationAfterTypeArguments(()
+      endConstructorReference(one, null, (, ConstructorReferenceContext.Const)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement({)
+      beginMetadataStar(two)
+      endMetadataStar(0)
+      handleIdentifier(two, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(two)
+        beginTypeArguments(<)
+          handleIdentifier(double, typeReference)
+          handleNoTypeArguments(,)
+          handleType(double, null)
+          handleIdentifier(num, typeReference)
+          handleNoTypeArguments(>)
+          handleType(num, null)
+        endTypeArguments(2, <, >)
+        handleNoConstructorReferenceContinuationAfterTypeArguments(()
+      endConstructorReference(two, null, (, ConstructorReferenceContext.Const)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement(,)
+      beginMetadataStar(three)
+      endMetadataStar(0)
+      handleIdentifier(three, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(three)
+        beginTypeArguments(<)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(,)
+          handleType(int, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(>)
+          handleType(int, null)
+        endTypeArguments(2, <, >)
+        handleIdentifier(named, constructorReferenceContinuationAfterTypeArguments)
+      endConstructorReference(three, ., (, ConstructorReferenceContext.Const)
+      beginArguments(()
+        handleLiteralInt(42)
+      endArguments(1, (, ))
+      handleEnumElement(,)
+      handleEnumElements(;, 3)
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleIdentifier(named, methodDeclarationContinuation)
+          handleQualified(.)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+            beginMetadataStar(int)
+            endMetadataStar(0)
+            beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
+              handleIdentifier(int, typeReference)
+              handleNoTypeArguments(value)
+              handleType(int, null)
+              handleIdentifier(value, formalParameterDeclaration)
+              handleFormalParameterWithoutValue())
+            endFormalParameter(null, null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+          endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+    endEnum(enum, {, 2)
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.intertwined.expect b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.intertwined.expect
new file mode 100644
index 0000000..04b3942
--- /dev/null
+++ b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.intertwined.expect
@@ -0,0 +1,199 @@
+parseUnit(enum)
+  skipErrorTokens(enum)
+  listener: beginCompilationUnit(enum)
+  syntheticPreviousToken(enum)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(enum)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, enum, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(, enum)
+      parseEnum(enum)
+        listener: beginUncategorizedTopLevelDeclaration(enum)
+        ensureIdentifier(enum, enumDeclaration)
+          listener: handleIdentifier(E, enumDeclaration)
+        listener: beginEnum(enum)
+        parseEnumHeaderOpt(E, enum)
+          listener: beginTypeVariables(<)
+          parseMetadataStar(<)
+            listener: beginMetadataStar(X)
+            listener: endMetadataStar(0)
+          ensureIdentifier(<, typeVariableDeclaration)
+            listener: handleIdentifier(X, typeVariableDeclaration)
+          listener: beginTypeVariable(X)
+          parseMetadataStar(,)
+            listener: beginMetadataStar(Y)
+            listener: endMetadataStar(0)
+          ensureIdentifier(,, typeVariableDeclaration)
+            listener: handleIdentifier(Y, typeVariableDeclaration)
+          listener: beginTypeVariable(Y)
+          listener: handleTypeVariablesDefined(Y, 2)
+          listener: handleNoType(Y)
+          listener: endTypeVariable(>, 1, null, null)
+          listener: handleNoType(X)
+          listener: endTypeVariable(,, 0, null, null)
+          listener: endTypeVariables(<, >)
+          parseEnumWithClauseOpt(>)
+            listener: handleEnumNoWithClause()
+          parseClassOrMixinOrEnumImplementsOpt(>)
+            listener: handleImplements(null, 0)
+        listener: handleEnumHeader(enum, {)
+        parseEnumElement({)
+          parseMetadataStar({)
+            listener: beginMetadataStar(one)
+            listener: endMetadataStar(0)
+          ensureIdentifier({, enumValueDeclaration)
+            listener: handleIdentifier(one, enumValueDeclaration)
+          parseConstructorReference(one, ConstructorReferenceContext.Const, null, true)
+            listener: handleNoTypeNameInConstructorReference(<)
+            listener: beginConstructorReference(one)
+            listener: beginTypeArguments(<)
+            listener: handleIdentifier(int, typeReference)
+            listener: handleNoTypeArguments(,)
+            listener: handleType(int, null)
+            listener: handleIdentifier(String, typeReference)
+            listener: handleNoTypeArguments(>)
+            listener: handleType(String, null)
+            listener: endTypeArguments(2, <, >)
+            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(()
+            listener: endConstructorReference(one, null, (, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(>)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement({)
+        parseEnumElement(,)
+          parseMetadataStar(,)
+            listener: beginMetadataStar(two)
+            listener: endMetadataStar(0)
+          ensureIdentifier(,, enumValueDeclaration)
+            listener: handleIdentifier(two, enumValueDeclaration)
+          parseConstructorReference(two, ConstructorReferenceContext.Const, null, true)
+            listener: handleNoTypeNameInConstructorReference(<)
+            listener: beginConstructorReference(two)
+            listener: beginTypeArguments(<)
+            listener: handleIdentifier(double, typeReference)
+            listener: handleNoTypeArguments(,)
+            listener: handleType(double, null)
+            listener: handleIdentifier(num, typeReference)
+            listener: handleNoTypeArguments(>)
+            listener: handleType(num, null)
+            listener: endTypeArguments(2, <, >)
+            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(()
+            listener: endConstructorReference(two, null, (, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(>)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement(,)
+        parseEnumElement(,)
+          parseMetadataStar(,)
+            listener: beginMetadataStar(three)
+            listener: endMetadataStar(0)
+          ensureIdentifier(,, enumValueDeclaration)
+            listener: handleIdentifier(three, enumValueDeclaration)
+          parseConstructorReference(three, ConstructorReferenceContext.Const, null, true)
+            listener: handleNoTypeNameInConstructorReference(<)
+            listener: beginConstructorReference(three)
+            listener: beginTypeArguments(<)
+            listener: handleIdentifier(int, typeReference)
+            listener: handleNoTypeArguments(,)
+            listener: handleType(int, null)
+            listener: handleIdentifier(int, typeReference)
+            listener: handleNoTypeArguments(>)
+            listener: handleType(int, null)
+            listener: endTypeArguments(2, <, >)
+            ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
+              listener: handleIdentifier(named, constructorReferenceContinuationAfterTypeArguments)
+            listener: endConstructorReference(three, ., (, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(named)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              parseExpression(()
+                parsePrecedenceExpression((, 1, true)
+                  parseUnaryExpression((, true)
+                    parsePrimary((, expression)
+                      parseLiteralInt(()
+                        listener: handleLiteralInt(42)
+              listener: endArguments(1, (, ))
+          listener: handleEnumElement(,)
+        listener: handleEnumElements(;, 3)
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+            parseMethodTypeVar(E)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(E, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(E, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+              parseQualifiedRest(E, methodDeclarationContinuation)
+                ensureIdentifier(., methodDeclarationContinuation)
+                  listener: handleIdentifier(named, methodDeclarationContinuation)
+                listener: handleQualified(.)
+            parseMethodTypeVar(named)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(named, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(named, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                    parseMetadataStar(()
+                      listener: beginMetadataStar(int)
+                      listener: endMetadataStar(0)
+                    listener: beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
+                    listener: handleIdentifier(int, typeReference)
+                    listener: handleNoTypeArguments(value)
+                    listener: handleType(int, null)
+                    ensureIdentifier(int, formalParameterDeclaration)
+                      listener: handleIdentifier(value, formalParameterDeclaration)
+                    listener: handleFormalParameterWithoutValue())
+                    listener: endFormalParameter(null, null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, })
+        listener: endEnum(enum, {, 2)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(enum)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.parser.expect b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.parser.expect
new file mode 100644
index 0000000..9f86055
--- /dev/null
+++ b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.parser.expect
@@ -0,0 +1,19 @@
+enum E<X, Y> {
+one<int, String>(),
+two<double, num>(),
+three<int, int>.named(42);
+
+const E();
+const E.named(int value);
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]X[StringToken],[SimpleToken] Y[StringToken]>[SimpleToken] {[BeginToken]
+one[StringToken]<[BeginToken]int[StringToken],[SimpleToken] String[StringToken]>[SimpleToken]([BeginToken])[SimpleToken],[SimpleToken]
+two[StringToken]<[BeginToken]double[StringToken],[SimpleToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken],[SimpleToken]
+three[StringToken]<[BeginToken]int[StringToken],[SimpleToken] int[StringToken]>[SimpleToken].[SimpleToken]named[StringToken]([BeginToken]42[StringToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]named[StringToken]([BeginToken]int[StringToken] value[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.scanner.expect b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.scanner.expect
new file mode 100644
index 0000000..9f86055
--- /dev/null
+++ b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.scanner.expect
@@ -0,0 +1,19 @@
+enum E<X, Y> {
+one<int, String>(),
+two<double, num>(),
+three<int, int>.named(42);
+
+const E();
+const E.named(int value);
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]X[StringToken],[SimpleToken] Y[StringToken]>[SimpleToken] {[BeginToken]
+one[StringToken]<[BeginToken]int[StringToken],[SimpleToken] String[StringToken]>[SimpleToken]([BeginToken])[SimpleToken],[SimpleToken]
+two[StringToken]<[BeginToken]double[StringToken],[SimpleToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken],[SimpleToken]
+three[StringToken]<[BeginToken]int[StringToken],[SimpleToken] int[StringToken]>[SimpleToken].[SimpleToken]named[StringToken]([BeginToken]42[StringToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]named[StringToken]([BeginToken]int[StringToken] value[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.expect b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.expect
index fbbb63a..9fc344c 100644
--- a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.expect
@@ -18,7 +18,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(C)
@@ -36,7 +36,7 @@
                   handleNoType({)
                   handleIdentifier(c, formalParameterDeclaration)
                   handleFormalParameterWithoutValue(})
-                endFormalParameter(null, null, c, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
+                endFormalParameter(null, null, null, c, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
               endOptionalFormalParameters(1, {, })
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
@@ -118,7 +118,7 @@
       handleNoType(D)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(D)
@@ -136,7 +136,7 @@
                   handleNoType({)
                   handleIdentifier(d, formalParameterDeclaration)
                   handleFormalParameterWithoutValue(})
-                endFormalParameter(null, null, d, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
+                endFormalParameter(null, null, null, d, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
               endOptionalFormalParameters(1, {, })
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.intertwined.expect
index 594b6db..07f6de4 100644
--- a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -56,7 +56,7 @@
                           ensureIdentifier({, formalParameterDeclaration)
                             listener: handleIdentifier(c, formalParameterDeclaration)
                           listener: handleFormalParameterWithoutValue(})
-                          listener: endFormalParameter(null, null, c, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
+                          listener: endFormalParameter(null, null, null, c, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
                         listener: endOptionalFormalParameters(1, {, })
                       ensureCloseParen(}, ()
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
@@ -71,7 +71,7 @@
                 listener: endClassConstructor(null, C, (, null, ;)
               listener: endMember()
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -271,15 +271,15 @@
             parseClassExtendsOpt(D)
               listener: handleNoType(D)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(D)
+            parseClassWithClauseOpt(D)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(D)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(D)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(D, DeclarationKind.Class, D)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, D)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, D)
               parseMetadataStar({)
                 listener: beginMetadataStar(D)
                 listener: endMetadataStar(0)
@@ -308,7 +308,7 @@
                           ensureIdentifier({, formalParameterDeclaration)
                             listener: handleIdentifier(d, formalParameterDeclaration)
                           listener: handleFormalParameterWithoutValue(})
-                          listener: endFormalParameter(null, null, d, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
+                          listener: endFormalParameter(null, null, null, d, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
                         listener: endOptionalFormalParameters(1, {, })
                       ensureCloseParen(}, ()
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
@@ -323,7 +323,7 @@
                 listener: endClassConstructor(null, D, (, null, ;)
               listener: endMember()
             notEofOrValue(}, D)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(D)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_06.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_06.dart.intertwined.expect
index e2d55ca..e861c72 100644
--- a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_06.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_06.dart.intertwined.expect
@@ -40,7 +40,7 @@
                             parseNewExpression({)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(C, constructorReference)
                                 listener: beginConstructorReference(C)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.expect
index 5ee9cdb..acb0f6c 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.expect
@@ -130,7 +130,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(foo)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.intertwined.expect
index 7e46b8b..88944b7f 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -65,7 +65,7 @@
                 listener: endClassConstructor(null, foo, (, null, })
               listener: endMember()
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -128,7 +128,7 @@
                 listener: endClassConstructor(null, foo, (, :, })
               listener: endMember()
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -187,7 +187,7 @@
                 listener: endClassConstructor(null, foo, (, :, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -224,7 +224,7 @@
                 listener: endClassMethod(get, get, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -268,7 +268,7 @@
                 listener: endClassMethod(get, get, {, null, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -315,7 +315,7 @@
                 listener: endClassConstructor(get, get, (, null, ;)
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -369,7 +369,7 @@
                 listener: endClassConstructor(get, get, (, null, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -437,7 +437,7 @@
                 listener: endClassConstructor(get, get, (, :, ;)
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -516,7 +516,7 @@
                 listener: endClassConstructor(get, get, (, :, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -559,7 +559,7 @@
                 listener: endClassMethod(set, set, (, null, ;)
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -609,7 +609,7 @@
                 listener: endClassMethod(set, set, (, null, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -656,7 +656,7 @@
                 listener: endClassConstructor(set, set, (, null, ;)
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -710,7 +710,7 @@
                 listener: endClassConstructor(set, set, (, null, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -778,7 +778,7 @@
                 listener: endClassConstructor(set, set, (, :, ;)
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -857,7 +857,7 @@
                 listener: endClassConstructor(set, set, (, :, })
               listener: endMember()
             notEofOrValue(}, external)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
@@ -914,7 +914,7 @@
                 listener: endClassConstructor(null, external, (, :, ;)
               listener: endMember()
             notEofOrValue(}, external)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
@@ -993,7 +993,7 @@
                 listener: endClassConstructor(null, external, (, :, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1012,7 +1012,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.expect
index 06805796..4b23187 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.expect
@@ -38,7 +38,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(get)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.intertwined.expect
index c1bf8ebf..75979e4 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -66,7 +66,7 @@
                 listener: endClassConstructor(get, get, (, null, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -130,7 +130,7 @@
                 listener: endClassConstructor(get, get, (, :, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.expect
index 7629bd3..77c9204 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.expect
@@ -34,7 +34,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(void)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.intertwined.expect
index 1502968..7ab4015 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -66,7 +66,7 @@
                 listener: endClassConstructor(null, void, (, null, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -130,7 +130,7 @@
                 listener: endClassConstructor(null, void, (, :, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.expect
index 26bb64b..f2201dc 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.expect
@@ -34,7 +34,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(set)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.intertwined.expect
index ca57772..55c390c 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -66,7 +66,7 @@
                 listener: endClassConstructor(set, set, (, null, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -130,7 +130,7 @@
                 listener: endClassConstructor(set, set, (, :, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.expect
index daaa1b0..4f6c582 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.expect
@@ -34,7 +34,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(get)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.intertwined.expect
index 75d8a2f0..21be0f7 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -62,7 +62,7 @@
                 listener: endClassMethod(get, get, (, null, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -122,7 +122,7 @@
                 listener: endClassConstructor(get, get, (, :, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -159,7 +159,7 @@
                 listener: endClassConstructor(get, get, (, null, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.expect
index 750f16f..2ed0508 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Foo)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.intertwined.expect
index 9286fc8..5109bb5 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -59,7 +59,7 @@
                 listener: endClassConstructor(null, Foo, (, null, })
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -116,7 +116,7 @@
                 listener: endClassConstructor(null, Foo, (, :, })
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -152,7 +152,7 @@
                 listener: endClassConstructor(null, Foo, (, null, })
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.expect
index 5e8a7be..6b37228 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.expect
@@ -82,7 +82,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Foo)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.intertwined.expect
index 968b712..e584d14 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -63,7 +63,7 @@
                 listener: endClassConstructor(null, Foo, (, null, })
               listener: endMember()
             notEofOrValue(}, /)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(/)
                 listener: endMetadataStar(0)
@@ -122,7 +122,7 @@
                     listener: endClassConstructor(null, operator, (, :, })
                   listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -158,7 +158,7 @@
                 listener: endClassConstructor(null, Foo, (, null, })
               listener: endMember()
             notEofOrValue(}, .)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(.)
                 listener: endMetadataStar(0)
@@ -169,7 +169,7 @@
                 listener: handleInvalidMember(.)
                 listener: endMember()
             notEofOrValue(}, /)
-            parseClassOrMixinOrExtensionMemberImpl(., DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(., DeclarationKind.Class, Foo)
               parseMetadataStar(.)
                 listener: beginMetadataStar(/)
                 listener: endMetadataStar(0)
@@ -228,7 +228,7 @@
                     listener: endClassConstructor(null, operator, (, :, })
                   listener: endMember()
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -264,7 +264,7 @@
                 listener: endClassMethod(null, foo, (, null, })
               listener: endMember()
             notEofOrValue(}, /)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(/)
                 listener: endMetadataStar(0)
@@ -323,7 +323,7 @@
                     listener: endClassConstructor(null, operator, (, :, })
                   listener: endMember()
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -359,7 +359,7 @@
                 listener: endClassMethod(null, foo, (, null, })
               listener: endMember()
             notEofOrValue(}, .)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(.)
                 listener: endMetadataStar(0)
@@ -370,7 +370,7 @@
                 listener: handleInvalidMember(.)
                 listener: endMember()
             notEofOrValue(}, /)
-            parseClassOrMixinOrExtensionMemberImpl(., DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(., DeclarationKind.Class, Foo)
               parseMetadataStar(.)
                 listener: beginMetadataStar(/)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.expect
index 9e97581..3c0bbca 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.expect
@@ -26,7 +26,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(void)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.intertwined.expect
index 37469fb..057bb78 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -60,7 +60,7 @@
                 listener: endClassConstructor(null, void, (, null, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -118,7 +118,7 @@
                 listener: endClassConstructor(null, void, (, :, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -155,7 +155,7 @@
                 listener: endClassConstructor(null, void, (, null, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.expect
index 927d34c..1620ea3 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.expect
@@ -26,7 +26,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(set)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.intertwined.expect
index 716dcfc..5abf42d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -60,7 +60,7 @@
                 listener: endClassMethod(set, set, (, null, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -118,7 +118,7 @@
                 listener: endClassConstructor(set, set, (, :, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -155,7 +155,7 @@
                 listener: endClassConstructor(set, set, (, null, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.expect b/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.expect
index faffbc1..2741a0e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.expect
@@ -51,7 +51,7 @@
                 handleType(int, null)
                 handleIdentifier(b, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+              endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.ExtensionNonStaticMethod, null, null, null)
@@ -60,7 +60,7 @@
                 handleType(int, null)
                 handleIdentifier(c, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+              endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.ExtensionNonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -100,7 +100,7 @@
                 handleType(int, null)
                 handleIdentifier(d, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, d, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+              endFormalParameter(null, null, null, d, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -131,7 +131,7 @@
           handleType(List, null)
           handleIdentifier(l, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, l, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, l, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -169,7 +169,7 @@
           handleType(List, null)
           handleIdentifier(l, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, l, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, l, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect
index c4a5cfd..0d4f0e2 100644
--- a/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect
@@ -35,7 +35,7 @@
         parseClassOrMixinOrExtensionBody(>, DeclarationKind.Extension, E)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, bool)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, E)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, E)
             parseMetadataStar({)
               listener: beginMetadataStar(bool)
               listener: endMetadataStar(0)
@@ -65,7 +65,7 @@
                       ensureIdentifier(int, formalParameterDeclaration)
                         listener: handleIdentifier(b, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue(,)
-                      listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+                      listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
                     parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
                       parseMetadataStar(,)
                         listener: beginMetadataStar(int)
@@ -77,7 +77,7 @@
                       ensureIdentifier(int, formalParameterDeclaration)
                         listener: handleIdentifier(c, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue())
-                      listener: endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+                      listener: endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
                     listener: endFormalParameters(2, (, ), MemberKind.ExtensionNonStaticMethod)
               parseInitializersOpt())
                 listener: handleNoInitializers()
@@ -92,7 +92,7 @@
               listener: endExtensionMethod(null, bool, (, null, })
             listener: endMember()
           notEofOrValue(}, int)
-          parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Extension, E)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Extension, E)
             parseMetadataStar(})
               listener: beginMetadataStar(int)
               listener: endMetadataStar(0)
@@ -129,7 +129,7 @@
               listener: endExtensionMethod(get, int, =>, null, ;)
             listener: endMember()
           notEofOrValue(}, set)
-          parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Extension, E)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Extension, E)
             parseMetadataStar(;)
               listener: beginMetadataStar(set)
               listener: endMetadataStar(0)
@@ -156,7 +156,7 @@
                       ensureIdentifier(int, formalParameterDeclaration)
                         listener: handleIdentifier(d, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue())
-                      listener: endFormalParameter(null, null, d, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+                      listener: endFormalParameter(null, null, null, d, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
                     listener: endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
               parseInitializersOpt())
                 listener: handleNoInitializers()
@@ -207,7 +207,7 @@
                 ensureIdentifier(>, formalParameterDeclaration)
                   listener: handleIdentifier(l, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, l, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, l, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -285,7 +285,7 @@
                 ensureIdentifier(>, formalParameterDeclaration)
                   listener: handleIdentifier(l, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, l, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, l, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.expect
index daa2562..0a96f68 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.expect
@@ -30,7 +30,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(C)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.intertwined.expect
index 7fce480..0fd3f33 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.expect
index 40cd176..448b3e0 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.expect
@@ -30,7 +30,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -45,7 +45,7 @@
       handleNoType(B)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -66,7 +66,7 @@
       handleType(B, null)
       handleClassExtends(extends, 2)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Foo)
@@ -96,7 +96,7 @@
       handleNoType(Bar)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       handleRecoverableError(Message[ExpectedInstead, Expected 'extends' instead of this., null, {string: extends}], extend, extend)
       handleIdentifier(A, typeReference)
@@ -108,7 +108,7 @@
       handleType(B, null)
       handleClassExtends(extend, 2)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleRecoverClassHeader()
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Bar)
@@ -138,7 +138,7 @@
       handleNoType(Baz)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       handleRecoverableError(Message[ExpectedInstead, Expected 'extends' instead of this., null, {string: extends}], on, on)
       handleIdentifier(A, typeReference)
@@ -150,7 +150,7 @@
       handleType(B, null)
       handleClassExtends(on, 2)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleRecoverClassHeader()
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Baz)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.intertwined.expect
index e4749d3..612efb5 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.intertwined.expect
@@ -19,10 +19,10 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -47,10 +47,10 @@
             parseClassExtendsOpt(B)
               listener: handleNoType(B)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, B)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -83,15 +83,15 @@
                 listener: handleNoTypeArguments({)
                 listener: handleType(B, null)
                 listener: handleClassExtends(extends, 2)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -143,16 +143,16 @@
             parseClassExtendsOpt(Bar)
               listener: handleNoType(Bar)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Bar)
+            parseClassWithClauseOpt(Bar)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Bar)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Bar)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassHeaderRecovery(Bar, class, class)
             parseClassHeaderOpt(Bar, class, class)
               parseClassExtendsOpt(Bar)
-              parseWithClauseOpt(Bar)
-              parseClassOrMixinImplementsOpt(Bar)
+              parseClassWithClauseOpt(Bar)
+              parseClassOrMixinOrEnumImplementsOpt(Bar)
             skipUnexpectedTokenOpt(Bar, [extends, with, implements, {])
             reportRecoverableError(extend, Message[ExpectedInstead, Expected 'extends' instead of this., null, {string: extends}])
               listener: handleRecoverableError(Message[ExpectedInstead, Expected 'extends' instead of this., null, {string: extends}], extend, extend)
@@ -166,16 +166,16 @@
               listener: handleNoTypeArguments({)
               listener: handleType(B, null)
               listener: handleClassExtends(extend, 2)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleRecoverClassHeader()
           ensureBlock(B, null, class declaration)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, Bar)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Bar)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Bar)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Bar)
               parseMetadataStar({)
                 listener: beginMetadataStar(Bar)
                 listener: endMetadataStar(0)
@@ -227,16 +227,16 @@
             parseClassExtendsOpt(Baz)
               listener: handleNoType(Baz)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Baz)
+            parseClassWithClauseOpt(Baz)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Baz)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Baz)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassHeaderRecovery(Baz, class, class)
             parseClassHeaderOpt(Baz, class, class)
               parseClassExtendsOpt(Baz)
-              parseWithClauseOpt(Baz)
-              parseClassOrMixinImplementsOpt(Baz)
+              parseClassWithClauseOpt(Baz)
+              parseClassOrMixinOrEnumImplementsOpt(Baz)
             skipUnexpectedTokenOpt(Baz, [extends, with, implements, {])
             reportRecoverableError(on, Message[ExpectedInstead, Expected 'extends' instead of this., null, {string: extends}])
               listener: handleRecoverableError(Message[ExpectedInstead, Expected 'extends' instead of this., null, {string: extends}], on, on)
@@ -250,16 +250,16 @@
               listener: handleNoTypeArguments({)
               listener: handleType(B, null)
               listener: handleClassExtends(on, 2)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleRecoverClassHeader()
           ensureBlock(B, null, class declaration)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, Baz)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Baz)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Baz)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Baz)
               parseMetadataStar({)
                 listener: beginMetadataStar(Baz)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.expect
index 43b85dd..c95dc3b 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.expect
@@ -29,7 +29,7 @@
       handleNoType(Annotation)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
@@ -57,7 +57,7 @@
                 handleNoType(()
                 handleIdentifier(message, fieldInitializer)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(this, ., message, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(this, null, ., message, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -84,7 +84,7 @@
       handleNoType(>)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -99,7 +99,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(m)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.intertwined.expect
index 392f65b..4720e85 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.intertwined.expect
@@ -41,15 +41,15 @@
             parseClassExtendsOpt(Annotation)
               listener: handleNoType(Annotation)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Annotation)
+            parseClassWithClauseOpt(Annotation)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Annotation)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Annotation)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Annotation, DeclarationKind.Class, Annotation)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Annotation)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Annotation)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -66,7 +66,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, const)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Annotation)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Annotation)
               parseMetadataStar(;)
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
@@ -92,7 +92,7 @@
                         ensureIdentifier(., fieldInitializer)
                           listener: handleIdentifier(message, fieldInitializer)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(this, ., message, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(this, null, ., message, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -133,10 +133,10 @@
             parseClassExtendsOpt(>)
               listener: handleNoType(>)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(>)
+            parseClassWithClauseOpt(>)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(>)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(>)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -161,15 +161,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, m)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(m)
                 listener: endMetadataStar(0)
@@ -203,7 +203,7 @@
                             parseNewExpression(=>)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(A, constructorReference)
                                 listener: beginConstructorReference(A)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.expect
index 810e998..942e5ce 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.expect
@@ -53,7 +53,7 @@
             handleType(int, null)
             handleIdentifier(x, formalParameterDeclaration)
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -76,7 +76,7 @@
             handleType(int, null)
             handleIdentifier(x, formalParameterDeclaration)
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -102,7 +102,7 @@
             handleType(int, null)
             handleIdentifier(x, formalParameterDeclaration)
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -126,7 +126,7 @@
             handleType(int, null)
             handleIdentifier(x, formalParameterDeclaration)
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -156,7 +156,7 @@
             handleType(int, null)
             handleIdentifier(x, formalParameterDeclaration)
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -188,7 +188,7 @@
             handleType(int, null)
             handleIdentifier(x, formalParameterDeclaration)
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -230,7 +230,7 @@
             handleType(int, null)
             handleIdentifier(x, formalParameterDeclaration)
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -286,7 +286,7 @@
             handleType(int, null)
             handleIdentifier(x, formalParameterDeclaration)
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.intertwined.expect
index 317743c..0453611 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.intertwined.expect
@@ -34,7 +34,7 @@
               ensureIdentifier(int, formalParameterDeclaration)
                 listener: handleIdentifier(x, formalParameterDeclaration)
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -69,7 +69,7 @@
               ensureIdentifier(int, formalParameterDeclaration)
                 listener: handleIdentifier(x, formalParameterDeclaration)
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -110,7 +110,7 @@
               ensureIdentifier(int, formalParameterDeclaration)
                 listener: handleIdentifier(x, formalParameterDeclaration)
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -148,7 +148,7 @@
               ensureIdentifier(int, formalParameterDeclaration)
                 listener: handleIdentifier(x, formalParameterDeclaration)
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -193,7 +193,7 @@
               ensureIdentifier(int, formalParameterDeclaration)
                 listener: handleIdentifier(x, formalParameterDeclaration)
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -239,7 +239,7 @@
               ensureIdentifier(int, formalParameterDeclaration)
                 listener: handleIdentifier(x, formalParameterDeclaration)
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -296,7 +296,7 @@
               ensureIdentifier(int, formalParameterDeclaration)
                 listener: handleIdentifier(x, formalParameterDeclaration)
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -376,7 +376,7 @@
               ensureIdentifier(int, formalParameterDeclaration)
                 listener: handleIdentifier(x, formalParameterDeclaration)
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.expect
index 464bf21..db84d46 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.expect
@@ -70,7 +70,7 @@
       handleNoType(Key)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(abstract, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -387,7 +387,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -396,7 +396,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -432,7 +432,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -441,7 +441,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -476,7 +476,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -485,7 +485,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -524,7 +524,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -533,7 +533,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -571,7 +571,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -580,7 +580,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -635,7 +635,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -644,7 +644,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -698,7 +698,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -707,7 +707,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -749,7 +749,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -758,7 +758,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -799,7 +799,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -808,7 +808,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -853,7 +853,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -862,7 +862,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -904,7 +904,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -913,7 +913,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -991,7 +991,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -1000,7 +1000,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(foo)
@@ -1082,7 +1082,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -1091,7 +1091,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(foo)
@@ -1170,7 +1170,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -1179,7 +1179,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.intertwined.expect
index 95350ea..e575bbf 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.intertwined.expect
@@ -20,15 +20,15 @@
             parseClassExtendsOpt(Key)
               listener: handleNoType(Key)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Key)
+            parseClassWithClauseOpt(Key)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Key)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Key)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(abstract, class, null)
           parseClassOrMixinOrExtensionBody(Key, DeclarationKind.Class, Key)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Key)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -115,7 +115,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -188,7 +188,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -282,7 +282,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -362,7 +362,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -468,7 +468,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -555,7 +555,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -668,7 +668,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -762,7 +762,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -792,7 +792,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -804,7 +804,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -859,7 +859,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -889,7 +889,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -901,7 +901,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -944,7 +944,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -974,7 +974,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -986,7 +986,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1048,7 +1048,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1078,7 +1078,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1090,7 +1090,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1140,7 +1140,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1170,7 +1170,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1182,7 +1182,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1279,7 +1279,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1309,7 +1309,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1321,7 +1321,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1406,7 +1406,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1436,7 +1436,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1448,7 +1448,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1522,7 +1522,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1552,7 +1552,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1564,7 +1564,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1621,7 +1621,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1651,7 +1651,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1663,7 +1663,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1744,7 +1744,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1774,7 +1774,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1786,7 +1786,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1850,7 +1850,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, s)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(s)
                 listener: endMetadataStar(0)
@@ -1879,7 +1879,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1891,7 +1891,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2088,7 +2088,7 @@
                 listener: endClassMethod(null, s, (, null, })
               listener: endMember()
             notEofOrValue(}, Key)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(Key)
                 listener: endMetadataStar(0)
@@ -2117,7 +2117,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -2129,7 +2129,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -2333,7 +2333,7 @@
                 listener: endClassConstructor(null, Key, (, :, })
               listener: endMember()
             notEofOrValue(}, Key)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(Key)
                 listener: endMetadataStar(0)
@@ -2362,7 +2362,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -2374,7 +2374,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -2542,7 +2542,7 @@
                 listener: endClassConstructor(null, Key, (, :, })
               listener: endMember()
             notEofOrValue(}, not_currently_working)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(not_currently_working)
                 listener: endMetadataStar(0)
@@ -2571,7 +2571,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -2583,7 +2583,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.expect
index 0859270..b5464e1 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.expect
@@ -70,7 +70,7 @@
       handleNoType(Key)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(abstract, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -387,7 +387,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -396,7 +396,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -432,7 +432,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -441,7 +441,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -476,7 +476,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -485,7 +485,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -524,7 +524,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -533,7 +533,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -571,7 +571,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -580,7 +580,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -635,7 +635,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -644,7 +644,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -698,7 +698,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -707,7 +707,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -749,7 +749,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -758,7 +758,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -799,7 +799,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -808,7 +808,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -853,7 +853,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -862,7 +862,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -904,7 +904,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -913,7 +913,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -991,7 +991,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -1000,7 +1000,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(foo)
@@ -1082,7 +1082,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -1091,7 +1091,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(foo)
@@ -1170,7 +1170,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -1179,7 +1179,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.intertwined.expect
index 3f6b15d..d50b821 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.intertwined.expect
@@ -20,15 +20,15 @@
             parseClassExtendsOpt(Key)
               listener: handleNoType(Key)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Key)
+            parseClassWithClauseOpt(Key)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Key)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Key)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(abstract, class, null)
           parseClassOrMixinOrExtensionBody(Key, DeclarationKind.Class, Key)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Key)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -115,7 +115,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -188,7 +188,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -282,7 +282,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -362,7 +362,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -469,7 +469,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -556,7 +556,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -670,7 +670,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -764,7 +764,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -794,7 +794,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -806,7 +806,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -861,7 +861,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -891,7 +891,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -903,7 +903,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -946,7 +946,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -976,7 +976,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -988,7 +988,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1050,7 +1050,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1080,7 +1080,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1092,7 +1092,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1142,7 +1142,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1172,7 +1172,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1184,7 +1184,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1281,7 +1281,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1311,7 +1311,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1323,7 +1323,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1408,7 +1408,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1438,7 +1438,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1450,7 +1450,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1525,7 +1525,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1555,7 +1555,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1567,7 +1567,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1624,7 +1624,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1654,7 +1654,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1666,7 +1666,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1748,7 +1748,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1778,7 +1778,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1790,7 +1790,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1854,7 +1854,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, s)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(s)
                 listener: endMetadataStar(0)
@@ -1883,7 +1883,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1895,7 +1895,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2092,7 +2092,7 @@
                 listener: endClassMethod(null, s, (, null, })
               listener: endMember()
             notEofOrValue(}, Key)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(Key)
                 listener: endMetadataStar(0)
@@ -2121,7 +2121,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -2133,7 +2133,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -2337,7 +2337,7 @@
                 listener: endClassConstructor(null, Key, (, :, })
               listener: endMember()
             notEofOrValue(}, Key)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(Key)
                 listener: endMetadataStar(0)
@@ -2366,7 +2366,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -2378,7 +2378,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -2546,7 +2546,7 @@
                 listener: endClassConstructor(null, Key, (, :, })
               listener: endMember()
             notEofOrValue(}, not_currently_working)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(not_currently_working)
                 listener: endMetadataStar(0)
@@ -2575,7 +2575,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -2587,7 +2587,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.expect
index fae98c4..4f4d844 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.expect
@@ -70,7 +70,7 @@
       handleNoType(Key)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(abstract, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -387,7 +387,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -396,7 +396,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -432,7 +432,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -441,7 +441,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -476,7 +476,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -485,7 +485,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -524,7 +524,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -533,7 +533,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -571,7 +571,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -580,7 +580,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -635,7 +635,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -644,7 +644,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -698,7 +698,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -707,7 +707,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -749,7 +749,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -758,7 +758,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -799,7 +799,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -808,7 +808,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -853,7 +853,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -862,7 +862,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -904,7 +904,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -913,7 +913,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -991,7 +991,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -1000,7 +1000,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(foo)
@@ -1082,7 +1082,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -1091,7 +1091,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(foo)
@@ -1170,7 +1170,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -1179,7 +1179,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.intertwined.expect
index 5923c78..8d04871 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.intertwined.expect
@@ -20,15 +20,15 @@
             parseClassExtendsOpt(Key)
               listener: handleNoType(Key)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Key)
+            parseClassWithClauseOpt(Key)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Key)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Key)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(abstract, class, null)
           parseClassOrMixinOrExtensionBody(Key, DeclarationKind.Class, Key)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Key)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -115,7 +115,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -188,7 +188,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -282,7 +282,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -362,7 +362,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -469,7 +469,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -556,7 +556,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -670,7 +670,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -764,7 +764,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -794,7 +794,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -806,7 +806,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -861,7 +861,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -891,7 +891,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -903,7 +903,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -946,7 +946,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -976,7 +976,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -988,7 +988,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1050,7 +1050,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1080,7 +1080,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1092,7 +1092,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1142,7 +1142,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1172,7 +1172,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1184,7 +1184,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1281,7 +1281,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1311,7 +1311,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1323,7 +1323,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1408,7 +1408,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1438,7 +1438,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1450,7 +1450,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1525,7 +1525,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1555,7 +1555,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1567,7 +1567,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1624,7 +1624,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1654,7 +1654,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1666,7 +1666,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1748,7 +1748,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1778,7 +1778,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1790,7 +1790,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1854,7 +1854,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, s)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(s)
                 listener: endMetadataStar(0)
@@ -1883,7 +1883,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1895,7 +1895,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2092,7 +2092,7 @@
                 listener: endClassMethod(null, s, (, null, })
               listener: endMember()
             notEofOrValue(}, Key)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(Key)
                 listener: endMetadataStar(0)
@@ -2121,7 +2121,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -2133,7 +2133,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -2337,7 +2337,7 @@
                 listener: endClassConstructor(null, Key, (, :, })
               listener: endMember()
             notEofOrValue(}, Key)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(Key)
                 listener: endMetadataStar(0)
@@ -2366,7 +2366,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -2378,7 +2378,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -2546,7 +2546,7 @@
                 listener: endClassConstructor(null, Key, (, :, })
               listener: endMember()
             notEofOrValue(}, not_currently_working)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(not_currently_working)
                 listener: endMetadataStar(0)
@@ -2575,7 +2575,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -2587,7 +2587,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.expect
index 550de5d..e14c1cd 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.expect
@@ -18,7 +18,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(co)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.intertwined.expect
index 20a6ec6..885acb8 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, co)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(co)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.expect
index 2c563eb..ef39e22 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.expect
@@ -14,7 +14,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(co)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.intertwined.expect
index 0029b54..8a9a4f4 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, co)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(co)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.expect
index 71be906..eb7be0a 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.expect
@@ -26,7 +26,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(C)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.intertwined.expect
index f465d58..486d7a3 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -63,7 +63,7 @@
                 listener: endClassConstructor(null, C, (, null, })
               listener: endMember()
             notEofOrValue(}, /)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, C)
               parseMetadataStar(})
                 listener: beginMetadataStar(/)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect
index fed361e..1443cf1 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect
@@ -22,7 +22,7 @@
       handleNoType(>)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -43,7 +43,7 @@
     endTypeVariables(<, >)
     beginMixinDeclaration(mixin, M)
       handleMixinOn(null, 0)
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleMixinHeader(mixin)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Mixin, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Mixin, 0, {, })
@@ -74,13 +74,13 @@
         endFunctionType(Function, null)
       endTypeList(1)
       handleClassWithClause(with)
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       handleRecoverableError(Message[UnexpectedToken, Unexpected token '>'., null, {lexeme: >}], >, >)
       handleNoType(>)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleRecoverClassHeader()
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect
index 6017b1c..c046fee 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect
@@ -27,10 +27,10 @@
             parseClassExtendsOpt(>)
               listener: handleNoType(>)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(>)
+            parseClassWithClauseOpt(>)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(>)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(>)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -61,8 +61,8 @@
         parseMixinHeaderOpt(>, mixin)
           parseMixinOnOpt(>)
             listener: handleMixinOn(null, 0)
-          parseClassOrMixinImplementsOpt(>)
-            listener: handleClassOrMixinImplements(null, 0)
+          parseClassOrMixinOrEnumImplementsOpt(>)
+            listener: handleImplements(null, 0)
           listener: handleMixinHeader(mixin)
         parseClassOrMixinOrExtensionBody(>, DeclarationKind.Mixin, M)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Mixin, {)
@@ -90,7 +90,7 @@
                 listener: handleNoTypeArguments(with)
                 listener: handleType(Object, null)
                 listener: handleClassExtends(extends, 1)
-            parseWithClauseOpt(Object)
+            parseClassWithClauseOpt(Object)
               parseTypeList(with)
                 listener: beginTypeList(M)
                 listener: beginFunctionType(M)
@@ -110,29 +110,29 @@
                 listener: endFunctionType(Function, null)
                 listener: endTypeList(1)
               listener: handleClassWithClause(with)
-            parseClassOrMixinImplementsOpt())
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt())
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassHeaderRecovery(DND1, class, class)
             parseClassHeaderOpt(DND1, class, class)
               parseClassExtendsOpt(DND1)
                 parseClassExtendsSeenExtendsClause(extends, DND1)
-              parseWithClauseOpt(Object)
+              parseClassWithClauseOpt(Object)
                 parseTypeList(with)
                   ensureIdentifier(with, typeReference)
                   parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
                     parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
-              parseClassOrMixinImplementsOpt())
+              parseClassOrMixinOrEnumImplementsOpt())
             skipUnexpectedTokenOpt(), [extends, with, implements, {])
               reportRecoverableErrorWithToken(>, Instance of 'Template<(Token) => Message>')
                 listener: handleRecoverableError(Message[UnexpectedToken, Unexpected token '>'., null, {lexeme: >}], >, >)
             parseClassExtendsOpt(>)
               listener: handleNoType(>)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(>)
+            parseClassWithClauseOpt(>)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(>)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(>)
+              listener: handleImplements(null, 0)
             listener: handleRecoverClassHeader()
           ensureBlock(>, null, class declaration)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, DND1)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.expect
index 26b7c41..60b08d7 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.expect
@@ -57,7 +57,7 @@
                 handleNoType(()
                 handleIdentifier(builder, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+              endFormalParameter(null, null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
             endFormalParameters(1, (, ), MemberKind.Local)
             handleAsyncModifier(null, null)
             handleIdentifier(builder, expression)
@@ -111,7 +111,7 @@
                 handleNoType(()
                 handleIdentifier(builder, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+              endFormalParameter(null, null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
             endFormalParameters(1, (, ), MemberKind.Local)
             handleAsyncModifier(null, null)
             handleIdentifier(builder, expression)
@@ -166,7 +166,7 @@
                 handleNoType(()
                 handleIdentifier(builder, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+              endFormalParameter(null, null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
             endFormalParameters(1, (, ), MemberKind.Local)
             handleAsyncModifier(null, null)
             handleIdentifier(builder, expression)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.intertwined.expect
index ad14111..172bb90 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.intertwined.expect
@@ -115,7 +115,7 @@
                                                       ensureIdentifier((, formalParameterDeclaration)
                                                         listener: handleIdentifier(builder, formalParameterDeclaration)
                                                       listener: handleFormalParameterWithoutValue())
-                                                      listener: endFormalParameter(null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+                                                      listener: endFormalParameter(null, null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
                                                     listener: endFormalParameters(1, (, ), MemberKind.Local)
                                                 parseAsyncOptBody(), true, false)
                                                   parseAsyncModifierOpt())
@@ -266,7 +266,7 @@
                                                       ensureIdentifier((, formalParameterDeclaration)
                                                         listener: handleIdentifier(builder, formalParameterDeclaration)
                                                       listener: handleFormalParameterWithoutValue())
-                                                      listener: endFormalParameter(null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+                                                      listener: endFormalParameter(null, null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
                                                     listener: endFormalParameters(1, (, ), MemberKind.Local)
                                                 parseAsyncOptBody(), true, false)
                                                   parseAsyncModifierOpt())
@@ -419,7 +419,7 @@
                                                       ensureIdentifier((, formalParameterDeclaration)
                                                         listener: handleIdentifier(builder, formalParameterDeclaration)
                                                       listener: handleFormalParameterWithoutValue())
-                                                      listener: endFormalParameter(null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+                                                      listener: endFormalParameter(null, null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
                                                     listener: endFormalParameters(1, (, ), MemberKind.Local)
                                                 parseAsyncOptBody(), true, false)
                                                   parseAsyncModifierOpt())
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.expect
index 10ad30c..6e0c9728 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.expect
@@ -33,7 +33,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -42,7 +42,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -93,7 +93,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -102,7 +102,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.intertwined.expect
index 1ed1153..5369ad7 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.intertwined.expect
@@ -31,7 +31,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -43,7 +43,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -186,7 +186,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -198,7 +198,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.expect
index 52d75b5..624aaa6 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.expect
@@ -41,7 +41,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -50,7 +50,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -100,7 +100,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -109,7 +109,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -118,7 +118,7 @@
           handleType(int, null)
           handleIdentifier(c, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -178,7 +178,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -187,7 +187,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -237,7 +237,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -246,7 +246,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -255,7 +255,7 @@
           handleType(int, null)
           handleIdentifier(c, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.intertwined.expect
index 96b2596..8aeda7b 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.intertwined.expect
@@ -31,7 +31,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -43,7 +43,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -183,7 +183,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -195,7 +195,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -207,7 +207,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(c, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -395,7 +395,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -407,7 +407,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -547,7 +547,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -559,7 +559,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -571,7 +571,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(c, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.expect
index cd1beba..cc590c5 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.expect
@@ -15,7 +15,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -24,7 +24,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -73,7 +73,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -82,7 +82,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -91,7 +91,7 @@
           handleType(int, null)
           handleIdentifier(c, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -149,7 +149,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -158,7 +158,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -207,7 +207,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -216,7 +216,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -225,7 +225,7 @@
           handleType(int, null)
           handleIdentifier(c, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.intertwined.expect
index c5680b3..9d01254 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.intertwined.expect
@@ -31,7 +31,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -43,7 +43,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -157,7 +157,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -169,7 +169,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -181,7 +181,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(c, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -316,7 +316,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -328,7 +328,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -442,7 +442,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -454,7 +454,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -466,7 +466,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(c, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.expect
index 90f0494..d370a1f 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.expect
@@ -26,7 +26,7 @@
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.intertwined.expect
index a1f507a..487b2f4 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -78,7 +78,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -123,7 +123,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -162,7 +162,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -216,7 +216,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -259,7 +259,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -325,7 +325,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -379,7 +379,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -439,7 +439,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.expect
index f85d2a9..3e6acd8 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.expect
@@ -26,7 +26,7 @@
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.intertwined.expect
index 3fdbced..3286fb7 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -77,7 +77,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -125,7 +125,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -163,7 +163,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -191,7 +191,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo')
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo', false)
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(Map, constructorReference)
                               listener: beginConstructorReference(Map)
@@ -219,7 +219,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -247,7 +247,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg')
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg', false)
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(Map, constructorReference)
                               listener: beginConstructorReference(Map)
@@ -264,7 +264,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -329,7 +329,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -382,7 +382,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -445,7 +445,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.expect
index dbfa889..a77c1d4 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.expect
@@ -22,7 +22,7 @@
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.intertwined.expect
index fe10043..78e2879 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -74,7 +74,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -115,7 +115,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -153,7 +153,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -200,7 +200,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -239,7 +239,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -289,7 +289,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -332,7 +332,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -376,7 +376,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.expect
index ee30059..7671fc4 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.expect
@@ -26,7 +26,7 @@
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.intertwined.expect
index 2a9f996..1859b0b 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -73,7 +73,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -117,7 +117,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -154,7 +154,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -178,7 +178,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo')
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo', false)
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(List, constructorReference)
                               listener: beginConstructorReference(List)
@@ -203,7 +203,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -227,7 +227,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg')
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg', false)
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(List, constructorReference)
                               listener: beginConstructorReference(List)
@@ -244,7 +244,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -293,7 +293,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -333,7 +333,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -380,7 +380,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.expect
index 53c04d2..1711905 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.expect
@@ -38,7 +38,7 @@
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.intertwined.expect
index 0133f20..4a37dea 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -73,7 +73,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -119,7 +119,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -156,7 +156,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -181,7 +181,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo')
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo', false)
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(List, constructorReference)
                               listener: beginConstructorReference(List)
@@ -206,7 +206,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -231,7 +231,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg')
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg', false)
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(List, constructorReference)
                               listener: beginConstructorReference(List)
@@ -248,7 +248,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -297,7 +297,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -337,7 +337,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -386,7 +386,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.expect
index 173eeae..b2a0a36 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.expect
@@ -38,7 +38,7 @@
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.intertwined.expect
index 0b1733b..77176c4 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -77,7 +77,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -127,7 +127,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -165,7 +165,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -194,7 +194,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo')
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo', false)
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(Map, constructorReference)
                               listener: beginConstructorReference(Map)
@@ -222,7 +222,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -251,7 +251,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg')
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg', false)
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(Map, constructorReference)
                               listener: beginConstructorReference(Map)
@@ -268,7 +268,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -333,7 +333,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -386,7 +386,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -451,7 +451,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.expect
index 7a1bda5..48a989a 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.expect
@@ -26,7 +26,7 @@
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.intertwined.expect
index 6419253..4c25c0e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -71,7 +71,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -109,7 +109,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -144,7 +144,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -191,7 +191,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -230,7 +230,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -280,7 +280,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -321,7 +321,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -365,7 +365,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.expect
index be8115b..e64026f 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.expect
@@ -26,7 +26,7 @@
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.intertwined.expect
index fe81a69..2b0b373 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -70,7 +70,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -111,7 +111,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -145,7 +145,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -169,7 +169,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo')
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo', false)
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(Set, constructorReference)
                               listener: beginConstructorReference(Set)
@@ -194,7 +194,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -218,7 +218,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg')
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg', false)
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(Set, constructorReference)
                               listener: beginConstructorReference(Set)
@@ -235,7 +235,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -284,7 +284,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -324,7 +324,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -371,7 +371,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.expect
index 47c67e8..cf0c95b 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.expect
@@ -38,7 +38,7 @@
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.intertwined.expect
index 02cf05c..642c608 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -70,7 +70,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -113,7 +113,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -147,7 +147,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -172,7 +172,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo')
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo', false)
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(Set, constructorReference)
                               listener: beginConstructorReference(Set)
@@ -197,7 +197,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -222,7 +222,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg')
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg', false)
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(Set, constructorReference)
                               listener: beginConstructorReference(Set)
@@ -239,7 +239,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -288,7 +288,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -328,7 +328,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -377,7 +377,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.expect
index 3879cab..51b616e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.expect
@@ -26,7 +26,7 @@
       handleNoType(>)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(foo)
@@ -45,7 +45,7 @@
                 handleType(Object, ?)
                 handleIdentifier(key, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, key, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, key, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.intertwined.expect
index a9e5ff3..352b89d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.intertwined.expect
@@ -27,15 +27,15 @@
             parseClassExtendsOpt(>)
               listener: handleNoType(>)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(>)
+            parseClassWithClauseOpt(>)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(>)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(>)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -64,7 +64,7 @@
                         ensureIdentifier(?, formalParameterDeclaration)
                           listener: handleIdentifier(key, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, key, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, key, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.expect
index 5c15762..1819758 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.expect
@@ -231,7 +231,7 @@
       handleNoType(abstract)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -247,7 +247,7 @@
       handleNoType(as)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -263,7 +263,7 @@
       handleNoType(assert)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -278,7 +278,7 @@
       handleNoType(async)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -293,7 +293,7 @@
       handleNoType(await)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -309,7 +309,7 @@
       handleNoType(break)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -325,7 +325,7 @@
       handleNoType(case)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -341,7 +341,7 @@
       handleNoType(catch)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -357,7 +357,7 @@
       handleNoType(class)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -373,7 +373,7 @@
       handleNoType(const)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -389,7 +389,7 @@
       handleNoType(continue)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -405,7 +405,7 @@
       handleNoType(covariant)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -421,7 +421,7 @@
       handleNoType(default)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -437,7 +437,7 @@
       handleNoType(deferred)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -453,7 +453,7 @@
       handleNoType(do)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -469,7 +469,7 @@
       handleNoType(dynamic)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -485,7 +485,7 @@
       handleNoType(else)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -501,7 +501,7 @@
       handleNoType(enum)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -517,7 +517,7 @@
       handleNoType(export)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -533,7 +533,7 @@
       handleNoType(extends)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -549,7 +549,7 @@
       handleNoType(extension)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -565,7 +565,7 @@
       handleNoType(external)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -581,7 +581,7 @@
       handleNoType(factory)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -597,7 +597,7 @@
       handleNoType(false)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -613,7 +613,7 @@
       handleNoType(final)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -629,7 +629,7 @@
       handleNoType(finally)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -645,7 +645,7 @@
       handleNoType(for)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -660,7 +660,7 @@
       handleNoType(Function)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -676,7 +676,7 @@
       handleNoType(get)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -691,7 +691,7 @@
       handleNoType(hide)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -707,7 +707,7 @@
       handleNoType(if)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -723,7 +723,7 @@
       handleNoType(implements)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -739,7 +739,7 @@
       handleNoType(import)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -755,7 +755,7 @@
       handleNoType(in)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -770,7 +770,7 @@
       handleNoType(inout)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -786,7 +786,7 @@
       handleNoType(interface)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -802,7 +802,7 @@
       handleNoType(is)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -818,7 +818,7 @@
       handleNoType(late)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -834,7 +834,7 @@
       handleNoType(library)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -850,7 +850,7 @@
       handleNoType(mixin)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -865,7 +865,7 @@
       handleNoType(native)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -881,7 +881,7 @@
       handleNoType(new)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -897,7 +897,7 @@
       handleNoType(null)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -912,7 +912,7 @@
       handleNoType(of)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -927,7 +927,7 @@
       handleNoType(on)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -943,7 +943,7 @@
       handleNoType(operator)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -958,7 +958,7 @@
       handleNoType(out)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -974,7 +974,7 @@
       handleNoType(part)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -989,7 +989,7 @@
       handleNoType(patch)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1005,7 +1005,7 @@
       handleNoType(required)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1021,7 +1021,7 @@
       handleNoType(rethrow)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1037,7 +1037,7 @@
       handleNoType(return)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1053,7 +1053,7 @@
       handleNoType(set)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1068,7 +1068,7 @@
       handleNoType(show)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1083,7 +1083,7 @@
       handleNoType(source)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1099,7 +1099,7 @@
       handleNoType(static)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1115,7 +1115,7 @@
       handleNoType(super)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1131,7 +1131,7 @@
       handleNoType(switch)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1146,7 +1146,7 @@
       handleNoType(sync)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1162,7 +1162,7 @@
       handleNoType(this)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1178,7 +1178,7 @@
       handleNoType(throw)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1194,7 +1194,7 @@
       handleNoType(true)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1210,7 +1210,7 @@
       handleNoType(try)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1226,7 +1226,7 @@
       handleNoType(typedef)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1242,7 +1242,7 @@
       handleNoType(var)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1258,7 +1258,7 @@
       handleNoType(void)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1274,7 +1274,7 @@
       handleNoType(while)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1290,7 +1290,7 @@
       handleNoType(with)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1305,7 +1305,7 @@
       handleNoType(yield)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.intertwined.expect
index 395b3c1..5a31b41 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.intertwined.expect
@@ -21,10 +21,10 @@
             parseClassExtendsOpt(abstract)
               listener: handleNoType(abstract)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(abstract)
+            parseClassWithClauseOpt(abstract)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(abstract)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(abstract)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(abstract, DeclarationKind.Class, abstract)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -51,10 +51,10 @@
             parseClassExtendsOpt(as)
               listener: handleNoType(as)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(as)
+            parseClassWithClauseOpt(as)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(as)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(as)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(as, DeclarationKind.Class, as)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -81,10 +81,10 @@
             parseClassExtendsOpt(assert)
               listener: handleNoType(assert)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(assert)
+            parseClassWithClauseOpt(assert)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(assert)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(assert)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(assert, DeclarationKind.Class, assert)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -109,10 +109,10 @@
             parseClassExtendsOpt(async)
               listener: handleNoType(async)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(async)
+            parseClassWithClauseOpt(async)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(async)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(async)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(async, DeclarationKind.Class, async)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -137,10 +137,10 @@
             parseClassExtendsOpt(await)
               listener: handleNoType(await)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(await)
+            parseClassWithClauseOpt(await)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(await)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(await)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(await, DeclarationKind.Class, await)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -167,10 +167,10 @@
             parseClassExtendsOpt(break)
               listener: handleNoType(break)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(break)
+            parseClassWithClauseOpt(break)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(break)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(break)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(break, DeclarationKind.Class, break)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -197,10 +197,10 @@
             parseClassExtendsOpt(case)
               listener: handleNoType(case)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(case)
+            parseClassWithClauseOpt(case)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(case)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(case)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(case, DeclarationKind.Class, case)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -227,10 +227,10 @@
             parseClassExtendsOpt(catch)
               listener: handleNoType(catch)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(catch)
+            parseClassWithClauseOpt(catch)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(catch)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(catch)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(catch, DeclarationKind.Class, catch)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -257,10 +257,10 @@
             parseClassExtendsOpt(class)
               listener: handleNoType(class)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(class)
+            parseClassWithClauseOpt(class)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(class)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(class)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(class, DeclarationKind.Class, class)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -287,10 +287,10 @@
             parseClassExtendsOpt(const)
               listener: handleNoType(const)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(const)
+            parseClassWithClauseOpt(const)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(const)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(const)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(const, DeclarationKind.Class, const)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -317,10 +317,10 @@
             parseClassExtendsOpt(continue)
               listener: handleNoType(continue)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(continue)
+            parseClassWithClauseOpt(continue)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(continue)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(continue)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(continue, DeclarationKind.Class, continue)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -347,10 +347,10 @@
             parseClassExtendsOpt(covariant)
               listener: handleNoType(covariant)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(covariant)
+            parseClassWithClauseOpt(covariant)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(covariant)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(covariant)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(covariant, DeclarationKind.Class, covariant)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -377,10 +377,10 @@
             parseClassExtendsOpt(default)
               listener: handleNoType(default)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(default)
+            parseClassWithClauseOpt(default)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(default)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(default)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(default, DeclarationKind.Class, default)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -407,10 +407,10 @@
             parseClassExtendsOpt(deferred)
               listener: handleNoType(deferred)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(deferred)
+            parseClassWithClauseOpt(deferred)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(deferred)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(deferred)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(deferred, DeclarationKind.Class, deferred)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -437,10 +437,10 @@
             parseClassExtendsOpt(do)
               listener: handleNoType(do)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(do)
+            parseClassWithClauseOpt(do)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(do)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(do)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(do, DeclarationKind.Class, do)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -467,10 +467,10 @@
             parseClassExtendsOpt(dynamic)
               listener: handleNoType(dynamic)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(dynamic)
+            parseClassWithClauseOpt(dynamic)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(dynamic)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(dynamic)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(dynamic, DeclarationKind.Class, dynamic)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -497,10 +497,10 @@
             parseClassExtendsOpt(else)
               listener: handleNoType(else)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(else)
+            parseClassWithClauseOpt(else)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(else)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(else)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(else, DeclarationKind.Class, else)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -527,10 +527,10 @@
             parseClassExtendsOpt(enum)
               listener: handleNoType(enum)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(enum)
+            parseClassWithClauseOpt(enum)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(enum)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(enum)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(enum, DeclarationKind.Class, enum)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -557,10 +557,10 @@
             parseClassExtendsOpt(export)
               listener: handleNoType(export)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(export)
+            parseClassWithClauseOpt(export)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(export)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(export)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(export, DeclarationKind.Class, export)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -587,10 +587,10 @@
             parseClassExtendsOpt(extends)
               listener: handleNoType(extends)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(extends)
+            parseClassWithClauseOpt(extends)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(extends)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(extends)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(extends, DeclarationKind.Class, extends)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -617,10 +617,10 @@
             parseClassExtendsOpt(extension)
               listener: handleNoType(extension)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(extension)
+            parseClassWithClauseOpt(extension)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(extension)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(extension)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(extension, DeclarationKind.Class, extension)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -647,10 +647,10 @@
             parseClassExtendsOpt(external)
               listener: handleNoType(external)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(external)
+            parseClassWithClauseOpt(external)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(external)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(external)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(external, DeclarationKind.Class, external)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -677,10 +677,10 @@
             parseClassExtendsOpt(factory)
               listener: handleNoType(factory)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(factory)
+            parseClassWithClauseOpt(factory)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(factory)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(factory)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(factory, DeclarationKind.Class, factory)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -707,10 +707,10 @@
             parseClassExtendsOpt(false)
               listener: handleNoType(false)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(false)
+            parseClassWithClauseOpt(false)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(false)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(false)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(false, DeclarationKind.Class, false)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -737,10 +737,10 @@
             parseClassExtendsOpt(final)
               listener: handleNoType(final)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(final)
+            parseClassWithClauseOpt(final)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(final)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(final)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(final, DeclarationKind.Class, final)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -767,10 +767,10 @@
             parseClassExtendsOpt(finally)
               listener: handleNoType(finally)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(finally)
+            parseClassWithClauseOpt(finally)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(finally)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(finally)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(finally, DeclarationKind.Class, finally)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -797,10 +797,10 @@
             parseClassExtendsOpt(for)
               listener: handleNoType(for)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(for)
+            parseClassWithClauseOpt(for)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(for)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(for)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(for, DeclarationKind.Class, for)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -825,10 +825,10 @@
             parseClassExtendsOpt(Function)
               listener: handleNoType(Function)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Function)
+            parseClassWithClauseOpt(Function)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Function)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Function)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Function, DeclarationKind.Class, Function)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -855,10 +855,10 @@
             parseClassExtendsOpt(get)
               listener: handleNoType(get)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(get)
+            parseClassWithClauseOpt(get)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(get)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(get)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(get, DeclarationKind.Class, get)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -883,10 +883,10 @@
             parseClassExtendsOpt(hide)
               listener: handleNoType(hide)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(hide)
+            parseClassWithClauseOpt(hide)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(hide)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(hide)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(hide, DeclarationKind.Class, hide)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -913,10 +913,10 @@
             parseClassExtendsOpt(if)
               listener: handleNoType(if)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(if)
+            parseClassWithClauseOpt(if)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(if)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(if)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(if, DeclarationKind.Class, if)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -943,10 +943,10 @@
             parseClassExtendsOpt(implements)
               listener: handleNoType(implements)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(implements)
+            parseClassWithClauseOpt(implements)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(implements)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(implements)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(implements, DeclarationKind.Class, implements)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -973,10 +973,10 @@
             parseClassExtendsOpt(import)
               listener: handleNoType(import)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(import)
+            parseClassWithClauseOpt(import)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(import)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(import)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(import, DeclarationKind.Class, import)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1003,10 +1003,10 @@
             parseClassExtendsOpt(in)
               listener: handleNoType(in)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(in)
+            parseClassWithClauseOpt(in)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(in)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(in)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(in, DeclarationKind.Class, in)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1031,10 +1031,10 @@
             parseClassExtendsOpt(inout)
               listener: handleNoType(inout)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(inout)
+            parseClassWithClauseOpt(inout)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(inout)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(inout)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(inout, DeclarationKind.Class, inout)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1061,10 +1061,10 @@
             parseClassExtendsOpt(interface)
               listener: handleNoType(interface)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(interface)
+            parseClassWithClauseOpt(interface)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(interface)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(interface)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(interface, DeclarationKind.Class, interface)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1091,10 +1091,10 @@
             parseClassExtendsOpt(is)
               listener: handleNoType(is)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(is)
+            parseClassWithClauseOpt(is)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(is)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(is)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(is, DeclarationKind.Class, is)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1121,10 +1121,10 @@
             parseClassExtendsOpt(late)
               listener: handleNoType(late)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(late)
+            parseClassWithClauseOpt(late)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(late)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(late)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(late, DeclarationKind.Class, late)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1151,10 +1151,10 @@
             parseClassExtendsOpt(library)
               listener: handleNoType(library)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(library)
+            parseClassWithClauseOpt(library)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(library)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(library)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(library, DeclarationKind.Class, library)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1181,10 +1181,10 @@
             parseClassExtendsOpt(mixin)
               listener: handleNoType(mixin)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(mixin)
+            parseClassWithClauseOpt(mixin)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(mixin)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(mixin)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(mixin, DeclarationKind.Class, mixin)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1209,10 +1209,10 @@
             parseClassExtendsOpt(native)
               listener: handleNoType(native)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(native)
+            parseClassWithClauseOpt(native)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(native)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(native)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(native, DeclarationKind.Class, native)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1239,10 +1239,10 @@
             parseClassExtendsOpt(new)
               listener: handleNoType(new)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(new)
+            parseClassWithClauseOpt(new)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(new)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(new)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(new, DeclarationKind.Class, new)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1269,10 +1269,10 @@
             parseClassExtendsOpt(null)
               listener: handleNoType(null)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(null)
+            parseClassWithClauseOpt(null)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(null)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(null)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(null, DeclarationKind.Class, null)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1297,10 +1297,10 @@
             parseClassExtendsOpt(of)
               listener: handleNoType(of)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(of)
+            parseClassWithClauseOpt(of)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(of)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(of)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(of, DeclarationKind.Class, of)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1325,10 +1325,10 @@
             parseClassExtendsOpt(on)
               listener: handleNoType(on)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(on)
+            parseClassWithClauseOpt(on)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(on)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(on)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(on, DeclarationKind.Class, on)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1355,10 +1355,10 @@
             parseClassExtendsOpt(operator)
               listener: handleNoType(operator)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(operator)
+            parseClassWithClauseOpt(operator)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(operator)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(operator)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(operator, DeclarationKind.Class, operator)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1383,10 +1383,10 @@
             parseClassExtendsOpt(out)
               listener: handleNoType(out)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(out)
+            parseClassWithClauseOpt(out)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(out)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(out)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(out, DeclarationKind.Class, out)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1413,10 +1413,10 @@
             parseClassExtendsOpt(part)
               listener: handleNoType(part)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(part)
+            parseClassWithClauseOpt(part)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(part)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(part)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(part, DeclarationKind.Class, part)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1441,10 +1441,10 @@
             parseClassExtendsOpt(patch)
               listener: handleNoType(patch)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(patch)
+            parseClassWithClauseOpt(patch)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(patch)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(patch)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(patch, DeclarationKind.Class, patch)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1471,10 +1471,10 @@
             parseClassExtendsOpt(required)
               listener: handleNoType(required)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(required)
+            parseClassWithClauseOpt(required)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(required)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(required)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(required, DeclarationKind.Class, required)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1501,10 +1501,10 @@
             parseClassExtendsOpt(rethrow)
               listener: handleNoType(rethrow)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(rethrow)
+            parseClassWithClauseOpt(rethrow)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(rethrow)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(rethrow)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(rethrow, DeclarationKind.Class, rethrow)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1531,10 +1531,10 @@
             parseClassExtendsOpt(return)
               listener: handleNoType(return)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(return)
+            parseClassWithClauseOpt(return)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(return)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(return)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(return, DeclarationKind.Class, return)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1561,10 +1561,10 @@
             parseClassExtendsOpt(set)
               listener: handleNoType(set)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(set)
+            parseClassWithClauseOpt(set)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(set)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(set)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(set, DeclarationKind.Class, set)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1589,10 +1589,10 @@
             parseClassExtendsOpt(show)
               listener: handleNoType(show)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(show)
+            parseClassWithClauseOpt(show)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(show)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(show)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(show, DeclarationKind.Class, show)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1617,10 +1617,10 @@
             parseClassExtendsOpt(source)
               listener: handleNoType(source)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(source)
+            parseClassWithClauseOpt(source)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(source)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(source)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(source, DeclarationKind.Class, source)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1647,10 +1647,10 @@
             parseClassExtendsOpt(static)
               listener: handleNoType(static)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(static)
+            parseClassWithClauseOpt(static)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(static)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(static)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(static, DeclarationKind.Class, static)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1677,10 +1677,10 @@
             parseClassExtendsOpt(super)
               listener: handleNoType(super)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(super)
+            parseClassWithClauseOpt(super)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(super)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(super)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(super, DeclarationKind.Class, super)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1707,10 +1707,10 @@
             parseClassExtendsOpt(switch)
               listener: handleNoType(switch)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(switch)
+            parseClassWithClauseOpt(switch)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(switch)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(switch)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(switch, DeclarationKind.Class, switch)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1735,10 +1735,10 @@
             parseClassExtendsOpt(sync)
               listener: handleNoType(sync)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(sync)
+            parseClassWithClauseOpt(sync)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(sync)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(sync)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(sync, DeclarationKind.Class, sync)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1765,10 +1765,10 @@
             parseClassExtendsOpt(this)
               listener: handleNoType(this)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(this)
+            parseClassWithClauseOpt(this)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(this)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(this)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(this, DeclarationKind.Class, this)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1795,10 +1795,10 @@
             parseClassExtendsOpt(throw)
               listener: handleNoType(throw)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(throw)
+            parseClassWithClauseOpt(throw)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(throw)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(throw)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(throw, DeclarationKind.Class, throw)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1825,10 +1825,10 @@
             parseClassExtendsOpt(true)
               listener: handleNoType(true)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(true)
+            parseClassWithClauseOpt(true)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(true)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(true)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(true, DeclarationKind.Class, true)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1855,10 +1855,10 @@
             parseClassExtendsOpt(try)
               listener: handleNoType(try)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(try)
+            parseClassWithClauseOpt(try)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(try)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(try)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(try, DeclarationKind.Class, try)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1885,10 +1885,10 @@
             parseClassExtendsOpt(typedef)
               listener: handleNoType(typedef)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(typedef)
+            parseClassWithClauseOpt(typedef)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(typedef)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(typedef)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(typedef, DeclarationKind.Class, typedef)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1915,10 +1915,10 @@
             parseClassExtendsOpt(var)
               listener: handleNoType(var)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(var)
+            parseClassWithClauseOpt(var)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(var)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(var)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(var, DeclarationKind.Class, var)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1945,10 +1945,10 @@
             parseClassExtendsOpt(void)
               listener: handleNoType(void)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(void)
+            parseClassWithClauseOpt(void)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(void)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(void)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(void, DeclarationKind.Class, void)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1975,10 +1975,10 @@
             parseClassExtendsOpt(while)
               listener: handleNoType(while)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(while)
+            parseClassWithClauseOpt(while)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(while)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(while)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(while, DeclarationKind.Class, while)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -2005,10 +2005,10 @@
             parseClassExtendsOpt(with)
               listener: handleNoType(with)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(with)
+            parseClassWithClauseOpt(with)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(with)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(with)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(with, DeclarationKind.Class, with)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -2033,10 +2033,10 @@
             parseClassExtendsOpt(yield)
               listener: handleNoType(yield)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(yield)
+            parseClassWithClauseOpt(yield)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(yield)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(yield)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(yield, DeclarationKind.Class, yield)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.expect
index de863a7..c531ce9 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.expect
@@ -24,12 +24,12 @@
       handleNoType()
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       handleNoType()
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleRecoverClassHeader()
       handleRecoverableError(Message[ExpectedClassOrMixinBody, A class declaration must have a body, even if it is empty., Try adding an empty body., {string: class declaration}], , )
       // WARNING: Reporting at eof for .
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.intertwined.expect
index 6dbf406..7f36933 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.intertwined.expect
@@ -24,24 +24,24 @@
             parseClassExtendsOpt()
               listener: handleNoType()
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt()
+            parseClassWithClauseOpt()
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt()
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt()
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassHeaderRecovery(, class, class)
             parseClassHeaderOpt(, class, class)
               parseClassExtendsOpt()
-              parseWithClauseOpt()
-              parseClassOrMixinImplementsOpt()
+              parseClassWithClauseOpt()
+              parseClassOrMixinOrEnumImplementsOpt()
             skipUnexpectedTokenOpt(, [extends, with, implements, {])
             parseClassExtendsOpt()
               listener: handleNoType()
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt()
+            parseClassWithClauseOpt()
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt()
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt()
+              listener: handleImplements(null, 0)
             listener: handleRecoverClassHeader()
           ensureBlock(, null, class declaration)
             reportRecoverableError(, Message[ExpectedClassOrMixinBody, A class declaration must have a body, even if it is empty., Try adding an empty body., {string: class declaration}])
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.expect
index 2735118..5319e1e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.expect
@@ -34,7 +34,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
@@ -71,7 +71,7 @@
       handleNoType(B)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(List)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.intertwined.expect
index fec64a0..2084366 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
@@ -86,15 +86,15 @@
             parseClassExtendsOpt(B)
               listener: handleNoType(B)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, B)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, List)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, B)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, B)
               parseMetadataStar({)
                 listener: beginMetadataStar(List)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.expect
index 5f9ce60..57ee430 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.expect
@@ -14,7 +14,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.intertwined.expect
index e9142c6..7943b6e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.expect
index bdef6b4..9966ba4 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.expect
@@ -8,7 +8,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.intertwined.expect
index 9b6493f..ef59ba8 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.expect
index 6e7b413..e72edce 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.expect
@@ -22,7 +22,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.intertwined.expect
index aa7d85c..facee11 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.expect
index 1e76544..c08729f 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.expect
@@ -22,7 +22,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.intertwined.expect
index 9e3219e..6b797ae 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.expect
index 385f68c..2f106f1 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.expect
@@ -86,7 +86,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
@@ -131,7 +131,7 @@
       handleNoType(B)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
@@ -203,7 +203,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.intertwined.expect
index de9f8f5..67c819d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
@@ -96,15 +96,15 @@
             parseClassExtendsOpt(B)
               listener: handleNoType(B)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, B)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, B)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, B)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
@@ -141,7 +141,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, Stream, ;)
               listener: endMember()
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, B)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, B)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
@@ -210,15 +210,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
@@ -255,7 +255,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, Stream, ;)
               listener: endMember()
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
@@ -338,7 +338,7 @@
                 listener: endClassMethod(null, Stream, (, null, })
               listener: endMember()
             notEofOrValue(}, baz)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, C)
               parseMetadataStar(})
                 listener: beginMetadataStar(baz)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.expect
index eccab19..1c4ffc0 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.expect
@@ -14,7 +14,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(stream)
@@ -47,7 +47,7 @@
                 handleType(T, null)
                 handleIdentifier(foo, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -86,7 +86,7 @@
                 handleType(T, null)
                 handleIdentifier(foo, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -118,7 +118,7 @@
                 handleType(T, null)
                 handleIdentifier(foo, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.intertwined.expect
index d9371ae..b5de8a7 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(stream)
                 listener: endMetadataStar(0)
@@ -72,7 +72,7 @@
                         ensureIdentifier(T, formalParameterDeclaration)
                           listener: handleIdentifier(foo, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -87,7 +87,7 @@
                 listener: endClassMethod(null, stream, (, null, })
               listener: endMember()
             notEofOrValue(}, stream2)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, A)
               parseMetadataStar(})
                 listener: beginMetadataStar(stream2)
                 listener: endMetadataStar(0)
@@ -136,7 +136,7 @@
                         ensureIdentifier(T, formalParameterDeclaration)
                           listener: handleIdentifier(foo, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -151,7 +151,7 @@
                 listener: endClassMethod(null, stream2, (, null, })
               listener: endMember()
             notEofOrValue(}, stream3)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, A)
               parseMetadataStar(})
                 listener: beginMetadataStar(stream3)
                 listener: endMetadataStar(0)
@@ -188,7 +188,7 @@
                         ensureIdentifier(T, formalParameterDeclaration)
                           listener: handleIdentifier(foo, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46736.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46736.dart.expect
index afce261..7653208 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46736.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46736.dart.expect
@@ -22,7 +22,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
           handleIdentifier(default, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, default, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, default, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46736.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46736.dart.intertwined.expect
index e91c81f..6c25f67 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46736.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46736.dart.intertwined.expect
@@ -32,7 +32,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
                   listener: handleIdentifier(default, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, default, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, default, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46736_prime.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46736_prime.dart.expect
index ca8781c..6d47444 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46736_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46736_prime.dart.expect
@@ -15,7 +15,7 @@
           handleType(String, null)
           handleIdentifier(defaultX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, defaultX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, defaultX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46736_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46736_prime.dart.intertwined.expect
index 567a8fa..6ee505e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46736_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46736_prime.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(String, formalParameterDeclaration)
                   listener: handleIdentifier(defaultX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, defaultX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, defaultX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.expect
index 40b2bb9..40b87ef 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.expect
@@ -142,7 +142,7 @@
       handleNoType(WrapperClass)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.intertwined.expect
index ccc4f23..769412a 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(WrapperClass)
               listener: handleNoType(WrapperClass)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(WrapperClass)
+            parseClassWithClauseOpt(WrapperClass)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(WrapperClass)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(WrapperClass)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(WrapperClass, DeclarationKind.Class, WrapperClass)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, WrapperClass)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -51,7 +51,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -75,7 +75,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -103,7 +103,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -127,7 +127,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -151,7 +151,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -179,7 +179,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -207,7 +207,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -235,7 +235,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -263,7 +263,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -291,7 +291,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -319,7 +319,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -343,7 +343,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -371,7 +371,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -395,7 +395,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -423,7 +423,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -447,7 +447,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -475,7 +475,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -503,7 +503,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -527,7 +527,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -555,7 +555,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -579,7 +579,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -603,7 +603,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -627,7 +627,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -655,7 +655,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -683,7 +683,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -711,7 +711,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -739,7 +739,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -763,7 +763,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -788,7 +788,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -812,7 +812,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -840,7 +840,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -864,7 +864,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -888,7 +888,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -916,7 +916,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -940,7 +940,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -964,7 +964,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -992,7 +992,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1016,7 +1016,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1040,7 +1040,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1064,7 +1064,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1088,7 +1088,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1116,7 +1116,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1144,7 +1144,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1168,7 +1168,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1192,7 +1192,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1217,7 +1217,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1241,7 +1241,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1265,7 +1265,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1289,7 +1289,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1313,7 +1313,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1341,7 +1341,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1369,7 +1369,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1394,7 +1394,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1418,7 +1418,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1442,7 +1442,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1466,7 +1466,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1494,7 +1494,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1522,7 +1522,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1546,7 +1546,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1573,7 +1573,7 @@
                   listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
                 listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1601,7 +1601,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1629,7 +1629,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1657,7 +1657,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1681,7 +1681,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1709,7 +1709,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1737,7 +1737,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1765,7 +1765,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1793,7 +1793,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect
index d7a04ad..bf58a68 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect
@@ -482,7 +482,7 @@
       handleNoType(WrapperClass)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -503,7 +503,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -561,7 +561,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -620,7 +620,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -676,7 +676,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -734,7 +734,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -793,7 +793,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -858,7 +858,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -918,7 +918,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -978,7 +978,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1038,7 +1038,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1102,7 +1102,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1166,7 +1166,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1225,7 +1225,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1284,7 +1284,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1343,7 +1343,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1417,7 +1417,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1476,7 +1476,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1546,7 +1546,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1605,7 +1605,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1664,7 +1664,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1723,7 +1723,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1781,7 +1781,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1839,7 +1839,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1898,7 +1898,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1957,7 +1957,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2044,7 +2044,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2104,7 +2104,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2183,7 +2183,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2241,7 +2241,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2299,7 +2299,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2358,7 +2358,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2428,7 +2428,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2486,7 +2486,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2545,7 +2545,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2604,7 +2604,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2662,7 +2662,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2721,7 +2721,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2789,7 +2789,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2847,7 +2847,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2905,7 +2905,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2963,7 +2963,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3022,7 +3022,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3086,7 +3086,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3144,7 +3144,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3202,7 +3202,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3260,7 +3260,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3318,7 +3318,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3376,7 +3376,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3434,7 +3434,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3492,7 +3492,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3551,7 +3551,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3611,7 +3611,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3666,7 +3666,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3724,7 +3724,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3782,7 +3782,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3840,7 +3840,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3899,7 +3899,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3958,7 +3958,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4029,7 +4029,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4099,7 +4099,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4158,7 +4158,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4214,7 +4214,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4273,7 +4273,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4340,7 +4340,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4399,7 +4399,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4486,7 +4486,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4573,7 +4573,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4644,7 +4644,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4703,7 +4703,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect
index 8276661..22c9cba 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(WrapperClass)
               listener: handleNoType(WrapperClass)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(WrapperClass)
+            parseClassWithClauseOpt(WrapperClass)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(WrapperClass)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(WrapperClass)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(WrapperClass, DeclarationKind.Class, WrapperClass)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, WrapperClass)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -57,7 +57,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -171,7 +171,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -201,7 +201,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -315,7 +315,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -349,7 +349,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -454,7 +454,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -484,7 +484,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -598,7 +598,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -628,7 +628,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -745,7 +745,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -779,7 +779,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -924,7 +924,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -958,7 +958,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1071,7 +1071,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1105,7 +1105,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1218,7 +1218,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1252,7 +1252,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1365,7 +1365,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1399,7 +1399,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1465,7 +1465,7 @@
                               parsePrimary(return, expression)
                                 parseConstExpression(return)
                                   listener: beginConstExpression(const)
-                                  parseConstructorReference(const, ConstructorReferenceContext.Const, null)
+                                  parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
                                     ensureIdentifier(const, constructorReference)
                                       insertSyntheticIdentifier(const, constructorReference, message: Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}], messageOnToken: null)
                                         reportRecoverableError((, Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}])
@@ -1517,7 +1517,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1551,7 +1551,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1696,7 +1696,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1726,7 +1726,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1840,7 +1840,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1874,7 +1874,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1987,7 +1987,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2017,7 +2017,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2131,7 +2131,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2165,7 +2165,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2334,7 +2334,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2364,7 +2364,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2478,7 +2478,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2512,7 +2512,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2675,7 +2675,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2709,7 +2709,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2822,7 +2822,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2852,7 +2852,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2966,7 +2966,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3000,7 +3000,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -3113,7 +3113,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3143,7 +3143,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -3257,7 +3257,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3287,7 +3287,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -3401,7 +3401,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3431,7 +3431,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -3545,7 +3545,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3579,7 +3579,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -3687,7 +3687,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3721,7 +3721,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -3926,7 +3926,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3960,7 +3960,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -4073,7 +4073,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -4107,7 +4107,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -4287,7 +4287,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -4317,7 +4317,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -4431,7 +4431,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -4462,7 +4462,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -4576,7 +4576,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -4606,7 +4606,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -4720,7 +4720,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -4754,7 +4754,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -4905,7 +4905,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -4935,7 +4935,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -5049,7 +5049,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5079,7 +5079,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -5193,7 +5193,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5227,7 +5227,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -5340,7 +5340,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5370,7 +5370,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -5484,7 +5484,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5514,7 +5514,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -5628,7 +5628,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5662,7 +5662,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -5807,7 +5807,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5837,7 +5837,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -5951,7 +5951,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5981,7 +5981,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -6095,7 +6095,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6125,7 +6125,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -6239,7 +6239,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6269,7 +6269,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -6383,7 +6383,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6417,7 +6417,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -6484,7 +6484,7 @@
                                 parseNewExpression(return)
                                   isNextIdentifier(new)
                                   listener: beginNewExpression(new)
-                                  parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                     ensureIdentifier(new, constructorReference)
                                       insertSyntheticIdentifier(new, constructorReference, message: Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}], messageOnToken: null)
                                         reportRecoverableError((, Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}])
@@ -6536,7 +6536,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6570,7 +6570,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -6678,7 +6678,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6708,7 +6708,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -6822,7 +6822,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6852,7 +6852,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -6966,7 +6966,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6998,7 +6998,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -7112,7 +7112,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7142,7 +7142,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -7256,7 +7256,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7286,7 +7286,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -7400,7 +7400,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7430,7 +7430,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -7544,7 +7544,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7574,7 +7574,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -7688,7 +7688,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7722,7 +7722,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -7835,7 +7835,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7869,7 +7869,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -7978,7 +7978,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8009,7 +8009,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -8123,7 +8123,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8153,7 +8153,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -8267,7 +8267,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8297,7 +8297,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -8411,7 +8411,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8441,7 +8441,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -8555,7 +8555,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8589,7 +8589,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -8696,7 +8696,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8730,7 +8730,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -8890,7 +8890,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8920,7 +8920,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -9034,7 +9034,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -9058,7 +9058,7 @@
                   listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
                 listener: endMember()
             notEofOrValue(}, ()
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(()
                 listener: endMetadataStar(0)
@@ -9091,7 +9091,7 @@
                           ensureIdentifier(int, formalParameterDeclaration)
                             listener: handleIdentifier(x, formalParameterDeclaration)
                           listener: handleFormalParameterWithoutValue())
-                          listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                          listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                   parseInitializersOpt())
                     listener: handleNoInitializers()
@@ -9198,7 +9198,7 @@
                   listener: endClassMethod(null, , (, null, })
                 listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -9232,7 +9232,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -9340,7 +9340,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -9374,7 +9374,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -9482,7 +9482,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -9516,7 +9516,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -9667,7 +9667,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -9697,7 +9697,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -9811,7 +9811,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -9845,7 +9845,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -10050,7 +10050,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -10084,7 +10084,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -10290,7 +10290,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -10324,7 +10324,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -10475,7 +10475,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -10509,7 +10509,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -10622,7 +10622,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -10652,7 +10652,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter.dart.expect
index 422ea99..89ea476 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter.dart.expect
@@ -809,7 +809,7 @@
           handleType(int, null)
           handleIdentifier(abstract, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, abstract, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, abstract, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -833,7 +833,7 @@
             handleType(int, null)
             handleIdentifier(abstract, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, abstract, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstract, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -861,7 +861,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, abstract, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstract, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -886,7 +886,7 @@
             handleType(int, null)
             handleIdentifier(abstract, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, abstract, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstract, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -914,7 +914,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, abstract, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstract, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -942,7 +942,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, abstract, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstract, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -966,7 +966,7 @@
           handleType(int, null)
           handleIdentifier(as, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, as, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, as, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -990,7 +990,7 @@
             handleType(int, null)
             handleIdentifier(as, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, as, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, as, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1018,7 +1018,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, as, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, as, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1043,7 +1043,7 @@
             handleType(int, null)
             handleIdentifier(as, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, as, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, as, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1071,7 +1071,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, as, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, as, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1099,7 +1099,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, as, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, as, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1124,7 +1124,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
           handleIdentifier(assert, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, assert, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, assert, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1149,7 +1149,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
             handleIdentifier(assert, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, assert, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assert, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1178,7 +1178,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, assert, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assert, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1204,7 +1204,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
             handleIdentifier(assert, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, assert, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assert, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1233,7 +1233,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, assert, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assert, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1262,7 +1262,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, assert, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assert, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1286,7 +1286,7 @@
           handleType(int, null)
           handleIdentifier(async, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, async, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, async, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1310,7 +1310,7 @@
             handleType(int, null)
             handleIdentifier(async, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, async, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, async, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1338,7 +1338,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, async, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, async, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1363,7 +1363,7 @@
             handleType(int, null)
             handleIdentifier(async, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, async, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, async, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1391,7 +1391,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, async, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, async, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1419,7 +1419,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, async, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, async, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1443,7 +1443,7 @@
           handleType(int, null)
           handleIdentifier(await, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, await, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, await, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1467,7 +1467,7 @@
             handleType(int, null)
             handleIdentifier(await, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, await, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, await, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1495,7 +1495,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, await, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, await, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1520,7 +1520,7 @@
             handleType(int, null)
             handleIdentifier(await, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, await, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, await, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1548,7 +1548,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, await, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, await, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1576,7 +1576,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, await, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, await, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1601,7 +1601,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
           handleIdentifier(break, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, break, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, break, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1626,7 +1626,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
             handleIdentifier(break, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, break, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, break, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1655,7 +1655,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, break, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, break, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1681,7 +1681,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
             handleIdentifier(break, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, break, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, break, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1710,7 +1710,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, break, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, break, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1739,7 +1739,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, break, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, break, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1764,7 +1764,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
           handleIdentifier(case, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, case, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, case, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1789,7 +1789,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
             handleIdentifier(case, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, case, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, case, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1818,7 +1818,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, case, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, case, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1844,7 +1844,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
             handleIdentifier(case, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, case, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, case, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1873,7 +1873,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, case, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, case, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1902,7 +1902,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, case, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, case, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1927,7 +1927,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
           handleIdentifier(catch, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, catch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, catch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1952,7 +1952,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
             handleIdentifier(catch, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, catch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1981,7 +1981,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, catch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2007,7 +2007,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
             handleIdentifier(catch, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, catch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2036,7 +2036,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, catch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2065,7 +2065,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, catch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2090,7 +2090,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
           handleIdentifier(class, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, class, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, class, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2115,7 +2115,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
             handleIdentifier(class, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, class, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, class, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2144,7 +2144,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, class, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, class, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2170,7 +2170,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
             handleIdentifier(class, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, class, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, class, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2199,7 +2199,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, class, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, class, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2228,7 +2228,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, class, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, class, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2253,7 +2253,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
           handleIdentifier(const, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, const, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, const, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2278,7 +2278,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
             handleIdentifier(const, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, const, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, const, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2307,7 +2307,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, const, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, const, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2333,7 +2333,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
             handleIdentifier(const, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, const, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, const, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2362,7 +2362,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, const, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, const, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2391,7 +2391,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, const, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, const, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2416,7 +2416,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
           handleIdentifier(continue, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, continue, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, continue, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2441,7 +2441,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
             handleIdentifier(continue, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, continue, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continue, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2470,7 +2470,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, continue, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continue, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2496,7 +2496,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
             handleIdentifier(continue, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, continue, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continue, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2525,7 +2525,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, continue, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continue, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2554,7 +2554,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, continue, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continue, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2578,7 +2578,7 @@
           handleType(int, null)
           handleIdentifier(covariant, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, covariant, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, covariant, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2602,7 +2602,7 @@
             handleType(int, null)
             handleIdentifier(covariant, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, covariant, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariant, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2630,7 +2630,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, covariant, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariant, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2655,7 +2655,7 @@
             handleType(int, null)
             handleIdentifier(covariant, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, covariant, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariant, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2683,7 +2683,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, covariant, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariant, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2711,7 +2711,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, covariant, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariant, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2736,7 +2736,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
           handleIdentifier(default, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, default, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, default, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2761,7 +2761,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
             handleIdentifier(default, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, default, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, default, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2790,7 +2790,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, default, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, default, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2816,7 +2816,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
             handleIdentifier(default, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, default, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, default, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2845,7 +2845,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, default, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, default, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2874,7 +2874,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, default, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, default, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2898,7 +2898,7 @@
           handleType(int, null)
           handleIdentifier(deferred, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, deferred, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, deferred, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2922,7 +2922,7 @@
             handleType(int, null)
             handleIdentifier(deferred, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, deferred, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferred, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2950,7 +2950,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, deferred, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferred, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2975,7 +2975,7 @@
             handleType(int, null)
             handleIdentifier(deferred, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, deferred, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferred, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3003,7 +3003,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, deferred, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferred, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3031,7 +3031,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, deferred, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferred, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3056,7 +3056,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
           handleIdentifier(do, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, do, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, do, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3081,7 +3081,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
             handleIdentifier(do, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, do, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, do, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3110,7 +3110,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, do, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, do, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3136,7 +3136,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
             handleIdentifier(do, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, do, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, do, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3165,7 +3165,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, do, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, do, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3194,7 +3194,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, do, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, do, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3218,7 +3218,7 @@
           handleType(int, null)
           handleIdentifier(dynamic, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, dynamic, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, dynamic, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3242,7 +3242,7 @@
             handleType(int, null)
             handleIdentifier(dynamic, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, dynamic, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamic, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3270,7 +3270,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, dynamic, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamic, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3295,7 +3295,7 @@
             handleType(int, null)
             handleIdentifier(dynamic, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, dynamic, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamic, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3323,7 +3323,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, dynamic, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamic, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3351,7 +3351,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, dynamic, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamic, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3376,7 +3376,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
           handleIdentifier(else, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, else, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, else, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3401,7 +3401,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
             handleIdentifier(else, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, else, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, else, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3430,7 +3430,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, else, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, else, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3456,7 +3456,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
             handleIdentifier(else, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, else, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, else, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3485,7 +3485,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, else, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, else, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3514,7 +3514,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, else, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, else, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3539,7 +3539,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
           handleIdentifier(enum, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, enum, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, enum, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3564,7 +3564,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
             handleIdentifier(enum, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, enum, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enum, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3593,7 +3593,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, enum, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enum, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3619,7 +3619,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
             handleIdentifier(enum, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, enum, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enum, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3648,7 +3648,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, enum, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enum, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3677,7 +3677,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, enum, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enum, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3701,7 +3701,7 @@
           handleType(int, null)
           handleIdentifier(export, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, export, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, export, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3725,7 +3725,7 @@
             handleType(int, null)
             handleIdentifier(export, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, export, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, export, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3753,7 +3753,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, export, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, export, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3778,7 +3778,7 @@
             handleType(int, null)
             handleIdentifier(export, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, export, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, export, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3806,7 +3806,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, export, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, export, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3834,7 +3834,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, export, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, export, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3859,7 +3859,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
           handleIdentifier(extends, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, extends, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, extends, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3884,7 +3884,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
             handleIdentifier(extends, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, extends, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extends, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3913,7 +3913,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, extends, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extends, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3939,7 +3939,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
             handleIdentifier(extends, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, extends, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extends, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3968,7 +3968,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, extends, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extends, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3997,7 +3997,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, extends, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extends, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4021,7 +4021,7 @@
           handleType(int, null)
           handleIdentifier(extension, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, extension, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, extension, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4045,7 +4045,7 @@
             handleType(int, null)
             handleIdentifier(extension, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, extension, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extension, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4073,7 +4073,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, extension, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extension, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4098,7 +4098,7 @@
             handleType(int, null)
             handleIdentifier(extension, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, extension, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extension, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4126,7 +4126,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, extension, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extension, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4154,7 +4154,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, extension, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extension, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4178,7 +4178,7 @@
           handleType(int, null)
           handleIdentifier(external, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, external, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, external, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4202,7 +4202,7 @@
             handleType(int, null)
             handleIdentifier(external, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, external, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, external, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4230,7 +4230,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, external, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, external, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4255,7 +4255,7 @@
             handleType(int, null)
             handleIdentifier(external, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, external, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, external, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4283,7 +4283,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, external, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, external, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4311,7 +4311,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, external, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, external, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4335,7 +4335,7 @@
           handleType(int, null)
           handleIdentifier(factory, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, factory, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, factory, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4359,7 +4359,7 @@
             handleType(int, null)
             handleIdentifier(factory, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, factory, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factory, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4387,7 +4387,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, factory, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factory, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4412,7 +4412,7 @@
             handleType(int, null)
             handleIdentifier(factory, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, factory, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factory, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4440,7 +4440,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, factory, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factory, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4468,7 +4468,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, factory, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factory, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4493,7 +4493,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
           handleIdentifier(false, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, false, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, false, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4518,7 +4518,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
             handleIdentifier(false, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, false, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, false, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4547,7 +4547,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, false, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, false, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4573,7 +4573,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
             handleIdentifier(false, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, false, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, false, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4602,7 +4602,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, false, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, false, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4631,7 +4631,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, false, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, false, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4656,7 +4656,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
           handleIdentifier(final, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, final, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, final, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4681,7 +4681,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
             handleIdentifier(final, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, final, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, final, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4710,7 +4710,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, final, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, final, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4736,7 +4736,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
             handleIdentifier(final, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, final, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, final, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4765,7 +4765,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, final, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, final, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4794,7 +4794,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, final, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, final, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4819,7 +4819,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
           handleIdentifier(finally, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, finally, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, finally, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4844,7 +4844,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
             handleIdentifier(finally, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, finally, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finally, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4873,7 +4873,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, finally, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finally, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4899,7 +4899,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
             handleIdentifier(finally, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, finally, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finally, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4928,7 +4928,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, finally, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finally, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4957,7 +4957,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, finally, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finally, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4982,7 +4982,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
           handleIdentifier(for, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, for, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, for, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5007,7 +5007,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
             handleIdentifier(for, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, for, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, for, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5036,7 +5036,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, for, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, for, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5062,7 +5062,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
             handleIdentifier(for, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, for, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, for, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5091,7 +5091,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, for, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, for, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5120,7 +5120,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, for, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, for, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5144,7 +5144,7 @@
           handleType(int, null)
           handleIdentifier(Function, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, Function, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, Function, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5168,7 +5168,7 @@
             handleType(int, null)
             handleIdentifier(Function, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, Function, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, Function, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5196,7 +5196,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, Function, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, Function, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5221,7 +5221,7 @@
             handleType(int, null)
             handleIdentifier(Function, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, Function, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, Function, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5249,7 +5249,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, Function, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, Function, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5277,7 +5277,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, Function, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, Function, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5301,7 +5301,7 @@
           handleType(int, null)
           handleIdentifier(get, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, get, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, get, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5325,7 +5325,7 @@
             handleType(int, null)
             handleIdentifier(get, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, get, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, get, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5353,7 +5353,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, get, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, get, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5378,7 +5378,7 @@
             handleType(int, null)
             handleIdentifier(get, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, get, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, get, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5406,7 +5406,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, get, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, get, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5434,7 +5434,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, get, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, get, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5458,7 +5458,7 @@
           handleType(int, null)
           handleIdentifier(hide, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, hide, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, hide, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5482,7 +5482,7 @@
             handleType(int, null)
             handleIdentifier(hide, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, hide, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hide, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5510,7 +5510,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, hide, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hide, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5535,7 +5535,7 @@
             handleType(int, null)
             handleIdentifier(hide, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, hide, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hide, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5563,7 +5563,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, hide, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hide, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5591,7 +5591,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, hide, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hide, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5616,7 +5616,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
           handleIdentifier(if, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, if, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, if, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5641,7 +5641,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
             handleIdentifier(if, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, if, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, if, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5670,7 +5670,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, if, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, if, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5696,7 +5696,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
             handleIdentifier(if, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, if, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, if, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5725,7 +5725,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, if, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, if, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5754,7 +5754,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, if, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, if, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5778,7 +5778,7 @@
           handleType(int, null)
           handleIdentifier(implements, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, implements, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, implements, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5802,7 +5802,7 @@
             handleType(int, null)
             handleIdentifier(implements, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, implements, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implements, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5830,7 +5830,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, implements, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implements, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5855,7 +5855,7 @@
             handleType(int, null)
             handleIdentifier(implements, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, implements, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implements, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5883,7 +5883,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, implements, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implements, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5911,7 +5911,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, implements, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implements, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5935,7 +5935,7 @@
           handleType(int, null)
           handleIdentifier(import, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, import, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, import, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5959,7 +5959,7 @@
             handleType(int, null)
             handleIdentifier(import, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, import, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, import, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5987,7 +5987,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, import, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, import, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6012,7 +6012,7 @@
             handleType(int, null)
             handleIdentifier(import, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, import, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, import, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6040,7 +6040,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, import, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, import, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6068,7 +6068,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, import, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, import, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6093,7 +6093,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
           handleIdentifier(in, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, in, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, in, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6118,7 +6118,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
             handleIdentifier(in, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, in, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, in, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6147,7 +6147,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, in, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, in, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6173,7 +6173,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
             handleIdentifier(in, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, in, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, in, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6202,7 +6202,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, in, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, in, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6231,7 +6231,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, in, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, in, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6255,7 +6255,7 @@
           handleType(int, null)
           handleIdentifier(inout, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, inout, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, inout, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6279,7 +6279,7 @@
             handleType(int, null)
             handleIdentifier(inout, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, inout, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inout, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6307,7 +6307,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, inout, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inout, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6332,7 +6332,7 @@
             handleType(int, null)
             handleIdentifier(inout, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, inout, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inout, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6360,7 +6360,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, inout, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inout, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6388,7 +6388,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, inout, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inout, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6412,7 +6412,7 @@
           handleType(int, null)
           handleIdentifier(interface, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, interface, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, interface, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6436,7 +6436,7 @@
             handleType(int, null)
             handleIdentifier(interface, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, interface, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interface, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6464,7 +6464,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, interface, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interface, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6489,7 +6489,7 @@
             handleType(int, null)
             handleIdentifier(interface, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, interface, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interface, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6517,7 +6517,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, interface, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interface, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6545,7 +6545,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, interface, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interface, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6570,7 +6570,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
           handleIdentifier(is, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, is, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, is, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6595,7 +6595,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
             handleIdentifier(is, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, is, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, is, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6624,7 +6624,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, is, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, is, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6650,7 +6650,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
             handleIdentifier(is, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, is, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, is, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6679,7 +6679,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, is, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, is, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6708,7 +6708,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, is, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, is, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6732,7 +6732,7 @@
           handleType(int, null)
           handleIdentifier(late, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, late, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, late, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6756,7 +6756,7 @@
             handleType(int, null)
             handleIdentifier(late, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, late, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, late, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6784,7 +6784,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, late, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, late, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6809,7 +6809,7 @@
             handleType(int, null)
             handleIdentifier(late, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, late, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, late, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6837,7 +6837,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, late, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, late, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6865,7 +6865,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, late, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, late, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6889,7 +6889,7 @@
           handleType(int, null)
           handleIdentifier(library, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, library, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, library, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6913,7 +6913,7 @@
             handleType(int, null)
             handleIdentifier(library, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, library, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, library, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6941,7 +6941,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, library, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, library, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6966,7 +6966,7 @@
             handleType(int, null)
             handleIdentifier(library, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, library, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, library, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6994,7 +6994,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, library, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, library, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7022,7 +7022,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, library, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, library, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7046,7 +7046,7 @@
           handleType(int, null)
           handleIdentifier(mixin, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, mixin, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, mixin, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7070,7 +7070,7 @@
             handleType(int, null)
             handleIdentifier(mixin, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, mixin, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixin, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7098,7 +7098,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, mixin, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixin, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7123,7 +7123,7 @@
             handleType(int, null)
             handleIdentifier(mixin, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, mixin, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixin, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7151,7 +7151,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, mixin, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixin, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7179,7 +7179,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, mixin, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixin, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7203,7 +7203,7 @@
           handleType(int, null)
           handleIdentifier(native, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, native, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, native, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7227,7 +7227,7 @@
             handleType(int, null)
             handleIdentifier(native, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, native, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, native, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7255,7 +7255,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, native, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, native, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7280,7 +7280,7 @@
             handleType(int, null)
             handleIdentifier(native, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, native, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, native, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7308,7 +7308,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, native, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, native, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7336,7 +7336,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, native, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, native, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7361,7 +7361,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
           handleIdentifier(new, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, new, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, new, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7386,7 +7386,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
             handleIdentifier(new, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, new, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, new, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7415,7 +7415,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, new, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, new, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7441,7 +7441,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
             handleIdentifier(new, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, new, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, new, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7470,7 +7470,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, new, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, new, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7499,7 +7499,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, new, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, new, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7524,7 +7524,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
           handleIdentifier(null, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, null, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, null, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7549,7 +7549,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
             handleIdentifier(null, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, null, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, null, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7578,7 +7578,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, null, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, null, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7604,7 +7604,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
             handleIdentifier(null, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, null, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, null, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7633,7 +7633,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, null, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, null, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7662,7 +7662,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, null, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, null, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7686,7 +7686,7 @@
           handleType(int, null)
           handleIdentifier(of, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, of, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, of, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7710,7 +7710,7 @@
             handleType(int, null)
             handleIdentifier(of, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, of, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, of, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7738,7 +7738,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, of, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, of, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7763,7 +7763,7 @@
             handleType(int, null)
             handleIdentifier(of, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, of, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, of, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7791,7 +7791,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, of, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, of, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7819,7 +7819,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, of, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, of, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7843,7 +7843,7 @@
           handleType(int, null)
           handleIdentifier(on, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7867,7 +7867,7 @@
             handleType(int, null)
             handleIdentifier(on, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, on, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, on, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7895,7 +7895,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, on, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, on, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7920,7 +7920,7 @@
             handleType(int, null)
             handleIdentifier(on, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, on, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, on, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7948,7 +7948,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, on, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, on, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7976,7 +7976,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, on, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, on, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8000,7 +8000,7 @@
           handleType(int, null)
           handleIdentifier(operator, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, operator, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, operator, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8024,7 +8024,7 @@
             handleType(int, null)
             handleIdentifier(operator, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, operator, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operator, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8052,7 +8052,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, operator, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operator, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8077,7 +8077,7 @@
             handleType(int, null)
             handleIdentifier(operator, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, operator, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operator, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8105,7 +8105,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, operator, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operator, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8133,7 +8133,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, operator, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operator, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8157,7 +8157,7 @@
           handleType(int, null)
           handleIdentifier(out, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, out, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, out, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8181,7 +8181,7 @@
             handleType(int, null)
             handleIdentifier(out, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, out, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, out, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8209,7 +8209,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, out, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, out, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8234,7 +8234,7 @@
             handleType(int, null)
             handleIdentifier(out, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, out, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, out, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8262,7 +8262,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, out, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, out, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8290,7 +8290,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, out, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, out, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8314,7 +8314,7 @@
           handleType(int, null)
           handleIdentifier(part, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, part, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, part, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8338,7 +8338,7 @@
             handleType(int, null)
             handleIdentifier(part, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, part, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, part, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8366,7 +8366,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, part, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, part, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8391,7 +8391,7 @@
             handleType(int, null)
             handleIdentifier(part, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, part, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, part, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8419,7 +8419,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, part, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, part, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8447,7 +8447,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, part, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, part, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8471,7 +8471,7 @@
           handleType(int, null)
           handleIdentifier(patch, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, patch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, patch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8495,7 +8495,7 @@
             handleType(int, null)
             handleIdentifier(patch, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, patch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8523,7 +8523,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, patch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8548,7 +8548,7 @@
             handleType(int, null)
             handleIdentifier(patch, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, patch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8576,7 +8576,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, patch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8604,7 +8604,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, patch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8628,7 +8628,7 @@
           handleType(int, null)
           handleIdentifier(required, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, required, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, required, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8652,7 +8652,7 @@
             handleType(int, null)
             handleIdentifier(required, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, required, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, required, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8680,7 +8680,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, required, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, required, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8705,7 +8705,7 @@
             handleType(int, null)
             handleIdentifier(required, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, required, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, required, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8733,7 +8733,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, required, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, required, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8761,7 +8761,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, required, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, required, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8786,7 +8786,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
           handleIdentifier(rethrow, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, rethrow, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, rethrow, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8811,7 +8811,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
             handleIdentifier(rethrow, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, rethrow, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrow, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8840,7 +8840,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, rethrow, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrow, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8866,7 +8866,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
             handleIdentifier(rethrow, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, rethrow, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrow, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8895,7 +8895,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, rethrow, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrow, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8924,7 +8924,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, rethrow, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrow, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8949,7 +8949,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
           handleIdentifier(return, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, return, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, return, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8974,7 +8974,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
             handleIdentifier(return, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, return, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, return, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9003,7 +9003,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, return, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, return, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9029,7 +9029,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
             handleIdentifier(return, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, return, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, return, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9058,7 +9058,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, return, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, return, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9087,7 +9087,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, return, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, return, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9111,7 +9111,7 @@
           handleType(int, null)
           handleIdentifier(set, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, set, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, set, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9135,7 +9135,7 @@
             handleType(int, null)
             handleIdentifier(set, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, set, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, set, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9163,7 +9163,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, set, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, set, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9188,7 +9188,7 @@
             handleType(int, null)
             handleIdentifier(set, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, set, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, set, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9216,7 +9216,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, set, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, set, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9244,7 +9244,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, set, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, set, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9268,7 +9268,7 @@
           handleType(int, null)
           handleIdentifier(show, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, show, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, show, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9292,7 +9292,7 @@
             handleType(int, null)
             handleIdentifier(show, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, show, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, show, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9320,7 +9320,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, show, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, show, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9345,7 +9345,7 @@
             handleType(int, null)
             handleIdentifier(show, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, show, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, show, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9373,7 +9373,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, show, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, show, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9401,7 +9401,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, show, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, show, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9425,7 +9425,7 @@
           handleType(int, null)
           handleIdentifier(source, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, source, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, source, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9449,7 +9449,7 @@
             handleType(int, null)
             handleIdentifier(source, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, source, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, source, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9477,7 +9477,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, source, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, source, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9502,7 +9502,7 @@
             handleType(int, null)
             handleIdentifier(source, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, source, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, source, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9530,7 +9530,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, source, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, source, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9558,7 +9558,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, source, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, source, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9582,7 +9582,7 @@
           handleType(int, null)
           handleIdentifier(static, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, static, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, static, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9606,7 +9606,7 @@
             handleType(int, null)
             handleIdentifier(static, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, static, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, static, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9634,7 +9634,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, static, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, static, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9659,7 +9659,7 @@
             handleType(int, null)
             handleIdentifier(static, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, static, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, static, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9687,7 +9687,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, static, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, static, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9715,7 +9715,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, static, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, static, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9740,7 +9740,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
           handleIdentifier(super, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, super, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, super, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9765,7 +9765,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
             handleIdentifier(super, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, super, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, super, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9794,7 +9794,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, super, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, super, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9820,7 +9820,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
             handleIdentifier(super, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, super, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, super, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9849,7 +9849,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, super, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, super, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9878,7 +9878,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, super, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, super, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9903,7 +9903,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
           handleIdentifier(switch, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, switch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, switch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9928,7 +9928,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
             handleIdentifier(switch, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, switch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9957,7 +9957,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, switch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9983,7 +9983,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
             handleIdentifier(switch, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, switch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10012,7 +10012,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, switch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10041,7 +10041,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, switch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10065,7 +10065,7 @@
           handleType(int, null)
           handleIdentifier(sync, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, sync, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, sync, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10089,7 +10089,7 @@
             handleType(int, null)
             handleIdentifier(sync, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, sync, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sync, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10117,7 +10117,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, sync, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sync, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10142,7 +10142,7 @@
             handleType(int, null)
             handleIdentifier(sync, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, sync, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sync, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10170,7 +10170,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, sync, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sync, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10198,7 +10198,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, sync, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sync, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10223,7 +10223,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
           handleIdentifier(this, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, this, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, this, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10248,7 +10248,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
             handleIdentifier(this, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, this, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, this, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10277,7 +10277,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, this, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, this, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10303,7 +10303,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
             handleIdentifier(this, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, this, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, this, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10332,7 +10332,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, this, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, this, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10361,7 +10361,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, this, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, this, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10386,7 +10386,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
           handleIdentifier(throw, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, throw, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, throw, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10411,7 +10411,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
             handleIdentifier(throw, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, throw, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throw, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10440,7 +10440,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, throw, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throw, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10466,7 +10466,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
             handleIdentifier(throw, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, throw, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throw, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10495,7 +10495,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, throw, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throw, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10524,7 +10524,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, throw, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throw, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10549,7 +10549,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
           handleIdentifier(true, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, true, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, true, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10574,7 +10574,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
             handleIdentifier(true, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, true, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, true, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10603,7 +10603,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, true, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, true, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10629,7 +10629,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
             handleIdentifier(true, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, true, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, true, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10658,7 +10658,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, true, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, true, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10687,7 +10687,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, true, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, true, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10712,7 +10712,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
           handleIdentifier(try, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, try, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, try, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10737,7 +10737,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
             handleIdentifier(try, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, try, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, try, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10766,7 +10766,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, try, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, try, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10792,7 +10792,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
             handleIdentifier(try, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, try, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, try, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10821,7 +10821,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, try, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, try, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10850,7 +10850,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, try, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, try, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10874,7 +10874,7 @@
           handleType(int, null)
           handleIdentifier(typedef, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, typedef, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, typedef, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10898,7 +10898,7 @@
             handleType(int, null)
             handleIdentifier(typedef, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, typedef, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedef, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10926,7 +10926,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, typedef, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedef, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10951,7 +10951,7 @@
             handleType(int, null)
             handleIdentifier(typedef, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, typedef, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedef, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10979,7 +10979,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, typedef, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedef, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11007,7 +11007,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, typedef, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedef, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11032,7 +11032,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
           handleIdentifier(var, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, var, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, var, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -11057,7 +11057,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
             handleIdentifier(var, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, var, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, var, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11086,7 +11086,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, var, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, var, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11112,7 +11112,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
             handleIdentifier(var, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, var, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, var, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11141,7 +11141,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, var, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, var, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11170,7 +11170,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, var, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, var, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11195,7 +11195,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
           handleIdentifier(void, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, void, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, void, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -11220,7 +11220,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
             handleIdentifier(void, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, void, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, void, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11249,7 +11249,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, void, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, void, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11275,7 +11275,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
             handleIdentifier(void, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, void, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, void, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11304,7 +11304,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, void, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, void, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11333,7 +11333,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, void, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, void, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11358,7 +11358,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
           handleIdentifier(while, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, while, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, while, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -11383,7 +11383,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
             handleIdentifier(while, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, while, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, while, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11412,7 +11412,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, while, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, while, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11438,7 +11438,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
             handleIdentifier(while, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, while, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, while, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11467,7 +11467,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, while, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, while, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11496,7 +11496,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, while, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, while, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11521,7 +11521,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
           handleIdentifier(with, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, with, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, with, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -11546,7 +11546,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
             handleIdentifier(with, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, with, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, with, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11575,7 +11575,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, with, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, with, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11601,7 +11601,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
             handleIdentifier(with, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, with, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, with, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11630,7 +11630,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, with, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, with, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11659,7 +11659,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, with, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, with, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11683,7 +11683,7 @@
           handleType(int, null)
           handleIdentifier(yield, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, yield, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, yield, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -11707,7 +11707,7 @@
             handleType(int, null)
             handleIdentifier(yield, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, yield, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yield, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11735,7 +11735,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, yield, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yield, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11760,7 +11760,7 @@
             handleType(int, null)
             handleIdentifier(yield, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, yield, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yield, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11788,7 +11788,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, yield, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yield, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11816,7 +11816,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, yield, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yield, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter.dart.intertwined.expect
index 1412298..251738d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter.dart.intertwined.expect
@@ -31,7 +31,7 @@
                   inPlainSync()
                   listener: handleIdentifier(abstract, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, abstract, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, abstract, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -73,7 +73,7 @@
                     inPlainSync()
                     listener: handleIdentifier(abstract, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, abstract, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstract, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -125,7 +125,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, abstract, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstract, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -169,7 +169,7 @@
                     inPlainSync()
                     listener: handleIdentifier(abstract, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, abstract, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstract, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -221,7 +221,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, abstract, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstract, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -273,7 +273,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, abstract, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstract, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -315,7 +315,7 @@
                   inPlainSync()
                   listener: handleIdentifier(as, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, as, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, as, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -357,7 +357,7 @@
                     inPlainSync()
                     listener: handleIdentifier(as, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, as, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, as, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -409,7 +409,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, as, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, as, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -453,7 +453,7 @@
                     inPlainSync()
                     listener: handleIdentifier(as, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, as, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, as, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -505,7 +505,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, as, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, as, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -557,7 +557,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, as, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, as, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -600,7 +600,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
                   listener: handleIdentifier(assert, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, assert, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, assert, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -643,7 +643,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
                     listener: handleIdentifier(assert, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, assert, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assert, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -696,7 +696,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, assert, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assert, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -741,7 +741,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
                     listener: handleIdentifier(assert, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, assert, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assert, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -794,7 +794,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, assert, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assert, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -847,7 +847,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, assert, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assert, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -889,7 +889,7 @@
                   inPlainSync()
                   listener: handleIdentifier(async, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, async, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, async, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -931,7 +931,7 @@
                     inPlainSync()
                     listener: handleIdentifier(async, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, async, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, async, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -983,7 +983,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, async, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, async, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1027,7 +1027,7 @@
                     inPlainSync()
                     listener: handleIdentifier(async, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, async, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, async, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1079,7 +1079,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, async, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, async, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1131,7 +1131,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, async, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, async, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1173,7 +1173,7 @@
                   inPlainSync()
                   listener: handleIdentifier(await, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, await, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, await, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1215,7 +1215,7 @@
                     inPlainSync()
                     listener: handleIdentifier(await, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, await, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, await, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1267,7 +1267,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, await, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, await, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1311,7 +1311,7 @@
                     inPlainSync()
                     listener: handleIdentifier(await, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, await, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, await, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1363,7 +1363,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, await, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, await, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1415,7 +1415,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, await, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, await, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1458,7 +1458,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
                   listener: handleIdentifier(break, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, break, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, break, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1501,7 +1501,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
                     listener: handleIdentifier(break, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, break, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, break, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1554,7 +1554,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, break, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, break, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1599,7 +1599,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
                     listener: handleIdentifier(break, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, break, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, break, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1652,7 +1652,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, break, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, break, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1705,7 +1705,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, break, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, break, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1748,7 +1748,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
                   listener: handleIdentifier(case, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, case, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, case, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1791,7 +1791,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
                     listener: handleIdentifier(case, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, case, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, case, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1844,7 +1844,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, case, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, case, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1889,7 +1889,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
                     listener: handleIdentifier(case, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, case, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, case, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1942,7 +1942,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, case, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, case, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1995,7 +1995,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, case, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, case, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2038,7 +2038,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
                   listener: handleIdentifier(catch, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, catch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, catch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2081,7 +2081,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
                     listener: handleIdentifier(catch, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, catch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2134,7 +2134,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, catch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2179,7 +2179,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
                     listener: handleIdentifier(catch, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, catch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2232,7 +2232,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, catch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2285,7 +2285,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, catch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2328,7 +2328,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
                   listener: handleIdentifier(class, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, class, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, class, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2371,7 +2371,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
                     listener: handleIdentifier(class, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, class, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, class, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2424,7 +2424,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, class, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, class, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2469,7 +2469,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
                     listener: handleIdentifier(class, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, class, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, class, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2522,7 +2522,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, class, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, class, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2575,7 +2575,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, class, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, class, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2618,7 +2618,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
                   listener: handleIdentifier(const, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, const, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, const, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2661,7 +2661,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
                     listener: handleIdentifier(const, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, const, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, const, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2714,7 +2714,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, const, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, const, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2759,7 +2759,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
                     listener: handleIdentifier(const, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, const, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, const, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2812,7 +2812,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, const, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, const, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2865,7 +2865,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, const, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, const, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2908,7 +2908,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
                   listener: handleIdentifier(continue, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, continue, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, continue, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2951,7 +2951,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
                     listener: handleIdentifier(continue, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, continue, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continue, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3004,7 +3004,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, continue, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continue, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3049,7 +3049,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
                     listener: handleIdentifier(continue, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, continue, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continue, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3102,7 +3102,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, continue, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continue, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3155,7 +3155,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, continue, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continue, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3197,7 +3197,7 @@
                   inPlainSync()
                   listener: handleIdentifier(covariant, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, covariant, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, covariant, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3239,7 +3239,7 @@
                     inPlainSync()
                     listener: handleIdentifier(covariant, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, covariant, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariant, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3291,7 +3291,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, covariant, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariant, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3335,7 +3335,7 @@
                     inPlainSync()
                     listener: handleIdentifier(covariant, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, covariant, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariant, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3387,7 +3387,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, covariant, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariant, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3439,7 +3439,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, covariant, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariant, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3482,7 +3482,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
                   listener: handleIdentifier(default, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, default, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, default, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3525,7 +3525,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
                     listener: handleIdentifier(default, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, default, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, default, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3578,7 +3578,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, default, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, default, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3623,7 +3623,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
                     listener: handleIdentifier(default, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, default, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, default, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3676,7 +3676,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, default, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, default, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3729,7 +3729,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, default, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, default, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3771,7 +3771,7 @@
                   inPlainSync()
                   listener: handleIdentifier(deferred, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, deferred, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, deferred, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3813,7 +3813,7 @@
                     inPlainSync()
                     listener: handleIdentifier(deferred, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, deferred, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferred, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3865,7 +3865,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, deferred, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferred, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3909,7 +3909,7 @@
                     inPlainSync()
                     listener: handleIdentifier(deferred, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, deferred, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferred, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3961,7 +3961,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, deferred, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferred, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4013,7 +4013,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, deferred, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferred, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4056,7 +4056,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
                   listener: handleIdentifier(do, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, do, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, do, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4099,7 +4099,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
                     listener: handleIdentifier(do, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, do, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, do, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4152,7 +4152,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, do, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, do, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4197,7 +4197,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
                     listener: handleIdentifier(do, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, do, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, do, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4250,7 +4250,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, do, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, do, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4303,7 +4303,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, do, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, do, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4345,7 +4345,7 @@
                   inPlainSync()
                   listener: handleIdentifier(dynamic, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, dynamic, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, dynamic, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4387,7 +4387,7 @@
                     inPlainSync()
                     listener: handleIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, dynamic, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamic, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4439,7 +4439,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, dynamic, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamic, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4483,7 +4483,7 @@
                     inPlainSync()
                     listener: handleIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, dynamic, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamic, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4535,7 +4535,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, dynamic, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamic, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4587,7 +4587,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, dynamic, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamic, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4630,7 +4630,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
                   listener: handleIdentifier(else, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, else, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, else, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4673,7 +4673,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
                     listener: handleIdentifier(else, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, else, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, else, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4726,7 +4726,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, else, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, else, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4771,7 +4771,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
                     listener: handleIdentifier(else, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, else, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, else, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4824,7 +4824,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, else, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, else, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4877,7 +4877,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, else, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, else, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4920,7 +4920,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
                   listener: handleIdentifier(enum, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, enum, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, enum, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4963,7 +4963,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
                     listener: handleIdentifier(enum, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, enum, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enum, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5016,7 +5016,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, enum, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enum, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5061,7 +5061,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
                     listener: handleIdentifier(enum, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, enum, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enum, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5114,7 +5114,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, enum, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enum, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5167,7 +5167,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, enum, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enum, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5209,7 +5209,7 @@
                   inPlainSync()
                   listener: handleIdentifier(export, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, export, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, export, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5251,7 +5251,7 @@
                     inPlainSync()
                     listener: handleIdentifier(export, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, export, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, export, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5303,7 +5303,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, export, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, export, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5347,7 +5347,7 @@
                     inPlainSync()
                     listener: handleIdentifier(export, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, export, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, export, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5399,7 +5399,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, export, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, export, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5451,7 +5451,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, export, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, export, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5494,7 +5494,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
                   listener: handleIdentifier(extends, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, extends, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, extends, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5537,7 +5537,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
                     listener: handleIdentifier(extends, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, extends, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extends, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5590,7 +5590,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, extends, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extends, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5635,7 +5635,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
                     listener: handleIdentifier(extends, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, extends, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extends, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5688,7 +5688,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, extends, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extends, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5741,7 +5741,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, extends, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extends, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5783,7 +5783,7 @@
                   inPlainSync()
                   listener: handleIdentifier(extension, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, extension, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, extension, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5825,7 +5825,7 @@
                     inPlainSync()
                     listener: handleIdentifier(extension, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, extension, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extension, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5877,7 +5877,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, extension, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extension, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5921,7 +5921,7 @@
                     inPlainSync()
                     listener: handleIdentifier(extension, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, extension, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extension, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5973,7 +5973,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, extension, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extension, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6025,7 +6025,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, extension, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extension, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6067,7 +6067,7 @@
                   inPlainSync()
                   listener: handleIdentifier(external, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, external, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, external, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6109,7 +6109,7 @@
                     inPlainSync()
                     listener: handleIdentifier(external, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, external, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, external, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6161,7 +6161,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, external, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, external, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6205,7 +6205,7 @@
                     inPlainSync()
                     listener: handleIdentifier(external, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, external, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, external, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6257,7 +6257,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, external, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, external, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6309,7 +6309,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, external, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, external, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6351,7 +6351,7 @@
                   inPlainSync()
                   listener: handleIdentifier(factory, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, factory, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, factory, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6393,7 +6393,7 @@
                     inPlainSync()
                     listener: handleIdentifier(factory, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, factory, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factory, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6445,7 +6445,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, factory, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factory, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6489,7 +6489,7 @@
                     inPlainSync()
                     listener: handleIdentifier(factory, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, factory, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factory, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6541,7 +6541,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, factory, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factory, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6593,7 +6593,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, factory, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factory, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6636,7 +6636,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
                   listener: handleIdentifier(false, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, false, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, false, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6679,7 +6679,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
                     listener: handleIdentifier(false, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, false, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, false, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6732,7 +6732,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, false, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, false, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6777,7 +6777,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
                     listener: handleIdentifier(false, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, false, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, false, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6830,7 +6830,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, false, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, false, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6883,7 +6883,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, false, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, false, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6926,7 +6926,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
                   listener: handleIdentifier(final, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, final, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, final, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6969,7 +6969,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
                     listener: handleIdentifier(final, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, final, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, final, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7022,7 +7022,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, final, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, final, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7067,7 +7067,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
                     listener: handleIdentifier(final, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, final, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, final, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7120,7 +7120,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, final, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, final, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7173,7 +7173,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, final, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, final, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7216,7 +7216,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
                   listener: handleIdentifier(finally, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, finally, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, finally, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7259,7 +7259,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
                     listener: handleIdentifier(finally, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, finally, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finally, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7312,7 +7312,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, finally, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finally, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7357,7 +7357,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
                     listener: handleIdentifier(finally, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, finally, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finally, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7410,7 +7410,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, finally, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finally, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7463,7 +7463,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, finally, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finally, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7506,7 +7506,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
                   listener: handleIdentifier(for, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, for, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, for, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7549,7 +7549,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
                     listener: handleIdentifier(for, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, for, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, for, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7602,7 +7602,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, for, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, for, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7647,7 +7647,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
                     listener: handleIdentifier(for, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, for, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, for, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7700,7 +7700,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, for, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, for, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7753,7 +7753,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, for, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, for, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7795,7 +7795,7 @@
                   inPlainSync()
                   listener: handleIdentifier(Function, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, Function, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, Function, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7837,7 +7837,7 @@
                     inPlainSync()
                     listener: handleIdentifier(Function, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, Function, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, Function, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7889,7 +7889,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, Function, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, Function, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7933,7 +7933,7 @@
                     inPlainSync()
                     listener: handleIdentifier(Function, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, Function, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, Function, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7985,7 +7985,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, Function, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, Function, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8037,7 +8037,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, Function, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, Function, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8079,7 +8079,7 @@
                   inPlainSync()
                   listener: handleIdentifier(get, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, get, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, get, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8121,7 +8121,7 @@
                     inPlainSync()
                     listener: handleIdentifier(get, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, get, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, get, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8173,7 +8173,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, get, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, get, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8217,7 +8217,7 @@
                     inPlainSync()
                     listener: handleIdentifier(get, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, get, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, get, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8269,7 +8269,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, get, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, get, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8321,7 +8321,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, get, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, get, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8363,7 +8363,7 @@
                   inPlainSync()
                   listener: handleIdentifier(hide, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, hide, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, hide, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8405,7 +8405,7 @@
                     inPlainSync()
                     listener: handleIdentifier(hide, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, hide, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hide, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8457,7 +8457,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, hide, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hide, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8501,7 +8501,7 @@
                     inPlainSync()
                     listener: handleIdentifier(hide, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, hide, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hide, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8553,7 +8553,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, hide, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hide, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8605,7 +8605,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, hide, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hide, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8648,7 +8648,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
                   listener: handleIdentifier(if, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, if, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, if, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8691,7 +8691,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
                     listener: handleIdentifier(if, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, if, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, if, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8744,7 +8744,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, if, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, if, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8789,7 +8789,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
                     listener: handleIdentifier(if, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, if, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, if, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8842,7 +8842,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, if, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, if, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8895,7 +8895,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, if, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, if, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8937,7 +8937,7 @@
                   inPlainSync()
                   listener: handleIdentifier(implements, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, implements, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, implements, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8979,7 +8979,7 @@
                     inPlainSync()
                     listener: handleIdentifier(implements, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, implements, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implements, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9031,7 +9031,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, implements, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implements, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9075,7 +9075,7 @@
                     inPlainSync()
                     listener: handleIdentifier(implements, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, implements, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implements, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9127,7 +9127,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, implements, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implements, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9179,7 +9179,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, implements, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implements, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9221,7 +9221,7 @@
                   inPlainSync()
                   listener: handleIdentifier(import, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, import, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, import, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9263,7 +9263,7 @@
                     inPlainSync()
                     listener: handleIdentifier(import, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, import, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, import, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9315,7 +9315,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, import, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, import, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9359,7 +9359,7 @@
                     inPlainSync()
                     listener: handleIdentifier(import, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, import, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, import, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9411,7 +9411,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, import, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, import, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9463,7 +9463,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, import, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, import, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9506,7 +9506,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
                   listener: handleIdentifier(in, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, in, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, in, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9549,7 +9549,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
                     listener: handleIdentifier(in, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, in, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, in, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9602,7 +9602,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, in, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, in, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9647,7 +9647,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
                     listener: handleIdentifier(in, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, in, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, in, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9700,7 +9700,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, in, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, in, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9753,7 +9753,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, in, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, in, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9795,7 +9795,7 @@
                   inPlainSync()
                   listener: handleIdentifier(inout, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, inout, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, inout, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9837,7 +9837,7 @@
                     inPlainSync()
                     listener: handleIdentifier(inout, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, inout, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inout, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9889,7 +9889,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, inout, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inout, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9933,7 +9933,7 @@
                     inPlainSync()
                     listener: handleIdentifier(inout, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, inout, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inout, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9985,7 +9985,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, inout, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inout, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10037,7 +10037,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, inout, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inout, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10079,7 +10079,7 @@
                   inPlainSync()
                   listener: handleIdentifier(interface, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, interface, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, interface, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10121,7 +10121,7 @@
                     inPlainSync()
                     listener: handleIdentifier(interface, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, interface, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interface, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10173,7 +10173,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, interface, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interface, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10217,7 +10217,7 @@
                     inPlainSync()
                     listener: handleIdentifier(interface, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, interface, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interface, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10269,7 +10269,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, interface, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interface, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10321,7 +10321,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, interface, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interface, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10364,7 +10364,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
                   listener: handleIdentifier(is, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, is, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, is, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10407,7 +10407,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
                     listener: handleIdentifier(is, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, is, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, is, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10460,7 +10460,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, is, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, is, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10505,7 +10505,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
                     listener: handleIdentifier(is, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, is, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, is, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10558,7 +10558,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, is, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, is, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10611,7 +10611,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, is, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, is, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10653,7 +10653,7 @@
                   inPlainSync()
                   listener: handleIdentifier(late, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, late, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, late, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10695,7 +10695,7 @@
                     inPlainSync()
                     listener: handleIdentifier(late, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, late, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, late, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10747,7 +10747,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, late, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, late, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10791,7 +10791,7 @@
                     inPlainSync()
                     listener: handleIdentifier(late, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, late, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, late, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10843,7 +10843,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, late, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, late, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10895,7 +10895,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, late, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, late, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10937,7 +10937,7 @@
                   inPlainSync()
                   listener: handleIdentifier(library, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, library, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, library, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10979,7 +10979,7 @@
                     inPlainSync()
                     listener: handleIdentifier(library, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, library, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, library, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11031,7 +11031,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, library, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, library, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11075,7 +11075,7 @@
                     inPlainSync()
                     listener: handleIdentifier(library, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, library, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, library, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11127,7 +11127,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, library, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, library, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11179,7 +11179,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, library, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, library, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11221,7 +11221,7 @@
                   inPlainSync()
                   listener: handleIdentifier(mixin, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, mixin, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, mixin, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -11263,7 +11263,7 @@
                     inPlainSync()
                     listener: handleIdentifier(mixin, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, mixin, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixin, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11315,7 +11315,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, mixin, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixin, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11359,7 +11359,7 @@
                     inPlainSync()
                     listener: handleIdentifier(mixin, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, mixin, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixin, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11411,7 +11411,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, mixin, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixin, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11463,7 +11463,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, mixin, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixin, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11505,7 +11505,7 @@
                   inPlainSync()
                   listener: handleIdentifier(native, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, native, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, native, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -11547,7 +11547,7 @@
                     inPlainSync()
                     listener: handleIdentifier(native, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, native, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, native, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11599,7 +11599,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, native, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, native, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11643,7 +11643,7 @@
                     inPlainSync()
                     listener: handleIdentifier(native, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, native, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, native, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11695,7 +11695,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, native, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, native, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11747,7 +11747,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, native, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, native, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11790,7 +11790,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
                   listener: handleIdentifier(new, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, new, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, new, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -11833,7 +11833,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
                     listener: handleIdentifier(new, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, new, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, new, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11886,7 +11886,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, new, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, new, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11931,7 +11931,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
                     listener: handleIdentifier(new, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, new, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, new, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11984,7 +11984,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, new, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, new, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12037,7 +12037,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, new, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, new, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12080,7 +12080,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
                   listener: handleIdentifier(null, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, null, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, null, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -12123,7 +12123,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
                     listener: handleIdentifier(null, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, null, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, null, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12176,7 +12176,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, null, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, null, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12221,7 +12221,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
                     listener: handleIdentifier(null, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, null, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, null, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12274,7 +12274,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, null, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, null, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12327,7 +12327,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, null, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, null, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12369,7 +12369,7 @@
                   inPlainSync()
                   listener: handleIdentifier(of, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, of, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, of, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -12411,7 +12411,7 @@
                     inPlainSync()
                     listener: handleIdentifier(of, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, of, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, of, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12463,7 +12463,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, of, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, of, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12507,7 +12507,7 @@
                     inPlainSync()
                     listener: handleIdentifier(of, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, of, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, of, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12559,7 +12559,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, of, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, of, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12611,7 +12611,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, of, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, of, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12653,7 +12653,7 @@
                   inPlainSync()
                   listener: handleIdentifier(on, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -12695,7 +12695,7 @@
                     inPlainSync()
                     listener: handleIdentifier(on, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, on, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, on, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12747,7 +12747,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, on, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, on, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12791,7 +12791,7 @@
                     inPlainSync()
                     listener: handleIdentifier(on, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, on, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, on, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12843,7 +12843,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, on, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, on, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12895,7 +12895,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, on, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, on, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12937,7 +12937,7 @@
                   inPlainSync()
                   listener: handleIdentifier(operator, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, operator, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, operator, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -12979,7 +12979,7 @@
                     inPlainSync()
                     listener: handleIdentifier(operator, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, operator, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operator, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13031,7 +13031,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, operator, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operator, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13075,7 +13075,7 @@
                     inPlainSync()
                     listener: handleIdentifier(operator, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, operator, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operator, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13127,7 +13127,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, operator, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operator, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13179,7 +13179,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, operator, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operator, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13221,7 +13221,7 @@
                   inPlainSync()
                   listener: handleIdentifier(out, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, out, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, out, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -13263,7 +13263,7 @@
                     inPlainSync()
                     listener: handleIdentifier(out, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, out, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, out, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13315,7 +13315,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, out, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, out, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13359,7 +13359,7 @@
                     inPlainSync()
                     listener: handleIdentifier(out, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, out, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, out, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13411,7 +13411,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, out, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, out, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13463,7 +13463,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, out, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, out, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13505,7 +13505,7 @@
                   inPlainSync()
                   listener: handleIdentifier(part, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, part, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, part, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -13547,7 +13547,7 @@
                     inPlainSync()
                     listener: handleIdentifier(part, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, part, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, part, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13599,7 +13599,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, part, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, part, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13643,7 +13643,7 @@
                     inPlainSync()
                     listener: handleIdentifier(part, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, part, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, part, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13695,7 +13695,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, part, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, part, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13747,7 +13747,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, part, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, part, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13789,7 +13789,7 @@
                   inPlainSync()
                   listener: handleIdentifier(patch, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, patch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, patch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -13831,7 +13831,7 @@
                     inPlainSync()
                     listener: handleIdentifier(patch, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, patch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13883,7 +13883,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, patch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13927,7 +13927,7 @@
                     inPlainSync()
                     listener: handleIdentifier(patch, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, patch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13979,7 +13979,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, patch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14031,7 +14031,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, patch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14073,7 +14073,7 @@
                   inPlainSync()
                   listener: handleIdentifier(required, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, required, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, required, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -14115,7 +14115,7 @@
                     inPlainSync()
                     listener: handleIdentifier(required, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, required, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, required, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14167,7 +14167,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, required, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, required, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14211,7 +14211,7 @@
                     inPlainSync()
                     listener: handleIdentifier(required, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, required, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, required, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14263,7 +14263,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, required, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, required, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14315,7 +14315,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, required, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, required, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14358,7 +14358,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
                   listener: handleIdentifier(rethrow, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, rethrow, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, rethrow, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -14401,7 +14401,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
                     listener: handleIdentifier(rethrow, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, rethrow, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrow, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14454,7 +14454,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, rethrow, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrow, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14499,7 +14499,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
                     listener: handleIdentifier(rethrow, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, rethrow, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrow, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14552,7 +14552,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, rethrow, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrow, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14605,7 +14605,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, rethrow, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrow, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14648,7 +14648,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
                   listener: handleIdentifier(return, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, return, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, return, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -14691,7 +14691,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
                     listener: handleIdentifier(return, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, return, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, return, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14744,7 +14744,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, return, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, return, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14789,7 +14789,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
                     listener: handleIdentifier(return, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, return, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, return, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14842,7 +14842,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, return, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, return, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14895,7 +14895,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, return, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, return, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14937,7 +14937,7 @@
                   inPlainSync()
                   listener: handleIdentifier(set, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, set, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, set, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -14979,7 +14979,7 @@
                     inPlainSync()
                     listener: handleIdentifier(set, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, set, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, set, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15031,7 +15031,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, set, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, set, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15075,7 +15075,7 @@
                     inPlainSync()
                     listener: handleIdentifier(set, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, set, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, set, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15127,7 +15127,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, set, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, set, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15179,7 +15179,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, set, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, set, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15221,7 +15221,7 @@
                   inPlainSync()
                   listener: handleIdentifier(show, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, show, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, show, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -15263,7 +15263,7 @@
                     inPlainSync()
                     listener: handleIdentifier(show, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, show, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, show, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15315,7 +15315,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, show, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, show, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15359,7 +15359,7 @@
                     inPlainSync()
                     listener: handleIdentifier(show, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, show, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, show, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15411,7 +15411,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, show, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, show, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15463,7 +15463,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, show, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, show, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15505,7 +15505,7 @@
                   inPlainSync()
                   listener: handleIdentifier(source, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, source, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, source, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -15547,7 +15547,7 @@
                     inPlainSync()
                     listener: handleIdentifier(source, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, source, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, source, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15599,7 +15599,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, source, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, source, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15643,7 +15643,7 @@
                     inPlainSync()
                     listener: handleIdentifier(source, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, source, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, source, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15695,7 +15695,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, source, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, source, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15747,7 +15747,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, source, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, source, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15789,7 +15789,7 @@
                   inPlainSync()
                   listener: handleIdentifier(static, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, static, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, static, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -15831,7 +15831,7 @@
                     inPlainSync()
                     listener: handleIdentifier(static, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, static, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, static, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15883,7 +15883,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, static, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, static, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15927,7 +15927,7 @@
                     inPlainSync()
                     listener: handleIdentifier(static, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, static, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, static, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15979,7 +15979,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, static, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, static, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16031,7 +16031,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, static, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, static, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16074,7 +16074,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
                   listener: handleIdentifier(super, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, super, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, super, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -16117,7 +16117,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
                     listener: handleIdentifier(super, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, super, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, super, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16170,7 +16170,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, super, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, super, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16215,7 +16215,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
                     listener: handleIdentifier(super, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, super, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, super, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16268,7 +16268,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, super, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, super, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16321,7 +16321,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, super, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, super, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16364,7 +16364,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
                   listener: handleIdentifier(switch, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, switch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, switch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -16407,7 +16407,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
                     listener: handleIdentifier(switch, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, switch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16460,7 +16460,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, switch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16505,7 +16505,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
                     listener: handleIdentifier(switch, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, switch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16558,7 +16558,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, switch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16611,7 +16611,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, switch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16653,7 +16653,7 @@
                   inPlainSync()
                   listener: handleIdentifier(sync, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, sync, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, sync, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -16695,7 +16695,7 @@
                     inPlainSync()
                     listener: handleIdentifier(sync, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, sync, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sync, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16747,7 +16747,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, sync, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sync, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16791,7 +16791,7 @@
                     inPlainSync()
                     listener: handleIdentifier(sync, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, sync, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sync, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16843,7 +16843,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, sync, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sync, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16895,7 +16895,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, sync, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sync, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16938,7 +16938,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
                   listener: handleIdentifier(this, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, this, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, this, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -16981,7 +16981,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
                     listener: handleIdentifier(this, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, this, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, this, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17034,7 +17034,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, this, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, this, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17079,7 +17079,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
                     listener: handleIdentifier(this, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, this, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, this, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17132,7 +17132,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, this, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, this, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17185,7 +17185,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, this, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, this, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17228,7 +17228,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
                   listener: handleIdentifier(throw, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, throw, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, throw, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -17271,7 +17271,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
                     listener: handleIdentifier(throw, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, throw, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throw, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17324,7 +17324,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, throw, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throw, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17369,7 +17369,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
                     listener: handleIdentifier(throw, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, throw, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throw, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17422,7 +17422,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, throw, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throw, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17475,7 +17475,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, throw, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throw, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17518,7 +17518,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
                   listener: handleIdentifier(true, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, true, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, true, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -17561,7 +17561,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
                     listener: handleIdentifier(true, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, true, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, true, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17614,7 +17614,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, true, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, true, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17659,7 +17659,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
                     listener: handleIdentifier(true, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, true, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, true, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17712,7 +17712,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, true, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, true, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17765,7 +17765,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, true, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, true, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17808,7 +17808,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
                   listener: handleIdentifier(try, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, try, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, try, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -17851,7 +17851,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
                     listener: handleIdentifier(try, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, try, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, try, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17904,7 +17904,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, try, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, try, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17949,7 +17949,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
                     listener: handleIdentifier(try, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, try, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, try, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18002,7 +18002,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, try, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, try, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18055,7 +18055,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, try, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, try, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18097,7 +18097,7 @@
                   inPlainSync()
                   listener: handleIdentifier(typedef, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, typedef, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, typedef, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -18139,7 +18139,7 @@
                     inPlainSync()
                     listener: handleIdentifier(typedef, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, typedef, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedef, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18191,7 +18191,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, typedef, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedef, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18235,7 +18235,7 @@
                     inPlainSync()
                     listener: handleIdentifier(typedef, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, typedef, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedef, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18287,7 +18287,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, typedef, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedef, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18339,7 +18339,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, typedef, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedef, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18382,7 +18382,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
                   listener: handleIdentifier(var, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, var, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, var, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -18425,7 +18425,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
                     listener: handleIdentifier(var, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, var, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, var, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18478,7 +18478,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, var, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, var, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18523,7 +18523,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
                     listener: handleIdentifier(var, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, var, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, var, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18576,7 +18576,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, var, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, var, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18629,7 +18629,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, var, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, var, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18672,7 +18672,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
                   listener: handleIdentifier(void, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, void, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, void, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -18715,7 +18715,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
                     listener: handleIdentifier(void, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, void, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, void, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18768,7 +18768,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, void, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, void, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18813,7 +18813,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
                     listener: handleIdentifier(void, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, void, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, void, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18866,7 +18866,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, void, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, void, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18919,7 +18919,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, void, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, void, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18962,7 +18962,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
                   listener: handleIdentifier(while, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, while, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, while, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -19005,7 +19005,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
                     listener: handleIdentifier(while, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, while, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, while, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19058,7 +19058,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, while, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, while, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19103,7 +19103,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
                     listener: handleIdentifier(while, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, while, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, while, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19156,7 +19156,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, while, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, while, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19209,7 +19209,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, while, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, while, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19252,7 +19252,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
                   listener: handleIdentifier(with, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, with, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, with, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -19295,7 +19295,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
                     listener: handleIdentifier(with, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, with, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, with, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19348,7 +19348,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, with, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, with, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19393,7 +19393,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
                     listener: handleIdentifier(with, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, with, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, with, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19446,7 +19446,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, with, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, with, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19499,7 +19499,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, with, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, with, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19541,7 +19541,7 @@
                   inPlainSync()
                   listener: handleIdentifier(yield, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, yield, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, yield, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -19583,7 +19583,7 @@
                     inPlainSync()
                     listener: handleIdentifier(yield, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, yield, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yield, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19635,7 +19635,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, yield, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yield, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19679,7 +19679,7 @@
                     inPlainSync()
                     listener: handleIdentifier(yield, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, yield, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yield, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19731,7 +19731,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, yield, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yield, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19783,7 +19783,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, yield, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yield, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_prime.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_prime.dart.expect
index 4f09074..402c2ea 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_prime.dart.expect
@@ -15,7 +15,7 @@
           handleType(int, null)
           handleIdentifier(abstractX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, abstractX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, abstractX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -39,7 +39,7 @@
             handleType(int, null)
             handleIdentifier(abstractX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, abstractX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstractX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -67,7 +67,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, abstractX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstractX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -92,7 +92,7 @@
             handleType(int, null)
             handleIdentifier(abstractX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, abstractX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstractX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -120,7 +120,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, abstractX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstractX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -148,7 +148,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, abstractX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstractX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -172,7 +172,7 @@
           handleType(int, null)
           handleIdentifier(asX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, asX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, asX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -196,7 +196,7 @@
             handleType(int, null)
             handleIdentifier(asX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, asX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -224,7 +224,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, asX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -249,7 +249,7 @@
             handleType(int, null)
             handleIdentifier(asX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, asX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -277,7 +277,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, asX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -305,7 +305,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, asX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -329,7 +329,7 @@
           handleType(int, null)
           handleIdentifier(assertX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, assertX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, assertX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -353,7 +353,7 @@
             handleType(int, null)
             handleIdentifier(assertX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, assertX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assertX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -381,7 +381,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, assertX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assertX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -406,7 +406,7 @@
             handleType(int, null)
             handleIdentifier(assertX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, assertX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assertX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -434,7 +434,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, assertX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assertX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -462,7 +462,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, assertX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assertX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -486,7 +486,7 @@
           handleType(int, null)
           handleIdentifier(asyncX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, asyncX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, asyncX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -510,7 +510,7 @@
             handleType(int, null)
             handleIdentifier(asyncX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, asyncX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asyncX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -538,7 +538,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, asyncX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asyncX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -563,7 +563,7 @@
             handleType(int, null)
             handleIdentifier(asyncX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, asyncX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asyncX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -591,7 +591,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, asyncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asyncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -619,7 +619,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, asyncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asyncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -643,7 +643,7 @@
           handleType(int, null)
           handleIdentifier(awaitX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, awaitX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, awaitX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -667,7 +667,7 @@
             handleType(int, null)
             handleIdentifier(awaitX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, awaitX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, awaitX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -695,7 +695,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, awaitX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, awaitX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -720,7 +720,7 @@
             handleType(int, null)
             handleIdentifier(awaitX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, awaitX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, awaitX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -748,7 +748,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, awaitX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, awaitX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -776,7 +776,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, awaitX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, awaitX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -800,7 +800,7 @@
           handleType(int, null)
           handleIdentifier(breakX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, breakX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, breakX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -824,7 +824,7 @@
             handleType(int, null)
             handleIdentifier(breakX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, breakX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, breakX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -852,7 +852,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, breakX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, breakX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -877,7 +877,7 @@
             handleType(int, null)
             handleIdentifier(breakX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, breakX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, breakX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -905,7 +905,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, breakX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, breakX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -933,7 +933,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, breakX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, breakX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -957,7 +957,7 @@
           handleType(int, null)
           handleIdentifier(caseX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, caseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, caseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -981,7 +981,7 @@
             handleType(int, null)
             handleIdentifier(caseX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, caseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, caseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1009,7 +1009,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, caseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, caseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1034,7 +1034,7 @@
             handleType(int, null)
             handleIdentifier(caseX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, caseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, caseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1062,7 +1062,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, caseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, caseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1090,7 +1090,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, caseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, caseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1114,7 +1114,7 @@
           handleType(int, null)
           handleIdentifier(catchX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, catchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, catchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1138,7 +1138,7 @@
             handleType(int, null)
             handleIdentifier(catchX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, catchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1166,7 +1166,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, catchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1191,7 +1191,7 @@
             handleType(int, null)
             handleIdentifier(catchX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, catchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1219,7 +1219,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, catchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1247,7 +1247,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, catchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1271,7 +1271,7 @@
           handleType(int, null)
           handleIdentifier(classX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, classX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, classX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1295,7 +1295,7 @@
             handleType(int, null)
             handleIdentifier(classX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, classX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, classX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1323,7 +1323,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, classX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, classX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1348,7 +1348,7 @@
             handleType(int, null)
             handleIdentifier(classX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, classX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, classX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1376,7 +1376,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, classX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, classX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1404,7 +1404,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, classX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, classX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1428,7 +1428,7 @@
           handleType(int, null)
           handleIdentifier(constX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, constX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, constX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1452,7 +1452,7 @@
             handleType(int, null)
             handleIdentifier(constX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, constX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, constX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1480,7 +1480,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, constX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, constX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1505,7 +1505,7 @@
             handleType(int, null)
             handleIdentifier(constX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, constX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, constX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1533,7 +1533,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, constX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, constX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1561,7 +1561,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, constX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, constX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1585,7 +1585,7 @@
           handleType(int, null)
           handleIdentifier(continueX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, continueX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, continueX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1609,7 +1609,7 @@
             handleType(int, null)
             handleIdentifier(continueX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, continueX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continueX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1637,7 +1637,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, continueX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continueX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1662,7 +1662,7 @@
             handleType(int, null)
             handleIdentifier(continueX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, continueX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continueX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1690,7 +1690,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, continueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1718,7 +1718,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, continueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1742,7 +1742,7 @@
           handleType(int, null)
           handleIdentifier(covariantX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, covariantX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, covariantX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1766,7 +1766,7 @@
             handleType(int, null)
             handleIdentifier(covariantX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, covariantX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariantX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1794,7 +1794,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, covariantX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariantX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1819,7 +1819,7 @@
             handleType(int, null)
             handleIdentifier(covariantX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, covariantX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariantX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1847,7 +1847,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, covariantX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariantX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1875,7 +1875,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, covariantX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariantX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1899,7 +1899,7 @@
           handleType(int, null)
           handleIdentifier(defaultX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, defaultX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, defaultX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1923,7 +1923,7 @@
             handleType(int, null)
             handleIdentifier(defaultX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, defaultX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, defaultX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1951,7 +1951,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, defaultX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, defaultX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1976,7 +1976,7 @@
             handleType(int, null)
             handleIdentifier(defaultX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, defaultX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, defaultX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2004,7 +2004,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, defaultX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, defaultX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2032,7 +2032,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, defaultX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, defaultX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2056,7 +2056,7 @@
           handleType(int, null)
           handleIdentifier(deferredX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, deferredX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, deferredX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2080,7 +2080,7 @@
             handleType(int, null)
             handleIdentifier(deferredX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, deferredX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferredX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2108,7 +2108,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, deferredX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferredX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2133,7 +2133,7 @@
             handleType(int, null)
             handleIdentifier(deferredX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, deferredX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferredX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2161,7 +2161,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, deferredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2189,7 +2189,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, deferredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2213,7 +2213,7 @@
           handleType(int, null)
           handleIdentifier(doX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, doX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, doX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2237,7 +2237,7 @@
             handleType(int, null)
             handleIdentifier(doX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, doX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, doX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2265,7 +2265,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, doX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, doX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2290,7 +2290,7 @@
             handleType(int, null)
             handleIdentifier(doX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, doX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, doX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2318,7 +2318,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, doX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, doX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2346,7 +2346,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, doX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, doX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2370,7 +2370,7 @@
           handleType(int, null)
           handleIdentifier(dynamicX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, dynamicX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, dynamicX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2394,7 +2394,7 @@
             handleType(int, null)
             handleIdentifier(dynamicX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, dynamicX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamicX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2422,7 +2422,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, dynamicX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamicX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2447,7 +2447,7 @@
             handleType(int, null)
             handleIdentifier(dynamicX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, dynamicX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamicX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2475,7 +2475,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, dynamicX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamicX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2503,7 +2503,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, dynamicX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamicX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2527,7 +2527,7 @@
           handleType(int, null)
           handleIdentifier(elseX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, elseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, elseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2551,7 +2551,7 @@
             handleType(int, null)
             handleIdentifier(elseX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, elseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, elseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2579,7 +2579,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, elseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, elseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2604,7 +2604,7 @@
             handleType(int, null)
             handleIdentifier(elseX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, elseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, elseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2632,7 +2632,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, elseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, elseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2660,7 +2660,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, elseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, elseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2684,7 +2684,7 @@
           handleType(int, null)
           handleIdentifier(enumX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, enumX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, enumX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2708,7 +2708,7 @@
             handleType(int, null)
             handleIdentifier(enumX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, enumX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enumX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2736,7 +2736,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, enumX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enumX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2761,7 +2761,7 @@
             handleType(int, null)
             handleIdentifier(enumX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, enumX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enumX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2789,7 +2789,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, enumX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enumX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2817,7 +2817,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, enumX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enumX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2841,7 +2841,7 @@
           handleType(int, null)
           handleIdentifier(exportX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, exportX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, exportX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2865,7 +2865,7 @@
             handleType(int, null)
             handleIdentifier(exportX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, exportX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, exportX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2893,7 +2893,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, exportX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, exportX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2918,7 +2918,7 @@
             handleType(int, null)
             handleIdentifier(exportX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, exportX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, exportX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2946,7 +2946,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, exportX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, exportX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2974,7 +2974,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, exportX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, exportX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2998,7 +2998,7 @@
           handleType(int, null)
           handleIdentifier(extendsX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, extendsX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, extendsX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3022,7 +3022,7 @@
             handleType(int, null)
             handleIdentifier(extendsX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, extendsX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extendsX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3050,7 +3050,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, extendsX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extendsX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3075,7 +3075,7 @@
             handleType(int, null)
             handleIdentifier(extendsX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, extendsX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extendsX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3103,7 +3103,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, extendsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extendsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3131,7 +3131,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, extendsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extendsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3155,7 +3155,7 @@
           handleType(int, null)
           handleIdentifier(extensionX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, extensionX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, extensionX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3179,7 +3179,7 @@
             handleType(int, null)
             handleIdentifier(extensionX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, extensionX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extensionX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3207,7 +3207,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, extensionX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extensionX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3232,7 +3232,7 @@
             handleType(int, null)
             handleIdentifier(extensionX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, extensionX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extensionX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3260,7 +3260,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, extensionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extensionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3288,7 +3288,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, extensionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extensionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3312,7 +3312,7 @@
           handleType(int, null)
           handleIdentifier(externalX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, externalX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, externalX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3336,7 +3336,7 @@
             handleType(int, null)
             handleIdentifier(externalX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, externalX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, externalX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3364,7 +3364,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, externalX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, externalX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3389,7 +3389,7 @@
             handleType(int, null)
             handleIdentifier(externalX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, externalX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, externalX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3417,7 +3417,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, externalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, externalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3445,7 +3445,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, externalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, externalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3469,7 +3469,7 @@
           handleType(int, null)
           handleIdentifier(factoryX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, factoryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, factoryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3493,7 +3493,7 @@
             handleType(int, null)
             handleIdentifier(factoryX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, factoryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factoryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3521,7 +3521,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, factoryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factoryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3546,7 +3546,7 @@
             handleType(int, null)
             handleIdentifier(factoryX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, factoryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factoryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3574,7 +3574,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, factoryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factoryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3602,7 +3602,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, factoryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factoryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3626,7 +3626,7 @@
           handleType(int, null)
           handleIdentifier(falseX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, falseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, falseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3650,7 +3650,7 @@
             handleType(int, null)
             handleIdentifier(falseX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, falseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, falseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3678,7 +3678,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, falseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, falseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3703,7 +3703,7 @@
             handleType(int, null)
             handleIdentifier(falseX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, falseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, falseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3731,7 +3731,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, falseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, falseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3759,7 +3759,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, falseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, falseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3783,7 +3783,7 @@
           handleType(int, null)
           handleIdentifier(finalX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, finalX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, finalX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3807,7 +3807,7 @@
             handleType(int, null)
             handleIdentifier(finalX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, finalX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finalX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3835,7 +3835,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, finalX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finalX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3860,7 +3860,7 @@
             handleType(int, null)
             handleIdentifier(finalX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, finalX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finalX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3888,7 +3888,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, finalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3916,7 +3916,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, finalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3940,7 +3940,7 @@
           handleType(int, null)
           handleIdentifier(finallyX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, finallyX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, finallyX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3964,7 +3964,7 @@
             handleType(int, null)
             handleIdentifier(finallyX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, finallyX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finallyX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3992,7 +3992,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, finallyX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finallyX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4017,7 +4017,7 @@
             handleType(int, null)
             handleIdentifier(finallyX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, finallyX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finallyX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4045,7 +4045,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, finallyX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finallyX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4073,7 +4073,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, finallyX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finallyX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4097,7 +4097,7 @@
           handleType(int, null)
           handleIdentifier(forX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, forX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, forX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4121,7 +4121,7 @@
             handleType(int, null)
             handleIdentifier(forX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, forX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, forX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4149,7 +4149,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, forX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, forX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4174,7 +4174,7 @@
             handleType(int, null)
             handleIdentifier(forX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, forX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, forX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4202,7 +4202,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, forX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, forX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4230,7 +4230,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, forX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, forX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4254,7 +4254,7 @@
           handleType(int, null)
           handleIdentifier(FunctionX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, FunctionX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, FunctionX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4278,7 +4278,7 @@
             handleType(int, null)
             handleIdentifier(FunctionX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, FunctionX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, FunctionX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4306,7 +4306,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, FunctionX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, FunctionX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4331,7 +4331,7 @@
             handleType(int, null)
             handleIdentifier(FunctionX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, FunctionX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, FunctionX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4359,7 +4359,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, FunctionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, FunctionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4387,7 +4387,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, FunctionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, FunctionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4411,7 +4411,7 @@
           handleType(int, null)
           handleIdentifier(getX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, getX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, getX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4435,7 +4435,7 @@
             handleType(int, null)
             handleIdentifier(getX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, getX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, getX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4463,7 +4463,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, getX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, getX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4488,7 +4488,7 @@
             handleType(int, null)
             handleIdentifier(getX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, getX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, getX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4516,7 +4516,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, getX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, getX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4544,7 +4544,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, getX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, getX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4568,7 +4568,7 @@
           handleType(int, null)
           handleIdentifier(hideX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, hideX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, hideX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4592,7 +4592,7 @@
             handleType(int, null)
             handleIdentifier(hideX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, hideX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hideX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4620,7 +4620,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, hideX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hideX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4645,7 +4645,7 @@
             handleType(int, null)
             handleIdentifier(hideX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, hideX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hideX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4673,7 +4673,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, hideX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hideX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4701,7 +4701,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, hideX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hideX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4725,7 +4725,7 @@
           handleType(int, null)
           handleIdentifier(ifX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, ifX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, ifX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4749,7 +4749,7 @@
             handleType(int, null)
             handleIdentifier(ifX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, ifX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ifX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4777,7 +4777,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, ifX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ifX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4802,7 +4802,7 @@
             handleType(int, null)
             handleIdentifier(ifX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, ifX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ifX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4830,7 +4830,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, ifX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ifX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4858,7 +4858,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, ifX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ifX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4882,7 +4882,7 @@
           handleType(int, null)
           handleIdentifier(implementsX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, implementsX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, implementsX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4906,7 +4906,7 @@
             handleType(int, null)
             handleIdentifier(implementsX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, implementsX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implementsX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4934,7 +4934,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, implementsX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implementsX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4959,7 +4959,7 @@
             handleType(int, null)
             handleIdentifier(implementsX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, implementsX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implementsX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4987,7 +4987,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, implementsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implementsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5015,7 +5015,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, implementsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implementsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5039,7 +5039,7 @@
           handleType(int, null)
           handleIdentifier(importX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, importX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, importX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5063,7 +5063,7 @@
             handleType(int, null)
             handleIdentifier(importX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, importX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, importX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5091,7 +5091,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, importX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, importX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5116,7 +5116,7 @@
             handleType(int, null)
             handleIdentifier(importX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, importX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, importX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5144,7 +5144,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, importX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, importX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5172,7 +5172,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, importX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, importX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5196,7 +5196,7 @@
           handleType(int, null)
           handleIdentifier(inX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, inX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, inX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5220,7 +5220,7 @@
             handleType(int, null)
             handleIdentifier(inX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, inX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5248,7 +5248,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, inX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5273,7 +5273,7 @@
             handleType(int, null)
             handleIdentifier(inX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, inX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5301,7 +5301,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, inX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5329,7 +5329,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, inX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5353,7 +5353,7 @@
           handleType(int, null)
           handleIdentifier(inoutX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, inoutX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, inoutX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5377,7 +5377,7 @@
             handleType(int, null)
             handleIdentifier(inoutX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, inoutX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inoutX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5405,7 +5405,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, inoutX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inoutX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5430,7 +5430,7 @@
             handleType(int, null)
             handleIdentifier(inoutX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, inoutX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inoutX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5458,7 +5458,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, inoutX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inoutX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5486,7 +5486,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, inoutX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inoutX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5510,7 +5510,7 @@
           handleType(int, null)
           handleIdentifier(interfaceX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, interfaceX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, interfaceX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5534,7 +5534,7 @@
             handleType(int, null)
             handleIdentifier(interfaceX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, interfaceX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interfaceX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5562,7 +5562,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, interfaceX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interfaceX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5587,7 +5587,7 @@
             handleType(int, null)
             handleIdentifier(interfaceX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, interfaceX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interfaceX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5615,7 +5615,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, interfaceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interfaceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5643,7 +5643,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, interfaceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interfaceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5667,7 +5667,7 @@
           handleType(int, null)
           handleIdentifier(isX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, isX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, isX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5691,7 +5691,7 @@
             handleType(int, null)
             handleIdentifier(isX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, isX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, isX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5719,7 +5719,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, isX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, isX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5744,7 +5744,7 @@
             handleType(int, null)
             handleIdentifier(isX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, isX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, isX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5772,7 +5772,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, isX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, isX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5800,7 +5800,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, isX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, isX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5824,7 +5824,7 @@
           handleType(int, null)
           handleIdentifier(lateX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, lateX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, lateX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5848,7 +5848,7 @@
             handleType(int, null)
             handleIdentifier(lateX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, lateX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, lateX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5876,7 +5876,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, lateX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, lateX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5901,7 +5901,7 @@
             handleType(int, null)
             handleIdentifier(lateX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, lateX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, lateX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5929,7 +5929,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, lateX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, lateX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5957,7 +5957,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, lateX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, lateX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5981,7 +5981,7 @@
           handleType(int, null)
           handleIdentifier(libraryX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, libraryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, libraryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6005,7 +6005,7 @@
             handleType(int, null)
             handleIdentifier(libraryX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, libraryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, libraryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6033,7 +6033,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, libraryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, libraryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6058,7 +6058,7 @@
             handleType(int, null)
             handleIdentifier(libraryX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, libraryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, libraryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6086,7 +6086,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, libraryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, libraryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6114,7 +6114,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, libraryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, libraryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6138,7 +6138,7 @@
           handleType(int, null)
           handleIdentifier(mixinX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, mixinX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, mixinX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6162,7 +6162,7 @@
             handleType(int, null)
             handleIdentifier(mixinX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, mixinX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixinX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6190,7 +6190,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, mixinX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixinX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6215,7 +6215,7 @@
             handleType(int, null)
             handleIdentifier(mixinX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, mixinX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixinX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6243,7 +6243,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, mixinX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixinX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6271,7 +6271,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, mixinX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixinX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6295,7 +6295,7 @@
           handleType(int, null)
           handleIdentifier(nativeX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, nativeX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, nativeX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6319,7 +6319,7 @@
             handleType(int, null)
             handleIdentifier(nativeX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, nativeX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nativeX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6347,7 +6347,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, nativeX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nativeX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6372,7 +6372,7 @@
             handleType(int, null)
             handleIdentifier(nativeX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, nativeX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nativeX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6400,7 +6400,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, nativeX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nativeX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6428,7 +6428,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, nativeX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nativeX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6452,7 +6452,7 @@
           handleType(int, null)
           handleIdentifier(newX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, newX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, newX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6476,7 +6476,7 @@
             handleType(int, null)
             handleIdentifier(newX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, newX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, newX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6504,7 +6504,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, newX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, newX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6529,7 +6529,7 @@
             handleType(int, null)
             handleIdentifier(newX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, newX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, newX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6557,7 +6557,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, newX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, newX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6585,7 +6585,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, newX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, newX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6609,7 +6609,7 @@
           handleType(int, null)
           handleIdentifier(nullX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, nullX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, nullX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6633,7 +6633,7 @@
             handleType(int, null)
             handleIdentifier(nullX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, nullX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nullX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6661,7 +6661,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, nullX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nullX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6686,7 +6686,7 @@
             handleType(int, null)
             handleIdentifier(nullX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, nullX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nullX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6714,7 +6714,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, nullX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nullX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6742,7 +6742,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, nullX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nullX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6766,7 +6766,7 @@
           handleType(int, null)
           handleIdentifier(ofX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, ofX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, ofX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6790,7 +6790,7 @@
             handleType(int, null)
             handleIdentifier(ofX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, ofX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ofX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6818,7 +6818,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, ofX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ofX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6843,7 +6843,7 @@
             handleType(int, null)
             handleIdentifier(ofX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, ofX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ofX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6871,7 +6871,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, ofX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ofX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6899,7 +6899,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, ofX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ofX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6923,7 +6923,7 @@
           handleType(int, null)
           handleIdentifier(onX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6947,7 +6947,7 @@
             handleType(int, null)
             handleIdentifier(onX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, onX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6975,7 +6975,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, onX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, onX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7000,7 +7000,7 @@
             handleType(int, null)
             handleIdentifier(onX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, onX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7028,7 +7028,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, onX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, onX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7056,7 +7056,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, onX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, onX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7080,7 +7080,7 @@
           handleType(int, null)
           handleIdentifier(operatorX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, operatorX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, operatorX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7104,7 +7104,7 @@
             handleType(int, null)
             handleIdentifier(operatorX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, operatorX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operatorX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7132,7 +7132,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, operatorX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operatorX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7157,7 +7157,7 @@
             handleType(int, null)
             handleIdentifier(operatorX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, operatorX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operatorX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7185,7 +7185,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, operatorX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operatorX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7213,7 +7213,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, operatorX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operatorX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7237,7 +7237,7 @@
           handleType(int, null)
           handleIdentifier(outX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, outX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, outX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7261,7 +7261,7 @@
             handleType(int, null)
             handleIdentifier(outX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, outX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, outX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7289,7 +7289,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, outX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, outX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7314,7 +7314,7 @@
             handleType(int, null)
             handleIdentifier(outX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, outX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, outX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7342,7 +7342,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, outX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, outX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7370,7 +7370,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, outX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, outX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7394,7 +7394,7 @@
           handleType(int, null)
           handleIdentifier(partX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, partX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, partX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7418,7 +7418,7 @@
             handleType(int, null)
             handleIdentifier(partX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, partX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, partX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7446,7 +7446,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, partX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, partX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7471,7 +7471,7 @@
             handleType(int, null)
             handleIdentifier(partX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, partX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, partX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7499,7 +7499,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, partX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, partX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7527,7 +7527,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, partX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, partX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7551,7 +7551,7 @@
           handleType(int, null)
           handleIdentifier(patchX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, patchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, patchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7575,7 +7575,7 @@
             handleType(int, null)
             handleIdentifier(patchX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, patchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7603,7 +7603,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, patchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7628,7 +7628,7 @@
             handleType(int, null)
             handleIdentifier(patchX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, patchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7656,7 +7656,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, patchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7684,7 +7684,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, patchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7708,7 +7708,7 @@
           handleType(int, null)
           handleIdentifier(requiredX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, requiredX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, requiredX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7732,7 +7732,7 @@
             handleType(int, null)
             handleIdentifier(requiredX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, requiredX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, requiredX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7760,7 +7760,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, requiredX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, requiredX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7785,7 +7785,7 @@
             handleType(int, null)
             handleIdentifier(requiredX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, requiredX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, requiredX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7813,7 +7813,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, requiredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, requiredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7841,7 +7841,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, requiredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, requiredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7865,7 +7865,7 @@
           handleType(int, null)
           handleIdentifier(rethrowX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, rethrowX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, rethrowX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7889,7 +7889,7 @@
             handleType(int, null)
             handleIdentifier(rethrowX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, rethrowX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrowX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7917,7 +7917,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, rethrowX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrowX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7942,7 +7942,7 @@
             handleType(int, null)
             handleIdentifier(rethrowX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, rethrowX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrowX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7970,7 +7970,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, rethrowX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrowX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7998,7 +7998,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, rethrowX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrowX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8022,7 +8022,7 @@
           handleType(int, null)
           handleIdentifier(returnX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, returnX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, returnX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8046,7 +8046,7 @@
             handleType(int, null)
             handleIdentifier(returnX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, returnX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, returnX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8074,7 +8074,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, returnX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, returnX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8099,7 +8099,7 @@
             handleType(int, null)
             handleIdentifier(returnX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, returnX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, returnX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8127,7 +8127,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, returnX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, returnX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8155,7 +8155,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, returnX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, returnX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8179,7 +8179,7 @@
           handleType(int, null)
           handleIdentifier(setX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, setX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, setX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8203,7 +8203,7 @@
             handleType(int, null)
             handleIdentifier(setX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, setX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, setX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8231,7 +8231,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, setX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, setX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8256,7 +8256,7 @@
             handleType(int, null)
             handleIdentifier(setX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, setX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, setX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8284,7 +8284,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, setX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, setX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8312,7 +8312,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, setX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, setX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8336,7 +8336,7 @@
           handleType(int, null)
           handleIdentifier(showX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, showX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, showX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8360,7 +8360,7 @@
             handleType(int, null)
             handleIdentifier(showX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, showX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, showX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8388,7 +8388,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, showX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, showX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8413,7 +8413,7 @@
             handleType(int, null)
             handleIdentifier(showX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, showX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, showX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8441,7 +8441,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, showX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, showX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8469,7 +8469,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, showX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, showX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8493,7 +8493,7 @@
           handleType(int, null)
           handleIdentifier(sourceX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, sourceX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, sourceX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8517,7 +8517,7 @@
             handleType(int, null)
             handleIdentifier(sourceX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, sourceX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sourceX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8545,7 +8545,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, sourceX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sourceX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8570,7 +8570,7 @@
             handleType(int, null)
             handleIdentifier(sourceX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, sourceX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sourceX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8598,7 +8598,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, sourceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sourceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8626,7 +8626,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, sourceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sourceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8650,7 +8650,7 @@
           handleType(int, null)
           handleIdentifier(staticX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, staticX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, staticX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8674,7 +8674,7 @@
             handleType(int, null)
             handleIdentifier(staticX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, staticX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, staticX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8702,7 +8702,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, staticX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, staticX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8727,7 +8727,7 @@
             handleType(int, null)
             handleIdentifier(staticX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, staticX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, staticX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8755,7 +8755,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, staticX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, staticX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8783,7 +8783,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, staticX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, staticX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8807,7 +8807,7 @@
           handleType(int, null)
           handleIdentifier(superX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, superX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, superX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8831,7 +8831,7 @@
             handleType(int, null)
             handleIdentifier(superX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, superX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, superX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8859,7 +8859,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, superX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, superX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8884,7 +8884,7 @@
             handleType(int, null)
             handleIdentifier(superX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, superX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, superX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8912,7 +8912,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, superX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, superX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8940,7 +8940,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, superX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, superX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8964,7 +8964,7 @@
           handleType(int, null)
           handleIdentifier(switchX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, switchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, switchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8988,7 +8988,7 @@
             handleType(int, null)
             handleIdentifier(switchX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, switchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9016,7 +9016,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, switchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9041,7 +9041,7 @@
             handleType(int, null)
             handleIdentifier(switchX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, switchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9069,7 +9069,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, switchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9097,7 +9097,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, switchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9121,7 +9121,7 @@
           handleType(int, null)
           handleIdentifier(syncX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, syncX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, syncX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9145,7 +9145,7 @@
             handleType(int, null)
             handleIdentifier(syncX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, syncX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, syncX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9173,7 +9173,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, syncX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, syncX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9198,7 +9198,7 @@
             handleType(int, null)
             handleIdentifier(syncX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, syncX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, syncX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9226,7 +9226,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, syncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, syncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9254,7 +9254,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, syncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, syncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9278,7 +9278,7 @@
           handleType(int, null)
           handleIdentifier(thisX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, thisX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, thisX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9302,7 +9302,7 @@
             handleType(int, null)
             handleIdentifier(thisX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, thisX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, thisX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9330,7 +9330,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, thisX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, thisX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9355,7 +9355,7 @@
             handleType(int, null)
             handleIdentifier(thisX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, thisX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, thisX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9383,7 +9383,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, thisX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, thisX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9411,7 +9411,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, thisX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, thisX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9435,7 +9435,7 @@
           handleType(int, null)
           handleIdentifier(throwX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, throwX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, throwX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9459,7 +9459,7 @@
             handleType(int, null)
             handleIdentifier(throwX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, throwX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throwX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9487,7 +9487,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, throwX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throwX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9512,7 +9512,7 @@
             handleType(int, null)
             handleIdentifier(throwX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, throwX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throwX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9540,7 +9540,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, throwX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throwX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9568,7 +9568,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, throwX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throwX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9592,7 +9592,7 @@
           handleType(int, null)
           handleIdentifier(trueX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, trueX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, trueX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9616,7 +9616,7 @@
             handleType(int, null)
             handleIdentifier(trueX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, trueX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, trueX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9644,7 +9644,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, trueX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, trueX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9669,7 +9669,7 @@
             handleType(int, null)
             handleIdentifier(trueX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, trueX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, trueX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9697,7 +9697,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, trueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, trueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9725,7 +9725,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, trueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, trueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9749,7 +9749,7 @@
           handleType(int, null)
           handleIdentifier(tryX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, tryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, tryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9773,7 +9773,7 @@
             handleType(int, null)
             handleIdentifier(tryX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, tryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, tryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9801,7 +9801,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, tryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, tryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9826,7 +9826,7 @@
             handleType(int, null)
             handleIdentifier(tryX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, tryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, tryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9854,7 +9854,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, tryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, tryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9882,7 +9882,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, tryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, tryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9906,7 +9906,7 @@
           handleType(int, null)
           handleIdentifier(typedefX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, typedefX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, typedefX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9930,7 +9930,7 @@
             handleType(int, null)
             handleIdentifier(typedefX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, typedefX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedefX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9958,7 +9958,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, typedefX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedefX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9983,7 +9983,7 @@
             handleType(int, null)
             handleIdentifier(typedefX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, typedefX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedefX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10011,7 +10011,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, typedefX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedefX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10039,7 +10039,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, typedefX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedefX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10063,7 +10063,7 @@
           handleType(int, null)
           handleIdentifier(varX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, varX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, varX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10087,7 +10087,7 @@
             handleType(int, null)
             handleIdentifier(varX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, varX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, varX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10115,7 +10115,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, varX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, varX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10140,7 +10140,7 @@
             handleType(int, null)
             handleIdentifier(varX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, varX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, varX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10168,7 +10168,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, varX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, varX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10196,7 +10196,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, varX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, varX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10220,7 +10220,7 @@
           handleType(int, null)
           handleIdentifier(voidX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, voidX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, voidX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10244,7 +10244,7 @@
             handleType(int, null)
             handleIdentifier(voidX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, voidX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, voidX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10272,7 +10272,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, voidX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, voidX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10297,7 +10297,7 @@
             handleType(int, null)
             handleIdentifier(voidX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, voidX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, voidX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10325,7 +10325,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, voidX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, voidX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10353,7 +10353,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, voidX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, voidX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10377,7 +10377,7 @@
           handleType(int, null)
           handleIdentifier(whileX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, whileX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, whileX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10401,7 +10401,7 @@
             handleType(int, null)
             handleIdentifier(whileX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, whileX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, whileX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10429,7 +10429,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, whileX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, whileX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10454,7 +10454,7 @@
             handleType(int, null)
             handleIdentifier(whileX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, whileX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, whileX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10482,7 +10482,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, whileX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, whileX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10510,7 +10510,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, whileX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, whileX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10534,7 +10534,7 @@
           handleType(int, null)
           handleIdentifier(withX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, withX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, withX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10558,7 +10558,7 @@
             handleType(int, null)
             handleIdentifier(withX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, withX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, withX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10586,7 +10586,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, withX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, withX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10611,7 +10611,7 @@
             handleType(int, null)
             handleIdentifier(withX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, withX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, withX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10639,7 +10639,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, withX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, withX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10667,7 +10667,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, withX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, withX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10691,7 +10691,7 @@
           handleType(int, null)
           handleIdentifier(yieldX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, yieldX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, yieldX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10715,7 +10715,7 @@
             handleType(int, null)
             handleIdentifier(yieldX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, yieldX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yieldX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10743,7 +10743,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, yieldX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yieldX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10768,7 +10768,7 @@
             handleType(int, null)
             handleIdentifier(yieldX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, yieldX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yieldX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10796,7 +10796,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, yieldX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yieldX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10824,7 +10824,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, yieldX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yieldX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_prime.dart.intertwined.expect
index b1fa29a..639e26d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_prime.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(abstractX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, abstractX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, abstractX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -71,7 +71,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(abstractX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, abstractX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstractX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -122,7 +122,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, abstractX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstractX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -165,7 +165,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(abstractX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, abstractX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstractX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -216,7 +216,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, abstractX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstractX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -267,7 +267,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, abstractX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstractX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -308,7 +308,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(asX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, asX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, asX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -349,7 +349,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(asX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, asX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -400,7 +400,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, asX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -443,7 +443,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(asX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, asX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -494,7 +494,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, asX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -545,7 +545,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, asX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -586,7 +586,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(assertX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, assertX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, assertX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -627,7 +627,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(assertX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, assertX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assertX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -678,7 +678,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, assertX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assertX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -721,7 +721,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(assertX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, assertX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assertX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -772,7 +772,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, assertX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assertX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -823,7 +823,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, assertX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assertX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -864,7 +864,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(asyncX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, asyncX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, asyncX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -905,7 +905,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(asyncX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, asyncX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asyncX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -956,7 +956,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, asyncX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asyncX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -999,7 +999,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(asyncX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, asyncX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asyncX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1050,7 +1050,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, asyncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asyncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1101,7 +1101,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, asyncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asyncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1142,7 +1142,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(awaitX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, awaitX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, awaitX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1183,7 +1183,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(awaitX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, awaitX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, awaitX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1234,7 +1234,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, awaitX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, awaitX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1277,7 +1277,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(awaitX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, awaitX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, awaitX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1328,7 +1328,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, awaitX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, awaitX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1379,7 +1379,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, awaitX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, awaitX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1420,7 +1420,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(breakX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, breakX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, breakX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1461,7 +1461,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(breakX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, breakX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, breakX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1512,7 +1512,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, breakX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, breakX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1555,7 +1555,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(breakX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, breakX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, breakX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1606,7 +1606,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, breakX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, breakX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1657,7 +1657,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, breakX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, breakX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1698,7 +1698,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(caseX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, caseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, caseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1739,7 +1739,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(caseX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, caseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, caseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1790,7 +1790,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, caseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, caseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1833,7 +1833,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(caseX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, caseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, caseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1884,7 +1884,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, caseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, caseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1935,7 +1935,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, caseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, caseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1976,7 +1976,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(catchX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, catchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, catchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2017,7 +2017,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(catchX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, catchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2068,7 +2068,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, catchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2111,7 +2111,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(catchX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, catchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2162,7 +2162,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, catchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2213,7 +2213,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, catchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2254,7 +2254,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(classX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, classX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, classX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2295,7 +2295,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(classX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, classX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, classX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2346,7 +2346,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, classX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, classX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2389,7 +2389,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(classX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, classX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, classX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2440,7 +2440,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, classX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, classX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2491,7 +2491,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, classX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, classX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2532,7 +2532,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(constX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, constX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, constX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2573,7 +2573,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(constX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, constX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, constX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2624,7 +2624,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, constX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, constX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2667,7 +2667,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(constX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, constX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, constX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2718,7 +2718,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, constX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, constX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2769,7 +2769,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, constX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, constX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2810,7 +2810,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(continueX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, continueX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, continueX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2851,7 +2851,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(continueX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, continueX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continueX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2902,7 +2902,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, continueX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continueX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2945,7 +2945,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(continueX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, continueX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continueX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2996,7 +2996,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, continueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3047,7 +3047,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, continueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3088,7 +3088,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(covariantX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, covariantX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, covariantX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3129,7 +3129,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(covariantX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, covariantX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariantX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3180,7 +3180,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, covariantX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariantX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3223,7 +3223,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(covariantX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, covariantX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariantX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3274,7 +3274,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, covariantX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariantX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3325,7 +3325,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, covariantX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariantX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3366,7 +3366,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(defaultX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, defaultX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, defaultX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3407,7 +3407,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(defaultX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, defaultX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, defaultX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3458,7 +3458,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, defaultX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, defaultX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3501,7 +3501,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(defaultX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, defaultX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, defaultX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3552,7 +3552,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, defaultX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, defaultX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3603,7 +3603,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, defaultX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, defaultX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3644,7 +3644,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(deferredX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, deferredX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, deferredX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3685,7 +3685,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(deferredX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, deferredX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferredX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3736,7 +3736,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, deferredX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferredX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3779,7 +3779,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(deferredX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, deferredX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferredX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3830,7 +3830,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, deferredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3881,7 +3881,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, deferredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3922,7 +3922,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(doX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, doX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, doX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3963,7 +3963,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(doX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, doX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, doX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4014,7 +4014,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, doX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, doX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4057,7 +4057,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(doX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, doX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, doX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4108,7 +4108,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, doX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, doX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4159,7 +4159,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, doX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, doX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4200,7 +4200,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(dynamicX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, dynamicX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, dynamicX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4241,7 +4241,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(dynamicX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, dynamicX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamicX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4292,7 +4292,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, dynamicX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamicX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4335,7 +4335,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(dynamicX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, dynamicX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamicX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4386,7 +4386,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, dynamicX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamicX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4437,7 +4437,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, dynamicX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamicX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4478,7 +4478,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(elseX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, elseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, elseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4519,7 +4519,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(elseX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, elseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, elseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4570,7 +4570,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, elseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, elseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4613,7 +4613,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(elseX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, elseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, elseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4664,7 +4664,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, elseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, elseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4715,7 +4715,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, elseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, elseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4756,7 +4756,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(enumX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, enumX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, enumX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4797,7 +4797,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(enumX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, enumX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enumX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4848,7 +4848,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, enumX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enumX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4891,7 +4891,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(enumX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, enumX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enumX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4942,7 +4942,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, enumX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enumX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4993,7 +4993,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, enumX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enumX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5034,7 +5034,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(exportX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, exportX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, exportX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5075,7 +5075,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(exportX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, exportX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, exportX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5126,7 +5126,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, exportX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, exportX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5169,7 +5169,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(exportX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, exportX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, exportX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5220,7 +5220,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, exportX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, exportX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5271,7 +5271,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, exportX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, exportX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5312,7 +5312,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(extendsX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, extendsX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, extendsX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5353,7 +5353,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(extendsX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, extendsX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extendsX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5404,7 +5404,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, extendsX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extendsX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5447,7 +5447,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(extendsX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, extendsX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extendsX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5498,7 +5498,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, extendsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extendsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5549,7 +5549,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, extendsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extendsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5590,7 +5590,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(extensionX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, extensionX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, extensionX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5631,7 +5631,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(extensionX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, extensionX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extensionX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5682,7 +5682,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, extensionX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extensionX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5725,7 +5725,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(extensionX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, extensionX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extensionX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5776,7 +5776,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, extensionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extensionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5827,7 +5827,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, extensionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extensionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5868,7 +5868,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(externalX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, externalX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, externalX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5909,7 +5909,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(externalX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, externalX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, externalX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5960,7 +5960,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, externalX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, externalX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6003,7 +6003,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(externalX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, externalX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, externalX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6054,7 +6054,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, externalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, externalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6105,7 +6105,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, externalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, externalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6146,7 +6146,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(factoryX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, factoryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, factoryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6187,7 +6187,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(factoryX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, factoryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factoryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6238,7 +6238,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, factoryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factoryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6281,7 +6281,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(factoryX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, factoryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factoryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6332,7 +6332,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, factoryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factoryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6383,7 +6383,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, factoryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factoryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6424,7 +6424,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(falseX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, falseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, falseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6465,7 +6465,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(falseX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, falseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, falseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6516,7 +6516,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, falseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, falseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6559,7 +6559,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(falseX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, falseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, falseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6610,7 +6610,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, falseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, falseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6661,7 +6661,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, falseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, falseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6702,7 +6702,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(finalX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, finalX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, finalX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6743,7 +6743,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(finalX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, finalX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finalX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6794,7 +6794,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, finalX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finalX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6837,7 +6837,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(finalX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, finalX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finalX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6888,7 +6888,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, finalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6939,7 +6939,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, finalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6980,7 +6980,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(finallyX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, finallyX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, finallyX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7021,7 +7021,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(finallyX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, finallyX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finallyX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7072,7 +7072,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, finallyX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finallyX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7115,7 +7115,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(finallyX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, finallyX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finallyX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7166,7 +7166,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, finallyX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finallyX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7217,7 +7217,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, finallyX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finallyX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7258,7 +7258,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(forX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, forX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, forX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7299,7 +7299,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(forX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, forX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, forX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7350,7 +7350,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, forX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, forX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7393,7 +7393,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(forX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, forX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, forX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7444,7 +7444,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, forX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, forX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7495,7 +7495,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, forX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, forX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7536,7 +7536,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(FunctionX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, FunctionX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, FunctionX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7577,7 +7577,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(FunctionX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, FunctionX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, FunctionX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7628,7 +7628,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, FunctionX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, FunctionX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7671,7 +7671,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(FunctionX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, FunctionX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, FunctionX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7722,7 +7722,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, FunctionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, FunctionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7773,7 +7773,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, FunctionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, FunctionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7814,7 +7814,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(getX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, getX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, getX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7855,7 +7855,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(getX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, getX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, getX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7906,7 +7906,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, getX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, getX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7949,7 +7949,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(getX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, getX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, getX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8000,7 +8000,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, getX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, getX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8051,7 +8051,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, getX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, getX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8092,7 +8092,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(hideX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, hideX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, hideX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8133,7 +8133,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(hideX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, hideX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hideX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8184,7 +8184,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, hideX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hideX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8227,7 +8227,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(hideX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, hideX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hideX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8278,7 +8278,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, hideX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hideX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8329,7 +8329,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, hideX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hideX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8370,7 +8370,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(ifX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, ifX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, ifX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8411,7 +8411,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(ifX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, ifX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ifX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8462,7 +8462,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, ifX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ifX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8505,7 +8505,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(ifX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, ifX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ifX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8556,7 +8556,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, ifX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ifX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8607,7 +8607,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, ifX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ifX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8648,7 +8648,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(implementsX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, implementsX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, implementsX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8689,7 +8689,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(implementsX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, implementsX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implementsX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8740,7 +8740,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, implementsX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implementsX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8783,7 +8783,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(implementsX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, implementsX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implementsX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8834,7 +8834,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, implementsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implementsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8885,7 +8885,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, implementsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implementsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8926,7 +8926,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(importX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, importX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, importX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8967,7 +8967,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(importX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, importX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, importX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9018,7 +9018,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, importX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, importX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9061,7 +9061,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(importX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, importX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, importX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9112,7 +9112,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, importX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, importX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9163,7 +9163,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, importX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, importX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9204,7 +9204,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(inX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, inX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, inX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9245,7 +9245,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(inX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, inX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9296,7 +9296,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, inX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9339,7 +9339,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(inX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, inX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9390,7 +9390,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, inX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9441,7 +9441,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, inX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9482,7 +9482,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(inoutX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, inoutX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, inoutX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9523,7 +9523,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(inoutX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, inoutX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inoutX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9574,7 +9574,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, inoutX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inoutX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9617,7 +9617,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(inoutX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, inoutX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inoutX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9668,7 +9668,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, inoutX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inoutX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9719,7 +9719,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, inoutX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inoutX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9760,7 +9760,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(interfaceX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, interfaceX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, interfaceX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9801,7 +9801,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(interfaceX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, interfaceX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interfaceX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9852,7 +9852,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, interfaceX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interfaceX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9895,7 +9895,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(interfaceX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, interfaceX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interfaceX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9946,7 +9946,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, interfaceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interfaceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9997,7 +9997,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, interfaceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interfaceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10038,7 +10038,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(isX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, isX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, isX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10079,7 +10079,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(isX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, isX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, isX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10130,7 +10130,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, isX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, isX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10173,7 +10173,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(isX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, isX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, isX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10224,7 +10224,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, isX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, isX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10275,7 +10275,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, isX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, isX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10316,7 +10316,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(lateX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, lateX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, lateX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10357,7 +10357,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(lateX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, lateX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, lateX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10408,7 +10408,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, lateX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, lateX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10451,7 +10451,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(lateX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, lateX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, lateX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10502,7 +10502,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, lateX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, lateX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10553,7 +10553,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, lateX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, lateX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10594,7 +10594,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(libraryX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, libraryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, libraryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10635,7 +10635,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(libraryX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, libraryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, libraryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10686,7 +10686,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, libraryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, libraryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10729,7 +10729,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(libraryX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, libraryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, libraryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10780,7 +10780,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, libraryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, libraryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10831,7 +10831,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, libraryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, libraryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10872,7 +10872,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(mixinX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, mixinX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, mixinX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10913,7 +10913,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(mixinX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, mixinX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixinX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10964,7 +10964,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, mixinX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixinX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11007,7 +11007,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(mixinX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, mixinX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixinX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11058,7 +11058,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, mixinX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixinX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11109,7 +11109,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, mixinX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixinX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11150,7 +11150,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(nativeX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, nativeX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, nativeX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -11191,7 +11191,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(nativeX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, nativeX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nativeX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11242,7 +11242,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, nativeX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nativeX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11285,7 +11285,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(nativeX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, nativeX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nativeX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11336,7 +11336,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, nativeX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nativeX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11387,7 +11387,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, nativeX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nativeX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11428,7 +11428,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(newX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, newX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, newX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -11469,7 +11469,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(newX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, newX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, newX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11520,7 +11520,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, newX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, newX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11563,7 +11563,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(newX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, newX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, newX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11614,7 +11614,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, newX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, newX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11665,7 +11665,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, newX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, newX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11706,7 +11706,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(nullX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, nullX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, nullX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -11747,7 +11747,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(nullX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, nullX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nullX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11798,7 +11798,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, nullX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nullX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11841,7 +11841,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(nullX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, nullX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nullX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11892,7 +11892,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, nullX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nullX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11943,7 +11943,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, nullX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nullX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11984,7 +11984,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(ofX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, ofX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, ofX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -12025,7 +12025,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(ofX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, ofX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ofX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12076,7 +12076,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, ofX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ofX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12119,7 +12119,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(ofX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, ofX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ofX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12170,7 +12170,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, ofX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ofX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12221,7 +12221,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, ofX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ofX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12262,7 +12262,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(onX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -12303,7 +12303,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(onX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, onX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12354,7 +12354,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, onX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, onX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12397,7 +12397,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(onX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, onX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12448,7 +12448,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, onX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, onX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12499,7 +12499,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, onX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, onX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12540,7 +12540,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(operatorX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, operatorX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, operatorX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -12581,7 +12581,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(operatorX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, operatorX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operatorX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12632,7 +12632,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, operatorX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operatorX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12675,7 +12675,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(operatorX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, operatorX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operatorX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12726,7 +12726,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, operatorX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operatorX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12777,7 +12777,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, operatorX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operatorX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12818,7 +12818,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(outX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, outX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, outX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -12859,7 +12859,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(outX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, outX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, outX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12910,7 +12910,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, outX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, outX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12953,7 +12953,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(outX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, outX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, outX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13004,7 +13004,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, outX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, outX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13055,7 +13055,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, outX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, outX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13096,7 +13096,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(partX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, partX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, partX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -13137,7 +13137,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(partX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, partX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, partX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13188,7 +13188,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, partX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, partX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13231,7 +13231,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(partX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, partX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, partX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13282,7 +13282,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, partX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, partX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13333,7 +13333,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, partX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, partX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13374,7 +13374,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(patchX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, patchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, patchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -13415,7 +13415,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(patchX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, patchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13466,7 +13466,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, patchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13509,7 +13509,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(patchX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, patchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13560,7 +13560,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, patchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13611,7 +13611,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, patchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13652,7 +13652,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(requiredX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, requiredX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, requiredX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -13693,7 +13693,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(requiredX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, requiredX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, requiredX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13744,7 +13744,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, requiredX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, requiredX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13787,7 +13787,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(requiredX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, requiredX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, requiredX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13838,7 +13838,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, requiredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, requiredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13889,7 +13889,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, requiredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, requiredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13930,7 +13930,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(rethrowX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, rethrowX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, rethrowX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -13971,7 +13971,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(rethrowX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, rethrowX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrowX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14022,7 +14022,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, rethrowX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrowX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14065,7 +14065,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(rethrowX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, rethrowX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrowX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14116,7 +14116,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, rethrowX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrowX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14167,7 +14167,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, rethrowX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrowX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14208,7 +14208,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(returnX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, returnX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, returnX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -14249,7 +14249,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(returnX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, returnX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, returnX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14300,7 +14300,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, returnX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, returnX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14343,7 +14343,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(returnX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, returnX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, returnX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14394,7 +14394,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, returnX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, returnX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14445,7 +14445,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, returnX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, returnX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14486,7 +14486,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(setX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, setX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, setX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -14527,7 +14527,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(setX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, setX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, setX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14578,7 +14578,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, setX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, setX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14621,7 +14621,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(setX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, setX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, setX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14672,7 +14672,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, setX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, setX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14723,7 +14723,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, setX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, setX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14764,7 +14764,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(showX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, showX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, showX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -14805,7 +14805,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(showX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, showX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, showX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14856,7 +14856,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, showX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, showX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14899,7 +14899,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(showX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, showX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, showX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14950,7 +14950,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, showX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, showX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15001,7 +15001,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, showX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, showX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15042,7 +15042,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(sourceX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, sourceX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, sourceX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -15083,7 +15083,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(sourceX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, sourceX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sourceX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15134,7 +15134,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, sourceX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sourceX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15177,7 +15177,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(sourceX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, sourceX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sourceX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15228,7 +15228,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, sourceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sourceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15279,7 +15279,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, sourceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sourceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15320,7 +15320,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(staticX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, staticX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, staticX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -15361,7 +15361,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(staticX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, staticX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, staticX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15412,7 +15412,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, staticX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, staticX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15455,7 +15455,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(staticX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, staticX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, staticX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15506,7 +15506,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, staticX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, staticX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15557,7 +15557,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, staticX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, staticX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15598,7 +15598,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(superX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, superX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, superX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -15639,7 +15639,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(superX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, superX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, superX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15690,7 +15690,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, superX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, superX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15733,7 +15733,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(superX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, superX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, superX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15784,7 +15784,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, superX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, superX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15835,7 +15835,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, superX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, superX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15876,7 +15876,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(switchX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, switchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, switchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -15917,7 +15917,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(switchX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, switchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15968,7 +15968,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, switchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16011,7 +16011,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(switchX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, switchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16062,7 +16062,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, switchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16113,7 +16113,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, switchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16154,7 +16154,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(syncX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, syncX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, syncX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -16195,7 +16195,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(syncX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, syncX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, syncX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16246,7 +16246,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, syncX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, syncX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16289,7 +16289,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(syncX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, syncX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, syncX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16340,7 +16340,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, syncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, syncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16391,7 +16391,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, syncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, syncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16432,7 +16432,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(thisX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, thisX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, thisX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -16473,7 +16473,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(thisX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, thisX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, thisX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16524,7 +16524,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, thisX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, thisX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16567,7 +16567,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(thisX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, thisX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, thisX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16618,7 +16618,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, thisX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, thisX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16669,7 +16669,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, thisX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, thisX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16710,7 +16710,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(throwX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, throwX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, throwX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -16751,7 +16751,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(throwX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, throwX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throwX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16802,7 +16802,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, throwX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throwX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16845,7 +16845,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(throwX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, throwX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throwX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16896,7 +16896,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, throwX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throwX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16947,7 +16947,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, throwX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throwX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16988,7 +16988,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(trueX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, trueX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, trueX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -17029,7 +17029,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(trueX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, trueX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, trueX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17080,7 +17080,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, trueX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, trueX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17123,7 +17123,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(trueX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, trueX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, trueX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17174,7 +17174,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, trueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, trueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17225,7 +17225,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, trueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, trueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17266,7 +17266,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(tryX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, tryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, tryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -17307,7 +17307,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(tryX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, tryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, tryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17358,7 +17358,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, tryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, tryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17401,7 +17401,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(tryX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, tryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, tryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17452,7 +17452,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, tryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, tryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17503,7 +17503,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, tryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, tryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17544,7 +17544,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(typedefX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, typedefX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, typedefX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -17585,7 +17585,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(typedefX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, typedefX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedefX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17636,7 +17636,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, typedefX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedefX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17679,7 +17679,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(typedefX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, typedefX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedefX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17730,7 +17730,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, typedefX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedefX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17781,7 +17781,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, typedefX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedefX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17822,7 +17822,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(varX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, varX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, varX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -17863,7 +17863,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(varX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, varX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, varX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17914,7 +17914,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, varX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, varX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17957,7 +17957,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(varX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, varX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, varX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18008,7 +18008,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, varX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, varX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18059,7 +18059,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, varX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, varX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18100,7 +18100,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(voidX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, voidX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, voidX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -18141,7 +18141,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(voidX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, voidX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, voidX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18192,7 +18192,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, voidX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, voidX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18235,7 +18235,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(voidX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, voidX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, voidX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18286,7 +18286,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, voidX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, voidX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18337,7 +18337,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, voidX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, voidX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18378,7 +18378,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(whileX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, whileX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, whileX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -18419,7 +18419,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(whileX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, whileX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, whileX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18470,7 +18470,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, whileX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, whileX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18513,7 +18513,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(whileX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, whileX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, whileX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18564,7 +18564,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, whileX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, whileX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18615,7 +18615,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, whileX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, whileX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18656,7 +18656,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(withX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, withX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, withX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -18697,7 +18697,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(withX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, withX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, withX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18748,7 +18748,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, withX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, withX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18791,7 +18791,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(withX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, withX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, withX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18842,7 +18842,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, withX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, withX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18893,7 +18893,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, withX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, withX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18934,7 +18934,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(yieldX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, yieldX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, yieldX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -18975,7 +18975,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(yieldX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, yieldX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yieldX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19026,7 +19026,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, yieldX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yieldX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19069,7 +19069,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(yieldX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, yieldX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yieldX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19120,7 +19120,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, yieldX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yieldX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19171,7 +19171,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, yieldX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yieldX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.expect
index 05ab92b..6085b02 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.expect
@@ -23,7 +23,7 @@
           handleNoType(()
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue(class)
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       handleRecoverableError(Message[ExpectedFunctionBody, Expected a function body, but got 'class'., null, {lexeme: class}], class, class)
@@ -39,7 +39,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.intertwined.expect
index 69db077..194b6ca 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.intertwined.expect
@@ -29,7 +29,7 @@
                 ensureIdentifier((, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(class)
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               rewriter()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
@@ -62,10 +62,10 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.expect
index 076896b..85b9f18 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.expect
@@ -483,7 +483,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -540,7 +540,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -598,7 +598,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -653,7 +653,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -710,7 +710,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -768,7 +768,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -832,7 +832,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -891,7 +891,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -950,7 +950,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1009,7 +1009,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1072,7 +1072,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1135,7 +1135,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1193,7 +1193,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1251,7 +1251,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1309,7 +1309,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1382,7 +1382,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1440,7 +1440,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1509,7 +1509,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1567,7 +1567,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1625,7 +1625,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1683,7 +1683,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1740,7 +1740,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1797,7 +1797,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1855,7 +1855,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1913,7 +1913,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1999,7 +1999,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2058,7 +2058,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2136,7 +2136,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2193,7 +2193,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2250,7 +2250,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2308,7 +2308,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2377,7 +2377,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2434,7 +2434,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2492,7 +2492,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2550,7 +2550,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2607,7 +2607,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2665,7 +2665,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2732,7 +2732,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2789,7 +2789,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2846,7 +2846,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2903,7 +2903,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2961,7 +2961,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3024,7 +3024,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3081,7 +3081,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3138,7 +3138,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3195,7 +3195,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3252,7 +3252,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3309,7 +3309,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3366,7 +3366,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3423,7 +3423,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3481,7 +3481,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3540,7 +3540,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3594,7 +3594,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3651,7 +3651,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3708,7 +3708,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3765,7 +3765,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3823,7 +3823,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3881,7 +3881,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3951,7 +3951,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4009,7 +4009,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4067,7 +4067,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4122,7 +4122,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4180,7 +4180,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4246,7 +4246,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4304,7 +4304,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4390,7 +4390,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4476,7 +4476,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4546,7 +4546,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4604,7 +4604,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect
index 9c70513..bad4dea 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect
@@ -32,7 +32,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -172,7 +172,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -316,7 +316,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -447,7 +447,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -587,7 +587,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -734,7 +734,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -909,7 +909,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1052,7 +1052,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1195,7 +1195,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1338,7 +1338,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1401,7 +1401,7 @@
                       parsePrimary(return, expression)
                         parseConstExpression(return)
                           listener: beginConstExpression(const)
-                          parseConstructorReference(const, ConstructorReferenceContext.Const, null)
+                          parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
                             ensureIdentifier(const, constructorReference)
                               insertSyntheticIdentifier(const, constructorReference, message: Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}], messageOnToken: null)
                                 reportRecoverableError((, Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}])
@@ -1486,7 +1486,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1657,7 +1657,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1801,7 +1801,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1940,7 +1940,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2084,7 +2084,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2279,7 +2279,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2423,7 +2423,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2616,7 +2616,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2755,7 +2755,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2899,7 +2899,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3038,7 +3038,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3178,7 +3178,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3318,7 +3318,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3462,7 +3462,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3600,7 +3600,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3835,7 +3835,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3978,7 +3978,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4184,7 +4184,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4324,7 +4324,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4464,7 +4464,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4608,7 +4608,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4785,7 +4785,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4925,7 +4925,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5069,7 +5069,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5208,7 +5208,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5348,7 +5348,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5492,7 +5492,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5663,7 +5663,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5803,7 +5803,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5943,7 +5943,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6083,7 +6083,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6227,7 +6227,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6291,7 +6291,7 @@
                         parseNewExpression(return)
                           isNextIdentifier(new)
                           listener: beginNewExpression(new)
-                          parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                          parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                             ensureIdentifier(new, constructorReference)
                               insertSyntheticIdentifier(new, constructorReference, message: Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}], messageOnToken: null)
                                 reportRecoverableError((, Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}])
@@ -6376,7 +6376,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6510,7 +6510,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6650,7 +6650,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6790,7 +6790,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6930,7 +6930,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7070,7 +7070,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7210,7 +7210,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7350,7 +7350,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7494,7 +7494,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7637,7 +7637,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7772,7 +7772,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7912,7 +7912,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8052,7 +8052,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8192,7 +8192,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8336,7 +8336,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8473,7 +8473,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8659,7 +8659,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8801,7 +8801,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8938,7 +8938,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9076,7 +9076,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9214,7 +9214,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9391,7 +9391,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9535,7 +9535,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9770,7 +9770,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10006,7 +10006,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10187,7 +10187,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10326,7 +10326,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.expect b/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.expect
index b1c728f..3ec322e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.expect
@@ -34,7 +34,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -103,7 +103,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.intertwined.expect
index f836250..a3ee2de 100644
--- a/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -71,7 +71,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -99,7 +99,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -140,7 +140,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -171,7 +171,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.expect b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.expect
index db4e1b4..5f2c8b0 100644
--- a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -73,7 +73,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.intertwined.expect
index e702d5a..0bfc02a 100644
--- a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -67,7 +67,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -91,7 +91,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -128,7 +128,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -155,7 +155,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.expect b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.expect
index b16f9b0..2975c4f 100644
--- a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.expect
@@ -30,7 +30,7 @@
       handleNoType(B)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -56,7 +56,7 @@
       handleNoType(M1)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(foo)
diff --git a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.intertwined.expect
index 56c4e3a..ec3e1aa 100644
--- a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.intertwined.expect
@@ -19,10 +19,10 @@
             parseClassExtendsOpt(B)
               listener: handleNoType(B)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, B)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -70,15 +70,15 @@
             parseClassExtendsOpt(M1)
               listener: handleNoType(M1)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(M1)
+            parseClassWithClauseOpt(M1)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(M1)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(M1)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(M1, DeclarationKind.Class, M1)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, M1)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, M1)
               parseMetadataStar({)
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -101,7 +101,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, foo, ;)
               listener: endMember()
             notEofOrValue(}, class)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, M1)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, M1)
               parseMetadataStar(;)
                 listener: beginMetadataStar(class)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/utf_16_le_content.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/utf_16_le_content.crash_dart.expect
index 3f3e286..7790834 100644
--- a/pkg/front_end/parser_testcases/error_recovery/utf_16_le_content.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/utf_16_le_content.crash_dart.expect
Binary files differ
diff --git a/pkg/front_end/parser_testcases/error_recovery/utf_16_le_content.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/utf_16_le_content.crash_dart.intertwined.expect
index c6b78bca..d506c5a 100644
--- a/pkg/front_end/parser_testcases/error_recovery/utf_16_le_content.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/utf_16_le_content.crash_dart.intertwined.expect
@@ -133,7 +133,7 @@
                 ensureIdentifier((, formalParameterDeclaration)
                   listener: handleIdentifier(c, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/extension_named_type.dart.expect b/pkg/front_end/parser_testcases/extension_named_type.dart.expect
index f259fc6..cf2bd6f 100644
--- a/pkg/front_end/parser_testcases/extension_named_type.dart.expect
+++ b/pkg/front_end/parser_testcases/extension_named_type.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -58,7 +58,7 @@
           handleType(A, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       handleIdentifier(type, expression)
diff --git a/pkg/front_end/parser_testcases/extension_named_type.dart.intertwined.expect b/pkg/front_end/parser_testcases/extension_named_type.dart.intertwined.expect
index b13d6fc..f67f847 100644
--- a/pkg/front_end/parser_testcases/extension_named_type.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extension_named_type.dart.intertwined.expect
@@ -19,10 +19,10 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -47,7 +47,7 @@
         parseClassOrMixinOrExtensionBody(A, DeclarationKind.Extension, type)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, method)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, type)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, type)
             parseMetadataStar({)
               listener: beginMetadataStar(method)
               listener: endMetadataStar(0)
@@ -111,7 +111,7 @@
                 ensureIdentifier(A, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -140,7 +140,7 @@
                                       parseNewExpression(()
                                         isNextIdentifier(new)
                                         listener: beginNewExpression(new)
-                                        parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                        parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                           ensureIdentifier(new, constructorReference)
                                             listener: handleIdentifier(A, constructorReference)
                                           listener: beginConstructorReference(A)
diff --git a/pkg/front_end/parser_testcases/extension_type.dart.expect b/pkg/front_end/parser_testcases/extension_type.dart.expect
index 34b0e66..69cafad 100644
--- a/pkg/front_end/parser_testcases/extension_type.dart.expect
+++ b/pkg/front_end/parser_testcases/extension_type.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/extension_type.dart.intertwined.expect b/pkg/front_end/parser_testcases/extension_type.dart.intertwined.expect
index eb48c9c..200f4ca 100644
--- a/pkg/front_end/parser_testcases/extension_type.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extension_type.dart.intertwined.expect
@@ -19,10 +19,10 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
diff --git a/pkg/front_end/parser_testcases/extensions/covariant.dart.expect b/pkg/front_end/parser_testcases/extensions/covariant.dart.expect
index 8f6d478..2d5e28f 100644
--- a/pkg/front_end/parser_testcases/extensions/covariant.dart.expect
+++ b/pkg/front_end/parser_testcases/extensions/covariant.dart.expect
@@ -14,7 +14,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -31,7 +31,7 @@
       handleType(A, null)
       handleClassExtends(extends, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -64,7 +64,7 @@
                 handleType(A, null)
                 handleIdentifier(child, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+              endFormalParameter(null, null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/extensions/covariant.dart.intertwined.expect b/pkg/front_end/parser_testcases/extensions/covariant.dart.intertwined.expect
index af843af..8dac2d3 100644
--- a/pkg/front_end/parser_testcases/extensions/covariant.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extensions/covariant.dart.intertwined.expect
@@ -19,10 +19,10 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -50,10 +50,10 @@
                 listener: handleNoTypeArguments({)
                 listener: handleType(A, null)
                 listener: handleClassExtends(extends, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -78,7 +78,7 @@
         parseClassOrMixinOrExtensionBody(C, DeclarationKind.Extension, null)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, addChild)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, null)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, null)
             parseMetadataStar({)
               listener: beginMetadataStar(addChild)
               listener: endMetadataStar(0)
@@ -109,7 +109,7 @@
                       ensureIdentifier(A, formalParameterDeclaration)
                         listener: handleIdentifier(child, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue())
-                      listener: endFormalParameter(null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+                      listener: endFormalParameter(null, null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
                     listener: endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
               parseInitializersOpt())
                 listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/extensions/not_covariant.dart.expect b/pkg/front_end/parser_testcases/extensions/not_covariant.dart.expect
index e551ab3..a66993b 100644
--- a/pkg/front_end/parser_testcases/extensions/not_covariant.dart.expect
+++ b/pkg/front_end/parser_testcases/extensions/not_covariant.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -25,7 +25,7 @@
       handleType(A, null)
       handleClassExtends(extends, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -57,7 +57,7 @@
                 handleType(A, null)
                 handleIdentifier(child, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+              endFormalParameter(null, null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/extensions/not_covariant.dart.intertwined.expect b/pkg/front_end/parser_testcases/extensions/not_covariant.dart.intertwined.expect
index fbe25b2..8b610fd 100644
--- a/pkg/front_end/parser_testcases/extensions/not_covariant.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extensions/not_covariant.dart.intertwined.expect
@@ -19,10 +19,10 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -50,10 +50,10 @@
                 listener: handleNoTypeArguments({)
                 listener: handleType(A, null)
                 listener: handleClassExtends(extends, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -78,7 +78,7 @@
         parseClassOrMixinOrExtensionBody(C, DeclarationKind.Extension, null)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, addChild)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, null)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, null)
             parseMetadataStar({)
               listener: beginMetadataStar(addChild)
               listener: endMetadataStar(0)
@@ -107,7 +107,7 @@
                       ensureIdentifier(A, formalParameterDeclaration)
                         listener: handleIdentifier(child, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue())
-                      listener: endFormalParameter(null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+                      listener: endFormalParameter(null, null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
                     listener: endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
               parseInitializersOpt())
                 listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/extensions/static.dart.expect b/pkg/front_end/parser_testcases/extensions/static.dart.expect
index 10fc0d8..0a73b25 100644
--- a/pkg/front_end/parser_testcases/extensions/static.dart.expect
+++ b/pkg/front_end/parser_testcases/extensions/static.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -25,7 +25,7 @@
       handleType(A, null)
       handleClassExtends(extends, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -57,7 +57,7 @@
                 handleType(A, null)
                 handleIdentifier(child, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionStaticMethod)
+              endFormalParameter(null, null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionStaticMethod)
             endFormalParameters(1, (, ), MemberKind.ExtensionStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/extensions/static.dart.intertwined.expect b/pkg/front_end/parser_testcases/extensions/static.dart.intertwined.expect
index 815a5a1..9efff07 100644
--- a/pkg/front_end/parser_testcases/extensions/static.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extensions/static.dart.intertwined.expect
@@ -19,10 +19,10 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -50,10 +50,10 @@
                 listener: handleNoTypeArguments({)
                 listener: handleType(A, null)
                 listener: handleClassExtends(extends, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -78,7 +78,7 @@
         parseClassOrMixinOrExtensionBody(C, DeclarationKind.Extension, null)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, static)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, null)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, null)
             parseMetadataStar({)
               listener: beginMetadataStar(static)
               listener: endMetadataStar(0)
@@ -107,7 +107,7 @@
                       ensureIdentifier(A, formalParameterDeclaration)
                         listener: handleIdentifier(child, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue())
-                      listener: endFormalParameter(null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionStaticMethod)
+                      listener: endFormalParameter(null, null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionStaticMethod)
                     listener: endFormalParameters(1, (, ), MemberKind.ExtensionStaticMethod)
               parseInitializersOpt())
                 listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/extensions/static_covariant.dart.expect b/pkg/front_end/parser_testcases/extensions/static_covariant.dart.expect
index b0745de..6e3a17c 100644
--- a/pkg/front_end/parser_testcases/extensions/static_covariant.dart.expect
+++ b/pkg/front_end/parser_testcases/extensions/static_covariant.dart.expect
@@ -14,7 +14,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -31,7 +31,7 @@
       handleType(A, null)
       handleClassExtends(extends, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -64,7 +64,7 @@
                 handleType(A, null)
                 handleIdentifier(child, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionStaticMethod)
+              endFormalParameter(null, null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionStaticMethod)
             endFormalParameters(1, (, ), MemberKind.ExtensionStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/extensions/static_covariant.dart.intertwined.expect b/pkg/front_end/parser_testcases/extensions/static_covariant.dart.intertwined.expect
index a0f640c..c7ba3ab 100644
--- a/pkg/front_end/parser_testcases/extensions/static_covariant.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extensions/static_covariant.dart.intertwined.expect
@@ -19,10 +19,10 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -50,10 +50,10 @@
                 listener: handleNoTypeArguments({)
                 listener: handleType(A, null)
                 listener: handleClassExtends(extends, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -78,7 +78,7 @@
         parseClassOrMixinOrExtensionBody(C, DeclarationKind.Extension, null)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, static)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, null)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, null)
             parseMetadataStar({)
               listener: beginMetadataStar(static)
               listener: endMetadataStar(0)
@@ -109,7 +109,7 @@
                       ensureIdentifier(A, formalParameterDeclaration)
                         listener: handleIdentifier(child, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue())
-                      listener: endFormalParameter(null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionStaticMethod)
+                      listener: endFormalParameter(null, null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionStaticMethod)
                     listener: endFormalParameters(1, (, ), MemberKind.ExtensionStaticMethod)
               parseInitializersOpt())
                 listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.expect b/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.expect
index eb5a5c5..ea7558e 100644
--- a/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.expect
+++ b/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(WrapperClass)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.intertwined.expect
index 1b1c156..4196505 100644
--- a/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(WrapperClass)
               listener: handleNoType(WrapperClass)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(WrapperClass)
+            parseClassWithClauseOpt(WrapperClass)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(WrapperClass)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(WrapperClass)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(WrapperClass, DeclarationKind.Class, WrapperClass)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, WrapperClass)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -51,7 +51,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -75,7 +75,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -99,7 +99,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -123,7 +123,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -147,7 +147,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -171,7 +171,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -195,7 +195,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -219,7 +219,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -243,7 +243,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -268,7 +268,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -292,7 +292,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -316,7 +316,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -340,7 +340,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -364,7 +364,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -389,7 +389,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -413,7 +413,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -437,7 +437,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -462,7 +462,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -486,7 +486,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.expect b/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.expect
index d1604a9..be1cef5 100644
--- a/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.expect
+++ b/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(WrapperClass)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -29,7 +29,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -84,7 +84,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -139,7 +139,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -194,7 +194,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -249,7 +249,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -304,7 +304,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -359,7 +359,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -414,7 +414,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -469,7 +469,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -524,7 +524,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -579,7 +579,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -634,7 +634,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -689,7 +689,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -744,7 +744,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -799,7 +799,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -854,7 +854,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -909,7 +909,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -964,7 +964,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1019,7 +1019,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1074,7 +1074,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.intertwined.expect
index 04a06f3..7196e63 100644
--- a/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(WrapperClass)
               listener: handleNoType(WrapperClass)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(WrapperClass)
+            parseClassWithClauseOpt(WrapperClass)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(WrapperClass)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(WrapperClass)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(WrapperClass, DeclarationKind.Class, WrapperClass)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, WrapperClass)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -57,7 +57,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -164,7 +164,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -194,7 +194,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -301,7 +301,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -331,7 +331,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -438,7 +438,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -468,7 +468,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -575,7 +575,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -605,7 +605,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -712,7 +712,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -742,7 +742,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -849,7 +849,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -879,7 +879,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -986,7 +986,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1016,7 +1016,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1123,7 +1123,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1153,7 +1153,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1260,7 +1260,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1291,7 +1291,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1398,7 +1398,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1428,7 +1428,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1535,7 +1535,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1565,7 +1565,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1672,7 +1672,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1702,7 +1702,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1809,7 +1809,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1839,7 +1839,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1946,7 +1946,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1978,7 +1978,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2085,7 +2085,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2115,7 +2115,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2222,7 +2222,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2252,7 +2252,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2359,7 +2359,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2390,7 +2390,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2497,7 +2497,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2527,7 +2527,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2634,7 +2634,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2664,7 +2664,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/general/built_in_identifier_top_level_methods.dart.expect b/pkg/front_end/parser_testcases/general/built_in_identifier_top_level_methods.dart.expect
index 024c844..0304d29 100644
--- a/pkg/front_end/parser_testcases/general/built_in_identifier_top_level_methods.dart.expect
+++ b/pkg/front_end/parser_testcases/general/built_in_identifier_top_level_methods.dart.expect
@@ -17,7 +17,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -71,7 +71,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -125,7 +125,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -179,7 +179,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -233,7 +233,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -287,7 +287,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -341,7 +341,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -395,7 +395,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -449,7 +449,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -503,7 +503,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -557,7 +557,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -611,7 +611,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -665,7 +665,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -719,7 +719,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -773,7 +773,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -827,7 +827,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -881,7 +881,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -935,7 +935,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -989,7 +989,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1043,7 +1043,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/built_in_identifier_top_level_methods.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/built_in_identifier_top_level_methods.dart.intertwined.expect
index cdb944d..61e3d1b 100644
--- a/pkg/front_end/parser_testcases/general/built_in_identifier_top_level_methods.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/built_in_identifier_top_level_methods.dart.intertwined.expect
@@ -32,7 +32,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -165,7 +165,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -298,7 +298,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -431,7 +431,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -564,7 +564,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -697,7 +697,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -830,7 +830,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -963,7 +963,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1096,7 +1096,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1229,7 +1229,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1362,7 +1362,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1495,7 +1495,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1628,7 +1628,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1761,7 +1761,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1894,7 +1894,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2027,7 +2027,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2160,7 +2160,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2293,7 +2293,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2426,7 +2426,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2559,7 +2559,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_01.dart.expect b/pkg/front_end/parser_testcases/general/chained_call_01.dart.expect
index fed7e21..339b30f 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_01.dart.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_01.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/chained_call_01.dart.intertwined.expect
index 10d1bd2..4db3219 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_01.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_02.dart.expect b/pkg/front_end/parser_testcases/general/chained_call_02.dart.expect
index f68f942..920de7d 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_02.dart.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_02.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/chained_call_02.dart.intertwined.expect
index 5e65f72..07a9f87 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_02.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_02.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_03.dart.expect b/pkg/front_end/parser_testcases/general/chained_call_03.dart.expect
index 8486437..f18f5e1 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_03.dart.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_03.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_03.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/chained_call_03.dart.intertwined.expect
index a3e6477..e4ee639 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_03.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_03.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_04.dart.expect b/pkg/front_end/parser_testcases/general/chained_call_04.dart.expect
index d970ac1..a92ef45 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_04.dart.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_04.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_04.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/chained_call_04.dart.intertwined.expect
index a2161dd..ca056bd 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_04.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_04.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_05.dart.expect b/pkg/front_end/parser_testcases/general/chained_call_05.dart.expect
index d74b313..b80b01b 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_05.dart.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_05.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_05.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/chained_call_05.dart.intertwined.expect
index 0dff100..6b51be2 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_05.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_05.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_06.dart.expect b/pkg/front_end/parser_testcases/general/chained_call_06.dart.expect
index 1155593..2738857 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_06.dart.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_06.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_06.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/chained_call_06.dart.intertwined.expect
index 2c3bccc..e2e0d1a 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_06.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_06.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_07.dart.expect b/pkg/front_end/parser_testcases/general/chained_call_07.dart.expect
index 35f2f36..487dc8f 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_07.dart.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_07.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_07.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/chained_call_07.dart.intertwined.expect
index f30bf4b..a4b6952 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_07.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_07.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect
index 11e6ef5..b8955d7 100644
--- a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect
@@ -398,7 +398,7 @@
               parseUnaryExpression(=, true)
                 parseImplicitCreationExpression(=, <, Instance of 'ComplexTypeParamOrArgInfo')
                   listener: beginImplicitCreationExpression(f)
-                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'ComplexTypeParamOrArgInfo')
+                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'ComplexTypeParamOrArgInfo', false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(f, constructorReference)
                     listener: beginConstructorReference(f)
diff --git a/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.expect b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.expect
index 3b9714d..ec7a398 100644
--- a/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.expect
+++ b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.expect
@@ -614,7 +614,7 @@
             endFunctionType(Function, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -650,7 +650,7 @@
             endFunctionType(Function, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -690,7 +690,7 @@
             endFunctionType(Function, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -734,7 +734,7 @@
             endFunctionType(Function, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -778,7 +778,7 @@
             endFunctionType(Function, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -822,7 +822,7 @@
             endFunctionType(Function, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
diff --git a/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.intertwined.expect
index 1f25d5e..ef579de 100644
--- a/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.intertwined.expect
@@ -861,7 +861,7 @@
               listener: endFunctionType(Function, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -912,7 +912,7 @@
               listener: endFunctionType(Function, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -969,7 +969,7 @@
               listener: endFunctionType(Function, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -1030,7 +1030,7 @@
               listener: endFunctionType(Function, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -1091,7 +1091,7 @@
               listener: endFunctionType(Function, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -1152,7 +1152,7 @@
               listener: endFunctionType(Function, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
diff --git a/pkg/front_end/parser_testcases/general/issue_41121.dart.expect b/pkg/front_end/parser_testcases/general/issue_41121.dart.expect
index 494fec3..31e37e0 100644
--- a/pkg/front_end/parser_testcases/general/issue_41121.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_41121.dart.expect
@@ -50,7 +50,7 @@
       handleNoType(ConfigurationService)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Configuration)
@@ -80,7 +80,7 @@
                 handleType(Configuration, null)
                 handleIdentifier(configuration, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, configuration, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, configuration, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(assert)
@@ -127,7 +127,7 @@
                 handleType(Configuration, null)
                 handleIdentifier(configuration, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, configuration, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, configuration, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(assert)
@@ -279,7 +279,7 @@
       handleNoType(Configuration)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Configuration)
diff --git a/pkg/front_end/parser_testcases/general/issue_41121.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_41121.dart.intertwined.expect
index cbffc96..ee486f9 100644
--- a/pkg/front_end/parser_testcases/general/issue_41121.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_41121.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(ConfigurationService)
               listener: handleNoType(ConfigurationService)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(ConfigurationService)
+            parseClassWithClauseOpt(ConfigurationService)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(ConfigurationService)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(ConfigurationService)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(ConfigurationService, DeclarationKind.Class, ConfigurationService)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Configuration)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, ConfigurationService)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, ConfigurationService)
               parseMetadataStar({)
                 listener: beginMetadataStar(Configuration)
                 listener: endMetadataStar(0)
@@ -44,7 +44,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, Configuration, ;)
               listener: endMember()
             notEofOrValue(}, ConfigurationService)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, ConfigurationService)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, ConfigurationService)
               parseMetadataStar(;)
                 listener: beginMetadataStar(ConfigurationService)
                 listener: endMetadataStar(0)
@@ -73,7 +73,7 @@
                         ensureIdentifier(Configuration, formalParameterDeclaration)
                           listener: handleIdentifier(configuration, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, configuration, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, configuration, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -146,7 +146,7 @@
                 listener: endClassConstructor(null, ConfigurationService, (, :, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, ConfigurationService)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, ConfigurationService)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -173,7 +173,7 @@
                         ensureIdentifier(Configuration, formalParameterDeclaration)
                           listener: handleIdentifier(configuration, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, configuration, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, configuration, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -253,7 +253,7 @@
                 listener: endClassConstructor(set, void, (, :, })
               listener: endMember()
             notEofOrValue(}, Configuration)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, ConfigurationService)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, ConfigurationService)
               parseMetadataStar(})
                 listener: beginMetadataStar(Configuration)
                 listener: endMetadataStar(0)
@@ -385,7 +385,7 @@
                 listener: endClassConstructor(get, Configuration, (, :, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, ConfigurationService)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, ConfigurationService)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -445,7 +445,7 @@
                 listener: endClassConstructor(null, void, (, :, })
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, ConfigurationService)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, ConfigurationService)
               parseMetadataStar(})
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -524,15 +524,15 @@
             parseClassExtendsOpt(Configuration)
               listener: handleNoType(Configuration)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Configuration)
+            parseClassWithClauseOpt(Configuration)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Configuration)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Configuration)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Configuration, DeclarationKind.Class, Configuration)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Configuration)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Configuration)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Configuration)
               parseMetadataStar({)
                 listener: beginMetadataStar(Configuration)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/general/issue_45120.dart.expect b/pkg/front_end/parser_testcases/general/issue_45120.dart.expect
index dda69fa..be61163 100644
--- a/pkg/front_end/parser_testcases/general/issue_45120.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45120.dart.expect
@@ -79,7 +79,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -150,7 +150,7 @@
               handleType(int, null)
               handleIdentifier(y, formalParameterDeclaration)
               handleFormalParameterWithoutValue())
-            endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
           endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         endFunctionType(Function, ?)
         beginVariablesDeclaration(f, null, null)
diff --git a/pkg/front_end/parser_testcases/general/issue_45120.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45120.dart.intertwined.expect
index 412b5a6..1d825dd 100644
--- a/pkg/front_end/parser_testcases/general/issue_45120.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45120.dart.intertwined.expect
@@ -141,7 +141,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -272,7 +272,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
                       listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
                   listener: endFunctionType(Function, ?)
                   listener: beginVariablesDeclaration(f, null, null)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.expect
index 9020ccd..56fea87 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_01.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.expect
@@ -15,7 +15,7 @@
           handleType(bool, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -24,7 +24,7 @@
           handleType(int, null)
           handleIdentifier(i, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -67,7 +67,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -76,7 +76,7 @@
           handleType(int, null)
           handleIdentifier(y, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(Object)
         endMetadataStar(0)
         beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
@@ -85,7 +85,7 @@
           handleType(Object, null)
           handleIdentifier(o, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.intertwined.expect
index 966c170..e11f90e 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -42,7 +42,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(i, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -139,7 +139,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -151,7 +151,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(y, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(Object)
@@ -163,7 +163,7 @@
                 ensureIdentifier(Object, formalParameterDeclaration)
                   listener: handleIdentifier(o, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.expect
index 53f02db..783ba33 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.expect
@@ -15,7 +15,7 @@
           handleType(bool, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -24,7 +24,7 @@
           handleType(int, null)
           handleIdentifier(i, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -67,7 +67,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -76,7 +76,7 @@
           handleType(int, null)
           handleIdentifier(y, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(Object)
         endMetadataStar(0)
         beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
@@ -85,7 +85,7 @@
           handleType(Object, null)
           handleIdentifier(o, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.intertwined.expect
index f5f9fc0..b3285c7 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -42,7 +42,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(i, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -139,7 +139,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -151,7 +151,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(y, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(Object)
@@ -163,7 +163,7 @@
                 ensureIdentifier(Object, formalParameterDeclaration)
                   listener: handleIdentifier(o, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.expect
index bbefeb2..bb09df4 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_02.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.expect
@@ -15,7 +15,7 @@
           handleType(bool, null)
           handleIdentifier(b1, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(bool)
         endMetadataStar(0)
         beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
@@ -24,7 +24,7 @@
           handleType(bool, null)
           handleIdentifier(b2, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -67,7 +67,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -76,7 +76,7 @@
           handleType(int, null)
           handleIdentifier(y, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(Object)
         endMetadataStar(0)
         beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
@@ -85,7 +85,7 @@
           handleType(Object, null)
           handleIdentifier(o, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.intertwined.expect
index 5d234d5..5267088 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_02.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b1, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(bool)
@@ -42,7 +42,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b2, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -139,7 +139,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -151,7 +151,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(y, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(Object)
@@ -163,7 +163,7 @@
                 ensureIdentifier(Object, formalParameterDeclaration)
                   listener: handleIdentifier(o, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.expect
index 71b505f..ee5784b 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.expect
@@ -15,7 +15,7 @@
           handleType(bool, null)
           handleIdentifier(b1, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(bool)
         endMetadataStar(0)
         beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
@@ -24,7 +24,7 @@
           handleType(bool, null)
           handleIdentifier(b2, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -67,7 +67,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -76,7 +76,7 @@
           handleType(int, null)
           handleIdentifier(y, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(Object)
         endMetadataStar(0)
         beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
@@ -85,7 +85,7 @@
           handleType(Object, null)
           handleIdentifier(o, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.intertwined.expect
index 0c2dc47..6809693 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b1, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(bool)
@@ -42,7 +42,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b2, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -139,7 +139,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -151,7 +151,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(y, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(Object)
@@ -163,7 +163,7 @@
                 ensureIdentifier(Object, formalParameterDeclaration)
                   listener: handleIdentifier(o, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.expect
index 6058857..2af7731 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_03.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.expect
@@ -15,7 +15,7 @@
           handleType(bool, null)
           handleIdentifier(b1, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(bool)
         endMetadataStar(0)
         beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
@@ -24,7 +24,7 @@
           handleType(bool, null)
           handleIdentifier(b2, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -67,7 +67,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -76,7 +76,7 @@
           handleType(int, null)
           handleIdentifier(y, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(Object)
         endMetadataStar(0)
         beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
@@ -85,7 +85,7 @@
           handleType(Object, null)
           handleIdentifier(o, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(Object)
         endMetadataStar(0)
         beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
@@ -94,7 +94,7 @@
           handleType(Object, null)
           handleIdentifier(p, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(4, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.intertwined.expect
index abf7863..2ceba23 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_03.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b1, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(bool)
@@ -42,7 +42,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b2, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -139,7 +139,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -151,7 +151,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(y, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(Object)
@@ -163,7 +163,7 @@
                 ensureIdentifier(Object, formalParameterDeclaration)
                   listener: handleIdentifier(o, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(Object)
@@ -175,7 +175,7 @@
                 ensureIdentifier(Object, formalParameterDeclaration)
                   listener: handleIdentifier(p, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(4, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.expect
index d5df020..ec48ff4 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.expect
@@ -15,7 +15,7 @@
           handleType(bool, null)
           handleIdentifier(b1, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(bool)
         endMetadataStar(0)
         beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
@@ -24,7 +24,7 @@
           handleType(bool, null)
           handleIdentifier(b2, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -67,7 +67,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -76,7 +76,7 @@
           handleType(int, null)
           handleIdentifier(y, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(Object)
         endMetadataStar(0)
         beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
@@ -85,7 +85,7 @@
           handleType(Object, null)
           handleIdentifier(o, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(Object)
         endMetadataStar(0)
         beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
@@ -94,7 +94,7 @@
           handleType(Object, null)
           handleIdentifier(p, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(4, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.intertwined.expect
index 2f77140..48f9c8b 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b1, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(bool)
@@ -42,7 +42,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b2, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -139,7 +139,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -151,7 +151,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(y, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(Object)
@@ -163,7 +163,7 @@
                 ensureIdentifier(Object, formalParameterDeclaration)
                   listener: handleIdentifier(o, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(Object)
@@ -175,7 +175,7 @@
                 ensureIdentifier(Object, formalParameterDeclaration)
                   listener: handleIdentifier(p, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(4, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/metadata.dart.expect b/pkg/front_end/parser_testcases/general/metadata.dart.expect
index eddf5e6..591d9e1 100644
--- a/pkg/front_end/parser_testcases/general/metadata.dart.expect
+++ b/pkg/front_end/parser_testcases/general/metadata.dart.expect
@@ -111,7 +111,7 @@
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -168,7 +168,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -230,7 +230,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -295,7 +295,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -360,7 +360,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -431,7 +431,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -505,7 +505,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -582,7 +582,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -662,7 +662,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -745,7 +745,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -831,7 +831,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -943,7 +943,7 @@
       handleNoType(Y)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/general/metadata.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/metadata.dart.intertwined.expect
index 905a217..676c00f 100644
--- a/pkg/front_end/parser_testcases/general/metadata.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/metadata.dart.intertwined.expect
@@ -241,10 +241,10 @@
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -333,7 +333,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -432,7 +432,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -537,7 +537,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -654,7 +654,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -786,7 +786,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -924,7 +924,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -1053,7 +1053,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -1191,7 +1191,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -1332,7 +1332,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -1482,7 +1482,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -1726,10 +1726,10 @@
             parseClassExtendsOpt(Y)
               listener: handleNoType(Y)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Y)
+            parseClassWithClauseOpt(Y)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Y)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Y)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Y, DeclarationKind.Class, Y)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
diff --git a/pkg/front_end/parser_testcases/general/new_as_identifier.dart.expect b/pkg/front_end/parser_testcases/general/new_as_identifier.dart.expect
index 97bcac4..988d84a 100644
--- a/pkg/front_end/parser_testcases/general/new_as_identifier.dart.expect
+++ b/pkg/front_end/parser_testcases/general/new_as_identifier.dart.expect
@@ -50,7 +50,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(C)
@@ -151,7 +151,7 @@
       handleNoType(D)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(factory)
diff --git a/pkg/front_end/parser_testcases/general/new_as_identifier.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/new_as_identifier.dart.intertwined.expect
index 7af61b0..a0d0817 100644
--- a/pkg/front_end/parser_testcases/general/new_as_identifier.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/new_as_identifier.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -63,7 +63,7 @@
                 listener: endClassConstructor(null, C, (, null, ;)
               listener: endMember()
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -148,7 +148,7 @@
                 listener: endClassConstructor(null, C, (, :, })
               listener: endMember()
             notEofOrValue(}, new)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, C)
               parseMetadataStar(})
                 listener: beginMetadataStar(new)
                 listener: endMetadataStar(0)
@@ -159,7 +159,7 @@
                 listener: handleInvalidMember(new)
                 listener: endMember()
             notEofOrValue(}, =)
-            parseClassOrMixinOrExtensionMemberImpl(new, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(new, DeclarationKind.Class, C)
               parseMetadataStar(new)
                 listener: beginMetadataStar(=)
                 listener: endMetadataStar(0)
@@ -204,7 +204,7 @@
                     listener: endClassMethod(null, operator, (, null, })
                   listener: endMember()
             notEofOrValue(}, null)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, C)
               parseMetadataStar(})
                 listener: beginMetadataStar(null)
                 listener: endMetadataStar(0)
@@ -215,7 +215,7 @@
                 listener: handleInvalidMember(null)
                 listener: endMember()
             notEofOrValue(}, ;)
-            parseClassOrMixinOrExtensionMemberImpl(null, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(null, DeclarationKind.Class, C)
               parseMetadataStar(null)
                 listener: beginMetadataStar(;)
                 listener: endMetadataStar(0)
@@ -246,15 +246,15 @@
             parseClassExtendsOpt(D)
               listener: handleNoType(D)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(D)
+            parseClassWithClauseOpt(D)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(D)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(D)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(D, DeclarationKind.Class, D)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, factory)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, D)
               parseMetadataStar({)
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
@@ -305,7 +305,7 @@
                 listener: endClassFactoryMethod(factory, factory, ;)
               listener: endMember()
             notEofOrValue(}, factory)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
@@ -331,7 +331,7 @@
                 inPlainSync()
                 parseRedirectingFactoryBody())
                   listener: beginRedirectingFactoryBody(=)
-                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null)
+                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null, false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(C, constructorReference)
                     listener: beginConstructorReference(C)
@@ -350,7 +350,7 @@
                 listener: endClassFactoryMethod(factory, factory, ;)
               listener: endMember()
             notEofOrValue(}, factory)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
@@ -376,7 +376,7 @@
                 inPlainSync()
                 parseRedirectingFactoryBody())
                   listener: beginRedirectingFactoryBody(=)
-                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null)
+                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null, false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(C, constructorReference)
                     listener: beginConstructorReference(C)
@@ -396,7 +396,7 @@
                 listener: endClassFactoryMethod(factory, factory, ;)
               listener: endMember()
             notEofOrValue(}, factory)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
@@ -422,7 +422,7 @@
                 inPlainSync()
                 parseRedirectingFactoryBody())
                   listener: beginRedirectingFactoryBody(=)
-                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null)
+                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null, false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(prefix, constructorReference)
                     listener: beginConstructorReference(prefix)
@@ -442,7 +442,7 @@
                 listener: endClassFactoryMethod(factory, factory, ;)
               listener: endMember()
             notEofOrValue(}, factory)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
@@ -468,7 +468,7 @@
                 inPlainSync()
                 parseRedirectingFactoryBody())
                   listener: beginRedirectingFactoryBody(=)
-                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null)
+                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null, false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(prefix, constructorReference)
                     listener: beginConstructorReference(prefix)
@@ -492,7 +492,7 @@
                 listener: endClassFactoryMethod(factory, factory, ;)
               listener: endMember()
             notEofOrValue(}, D)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(D)
                 listener: endMetadataStar(0)
@@ -555,7 +555,7 @@
                 listener: endClassConstructor(null, D, (, :, ;)
               listener: endMember()
             notEofOrValue(}, D)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(D)
                 listener: endMetadataStar(0)
@@ -639,7 +639,7 @@
                 parsePrimary(=, expression)
                   parseConstExpression(=)
                     listener: beginConstExpression(const)
-                    parseConstructorReference(const, ConstructorReferenceContext.Const, null)
+                    parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
                       ensureIdentifier(const, constructorReference)
                         listener: handleIdentifier(C, constructorReference)
                       listener: beginConstructorReference(C)
@@ -680,7 +680,7 @@
                 parsePrimary(=, expression)
                   parseConstExpression(=)
                     listener: beginConstExpression(const)
-                    parseConstructorReference(const, ConstructorReferenceContext.Const, null)
+                    parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
                       ensureIdentifier(const, constructorReference)
                         listener: handleIdentifier(C, constructorReference)
                       listener: beginConstructorReference(C)
@@ -722,7 +722,7 @@
                 parsePrimary(=, expression)
                   parseConstExpression(=)
                     listener: beginConstExpression(const)
-                    parseConstructorReference(const, ConstructorReferenceContext.Const, null)
+                    parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
                       ensureIdentifier(const, constructorReference)
                         listener: handleIdentifier(prefix, constructorReference)
                       listener: beginConstructorReference(prefix)
@@ -764,7 +764,7 @@
                 parsePrimary(=, expression)
                   parseConstExpression(=)
                     listener: beginConstExpression(const)
-                    parseConstructorReference(const, ConstructorReferenceContext.Const, null)
+                    parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
                       ensureIdentifier(const, constructorReference)
                         listener: handleIdentifier(prefix, constructorReference)
                       listener: beginConstructorReference(prefix)
@@ -811,7 +811,7 @@
                   parseNewExpression(=)
                     isNextIdentifier(new)
                     listener: beginNewExpression(new)
-                    parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                    parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                       ensureIdentifier(new, constructorReference)
                         listener: handleIdentifier(C, constructorReference)
                       listener: beginConstructorReference(C)
@@ -853,7 +853,7 @@
                   parseNewExpression(=)
                     isNextIdentifier(new)
                     listener: beginNewExpression(new)
-                    parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                    parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                       ensureIdentifier(new, constructorReference)
                         listener: handleIdentifier(C, constructorReference)
                       listener: beginConstructorReference(C)
@@ -896,7 +896,7 @@
                   parseNewExpression(=)
                     isNextIdentifier(new)
                     listener: beginNewExpression(new)
-                    parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                    parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                       ensureIdentifier(new, constructorReference)
                         listener: handleIdentifier(prefix, constructorReference)
                       listener: beginConstructorReference(prefix)
@@ -939,7 +939,7 @@
                   parseNewExpression(=)
                     isNextIdentifier(new)
                     listener: beginNewExpression(new)
-                    parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                    parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                       ensureIdentifier(new, constructorReference)
                         listener: handleIdentifier(prefix, constructorReference)
                       listener: beginConstructorReference(prefix)
@@ -1030,7 +1030,7 @@
               parseUnaryExpression(=, true)
                 parseImplicitCreationExpression(=, <, Instance of 'SimpleTypeArgument1')
                   listener: beginImplicitCreationExpression(C)
-                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'SimpleTypeArgument1')
+                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'SimpleTypeArgument1', false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(C, constructorReference)
                     listener: beginConstructorReference(C)
@@ -1128,7 +1128,7 @@
               parseUnaryExpression(=, true)
                 parseImplicitCreationExpression(=, <, Instance of 'SimpleTypeArgument1')
                   listener: beginImplicitCreationExpression(prefix)
-                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'SimpleTypeArgument1')
+                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'SimpleTypeArgument1', false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(prefix, constructorReference)
                     listener: beginConstructorReference(prefix)
diff --git a/pkg/front_end/parser_testcases/general/operator_01.dart.expect b/pkg/front_end/parser_testcases/general/operator_01.dart.expect
index ff9df52..7a98e55 100644
--- a/pkg/front_end/parser_testcases/general/operator_01.dart.expect
+++ b/pkg/front_end/parser_testcases/general/operator_01.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(bool)
@@ -29,7 +29,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -58,7 +58,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -87,7 +87,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -116,7 +116,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -145,7 +145,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/operator_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/operator_01.dart.intertwined.expect
index 1fe4197..150a67f 100644
--- a/pkg/front_end/parser_testcases/general/operator_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/operator_01.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, bool)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(bool)
                 listener: endMetadataStar(0)
@@ -56,7 +56,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -85,7 +85,7 @@
                 listener: endClassMethod(null, bool, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -114,7 +114,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -143,7 +143,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, bool)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(bool)
                 listener: endMetadataStar(0)
@@ -172,7 +172,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -201,7 +201,7 @@
                 listener: endClassMethod(null, bool, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -230,7 +230,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -259,7 +259,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -288,7 +288,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.expect b/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.expect
index 90dae7d..220fb22 100644
--- a/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.expect
@@ -15,7 +15,7 @@
       handleNoType(operator)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(operator)
@@ -34,7 +34,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.intertwined.expect
index 48dee75..ae300e1 100644
--- a/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.intertwined.expect
@@ -21,15 +21,15 @@
             parseClassExtendsOpt(operator)
               listener: handleNoType(operator)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(operator)
+            parseClassWithClauseOpt(operator)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(operator)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(operator)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(operator, DeclarationKind.Class, operator)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, operator)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, operator)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, operator)
               parseMetadataStar({)
                 listener: beginMetadataStar(operator)
                 listener: endMetadataStar(0)
@@ -56,7 +56,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/general/try_catch.dart.expect b/pkg/front_end/parser_testcases/general/try_catch.dart.expect
index ce7a345..72dfdce 100644
--- a/pkg/front_end/parser_testcases/general/try_catch.dart.expect
+++ b/pkg/front_end/parser_testcases/general/try_catch.dart.expect
@@ -21,14 +21,14 @@
                 handleNoType(()
                 handleIdentifier(e, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+              endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
               beginMetadataStar(s)
               endMetadataStar(0)
               beginFormalParameter(s, MemberKind.Catch, null, null, null)
                 handleNoType(,)
                 handleIdentifier(s, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, s, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+              endFormalParameter(null, null, null, s, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
             endFormalParameters(2, (, ), MemberKind.Catch)
           endCatchClause({)
           beginBlock({, BlockKind(catch clause))
diff --git a/pkg/front_end/parser_testcases/general/try_catch.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/try_catch.dart.intertwined.expect
index 10d5b1e..ec37294 100644
--- a/pkg/front_end/parser_testcases/general/try_catch.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/try_catch.dart.intertwined.expect
@@ -49,7 +49,7 @@
                       ensureIdentifier((, formalParameterDeclaration)
                         listener: handleIdentifier(e, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue(,)
-                      listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+                      listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
                     parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.Catch)
                       parseMetadataStar(,)
                         listener: beginMetadataStar(s)
@@ -59,7 +59,7 @@
                       ensureIdentifier(,, formalParameterDeclaration)
                         listener: handleIdentifier(s, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue())
-                      listener: endFormalParameter(null, null, s, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+                      listener: endFormalParameter(null, null, null, s, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
                     listener: endFormalParameters(2, (, ), MemberKind.Catch)
                 listener: endCatchClause({)
                 parseBlock(), BlockKind(catch clause))
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_01.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_01.dart.expect
index fc921e4..559ccec 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_01.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_01.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_01.dart.intertwined.expect
index 5479a37..d9048a1 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_01.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_02.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_02.dart.expect
index c6d048e..eca0386 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_02.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_02.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_02.dart.intertwined.expect
index 8b7f964..ccd3a17 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_02.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_02.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_03.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_03.dart.expect
index 91800c7..8464fb7 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_03.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_03.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_03.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_03.dart.intertwined.expect
index 511dc3e..c9e91b4 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_03.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_03.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_04.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_04.dart.expect
index 65cb64b..9255ce3 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_04.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_04.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_04.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_04.dart.intertwined.expect
index 16f5ea3..7dd363a 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_04.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_04.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.expect
index f15fac9..1529f35 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.intertwined.expect
index d52d122..629cc0a 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.expect
index 06fd0eb..37ab35f 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.intertwined.expect
index 0fa66b6..58371cc 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_07.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_07.dart.expect
index ff032b1..bcb0253 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_07.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_07.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_07.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_07.dart.intertwined.expect
index 83eb30d..1d0e15f8 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_07.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_07.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_08.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_08.dart.expect
index 07545c6..1540cdb 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_08.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_08.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_08.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_08.dart.intertwined.expect
index 0c830ed..6f56fde 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_08.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_08.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_with_index_01.dart.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_with_index_01.dart.dart.expect
index 5e2286f..12c7433 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_with_index_01.dart.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_with_index_01.dart.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_with_index_01.dart.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_with_index_01.dart.dart.intertwined.expect
index 3f62960..3cfb54ca 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_with_index_01.dart.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_with_index_01.dart.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.expect
index b9eb4f6..431b3ea 100644
--- a/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.expect
@@ -62,7 +62,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(abstract, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
@@ -174,7 +174,7 @@
       handleNoType(Bar)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(abstract, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(covariant)
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.intertwined.expect
index 93bf99d..0dad422 100644
--- a/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.intertwined.expect
@@ -20,15 +20,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(abstract, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -47,7 +47,7 @@
                 listener: endClassFields(abstract, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -64,7 +64,7 @@
                 listener: endClassFields(abstract, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
@@ -83,7 +83,7 @@
                 listener: endClassFields(abstract, null, null, covariant, null, null, 1, covariant, ;)
               listener: endMember()
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
@@ -100,7 +100,7 @@
                 listener: endClassFields(abstract, null, null, covariant, null, var, 1, covariant, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -117,7 +117,7 @@
                 listener: endClassFields(abstract, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, var)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
@@ -134,7 +134,7 @@
                 listener: endClassFields(abstract, null, null, null, null, var, 1, var, ;)
               listener: endMember()
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -155,7 +155,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, C, ;)
               listener: endMember()
             notEofOrValue(}, i7)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(i7)
                 listener: endMetadataStar(0)
@@ -213,15 +213,15 @@
             parseClassExtendsOpt(Bar)
               listener: handleNoType(Bar)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Bar)
+            parseClassWithClauseOpt(Bar)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Bar)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Bar)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(abstract, class, null)
           parseClassOrMixinOrExtensionBody(Bar, DeclarationKind.Class, Bar)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Bar)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Bar)
               parseMetadataStar({)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.expect
index 140bdbf..0f039f2 100644
--- a/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.expect
@@ -68,7 +68,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(covariant)
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.intertwined.expect
index 6c9e4f0..b6e296e 100644
--- a/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.intertwined.expect
@@ -55,15 +55,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
@@ -82,7 +82,7 @@
                 listener: endClassFields(null, external, null, covariant, null, null, 1, covariant, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -101,7 +101,7 @@
                 listener: endClassFields(null, external, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -118,7 +118,7 @@
                 listener: endClassFields(null, external, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
@@ -135,7 +135,7 @@
                 listener: endClassFields(null, external, static, null, null, final, 1, static, ;)
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
@@ -152,7 +152,7 @@
                 listener: endClassFields(null, external, static, null, null, final, 1, static, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.expect
index 946637f..ff7df27 100644
--- a/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.expect
@@ -64,7 +64,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(late)
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.intertwined.expect
index 2f526a0..b3d9581 100644
--- a/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.intertwined.expect
@@ -86,15 +86,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -112,7 +112,7 @@
                 listener: endClassFields(null, null, null, null, late, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -165,7 +165,7 @@
                 listener: endClassMethod(null, void, (, null, })
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.expect
index 9d5b29e..9eb39b0 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.expect
@@ -15,7 +15,7 @@
           handleType(C, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.intertwined.expect
index dc0e5f3..f7c4821 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(C, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.expect
index ce48ee0..f839c84 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.expect
@@ -15,7 +15,7 @@
           handleType(C, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.intertwined.expect
index 293d9b0..08c5d05 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(C, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.expect
index 0664454..8a970e4 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.expect
@@ -15,7 +15,7 @@
           handleType(C, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.intertwined.expect
index d743308..28c57f8 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(C, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.expect
index bd6398b..ed21533 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.expect
@@ -15,7 +15,7 @@
           handleType(C, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.intertwined.expect
index 79c63d9..67b9a92 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(C, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.expect
index 42d16be..e8f8cc3 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(operator)
@@ -27,7 +27,7 @@
                 handleType(int, null)
                 handleIdentifier(index, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.intertwined.expect
index 8c6aed4..48f91db 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, operator)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(operator)
                 listener: endMetadataStar(0)
@@ -54,7 +54,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(index, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.expect
index 2f4c2f7..0917000 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(operator)
@@ -27,7 +27,7 @@
                 handleType(int, null)
                 handleIdentifier(index, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.intertwined.expect
index e6caa09..fb8706d 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, operator)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(operator)
                 listener: endMetadataStar(0)
@@ -54,7 +54,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(index, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776.dart.expect
index f1892a2..24db2d4 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776.dart.expect
@@ -17,7 +17,7 @@
           handleType(int, null)
           handleIdentifier(i, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginLiteralString("42")
@@ -51,7 +51,7 @@
           handleType(T, null)
           handleIdentifier(t, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       handleLiteralInt(42)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776.dart.intertwined.expect
index 6be91d6..58c95fc 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776.dart.intertwined.expect
@@ -32,7 +32,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(i, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -90,7 +90,7 @@
                 ensureIdentifier(T, formalParameterDeclaration)
                   listener: handleIdentifier(t, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime1.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime1.dart.expect
index 721e3a4..2e03885 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime1.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime1.dart.expect
@@ -17,7 +17,7 @@
           handleType(int, null)
           handleIdentifier(i, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginLiteralString("42")
@@ -51,7 +51,7 @@
           handleType(T, null)
           handleIdentifier(t, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       handleLiteralInt(42)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime1.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime1.dart.intertwined.expect
index 4309320..50ee388 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime1.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime1.dart.intertwined.expect
@@ -32,7 +32,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(i, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -90,7 +90,7 @@
                 ensureIdentifier(T, formalParameterDeclaration)
                   listener: handleIdentifier(t, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.expect
index 76b42cb..784d7f5 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.expect
@@ -17,7 +17,7 @@
           handleType(int, null)
           handleIdentifier(i, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginLiteralString("42")
@@ -51,7 +51,7 @@
           handleType(T, null)
           handleIdentifier(t, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       handleLiteralInt(42)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.intertwined.expect
index f44705f..1ce0ec5 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.intertwined.expect
@@ -32,7 +32,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(i, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -90,7 +90,7 @@
                 ensureIdentifier(T, formalParameterDeclaration)
                   listener: handleIdentifier(t, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime3.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime3.dart.expect
index 165124d..8045c84 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime3.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime3.dart.expect
@@ -31,7 +31,7 @@
           handleType(T1, null)
           handleIdentifier(t1, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, t1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, t1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(T2)
         endMetadataStar(0)
         beginFormalParameter(T2, MemberKind.TopLevelMethod, null, null, null)
@@ -40,7 +40,7 @@
           handleType(T2, null)
           handleIdentifier(t2, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, t2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, t2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       handleLiteralInt(42)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime3.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime3.dart.intertwined.expect
index 5b8824f..7d4f5c2 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime3.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime3.dart.intertwined.expect
@@ -50,7 +50,7 @@
                 ensureIdentifier(T1, formalParameterDeclaration)
                   listener: handleIdentifier(t1, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, t1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, t1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(T2)
@@ -62,7 +62,7 @@
                 ensureIdentifier(T2, formalParameterDeclaration)
                   listener: handleIdentifier(t2, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, t2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, t2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime4.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime4.dart.expect
index d0773b0..deeede9 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime4.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime4.dart.expect
@@ -31,7 +31,7 @@
           handleType(T1, null)
           handleIdentifier(t1, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, t1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, t1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(T2)
         endMetadataStar(0)
         beginFormalParameter(T2, MemberKind.TopLevelMethod, null, null, null)
@@ -40,7 +40,7 @@
           handleType(T2, null)
           handleIdentifier(t2, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, t2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, t2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       handleLiteralInt(42)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime4.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime4.dart.intertwined.expect
index 5e4d944..8db1a2c 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime4.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime4.dart.intertwined.expect
@@ -50,7 +50,7 @@
                 ensureIdentifier(T1, formalParameterDeclaration)
                   listener: handleIdentifier(t1, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, t1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, t1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(T2)
@@ -62,7 +62,7 @@
                 ensureIdentifier(T2, formalParameterDeclaration)
                   listener: handleIdentifier(t2, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, t2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, t2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.expect
index 1328dc8..3928968 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.expect
@@ -34,7 +34,7 @@
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(late)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.intertwined.expect
index 26b7bad..dbb38a1 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, X)
               parseMetadataStar({)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -45,7 +45,7 @@
                 listener: endClassFields(null, null, null, null, late, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
@@ -63,7 +63,7 @@
                 listener: endClassFields(null, null, static, null, late, null, 1, static, ;)
               listener: endMember()
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
@@ -81,7 +81,7 @@
                 listener: endClassFields(null, null, null, covariant, late, null, 1, covariant, ;)
               listener: endMember()
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -106,7 +106,7 @@
                 listener: endClassFields(null, null, null, null, late, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
@@ -131,7 +131,7 @@
                 listener: endClassFields(null, null, static, null, late, null, 1, static, ;)
               listener: endMember()
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.expect
index 7ebeff9..000e5f1 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(var)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.intertwined.expect
index 1d8ef6f..390d560 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, var)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, X)
               parseMetadataStar({)
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
@@ -42,7 +42,7 @@
                 listener: endClassFields(null, null, null, null, null, var, 1, var, ;)
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
@@ -57,7 +57,7 @@
                 listener: endClassFields(null, null, static, null, null, var, 1, static, ;)
               listener: endMember()
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
@@ -72,7 +72,7 @@
                 listener: endClassFields(null, null, null, covariant, null, var, 1, covariant, ;)
               listener: endMember()
             notEofOrValue(}, var)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
@@ -94,7 +94,7 @@
                 listener: endClassFields(null, null, null, null, null, var, 1, var, ;)
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
@@ -116,7 +116,7 @@
                 listener: endClassFields(null, null, static, null, null, var, 1, static, ;)
               listener: endMember()
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus.dart.expect
index 60b2d3b..6ab48a8 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus.dart.intertwined.expect
index b921880..b381072 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus.dart.intertwined.expect
@@ -31,7 +31,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus_plus.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus_plus.dart.expect
index 90d68a0..a0af8fd 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus_plus.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus_plus.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(dynamic)
         endMetadataStar(0)
         beginFormalParameter(dynamic, MemberKind.TopLevelMethod, null, null, null)
@@ -24,7 +24,7 @@
           handleType(dynamic, null)
           handleIdentifier(i, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus_plus.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus_plus.dart.intertwined.expect
index 98bb429..79d8e62 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus_plus.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus_plus.dart.intertwined.expect
@@ -31,7 +31,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(dynamic)
@@ -43,7 +43,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(i, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_with_type_arguments.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_with_type_arguments.dart.expect
index c89447b..5bf1444 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_with_type_arguments.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_with_type_arguments.dart.expect
@@ -87,7 +87,7 @@
                 handleNoType(()
                 handleIdentifier(b, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+              endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.Local)
             endFormalParameters(1, (, ), MemberKind.Local)
             handleAsyncModifier(null, null)
             handleRecoverableError(ExpectedBody, ;, ;)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_with_type_arguments.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_with_type_arguments.dart.intertwined.expect
index e2d78b9..bd14c6d 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_with_type_arguments.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_with_type_arguments.dart.intertwined.expect
@@ -157,7 +157,7 @@
                                             ensureIdentifier((, formalParameterDeclaration)
                                               listener: handleIdentifier(b, formalParameterDeclaration)
                                             listener: handleFormalParameterWithoutValue())
-                                            listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+                                            listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.Local)
                                           listener: endFormalParameters(1, (, ), MemberKind.Local)
                                       parseAsyncOptBody(), true, false)
                                         parseAsyncModifierOpt())
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_plus_plus_lookup.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_plus_plus_lookup.dart.expect
index 6d91dd6..c200dba 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_plus_plus_lookup.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_plus_plus_lookup.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(dynamic)
         endMetadataStar(0)
         beginFormalParameter(dynamic, MemberKind.TopLevelMethod, null, null, null)
@@ -24,7 +24,7 @@
           handleType(dynamic, null)
           handleIdentifier(i, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_plus_plus_lookup.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_plus_plus_lookup.dart.intertwined.expect
index 9b33b16..abbe1a2 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_plus_plus_lookup.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_plus_plus_lookup.dart.intertwined.expect
@@ -31,7 +31,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(dynamic)
@@ -43,7 +43,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(i, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793.dart.expect
index a7ed1d5..68029a8 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(sample, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793.dart.intertwined.expect
index 5d6d6b4..b152414 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(sample, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.expect
index 384f089..1e4e813 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(sample, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.intertwined.expect
index fc4e1e4..aa7d301 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(sample, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.expect
index 2e30ef7..39bbef9 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(sample, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.intertwined.expect
index 8a9e55b..fe14ada 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(sample, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime3.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime3.dart.expect
index fee2dc9..10abc1f 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime3.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime3.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(sample, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime3.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime3.dart.intertwined.expect
index be692e6..49c026b 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime3.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime3.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(sample, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime4.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime4.dart.expect
index fb4318c..40fbd06 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime4.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime4.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime4.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime4.dart.intertwined.expect
index 32789fa..e9f2347 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime4.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime4.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime5.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime5.dart.expect
index 68b4a22..1a737fe 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime5.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime5.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime5.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime5.dart.intertwined.expect
index ac8630f..0ba3f9c 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime5.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime5.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.expect
index 890579d..c8d1dbb 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(covariant)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.intertwined.expect
index a42a169..d9d2694 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.expect
index 8125755..5ee07df 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.expect
@@ -14,7 +14,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(covariant)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.intertwined.expect
index 777b6f6..6458925 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.expect
index 0c383ad..a29e8f2 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.expect
@@ -14,7 +14,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(covariant)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.intertwined.expect
index 40f8c8c5..da73524 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.expect
index 8bd1608..1d39a3c 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(String)
@@ -49,7 +49,7 @@
                 handleType(Object, ?)
                 handleIdentifier(o, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(x)
@@ -100,7 +100,7 @@
                 handleType(dynamic, null)
                 handleIdentifier(o, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(y)
@@ -164,7 +164,7 @@
                 handleType(dynamic, null)
                 handleIdentifier(o, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(y)
@@ -228,7 +228,7 @@
                 handleType(dynamic, null)
                 handleIdentifier(o, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(y)
@@ -292,7 +292,7 @@
                 handleType(dynamic, null)
                 handleIdentifier(o, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(y)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.intertwined.expect
index 377a621..6a80fc4 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, String)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(String)
                 listener: endMetadataStar(0)
@@ -44,7 +44,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, String, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -61,7 +61,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -90,7 +90,7 @@
                         ensureIdentifier(?, formalParameterDeclaration)
                           listener: handleIdentifier(o, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -167,7 +167,7 @@
                 listener: endClassConstructor(null, Foo, (, :, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -200,7 +200,7 @@
                         ensureIdentifier(dynamic, formalParameterDeclaration)
                           listener: handleIdentifier(o, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -312,7 +312,7 @@
                 listener: endClassConstructor(null, Foo, (, :, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -345,7 +345,7 @@
                         ensureIdentifier(dynamic, formalParameterDeclaration)
                           listener: handleIdentifier(o, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -457,7 +457,7 @@
                 listener: endClassConstructor(null, Foo, (, :, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -490,7 +490,7 @@
                         ensureIdentifier(dynamic, formalParameterDeclaration)
                           listener: handleIdentifier(o, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -602,7 +602,7 @@
                 listener: endClassConstructor(null, Foo, (, :, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -635,7 +635,7 @@
                         ensureIdentifier(dynamic, formalParameterDeclaration)
                           listener: handleIdentifier(o, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.expect
index a6d80f5..a8f4c2d 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(String)
@@ -49,7 +49,7 @@
                 handleType(Object, ?)
                 handleIdentifier(o, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(x)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.intertwined.expect
index 7bae571..b03cb1b 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, String)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(String)
                 listener: endMetadataStar(0)
@@ -44,7 +44,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, String, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -61,7 +61,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -90,7 +90,7 @@
                         ensureIdentifier(?, formalParameterDeclaration)
                           listener: handleIdentifier(o, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.expect
index 4b60813..d9b3888 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(String)
@@ -49,7 +49,7 @@
                 handleType(Object, ?)
                 handleIdentifier(o, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(x)
@@ -109,7 +109,7 @@
                 handleType(dynamic, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -166,7 +166,7 @@
                 handleType(dynamic, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.intertwined.expect
index bcb265d..7ac308d 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, String)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(String)
                 listener: endMetadataStar(0)
@@ -44,7 +44,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, String, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -61,7 +61,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -90,7 +90,7 @@
                         ensureIdentifier(?, formalParameterDeclaration)
                           listener: handleIdentifier(o, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -198,7 +198,7 @@
                 listener: endClassConstructor(null, Foo, (, :, ;)
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -226,7 +226,7 @@
                         ensureIdentifier(dynamic, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -339,7 +339,7 @@
                 listener: endClassMethod(null, void, (, null, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -367,7 +367,7 @@
                         ensureIdentifier(dynamic, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.expect
index a5578c5..e768c12 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.expect
@@ -19,7 +19,7 @@
           handleType(List, ?)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(bool)
         endMetadataStar(0)
         beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
@@ -28,7 +28,7 @@
           handleType(bool, ?)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.intertwined.expect
index 281cf5f..9961d09 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.intertwined.expect
@@ -35,7 +35,7 @@
                 ensureIdentifier(?, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(bool)
@@ -47,7 +47,7 @@
                 ensureIdentifier(?, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.expect
index 4bb704e..627e902 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.expect
@@ -76,7 +76,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(C)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.intertwined.expect
index 1b2b88b..fd8e6dc 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.intertwined.expect
@@ -199,15 +199,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -260,7 +260,7 @@
                 listener: endClassConstructor(null, C, (, :, ;)
               listener: endMember()
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.expect
index 1cc1518..a4fad4a 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.expect
@@ -24,7 +24,7 @@
           handleType(Map, null)
           handleIdentifier(json, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -105,7 +105,7 @@
           handleType(Map, null)
           handleIdentifier(json, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -186,7 +186,7 @@
           handleType(Map, null)
           handleIdentifier(json, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -268,7 +268,7 @@
           handleType(Map, null)
           handleIdentifier(json, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -312,7 +312,7 @@
       handleNoType(Order)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(List)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.intertwined.expect
index a2e28bd..319ea20 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.intertwined.expect
@@ -40,7 +40,7 @@
                 ensureIdentifier(>, formalParameterDeclaration)
                   listener: handleIdentifier(json, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -206,7 +206,7 @@
                 ensureIdentifier(>, formalParameterDeclaration)
                   listener: handleIdentifier(json, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -372,7 +372,7 @@
                 ensureIdentifier(>, formalParameterDeclaration)
                   listener: handleIdentifier(json, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -548,7 +548,7 @@
                 ensureIdentifier(>, formalParameterDeclaration)
                   listener: handleIdentifier(json, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -647,15 +647,15 @@
             parseClassExtendsOpt(Order)
               listener: handleNoType(Order)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Order)
+            parseClassWithClauseOpt(Order)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Order)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Order)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Order, DeclarationKind.Class, Order)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, List)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Order)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Order)
               parseMetadataStar({)
                 listener: beginMetadataStar(List)
                 listener: endMetadataStar(0)
@@ -672,7 +672,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, List, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Order)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Order)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/late_member.dart.expect b/pkg/front_end/parser_testcases/nnbd/late_member.dart.expect
index 1bf1597..00eb347 100644
--- a/pkg/front_end/parser_testcases/nnbd/late_member.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/late_member.dart.expect
@@ -127,7 +127,7 @@
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(late)
@@ -165,7 +165,7 @@
       handleNoType(Y)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/nnbd/late_member.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/late_member.dart.intertwined.expect
index 23a7bb2..362c55c 100644
--- a/pkg/front_end/parser_testcases/nnbd/late_member.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/late_member.dart.intertwined.expect
@@ -52,7 +52,7 @@
                                 parseNewExpression(=)
                                   isNextIdentifier(new)
                                   listener: beginNewExpression(new)
-                                  parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                     ensureIdentifier(new, constructorReference)
                                       listener: handleIdentifier(X, constructorReference)
                                     listener: beginConstructorReference(X)
@@ -182,7 +182,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(X, constructorReference)
                                 listener: beginConstructorReference(X)
@@ -228,7 +228,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(Y, constructorReference)
                                 listener: beginConstructorReference(Y)
@@ -338,15 +338,15 @@
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, X)
               parseMetadataStar({)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -430,15 +430,15 @@
             parseClassExtendsOpt(Y)
               listener: handleNoType(Y)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Y)
+            parseClassWithClauseOpt(Y)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Y)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Y)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Y, DeclarationKind.Class, Y)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Y)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Y)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.expect b/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.expect
index 52d88f1..e528774 100644
--- a/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.expect
@@ -145,7 +145,7 @@
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(late)
@@ -183,7 +183,7 @@
       handleNoType(Y)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.intertwined.expect
index cbd34da..a61b867 100644
--- a/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.intertwined.expect
@@ -52,7 +52,7 @@
                                 parseNewExpression(=)
                                   isNextIdentifier(new)
                                   listener: beginNewExpression(new)
-                                  parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                     ensureIdentifier(new, constructorReference)
                                       listener: handleIdentifier(X, constructorReference)
                                     listener: beginConstructorReference(X)
@@ -182,7 +182,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(X, constructorReference)
                                 listener: beginConstructorReference(X)
@@ -228,7 +228,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(Y, constructorReference)
                                 listener: beginConstructorReference(Y)
@@ -387,15 +387,15 @@
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, X)
               parseMetadataStar({)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -479,15 +479,15 @@
             parseClassExtendsOpt(Y)
               listener: handleNoType(Y)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Y)
+            parseClassWithClauseOpt(Y)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Y)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Y)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Y, DeclarationKind.Class, Y)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Y)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Y)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.expect b/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.expect
index 4854f02..45f4ec7 100644
--- a/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(Class1)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -29,7 +29,7 @@
                 handleType(int, null)
                 handleIdentifier(index, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -56,7 +56,7 @@
                 handleType(int, null)
                 handleIdentifier(index, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -65,7 +65,7 @@
                 handleType(int, null)
                 handleIdentifier(value, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.intertwined.expect
index bd48abf..fa8e973 100644
--- a/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Class1)
               listener: handleNoType(Class1)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Class1)
+            parseClassWithClauseOpt(Class1)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Class1)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Class1)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Class1, DeclarationKind.Class, Class1)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Class1)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Class1)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -56,7 +56,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(index, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -85,7 +85,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Class1)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Class1)
               parseMetadataStar(;)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -112,7 +112,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(index, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -124,7 +124,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(value, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/nnbd/required_member.dart.expect b/pkg/front_end/parser_testcases/nnbd/required_member.dart.expect
index f4825f1..b2d3c4d 100644
--- a/pkg/front_end/parser_testcases/nnbd/required_member.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/required_member.dart.expect
@@ -127,7 +127,7 @@
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(required)
@@ -165,7 +165,7 @@
       handleNoType(Y)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/nnbd/required_member.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/required_member.dart.intertwined.expect
index ef231a3..84da6c5 100644
--- a/pkg/front_end/parser_testcases/nnbd/required_member.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/required_member.dart.intertwined.expect
@@ -52,7 +52,7 @@
                                 parseNewExpression(=)
                                   isNextIdentifier(new)
                                   listener: beginNewExpression(new)
-                                  parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                     ensureIdentifier(new, constructorReference)
                                       listener: handleIdentifier(X, constructorReference)
                                     listener: beginConstructorReference(X)
@@ -182,7 +182,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(X, constructorReference)
                                 listener: beginConstructorReference(X)
@@ -228,7 +228,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(Y, constructorReference)
                                 listener: beginConstructorReference(Y)
@@ -338,15 +338,15 @@
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, required)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, X)
               parseMetadataStar({)
                 listener: beginMetadataStar(required)
                 listener: endMetadataStar(0)
@@ -430,15 +430,15 @@
             parseClassExtendsOpt(Y)
               listener: handleNoType(Y)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Y)
+            parseClassWithClauseOpt(Y)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Y)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Y)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Y, DeclarationKind.Class, Y)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Y)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Y)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.expect b/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.expect
index 8d19c73..8af1629 100644
--- a/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.expect
@@ -113,7 +113,7 @@
             handleType(int, null)
             handleIdentifier(named, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, named, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, named, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -138,7 +138,7 @@
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(required)
@@ -176,7 +176,7 @@
       handleNoType(Y)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.intertwined.expect
index 42f35f4..a184fd5 100644
--- a/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.intertwined.expect
@@ -52,7 +52,7 @@
                                 parseNewExpression(=)
                                   isNextIdentifier(new)
                                   listener: beginNewExpression(new)
-                                  parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                     ensureIdentifier(new, constructorReference)
                                       listener: handleIdentifier(X, constructorReference)
                                     listener: beginConstructorReference(X)
@@ -182,7 +182,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(X, constructorReference)
                                 listener: beginConstructorReference(X)
@@ -228,7 +228,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(Y, constructorReference)
                                 listener: beginConstructorReference(Y)
@@ -291,7 +291,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(named, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, named, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, named, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -354,15 +354,15 @@
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, required)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, X)
               parseMetadataStar({)
                 listener: beginMetadataStar(required)
                 listener: endMetadataStar(0)
@@ -446,15 +446,15 @@
             parseClassExtendsOpt(Y)
               listener: handleNoType(Y)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Y)
+            parseClassWithClauseOpt(Y)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Y)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Y)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Y, DeclarationKind.Class, Y)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Y)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Y)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.expect b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.expect
index 8bdfa8b..e5eb201 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.expect
@@ -30,7 +30,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Foo)
@@ -50,7 +50,7 @@
                 handleNoType(()
                 handleIdentifier(_, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.intertwined.expect b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.intertwined.expect
index af61377..823d3fc 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -57,7 +57,7 @@
                         ensureIdentifier((, formalParameterDeclaration)
                           listener: handleIdentifier(_, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -131,7 +131,7 @@
                               parseNewExpression(=)
                                 isNextIdentifier(new)
                                 listener: beginNewExpression(new)
-                                parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                   ensureIdentifier(new, constructorReference)
                                     listener: handleIdentifier(Foo, constructorReference)
                                   listener: beginConstructorReference(Foo)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.expect b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.expect
index 3e1635e..df508f2 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Foo)
@@ -27,7 +27,7 @@
                 handleNoType(()
                 handleIdentifier(_, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.intertwined.expect
index e429730..30851c1 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -54,7 +54,7 @@
                         ensureIdentifier((, formalParameterDeclaration)
                           listener: handleIdentifier(_, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -128,7 +128,7 @@
                               parseNewExpression(=)
                                 isNextIdentifier(new)
                                 listener: beginNewExpression(new)
-                                parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                   ensureIdentifier(new, constructorReference)
                                     listener: handleIdentifier(Foo, constructorReference)
                                   listener: beginConstructorReference(Foo)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/simple_attempted_usage_of_triple_shift.dart.expect b/pkg/front_end/parser_testcases/no-triple-shift/simple_attempted_usage_of_triple_shift.dart.expect
index c88d460..9e5e0d5 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/simple_attempted_usage_of_triple_shift.dart.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/simple_attempted_usage_of_triple_shift.dart.expect
@@ -25,7 +25,7 @@
           handleType(List, null)
           handleIdentifier(arguments, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, arguments, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, arguments, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/simple_attempted_usage_of_triple_shift.dart.intertwined.expect b/pkg/front_end/parser_testcases/no-triple-shift/simple_attempted_usage_of_triple_shift.dart.intertwined.expect
index 6db3700..ac687d6 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/simple_attempted_usage_of_triple_shift.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/simple_attempted_usage_of_triple_shift.dart.intertwined.expect
@@ -34,7 +34,7 @@
                 ensureIdentifier(>, formalParameterDeclaration)
                   listener: handleIdentifier(arguments, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, arguments, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, arguments, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect
index 67bd589..c29258b 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect
@@ -25,7 +25,7 @@
                 handleNoType(()
                 handleIdentifier(_, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+              endFormalParameter(null, null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -50,7 +50,7 @@
                 handleNoType(()
                 handleIdentifier(_, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+              endFormalParameter(null, null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -112,7 +112,7 @@
       handleType(List, null)
       handleClassExtends(extends, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(abstract, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect
index 81d4778..1917d68 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect
@@ -19,7 +19,7 @@
         parseClassOrMixinOrExtensionBody(Symbol, DeclarationKind.Extension, null)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, String)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, null)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, null)
             parseMetadataStar({)
               listener: beginMetadataStar(String)
               listener: endMetadataStar(0)
@@ -46,7 +46,7 @@
                       ensureIdentifier((, formalParameterDeclaration)
                         listener: handleIdentifier(_, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue())
-                      listener: endFormalParameter(null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+                      listener: endFormalParameter(null, null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
                     listener: endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
               parseInitializersOpt())
                 listener: handleNoInitializers()
@@ -70,7 +70,7 @@
               listener: endExtensionMethod(null, String, (, null, ;)
             listener: endMember()
           notEofOrValue(}, String)
-          parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Extension, null)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Extension, null)
             parseMetadataStar(;)
               listener: beginMetadataStar(String)
               listener: endMetadataStar(0)
@@ -98,7 +98,7 @@
                       ensureIdentifier((, formalParameterDeclaration)
                         listener: handleIdentifier(_, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue())
-                      listener: endFormalParameter(null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+                      listener: endFormalParameter(null, null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
                     listener: endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
               parseInitializersOpt())
                 listener: handleNoInitializers()
@@ -237,10 +237,10 @@
                 listener: endTypeArguments(1, <, >)
                 listener: handleType(List, null)
                 listener: handleClassExtends(extends, 1)
-            parseWithClauseOpt(>)
+            parseClassWithClauseOpt(>)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(>)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(>)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(abstract, class, null)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.expect
index ccf89b4..bf983c2 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(late)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -39,7 +39,7 @@
       handleNoType(required)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -70,7 +70,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(late)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.intertwined.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.intertwined.expect
index 8a856d0..2a31e5e 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(late)
               listener: handleNoType(late)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(late)
+            parseClassWithClauseOpt(late)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(late)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(late)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(late, DeclarationKind.Class, late)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, late)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, late)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -84,15 +84,15 @@
             parseClassExtendsOpt(required)
               listener: handleNoType(required)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(required)
+            parseClassWithClauseOpt(required)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(required)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(required)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(required, DeclarationKind.Class, required)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, required)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, required)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -149,15 +149,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -192,7 +192,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, required)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(required)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.expect
index f7cda4b..73ec228 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.expect
@@ -8,7 +8,7 @@
       handleNoType(Xlate)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -39,7 +39,7 @@
       handleNoType(Xrequired)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -70,7 +70,7 @@
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Xlate)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.intertwined.expect
index 20506bd..06103bb 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.intertwined.expect
@@ -19,15 +19,15 @@
             parseClassExtendsOpt(Xlate)
               listener: handleNoType(Xlate)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Xlate)
+            parseClassWithClauseOpt(Xlate)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Xlate)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Xlate)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Xlate, DeclarationKind.Class, Xlate)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Xlate)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Xlate)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -84,15 +84,15 @@
             parseClassExtendsOpt(Xrequired)
               listener: handleNoType(Xrequired)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Xrequired)
+            parseClassWithClauseOpt(Xrequired)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Xrequired)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Xrequired)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Xrequired, DeclarationKind.Class, Xrequired)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Xrequired)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Xrequired)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -149,15 +149,15 @@
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Xlate)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(Xlate)
                 listener: endMetadataStar(0)
@@ -192,7 +192,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, Xlate, ;)
               listener: endMember()
             notEofOrValue(}, Xrequired)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Xrequired)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.expect b/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.expect
index 42d27b1..6489670 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.expect
@@ -16,7 +16,7 @@
       handleNoType(>)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -38,7 +38,7 @@
         handleType(num, ?)
       endTypeArguments(1, <, >)
       handleType(A, null)
-      handleClassOrMixinImplements(implements, 1)
+      handleImplements(implements, 1)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.intertwined.expect b/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.intertwined.expect
index 5d322f3..574de45 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.intertwined.expect
@@ -27,10 +27,10 @@
             parseClassExtendsOpt(>)
               listener: handleNoType(>)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(>)
+            parseClassWithClauseOpt(>)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(>)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(>)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -55,9 +55,9 @@
             parseClassExtendsOpt(B)
               listener: handleNoType(B)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
+            parseClassOrMixinOrEnumImplementsOpt(B)
               ensureIdentifier(implements, typeReference)
                 listener: handleIdentifier(A, typeReference)
               listener: beginTypeArguments(<)
@@ -66,7 +66,7 @@
               listener: handleType(num, ?)
               listener: endTypeArguments(1, <, >)
               listener: handleType(A, null)
-              listener: handleClassOrMixinImplements(implements, 1)
+              listener: handleImplements(implements, 1)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, B)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.expect b/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.expect
index 37497b6..025b95b 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.expect
@@ -165,7 +165,7 @@
           handleType(List, null)
           handleIdentifier(args, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, args, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, args, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -250,7 +250,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.intertwined.expect b/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.intertwined.expect
index 8d5501d9..4029ed4 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.intertwined.expect
@@ -171,7 +171,7 @@
                 ensureIdentifier(>, formalParameterDeclaration)
                   listener: handleIdentifier(args, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, args, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, args, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -348,15 +348,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -373,7 +373,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -393,7 +393,7 @@
                 listener: endClassFields(null, null, null, null, late, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -417,7 +417,7 @@
                 listener: endClassFields(null, null, null, null, late, null, 1, List, ;)
               listener: endMember()
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -437,7 +437,7 @@
                 listener: endClassFields(null, null, null, null, late, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -454,7 +454,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, ;)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(;)
                 listener: endMetadataStar(0)
@@ -465,7 +465,7 @@
                 listener: handleInvalidMember(;)
                 listener: endMember()
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -483,7 +483,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, ;)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(;)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.expect b/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.expect
index 6e58879..9835fbf 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.expect
@@ -31,7 +31,7 @@
             handleType(int, null)
             handleIdentifier(x1, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, x1, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, x1, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -66,7 +66,7 @@
             handleType(required, null)
             handleIdentifier(x2, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, x2, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, x2, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -102,7 +102,7 @@
             handleType(required, null)
             handleIdentifier(x3, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, x3, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, x3, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -129,7 +129,7 @@
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(void)
@@ -150,7 +150,7 @@
                   handleType(int, null)
                   handleIdentifier(x4, formalParameterDeclaration)
                   handleFormalParameterWithoutValue(})
-                endFormalParameter(null, null, x4, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
+                endFormalParameter(null, null, null, x4, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
               endOptionalFormalParameters(1, {, })
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.intertwined.expect b/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.intertwined.expect
index 476dd57..8a6632f 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.intertwined.expect
@@ -34,7 +34,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(x1, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, x1, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, x1, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -115,7 +115,7 @@
                   ensureIdentifier(required, formalParameterDeclaration)
                     listener: handleIdentifier(x2, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, x2, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, x2, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -198,7 +198,7 @@
                   ensureIdentifier(required, formalParameterDeclaration)
                     listener: handleIdentifier(x3, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, x3, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, x3, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -266,15 +266,15 @@
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -306,7 +306,7 @@
                           ensureIdentifier(int, formalParameterDeclaration)
                             listener: handleIdentifier(x4, formalParameterDeclaration)
                           listener: handleFormalParameterWithoutValue(})
-                          listener: endFormalParameter(null, null, x4, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
+                          listener: endFormalParameter(null, null, null, x4, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
                         listener: endOptionalFormalParameters(1, {, })
                       ensureCloseParen(}, ()
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
diff --git a/pkg/front_end/test/analyser_ignored/load_dill_twice_test.dart b/pkg/front_end/test/analyser_ignored/load_dill_twice_test.dart
index 803f98f..2b03e4d 100644
--- a/pkg/front_end/test/analyser_ignored/load_dill_twice_test.dart
+++ b/pkg/front_end/test/analyser_ignored/load_dill_twice_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Platform, exit;
 
 import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
diff --git a/pkg/front_end/test/ast_nodes_has_to_string_test.dart b/pkg/front_end/test/ast_nodes_has_to_string_test.dart
index d9ddaba..0c27d6f 100644
--- a/pkg/front_end/test/ast_nodes_has_to_string_test.dart
+++ b/pkg/front_end/test/ast_nodes_has_to_string_test.dart
@@ -5,6 +5,7 @@
 import 'dart:io' show File, Platform, stdin, exitCode;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart';
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart';
 
@@ -26,8 +27,9 @@
     helper.TestIncrementalCompiler compiler =
         new helper.TestIncrementalCompiler(options, input,
             /*Uri initializeFrom*/ null, /*bool outlineOnly*/ true);
-    c = await compiler.computeDelta();
-    classHierarchy = compiler.getClassHierarchy()!;
+    IncrementalCompilerResult compilerResult = await compiler.computeDelta();
+    c = compilerResult.component;
+    classHierarchy = compilerResult.classHierarchy!;
     List<Library> libraries = c.libraries
         .where((Library lib) =>
             (lib.importUri.toString() == "package:kernel/ast.dart"))
diff --git a/pkg/front_end/test/async_but_no_await_git_test.dart b/pkg/front_end/test/async_but_no_await_git_test.dart
index d83191f..6721ee1 100644
--- a/pkg/front_end/test/async_but_no_await_git_test.dart
+++ b/pkg/front_end/test/async_but_no_await_git_test.dart
@@ -6,6 +6,8 @@
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart';
 import 'package:front_end/src/api_prototype/compiler_options.dart' as api;
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
 import 'package:front_end/src/base/processed_options.dart';
 import 'package:front_end/src/compute_platform_binaries_location.dart'
     show computePlatformBinariesLocation;
@@ -58,8 +60,8 @@
 
   IncrementalCompiler compiler =
       new IncrementalCompiler(new CompilerContext(options));
-  Component component = await compiler.computeDelta();
-
+  IncrementalCompilerResult compilerResult = await compiler.computeDelta();
+  Component component = compilerResult.component;
   component.accept(new AsyncNoAwaitVisitor());
 
   print("Done in ${stopwatch.elapsedMilliseconds} ms. "
diff --git a/pkg/front_end/test/comments_on_certain_arguments_tool.dart b/pkg/front_end/test/comments_on_certain_arguments_tool.dart
index ce02610..254ff7d 100644
--- a/pkg/front_end/test/comments_on_certain_arguments_tool.dart
+++ b/pkg/front_end/test/comments_on_certain_arguments_tool.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:convert' show utf8;
 
 import 'dart:io'
@@ -19,6 +17,8 @@
 
 import 'package:front_end/src/api_prototype/file_system.dart' as api
     show FileSystem;
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
 
 import 'package:front_end/src/base/processed_options.dart'
     show ProcessedOptions;
@@ -56,7 +56,7 @@
 
 Set<Uri> libUris = {};
 
-Component component;
+late Component component;
 
 Future<void> main(List<String> args) async {
   api.CompilerOptions compilerOptions = getOptions();
@@ -83,7 +83,9 @@
   CompilerContext context = new CompilerContext(options);
   IncrementalCompiler incrementalCompiler =
       new TestIncrementalCompiler(context);
-  component = await incrementalCompiler.computeDelta();
+  IncrementalCompilerResult incrementalCompilerResult =
+      await incrementalCompiler.computeDelta();
+  component = incrementalCompilerResult.component;
 
   for (Library library in component.libraries) {
     if (library.importUri.scheme == "dart") continue;
@@ -100,8 +102,9 @@
     List<Uri> editsPerformed = [];
     for (Uri uri in edits.keys) {
       print("\n\n\n");
-      if (edits[uri] != null && edits[uri].isNotEmpty) {
-        String update;
+      List<Edit>? theseEdits = edits[uri];
+      if (theseEdits != null && theseEdits.isNotEmpty) {
+        String? update;
         while (update != "y" &&
             update != "yes" &&
             update != "n" &&
@@ -111,9 +114,8 @@
         }
         if (update != "y" && update != "yes") continue;
 
-        List<Edit> theseEdits = edits[uri];
         theseEdits.sort();
-        String content = utf8.decode(component.uriToSource[uri].source,
+        String content = utf8.decode(component.uriToSource[uri]!.source,
             allowMalformed: true);
         StringBuffer sb = new StringBuffer();
         int latest = 0;
@@ -128,7 +130,7 @@
             case EditType.Delete:
               print(edit);
               // We "delete" by skipping...
-              latest = edit.offset + edit.length;
+              latest = edit.offset + edit.length!;
               break;
           }
         }
@@ -195,19 +197,19 @@
   @override
   void visitSuperMethodInvocation(SuperMethodInvocation node) {
     super.visitSuperMethodInvocation(node);
-    note(node.interfaceTargetReference.node, node.arguments, node);
+    note(node.interfaceTargetReference!.node!, node.arguments, node);
   }
 
   @override
   void visitStaticInvocation(StaticInvocation node) {
     super.visitStaticInvocation(node);
-    note(node.targetReference.node, node.arguments, node);
+    note(node.targetReference.node!, node.arguments, node);
   }
 
   @override
   void visitConstructorInvocation(ConstructorInvocation node) {
     super.visitConstructorInvocation(node);
-    note(node.targetReference.node, node.arguments, node);
+    note(node.targetReference.node!, node.arguments, node);
   }
 
   void note(
@@ -223,28 +225,25 @@
 
     for (int i = 0; i < arguments.positional.length; i++) {
       bool wantComment = false;
-      if (arguments.positional[i] is NullLiteral ||
-          arguments.positional[i] is BoolLiteral ||
-          arguments.positional[i] is IntLiteral) {
+      Expression argument = arguments.positional[i];
+      if (argument is NullLiteral ||
+          argument is BoolLiteral ||
+          argument is IntLiteral) {
         wantComment = true;
-      } else if (arguments.positional[i] is MapLiteral) {
-        MapLiteral literal = arguments.positional[i];
-        if (literal.entries.isEmpty) wantComment = true;
-      } else if (arguments.positional[i] is ListLiteral) {
-        ListLiteral literal = arguments.positional[i];
-        if (literal.expressions.isEmpty) wantComment = true;
-      } else if (arguments.positional[i] is InstanceInvocation) {
-        InstanceInvocation methodInvocation = arguments.positional[i];
-        if (methodInvocation.receiver is NullLiteral ||
-            methodInvocation.receiver is IntLiteral ||
-            methodInvocation.receiver is BoolLiteral) {
+      } else if (argument is MapLiteral) {
+        if (argument.entries.isEmpty) wantComment = true;
+      } else if (argument is ListLiteral) {
+        if (argument.expressions.isEmpty) wantComment = true;
+      } else if (argument is InstanceInvocation) {
+        if (argument.receiver is NullLiteral ||
+            argument.receiver is IntLiteral ||
+            argument.receiver is BoolLiteral) {
           wantComment = true;
         }
-      } else if (arguments.positional[i] is DynamicInvocation) {
-        DynamicInvocation methodInvocation = arguments.positional[i];
-        if (methodInvocation.receiver is NullLiteral ||
-            methodInvocation.receiver is IntLiteral ||
-            methodInvocation.receiver is BoolLiteral) {
+      } else if (argument is DynamicInvocation) {
+        if (argument.receiver is NullLiteral ||
+            argument.receiver is IntLiteral ||
+            argument.receiver is BoolLiteral) {
           wantComment = true;
         }
       }
@@ -269,10 +268,10 @@
     return;
   }
   if (argumentExpression.fileOffset == -1) return;
-  Location location = argumentExpression.location;
-  Token token = cache[location.file];
+  Location location = argumentExpression.location!;
+  Token token = cache[location.file]!;
   while (token.offset != argumentExpression.fileOffset) {
-    token = token.next;
+    token = token.next!;
     if (token.isEof) {
       throw "Couldn't find token for $argumentExpression "
           "(${argumentExpression.fileOffset}).";
@@ -280,7 +279,7 @@
   }
   bool foundComment = false;
   List<CommentToken> badComments = [];
-  CommentToken commentToken = token.precedingComments;
+  CommentToken? commentToken = token.precedingComments;
   while (commentToken != null) {
     if (commentToken.lexeme == expectedComment) {
       // Exact match.
@@ -291,17 +290,16 @@
         commentToken.lexeme.endsWith("= */")) {
       badComments.add(commentToken);
     }
-    commentToken = commentToken.next;
+    commentToken = commentToken.next as CommentToken?;
   }
   if (badComments.isNotEmpty) {
     for (CommentToken comment in badComments) {
       Location calculatedLocation =
-          component.getLocation(location.file, comment.offset);
+          component.getLocation(location.file, comment.offset)!;
       print("Please remove comment of length ${comment.lexeme.length} at "
           "${comment.offset} => "
           "${calculatedLocation}");
-      edits[location.file] ??= [];
-      edits[location.file]
+      (edits[location.file] ??= [])
           .add(new Edit.delete(comment.offset, comment.lexeme.length));
     }
   }
@@ -309,12 +307,12 @@
     return;
   }
   Location calculatedLocation =
-      component.getLocation(location.file, token.offset);
+      component.getLocation(location.file, token.offset)!;
   print("Please add comment $expectedComment at "
       "${token.offset} => "
       "${calculatedLocation}");
-  edits[location.file] ??= [];
-  edits[location.file].add(new Edit.insert(token.offset, expectedComment));
+  (edits[location.file] ??= [])
+      .add(new Edit.insert(token.offset, expectedComment));
 }
 
 Map<Uri, List<Edit>> edits = {};
@@ -323,8 +321,8 @@
 
 class Edit implements Comparable<Edit> {
   final int offset;
-  final int length;
-  final String insertData;
+  final int? length;
+  final String? insertData;
   final EditType editType;
   Edit.insert(this.offset, this.insertData)
       : editType = EditType.Insert,
diff --git a/pkg/front_end/test/compile_benchmark.dart b/pkg/front_end/test/compile_benchmark.dart
index 2ad309a..c244da3 100644
--- a/pkg/front_end/test/compile_benchmark.dart
+++ b/pkg/front_end/test/compile_benchmark.dart
@@ -1,5 +1,3 @@
-// @dart = 2.9
-
 import 'dart:convert';
 import 'dart:io';
 import 'dart:typed_data';
@@ -23,7 +21,7 @@
     Platform.script.resolve("compile_benchmark_helper.dart");
 
 void main(List<String> args) {
-  List<String> arguments;
+  List<String>? arguments;
   bool tryToAnnotate = false;
   bool tryToSlowDown = false;
   bool timeInsteadOfCount = false;
@@ -135,7 +133,7 @@
   if (tryToSlowDown) {
     didSomething = true;
     for (Procedure p in sortedProcedures) {
-      Uri busyWaiting = busyWaitProcedure(
+      Uri? busyWaiting = busyWaitProcedure(
           dillData,
           tmp.uri,
           (lib) => lib.importUri == p.enclosingLibrary.importUri,
@@ -245,13 +243,14 @@
 ///
 /// The annotation is copied from the [preferInlineMe] method in the helper.
 Uri preferInlineProcedure(List<int> dillData, Uri tmp,
-    bool libraryMatcher(Library lib), String className, String procedureName) {
+    bool libraryMatcher(Library lib), String? className, String procedureName) {
   Component component = new Component();
   new BinaryBuilder(dillData, disableLazyReading: true)
       .readComponent(component);
   Procedure preferInlineMeProcedure = getProcedure(component,
       (lib) => lib.fileUri == benchmarkHelper, null, "preferInlineMe");
-  ConstantExpression annotation = preferInlineMeProcedure.annotations.single;
+  ConstantExpression annotation =
+      preferInlineMeProcedure.annotations.single as ConstantExpression;
   Procedure markProcedure =
       getProcedure(component, libraryMatcher, className, procedureName);
   markProcedure.addAnnotation(
@@ -268,8 +267,8 @@
 ///
 /// This will make the procedure busy-wait approximately 0.002 ms for each
 /// invocation (+ whatever overhead and imprecision).
-Uri busyWaitProcedure(List<int> dillData, Uri tmp,
-    bool libraryMatcher(Library lib), String className, String procedureName) {
+Uri? busyWaitProcedure(List<int> dillData, Uri tmp,
+    bool libraryMatcher(Library lib), String? className, String procedureName) {
   Component component = new Component();
   new BinaryBuilder(dillData, disableLazyReading: true)
       .readComponent(component);
@@ -280,7 +279,7 @@
       getProcedure(component, libraryMatcher, className, procedureName);
   if (markProcedure.function.body == null) return null;
 
-  Statement orgBody = markProcedure.function.body;
+  Statement orgBody = markProcedure.function.body as Statement;
   markProcedure.function.body = new Block([
     new ExpressionStatement(new StaticInvocation(
         busyWaitProcedure, new Arguments([new IntLiteral(2 /* 0.002 ms */)]))),
@@ -375,13 +374,13 @@
     if (node.function.body == null) return;
     int procedureNum = procedures.length;
     procedures.add(node);
-    Statement orgBody = node.function.body;
+    Statement orgBody = node.function.body as Statement;
     node.function.body = new Block([
       new ExpressionStatement(new StaticInvocation(registerCallProcedure,
           new Arguments([new IntLiteral(procedureNum)]))),
       orgBody
     ]);
-    node.function.body.parent = node.function;
+    node.function.body!.parent = node.function;
   }
 }
 
@@ -408,7 +407,7 @@
     if (node.function.dartAsyncMarker != AsyncMarker.Sync) return;
     int procedureNum = procedures.length;
     procedures.add(node);
-    Statement orgBody = node.function.body;
+    Statement orgBody = node.function.body as Statement;
     // Rewrite as
     // {
     //    registerCallStartProcedure(x);
@@ -428,12 +427,12 @@
       )
     ]);
     node.function.body = block;
-    node.function.body.parent = node.function;
+    node.function.body!.parent = node.function;
   }
 }
 
 Procedure getProcedure(Component component, bool libraryMatcher(Library lib),
-    String className, String procedureName) {
+    String? className, String procedureName) {
   Library lib = component.libraries.where(libraryMatcher).single;
   List<Procedure> procedures = lib.procedures;
   if (className != null) {
@@ -444,7 +443,7 @@
   return procedures.where((p) => p.name.text == procedureName).single;
 }
 
-List<int> runXTimes(int x, List<String> arguments, [List<dynamic> stdout]) {
+List<int> runXTimes(int x, List<String> arguments, [List<dynamic>? stdout]) {
   List<int> result = [];
   Stopwatch stopwatch = new Stopwatch()..start();
   for (int i = 0; i < x; i++) {
diff --git a/pkg/front_end/test/constant_evaluator_benchmark.dart b/pkg/front_end/test/constant_evaluator_benchmark.dart
index 5a817a6..35f5faa 100644
--- a/pkg/front_end/test/constant_evaluator_benchmark.dart
+++ b/pkg/front_end/test/constant_evaluator_benchmark.dart
@@ -51,7 +51,7 @@
 
 void benchmark(Component component, List<Library> libraries) {
   if (tryWithNoEnvironment == null) throw "tryWithNoEnvironment not set";
-  KernelTarget target = incrementalCompiler.userCode as KernelTarget;
+  KernelTarget target = incrementalCompiler.kernelTargetForTesting!;
   constants.EvaluationMode evaluationMode =
       target.getConstantEvaluationModeForTesting();
 
diff --git a/pkg/front_end/test/covariance_check/covariance_check_test.dart b/pkg/front_end/test/covariance_check/covariance_check_test.dart
index 4f59ddc..c91c012 100644
--- a/pkg/front_end/test/covariance_check/covariance_check_test.dart
+++ b/pkg/front_end/test/covariance_check/covariance_check_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart';
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
@@ -33,7 +31,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new CovarianceCheckDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
   }
@@ -44,7 +42,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new CovarianceCheckDataExtractor(compilerResult, actualMap));
   }
 
@@ -58,7 +56,7 @@
       : super(compilerResult, actualMap);
 
   @override
-  String computeNodeValue(Id id, TreeNode node) {
+  String? computeNodeValue(Id id, TreeNode node) {
     if (node is AsExpression && node.isCovarianceCheck) {
       return typeToText(node.type);
     }
diff --git a/pkg/front_end/test/crashing_test_case_minimizer.dart b/pkg/front_end/test/crashing_test_case_minimizer.dart
index c5e60d5..55c2b69 100644
--- a/pkg/front_end/test/crashing_test_case_minimizer.dart
+++ b/pkg/front_end/test/crashing_test_case_minimizer.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:convert' show jsonDecode;
 
 import 'dart:io' show File;
@@ -20,8 +18,8 @@
 // parser on it and verifies that no syntax errors have been introduced.
 
 Future<void> main(List<String> arguments) async {
-  String filename;
-  Uri loadJson;
+  String? filename;
+  Uri? loadJson;
   for (String arg in arguments) {
     if (arg.startsWith("--json=")) {
       String json = arg.substring("--json=".length);
@@ -92,7 +90,7 @@
     if (settings.noPlatform) {
       int i = 0;
       while (settings.platformUri == null ||
-          new File.fromUri(settings.platformUri).existsSync()) {
+          new File.fromUri(settings.platformUri!).existsSync()) {
         settings.platformUri = Uri.base.resolve("nonexisting_$i");
         i++;
       }
@@ -100,7 +98,7 @@
       if (settings.platformUri == null) {
         throw "No platform given. Use --platform=/path/to/platform.dill";
       }
-      if (!new File.fromUri(settings.platformUri).existsSync()) {
+      if (!new File.fromUri(settings.platformUri!).existsSync()) {
         throw "The platform file '${settings.platformUri}' doesn't exist";
       }
     }
diff --git a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
index dfd6efa..437c010 100644
--- a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
+++ b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
@@ -34,6 +34,9 @@
 import 'package:front_end/src/api_prototype/file_system.dart'
     show FileSystem, FileSystemEntity, FileSystemException;
 
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
+
 import 'package:front_end/src/base/processed_options.dart'
     show ProcessedOptions;
 import 'package:front_end/src/fasta/builder/library_builder.dart';
@@ -47,8 +50,8 @@
 import 'package:front_end/src/fasta/messages.dart' show Message;
 import 'package:front_end/src/fasta/source/diet_parser.dart'
     show useImplicitCreationExpressionInCfe;
-import 'package:front_end/src/fasta/util/direct_parser_ast.dart';
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
+import 'package:front_end/src/fasta/util/parser_ast.dart';
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart';
 
 import 'package:front_end/src/fasta/util/textual_outline.dart'
     show textualOutline;
@@ -536,7 +539,7 @@
       if (inlinableUri == uri) continue;
       final Uint8List? originalBytes = _fs.data[uri];
       if (originalBytes == null || originalBytes.isEmpty) continue;
-      DirectParserASTContentCompilationUnitEnd ast = getAST(originalBytes,
+      CompilationUnitEnd ast = getAST(originalBytes,
           includeBody: false,
           includeComments: false,
           enableExtensionMethods: true,
@@ -549,7 +552,7 @@
       // * if that *doesn't* work and we've inserted an export,
       //   try converting that to an import instead.
       List<_Replacement> replacements = [];
-      for (DirectParserASTContentImportEnd import in ast.getImports()) {
+      for (ImportEnd import in ast.getImports()) {
         Token importUriToken = import.importKeyword.next!;
         Uri importUri = _getUri(importUriToken, uri);
         if (inlinableUri == importUri) {
@@ -557,7 +560,7 @@
               import.importKeyword.offset - 1, import.semicolon!.offset + 1));
         }
       }
-      for (DirectParserASTContentExportEnd export in ast.getExports()) {
+      for (ExportEnd export in ast.getExports()) {
         Token exportUriToken = export.exportKeyword.next!;
         Uri exportUri = _getUri(exportUriToken, uri);
         if (inlinableUri == exportUri) {
@@ -582,10 +585,10 @@
           includeComments: false,
           enableExtensionMethods: true,
           enableNonNullable: _isUriNnbd(uri));
-      for (DirectParserASTContentImportEnd import in ast.getImports()) {
+      for (ImportEnd import in ast.getImports()) {
         offsetOfLast = max(offsetOfLast, import.semicolon!.offset + 1);
       }
-      for (DirectParserASTContentExportEnd export in ast.getExports()) {
+      for (ExportEnd export in ast.getExports()) {
         offsetOfLast = max(offsetOfLast, export.semicolon.offset + 1);
       }
 
@@ -683,17 +686,17 @@
   Uint8List _rewriteImportsExportsToUri(
       Uint8List oldData, Uri newUri, Uri oldUri, bool nnbd,
       {bool convertExportToImport: false}) {
-    DirectParserASTContentCompilationUnitEnd ast = getAST(oldData,
+    CompilationUnitEnd ast = getAST(oldData,
         includeBody: false,
         includeComments: false,
         enableExtensionMethods: true,
         enableNonNullable: nnbd);
     List<_Replacement> replacements = [];
-    for (DirectParserASTContentImportEnd import in ast.getImports()) {
+    for (ImportEnd import in ast.getImports()) {
       _rewriteImportsExportsToUriInternal(
           import.importKeyword.next!, oldUri, replacements, newUri);
     }
-    for (DirectParserASTContentExportEnd export in ast.getExports()) {
+    for (ExportEnd export in ast.getExports()) {
       if (convertExportToImport) {
         replacements.add(new _Replacement(
           export.exportKeyword.offset - 1,
@@ -802,7 +805,7 @@
     Uri uriTokenUri = uri.resolve(uriString);
     if (resolvePackage && uriTokenUri.scheme == "package") {
       Package package = _latestCrashingIncrementalCompiler!
-          .currentPackagesMap![uriTokenUri.pathSegments.first]!;
+          .getPackageForPackageName(uriTokenUri.pathSegments.first)!;
       uriTokenUri = package.packageUriRoot
           .resolve(uriTokenUri.pathSegments.skip(1).join("/"));
     }
@@ -810,7 +813,7 @@
   }
 
   Uri _getImportUri(Uri uri) {
-    return _latestCrashingIncrementalCompiler!.userCode!
+    return _latestCrashingIncrementalCompiler!.kernelTargetForTesting!
         .getEntryPointUri(uri, issueProblem: false);
   }
 
@@ -1251,7 +1254,7 @@
     if (!uri.toString().endsWith(".dart")) return;
 
     Uint8List data = _fs.data[uri]!;
-    DirectParserASTContentCompilationUnitEnd ast = getAST(data,
+    CompilationUnitEnd ast = getAST(data,
         includeBody: true,
         includeComments: false,
         enableExtensionMethods: true,
@@ -1260,64 +1263,60 @@
     _CompilationHelperClass helper = new _CompilationHelperClass(data);
 
     // Try to remove top level things one at a time.
-    for (DirectParserASTContent child in ast.children!) {
+    for (ParserAstNode child in ast.children!) {
       bool shouldCompile = false;
       String what = "";
       if (child.isClass()) {
-        DirectParserASTContentClassDeclarationEnd cls = child.asClass();
+        ClassDeclarationEnd cls = child.asClass();
         helper.replacements.add(new _Replacement(
             cls.beginToken.offset - 1, cls.endToken.offset + 1));
         shouldCompile = true;
         what = "class";
       } else if (child.isMixinDeclaration()) {
-        DirectParserASTContentMixinDeclarationEnd decl =
-            child.asMixinDeclaration();
+        MixinDeclarationEnd decl = child.asMixinDeclaration();
         helper.replacements.add(new _Replacement(
             decl.mixinKeyword.offset - 1, decl.endToken.offset + 1));
         shouldCompile = true;
         what = "mixin";
       } else if (child.isNamedMixinDeclaration()) {
-        DirectParserASTContentNamedMixinApplicationEnd decl =
-            child.asNamedMixinDeclaration();
+        NamedMixinApplicationEnd decl = child.asNamedMixinDeclaration();
         helper.replacements.add(
             new _Replacement(decl.begin.offset - 1, decl.endToken.offset + 1));
         shouldCompile = true;
         what = "named mixin";
       } else if (child.isExtension()) {
-        DirectParserASTContentExtensionDeclarationEnd decl =
-            child.asExtension();
+        ExtensionDeclarationEnd decl = child.asExtension();
         helper.replacements.add(new _Replacement(
             decl.extensionKeyword.offset - 1, decl.endToken.offset + 1));
         shouldCompile = true;
         what = "extension";
       } else if (child.isTopLevelFields()) {
-        DirectParserASTContentTopLevelFieldsEnd decl = child.asTopLevelFields();
+        TopLevelFieldsEnd decl = child.asTopLevelFields();
         helper.replacements.add(new _Replacement(
             decl.beginToken.offset - 1, decl.endToken.offset + 1));
         shouldCompile = true;
         what = "toplevel fields";
       } else if (child.isTopLevelMethod()) {
-        DirectParserASTContentTopLevelMethodEnd decl = child.asTopLevelMethod();
+        TopLevelMethodEnd decl = child.asTopLevelMethod();
         helper.replacements.add(new _Replacement(
             decl.beginToken.offset - 1, decl.endToken.offset + 1));
         shouldCompile = true;
         what = "toplevel method";
       } else if (child.isEnum()) {
-        DirectParserASTContentEnumEnd decl = child.asEnum();
+        EnumEnd decl = child.asEnum();
         helper.replacements.add(new _Replacement(
             decl.enumKeyword.offset - 1, decl.leftBrace.endGroup!.offset + 1));
         shouldCompile = true;
         what = "enum";
       } else if (child.isTypedef()) {
-        DirectParserASTContentTypedefEnd decl = child.asTypedef();
+        TypedefEnd decl = child.asTypedef();
         helper.replacements.add(new _Replacement(
             decl.typedefKeyword.offset - 1, decl.endToken.offset + 1));
         shouldCompile = true;
         what = "typedef";
       } else if (child.isMetadata()) {
-        DirectParserASTContentMetadataStarEnd decl = child.asMetadata();
-        List<DirectParserASTContentMetadataEnd> metadata =
-            decl.getMetadataEntries();
+        MetadataStarEnd decl = child.asMetadata();
+        List<MetadataEnd> metadata = decl.getMetadataEntries();
         if (metadata.isNotEmpty) {
           helper.replacements.add(new _Replacement(
               metadata.first.beginToken.offset - 1,
@@ -1326,31 +1325,31 @@
         }
         what = "metadata";
       } else if (child.isImport()) {
-        DirectParserASTContentImportEnd decl = child.asImport();
+        ImportEnd decl = child.asImport();
         helper.replacements.add(new _Replacement(
             decl.importKeyword.offset - 1, decl.semicolon!.offset + 1));
         shouldCompile = true;
         what = "import";
       } else if (child.isExport()) {
-        DirectParserASTContentExportEnd decl = child.asExport();
+        ExportEnd decl = child.asExport();
         helper.replacements.add(new _Replacement(
             decl.exportKeyword.offset - 1, decl.semicolon.offset + 1));
         shouldCompile = true;
         what = "export";
       } else if (child.isLibraryName()) {
-        DirectParserASTContentLibraryNameEnd decl = child.asLibraryName();
+        LibraryNameEnd decl = child.asLibraryName();
         helper.replacements.add(new _Replacement(
             decl.libraryKeyword.offset - 1, decl.semicolon.offset + 1));
         shouldCompile = true;
         what = "library name";
       } else if (child.isPart()) {
-        DirectParserASTContentPartEnd decl = child.asPart();
+        PartEnd decl = child.asPart();
         helper.replacements.add(new _Replacement(
             decl.partKeyword.offset - 1, decl.semicolon.offset + 1));
         shouldCompile = true;
         what = "part";
       } else if (child.isPartOf()) {
-        DirectParserASTContentPartOfEnd decl = child.asPartOf();
+        PartOfEnd decl = child.asPartOf();
         helper.replacements.add(new _Replacement(
             decl.partKeyword.offset - 1, decl.semicolon.offset + 1));
         shouldCompile = true;
@@ -1370,8 +1369,8 @@
         if (!success) {
           if (child.isClass()) {
             // Also try to remove all content of the class.
-            DirectParserASTContentClassDeclarationEnd decl = child.asClass();
-            DirectParserASTContentClassOrMixinOrExtensionBodyEnd body =
+            ClassDeclarationEnd decl = child.asClass();
+            ClassOrMixinOrExtensionBodyEnd body =
                 decl.getClassOrMixinOrExtensionBody();
             if (body.beginToken.offset + 2 < body.endToken.offset) {
               helper.replacements.add(new _Replacement(
@@ -1384,11 +1383,11 @@
 
             if (!success) {
               // Also try to remove members one at a time.
-              for (DirectParserASTContent child in body.children!) {
+              for (ParserAstNode child in body.children!) {
                 shouldCompile = false;
-                if (child is DirectParserASTContentMemberEnd) {
+                if (child is MemberEnd) {
                   if (child.isClassConstructor()) {
-                    DirectParserASTContentClassConstructorEnd memberDecl =
+                    ClassConstructorEnd memberDecl =
                         child.getClassConstructor();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
@@ -1396,23 +1395,21 @@
                     what = "class constructor";
                     shouldCompile = true;
                   } else if (child.isClassFields()) {
-                    DirectParserASTContentClassFieldsEnd memberDecl =
-                        child.getClassFields();
+                    ClassFieldsEnd memberDecl = child.getClassFields();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
                         memberDecl.endToken.offset + 1));
                     what = "class fields";
                     shouldCompile = true;
                   } else if (child.isClassMethod()) {
-                    DirectParserASTContentClassMethodEnd memberDecl =
-                        child.getClassMethod();
+                    ClassMethodEnd memberDecl = child.getClassMethod();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
                         memberDecl.endToken.offset + 1));
                     what = "class method";
                     shouldCompile = true;
                   } else if (child.isClassFactoryMethod()) {
-                    DirectParserASTContentClassFactoryMethodEnd memberDecl =
+                    ClassFactoryMethodEnd memberDecl =
                         child.getClassFactoryMethod();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
@@ -1424,10 +1421,8 @@
                     continue;
                   }
                 } else if (child.isMetadata()) {
-                  DirectParserASTContentMetadataStarEnd decl =
-                      child.asMetadata();
-                  List<DirectParserASTContentMetadataEnd> metadata =
-                      decl.getMetadataEntries();
+                  MetadataStarEnd decl = child.asMetadata();
+                  List<MetadataEnd> metadata = decl.getMetadataEntries();
                   if (metadata.isNotEmpty) {
                     helper.replacements.add(new _Replacement(
                         metadata.first.beginToken.offset - 1,
@@ -1441,8 +1436,8 @@
                       helper, uri, initialComponent, what);
                   if (helper.shouldQuit) return;
                   if (!success) {
-                    DirectParserASTContentBlockFunctionBodyEnd? decl;
-                    if (child is DirectParserASTContentMemberEnd) {
+                    BlockFunctionBodyEnd? decl;
+                    if (child is MemberEnd) {
                       if (child.isClassMethod()) {
                         decl = child.getClassMethod().getBlockFunctionBody();
                       } else if (child.isClassConstructor()) {
@@ -1498,9 +1493,8 @@
             }
           } else if (child.isMixinDeclaration()) {
             // Also try to remove all content of the mixin.
-            DirectParserASTContentMixinDeclarationEnd decl =
-                child.asMixinDeclaration();
-            DirectParserASTContentClassOrMixinOrExtensionBodyEnd body =
+            MixinDeclarationEnd decl = child.asMixinDeclaration();
+            ClassOrMixinOrExtensionBodyEnd body =
                 decl.getClassOrMixinOrExtensionBody();
             if (body.beginToken.offset + 2 < body.endToken.offset) {
               helper.replacements.add(new _Replacement(
@@ -1513,11 +1507,11 @@
 
             if (!success) {
               // Also try to remove members one at a time.
-              for (DirectParserASTContent child in body.children!) {
+              for (ParserAstNode child in body.children!) {
                 shouldCompile = false;
-                if (child is DirectParserASTContentMemberEnd) {
+                if (child is MemberEnd) {
                   if (child.isMixinConstructor()) {
-                    DirectParserASTContentMixinConstructorEnd memberDecl =
+                    MixinConstructorEnd memberDecl =
                         child.getMixinConstructor();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
@@ -1525,23 +1519,21 @@
                     what = "mixin constructor";
                     shouldCompile = true;
                   } else if (child.isMixinFields()) {
-                    DirectParserASTContentMixinFieldsEnd memberDecl =
-                        child.getMixinFields();
+                    MixinFieldsEnd memberDecl = child.getMixinFields();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
                         memberDecl.endToken.offset + 1));
                     what = "mixin fields";
                     shouldCompile = true;
                   } else if (child.isMixinMethod()) {
-                    DirectParserASTContentMixinMethodEnd memberDecl =
-                        child.getMixinMethod();
+                    MixinMethodEnd memberDecl = child.getMixinMethod();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
                         memberDecl.endToken.offset + 1));
                     what = "mixin method";
                     shouldCompile = true;
                   } else if (child.isMixinFactoryMethod()) {
-                    DirectParserASTContentMixinFactoryMethodEnd memberDecl =
+                    MixinFactoryMethodEnd memberDecl =
                         child.getMixinFactoryMethod();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
@@ -1553,10 +1545,8 @@
                     continue;
                   }
                 } else if (child.isMetadata()) {
-                  DirectParserASTContentMetadataStarEnd decl =
-                      child.asMetadata();
-                  List<DirectParserASTContentMetadataEnd> metadata =
-                      decl.getMetadataEntries();
+                  MetadataStarEnd decl = child.asMetadata();
+                  List<MetadataEnd> metadata = decl.getMetadataEntries();
                   if (metadata.isNotEmpty) {
                     helper.replacements.add(new _Replacement(
                         metadata.first.beginToken.offset - 1,
@@ -1570,8 +1560,8 @@
                       helper, uri, initialComponent, what);
                   if (helper.shouldQuit) return;
                   if (!success) {
-                    DirectParserASTContentBlockFunctionBodyEnd? decl;
-                    if (child is DirectParserASTContentMemberEnd) {
+                    BlockFunctionBodyEnd? decl;
+                    if (child is MemberEnd) {
                       if (child.isClassMethod()) {
                         decl = child.getClassMethod().getBlockFunctionBody();
                       } else if (child.isClassConstructor()) {
@@ -1767,7 +1757,7 @@
 
   bool _knownByCompiler(Uri uri) {
     LibraryBuilder? libraryBuilder = _latestCrashingIncrementalCompiler!
-        .userCode!.loader
+        .kernelTargetForTesting!.loader
         .lookupLibraryBuilder(_getImportUri(uri));
     if (libraryBuilder != null) {
       return true;
@@ -1786,14 +1776,14 @@
   bool _isUriNnbd(Uri uri, {bool crashOnFail: true}) {
     Uri asImportUri = _getImportUri(uri);
     LibraryBuilder? libraryBuilder = _latestCrashingIncrementalCompiler!
-        .userCode!.loader
+        .kernelTargetForTesting!.loader
         .lookupLibraryBuilder(asImportUri);
     if (libraryBuilder != null) {
       return libraryBuilder.isNonNullableByDefault;
     }
     print("Couldn't lookup $uri");
     for (LibraryBuilder libraryBuilder in _latestCrashingIncrementalCompiler!
-        .userCode!.loader.libraryBuilders) {
+        .kernelTargetForTesting!.loader.libraryBuilders) {
       if (libraryBuilder.importUri == uri) {
         print("Found $uri as ${libraryBuilder.importUri} (!= ${asImportUri})");
         return libraryBuilder.isNonNullableByDefault;
@@ -1826,7 +1816,9 @@
     }
     incrementalCompiler.invalidate(_mainUri);
     try {
-      _latestComponent = await incrementalCompiler.computeDelta();
+      IncrementalCompilerResult incrementalCompilerResult =
+          await incrementalCompiler.computeDelta();
+      _latestComponent = incrementalCompilerResult.component;
       if (_settings.serialize) {
         // We're asked to serialize, probably because it crashes in
         // serialization.
@@ -1839,7 +1831,9 @@
 
       for (Uri uri in _settings.invalidate) {
         incrementalCompiler.invalidate(uri);
-        Component delta = await incrementalCompiler.computeDelta();
+        IncrementalCompilerResult deltaResult =
+            await incrementalCompiler.computeDelta();
+        Component delta = deltaResult.component;
         if (_settings.serialize) {
           // We're asked to serialize, probably because it crashes in
           // serialization.
@@ -1926,7 +1920,9 @@
   Future<Component> _getInitialComponent() async {
     IncrementalCompiler incrementalCompiler =
         new IncrementalCompiler(_setupCompilerContext());
-    Component originalComponent = await incrementalCompiler.computeDelta();
+    IncrementalCompilerResult incrementalCompilerResult =
+        await incrementalCompiler.computeDelta();
+    Component originalComponent = incrementalCompilerResult.component;
     return originalComponent;
   }
 
diff --git a/pkg/front_end/test/dartdoc_test_test.dart b/pkg/front_end/test/dartdoc_test_test.dart
index 455a8cf..35de337 100644
--- a/pkg/front_end/test/dartdoc_test_test.dart
+++ b/pkg/front_end/test/dartdoc_test_test.dart
@@ -1,5 +1,3 @@
-// @dart = 2.9
-
 import 'dart:convert';
 import 'dart:typed_data';
 
@@ -393,7 +391,7 @@
 }
 
 int expectCalls = 0;
-String expectCategory;
+String? expectCategory;
 
 void expect(dynamic actual, dynamic expected) {
   expectCalls++;
@@ -461,23 +459,23 @@
   return false;
 }
 
-impl.CommentString extractFirstComment(String test) {
+impl.CommentString? extractFirstComment(String test) {
   Token firstToken = impl.scanRawBytes(utf8.encode(test) as Uint8List);
   Token token = firstToken;
   while (true) {
-    CommentToken comment = token.precedingComments;
+    CommentToken? comment = token.precedingComments;
     if (comment != null) {
       return impl.extractComments(comment, test);
     }
     if (token.isEof) break;
-    Token next = token.next;
+    Token? next = token.next;
     if (next == null) break;
     token = next;
   }
   return null;
 }
 
-List<impl.Test> extractTests(String test, [Uri uri]) {
+List<impl.Test> extractTests(String test, [Uri? uri]) {
   return impl.extractTests(utf8.encode(test) as Uint8List,
       uri ?? new Uri(scheme: "darttest", path: "/foo.dart"));
 }
diff --git a/pkg/front_end/test/dartdoctest_suite.dart b/pkg/front_end/test/dartdoctest_suite.dart
index 447ab20..d71cd57 100644
--- a/pkg/front_end/test/dartdoctest_suite.dart
+++ b/pkg/front_end/test/dartdoctest_suite.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:testing/testing.dart'
     show Chain, ChainContext, Result, Step, TestDescription, runMe;
 
diff --git a/pkg/front_end/test/deps_git_test.dart b/pkg/front_end/test/deps_git_test.dart
index c542bc5..2017352 100644
--- a/pkg/front_end/test/deps_git_test.dart
+++ b/pkg/front_end/test/deps_git_test.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 import 'dart:io';
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart';
@@ -75,7 +73,7 @@
         new DillTarget(ticker, uriTranslator, c.options.target);
     KernelTarget kernelTarget =
         new KernelTarget(c.fileSystem, false, dillTarget, uriTranslator);
-    Uri platform = c.options.sdkSummary;
+    Uri? platform = c.options.sdkSummary;
     if (platform != null) {
       var bytes = new File.fromUri(platform).readAsBytesSync();
       var platformComponent = loadComponentFromBytes(bytes);
@@ -84,7 +82,7 @@
     }
 
     kernelTarget.setEntryPoints(c.options.inputs);
-    await dillTarget.buildOutlines();
+    dillTarget.buildOutlines();
     await kernelTarget.loader.buildOutlines();
     return new List<Uri>.from(c.dependencies);
   });
diff --git a/pkg/front_end/test/desugar_test.dart b/pkg/front_end/test/desugar_test.dart
index 82fdd4a..18342bb 100644
--- a/pkg/front_end/test/desugar_test.dart
+++ b/pkg/front_end/test/desugar_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 /// Test to ensure that desugaring APIs used by clients like dart2js are
 /// always up to date.
 ///
@@ -33,13 +31,13 @@
 
 Future<void> testRedirectingFactoryDirect() async {
   var component = await compileUnit(['a.dart'], {'a.dart': aSource});
-  checkIsRedirectingFactory(component, 'a.dart', 'A', 'foo');
+  checkIsRedirectingFactory(component!, 'a.dart', 'A', 'foo');
   checkIsRedirectingFactory(component, 'core', 'Uri', 'file');
 }
 
 Future<void> testRedirectingFactorySerialized() async {
   var component = await compileUnit(['a.dart'], {'a.dart': aSource});
-  var bytes = serializeComponent(component);
+  var bytes = serializeComponent(component!);
   component = new ir.Component();
   new BinaryBuilder(bytes).readComponent(component);
   checkIsRedirectingFactory(component, 'a.dart', 'A', 'foo');
@@ -62,8 +60,8 @@
   var lib =
       component.libraries.firstWhere((l) => l.importUri.path.endsWith(uriPath));
   var cls = lib.classes.firstWhere((c) => c.name == className);
-  ir.Procedure member =
-      cls.members.firstWhere((m) => m.name.text == constructorName);
+  ir.Procedure member = cls.members
+      .firstWhere((m) => m.name.text == constructorName) as ir.Procedure;
   Expect.isTrue(
       member.kind == ir.ProcedureKind.Factory, "$member is not a factory");
   Expect.isTrue(api.isRedirectingFactory(member));
diff --git a/pkg/front_end/test/dijkstras_sssp_algorithm.dart b/pkg/front_end/test/dijkstras_sssp_algorithm.dart
index 1c0a623..398ea2c 100644
--- a/pkg/front_end/test/dijkstras_sssp_algorithm.dart
+++ b/pkg/front_end/test/dijkstras_sssp_algorithm.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:collection';
 
 /// Dijkstra's algorithm for single source shortest path.
@@ -21,8 +19,8 @@
   DijkstrasAlgorithm(Iterable<GraphNode<E>> graphNodes, GraphNode<E> source,
       int Function(E, E) comparator, int Function(E, E) distance) {
     SplayTreeSet<GraphNode<E>> q = new SplayTreeSet<GraphNode<E>>((a, b) {
-      int distA = dist[a];
-      int distB = dist[b];
+      int? distA = dist[a];
+      int? distB = dist[b];
 
       int when0() {
         if (identical(a, b)) return 0;
@@ -39,7 +37,7 @@
       if (distA == null && distB == null) {
         return when0();
       }
-      if (distA < distB) return -1;
+      if (distA! < distB!) return -1;
       if (distA > distB) return 1;
       return when0();
     });
@@ -56,7 +54,7 @@
 
     while (q.isNotEmpty) {
       GraphNode<E> u = q.first;
-      int distToU = dist[u];
+      int? distToU = dist[u];
       if (distToU == null) {
         // No path to any of the remaining ${q.length} nodes.
         break;
@@ -68,7 +66,7 @@
         int distanceUToV = distance(u.node, v.node);
         if (distanceUToV < 0) throw "Got negative distance. That's not allowed";
         int alt = distToU + distanceUToV;
-        int distToV = dist[v];
+        int? distToV = dist[v];
         if (distToV == null || alt < distToV) {
           // Decrease length (decrease priority in priority queue).
           q.remove(v);
@@ -85,7 +83,7 @@
     GraphNode<E> u = target;
     while (u == source || prev[u] != null) {
       path.add(u.node);
-      u = prev[u];
+      u = prev[u]!;
     }
     return path.reversed.toList();
   }
diff --git a/pkg/front_end/test/dill_round_trip_test.dart b/pkg/front_end/test/dill_round_trip_test.dart
index 32d5759..716b186 100644
--- a/pkg/front_end/test/dill_round_trip_test.dart
+++ b/pkg/front_end/test/dill_round_trip_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:front_end/src/fasta/kernel/utils.dart' show serializeComponent;
 
 import 'package:kernel/ast.dart' show Component;
diff --git a/pkg/front_end/test/enable_non_nullable/enable_non_nullable_test.dart b/pkg/front_end/test/enable_non_nullable/enable_non_nullable_test.dart
index f5fb221..a5f766e 100644
--- a/pkg/front_end/test/enable_non_nullable/enable_non_nullable_test.dart
+++ b/pkg/front_end/test/enable_non_nullable/enable_non_nullable_test.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 import 'dart:io';
 
 import 'package:expect/expect.dart';
@@ -59,10 +57,10 @@
 }
 
 Future<void> test(
-    {bool enableNonNullableByDefault,
-    bool enableNonNullableExplicitly,
-    Version versionImpliesOptIn,
-    Version versionOptsInAllowed}) async {
+    {required bool enableNonNullableByDefault,
+    required bool enableNonNullableExplicitly,
+    required Version versionImpliesOptIn,
+    required Version versionOptsInAllowed}) async {
   CompilerOptions options = new CompilerOptions();
   if (enableNonNullableByDefault) {
     // Pretend non-nullable is on by default.
@@ -112,12 +110,12 @@
 
   Directory directory = new Directory.fromUri(
       Uri.base.resolve('pkg/front_end/test/enable_non_nullable/data/'));
-  CompilerResult result = await kernelForProgramInternal(
+  CompilerResult result = (await kernelForProgramInternal(
       directory.uri.resolve('main.dart'), options,
-      retainDataForTesting: true);
+      retainDataForTesting: true))!;
   Expect.isFalse(
       hadDiagnostic, "Compilation had diagnostics (errors, warnings)!");
-  for (Library library in result.component.libraries) {
+  for (Library library in result.component!.libraries) {
     if (library.importUri.scheme != 'dart') {
       bool usesLegacy =
           await uriUsesLegacyLanguageVersion(library.fileUri, options);
diff --git a/pkg/front_end/test/explicit_creation_git_test.dart b/pkg/front_end/test/explicit_creation_git_test.dart
index 5028925..dc8e3a1 100644
--- a/pkg/front_end/test/explicit_creation_git_test.dart
+++ b/pkg/front_end/test/explicit_creation_git_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io';
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart';
@@ -86,15 +84,14 @@
 
   Stopwatch stopwatch = new Stopwatch()..start();
 
-  await CompilerContext.runWithOptions<List<Uri>>(options,
-      (CompilerContext c) async {
+  await CompilerContext.runWithOptions(options, (CompilerContext c) async {
     UriTranslator uriTranslator = await c.options.getUriTranslator();
     DillTarget dillTarget =
         new DillTarget(ticker, uriTranslator, c.options.target);
     KernelTarget kernelTarget =
         new KernelTargetTest(c.fileSystem, false, dillTarget, uriTranslator);
 
-    Uri platform = c.options.sdkSummary;
+    Uri? platform = c.options.sdkSummary;
     if (platform != null) {
       var bytes = new File.fromUri(platform).readAsBytesSync();
       var platformComponent = loadComponentFromBytes(bytes);
@@ -103,10 +100,9 @@
     }
 
     kernelTarget.setEntryPoints(c.options.inputs);
-    await dillTarget.buildOutlines();
+    dillTarget.buildOutlines();
     await kernelTarget.buildOutlines();
     await kernelTarget.buildComponent();
-    return null;
   });
 
   print("Done in ${stopwatch.elapsedMilliseconds} ms. "
@@ -138,7 +134,7 @@
   @override
   BodyBuilder createBodyBuilderForOutlineExpression(
       SourceLibraryBuilder library,
-      DeclarationBuilder declarationBuilder,
+      DeclarationBuilder? declarationBuilder,
       ModifierBuilder member,
       Scope scope,
       Uri fileUri) {
@@ -162,10 +158,10 @@
   BodyBuilder createListenerInternal(
       ModifierBuilder builder,
       Scope memberScope,
-      Scope formalParameterScope,
+      Scope? formalParameterScope,
       bool isDeclarationInstanceMember,
-      VariableDeclaration extensionThis,
-      List<TypeParameter> extensionTypeParameters,
+      VariableDeclaration? extensionThis,
+      List<TypeParameter>? extensionTypeParameters,
       TypeInferrer typeInferrer,
       ConstantContext constantContext) {
     return new BodyBuilderTest(
@@ -221,7 +217,7 @@
   @override
   BodyBuilderTest.forOutlineExpression(
       SourceLibraryBuilder library,
-      DeclarationBuilder declarationBuilder,
+      DeclarationBuilder? declarationBuilder,
       ModifierBuilder member,
       Scope scope,
       Uri fileUri)
@@ -230,18 +226,18 @@
 
   @override
   Expression buildConstructorInvocation(
-      TypeDeclarationBuilder type,
+      TypeDeclarationBuilder? type,
       Token nameToken,
       Token nameLastToken,
-      Arguments arguments,
+      Arguments? arguments,
       String name,
-      List<TypeBuilder> typeArguments,
+      List<TypeBuilder>? typeArguments,
       int charOffset,
       Constness constness,
       {bool isTypeArgumentsInForest = false,
-      TypeDeclarationBuilder typeAliasBuilder,
-      UnresolvedKind unresolvedKind}) {
-    Token maybeNewOrConst = nameToken.previous;
+      TypeDeclarationBuilder? typeAliasBuilder,
+      required UnresolvedKind unresolvedKind}) {
+    Token maybeNewOrConst = nameToken.previous!;
     bool doReport = true;
     if (maybeNewOrConst is KeywordToken) {
       if (maybeNewOrConst.lexeme == "new" ||
diff --git a/pkg/front_end/test/extensions/extensions_test.dart b/pkg/front_end/test/extensions/extensions_test.dart
index 5765b21..2bb86f3 100644
--- a/pkg/front_end/test/extensions/extensions_test.dart
+++ b/pkg/front_end/test/extensions/extensions_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart';
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
@@ -45,7 +43,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new ExtensionsDataExtractor(compilerResult, actualMap));
   }
 
@@ -55,7 +53,7 @@
       InternalCompilerResult compilerResult,
       Class cls,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new ExtensionsDataExtractor(compilerResult, actualMap).computeForClass(cls);
   }
 
@@ -65,7 +63,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new ExtensionsDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
   }
@@ -76,7 +74,7 @@
       InternalCompilerResult compilerResult,
       Extension extension,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new ExtensionsDataExtractor(compilerResult, actualMap)
         .computeForExtension(extension);
   }
@@ -146,9 +144,9 @@
   Features computeLibraryValue(Id id, Library library) {
     Features features = new Features();
     SourceLibraryBuilder libraryBuilder =
-        lookupLibraryBuilder(compilerResult, library);
+        lookupLibraryBuilder(compilerResult, library) as SourceLibraryBuilder;
     libraryBuilder.forEachExtensionInScope((ExtensionBuilder extension) {
-      LibraryBuilder library = extension.parent;
+      LibraryBuilder library = extension.parent as LibraryBuilder;
       String libraryPrefix = '';
       if (library != libraryBuilder) {
         libraryPrefix = '${library.fileUri.pathSegments.last}.';
@@ -159,28 +157,32 @@
   }
 
   @override
-  Features computeClassValue(Id id, Class cls) {
-    ClassBuilder clsBuilder = lookupClassBuilder(compilerResult, cls);
+  Features? computeClassValue(Id id, Class cls) {
+    ClassBuilder clsBuilder =
+        lookupClassBuilder(compilerResult, cls) as ClassBuilder;
     if (!clsBuilder.isExtension) {
       return null;
     }
     Features features = new Features();
     features[Tags.builderName] = clsBuilder.name;
     if (clsBuilder.typeVariables != null) {
-      for (TypeVariableBuilder typeVariable in clsBuilder.typeVariables) {
+      for (TypeVariableBuilder typeVariable in clsBuilder.typeVariables!) {
         features.addElement(Tags.builderTypeParameters,
             typeVariableBuilderToText(typeVariable));
       }
     }
 
-    features[Tags.builderSupertype] = clsBuilder.supertypeBuilder?.name;
+    if (clsBuilder.supertypeBuilder != null) {
+      features[Tags.builderSupertype] =
+          clsBuilder.supertypeBuilder!.name as String;
+    }
     if (clsBuilder.interfaceBuilders != null) {
-      for (TypeBuilder superinterface in clsBuilder.interfaceBuilders) {
+      for (TypeBuilder superinterface in clsBuilder.interfaceBuilders!) {
         features.addElement(Tags.builderInterfaces, superinterface.name);
       }
     }
     if (clsBuilder.onTypes != null) {
-      for (TypeBuilder onType in clsBuilder.onTypes) {
+      for (TypeBuilder onType in clsBuilder.onTypes!) {
         features.addElement(Tags.builderOnTypes, typeBuilderToText(onType));
       }
     }
@@ -190,7 +192,9 @@
       features.addElement(
           Tags.clsTypeParameters, typeParameterToText(typeParameter));
     }
-    features[Tags.clsSupertype] = cls.supertype?.classNode?.name;
+    if (cls.supertype != null) {
+      features[Tags.clsSupertype] = cls.supertype!.classNode.name;
+    }
     for (Supertype superinterface in cls.implementedTypes) {
       features.addElement(Tags.clsInterfaces, superinterface.classNode.name);
     }
@@ -198,9 +202,9 @@
   }
 
   @override
-  Features computeExtensionValue(Id id, Extension extension) {
+  Features? computeExtensionValue(Id id, Extension extension) {
     ExtensionBuilder extensionBuilder =
-        lookupExtensionBuilder(compilerResult, extension);
+        lookupExtensionBuilder(compilerResult, extension)!;
     if (!extensionBuilder.isExtension) {
       return null;
     }
@@ -208,19 +212,14 @@
     features[Tags.builderName] = extensionBuilder.name;
     if (extensionBuilder.typeParameters != null) {
       for (TypeVariableBuilder typeVariable
-          in extensionBuilder.typeParameters) {
+          in extensionBuilder.typeParameters!) {
         features.addElement(Tags.builderTypeParameters,
             typeVariableBuilderToText(typeVariable));
       }
     }
-    if (extensionBuilder.onType != null) {
-      features[Tags.builderOnType] = typeBuilderToText(extensionBuilder.onType);
-    }
-
+    features[Tags.builderOnType] = typeBuilderToText(extensionBuilder.onType);
     features[Tags.extensionName] = extension.name;
-    if (extension.onType != null) {
-      features[Tags.extensionOnType] = typeToText(extension.onType);
-    }
+    features[Tags.extensionOnType] = typeToText(extension.onType);
     for (TypeParameter typeParameter in extension.typeParameters) {
       features.addElement(
           Tags.extensionTypeParameters, typeParameterToText(typeParameter));
@@ -233,17 +232,17 @@
   }
 
   @override
-  Features computeMemberValue(Id id, Member member) {
+  Features? computeMemberValue(Id id, Member member) {
     if (!member.isExtensionMember) {
       return null;
     }
 
-    MemberBuilder memberBuilder = lookupMemberBuilder(compilerResult, member);
+    MemberBuilder memberBuilder = lookupMemberBuilder(compilerResult, member)!;
     Features features = new Features();
     features[Tags.builderName] = memberBuilder.name;
     if (memberBuilder is FunctionBuilder) {
       if (memberBuilder.formals != null) {
-        for (FormalParameterBuilder parameter in memberBuilder.formals) {
+        for (FormalParameterBuilder parameter in memberBuilder.formals!) {
           if (parameter.isRequired) {
             features.addElement(Tags.builderRequiredParameters, parameter.name);
           } else if (parameter.isPositional) {
@@ -259,7 +258,7 @@
         features.markAsUnsorted(Tags.builderNamedParameters);
       }
       if (memberBuilder.typeVariables != null) {
-        for (TypeVariableBuilder typeVariable in memberBuilder.typeVariables) {
+        for (TypeVariableBuilder typeVariable in memberBuilder.typeVariables!) {
           features.addElement(Tags.builderTypeParameters,
               typeVariableBuilderToText(typeVariable));
         }
@@ -269,23 +268,23 @@
     features[Tags.memberName] = getMemberName(member);
     if (member.function != null) {
       for (int index = 0;
-          index < member.function.positionalParameters.length;
+          index < member.function!.positionalParameters.length;
           index++) {
         VariableDeclaration parameter =
-            member.function.positionalParameters[index];
-        if (index < member.function.requiredParameterCount) {
+            member.function!.positionalParameters[index];
+        if (index < member.function!.requiredParameterCount) {
           features.addElement(Tags.memberRequiredParameters, parameter.name);
         } else {
           features.addElement(Tags.memberPositionalParameters, parameter.name);
         }
       }
-      for (VariableDeclaration parameter in member.function.namedParameters) {
+      for (VariableDeclaration parameter in member.function!.namedParameters) {
         features.addElement(Tags.memberNamedParameters, parameter.name);
       }
       features.markAsUnsorted(Tags.memberRequiredParameters);
       features.markAsUnsorted(Tags.memberPositionalParameters);
       features.markAsUnsorted(Tags.memberNamedParameters);
-      for (TypeParameter typeParameter in member.function.typeParameters) {
+      for (TypeParameter typeParameter in member.function!.typeParameters) {
         features.addElement(
             Tags.memberTypeParameters, typeParameterToText(typeParameter));
       }
@@ -295,7 +294,7 @@
   }
 
   @override
-  Features computeNodeValue(Id id, TreeNode node) {
+  Features? computeNodeValue(Id id, TreeNode node) {
     if (node is ThisExpression) {
       Features features = new Features();
       features.add(Tags.hasThis);
diff --git a/pkg/front_end/test/fasta/ambiguous_export_test.dart b/pkg/front_end/test/fasta/ambiguous_export_test.dart
index fa0ef8f..2b9dc15 100644
--- a/pkg/front_end/test/fasta/ambiguous_export_test.dart
+++ b/pkg/front_end/test/fasta/ambiguous_export_test.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 import 'package:async_helper/async_helper.dart' show asyncTest;
 
 import 'package:expect/expect.dart' show Expect;
@@ -34,7 +32,7 @@
           await c.options.getUriTranslator(), c.options.target);
       target.loader.appendLibraries(component);
       DillLibraryBuilder builder = target.loader.read(library.importUri, -1);
-      await target.loader.buildOutline(builder);
+      target.loader.buildOutline(builder);
       builder.markAsReadyToFinalizeExports();
       var mainExport =
           builder.exportScope.lookupLocalMember("main", setter: false);
diff --git a/pkg/front_end/test/fasta/analyze_git_test.dart b/pkg/front_end/test/fasta/analyze_git_test.dart
index c649729..30d0ba3 100644
--- a/pkg/front_end/test/fasta/analyze_git_test.dart
+++ b/pkg/front_end/test/fasta/analyze_git_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show exitCode;
 
 import "package:testing/src/run_tests.dart" as testing show main;
diff --git a/pkg/front_end/test/fasta/analyze_src_with_lints_git_test.dart b/pkg/front_end/test/fasta/analyze_src_with_lints_git_test.dart
index b4b0e5f..664e888 100644
--- a/pkg/front_end/test/fasta/analyze_src_with_lints_git_test.dart
+++ b/pkg/front_end/test/fasta/analyze_src_with_lints_git_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show exitCode;
 
 import "package:testing/src/run_tests.dart" as testing show main;
diff --git a/pkg/front_end/test/fasta/assert_locations_test.dart b/pkg/front_end/test/fasta/assert_locations_test.dart
index 029196a..4f4787e 100644
--- a/pkg/front_end/test/fasta/assert_locations_test.dart
+++ b/pkg/front_end/test/fasta/assert_locations_test.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 library fasta.test.assert_locations_test;
 
 import 'package:async_helper/async_helper.dart' show asyncTest;
@@ -47,7 +45,7 @@
   // parenthesis of the assert statement to the first character of the
   // condition.
   void makeAssertWithMessage(String condition,
-      {String message, bool trailingComma: false, int additionalOffset: 0}) {
+      {String? message, bool trailingComma: false, int additionalOffset: 0}) {
     final name = 'testCase${spans.length}';
     sb.writeln('void $name(x) {');
     sb.write('assert(');
@@ -110,7 +108,7 @@
 
   /// When [AssertStatement] is reached it is checked against this
   /// span.
-  ConditionSpan expectedSpan;
+  ConditionSpan? expectedSpan;
 
   VerifyingVisitor(this.test);
 
@@ -126,8 +124,8 @@
 
   @override
   void visitAssertStatement(AssertStatement node) {
-    Expect.equals(expectedSpan.startOffset, node.conditionStartOffset);
-    Expect.equals(expectedSpan.endOffset, node.conditionEndOffset);
+    Expect.equals(expectedSpan!.startOffset, node.conditionStartOffset);
+    Expect.equals(expectedSpan!.endOffset, node.conditionEndOffset);
   }
 }
 
@@ -139,12 +137,12 @@
         Expect.fail(
             "Unexpected message: ${message.plainTextFormatted.join('\n')}");
       };
-    Component p = (await compileScript(test.source,
+    Component? p = (await compileScript(test.source,
             options: options, fileName: 'synthetic-test.dart'))
         ?.component;
     Expect.isNotNull(p);
     VerifyingVisitor visitor = new VerifyingVisitor(test);
-    p.mainMethod.enclosingLibrary.accept(visitor);
+    p!.mainMethod!.enclosingLibrary.accept(visitor);
     Expect.setEquals(test.spans.keys, visitor.verified);
   });
 }
diff --git a/pkg/front_end/test/fasta/bootstrap_test.dart b/pkg/front_end/test/fasta/bootstrap_test.dart
index fd49f77..750c685 100644
--- a/pkg/front_end/test/fasta/bootstrap_test.dart
+++ b/pkg/front_end/test/fasta/bootstrap_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, File, Platform;
 
 import 'package:async_helper/async_helper.dart' show asyncEnd, asyncStart;
diff --git a/pkg/front_end/test/fasta/expression_suite.dart b/pkg/front_end/test/fasta/expression_suite.dart
index d6159f9..371e8ef 100644
--- a/pkg/front_end/test/fasta/expression_suite.dart
+++ b/pkg/front_end/test/fasta/expression_suite.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 library fasta.test.expression_test;
 
 import "dart:convert" show JsonEncoder;
@@ -73,7 +71,7 @@
 
   ProcessedOptions get options => compilerContext.options;
 
-  MemoryFileSystem get fileSystem => options.fileSystem;
+  MemoryFileSystem get fileSystem => options.fileSystem as MemoryFileSystem;
 
   Future<T> runInContext<T>(Future<T> action(CompilerContext c)) {
     return compilerContext.runInContext<T>(action);
@@ -91,7 +89,7 @@
 }
 
 class CompilationResult {
-  Procedure compiledProcedure;
+  Procedure? compiledProcedure;
   List<DiagnosticMessage> errors;
   CompilationResult(this.compiledProcedure, this.errors);
 
@@ -115,7 +113,7 @@
       buffer.write("<no procedure>");
     } else {
       Printer printer = new Printer(buffer);
-      printer.visitProcedure(compiledProcedure);
+      printer.visitProcedure(compiledProcedure!);
       printer.writeConstantTable(new Component());
     }
     Uri base = entryPoint.resolve(".");
@@ -126,9 +124,9 @@
 class TestCase {
   final TestDescription description;
 
-  final Uri entryPoint;
+  final Uri? entryPoint;
 
-  final Uri import;
+  final Uri? import;
 
   final List<String> definitions;
 
@@ -136,13 +134,13 @@
 
   final bool isStaticMethod;
 
-  final Uri library;
+  final Uri? library;
 
-  final String className;
+  final String? className;
 
-  final String methodName;
+  final String? methodName;
 
-  String expression;
+  String? expression;
 
   List<CompilationResult> results = [];
 
@@ -170,12 +168,12 @@
         "static = $isStaticMethod)";
   }
 
-  String validate() {
+  String? validate() {
     print(this);
     if (entryPoint == null) {
       return "No entryPoint.";
     }
-    if (!(new File.fromUri(entryPoint)).existsSync()) {
+    if (!(new File.fromUri(entryPoint!)).existsSync()) {
       return "Entry point $entryPoint doesn't exist.";
     }
     if (library == null) {
@@ -202,10 +200,10 @@
   Future<Result<Null>> run(List<TestCase> tests, Context context) async {
     String actual = "";
     for (var test in tests) {
-      var primary = test.results.first.printResult(test.entryPoint, context);
+      var primary = test.results.first.printResult(test.entryPoint!, context);
       actual += primary;
       for (int i = 1; i < test.results.length; ++i) {
-        var secondary = test.results[i].printResult(test.entryPoint, context);
+        var secondary = test.results[i].printResult(test.entryPoint!, context);
         if (primary != secondary) {
           return fail(
               null,
@@ -256,15 +254,15 @@
     Uri uri = description.uri;
     String contents = await new File.fromUri(uri).readAsString();
 
-    Uri entryPoint;
-    Uri import;
+    Uri? entryPoint;
+    Uri? import;
     List<String> definitions = <String>[];
     List<String> typeDefinitions = <String>[];
     bool isStaticMethod = false;
-    Uri library;
-    String className;
-    String methodName;
-    String expression;
+    Uri? library;
+    String? className;
+    String? methodName;
+    String? expression;
 
     dynamic maps = loadYamlNode(contents, sourceUrl: uri);
     if (maps is YamlMap) maps = [maps];
@@ -282,7 +280,7 @@
         } else if (key == "position") {
           Uri uri = description.uri.resolveUri(Uri.parse(value as String));
           library = uri.removeFragment();
-          if (uri.fragment != null && uri.fragment != '') {
+          if (uri.fragment != '') {
             className = uri.fragment;
           }
         } else if (key == "method") {
@@ -339,12 +337,12 @@
           .add(new TypeParameter(name, new DynamicType(), new DynamicType()));
     }
 
-    Procedure compiledProcedure = await compiler.compileExpression(
-      test.expression,
+    Procedure? compiledProcedure = await compiler.compileExpression(
+      test.expression!,
       definitions,
       typeParams,
       "debugExpr",
-      test.library,
+      test.library!,
       className: test.className,
       methodName: test.methodName,
       isStatic: test.isStaticMethod,
@@ -363,23 +361,25 @@
   Future<Result<List<TestCase>>> run(
       List<TestCase> tests, Context context) async {
     for (var test in tests) {
-      context.fileSystem.entityForUri(test.entryPoint).writeAsBytesSync(
-          await new File.fromUri(test.entryPoint).readAsBytes());
+      context.fileSystem.entityForUri(test.entryPoint!).writeAsBytesSync(
+          await new File.fromUri(test.entryPoint!).readAsBytes());
 
       if (test.import != null) {
-        context.fileSystem.entityForUri(test.import).writeAsBytesSync(
-            await new File.fromUri(test.import).readAsBytes());
+        context.fileSystem.entityForUri(test.import!).writeAsBytesSync(
+            await new File.fromUri(test.import!).readAsBytes());
       }
 
       var sourceCompiler = new IncrementalCompiler(context.compilerContext);
-      Component component =
-          await sourceCompiler.computeDelta(entryPoints: [test.entryPoint]);
+      var sourceCompilerResult =
+          await sourceCompiler.computeDelta(entryPoints: [test.entryPoint!]);
+      Component component = sourceCompilerResult.component;
       var errors = context.takeErrors();
       if (!errors.isEmpty) {
         return fail(tests, "Couldn't compile entry-point: $errors");
       }
       Uri dillFileUri = new Uri(
-          scheme: test.entryPoint.scheme, path: test.entryPoint.path + ".dill");
+          scheme: test.entryPoint!.scheme,
+          path: test.entryPoint!.path + ".dill");
       File dillFile = new File.fromUri(dillFileUri);
       if (!await dillFile.exists()) {
         await writeComponentToFile(component, dillFileUri);
@@ -390,8 +390,9 @@
 
       var dillCompiler =
           new IncrementalCompiler(context.compilerContext, dillFileUri);
-      component =
-          await dillCompiler.computeDelta(entryPoints: [test.entryPoint]);
+      var dillCompilerResult =
+          await dillCompiler.computeDelta(entryPoints: [test.entryPoint!]);
+      component = dillCompilerResult.component;
       component.computeCanonicalNames();
       await dillFile.delete();
 
diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart
index b2c4f52..5fdfef0 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 /// Test of toString on generators.
 
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
@@ -32,7 +30,8 @@
         VariableDeclaration,
         VariableGet,
         VoidType,
-        defaultLanguageVersion;
+        defaultLanguageVersion,
+        dummyLibraryDependency;
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
 
@@ -61,6 +60,8 @@
 import 'package:front_end/src/fasta/source/source_library_builder.dart'
     show ImplicitLanguageVersion, SourceLibraryBuilder;
 
+import '../mock_file_system.dart';
+
 void check(String expected, Object generator) {
   Expect.stringEquals(expected, "$generator");
 }
@@ -88,7 +89,7 @@
         /*packageUri*/ null,
         new ImplicitLanguageVersion(defaultLanguageVersion),
         new KernelTarget(
-                null,
+                const MockFileSystem(),
                 false,
                 new DillTarget(c.options.ticker, uriTranslator,
                     new NoneTarget(new TargetFlags())),
@@ -97,7 +98,7 @@
         null);
     libraryBuilder.markLanguageVersionFinal();
     LoadLibraryBuilder loadLibraryBuilder =
-        new LoadLibraryBuilder(libraryBuilder, null, -1);
+        new LoadLibraryBuilder(libraryBuilder, dummyLibraryDependency, -1);
     Procedure getter = new Procedure(
         new Name("myGetter"), ProcedureKind.Getter, new FunctionNode(null),
         fileUri: uri);
diff --git a/pkg/front_end/test/fasta/incremental_dartino_suite.dart b/pkg/front_end/test/fasta/incremental_dartino_suite.dart
index f3b354e..d6483bb 100644
--- a/pkg/front_end/test/fasta/incremental_dartino_suite.dart
+++ b/pkg/front_end/test/fasta/incremental_dartino_suite.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 library fasta.test.incremental_test;
 
 import "dart:convert" show JsonEncoder;
@@ -73,7 +71,7 @@
 
   ProcessedOptions get options => compilerContext.options;
 
-  MemoryFileSystem get fileSystem => options.fileSystem;
+  MemoryFileSystem get fileSystem => options.fileSystem as MemoryFileSystem;
 
   Future<T> runInContext<T>(Future<T> action(CompilerContext c)) {
     return compilerContext.runInContext<T>(action);
@@ -103,9 +101,9 @@
     Uri uri = description.uri;
     String contents = await new File.fromUri(uri).readAsString();
     Map<String, List<String>> sources = <String, List<String>>{};
-    List<IncrementalExpectation> expectations;
+    List<IncrementalExpectation>? expectations;
     bool firstPatch = true;
-    YamlMap map = loadYamlNode(contents, sourceUrl: uri);
+    YamlMap map = loadYamlNode(contents, sourceUrl: uri) as YamlMap;
     map.forEach((_fileName, _contents) {
       String fileName = _fileName; // Strong mode hurray!
       String contents = _contents; // Strong mode hurray!
@@ -135,7 +133,7 @@
   Future<Result<TestCase>> run(TestCase test, Context context) async {
     for (int edits = 0;; edits++) {
       bool foundSources = false;
-      test.sources.forEach((String name, List<String> sources) {
+      test.sources!.forEach((String name, List<String> sources) {
         if (edits < sources.length) {
           String source = sources[edits];
           Uri uri = base.resolve(name);
@@ -154,10 +152,11 @@
         return edits == 0 ? fail(test, "No sources found") : pass(test);
       }
       var compiler = context.compiler;
-      Component component =
+      var compilerResult =
           await compiler.computeDelta(entryPoints: [entryPoint]);
+      Component component = compilerResult.component;
       List<DiagnosticMessage> errors = context.takeErrors();
-      if (test.expectations[edits].hasCompileTimeError) {
+      if (test.expectations![edits].hasCompileTimeError) {
         if (errors.isEmpty) {
           return fail(test, "Compile-time error expected, but none reported");
         }
@@ -176,9 +175,9 @@
 class TestCase {
   final TestDescription description;
 
-  final Map<String, List<String>> sources;
+  final Map<String, List<String>>? sources;
 
-  final List<IncrementalExpectation> expectations;
+  final List<IncrementalExpectation>? expectations;
 
   TestCase(this.description, this.sources, this.expectations);
 
@@ -192,16 +191,16 @@
     if (sources == null) {
       return step.fail(this, "No sources.");
     }
-    if (expectations == null || expectations.isEmpty) {
+    if (expectations == null || expectations!.isEmpty) {
       return step.fail(this, "No expectations.");
     }
-    for (String name in sources.keys) {
-      List<String> versions = sources[name];
-      if (versions.length != 1 && versions.length != expectations.length) {
+    for (String name in sources!.keys) {
+      List<String> versions = sources![name]!;
+      if (versions.length != 1 && versions.length != expectations!.length) {
         return step.fail(
             this,
             "Found ${versions.length} versions of $name,"
-            " but expected 1 or ${expectations.length}.");
+            " but expected 1 or ${expectations!.length}.");
       }
     }
     return step.pass(this);
diff --git a/pkg/front_end/test/fasta/incremental_expectations.dart b/pkg/front_end/test/fasta/incremental_expectations.dart
index 7e9a45c..1bf173d 100644
--- a/pkg/front_end/test/fasta/incremental_expectations.dart
+++ b/pkg/front_end/test/fasta/incremental_expectations.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 library fasta.test.incremental_expectations;
 
 import "dart:convert" show JsonDecoder, JsonEncoder;
diff --git a/pkg/front_end/test/fasta/incremental_hello_test.dart b/pkg/front_end/test/fasta/incremental_hello_test.dart
index 33d7d3a..125ef12 100644
--- a/pkg/front_end/test/fasta/incremental_hello_test.dart
+++ b/pkg/front_end/test/fasta/incremental_hello_test.dart
@@ -2,14 +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.md file.
 
-// @dart = 2.9
-
 library fasta.test.incremental_dynamic_test;
 
 import 'package:async_helper/async_helper.dart' show asyncTest;
 
 import 'package:expect/expect.dart' show Expect;
 
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
+
 import 'package:kernel/ast.dart' show Component;
 
 import 'package:kernel/target/targets.dart' show TargetFlags;
@@ -34,7 +35,7 @@
   throw "Unexpected message: ${message.plainTextFormatted.join('\n')}";
 }
 
-Future<void> test({bool sdkFromSource}) async {
+Future<void> test({required bool sdkFromSource}) async {
   final CompilerOptions optionBuilder = new CompilerOptions()
     ..packagesFileUri = Uri.base.resolve(".packages")
     ..target = new VmTarget(new TargetFlags())
@@ -60,7 +61,8 @@
   IncrementalCompiler compiler =
       new IncrementalCompiler(new CompilerContext(options));
 
-  Component component = await compiler.computeDelta();
+  IncrementalCompilerResult compilerResult = await compiler.computeDelta();
+  Component component = compilerResult.component;
 
   if (sdkFromSource) {
     // Expect that the new component contains at least the following libraries:
@@ -75,12 +77,14 @@
 
   compiler.invalidate(helloDart);
 
-  component = await compiler.computeDelta(entryPoints: [helloDart]);
+  compilerResult = await compiler.computeDelta(entryPoints: [helloDart]);
+  component = compilerResult.component;
   // Expect that the new component contains exactly hello.dart
   Expect.isTrue(
       component.libraries.length == 1, "${component.libraries.length} != 1");
 
-  component = await compiler.computeDelta(entryPoints: [helloDart]);
+  compilerResult = await compiler.computeDelta(entryPoints: [helloDart]);
+  component = compilerResult.component;
   Expect.isTrue(component.libraries.isEmpty);
 }
 
diff --git a/pkg/front_end/test/fasta/incremental_source_files.dart b/pkg/front_end/test/fasta/incremental_source_files.dart
index 4108b62..274e65b 100644
--- a/pkg/front_end/test/fasta/incremental_source_files.dart
+++ b/pkg/front_end/test/fasta/incremental_source_files.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 library fasta.test.incremental_source_files;
 
 /// Expand a file with diffs in common merge conflict format into a [List] that
@@ -57,10 +55,9 @@
 ///   ["head v1 tail", "head v2 tail"]
 List<String> expandUpdates(List updates) {
   int outputCount = updates.firstWhere((e) => e is Iterable).length;
-  List<StringBuffer> result = new List<StringBuffer>.filled(outputCount, null);
-  for (int i = 0; i < outputCount; i++) {
-    result[i] = new StringBuffer();
-  }
+  List<StringBuffer> result = new List<StringBuffer>.generate(
+      outputCount, (_) => new StringBuffer(),
+      growable: false);
   for (var chunk in updates) {
     if (chunk is Iterable) {
       int segmentCount = 0;
diff --git a/pkg/front_end/test/fasta/link_test.dart b/pkg/front_end/test/fasta/link_test.dart
index d1029eb..7918446 100644
--- a/pkg/front_end/test/fasta/link_test.dart
+++ b/pkg/front_end/test/fasta/link_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:_fe_analyzer_shared/src/util/link.dart' show Link, LinkBuilder;
 
 import 'package:expect/expect.dart' show Expect;
@@ -45,6 +43,6 @@
   Expect.stringEquals("[ B, A ]", "${strings.reverse(const Link<String>())}");
 
   Link<int> ints =
-      const Link<int>().prepend(1).reverse(const Link<int>()).tail.prepend(1);
+      const Link<int>().prepend(1).reverse(const Link<int>()).tail!.prepend(1);
   Expect.stringEquals("[ 1 ]", "${ints}");
 }
diff --git a/pkg/front_end/test/fasta/messages_suite.dart b/pkg/front_end/test/fasta/messages_suite.dart
index 99579c9..df8fbb5 100644
--- a/pkg/front_end/test/fasta/messages_suite.dart
+++ b/pkg/front_end/test/fasta/messages_suite.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import "dart:convert" show utf8;
 
 import 'dart:io' show File, Platform;
@@ -66,23 +64,23 @@
 
   final YamlMap data;
 
-  final Example example;
+  final Example? example;
 
-  final String problem;
+  final String? problem;
 
   MessageTestDescription(this.uri, this.shortName, this.name, this.data,
       this.example, this.problem);
 }
 
 class Configuration {
-  final NnbdMode nnbdMode;
+  final NnbdMode? nnbdMode;
   final Set<InvocationMode> invocationModes;
 
   const Configuration(this.nnbdMode, this.invocationModes);
 
   CompilerOptions apply(CompilerOptions options) {
     if (nnbdMode != null) {
-      options.nnbdMode = nnbdMode;
+      options.nnbdMode = nnbdMode!;
     }
     options.invocationModes = invocationModes;
     return options;
@@ -125,7 +123,7 @@
         [spell.Dictionaries.cfeMessages],
         interactive,
         '"$dartPath" "$suitePath" -DfastOnly=true -Dinteractive=true');
-    return null;
+    return new Future.value();
   }
 
   MessageTestSuite(this.fastOnly, this.interactive)
@@ -151,30 +149,30 @@
     Uri uri = suite.uri.resolve("messages.yaml");
     File file = new File.fromUri(uri);
     String fileContent = file.readAsStringSync();
-    YamlMap messages = loadYamlNode(fileContent, sourceUrl: uri);
+    YamlMap messages = loadYamlNode(fileContent, sourceUrl: uri) as YamlMap;
     for (String name in messages.keys) {
-      YamlNode messageNode = messages.nodes[name];
-      var message = messageNode.value;
+      YamlMap messageNode = messages.nodes[name] as YamlMap;
+      dynamic message = messageNode.value;
       if (message is String) continue;
 
       List<String> unknownKeys = <String>[];
       bool exampleAllowMoreCodes = false;
       List<Example> examples = <Example>[];
-      String externalTest;
+      String? externalTest;
       bool frontendInternal = false;
-      List<String> analyzerCodes;
-      Severity severity;
-      YamlNode badSeverity;
-      YamlNode unnecessarySeverity;
+      List<String>? analyzerCodes;
+      Severity? severity;
+      YamlNode? badSeverity;
+      YamlNode? unnecessarySeverity;
       List<String> badHasPublishedDocsValue = <String>[];
-      List<String> spellingMessages;
+      List<String>? spellingMessages;
       const String spellingPostMessage = "\nIf the word(s) look okay, update "
           "'spell_checking_list_messages.txt' or "
           "'spell_checking_list_common.txt'.";
-      Configuration configuration;
-      Map<ExperimentalFlag, bool> experimentalFlags;
+      Configuration? configuration;
+      Map<ExperimentalFlag, bool>? experimentalFlags;
 
-      Source source;
+      Source? source;
       List<String> formatSpellingMistakes(spell.SpellingResult spellResult,
           int offset, String message, String messageForDenyListed) {
         if (source == null) {
@@ -189,23 +187,23 @@
           source = new Source(lineStarts, bytes, uri, uri);
         }
         List<String> result = <String>[];
-        for (int i = 0; i < spellResult.misspelledWords.length; i++) {
-          Location location = source.getLocation(
-              uri, offset + spellResult.misspelledWordsOffset[i]);
-          bool denylisted = spellResult.misspelledWordsDenylisted[i];
+        for (int i = 0; i < spellResult.misspelledWords!.length; i++) {
+          Location location = source!
+              .getLocation(uri, offset + spellResult.misspelledWordsOffset![i]);
+          bool denylisted = spellResult.misspelledWordsDenylisted![i];
           String messageToUse = message;
           if (denylisted) {
             messageToUse = messageForDenyListed;
-            reportedWordsDenylisted.add(spellResult.misspelledWords[i]);
+            reportedWordsDenylisted.add(spellResult.misspelledWords![i]);
           } else {
-            reportedWords.add(spellResult.misspelledWords[i]);
+            reportedWords.add(spellResult.misspelledWords![i]);
           }
           result.add(command_line_reporting.formatErrorMessage(
-              source.getTextLine(location.line),
+              source!.getTextLine(location.line),
               location,
-              spellResult.misspelledWords[i].length,
+              spellResult.misspelledWords![i].length,
               relativize(uri),
-              "$messageToUse: '${spellResult.misspelledWords[i]}'."));
+              "$messageToUse: '${spellResult.misspelledWords![i]}'."));
         }
         return result;
       }
@@ -280,11 +278,12 @@
             break;
 
           case "bytes":
-            YamlList list = node;
+            YamlList list = node as YamlList;
             if (list.first is List) {
-              for (YamlList bytes in list.nodes) {
+              for (YamlNode bytes in list.nodes) {
                 int i = 0;
-                examples.add(new BytesExample("bytes${++i}", name, bytes));
+                examples.add(
+                    new BytesExample("bytes${++i}", name, bytes as YamlList));
               }
             } else {
               examples.add(new BytesExample("bytes", name, list));
@@ -355,7 +354,7 @@
 
           case "configuration":
             if (value is String) {
-              NnbdMode nnbdMode;
+              NnbdMode? nnbdMode;
               Set<InvocationMode> invocationModes = {};
               for (String part in value.split(',')) {
                 if (part.isEmpty) continue;
@@ -364,7 +363,8 @@
                 } else if (part == "nnbd-strong") {
                   nnbdMode = NnbdMode.Strong;
                 } else {
-                  InvocationMode invocationMode = InvocationMode.fromName(part);
+                  InvocationMode? invocationMode =
+                      InvocationMode.fromName(part);
                   if (invocationMode != null) {
                     invocationModes.add(invocationMode);
                   } else {
@@ -418,7 +418,7 @@
       }
 
       MessageTestDescription createDescription(
-          String subName, Example example, String problem,
+          String subName, Example? example, String? problem,
           {location}) {
         String shortName = "$name/$subName";
         if (problem != null) {
@@ -467,7 +467,7 @@
           badSeverity != null
               ? "Unknown severity: '${badSeverity.value}'."
               : null,
-          location: badSeverity?.span?.start);
+          location: badSeverity?.span.start);
 
       yield createDescription(
           "unnecessarySeverity",
@@ -475,7 +475,7 @@
           unnecessarySeverity != null
               ? "The 'ERROR' severity is the default and not necessary."
               : null,
-          location: unnecessarySeverity?.span?.start);
+          location: unnecessarySeverity?.span.start);
 
       yield createDescription(
           "spelling",
@@ -528,7 +528,7 @@
     var span = example.node.span;
     StringBuffer buffer = new StringBuffer();
     buffer
-      ..write(relativize(span.sourceUrl))
+      ..write(relativize(span.sourceUrl!))
       ..write(":")
       ..write(span.start.line + 1)
       ..write(":")
@@ -537,7 +537,7 @@
       ..write(message);
     buffer.write("\n${span.text}");
     for (DiagnosticMessage message in messages) {
-      buffer.write("\nCode: ${getMessageCodeObject(message).name}");
+      buffer.write("\nCode: ${getMessageCodeObject(message)!.name}");
       buffer.write("\n  > ");
       buffer.write(
           message.plainTextFormatted.join("\n").replaceAll("\n", "\n  > "));
@@ -554,9 +554,9 @@
 
   bool allowMoreCodes = false;
 
-  Configuration configuration;
+  late Configuration configuration;
 
-  Map<ExperimentalFlag, bool> experimentalFlags;
+  Map<ExperimentalFlag, bool>? experimentalFlags;
 
   Example(this.name, this.expectedCode);
 
@@ -677,7 +677,7 @@
       });
       return scriptFiles;
     } else {
-      return {mainFilename: new Script.fromSource(script)};
+      return {mainFilename: new Script.fromSource(script as String)};
     }
   }
 }
@@ -709,7 +709,7 @@
       throw "Framework failure: "
           "Wanted to create wrapper file, but the file already exists!";
     }
-    Script originalMainScript = scriptFiles[example.mainFilename];
+    Script originalMainScript = scriptFiles[example.mainFilename]!;
     String preamble = originalMainScript.preamble;
     scriptFiles[mainFilename] = new Script.fromSource("""
 ${preamble}part "${example.mainFilename}";
@@ -718,7 +718,7 @@
     // Modify the original main file to be part of the wrapper and add lots of
     // gunk so every actual position in the file is not a valid position in the
     // wrapper.
-    String originalMainSource = originalMainScript.sourceWithoutPreamble;
+    String? originalMainSource = originalMainScript.sourceWithoutPreamble;
     String partPrefix = """
 ${preamble}part of "${mainFilename}";
 // La la la la la la la la la la la la la.
@@ -746,14 +746,15 @@
   YamlNode get node => example.node;
 }
 
-class Validate extends Step<MessageTestDescription, Example, MessageTestSuite> {
+class Validate
+    extends Step<MessageTestDescription, Example?, MessageTestSuite> {
   const Validate();
 
   @override
   String get name => "validate";
 
   @override
-  Future<Result<Example>> run(
+  Future<Result<Example?>> run(
       MessageTestDescription description, MessageTestSuite suite) {
     if (description.problem != null) {
       return new Future.value(fail(null, description.problem));
@@ -763,14 +764,14 @@
   }
 }
 
-class Compile extends Step<Example, Null, MessageTestSuite> {
+class Compile extends Step<Example?, Null, MessageTestSuite> {
   const Compile();
 
   @override
   String get name => "compile";
 
   @override
-  Future<Result<Null>> run(Example example, MessageTestSuite suite) async {
+  Future<Result<Null>> run(Example? example, MessageTestSuite suite) async {
     if (example == null) return pass(null);
     String dir = "${example.expectedCode}/${example.name}";
     example.scripts.forEach((String fileName, Script script) {
@@ -812,14 +813,14 @@
     if (example.allowMoreCodes) {
       List<DiagnosticMessage> messagesFiltered = <DiagnosticMessage>[];
       for (DiagnosticMessage message in messages) {
-        if (getMessageCodeObject(message).name == example.expectedCode) {
+        if (getMessageCodeObject(message)!.name == example.expectedCode) {
           messagesFiltered.add(message);
         }
       }
       messages = messagesFiltered;
     }
     for (DiagnosticMessage message in messages) {
-      if (getMessageCodeObject(message).name != example.expectedCode) {
+      if (getMessageCodeObject(message)!.name != example.expectedCode) {
         unexpectedMessages.add(message);
       }
     }
@@ -868,7 +869,7 @@
 class Script {
   final Uint8List bytes;
   final String preamble;
-  final String sourceWithoutPreamble;
+  final String? sourceWithoutPreamble;
 
   Script(this.bytes, this.preamble, this.sourceWithoutPreamble);
 
diff --git a/pkg/front_end/test/fasta/object_supertype_test.dart b/pkg/front_end/test/fasta/object_supertype_test.dart
index b588191..819a3a3 100644
--- a/pkg/front_end/test/fasta/object_supertype_test.dart
+++ b/pkg/front_end/test/fasta/object_supertype_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import "dart:convert" show json;
 
 import "package:_fe_analyzer_shared/src/messages/diagnostic_message.dart"
@@ -77,13 +75,13 @@
 
 Future<void> test() async {
   Set<String> normalErrors = (await outline("class Object {"))
-      .map((DiagnosticMessage message) => getMessageCodeObject(message).name)
+      .map((DiagnosticMessage message) => getMessageCodeObject(message)!.name)
       .toSet();
 
   Future<void> check(String objectHeader, List<Code> expectedCodes) async {
     List<DiagnosticMessage> messages = (await outline(objectHeader))
         .where((DiagnosticMessage message) =>
-            !normalErrors.contains(getMessageCodeObject(message).name))
+            !normalErrors.contains(getMessageCodeObject(message)!.name))
         .toList();
     Expect.setEquals(
         expectedCodes,
diff --git a/pkg/front_end/test/fasta/outline_suite.dart b/pkg/front_end/test/fasta/outline_suite.dart
index cb5f5a9..b8cf207 100644
--- a/pkg/front_end/test/fasta/outline_suite.dart
+++ b/pkg/front_end/test/fasta/outline_suite.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 library fasta.test.outline_test;
 
 import 'testing/suite.dart';
diff --git a/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart b/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart
index c282670..7e5d448 100644
--- a/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:_fe_analyzer_shared/src/parser/parser.dart';
 import 'package:_fe_analyzer_shared/src/parser/async_modifier.dart';
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart';
@@ -540,7 +538,7 @@
   }
 
   void parseEntry(String source, List<String> expectedCalls,
-      {bool inAsync, List<ExpectedError> errors, String expectAfter}) {
+      {bool? inAsync, List<ExpectedError>? errors, String? expectAfter}) {
     final start = scanString(source).tokens;
     final listener = new TestInfoListener();
     final parser = new Parser(listener,
@@ -556,9 +554,9 @@
       throw e;
     }
     if (expectAfter != null) {
-      expect(lastConsumed.next.lexeme, expectAfter);
+      expect(lastConsumed.next!.lexeme, expectAfter);
     } else {
-      expect(lastConsumed.next.isEof, isTrue, reason: lastConsumed.lexeme);
+      expect(lastConsumed.next!.isEof, isTrue, reason: lastConsumed.lexeme);
     }
   }
 }
@@ -838,7 +836,7 @@
   }
 
   void parseEntry(String source, List<String> expectedCalls,
-      {bool inAsync, List<ExpectedError> errors, String expectAfter}) {
+      {bool? inAsync, List<ExpectedError>? errors, String? expectAfter}) {
     final start = scanString(source).tokens;
     final listener = new TestInfoListener();
     final parser = new Parser(listener,
@@ -854,16 +852,16 @@
       throw e;
     }
     if (expectAfter != null) {
-      expect(lastConsumed.next.lexeme, expectAfter);
+      expect(lastConsumed.next!.lexeme, expectAfter);
     } else {
-      expect(lastConsumed.next.isEof, isTrue, reason: lastConsumed.lexeme);
+      expect(lastConsumed.next!.isEof, isTrue, reason: lastConsumed.lexeme);
     }
   }
 }
 
 class TestInfoListener implements Listener {
   List<String> calls = <String>[];
-  List<ExpectedError> errors;
+  List<ExpectedError>? errors;
 
   @override
   void beginBinaryExpression(Token token) {
@@ -876,7 +874,7 @@
   }
 
   @override
-  void beginForControlFlow(Token awaitToken, Token forToken) {
+  void beginForControlFlow(Token? awaitToken, Token forToken) {
     calls.add('beginForControlFlow $awaitToken $forToken');
   }
 
@@ -907,7 +905,7 @@
 
   @override
   void beginVariablesDeclaration(
-      Token token, Token lateToken, Token varFinalOrConst) {
+      Token token, Token? lateToken, Token? varFinalOrConst) {
     // TODO(danrubel): update to include lateToken
     calls.add('beginVariablesDeclaration $token $varFinalOrConst');
   }
@@ -963,7 +961,7 @@
   }
 
   @override
-  void endVariablesDeclaration(int count, Token endToken) {
+  void endVariablesDeclaration(int count, Token? endToken) {
     calls.add('endVariablesDeclaration $count $endToken');
   }
 
@@ -998,7 +996,7 @@
   }
 
   @override
-  void handleForInLoopParts(Token awaitToken, Token forToken,
+  void handleForInLoopParts(Token? awaitToken, Token forToken,
       Token leftParenthesis, Token inKeyword) {
     calls.add('handleForInLoopParts '
         '$awaitToken $forToken $leftParenthesis $inKeyword');
@@ -1028,7 +1026,7 @@
 
   @override
   void handleLiteralList(
-      int count, Token leftBracket, Token constKeyword, Token rightBracket) {
+      int count, Token leftBracket, Token? constKeyword, Token rightBracket) {
     calls.add(
         'handleLiteralList $count, $leftBracket, $constKeyword, $rightBracket');
   }
@@ -1037,7 +1035,7 @@
   void handleLiteralSetOrMap(
     int count,
     Token leftBrace,
-    Token constKeyword,
+    Token? constKeyword,
     Token rightBrace,
     // TODO(danrubel): hasSetEntry parameter exists for replicating existing
     // behavior and will be removed once unified collection has been enabled
@@ -1080,9 +1078,9 @@
   @override
   void handleRecoverableError(
       Message message, Token startToken, Token endToken) {
-    errors ??= <ExpectedError>[];
     int offset = startToken.charOffset;
-    errors.add(error(message.code, offset, endToken.charEnd - offset));
+    (errors ??= <ExpectedError>[])
+        .add(error(message.code, offset, endToken.charEnd - offset));
   }
 
   @override
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 24d01ca..6828c746 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
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:_fe_analyzer_shared/src/parser/token_stream_rewriter.dart';
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
     show ScannerResult, scanString;
@@ -39,7 +37,7 @@
 
     TokenStreamRewriter rewriter = getTokenStreamRewriter();
     Token openParen = rewriter.insertParens(a, false);
-    Token closeParen = openParen.next;
+    Token closeParen = openParen.next!;
 
     expect(openParen.lexeme, '(');
     expect(closeParen.lexeme, ')');
@@ -64,8 +62,8 @@
 
     TokenStreamRewriter rewriter = getTokenStreamRewriter();
     Token openParen = rewriter.insertParens(a, true);
-    Token identifier = openParen.next;
-    Token closeParen = identifier.next;
+    Token identifier = openParen.next!;
+    Token closeParen = identifier.next!;
 
     expect(openParen.lexeme, '(');
     expect(identifier.lexeme, '');
@@ -180,7 +178,7 @@
 
     expect(a.next, same(replacement));
     expect(replacement.next, same(c));
-    expect(c.next.isEof, true);
+    expect(c.next!.isEof, true);
 
     normalTestDone(rewriter, a);
   }
@@ -202,7 +200,7 @@
     expect(replacement.replacedToken, same(b));
 
     expect(a.next, same(replacement));
-    expect(replacement.next.isEof, true);
+    expect(replacement.next!.isEof, true);
 
     normalTestDone(rewriter, a);
   }
@@ -226,11 +224,11 @@
     expect(b.precedingComments, same(replacement.precedingComments));
     expect(replacement.replacedToken, same(b));
     expect(replacement.replacedToken.next, same(c));
-    expect(replacement.replacedToken.next.next, same(d));
+    expect(replacement.replacedToken.next!.next, same(d));
 
     expect(a.next, same(replacement));
     expect(replacement.next, same(e));
-    expect(e.next.isEof, true);
+    expect(e.next!.isEof, true);
 
     normalTestDone(rewriter, a);
   }
@@ -254,7 +252,7 @@
     expect(replacement.replacedToken.next, same(c));
 
     expect(a.next, same(replacement));
-    expect(replacement.next.isEof, true);
+    expect(replacement.next!.isEof, true);
 
     normalTestDone(rewriter, a);
   }
@@ -265,18 +263,18 @@
     Token firstToken = scanResult.tokens;
     setupDone(firstToken);
 
-    Token open = scanResult.tokens.next.next;
+    Token open = scanResult.tokens.next!.next!;
     expect(open.lexeme, '(');
-    Token close = open.endGroup;
+    Token close = open.endGroup!;
     expect(close.isSynthetic, isTrue);
-    expect(close.next.isEof, isTrue);
+    expect(close.next!.isEof, isTrue);
     TokenStreamRewriter rewriter = getTokenStreamRewriter();
 
-    Token result = rewriter.moveSynthetic(open.next, close);
+    Token result = rewriter.moveSynthetic(open.next!, close);
     expect(result, close);
     expect(open.endGroup, close);
-    expect(open.next.next, close);
-    expect(close.next.isEof, isFalse);
+    expect(open.next!.next, close);
+    expect(close.next!.isEof, isFalse);
 
     normalTestDone(rewriter, firstToken);
   }
@@ -340,7 +338,7 @@
   }
 
   StringToken _makeToken(int charOffset, String text) {
-    return new StringToken.fromString(null, text, charOffset);
+    return new StringToken.fromString(TokenType.IDENTIFIER, text, charOffset);
   }
 }
 
@@ -384,34 +382,35 @@
   TokenStreamRewriter getTokenStreamRewriter() =>
       new UndoableTokenStreamRewriter();
 
-  List<CachedTokenSetup> setup;
+  List<CachedTokenSetup>? setup;
 
   @override
   void setupDone(Token first) {
     setup = [];
-    Token token = first;
+    Token? token = first;
     while (token != null && !token.isEof) {
-      setup.add(new CachedTokenSetup(token));
+      setup!.add(new CachedTokenSetup(token));
       token = token.next;
     }
   }
 
   @override
   void normalTestDone(TokenStreamRewriter rewriter, Token first) {
-    UndoableTokenStreamRewriter undoableTokenStreamRewriter = rewriter;
+    UndoableTokenStreamRewriter undoableTokenStreamRewriter =
+        rewriter as UndoableTokenStreamRewriter;
     undoableTokenStreamRewriter.undo();
     List<CachedTokenSetup> now = [];
-    Token token = first;
+    Token? token = first;
     while (token != null && !token.isEof) {
       now.add(new CachedTokenSetup(token));
       token = token.next;
     }
-    if (setup.length != now.length) {
-      throw "Different length: ${setup.length} vs ${now.length}";
+    if (setup!.length != now.length) {
+      throw "Different length: ${setup!.length} vs ${now.length}";
     }
-    for (int i = 0; i < setup.length; i++) {
-      if (setup[i] != now[i]) {
-        throw "Different at $i: ${setup[i]} vs ${now[i]}";
+    for (int i = 0; i < setup!.length; i++) {
+      if (setup![i] != now[i]) {
+        throw "Different at $i: ${setup![i]} vs ${now[i]}";
       }
     }
     setup = null;
@@ -420,9 +419,9 @@
 
 class CachedTokenSetup {
   final Token token;
-  final Token prev;
-  final Token next;
-  final Token precedingComments;
+  final Token? prev;
+  final Token? next;
+  final Token? precedingComments;
 
   CachedTokenSetup(this.token)
       : prev = token.previous,
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 29f59e7..8402482 100644
--- a/pkg/front_end/test/fasta/parser/type_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/type_info_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:_fe_analyzer_shared/src/parser/parser.dart';
 import 'package:_fe_analyzer_shared/src/parser/type_info.dart';
 import 'package:_fe_analyzer_shared/src/parser/type_info_impl.dart';
@@ -298,12 +296,12 @@
 
   void test_prefixedTypeInfo() {
     final Token start = scanString('before C.a ;').tokens;
-    final Token expectedEnd = start.next.next.next;
+    final Token expectedEnd = start.next!.next!.next!;
 
     expect(prefixedType.skipType(start), expectedEnd);
     expect(prefixedType.couldBeExpression, isTrue);
 
-    TypeInfoListener listener;
+    late TypeInfoListener listener;
     void assertResult(Token actualEnd) {
       expect(actualEnd, expectedEnd);
       expect(listener.calls, [
@@ -374,12 +372,12 @@
 
   void test_simpleNullableType() {
     final Token start = scanString('before C? ;').tokens;
-    final Token expectedEnd = start.next.next;
+    final Token expectedEnd = start.next!.next!;
 
     expect(simpleNullableType.skipType(start), expectedEnd);
     expect(simpleNullableType.couldBeExpression, isTrue);
 
-    TypeInfoListener listener;
+    late TypeInfoListener listener;
     void assertResult(Token actualEnd) {
       expect(actualEnd, expectedEnd);
       expect(listener.calls, [
@@ -424,13 +422,13 @@
 
   void test_gt_questionMark() {
     final Token start = scanString('before C<T>? ;').tokens;
-    final Token expectedEnd = start.next.next.next.next.next;
+    final Token expectedEnd = start.next!.next!.next!.next!.next!;
     expect(expectedEnd.lexeme, '?');
 
     expect(simpleNullableTypeWith1Argument.skipType(start), expectedEnd);
     expect(simpleNullableTypeWith1Argument.couldBeExpression, isFalse);
 
-    TypeInfoListener listener;
+    late TypeInfoListener listener;
     void assertResult(Token actualEnd) {
       expect(actualEnd, expectedEnd);
       expect(listener.calls, [
@@ -495,12 +493,12 @@
 
   void test_simpleType() {
     final Token start = scanString('before C ;').tokens;
-    final Token expectedEnd = start.next;
+    final Token expectedEnd = start.next!;
 
     expect(simpleType.skipType(start), expectedEnd);
     expect(simpleType.couldBeExpression, isTrue);
 
-    TypeInfoListener listener;
+    late TypeInfoListener listener;
     void assertResult(Token actualEnd) {
       expect(actualEnd, expectedEnd);
       expect(listener.calls, [
@@ -568,13 +566,13 @@
 
   void test_gt() {
     final Token start = scanString('before C<T> ;').tokens;
-    final Token expectedEnd = start.next.next.next.next;
+    final Token expectedEnd = start.next!.next!.next!.next!;
     expect(expectedEnd.lexeme, '>');
 
     expect(simpleTypeWith1Argument.skipType(start), expectedEnd);
     expect(simpleTypeWith1Argument.couldBeExpression, isFalse);
 
-    TypeInfoListener listener;
+    late TypeInfoListener listener;
     void assertResult(Token actualEnd) {
       expect(actualEnd, expectedEnd);
       expect(listener.calls, [
@@ -608,21 +606,21 @@
 
   void test_gt_eq() {
     final Token start = scanString('before C<T>= ;').tokens;
-    final Token t = start.next.next.next;
-    final Token semicolon = t.next.next;
+    final Token t = start.next!.next!.next!;
+    final Token semicolon = t.next!.next!;
     expect(semicolon.lexeme, ';');
 
     Token skip = simpleTypeWith1ArgumentGtEq.skipType(start);
     expect(skip.lexeme, '>');
-    expect(skip.next.lexeme, '=');
-    expect(skip.next.next, semicolon);
+    expect(skip.next!.lexeme, '=');
+    expect(skip.next!.next, semicolon);
     expect(simpleTypeWith1ArgumentGtEq.couldBeExpression, isFalse);
 
-    TypeInfoListener listener;
+    late TypeInfoListener listener;
     void assertResult(Token actualEnd) {
       expect(actualEnd.lexeme, '>');
-      expect(actualEnd.next.lexeme, '=');
-      expect(actualEnd.next.next, semicolon);
+      expect(actualEnd.next!.lexeme, '=');
+      expect(actualEnd.next!.next, semicolon);
       expect(listener.calls, [
         'handleIdentifier C typeReference',
         'beginTypeArguments <',
@@ -654,20 +652,20 @@
 
   void test_gt_gt() {
     final Token start = scanString('before C<T>> ;').tokens;
-    final Token semicolon = start.next.next.next.next.next;
+    final Token semicolon = start.next!.next!.next!.next!.next!;
     expect(semicolon.lexeme, ';');
 
     Token skip = simpleTypeWith1ArgumentGtGt.skipType(start);
     expect(skip.lexeme, '>');
-    expect(skip.next.lexeme, '>');
-    expect(skip.next.next, semicolon);
+    expect(skip.next!.lexeme, '>');
+    expect(skip.next!.next, semicolon);
     expect(simpleTypeWith1ArgumentGtGt.couldBeExpression, isFalse);
 
-    TypeInfoListener listener;
+    late TypeInfoListener listener;
     void assertResult(Token actualEnd) {
       expect(actualEnd.lexeme, '>');
-      expect(actualEnd.next.lexeme, '>');
-      expect(actualEnd.next.next, semicolon);
+      expect(actualEnd.next!.lexeme, '>');
+      expect(actualEnd.next!.next, semicolon);
       expect(listener.calls, [
         'handleIdentifier C typeReference',
         'beginTypeArguments <',
@@ -1592,7 +1590,7 @@
     expect(simpleTypeArgument1.typeInfo, simpleTypeWith1Argument);
 
     final Token start = scanString('before <T> after').tokens;
-    final Token gt = start.next.next.next;
+    final Token gt = start.next!.next!.next!;
     expect(gt.lexeme, '>');
 
     Token skip = simpleTypeArgument1.skip(start);
@@ -1606,14 +1604,14 @@
     expect(simpleTypeArgument1GtEq.typeInfo, simpleTypeWith1ArgumentGtEq);
 
     final Token start = scanString('before <T>= after').tokens;
-    Token t = start.next.next;
-    expect(t.next.lexeme, '>=');
+    Token t = start.next!.next!;
+    expect(t.next!.lexeme, '>=');
 
     Token skip = simpleTypeArgument1GtEq.skip(start);
     validateTokens(start);
     expect(skip.lexeme, '>');
-    expect(skip.next.lexeme, '=');
-    expect(skip.next.next, t.next.next);
+    expect(skip.next!.lexeme, '=');
+    expect(skip.next!.next, t.next!.next);
   }
 
   void test_basic_gt_gt() {
@@ -1621,17 +1619,17 @@
     expect(simpleTypeArgument1GtGt.typeArgumentCount, 1);
     expect(simpleTypeArgument1GtGt.typeInfo, simpleTypeWith1ArgumentGtGt);
 
-    final Token start = scanString('before <S<T>> after').tokens.next.next;
-    var gtgt = start.next.next.next;
+    final Token start = scanString('before <S<T>> after').tokens.next!.next!;
+    var gtgt = start.next!.next!.next!;
     expect(gtgt.lexeme, '>>');
-    Token after = gtgt.next;
+    Token after = gtgt.next!;
     expect(after.lexeme, 'after');
 
     Token skip = simpleTypeArgument1GtGt.skip(start);
     validateTokens(start);
     expect(skip.lexeme, '>');
-    expect(skip.next.lexeme, '>');
-    expect(skip.next.next, after);
+    expect(skip.next!.lexeme, '>');
+    expect(skip.next!.next, after);
   }
 
   void test_compute_gt() {
@@ -1644,9 +1642,9 @@
 
   void test_compute_gt_gt() {
     String source = '<C<T>>';
-    Token start = scan(source).next.next;
+    Token start = scan(source).next!.next!;
     expect(start.lexeme, 'C');
-    Token gtgt = start.next.next.next;
+    Token gtgt = start.next!.next!.next!;
     expect(gtgt.lexeme, '>>');
 
     expect(computeTypeParamOrArg(start, false), simpleTypeArgument1GtGt);
@@ -1654,9 +1652,9 @@
   }
 
   void testParseArguments(TypeParamOrArgInfo typeArg, String source,
-      [String next]) {
+      [String? next]) {
     final Token start = scanString('before $source after').tokens;
-    final Token after = start.next.next.next.next;
+    final Token after = start.next!.next!.next!.next!;
     expect(after.lexeme, 'after');
     final TypeInfoListener listener = new TypeInfoListener();
 
@@ -1666,10 +1664,10 @@
             useImplicitCreationExpression: useImplicitCreationExpressionInCfe));
     validateTokens(start);
     expect(token.lexeme, '>');
-    token = token.next;
+    token = token.next!;
     if (next != null) {
       expect(token.lexeme, next);
-      token = token.next;
+      token = token.next!;
     }
     expect(token, after);
     expect(listener.calls, [
@@ -1695,9 +1693,9 @@
   }
 
   void testParseVariables(TypeParamOrArgInfo typeParam, String source,
-      [String next]) {
+      [String? next]) {
     final Token start = scanString('before $source after').tokens;
-    final Token after = start.next.next.next.next;
+    final Token after = start.next!.next!.next!.next!;
     expect(after.lexeme, 'after');
     final TypeInfoListener listener = new TypeInfoListener();
 
@@ -1707,10 +1705,10 @@
             useImplicitCreationExpression: useImplicitCreationExpressionInCfe));
     validateTokens(start);
     expect(token.lexeme, '>');
-    token = token.next;
+    token = token.next!;
     if (next != null) {
       expect(token.lexeme, next);
-      token = token.next;
+      token = token.next!;
     }
     expect(token, after);
     expect(listener.calls, [
@@ -2588,7 +2586,7 @@
   }
 }
 
-void expectInfo(expectedInfo, String source, {bool required}) {
+void expectInfo(expectedInfo, String source, {bool? required}) {
   if (required == null) {
     compute(expectedInfo, source, scan(source), true);
     compute(expectedInfo, source, scan(source), false);
@@ -2600,12 +2598,12 @@
 /// Note that if [required] is null it is run both with required [true] and
 /// [false] and expect the same in both situations.
 void expectComplexInfo(String source,
-    {bool required,
+    {bool? required,
     bool inDeclaration = false,
     bool couldBeExpression = false,
-    String expectedAfter,
-    List<String> expectedCalls,
-    List<ExpectedError> expectedErrors}) {
+    String? expectedAfter,
+    List<String>? expectedCalls,
+    List<ExpectedError>? expectedErrors}) {
   if (required == null) {
     computeComplex(source, scan(source), true, inDeclaration, couldBeExpression,
         expectedAfter, expectedCalls, expectedErrors);
@@ -2619,7 +2617,7 @@
 
 void expectNestedInfo(expectedInfo, String source) {
   expect(source.startsWith('<'), isTrue);
-  Token start = scan(source).next;
+  Token start = scan(source).next!;
   compute(expectedInfo, source, start, true);
 }
 
@@ -2643,13 +2641,13 @@
     bool required,
     bool inDeclaration,
     bool couldBeExpression,
-    String expectedAfter,
-    List<String> expectedCalls,
-    List<ExpectedError> expectedErrors) {
+    String? expectedAfter,
+    List<String>? expectedCalls,
+    List<ExpectedError>? expectedErrors) {
   int expectedGtGtAndNullEndCount = countGtGtAndNullEnd(start);
   ComplexTypeInfo typeInfo = compute(
       const TypeMatcher<ComplexTypeInfo>(), source, start, required,
-      inDeclaration: inDeclaration);
+      inDeclaration: inDeclaration) as ComplexTypeInfo;
   expect(typeInfo.start, start.next, reason: source);
   expect(typeInfo.couldBeExpression, couldBeExpression);
   expectEnd(expectedAfter, typeInfo.skipType(start));
@@ -2673,16 +2671,16 @@
 void expectComplexTypeArg(String source,
     {bool inDeclaration = false,
     int typeArgumentCount = -1,
-    String expectedAfter,
-    List<String> expectedCalls,
-    List<ExpectedError> expectedErrors}) {
+    String? expectedAfter,
+    List<String>? expectedCalls,
+    List<ExpectedError>? expectedErrors}) {
   Token start = scan(source);
   int expectedGtGtAndNullEndCount = countGtGtAndNullEnd(start);
   ComplexTypeParamOrArgInfo typeVarInfo = computeVar(
       const TypeMatcher<ComplexTypeParamOrArgInfo>(),
       source,
       start,
-      inDeclaration);
+      inDeclaration) as ComplexTypeParamOrArgInfo;
 
   expect(typeVarInfo.start, start.next, reason: source);
   expectEnd(expectedAfter, typeVarInfo.skip(start));
@@ -2708,16 +2706,16 @@
 void expectComplexTypeParam(String source,
     {bool inDeclaration = false,
     int typeArgumentCount = -1,
-    String expectedAfter,
-    List<String> expectedCalls,
-    List<ExpectedError> expectedErrors}) {
+    String? expectedAfter,
+    List<String>? expectedCalls,
+    List<ExpectedError>? expectedErrors}) {
   Token start = scan(source);
   int expectedGtGtAndNullEndCount = countGtGtAndNullEnd(start);
   ComplexTypeParamOrArgInfo typeVarInfo = computeVar(
       const TypeMatcher<ComplexTypeParamOrArgInfo>(),
       source,
       start,
-      inDeclaration);
+      inDeclaration) as ComplexTypeParamOrArgInfo;
 
   expect(typeVarInfo.start, start.next, reason: source);
   expectEnd(expectedAfter, typeVarInfo.skip(start));
@@ -2743,9 +2741,9 @@
 
 void expectTypeParamOrArg(expectedInfo, String source,
     {bool inDeclaration = false,
-    String expectedAfter,
-    List<String> expectedCalls,
-    List<ExpectedError> expectedErrors}) {
+    String? expectedAfter,
+    List<String>? expectedCalls,
+    List<ExpectedError>? expectedErrors}) {
   Token start = scan(source);
   computeVar(expectedInfo, source, start, inDeclaration);
 }
@@ -2761,21 +2759,21 @@
   return typeVarInfo;
 }
 
-void expectEnd(String tokenAfter, Token end) {
+void expectEnd(String? tokenAfter, Token end) {
   if (tokenAfter == null) {
     expect(end.isEof, isFalse);
-    if (!end.next.isEof) {
+    if (!end.next!.isEof) {
       fail('Expected EOF after $end but found ${end.next}');
     }
   } else {
-    expect(end.next.lexeme, tokenAfter);
+    expect(end.next!.lexeme, tokenAfter);
   }
 }
 
 Token scan(String source) {
   Token start = scanString(source).tokens;
   while (start is ErrorToken) {
-    start = start.next;
+    start = start.next!;
   }
   return new SyntheticToken(TokenType.EOF, -1)..setNext(start);
 }
@@ -2787,18 +2785,18 @@
         optional('>>', token)) {
       ++count;
     }
-    token = token.next;
+    token = token.next!;
   }
   return count;
 }
 
 void validateTokens(Token token) {
   int count = 0;
-  if (token.isEof && !token.next.isEof) {
-    token = token.next;
+  if (token.isEof && !token.next!.isEof) {
+    token = token.next!;
   }
   while (!token.isEof) {
-    Token next = token.next;
+    Token next = token.next!;
     expect(token.charOffset, lessThanOrEqualTo(next.charOffset));
     expect(next.previous, token, reason: next.type.toString());
     if (next is SyntheticToken) {
@@ -2813,12 +2811,12 @@
 class TypeInfoListener implements Listener {
   final bool metadataAllowed;
   List<String> calls = <String>[];
-  List<ExpectedError> errors;
-  Token firstToken;
+  List<ExpectedError>? errors;
+  Token? firstToken;
 
   TypeInfoListener({this.firstToken, this.metadataAllowed: false}) {
-    if (firstToken != null && firstToken.isEof) {
-      firstToken = firstToken.next;
+    if (firstToken != null && firstToken!.isEof) {
+      firstToken = firstToken!.next;
     }
   }
 
@@ -2832,8 +2830,8 @@
   }
 
   @override
-  void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
-      Token covariantToken, Token varFinalOrConst) {
+  void beginFormalParameter(Token token, MemberKind kind, Token? requiredToken,
+      Token? covariantToken, Token? varFinalOrConst) {
     // TODO(danrubel): Update tests to include required and covariant
     calls.add('beginFormalParameter $token $kind');
   }
@@ -2894,24 +2892,25 @@
 
   @override
   void endFormalParameter(
-      Token thisKeyword,
-      Token periodAfterThis,
+      Token? thisKeyword,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
-      Token initializerStart,
-      Token initializerEnd,
+      Token? initializerStart,
+      Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
-    calls.add('endFormalParameter $thisKeyword $periodAfterThis '
+    calls.add('endFormalParameter $thisKeyword $periodAfterThisOrSuper '
         '$nameToken $kind $memberKind');
   }
 
   @override
-  void endFunctionType(Token functionToken, Token questionMark) {
+  void endFunctionType(Token functionToken, Token? questionMark) {
     calls.add('endFunctionType $functionToken $questionMark');
   }
 
   @override
-  void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {
+  void endMetadata(Token beginToken, Token? periodBeforeName, Token endToken) {
     if (metadataAllowed) {
       calls.add('endMetadata $beginToken $periodBeforeName $endToken');
     } else {
@@ -2933,7 +2932,7 @@
 
   @override
   void endTypeVariable(
-      Token token, int index, Token extendsOrSuper, Token variance) {
+      Token token, int index, Token? extendsOrSuper, Token? variance) {
     calls.add('endTypeVariable $token $index $extendsOrSuper $variance');
     assertTokenInStream(token);
     assertTokenInStream(extendsOrSuper);
@@ -2988,9 +2987,9 @@
   @override
   void handleRecoverableError(
       Message message, Token startToken, Token endToken) {
-    errors ??= <ExpectedError>[];
     int offset = startToken.charOffset;
-    errors.add(error(message.code, offset, endToken.charEnd - offset));
+    (errors ??= <ExpectedError>[])
+        .add(error(message.code, offset, endToken.charEnd - offset));
   }
 
   @override
@@ -2999,7 +2998,7 @@
   }
 
   @override
-  void handleType(Token beginToken, Token questionMark) {
+  void handleType(Token beginToken, Token? questionMark) {
     calls.add('handleType $beginToken $questionMark');
   }
 
@@ -3023,20 +3022,20 @@
     throw '${invocation.memberName} should not be called.';
   }
 
-  void assertTokenInStream(Token match) {
+  void assertTokenInStream(Token? match) {
     if (firstToken != null && match != null && !match.isEof) {
-      Token token = firstToken;
+      Token token = firstToken!;
       while (!token.isEof) {
         if (identical(token, match)) {
           return;
         }
-        token = token.next;
+        token = token.next!;
       }
       final msg = new StringBuffer();
       msg.writeln('Expected $match in token stream, but found');
       while (!token.isEof) {
         msg.write(' $token');
-        token = token.next;
+        token = token.next!;
       }
       fail(msg.toString());
     }
diff --git a/pkg/front_end/test/fasta/reexport_test.dart b/pkg/front_end/test/fasta/reexport_test.dart
index 5972e6a..0e46523 100644
--- a/pkg/front_end/test/fasta/reexport_test.dart
+++ b/pkg/front_end/test/fasta/reexport_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import "package:async_helper/async_helper.dart" show asyncTest;
 
 import "package:front_end/src/testing/compiler_common.dart" show compileUnit;
diff --git a/pkg/front_end/test/fasta/scanner/scanner_suite.dart b/pkg/front_end/test/fasta/scanner/scanner_suite.dart
index f9822e8..69ea079 100644
--- a/pkg/front_end/test/fasta/scanner/scanner_suite.dart
+++ b/pkg/front_end/test/fasta/scanner/scanner_suite.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 import 'package:testing/testing.dart' show Chain, ChainContext, Step, runMe;
 
 import '../../utils/scanner_chain.dart' show Read, Scan;
diff --git a/pkg/front_end/test/fasta/sdk_test.dart b/pkg/front_end/test/fasta/sdk_test.dart
index 54caf22..c448d5d 100644
--- a/pkg/front_end/test/fasta/sdk_test.dart
+++ b/pkg/front_end/test/fasta/sdk_test.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 library fasta.test.sdk_test;
 
 import 'testing/suite.dart';
diff --git a/pkg/front_end/test/fasta/strong_suite.dart b/pkg/front_end/test/fasta/strong_suite.dart
index 468ed23..538136d 100644
--- a/pkg/front_end/test/fasta/strong_suite.dart
+++ b/pkg/front_end/test/fasta/strong_suite.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 library fasta.test.strong_test;
 
 import 'testing/suite.dart';
diff --git a/pkg/front_end/test/fasta/super_mixins_test.dart b/pkg/front_end/test/fasta/super_mixins_test.dart
index 8f97ec7..2ef4893 100644
--- a/pkg/front_end/test/fasta/super_mixins_test.dart
+++ b/pkg/front_end/test/fasta/super_mixins_test.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 library fasta.test.incremental_dynamic_test;
 
 import "package:_fe_analyzer_shared/src/messages/diagnostic_message.dart"
@@ -83,7 +81,7 @@
     Expect.equals(Severity.error, message.severity);
     Expect.identical(codeSuperclassHasNoMethod, getMessageCodeObject(message));
     Expect.isTrue(message.plainTextFormatted.length == 1);
-    names.add(getMessageArguments(message)['name']);
+    names.add(getMessageArguments(message)!['name']);
   };
 }
 
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index 0c88143..3bbed42 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -40,6 +40,9 @@
 import 'package:front_end/src/api_prototype/file_system.dart'
     show FileSystem, FileSystemEntity, FileSystemException;
 
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
+
 import 'package:front_end/src/api_prototype/standard_file_system.dart'
     show StandardFileSystem;
 
@@ -82,10 +85,10 @@
 
 import 'package:front_end/src/fasta/kernel/verifier.dart' show verifyComponent;
 
-import 'package:front_end/src/fasta/util/direct_parser_ast.dart'
-    show DirectParserASTContentVisitor, getAST;
+import 'package:front_end/src/fasta/util/parser_ast.dart'
+    show ParserAstVisitor, getAST;
 
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart';
 
 import 'package:kernel/ast.dart'
     show
@@ -223,7 +226,7 @@
 final Expectation runtimeError = ExpectationSet.Default["RuntimeError"];
 
 const String experimentalFlagOptions = '--enable-experiment=';
-const Option<String> overwriteCurrentSdkVersion =
+const Option<String?> overwriteCurrentSdkVersion =
     const Option('--overwrite-current-sdk-version', const StringValue());
 const Option<bool> noVerifyCmd =
     const Option('--no-verify', const BoolValue(false));
@@ -479,7 +482,7 @@
               ParsedOptions.parse(arguments, folderOptionsSpecification);
           List<String> experimentalFlagsArguments =
               Options.enableExperiment.read(parsedOptions) ?? <String>[];
-          String overwriteCurrentSdkVersionArgument =
+          String? overwriteCurrentSdkVersionArgument =
               overwriteCurrentSdkVersion.read(parsedOptions);
           enableUnscheduledExperiments =
               Options.enableUnscheduledExperiments.read(parsedOptions);
@@ -1207,7 +1210,9 @@
     IncrementalCompiler incrementalCompiler =
         new IncrementalCompiler.fromComponent(
             new CompilerContext(compilationSetup.options), platform);
-    final Component component = await incrementalCompiler.computeDelta();
+    IncrementalCompilerResult incrementalCompilerResult =
+        await incrementalCompiler.computeDelta();
+    final Component component = incrementalCompilerResult.component;
     if (!canSerialize(component)) {
       return new Result<ComponentResult>(result, semiFuzzFailure,
           "Couldn't serialize initial component for fuzzing");
@@ -1237,8 +1242,9 @@
     compilationSetup.errors.clear();
     for (Uri importUri in userLibraries) {
       incrementalCompiler.invalidate(importUri);
-      final Component newComponent =
+      final IncrementalCompilerResult newResult =
           await incrementalCompiler.computeDelta(fullComponent: true);
+      final Component newComponent = newResult.component;
       if (!canSerialize(newComponent)) {
         return new Result<ComponentResult>(
             result, semiFuzzFailure, "Couldn't serialize fuzzed component");
@@ -1329,7 +1335,9 @@
     IncrementalCompiler incrementalCompiler =
         new IncrementalCompiler.fromComponent(
             new CompilerContext(compilationSetup.options), platform);
-    Component initialComponent = await incrementalCompiler.computeDelta();
+    IncrementalCompilerResult initialResult =
+        await incrementalCompiler.computeDelta();
+    Component initialComponent = initialResult.component;
     if (!canSerialize(initialComponent)) {
       return new Result<ComponentResult>(result, semiFuzzFailure,
           "Couldn't serialize initial component for fuzzing");
@@ -1343,13 +1351,14 @@
     // Create lookup-table from file uri to whatever.
     Map<Uri, LibraryBuilder> builders = {};
     for (LibraryBuilder builder
-        in incrementalCompiler.userCode!.loader.libraryBuilders) {
+        in incrementalCompiler.kernelTargetForTesting!.loader.libraryBuilders) {
       if (builder.importUri.scheme == "dart" && !builder.isSynthetic) continue;
       builders[builder.fileUri] = builder;
       for (LibraryPart part in builder.library.parts) {
         Uri thisPartUri = builder.importUri.resolve(part.partUri);
         if (thisPartUri.scheme == "package") {
-          thisPartUri = incrementalCompiler.userCode!.uriTranslator
+          thisPartUri = incrementalCompiler
+              .kernelTargetForTesting!.uriTranslator
               .translate(thisPartUri)!;
         }
         builders[thisPartUri] = builder;
@@ -1392,7 +1401,9 @@
         incrementalCompiler = new IncrementalCompiler.fromComponent(
             new CompilerContext(compilationSetup.options), platform);
         try {
-          Component component = await incrementalCompiler.computeDelta();
+          IncrementalCompilerResult incrementalCompilerResult =
+              await incrementalCompiler.computeDelta();
+          Component component = incrementalCompilerResult.component;
           if (!canSerialize(component)) {
             return new Result<ComponentResult>(
                 result, semiFuzzFailure, "Couldn't serialize fuzzed component");
@@ -1465,13 +1476,13 @@
 
 enum FuzzSorterState { nonSortable, importExportSortable, sortableRest }
 
-class FuzzAstVisitorSorter extends DirectParserASTContentVisitor {
+class FuzzAstVisitorSorter extends ParserAstVisitor {
   final Uint8List bytes;
   final String asString;
   final bool nnbd;
 
   FuzzAstVisitorSorter(this.bytes, this.nnbd) : asString = utf8.decode(bytes) {
-    DirectParserASTContentCompilationUnitEnd ast = getAST(bytes,
+    CompilationUnitEnd ast = getAST(bytes,
         includeBody: false,
         includeComments: true,
         enableExtensionMethods: true,
@@ -1580,48 +1591,45 @@
   }
 
   @override
-  void visitExport(DirectParserASTContentExportEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitExport(ExportEnd node, Token startInclusive, Token endInclusive) {
     handleData(
         FuzzSorterState.importExportSortable, startInclusive, endInclusive);
   }
 
   @override
-  void visitImport(DirectParserASTContentImportEnd node, Token startInclusive,
-      Token? endInclusive) {
+  void visitImport(ImportEnd node, Token startInclusive, Token? endInclusive) {
     handleData(
         FuzzSorterState.importExportSortable, startInclusive, endInclusive!);
   }
 
   @override
-  void visitClass(DirectParserASTContentClassDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitClass(
+      ClassDeclarationEnd node, Token startInclusive, Token endInclusive) {
     // TODO(jensj): Possibly sort stuff inside of this too.
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitEnum(DirectParserASTContentEnumEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitEnum(EnumEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitExtension(DirectParserASTContentExtensionDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitExtension(
+      ExtensionDeclarationEnd node, Token startInclusive, Token endInclusive) {
     // TODO(jensj): Possibly sort stuff inside of this too.
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitLibraryName(DirectParserASTContentLibraryNameEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitLibraryName(
+      LibraryNameEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.nonSortable, startInclusive, endInclusive);
   }
 
   @override
-  void visitMetadata(DirectParserASTContentMetadataEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitMetadata(
+      MetadataEnd node, Token startInclusive, Token endInclusive) {
     if (metadataStart == null) {
       metadataStart = startInclusive;
       metadataEndInclusive = endInclusive;
@@ -1631,46 +1639,43 @@
   }
 
   @override
-  void visitMixin(DirectParserASTContentMixinDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitMixin(
+      MixinDeclarationEnd node, Token startInclusive, Token endInclusive) {
     // TODO(jensj): Possibly sort stuff inside of this too.
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitNamedMixin(DirectParserASTContentNamedMixinApplicationEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitNamedMixin(
+      NamedMixinApplicationEnd node, Token startInclusive, Token endInclusive) {
     // TODO(jensj): Possibly sort stuff inside of this too.
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitPart(DirectParserASTContentPartEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitPart(PartEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.nonSortable, startInclusive, endInclusive);
   }
 
   @override
-  void visitPartOf(DirectParserASTContentPartOfEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitPartOf(PartOfEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.nonSortable, startInclusive, endInclusive);
   }
 
   @override
-  void visitTopLevelFields(DirectParserASTContentTopLevelFieldsEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitTopLevelFields(
+      TopLevelFieldsEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitTopLevelMethod(DirectParserASTContentTopLevelMethodEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitTopLevelMethod(
+      TopLevelMethodEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitTypedef(DirectParserASTContentTypedefEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitTypedef(TypedefEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 }
diff --git a/pkg/front_end/test/fasta/text_serialization_suite.dart b/pkg/front_end/test/fasta/text_serialization_suite.dart
index eaeb88a..cddceac 100644
--- a/pkg/front_end/test/fasta/text_serialization_suite.dart
+++ b/pkg/front_end/test/fasta/text_serialization_suite.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 library fasta.test.text_serialization_test;
 
 import 'testing/suite.dart';
diff --git a/pkg/front_end/test/fasta/textual_outline_suite.dart b/pkg/front_end/test/fasta/textual_outline_suite.dart
index 3d2c902..7309219 100644
--- a/pkg/front_end/test/fasta/textual_outline_suite.dart
+++ b/pkg/front_end/test/fasta/textual_outline_suite.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 library fasta.test.textual_outline_test;
 
 import 'dart:io';
@@ -89,7 +87,7 @@
     List<int> bytes = new File.fromUri(description.uri).readAsBytesSync();
     for (bool modelled in [false, true]) {
       // TODO(jensj): NNBD should be configured correctly.
-      String result = textualOutline(
+      String? result = textualOutline(
         bytes,
         const ScannerConfiguration(enableExtensionMethods: true),
         throwOnUnexpected: true,
@@ -118,7 +116,7 @@
       result = sb.toString().trim();
 
       dynamic formatterException;
-      StackTrace formatterExceptionSt;
+      StackTrace? formatterExceptionSt;
       if (!containsUnknownChunk) {
         // Try to format only if it doesn't contain the unknown chunk marker.
         try {
@@ -134,8 +132,9 @@
         filename = ".textual_outline_modelled.expect";
       }
 
-      Result expectMatch = await context.match<TestDescription>(
-          filename, result, description.uri, description);
+      Result<TestDescription> expectMatch =
+          await context.match<TestDescription>(
+              filename, result!, description.uri, description);
       if (expectMatch.outcome != Expectation.Pass) return expectMatch;
 
       if (formatterException != null) {
diff --git a/pkg/front_end/test/fasta/tool_git_test.dart b/pkg/front_end/test/fasta/tool_git_test.dart
index 3755f18..6e4b231 100644
--- a/pkg/front_end/test/fasta/tool_git_test.dart
+++ b/pkg/front_end/test/fasta/tool_git_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 /// Tests the tool `pkg/front_end/tool/fasta`.
 
 import "dart:io";
diff --git a/pkg/front_end/test/fasta/type_inference/factor_type_test.dart b/pkg/front_end/test/fasta/type_inference/factor_type_test.dart
index a365e93..a743918 100644
--- a/pkg/front_end/test/fasta/type_inference/factor_type_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/factor_type_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:_fe_analyzer_shared/src/flow_analysis/factory_type_test_helper.dart';
 import 'package:expect/expect.dart';
 import 'package:front_end/src/api_prototype/compiler_options.dart';
@@ -106,8 +104,10 @@
   CompilerOptions options = new CompilerOptions()
     ..explicitExperimentalFlags[ExperimentalFlag.nonNullable] = true;
   InternalCompilerResult result = await compileScript('',
-      options: options, requireMain: false, retainDataForTesting: true);
+      options: options,
+      requireMain: false,
+      retainDataForTesting: true) as InternalCompilerResult;
   new FactorTypeTest(
-          new TypeEnvironment(result.coreTypes, result.classHierarchy))
+          new TypeEnvironment(result.coreTypes!, result.classHierarchy!))
       .run();
 }
diff --git a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_nnbd_test.dart b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_nnbd_test.dart
index 7bf3df7..f037ae5 100644
--- a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_nnbd_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_nnbd_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:front_end/src/fasta/type_inference/type_constraint_gatherer.dart';
 import 'package:front_end/src/fasta/type_inference/type_schema.dart';
 import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
@@ -22,15 +20,15 @@
 
 @reflectiveTest
 class TypeConstraintGathererTest {
-  Env env;
+  late Env env;
 
   final Map<String, DartType Function()> additionalTypes = {
     'UNKNOWN': () => new UnknownType()
   };
 
-  Library _coreLibrary;
+  late Library _coreLibrary;
 
-  Library _testLibrary;
+  late Library _testLibrary;
 
   TypeConstraintGathererTest();
 
@@ -308,7 +306,7 @@
   }
 
   void checkConstraintsLower(String type, String bound, List<String> expected,
-      {String typeParameters, String typeParametersToConstrain}) {
+      {String? typeParameters, String? typeParametersToConstrain}) {
     env.withTypeParameters(typeParameters ?? '',
         (List<TypeParameter> typeParameterNodes) {
       List<TypeParameter> typeParameterNodesToConstrain;
@@ -345,8 +343,8 @@
         typeParameterNodesToConstrain);
   }
 
-  void checkConstraintsUpper(String type, String bound, List<String> expected,
-      {String typeParameters, String typeParametersToConstrain}) {
+  void checkConstraintsUpper(String type, String bound, List<String>? expected,
+      {String? typeParameters, String? typeParametersToConstrain}) {
     env.withTypeParameters(typeParameters ?? '',
         (List<TypeParameter> typeParameterNodes) {
       List<TypeParameter> typeParameterNodesToConstrain;
@@ -372,7 +370,7 @@
       DartType type,
       DartType bound,
       Library clientLibrary,
-      List<String> expectedConstraints,
+      List<String>? expectedConstraints,
       List<TypeParameter> typeParameterNodesToConstrain) {
     _checkConstraintsHelper(
         type,
@@ -387,7 +385,7 @@
       DartType a,
       DartType b,
       Library clientLibrary,
-      List<String> expectedConstraints,
+      List<String>? expectedConstraints,
       bool Function(TypeConstraintGatherer, DartType, DartType) tryConstrain,
       List<TypeParameter> typeParameterNodesToConstrain) {
     var typeSchemaEnvironment = new TypeSchemaEnvironment(
@@ -403,7 +401,7 @@
     }
     expect(constraints, isNotNull);
     var constraintStrings = <String>[];
-    constraints.forEach((t, constraint) {
+    constraints!.forEach((t, constraint) {
       if (constraint.lower is! UnknownType ||
           constraint.upper is! UnknownType) {
         var s = t.name;
@@ -413,7 +411,7 @@
         if (constraint.upper is! UnknownType) {
           s = '$s <: ${typeSchemaToString(constraint.upper)}';
         }
-        constraintStrings.add(s);
+        constraintStrings.add(s as String);
       }
     });
     expect(constraintStrings, unorderedEquals(expectedConstraints));
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 16df20d..e42fc10 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
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:front_end/src/fasta/type_inference/type_constraint_gatherer.dart';
 import 'package:front_end/src/fasta/type_inference/type_schema.dart';
 import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
@@ -22,15 +20,15 @@
 
 @reflectiveTest
 class TypeConstraintGathererTest {
-  Env env;
+  late Env env;
 
   final Map<String, DartType Function()> additionalTypes = {
     'UNKNOWN': () => UnknownType()
   };
 
-  Library _coreLibrary;
+  late Library _coreLibrary;
 
-  Library _testLibrary;
+  late Library _testLibrary;
 
   TypeConstraintGathererTest();
 
@@ -215,8 +213,8 @@
         typeParameters: 'T1 extends Object*');
   }
 
-  void checkConstraintsLower(String type, String bound, List<String> expected,
-      {String typeParameters, String typeParametersToConstrain}) {
+  void checkConstraintsLower(String type, String bound, List<String>? expected,
+      {String? typeParameters, String? typeParametersToConstrain}) {
     env.withTypeParameters(typeParameters ?? '',
         (List<TypeParameter> typeParameterNodes) {
       List<TypeParameter> typeParameterNodesToConstrain;
@@ -242,7 +240,7 @@
       DartType type,
       DartType bound,
       Library clientLibrary,
-      List<String> expectedConstraints,
+      List<String>? expectedConstraints,
       List<TypeParameter> typeParameterNodesToConstrain) {
     _checkConstraintsHelper(
         type,
@@ -253,8 +251,8 @@
         typeParameterNodesToConstrain);
   }
 
-  void checkConstraintsUpper(String type, String bound, List<String> expected,
-      {String typeParameters, String typeParametersToConstrain}) {
+  void checkConstraintsUpper(String type, String bound, List<String>? expected,
+      {String? typeParameters, String? typeParametersToConstrain}) {
     env.withTypeParameters(typeParameters ?? '',
         (List<TypeParameter> typeParameterNodes) {
       List<TypeParameter> typeParameterNodesToConstrain;
@@ -280,7 +278,7 @@
       DartType type,
       DartType bound,
       Library clientLibrary,
-      List<String> expectedConstraints,
+      List<String>? expectedConstraints,
       List<TypeParameter> typeParameterNodesToConstrain) {
     _checkConstraintsHelper(
         type,
@@ -295,7 +293,7 @@
       DartType a,
       DartType b,
       Library clientLibrary,
-      List<String> expectedConstraints,
+      List<String>? expectedConstraints,
       bool Function(TypeConstraintGatherer, DartType, DartType) tryConstrain,
       List<TypeParameter> typeParameterNodesToConstrain) {
     var typeSchemaEnvironment = new TypeSchemaEnvironment(
@@ -311,7 +309,7 @@
     }
     expect(constraints, isNotNull);
     var constraintStrings = <String>[];
-    constraints.forEach((t, constraint) {
+    constraints!.forEach((t, constraint) {
       if (constraint.lower is! UnknownType ||
           constraint.upper is! UnknownType) {
         var s = t.name;
@@ -321,7 +319,7 @@
         if (constraint.upper is! UnknownType) {
           s = '$s <: ${typeSchemaToString(constraint.upper)}';
         }
-        constraintStrings.add(s);
+        constraintStrings.add(s as String);
       }
     });
     expect(constraintStrings, unorderedEquals(expectedConstraints));
diff --git a/pkg/front_end/test/fasta/type_inference/type_inference_engine_test.dart b/pkg/front_end/test/fasta/type_inference/type_inference_engine_test.dart
index 0588e94..0221278 100644
--- a/pkg/front_end/test/fasta/type_inference/type_inference_engine_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_inference_engine_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart';
 import 'package:kernel/ast.dart';
 import 'package:test/test.dart';
@@ -226,7 +224,7 @@
         isFalse);
   }
 
-  TypeParameterType tpt(TypeParameter param, {int variance = null}) {
+  TypeParameterType tpt(TypeParameter param, {int? variance = null}) {
     return new TypeParameterType(param, Nullability.legacy)
       ..parameter.variance = variance;
   }
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_nnbd_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_nnbd_test.dart
index dc5b7cb..7abe586 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_nnbd_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_nnbd_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:front_end/src/fasta/type_inference/type_schema.dart';
 import 'package:front_end/src/fasta/type_inference/type_schema_elimination.dart'
     as typeSchemaElimination;
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart
index 36f0c1a..49f3b77 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:front_end/src/fasta/type_inference/type_schema.dart';
 import 'package:front_end/src/fasta/type_inference/type_schema_elimination.dart'
     as typeSchemaElimination;
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart
index 20d575a..182d44b 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:front_end/src/fasta/type_inference/type_schema.dart';
 import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
 import 'package:kernel/ast.dart';
@@ -21,15 +19,15 @@
 
 @reflectiveTest
 class TypeSchemaEnvironmentTest {
-  Env typeParserEnvironment;
-  TypeSchemaEnvironment typeSchemaEnvironment;
+  late Env typeParserEnvironment;
+  late TypeSchemaEnvironment typeSchemaEnvironment;
 
   final Map<String, DartType Function()> additionalTypes = {
     "UNKNOWN": () => new UnknownType(),
   };
 
-  Library _coreLibrary;
-  Library _testLibrary;
+  late Library _coreLibrary;
+  late Library _testLibrary;
 
   Library get coreLibrary => _coreLibrary;
   Library get testLibrary => _testLibrary;
@@ -111,7 +109,7 @@
   /// There's an infinite amount of such types, and the list contains some
   /// practical base cases.  For the definition of TOP see the following:
   /// https://github.com/dart-lang/language/blob/master/resources/type-system/upper-lower-bounds.md#helper-predicates
-  static const Map<String, String> topPredicateEnumeration = <String, String>{
+  static const Map<String, String?> topPredicateEnumeration = {
     // dynamic and void.
     "dynamic": null,
     "void": null,
@@ -210,7 +208,7 @@
   /// There's an infinite amount of such types, and the list contains some
   /// practical base cases.  For the definition of OBJECT see the following:
   /// https://github.com/dart-lang/language/blob/master/resources/type-system/upper-lower-bounds.md#helper-predicates
-  static const Map<String, String> objectPredicateEnumeration = {
+  static const Map<String, String?> objectPredicateEnumeration = {
     "Object": null,
     "FutureOr<Object>": null,
     "FutureOr<FutureOr<Object>>": null,
@@ -224,7 +222,7 @@
   ///
   /// The names of the variables here and in [nullPredicateEnumeration] should
   /// be distinct to avoid collisions.
-  static const Map<String, String> bottomPredicateEnumeration = {
+  static const Map<String, String?> bottomPredicateEnumeration = {
     "Never": null,
     "Xb & Never": "Xb extends Object?",
     "Yb & Zb & Never": "Yb extends Object?, Zb extends Object?",
@@ -241,7 +239,7 @@
   ///
   /// The names of the variables here and in [bottomPredicateEnumeration] should
   /// be distinct to avoid collisions.
-  static const Map<String, String> nullPredicateEnumeration = {
+  static const Map<String, String?> nullPredicateEnumeration = {
     // T? where BOTTOM(T).
     "Never?": null,
     "Xn?": "Xn extends Never",
@@ -256,8 +254,8 @@
     "Null": null,
   };
 
-  static String joinTypeParameters(
-      String typeParameters1, String typeParameters2) {
+  static String? joinTypeParameters(
+      String? typeParameters1, String? typeParameters2) {
     if (typeParameters1 == null) return typeParameters2;
     if (typeParameters2 == null) return typeParameters1;
     if (typeParameters1 == typeParameters2) return typeParameters1;
@@ -277,7 +275,7 @@
     //   T2 otherwise
     for (String t1 in bottomPredicateEnumeration.keys) {
       for (String t2 in bottomPredicateEnumeration.keys) {
-        String typeParameters = joinTypeParameters(
+        String? typeParameters = joinTypeParameters(
             bottomPredicateEnumeration[t1], bottomPredicateEnumeration[t2]);
         typeParserEnvironment.withTypeParameters(typeParameters, (_) {
           String expected =
@@ -320,7 +318,7 @@
     //   T2 otherwise
     for (String t1 in nullPredicateEnumeration.keys) {
       for (String t2 in nullPredicateEnumeration.keys) {
-        String typeParameters = joinTypeParameters(
+        String? typeParameters = joinTypeParameters(
             nullPredicateEnumeration[t1], nullPredicateEnumeration[t2]);
         typeParserEnvironment.withTypeParameters(typeParameters, (_) {
           String expected =
@@ -600,7 +598,7 @@
     //   T2 otherwise
     for (String t1 in topPredicateEnumeration.keys) {
       for (String t2 in topPredicateEnumeration.keys) {
-        String typeParameters = joinTypeParameters(
+        String? typeParameters = joinTypeParameters(
             topPredicateEnumeration[t1], topPredicateEnumeration[t2]);
         typeParserEnvironment.withTypeParameters(typeParameters, (_) {
           String expected =
@@ -1100,7 +1098,7 @@
     //   T2 otherwise
     for (String t1 in topPredicateEnumeration.keys) {
       for (String t2 in topPredicateEnumeration.keys) {
-        String typeParameters = joinTypeParameters(
+        String? typeParameters = joinTypeParameters(
             topPredicateEnumeration[t1], topPredicateEnumeration[t2]);
         typeParserEnvironment.withTypeParameters(typeParameters, (_) {
           String expected =
@@ -1143,7 +1141,7 @@
     //   T2 otherwise
     for (String t1 in objectPredicateEnumeration.keys) {
       for (String t2 in objectPredicateEnumeration.keys) {
-        String typeParameters = joinTypeParameters(
+        String? typeParameters = joinTypeParameters(
             objectPredicateEnumeration[t1], objectPredicateEnumeration[t2]);
         typeParserEnvironment.withTypeParameters(typeParameters, (_) {
           String expected =
@@ -1194,7 +1192,7 @@
     //   T1 otherwise
     for (String t1 in bottomPredicateEnumeration.keys) {
       for (String t2 in bottomPredicateEnumeration.keys) {
-        String typeParameters = joinTypeParameters(
+        String? typeParameters = joinTypeParameters(
             bottomPredicateEnumeration[t1], bottomPredicateEnumeration[t2]);
         typeParserEnvironment.withTypeParameters(typeParameters, (_) {
           String expected =
@@ -1237,7 +1235,7 @@
     //   T1 otherwise
     for (String t1 in nullPredicateEnumeration.keys) {
       for (String t2 in nullPredicateEnumeration.keys) {
-        String typeParameters = joinTypeParameters(
+        String? typeParameters = joinTypeParameters(
             nullPredicateEnumeration[t1], nullPredicateEnumeration[t2]);
         typeParserEnvironment.withTypeParameters(typeParameters, (_) {
           String expected =
@@ -1505,8 +1503,7 @@
   }
 
   void checkConstraintSolving(String constraint, String expected,
-      {bool grounded}) {
-    assert(grounded != null);
+      {required bool grounded}) {
     expect(
         typeSchemaEnvironment.solveTypeConstraint(
             parseConstraint(constraint),
@@ -1516,17 +1513,13 @@
         parseType(expected));
   }
 
-  void checkConstraintUpperBound({String constraint, String bound}) {
-    assert(constraint != null);
-    assert(bound != null);
-
+  void checkConstraintUpperBound(
+      {required String constraint, required String bound}) {
     expect(parseConstraint(constraint).upper, parseType(bound));
   }
 
-  void checkConstraintLowerBound({String constraint, String bound}) {
-    assert(constraint != null);
-    assert(bound != null);
-
+  void checkConstraintLowerBound(
+      {required String constraint, required String bound}) {
     expect(parseConstraint(constraint).lower, parseType(bound));
   }
 
@@ -1572,16 +1565,12 @@
   }
 
   void checkUpperBound(
-      {String type1,
-      String type2,
-      String upperBound,
-      String typeParameters,
+      {required String type1,
+      required String type2,
+      required String upperBound,
+      String? typeParameters,
       bool nonNull1: false,
       bool nonNull2: false}) {
-    assert(type1 != null);
-    assert(type2 != null);
-    assert(upperBound != null);
-
     typeParserEnvironment.withTypeParameters(typeParameters,
         (List<TypeParameter> typeParameterNodes) {
       DartType dartType1 = parseType(type1);
@@ -1600,11 +1589,10 @@
   }
 
   void checkLowerBound(
-      {String type1, String type2, String lowerBound, String typeParameters}) {
-    assert(type1 != null);
-    assert(type2 != null);
-    assert(lowerBound != null);
-
+      {required String type1,
+      required String type2,
+      required String lowerBound,
+      String? typeParameters}) {
     typeParserEnvironment.withTypeParameters(typeParameters,
         (List<TypeParameter> typeParameterNodes) {
       expect(
@@ -1615,28 +1603,23 @@
   }
 
   void checkInference(
-      {String typeParametersToInfer,
-      String functionType,
-      String actualParameterTypes,
-      String returnContextType,
-      String inferredTypesFromDownwardPhase,
-      String expectedTypes}) {
-    assert(typeParametersToInfer != null);
-    assert(functionType != null);
-    assert(expectedTypes != null);
-
+      {required String typeParametersToInfer,
+      required String functionType,
+      String? actualParameterTypes,
+      String? returnContextType,
+      String? inferredTypesFromDownwardPhase,
+      required String expectedTypes}) {
     typeParserEnvironment.withTypeParameters(typeParametersToInfer,
         (List<TypeParameter> typeParameterNodesToInfer) {
-      FunctionType functionTypeNode = parseType(functionType);
-      DartType returnContextTypeNode =
+      FunctionType functionTypeNode = parseType(functionType) as FunctionType;
+      DartType? returnContextTypeNode =
           returnContextType == null ? null : parseType(returnContextType);
-      List<DartType> actualTypeNodes = actualParameterTypes == null
+      List<DartType>? actualTypeNodes = actualParameterTypes == null
           ? null
           : parseTypes(actualParameterTypes);
-      List<DartType> expectedTypeNodes =
-          expectedTypes == null ? null : parseTypes(expectedTypes);
+      List<DartType> expectedTypeNodes = parseTypes(expectedTypes);
       DartType declaredReturnTypeNode = functionTypeNode.returnType;
-      List<DartType> formalTypeNodes = actualParameterTypes == null
+      List<DartType>? formalTypeNodes = actualParameterTypes == null
           ? null
           : functionTypeNode.positionalParameters;
 
@@ -1668,14 +1651,11 @@
   }
 
   void checkInferenceFromConstraints(
-      {String typeParameter,
-      String constraints,
-      String inferredTypeFromDownwardPhase,
-      bool downwardsInferPhase,
-      String expected}) {
-    assert(typeParameter != null);
-    assert(expected != null);
-    assert(downwardsInferPhase != null);
+      {required String typeParameter,
+      required String constraints,
+      String? inferredTypeFromDownwardPhase,
+      required bool downwardsInferPhase,
+      required String expected}) {
     assert(inferredTypeFromDownwardPhase == null || !downwardsInferPhase);
 
     typeParserEnvironment.withTypeParameters(typeParameter,
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 6945778..526e061 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
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:front_end/src/fasta/type_inference/type_schema.dart';
 import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
 import 'package:kernel/ast.dart';
@@ -21,15 +19,15 @@
 
 @reflectiveTest
 class TypeSchemaEnvironmentTest {
-  Env typeParserEnvironment;
-  TypeSchemaEnvironment typeSchemaEnvironment;
+  late Env typeParserEnvironment;
+  late TypeSchemaEnvironment typeSchemaEnvironment;
 
   final Map<String, DartType Function()> additionalTypes = {
     "UNKNOWN": () => new UnknownType(),
   };
 
-  Library _coreLibrary;
-  Library _testLibrary;
+  late Library _coreLibrary;
+  late Library _testLibrary;
 
   Library get coreLibrary => _coreLibrary;
   Library get testLibrary => _testLibrary;
@@ -587,8 +585,7 @@
   }
 
   void checkConstraintSolving(String constraint, String expected,
-      {bool grounded}) {
-    assert(grounded != null);
+      {required bool grounded}) {
     expect(
         typeSchemaEnvironment.solveTypeConstraint(
             parseConstraint(constraint), new DynamicType(), new NullType(),
@@ -596,17 +593,13 @@
         parseType(expected));
   }
 
-  void checkConstraintUpperBound({String constraint, String bound}) {
-    assert(constraint != null);
-    assert(bound != null);
-
+  void checkConstraintUpperBound(
+      {required String constraint, required String bound}) {
     expect(parseConstraint(constraint).upper, parseType(bound));
   }
 
-  void checkConstraintLowerBound({String constraint, String bound}) {
-    assert(constraint != null);
-    assert(bound != null);
-
+  void checkConstraintLowerBound(
+      {required String constraint, required String bound}) {
     expect(parseConstraint(constraint).lower, parseType(bound));
   }
 
@@ -652,11 +645,10 @@
   }
 
   void checkUpperBound(
-      {String type1, String type2, String upperBound, String typeParameters}) {
-    assert(type1 != null);
-    assert(type2 != null);
-    assert(upperBound != null);
-
+      {required String type1,
+      required String type2,
+      required String upperBound,
+      String? typeParameters}) {
     typeParserEnvironment.withTypeParameters(typeParameters,
         (List<TypeParameter> typeParameterNodes) {
       expect(
@@ -667,11 +659,10 @@
   }
 
   void checkLowerBound(
-      {String type1, String type2, String lowerBound, String typeParameters}) {
-    assert(type1 != null);
-    assert(type2 != null);
-    assert(lowerBound != null);
-
+      {required String type1,
+      required String type2,
+      required String lowerBound,
+      String? typeParameters}) {
     typeParserEnvironment.withTypeParameters(typeParameters,
         (List<TypeParameter> typeParameterNodes) {
       expect(
@@ -682,28 +673,23 @@
   }
 
   void checkInference(
-      {String typeParametersToInfer,
-      String functionType,
-      String actualParameterTypes,
-      String returnContextType,
-      String inferredTypesFromDownwardPhase,
-      String expectedTypes}) {
-    assert(typeParametersToInfer != null);
-    assert(functionType != null);
-    assert(expectedTypes != null);
-
+      {required String typeParametersToInfer,
+      required String functionType,
+      String? actualParameterTypes,
+      String? returnContextType,
+      String? inferredTypesFromDownwardPhase,
+      required String expectedTypes}) {
     typeParserEnvironment.withTypeParameters(typeParametersToInfer,
         (List<TypeParameter> typeParameterNodesToInfer) {
-      FunctionType functionTypeNode = parseType(functionType);
-      DartType returnContextTypeNode =
+      FunctionType functionTypeNode = parseType(functionType) as FunctionType;
+      DartType? returnContextTypeNode =
           returnContextType == null ? null : parseType(returnContextType);
-      List<DartType> actualTypeNodes = actualParameterTypes == null
+      List<DartType>? actualTypeNodes = actualParameterTypes == null
           ? null
           : parseTypes(actualParameterTypes);
-      List<DartType> expectedTypeNodes =
-          expectedTypes == null ? null : parseTypes(expectedTypes);
+      List<DartType> expectedTypeNodes = parseTypes(expectedTypes);
       DartType declaredReturnTypeNode = functionTypeNode.returnType;
-      List<DartType> formalTypeNodes = actualParameterTypes == null
+      List<DartType>? formalTypeNodes = actualParameterTypes == null
           ? null
           : functionTypeNode.positionalParameters;
 
@@ -735,14 +721,11 @@
   }
 
   void checkInferenceFromConstraints(
-      {String typeParameter,
-      String constraints,
-      String inferredTypeFromDownwardPhase,
-      bool downwardsInferPhase,
-      String expected}) {
-    assert(typeParameter != null);
-    assert(expected != null);
-    assert(downwardsInferPhase != null);
+      {required String typeParameter,
+      required String constraints,
+      String? inferredTypeFromDownwardPhase,
+      required bool downwardsInferPhase,
+      required String expected}) {
     assert(inferredTypeFromDownwardPhase == null || !downwardsInferPhase);
 
     typeParserEnvironment.withTypeParameters(typeParameter,
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_test.dart
index eff2502..eb34789 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:front_end/src/fasta/type_inference/type_schema.dart';
 import 'package:kernel/ast.dart';
 import 'package:test/test.dart';
@@ -112,38 +110,38 @@
   }
 }
 
-class _OrdinaryVisitor<R> extends Visitor<R> with VisitorNullMixin<R> {
-  final _UnaryFunction<DartType, R> _defaultDartType;
+class _OrdinaryVisitor<R> extends Visitor<R?> with VisitorNullMixin<R> {
+  final _UnaryFunction<DartType, R>? _defaultDartType;
 
-  _OrdinaryVisitor({_UnaryFunction<DartType, R> defaultDartType})
+  _OrdinaryVisitor({_UnaryFunction<DartType, R>? defaultDartType})
       : _defaultDartType = defaultDartType;
 
   @override
-  R defaultDartType(DartType node) {
+  R? defaultDartType(DartType node) {
     if (_defaultDartType != null) {
-      return _defaultDartType(node);
+      return _defaultDartType!(node);
     } else {
       return super.defaultDartType(node);
     }
   }
 }
 
-class _TypeSchemaVisitor<R> extends Visitor<R> with VisitorNullMixin<R> {
-  final _UnaryFunction<DartType, R> _defaultDartType;
-  final _UnaryFunction<UnknownType, R> _visitUnknownType;
+class _TypeSchemaVisitor<R> extends Visitor<R?> with VisitorNullMixin<R> {
+  final _UnaryFunction<DartType, R>? _defaultDartType;
+  final _UnaryFunction<UnknownType, R>? _visitUnknownType;
 
   _TypeSchemaVisitor(
-      {_UnaryFunction<DartType, R> defaultDartType,
-      _UnaryFunction<UnknownType, R> visitUnknownType})
+      {_UnaryFunction<DartType, R>? defaultDartType,
+      _UnaryFunction<UnknownType, R>? visitUnknownType})
       : _defaultDartType = defaultDartType,
         _visitUnknownType = visitUnknownType;
 
   @override
-  R defaultDartType(DartType node) {
+  R? defaultDartType(DartType node) {
     if (node is UnknownType && _visitUnknownType != null) {
-      return _visitUnknownType(node);
+      return _visitUnknownType!(node);
     } else if (_defaultDartType != null) {
-      return _defaultDartType(node);
+      return _defaultDartType!(node);
     } else {
       return super.defaultDartType(node);
     }
diff --git a/pkg/front_end/test/fasta/types/dart2js_benchmark.dart b/pkg/front_end/test/fasta/types/dart2js_benchmark.dart
index b302938..c55dc33 100644
--- a/pkg/front_end/test/fasta/types/dart2js_benchmark.dart
+++ b/pkg/front_end/test/fasta/types/dart2js_benchmark.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import "dart:io" show Platform;
 
 import "subtypes_benchmark.dart" show run;
diff --git a/pkg/front_end/test/fasta/types/dart2js_benchmark_test.dart b/pkg/front_end/test/fasta/types/dart2js_benchmark_test.dart
index 590937d..340ae12 100644
--- a/pkg/front_end/test/fasta/types/dart2js_benchmark_test.dart
+++ b/pkg/front_end/test/fasta/types/dart2js_benchmark_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import "dart2js_benchmark.dart" as bench show main;
 
 void main() => bench.main();
diff --git a/pkg/front_end/test/fasta/types/dill_hierachy_test.dart b/pkg/front_end/test/fasta/types/dill_hierachy_test.dart
index e37a8c3..cf2e491 100644
--- a/pkg/front_end/test/fasta/types/dill_hierachy_test.dart
+++ b/pkg/front_end/test/fasta/types/dill_hierachy_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import "package:async_helper/async_helper.dart" show asyncTest;
 
 import "package:expect/expect.dart" show Expect;
@@ -123,9 +121,9 @@
             new NoneTarget(new TargetFlags()));
         final DillLoader loader = target.loader;
         loader.appendLibraries(component);
-        await target.buildOutlines();
-        ClassBuilder objectClass =
-            loader.coreLibrary.lookupLocalMember("Object", required: true);
+        target.buildOutlines();
+        ClassBuilder objectClass = loader.coreLibrary
+            .lookupLocalMember("Object", required: true) as ClassBuilder;
         ClassHierarchyBuilder hierarchy = new ClassHierarchyBuilder(
             objectClass, loader, new CoreTypes(component));
         Library library = component.libraries.last;
diff --git a/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart b/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
index 33af5ac..cc4493a 100644
--- a/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
+++ b/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
@@ -2,9 +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.
 
-// @dart = 2.9
-
-import "package:kernel/ast.dart" show DartType, Library;
+import "package:kernel/ast.dart" show DartType, InterfaceType, Library;
 
 import "package:kernel/target/targets.dart" show NoneTarget, TargetFlags;
 
@@ -33,7 +31,7 @@
   final Ticker ticker;
   final CompilerContext context;
 
-  ClassHierarchyBuilder hierarchy;
+  late ClassHierarchyBuilder hierarchy;
 
   FastaLegacyUpperBoundTest(this.ticker, this.context);
 
@@ -50,16 +48,17 @@
         new NoneTarget(new TargetFlags()));
     final DillLoader loader = target.loader;
     loader.appendLibraries(env.component);
-    await target.buildOutlines();
-    ClassBuilder objectClass =
-        loader.coreLibrary.lookupLocalMember("Object", required: true);
+    target.buildOutlines();
+    ClassBuilder objectClass = loader.coreLibrary
+        .lookupLocalMember("Object", required: true) as ClassBuilder;
     hierarchy = new ClassHierarchyBuilder(objectClass, loader, env.coreTypes);
   }
 
   @override
   DartType getLegacyLeastUpperBound(
       DartType a, DartType b, Library clientLibrary) {
-    return hierarchy.getLegacyLeastUpperBound(a, b, clientLibrary);
+    return hierarchy.getLegacyLeastUpperBound(
+        a as InterfaceType, b as InterfaceType, clientLibrary);
   }
 }
 
diff --git a/pkg/front_end/test/fasta/types/fasta_types_test.dart b/pkg/front_end/test/fasta/types/fasta_types_test.dart
index 83135453..ecff945 100644
--- a/pkg/front_end/test/fasta/types/fasta_types_test.dart
+++ b/pkg/front_end/test/fasta/types/fasta_types_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import "package:async_helper/async_helper.dart" show asyncTest;
 
 import "package:kernel/ast.dart" show Component, DartType;
@@ -55,9 +53,9 @@
         new NoneTarget(new TargetFlags()));
     final DillLoader loader = target.loader;
     loader.appendLibraries(sdk);
-    await target.buildOutlines();
-    ClassBuilder objectClass =
-        loader.coreLibrary.lookupLocalMember("Object", required: true);
+    target.buildOutlines();
+    ClassBuilder objectClass = loader.coreLibrary
+        .lookupLocalMember("Object", required: true) as ClassBuilder;
     ClassHierarchyBuilder hierarchy =
         new ClassHierarchyBuilder(objectClass, loader, new CoreTypes(sdk));
     new FastaTypesTest(hierarchy, environment).run();
@@ -85,7 +83,7 @@
   }
 
   @override
-  TypeParserEnvironment extend(String typeParameters) {
+  TypeParserEnvironment extend(String? typeParameters) {
     return environment.extendWithTypeParameters(typeParameters);
   }
 }
diff --git a/pkg/front_end/test/fasta/types/hashcode_test.dart b/pkg/front_end/test/fasta/types/hashcode_test.dart
index 0c1fbfe..a7542c1 100644
--- a/pkg/front_end/test/fasta/types/hashcode_test.dart
+++ b/pkg/front_end/test/fasta/types/hashcode_test.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 import 'package:expect/expect.dart';
 import 'package:kernel/kernel.dart';
 
diff --git a/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart b/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart
index aeffa98..9ce7b25 100644
--- a/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart
+++ b/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart
@@ -2,31 +2,29 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import "legacy_upper_bound_helper.dart" show LegacyUpperBoundTest;
 
-import "package:kernel/ast.dart" show DartType, Library;
+import "package:kernel/ast.dart" show DartType, InterfaceType, Library;
 
 import "package:kernel/class_hierarchy.dart" show ClassHierarchy;
 
 class KernelLegacyUpperBoundTest extends LegacyUpperBoundTest {
-  ClassHierarchy hierarchy;
+  late ClassHierarchy hierarchy;
 
   @override
   bool get isNonNullableByDefault => true;
 
   @override
-  Future<void> parseComponent(String source) {
-    super.parseComponent(source);
+  Future<void> parseComponent(String source) async {
+    await super.parseComponent(source);
     hierarchy = new ClassHierarchy(env.component, env.coreTypes);
-    return null;
   }
 
   @override
   DartType getLegacyLeastUpperBound(
       DartType a, DartType b, Library clientLibrary) {
-    return hierarchy.getLegacyLeastUpperBound(a, b, clientLibrary);
+    return hierarchy.getLegacyLeastUpperBound(
+        a as InterfaceType, b as InterfaceType, clientLibrary);
   }
 }
 
diff --git a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
index edae38a..f6c6728 100644
--- a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
+++ b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import "package:expect/expect.dart" show Expect;
 
 import "package:kernel/ast.dart" show Component, DartType, Library;
@@ -147,7 +145,7 @@
   }
 
   @override
-  TypeParserEnvironment extend(String typeParameters) {
+  TypeParserEnvironment extend(String? typeParameters) {
     return environment.extendWithTypeParameters(typeParameters);
   }
 }
diff --git a/pkg/front_end/test/fasta/types/large_app_benchmark.dart b/pkg/front_end/test/fasta/types/large_app_benchmark.dart
index 28c653f..2403d67 100644
--- a/pkg/front_end/test/fasta/types/large_app_benchmark.dart
+++ b/pkg/front_end/test/fasta/types/large_app_benchmark.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import "dart:io" show Platform;
 
 import "subtypes_benchmark.dart" show run;
diff --git a/pkg/front_end/test/fasta/types/large_app_benchmark_test.dart b/pkg/front_end/test/fasta/types/large_app_benchmark_test.dart
index 3037003..24cefc6 100644
--- a/pkg/front_end/test/fasta/types/large_app_benchmark_test.dart
+++ b/pkg/front_end/test/fasta/types/large_app_benchmark_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import "large_app_benchmark.dart" as bench show main;
 
 void main() => bench.main();
diff --git a/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart b/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
index 3d4c7d6..a47c4ee 100644
--- a/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
+++ b/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import "package:async_helper/async_helper.dart" show asyncTest;
 
 import "package:expect/expect.dart" show Expect;
@@ -15,13 +13,13 @@
 final Uri libraryUri = Uri.parse("org-dartlang-test:///library.dart");
 
 abstract class LegacyUpperBoundTest {
-  parser.Env env;
-  Library coreLibrary;
-  Library testLibrary;
+  late parser.Env env;
+  late Library coreLibrary;
+  late Library testLibrary;
 
   bool get isNonNullableByDefault;
 
-  void parseComponent(String source) {
+  Future<void> parseComponent(String source) {
     env =
         new parser.Env(source, isNonNullableByDefault: isNonNullableByDefault);
     assert(
@@ -42,6 +40,7 @@
       coreLibrary = secondLibrary;
       testLibrary = firstLibrary;
     }
+    return new Future<void>.value();
   }
 
   DartType getLegacyLeastUpperBound(
diff --git a/pkg/front_end/test/fasta/types/shared_type_tests.dart b/pkg/front_end/test/fasta/types/shared_type_tests.dart
index f219fb6..224378f 100644
--- a/pkg/front_end/test/fasta/types/shared_type_tests.dart
+++ b/pkg/front_end/test/fasta/types/shared_type_tests.dart
@@ -2,15 +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.
 
-// @dart = 2.9
-
 import "package:expect/expect.dart" show Expect;
 
 import "package:kernel/type_environment.dart";
 
 abstract class SubtypeTest<T, E> {
   void isSubtype(String subtypeString, String supertypeString,
-      {String typeParameters}) {
+      {String? typeParameters}) {
     E environment = extend(typeParameters);
     T subtype = toType(subtypeString, environment);
     T supertype = toType(supertypeString, environment);
@@ -21,7 +19,7 @@
   }
 
   void isNotSubtype(String subtypeString, String supertypeString,
-      {String typeParameters}) {
+      {String? typeParameters}) {
     E environment = extend(typeParameters);
     T subtype = toType(subtypeString, environment);
     T supertype = toType(supertypeString, environment);
@@ -33,7 +31,7 @@
 
   /// Checks if a type is a subtype of the other ignoring nullability modifiers.
   void isObliviousSubtype(String subtypeString, String supertypeString,
-      {String typeParameters}) {
+      {String? typeParameters}) {
     E environment = extend(typeParameters);
     T subtype = toType(subtypeString, environment);
     T supertype = toType(supertypeString, environment);
@@ -54,7 +52,7 @@
 
   IsSubtypeOf isSubtypeImpl(T subtype, T supertype);
 
-  E extend(String typeParameters);
+  E extend(String? typeParameters);
 
   void run() {
     // Tests for subtypes and supertypes of num.
diff --git a/pkg/front_end/test/fasta/types/subtypes_benchmark.dart b/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
index 6ab0236..d3c0a09 100644
--- a/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
+++ b/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import "dart:convert" show json, utf8;
 
 import "dart:io" show File, gzip;
@@ -66,17 +64,17 @@
 }
 
 SubtypesBenchmark parseBenchMark(String source) {
-  Map<Object, Object> data = json.decode(source);
-  List<Object> classes = data["classes"];
+  Map<dynamic, dynamic> data = json.decode(source);
+  List<dynamic> classes = data["classes"];
   Uri uri = Uri.parse("dart:core");
   TypeParserEnvironment environment = new TypeParserEnvironment(uri, uri);
   Library library =
       parseLibrary(uri, classes.join("\n"), environment: environment);
-  List<Object> checks = data["checks"];
+  List<dynamic> checks = data["checks"];
   List<SubtypeCheck> subtypeChecks = <SubtypeCheck>[];
-  for (Map<Object, Object> check in checks) {
+  for (Map<dynamic, dynamic> check in checks) {
     String kind = check["kind"];
-    List<Object> arguments = check["arguments"];
+    List<dynamic> arguments = check["arguments"];
     String sSource = arguments[0];
     String tSource = arguments[1];
     if (sSource.contains("?")) continue;
@@ -85,7 +83,7 @@
     if (tSource.contains("⊥")) continue;
     TypeParserEnvironment localEnvironment = environment;
     if (arguments.length > 2) {
-      List<Object> typeParametersSource = arguments[2];
+      List<dynamic> typeParametersSource = arguments[2];
       localEnvironment = environment
           .extendWithTypeParameters("${typeParametersSource.join(', ')}");
     }
@@ -124,7 +122,7 @@
   final Ticker ticker = new Ticker(isVerbose: false);
   Stopwatch kernelWatch = new Stopwatch();
   Stopwatch fastaWatch = new Stopwatch();
-  List<int> bytes = await new File.fromUri(benchmarkInput).readAsBytes();
+  List<int>? bytes = await new File.fromUri(benchmarkInput).readAsBytes();
   if (bytes.length > 3) {
     if (bytes[0] == 0x1f && bytes[1] == 0x8b && bytes[2] == 0x08) {
       bytes = gzip.decode(bytes);
@@ -148,9 +146,9 @@
         new NoneTarget(new TargetFlags()));
     final DillLoader loader = target.loader;
     loader.appendLibraries(c);
-    await target.buildOutlines();
-    ClassBuilder objectClass =
-        loader.coreLibrary.lookupLocalMember("Object", required: true);
+    target.buildOutlines();
+    ClassBuilder objectClass = loader.coreLibrary
+        .lookupLocalMember("Object", required: true) as ClassBuilder;
     ClassHierarchyBuilder hierarchy =
         new ClassHierarchyBuilder(objectClass, loader, coreTypes);
 
diff --git a/pkg/front_end/test/fasta/uri_translator_test.dart b/pkg/front_end/test/fasta/uri_translator_test.dart
index 37e3564..806a053 100644
--- a/pkg/front_end/test/fasta/uri_translator_test.dart
+++ b/pkg/front_end/test/fasta/uri_translator_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:_fe_analyzer_shared/src/util/libraries_specification.dart';
 import 'package:front_end/src/fasta/uri_translator.dart';
 import 'package:package_config/package_config.dart';
diff --git a/pkg/front_end/test/fasta/util/direct_parser_ast_test.dart b/pkg/front_end/test/fasta/util/parser_ast_test.dart
similarity index 71%
rename from pkg/front_end/test/fasta/util/direct_parser_ast_test.dart
rename to pkg/front_end/test/fasta/util/parser_ast_test.dart
index 4e4a34d..e002d6d 100644
--- a/pkg/front_end/test/fasta/util/direct_parser_ast_test.dart
+++ b/pkg/front_end/test/fasta/util/parser_ast_test.dart
@@ -2,15 +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.md file.
 
-// @dart = 2.9
-
 import 'dart:convert';
 import 'dart:io';
 
-import 'package:front_end/src/fasta/util/direct_parser_ast.dart';
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
+import 'package:front_end/src/fasta/util/parser_ast.dart';
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart';
 
-Uri base;
+late Uri base;
 
 void main(List<String> args) {
   File script = new File.fromUri(Platform.script);
@@ -35,13 +33,13 @@
       try {
         processed++;
         List<int> data = entry.readAsBytesSync();
-        DirectParserASTContentCompilationUnitEnd ast = getAST(data,
+        CompilationUnitEnd ast = getAST(data,
             includeBody: true,
             includeComments: true,
             enableExtensionMethods: true,
             enableNonNullable: false);
         splitIntoChunks(ast, data);
-        for (DirectParserASTContent child in ast.children) {
+        for (ParserAstNode child in ast.children!) {
           if (child.isClass()) {
             splitIntoChunks(
                 child.asClass().getClassOrMixinOrExtensionBody(), data);
@@ -63,9 +61,9 @@
 
 void testTopLevelStuff() {
   File file = new File.fromUri(
-      base.resolve("direct_parser_ast_test_data/top_level_stuff.txt"));
+      base.resolve("parser_ast_test_data/top_level_stuff.txt"));
   List<int> data = file.readAsBytesSync();
-  DirectParserASTContentCompilationUnitEnd ast = getAST(data,
+  CompilationUnitEnd ast = getAST(data,
       includeBody: true,
       includeComments: true,
       enableExtensionMethods: true,
@@ -119,7 +117,7 @@
   expect("@AnnotationAtEOF", foundChunks[21]);
 
   file = new File.fromUri(
-      base.resolve("direct_parser_ast_test_data/top_level_stuff_helper.txt"));
+      base.resolve("parser_ast_test_data/top_level_stuff_helper.txt"));
   data = file.readAsBytesSync();
   ast = getAST(data,
       includeBody: true,
@@ -130,8 +128,8 @@
   expect(1, foundChunks.length);
   expect("part of 'top_level_stuff.txt';", foundChunks[0]);
 
-  file = new File.fromUri(
-      base.resolve("direct_parser_ast_test_data/script_handle.txt"));
+  file =
+      new File.fromUri(base.resolve("parser_ast_test_data/script_handle.txt"));
   data = file.readAsBytesSync();
   ast = getAST(data,
       includeBody: true,
@@ -144,30 +142,26 @@
 }
 
 void testClassStuff() {
-  File file =
-      new File.fromUri(base.resolve("direct_parser_ast_test_data/class.txt"));
+  File file = new File.fromUri(base.resolve("parser_ast_test_data/class.txt"));
   List<int> data = file.readAsBytesSync();
-  DirectParserASTContentCompilationUnitEnd ast = getAST(data,
+  CompilationUnitEnd ast = getAST(data,
       includeBody: true,
       includeComments: true,
       enableExtensionMethods: true,
       enableNonNullable: false);
-  List<DirectParserASTContentTopLevelDeclarationEnd> classes = ast.getClasses();
+  List<TopLevelDeclarationEnd> classes = ast.getClasses();
   expect(2, classes.length);
 
-  DirectParserASTContentTopLevelDeclarationEnd decl = classes[0];
-  DirectParserASTContentClassDeclarationEnd cls = decl.asClass();
+  TopLevelDeclarationEnd decl = classes[0];
+  ClassDeclarationEnd cls = decl.asClass();
   expect("Foo", decl.getIdentifier().token.lexeme);
-  DirectParserASTContentClassExtendsHandle extendsDecl = cls.getClassExtends();
+  ClassExtendsHandle extendsDecl = cls.getClassExtends();
   expect("extends", extendsDecl.extendsKeyword?.lexeme);
-  DirectParserASTContentClassOrMixinImplementsHandle implementsDecl =
-      cls.getClassImplements();
+  ImplementsHandle implementsDecl = cls.getClassImplements();
   expect("implements", implementsDecl.implementsKeyword?.lexeme);
-  DirectParserASTContentClassWithClauseHandle withClauseDecl =
-      cls.getClassWithClause();
+  ClassWithClauseHandle? withClauseDecl = cls.getClassWithClause();
   expect(null, withClauseDecl);
-  List<DirectParserASTContentMemberEnd> members =
-      cls.getClassOrMixinOrExtensionBody().getMembers();
+  List<MemberEnd> members = cls.getClassOrMixinOrExtensionBody().getMembers();
   expect(5, members.length);
   expect(members[0].isClassConstructor(), true);
   expect(members[1].isClassFactoryMethod(), true);
@@ -191,27 +185,26 @@
   expect("int field1, field2 = 42;", chunks[4]);
 
   chunks = processItem(
-      members[0].getClassConstructor().getBlockFunctionBody(), data);
+      members[0].getClassConstructor().getBlockFunctionBody()!, data);
   expect(1, chunks.length);
   expect("""{
     // Constructor
   }""", chunks[0]);
   chunks =
-      processItem(members[2].getClassMethod().getBlockFunctionBody(), data);
+      processItem(members[2].getClassMethod().getBlockFunctionBody()!, data);
   expect(1, chunks.length);
   expect("""{
     // instance method.
   }""", chunks[0]);
   chunks =
-      processItem(members[3].getClassMethod().getBlockFunctionBody(), data);
+      processItem(members[3].getClassMethod().getBlockFunctionBody()!, data);
   expect(1, chunks.length);
   expect("""{
     // static method.
   }""", chunks[0]);
 
   // TODO: Move (something like) this into the check-all-files-thing.
-  for (DirectParserASTContentMemberEnd member
-      in cls.getClassOrMixinOrExtensionBody().getMembers()) {
+  for (MemberEnd member in cls.getClassOrMixinOrExtensionBody().getMembers()) {
     if (member.isClassConstructor()) continue;
     if (member.isClassFactoryMethod()) continue;
     if (member.isClassFields()) continue;
@@ -227,30 +220,27 @@
   implementsDecl = cls.getClassImplements();
   expect(null, implementsDecl.implementsKeyword?.lexeme);
   withClauseDecl = cls.getClassWithClause();
-  expect("with", withClauseDecl.withKeyword.lexeme);
+  expect("with", withClauseDecl!.withKeyword.lexeme);
   members = cls.getClassOrMixinOrExtensionBody().getMembers();
   expect(0, members.length);
 }
 
 void testMixinStuff() {
-  File file =
-      new File.fromUri(base.resolve("direct_parser_ast_test_data/mixin.txt"));
+  File file = new File.fromUri(base.resolve("parser_ast_test_data/mixin.txt"));
   List<int> data = file.readAsBytesSync();
-  DirectParserASTContentCompilationUnitEnd ast = getAST(data,
+  CompilationUnitEnd ast = getAST(data,
       includeBody: true,
       includeComments: true,
       enableExtensionMethods: true,
       enableNonNullable: false);
-  List<DirectParserASTContentTopLevelDeclarationEnd> mixins =
-      ast.getMixinDeclarations();
+  List<TopLevelDeclarationEnd> mixins = ast.getMixinDeclarations();
   expect(mixins.length, 1);
 
-  DirectParserASTContentTopLevelDeclarationEnd decl = mixins[0];
-  DirectParserASTContentMixinDeclarationEnd mxn = decl.asMixinDeclaration();
+  TopLevelDeclarationEnd decl = mixins[0];
+  MixinDeclarationEnd mxn = decl.asMixinDeclaration();
   expect("B", decl.getIdentifier().token.lexeme);
 
-  List<DirectParserASTContentMemberEnd> members =
-      mxn.getClassOrMixinOrExtensionBody().getMembers();
+  List<MemberEnd> members = mxn.getClassOrMixinOrExtensionBody().getMembers();
   expect(4, members.length);
   expect(members[0].isMixinFields(), true);
   expect(members[1].isMixinMethod(), true);
@@ -276,28 +266,27 @@
   if (expect != actual) throw "Expected '$expect' but got '$actual'";
 }
 
-List<String> splitIntoChunks(DirectParserASTContent ast, List<int> data) {
+List<String> splitIntoChunks(ParserAstNode ast, List<int> data) {
   List<String> foundChunks = [];
-  for (DirectParserASTContent child in ast.children) {
+  for (ParserAstNode child in ast.children!) {
     foundChunks.addAll(processItem(child, data));
   }
   return foundChunks;
 }
 
-List<String> processItem(DirectParserASTContent item, List<int> data) {
+List<String> processItem(ParserAstNode item, List<int> data) {
   if (item.isClass()) {
-    DirectParserASTContentClassDeclarationEnd cls = item.asClass();
+    ClassDeclarationEnd cls = item.asClass();
     return [
       getCutContent(data, cls.beginToken.offset,
           cls.endToken.offset + cls.endToken.length)
     ];
   } else if (item.isMetadata()) {
-    DirectParserASTContentMetadataStarEnd metadataStar = item.asMetadata();
-    List<DirectParserASTContentMetadataEnd> entries =
-        metadataStar.getMetadataEntries();
+    MetadataStarEnd metadataStar = item.asMetadata();
+    List<MetadataEnd> entries = metadataStar.getMetadataEntries();
     if (entries.isNotEmpty) {
       List<String> chunks = [];
-      for (DirectParserASTContentMetadataEnd metadata in entries) {
+      for (MetadataEnd metadata in entries) {
         chunks.add(getCutContent(
             data, metadata.beginToken.offset, metadata.endToken.offset));
       }
@@ -305,165 +294,158 @@
     }
     return const [];
   } else if (item.isImport()) {
-    DirectParserASTContentImportEnd import = item.asImport();
+    ImportEnd import = item.asImport();
     return [
       getCutContent(data, import.importKeyword.offset,
-          import.semicolon.offset + import.semicolon.length)
+          import.semicolon!.offset + import.semicolon!.length)
     ];
   } else if (item.isExport()) {
-    DirectParserASTContentExportEnd export = item.asExport();
+    ExportEnd export = item.asExport();
     return [
       getCutContent(data, export.exportKeyword.offset,
           export.semicolon.offset + export.semicolon.length)
     ];
   } else if (item.isLibraryName()) {
-    DirectParserASTContentLibraryNameEnd name = item.asLibraryName();
+    LibraryNameEnd name = item.asLibraryName();
     return [
       getCutContent(data, name.libraryKeyword.offset,
           name.semicolon.offset + name.semicolon.length)
     ];
   } else if (item.isPart()) {
-    DirectParserASTContentPartEnd part = item.asPart();
+    PartEnd part = item.asPart();
     return [
       getCutContent(data, part.partKeyword.offset,
           part.semicolon.offset + part.semicolon.length)
     ];
   } else if (item.isPartOf()) {
-    DirectParserASTContentPartOfEnd partOf = item.asPartOf();
+    PartOfEnd partOf = item.asPartOf();
     return [
       getCutContent(data, partOf.partKeyword.offset,
           partOf.semicolon.offset + partOf.semicolon.length)
     ];
   } else if (item.isTopLevelMethod()) {
-    DirectParserASTContentTopLevelMethodEnd method = item.asTopLevelMethod();
+    TopLevelMethodEnd method = item.asTopLevelMethod();
     return [
       getCutContent(data, method.beginToken.offset,
           method.endToken.offset + method.endToken.length)
     ];
   } else if (item.isTopLevelFields()) {
-    DirectParserASTContentTopLevelFieldsEnd fields = item.asTopLevelFields();
+    TopLevelFieldsEnd fields = item.asTopLevelFields();
     return [
       getCutContent(data, fields.beginToken.offset,
           fields.endToken.offset + fields.endToken.length)
     ];
   } else if (item.isEnum()) {
-    DirectParserASTContentEnumEnd declaration = item.asEnum();
+    EnumEnd declaration = item.asEnum();
     return [
       getCutContent(
           data,
           declaration.enumKeyword.offset,
-          declaration.leftBrace.endGroup.offset +
-              declaration.leftBrace.endGroup.length)
+          declaration.leftBrace.endGroup!.offset +
+              declaration.leftBrace.endGroup!.length)
     ];
   } else if (item.isMixinDeclaration()) {
-    DirectParserASTContentMixinDeclarationEnd mixinDecl =
-        item.asMixinDeclaration();
+    MixinDeclarationEnd mixinDecl = item.asMixinDeclaration();
     return [
       getCutContent(data, mixinDecl.mixinKeyword.offset,
           mixinDecl.endToken.offset + mixinDecl.endToken.length)
     ];
   } else if (item.isNamedMixinDeclaration()) {
-    DirectParserASTContentNamedMixinApplicationEnd namedMixinDecl =
-        item.asNamedMixinDeclaration();
+    NamedMixinApplicationEnd namedMixinDecl = item.asNamedMixinDeclaration();
     return [
       getCutContent(data, namedMixinDecl.begin.offset,
           namedMixinDecl.endToken.offset + namedMixinDecl.endToken.length)
     ];
   } else if (item.isTypedef()) {
-    DirectParserASTContentTypedefEnd typedefDecl = item.asTypedef();
+    TypedefEnd typedefDecl = item.asTypedef();
     return [
       getCutContent(data, typedefDecl.typedefKeyword.offset,
           typedefDecl.endToken.offset + typedefDecl.endToken.length)
     ];
   } else if (item.isExtension()) {
-    DirectParserASTContentExtensionDeclarationEnd extensionDecl =
-        item.asExtension();
+    ExtensionDeclarationEnd extensionDecl = item.asExtension();
     return [
       getCutContent(data, extensionDecl.extensionKeyword.offset,
           extensionDecl.endToken.offset + extensionDecl.endToken.length)
     ];
   } else if (item.isScript()) {
-    DirectParserASTContentScriptHandle script = item.asScript();
+    ScriptHandle script = item.asScript();
     return [
       getCutContent(
           data, script.token.offset, script.token.offset + script.token.length)
     ];
-  } else if (item is DirectParserASTContentMemberEnd) {
+  } else if (item is MemberEnd) {
     if (item.isClassConstructor()) {
-      DirectParserASTContentClassConstructorEnd decl =
-          item.getClassConstructor();
+      ClassConstructorEnd decl = item.getClassConstructor();
       return [
         getCutContent(data, decl.beginToken.offset,
             decl.endToken.offset + decl.endToken.length)
       ];
     } else if (item.isClassFactoryMethod()) {
-      DirectParserASTContentClassFactoryMethodEnd decl =
-          item.getClassFactoryMethod();
+      ClassFactoryMethodEnd decl = item.getClassFactoryMethod();
       return [
         getCutContent(data, decl.beginToken.offset,
             decl.endToken.offset + decl.endToken.length)
       ];
     } else if (item.isClassMethod()) {
-      DirectParserASTContentClassMethodEnd decl = item.getClassMethod();
+      ClassMethodEnd decl = item.getClassMethod();
       return [
         getCutContent(data, decl.beginToken.offset,
             decl.endToken.offset + decl.endToken.length)
       ];
     } else if (item.isClassFields()) {
-      DirectParserASTContentClassFieldsEnd decl = item.getClassFields();
+      ClassFieldsEnd decl = item.getClassFields();
       return [
         getCutContent(data, decl.beginToken.offset,
             decl.endToken.offset + decl.endToken.length)
       ];
     } else if (item.isClassFields()) {
-      DirectParserASTContentClassFieldsEnd decl = item.getClassFields();
+      ClassFieldsEnd decl = item.getClassFields();
       return [
         getCutContent(data, decl.beginToken.offset,
             decl.endToken.offset + decl.endToken.length)
       ];
     } else if (item.isMixinFields()) {
-      DirectParserASTContentMixinFieldsEnd decl = item.getMixinFields();
+      MixinFieldsEnd decl = item.getMixinFields();
       return [
         getCutContent(data, decl.beginToken.offset,
             decl.endToken.offset + decl.endToken.length)
       ];
     } else if (item.isMixinMethod()) {
-      DirectParserASTContentMixinMethodEnd decl = item.getMixinMethod();
+      MixinMethodEnd decl = item.getMixinMethod();
       return [
         getCutContent(data, decl.beginToken.offset,
             decl.endToken.offset + decl.endToken.length)
       ];
     } else if (item.isMixinFactoryMethod()) {
-      DirectParserASTContentMixinFactoryMethodEnd decl =
-          item.getMixinFactoryMethod();
+      MixinFactoryMethodEnd decl = item.getMixinFactoryMethod();
       return [
         getCutContent(data, decl.beginToken.offset,
             decl.endToken.offset + decl.endToken.length)
       ];
     } else if (item.isMixinConstructor()) {
-      DirectParserASTContentMixinConstructorEnd decl =
-          item.getMixinConstructor();
+      MixinConstructorEnd decl = item.getMixinConstructor();
       return [
         getCutContent(data, decl.beginToken.offset,
             decl.endToken.offset + decl.endToken.length)
       ];
     } else {
-      if (item.type == DirectParserASTType.BEGIN) return const [];
-      if (item.type == DirectParserASTType.HANDLE) return const [];
+      if (item.type == ParserAstType.BEGIN) return const [];
+      if (item.type == ParserAstType.HANDLE) return const [];
       if (item.isClassRecoverableError()) return const [];
       if (item.isRecoverableError()) return const [];
       if (item.isRecoverImport()) return const [];
       throw "Unknown: $item --- ${item.children}";
     }
   } else if (item.isFunctionBody()) {
-    DirectParserASTContentBlockFunctionBodyEnd decl = item.asFunctionBody();
+    BlockFunctionBodyEnd decl = item.asFunctionBody();
     return [
       getCutContent(data, decl.beginToken.offset,
           decl.endToken.offset + decl.endToken.length)
     ];
   } else {
-    if (item.type == DirectParserASTType.BEGIN) return const [];
-    if (item.type == DirectParserASTType.HANDLE) return const [];
+    if (item.type == ParserAstType.BEGIN) return const [];
+    if (item.type == ParserAstType.HANDLE) return const [];
     if (item.isInvalidTopLevelDeclaration()) return const [];
     if (item.isRecoverableError()) return const [];
     if (item.isRecoverImport()) return const [];
@@ -472,8 +454,8 @@
   }
 }
 
-List<int> _contentCache;
-String _contentCacheString;
+List<int>? _contentCache;
+String? _contentCacheString;
 String getCutContent(List<int> content, int from, int to) {
   if (identical(content, _contentCache)) {
     // cache up to date.
@@ -481,5 +463,5 @@
     _contentCache = content;
     _contentCacheString = utf8.decode(content);
   }
-  return _contentCacheString.substring(from, to);
+  return _contentCacheString!.substring(from, to);
 }
diff --git a/pkg/front_end/test/fasta/util/direct_parser_ast_test_data/class.txt b/pkg/front_end/test/fasta/util/parser_ast_test_data/class.txt
similarity index 100%
rename from pkg/front_end/test/fasta/util/direct_parser_ast_test_data/class.txt
rename to pkg/front_end/test/fasta/util/parser_ast_test_data/class.txt
diff --git a/pkg/front_end/test/fasta/util/direct_parser_ast_test_data/mixin.txt b/pkg/front_end/test/fasta/util/parser_ast_test_data/mixin.txt
similarity index 100%
rename from pkg/front_end/test/fasta/util/direct_parser_ast_test_data/mixin.txt
rename to pkg/front_end/test/fasta/util/parser_ast_test_data/mixin.txt
diff --git a/pkg/front_end/test/fasta/util/direct_parser_ast_test_data/script_handle.txt b/pkg/front_end/test/fasta/util/parser_ast_test_data/script_handle.txt
similarity index 100%
rename from pkg/front_end/test/fasta/util/direct_parser_ast_test_data/script_handle.txt
rename to pkg/front_end/test/fasta/util/parser_ast_test_data/script_handle.txt
diff --git a/pkg/front_end/test/fasta/util/direct_parser_ast_test_data/top_level_stuff.txt b/pkg/front_end/test/fasta/util/parser_ast_test_data/top_level_stuff.txt
similarity index 100%
rename from pkg/front_end/test/fasta/util/direct_parser_ast_test_data/top_level_stuff.txt
rename to pkg/front_end/test/fasta/util/parser_ast_test_data/top_level_stuff.txt
diff --git a/pkg/front_end/test/fasta/util/direct_parser_ast_test_data/top_level_stuff_helper.txt b/pkg/front_end/test/fasta/util/parser_ast_test_data/top_level_stuff_helper.txt
similarity index 100%
rename from pkg/front_end/test/fasta/util/direct_parser_ast_test_data/top_level_stuff_helper.txt
rename to pkg/front_end/test/fasta/util/parser_ast_test_data/top_level_stuff_helper.txt
diff --git a/pkg/front_end/test/fasta/weak_suite.dart b/pkg/front_end/test/fasta/weak_suite.dart
index 384baab..1ce80c58 100644
--- a/pkg/front_end/test/fasta/weak_suite.dart
+++ b/pkg/front_end/test/fasta/weak_suite.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 library fasta.test.weak_test;
 
 import 'testing/suite.dart';
diff --git a/pkg/front_end/test/ffi_test.dart b/pkg/front_end/test/ffi_test.dart
index 02cc7fbf..79f7ba7 100644
--- a/pkg/front_end/test/ffi_test.dart
+++ b/pkg/front_end/test/ffi_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:expect/expect.dart';
 
 void main() {
diff --git a/pkg/front_end/test/flutter_gallery_leak_tester.dart b/pkg/front_end/test/flutter_gallery_leak_tester.dart
index 973961d..84fe990 100644
--- a/pkg/front_end/test/flutter_gallery_leak_tester.dart
+++ b/pkg/front_end/test/flutter_gallery_leak_tester.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
@@ -11,7 +9,7 @@
 
 import "vm_service_heap_helper.dart" as helper;
 
-Completer completer;
+late Completer completer;
 
 Set<String> files = {};
 
@@ -36,7 +34,7 @@
 
   bool quicker = false;
   bool alternativeInvalidation = false;
-  String rootPath;
+  String? rootPath;
 
   for (String arg in args) {
     if (arg == "--quicker") {
diff --git a/pkg/front_end/test/generated_files_up_to_date_git_test.dart b/pkg/front_end/test/generated_files_up_to_date_git_test.dart
index 5161eef..89665f6 100644
--- a/pkg/front_end/test/generated_files_up_to_date_git_test.dart
+++ b/pkg/front_end/test/generated_files_up_to_date_git_test.dart
@@ -2,15 +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.md file.
 
-// @dart = 2.9
-
 import "dart:io" show File, exitCode;
 
 import "../tool/_fasta/generate_messages.dart" as generateMessages;
 import "../tool/_fasta/generate_experimental_flags.dart"
     as generateExperimentalFlags;
-import "../tool/_fasta/direct_parser_ast_helper_creator.dart"
-    as generateDirectParserAstHelper;
+import "../tool/_fasta/parser_ast_helper_creator.dart"
+    as generateParserAstHelper;
 import "parser_test_listener_creator.dart" as generateParserTestListener;
 import "parser_test_parser_creator.dart" as generateParserTestParser;
 import '../tool/ast_model.dart';
@@ -47,11 +45,10 @@
 }
 
 void directParserAstHelper() {
-  Uri generatedFile =
-      generateDirectParserAstHelper.computeAstHelperUri(repoDir);
-  String generated = generateDirectParserAstHelper.generateAstHelper(repoDir);
+  Uri generatedFile = generateParserAstHelper.computeAstHelperUri(repoDir);
+  String generated = generateParserAstHelper.generateAstHelper(repoDir);
   check(generated, generatedFile,
-      "dart pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart");
+      "dart pkg/front_end/tool/_fasta/parser_ast_helper_creator.dart");
 }
 
 Future<void> astEquivalence(AstModel astModel) async {
diff --git a/pkg/front_end/test/hot_reload_e2e_test.dart b/pkg/front_end/test/hot_reload_e2e_test.dart
index 9a2a0b9..69069c9 100644
--- a/pkg/front_end/test/hot_reload_e2e_test.dart
+++ b/pkg/front_end/test/hot_reload_e2e_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 /// Integration test that runs the incremental compiler, runs the compiled
 /// program, incrementally rebuild portions of the app, and triggers a hot
 /// reload on the running program.
@@ -45,12 +43,12 @@
 import 'tool/reload.dart' show RemoteVm;
 
 abstract class TestCase {
-  IncrementalKernelGenerator compiler;
-  MemoryFileSystem fs;
-  Directory outDir;
-  Uri outputUri;
-  List<Future<String>> lines;
-  Future programIsDone;
+  late IncrementalKernelGenerator compiler;
+  late MemoryFileSystem fs;
+  late Directory outDir;
+  late Uri outputUri;
+  List<Future<String>> lines = const [];
+  late Future programIsDone;
 
   String get name;
 
@@ -83,14 +81,14 @@
 
   Future<void> tearDown() async {
     outDir.deleteSync(recursive: true);
-    lines = null;
+    lines = const [];
   }
 
   Future<int> computeVmPort() async {
     var portLine = await lines[0];
     Expect.isTrue(observatoryPortRegExp.hasMatch(portLine));
     var match = observatoryPortRegExp.firstMatch(portLine);
-    return int.parse(match.group(1));
+    return int.parse(match!.group(1)!);
   }
 
   /// Request vm to resume execution
@@ -318,8 +316,9 @@
   compiler.invalidate(Uri.parse("org-dartlang-test:///a.dart"));
   compiler.invalidate(Uri.parse("org-dartlang-test:///b.dart"));
   compiler.invalidate(Uri.parse("org-dartlang-test:///c.dart"));
-  var component = await compiler.computeDelta();
-  if (component != null && !component.libraries.isEmpty) {
+  var compilerResult = await compiler.computeDelta();
+  var component = compilerResult.component;
+  if (!component.libraries.isEmpty) {
     await writeProgram(component, outputUri);
     return true;
   }
diff --git a/pkg/front_end/test/id_testing/id_testing_test.dart b/pkg/front_end/test/id_testing/id_testing_test.dart
index 873dc8e..e8f9f5f 100644
--- a/pkg/front_end/test/id_testing/id_testing_test.dart
+++ b/pkg/front_end/test/id_testing/id_testing_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
     show DataInterpreter, StringDataInterpreter, runTests;
@@ -47,7 +45,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new IdTestingDataExtractor(compilerResult, actualMap));
   }
 
@@ -57,7 +55,7 @@
       InternalCompilerResult compilerResult,
       Class cls,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new IdTestingDataExtractor(compilerResult, actualMap).computeForClass(cls);
   }
 
@@ -67,7 +65,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new IdTestingDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
   }
@@ -106,7 +104,7 @@
 
   String computeMemberName(Member member) {
     if (member.enclosingClass != null) {
-      return '${computeClassName(member.enclosingClass)}.'
+      return '${computeClassName(member.enclosingClass!)}.'
           '${getMemberName(member)}';
     }
     return getMemberName(member);
@@ -118,7 +116,7 @@
   }
 
   @override
-  String computeNodeValue(Id id, TreeNode node) {
+  String? computeNodeValue(Id id, TreeNode node) {
     if (node is FunctionDeclaration) {
       return '${computeMemberName(getEnclosingMember(node))}.'
           '${node.variable.name}';
diff --git a/pkg/front_end/test/id_tests/assigned_variables_test.dart b/pkg/front_end/test/id_tests/assigned_variables_test.dart
index 1b325de..0f833c1 100644
--- a/pkg/front_end/test/id_tests/assigned_variables_test.dart
+++ b/pkg/front_end/test/id_tests/assigned_variables_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, Platform;
 
 import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart';
@@ -46,12 +44,12 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<_Data>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     MemberBuilderImpl memberBuilder =
-        lookupMemberBuilder(compilerResult, member);
-    AssignedVariablesForTesting<TreeNode, VariableDeclaration>
+        lookupMemberBuilder(compilerResult, member) as MemberBuilderImpl;
+    AssignedVariablesForTesting<TreeNode, VariableDeclaration>?
         assignedVariables = memberBuilder
-            .dataForTesting.inferenceData.flowAnalysisResult.assignedVariables;
+            .dataForTesting!.inferenceData.flowAnalysisResult.assignedVariables;
     if (assignedVariables == null) return;
     member.accept(new AssignedVariablesDataExtractor(
         compilerResult, actualMap, assignedVariables));
@@ -66,7 +64,7 @@
   AssignedVariablesDataExtractor(InternalCompilerResult compilerResult,
       Map<Id, ActualData<_Data>> actualMap, this._assignedVariables)
       : _sourceLoaderDataForTesting =
-            compilerResult.kernelTargetForTesting.loader.dataForTesting,
+            compilerResult.kernelTargetForTesting!.loader.dataForTesting!,
         super(compilerResult, actualMap);
 
   @override
@@ -80,10 +78,10 @@
   }
 
   Set<String> _convertVars(Iterable<VariableDeclaration> x) =>
-      x.map((e) => e.name).toSet();
+      x.map((e) => e.name!).toSet();
 
   @override
-  _Data computeNodeValue(Id id, TreeNode node) {
+  _Data? computeNodeValue(Id id, TreeNode node) {
     switch (id.kind) {
       case IdKind.iterator:
       case IdKind.current:
@@ -106,7 +104,7 @@
   const _AssignedVariablesDataInterpreter();
 
   @override
-  String getText(_Data actualData, [String indentation]) {
+  String getText(_Data actualData, [String? indentation]) {
     var parts = <String>[];
     if (actualData.declared.isNotEmpty) {
       parts.add('declared=${_setToString(actualData.declared)}');
@@ -128,7 +126,7 @@
   }
 
   @override
-  String isAsExpected(_Data actualData, String expectedData) {
+  String? isAsExpected(_Data actualData, String? expectedData) {
     var actualDataText = getText(actualData);
     if (actualDataText == expectedData) {
       return null;
diff --git a/pkg/front_end/test/id_tests/constant_test.dart b/pkg/front_end/test/id_tests/constant_test.dart
index 54eccdb..bcee3af 100644
--- a/pkg/front_end/test/id_tests/constant_test.dart
+++ b/pkg/front_end/test/id_tests/constant_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
@@ -41,7 +39,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new ConstantsDataExtractor(compilerResult, actualMap));
   }
 
@@ -51,7 +49,7 @@
       InternalCompilerResult compilerResult,
       Class cls,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new ConstantsDataExtractor(compilerResult, actualMap).computeForClass(cls);
   }
 
@@ -75,7 +73,7 @@
       : super(compilerResult, actualMap);
 
   @override
-  String computeNodeValue(Id id, TreeNode node) {
+  String? computeNodeValue(Id id, TreeNode node) {
     if (node is ConstantExpression) {
       return constantToText(node.constant);
     }
diff --git a/pkg/front_end/test/id_tests/definite_assignment_test.dart b/pkg/front_end/test/id_tests/definite_assignment_test.dart
index 74afe1e..536f1e1 100644
--- a/pkg/front_end/test/id_tests/definite_assignment_test.dart
+++ b/pkg/front_end/test/id_tests/definite_assignment_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
@@ -41,11 +39,11 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     MemberBuilderImpl memberBuilder =
-        lookupMemberBuilder(compilerResult, member);
+        lookupMemberBuilder(compilerResult, member) as MemberBuilderImpl;
     member.accept(new DefiniteAssignmentDataExtractor(compilerResult, actualMap,
-        memberBuilder.dataForTesting.inferenceData.flowAnalysisResult));
+        memberBuilder.dataForTesting!.inferenceData.flowAnalysisResult));
   }
 
   /// Errors are supported for testing erroneous code. The reported errors are
@@ -61,11 +59,11 @@
   DefiniteAssignmentDataExtractor(InternalCompilerResult compilerResult,
       Map<Id, ActualData<String>> actualMap, this._flowResult)
       : _sourceLoaderDataForTesting =
-            compilerResult.kernelTargetForTesting.loader.dataForTesting,
+            compilerResult.kernelTargetForTesting!.loader.dataForTesting!,
         super(compilerResult, actualMap);
 
   @override
-  String computeNodeValue(Id id, TreeNode node) {
+  String? computeNodeValue(Id id, TreeNode node) {
     if (node is VariableGet) {
       TreeNode alias = _sourceLoaderDataForTesting.toOriginal(node);
       if (_flowResult.potentiallyUnassignedNodes.contains(alias)) {
diff --git a/pkg/front_end/test/id_tests/definite_unassignment_test.dart b/pkg/front_end/test/id_tests/definite_unassignment_test.dart
index 30d0fb5..67ce244 100644
--- a/pkg/front_end/test/id_tests/definite_unassignment_test.dart
+++ b/pkg/front_end/test/id_tests/definite_unassignment_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
@@ -41,13 +39,13 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     MemberBuilderImpl memberBuilder =
-        lookupMemberBuilder(compilerResult, member);
+        lookupMemberBuilder(compilerResult, member) as MemberBuilderImpl;
     member.accept(new DefiniteUnassignmentDataExtractor(
         compilerResult,
         actualMap,
-        memberBuilder.dataForTesting.inferenceData.flowAnalysisResult));
+        memberBuilder.dataForTesting!.inferenceData.flowAnalysisResult));
   }
 
   /// Errors are supported for testing erroneous code. The reported errors are
@@ -63,11 +61,11 @@
   DefiniteUnassignmentDataExtractor(InternalCompilerResult compilerResult,
       Map<Id, ActualData<String>> actualMap, this._flowResult)
       : _sourceLoaderDataForTesting =
-            compilerResult.kernelTargetForTesting.loader.dataForTesting,
+            compilerResult.kernelTargetForTesting!.loader.dataForTesting!,
         super(compilerResult, actualMap);
 
   @override
-  String computeNodeValue(Id id, TreeNode node) {
+  String? computeNodeValue(Id id, TreeNode node) {
     if (node is VariableGet) {
       TreeNode alias = _sourceLoaderDataForTesting.toOriginal(node);
       if (_flowResult.definitelyUnassignedNodes.contains(alias)) {
diff --git a/pkg/front_end/test/id_tests/inferred_type_arguments_test.dart b/pkg/front_end/test/id_tests/inferred_type_arguments_test.dart
index 6c5aedc..b4d3787 100644
--- a/pkg/front_end/test/id_tests/inferred_type_arguments_test.dart
+++ b/pkg/front_end/test/id_tests/inferred_type_arguments_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
@@ -45,12 +43,12 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<List<DartType>>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     MemberBuilderImpl memberBuilder =
-        lookupMemberBuilder(compilerResult, member);
+        lookupMemberBuilder(compilerResult, member) as MemberBuilderImpl;
     member.accept(new InferredTypeArgumentDataExtractor(
         compilerResult,
-        memberBuilder.dataForTesting.inferenceData.typeInferenceResult,
+        memberBuilder.dataForTesting!.inferenceData.typeInferenceResult,
         actualMap));
   }
 }
@@ -64,7 +62,7 @@
       : super(compilerResult, actualMap);
 
   @override
-  List<DartType> computeNodeValue(Id id, TreeNode node) {
+  List<DartType>? computeNodeValue(Id id, TreeNode node) {
     if (node is Arguments ||
         node is ListLiteral ||
         node is SetLiteral ||
@@ -80,7 +78,7 @@
   const _InferredTypeArgumentsDataInterpreter();
 
   @override
-  String getText(List<DartType> actualData, [String indentation]) {
+  String getText(List<DartType> actualData, [String? indentation]) {
     StringBuffer sb = new StringBuffer();
     if (actualData.isNotEmpty) {
       sb.write('<');
@@ -97,7 +95,7 @@
   }
 
   @override
-  String isAsExpected(List<DartType> actualData, String expectedData) {
+  String? isAsExpected(List<DartType> actualData, String? expectedData) {
     if (getText(actualData) == expectedData) {
       return null;
     } else {
@@ -106,6 +104,6 @@
   }
 
   @override
-  bool isEmpty(List<DartType> actualData) =>
+  bool isEmpty(List<DartType>? actualData) =>
       actualData == null || actualData.isEmpty;
 }
diff --git a/pkg/front_end/test/id_tests/inferred_variable_types_test.dart b/pkg/front_end/test/id_tests/inferred_variable_types_test.dart
index 91c4800..7205920 100644
--- a/pkg/front_end/test/id_tests/inferred_variable_types_test.dart
+++ b/pkg/front_end/test/id_tests/inferred_variable_types_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
@@ -45,12 +43,12 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<DartType>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     MemberBuilderImpl memberBuilder =
-        lookupMemberBuilder(compilerResult, member);
+        lookupMemberBuilder(compilerResult, member) as MemberBuilderImpl;
     member.accept(new InferredTypeArgumentDataExtractor(
         compilerResult,
-        memberBuilder.dataForTesting.inferenceData.typeInferenceResult,
+        memberBuilder.dataForTesting!.inferenceData.typeInferenceResult,
         actualMap));
   }
 }
@@ -63,7 +61,7 @@
       : super(compilerResult, actualMap);
 
   @override
-  DartType computeNodeValue(Id id, TreeNode node) {
+  DartType? computeNodeValue(Id id, TreeNode node) {
     if (node is VariableDeclaration || node is LocalFunction) {
       return typeInferenceResult.inferredVariableTypes[node];
     }
@@ -76,13 +74,13 @@
   const _InferredVariableTypesDataInterpreter();
 
   @override
-  String getText(DartType actualData, [String indentation]) {
+  String getText(DartType actualData, [String? indentation]) {
     return typeToText(
         actualData, TypeRepresentation.analyzerNonNullableByDefault);
   }
 
   @override
-  String isAsExpected(DartType actualData, String expectedData) {
+  String? isAsExpected(DartType actualData, String? expectedData) {
     if (getText(actualData) == expectedData) {
       return null;
     } else {
@@ -91,5 +89,5 @@
   }
 
   @override
-  bool isEmpty(DartType actualData) => actualData == null;
+  bool isEmpty(DartType? actualData) => actualData == null;
 }
diff --git a/pkg/front_end/test/id_tests/inheritance_test.dart b/pkg/front_end/test/id_tests/inheritance_test.dart
index 3d6aba4..11dc8bc 100644
--- a/pkg/front_end/test/id_tests/inheritance_test.dart
+++ b/pkg/front_end/test/id_tests/inheritance_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, Platform;
 
 import 'package:_fe_analyzer_shared/src/testing/id.dart';
@@ -55,7 +53,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new InheritanceDataExtractor(config, compilerResult, actualMap)
         .computeForLibrary(library);
   }
@@ -66,7 +64,7 @@
       InternalCompilerResult compilerResult,
       Class cls,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new InheritanceDataExtractor(config, compilerResult, actualMap)
         .computeForClass(cls);
   }
@@ -92,12 +90,12 @@
       this._config, this._compilerResult, Map<Id, ActualData<String>> actualMap)
       : super(_compilerResult, actualMap);
 
-  ClassHierarchy get _hierarchy => _compilerResult.classHierarchy;
+  ClassHierarchy get _hierarchy => _compilerResult.classHierarchy!;
 
-  CoreTypes get _coreTypes => _compilerResult.coreTypes;
+  CoreTypes get _coreTypes => _compilerResult.coreTypes!;
 
   ClassHierarchyBuilder get _classHierarchyBuilder =>
-      _compilerResult.kernelTargetForTesting.loader.builderHierarchy;
+      _compilerResult.kernelTargetForTesting!.loader.builderHierarchy;
 
   @override
   String computeLibraryValue(Id id, Library node) {
@@ -121,18 +119,18 @@
         .map((Member member) => member.name)
         .toSet();
 
-    void addMember(Name name, {bool isSetter}) {
+    void addMember(Name name, {required bool isSetter}) {
       Member member =
-          _hierarchy.getInterfaceMember(node, name, setter: isSetter);
+          _hierarchy.getInterfaceMember(node, name, setter: isSetter)!;
       if (member.enclosingClass == _coreTypes.objectClass) {
         return;
       }
       InterfaceType supertype = _hierarchy.getTypeAsInstanceOf(
           _coreTypes.thisInterfaceType(node, node.enclosingLibrary.nonNullable),
-          member.enclosingClass,
-          node.enclosingLibrary);
+          member.enclosingClass!,
+          node.enclosingLibrary)!;
       Substitution substitution = Substitution.fromInterfaceType(supertype);
-      DartType type;
+      DartType? type;
       if (member is Procedure) {
         if (member.kind == ProcedureKind.Getter) {
           type = substitution.substituteType(member.function.returnType);
@@ -167,14 +165,14 @@
 
       TreeNode nodeWithOffset;
       if (member.enclosingClass == node) {
-        nodeWithOffset = computeTreeNodeWithOffset(member);
+        nodeWithOffset = computeTreeNodeWithOffset(member)!;
       } else {
-        nodeWithOffset = computeTreeNodeWithOffset(node);
+        nodeWithOffset = computeTreeNodeWithOffset(node)!;
       }
 
       registerValue(
-          nodeWithOffset?.location?.file,
-          nodeWithOffset?.fileOffset,
+          nodeWithOffset.location!.file,
+          nodeWithOffset.fileOffset,
           id,
           typeToText(type, TypeRepresentation.analyzerNonNullableByDefault),
           member);
@@ -190,15 +188,14 @@
   }
 
   @override
-  String computeClassValue(Id id, Class node) {
+  String? computeClassValue(Id id, Class node) {
     if (node.isAnonymousMixin) return null;
     if (_config.marker == cfeMarker) {
       List<String> supertypes = <String>[];
       for (Class superclass in computeAllSuperclasses(node)) {
-        Supertype supertype = _hierarchy.getClassAsInstanceOf(node, superclass);
+        Supertype supertype =
+            _hierarchy.getClassAsInstanceOf(node, superclass)!;
         if (supertype.classNode.isAnonymousMixin) continue;
-        assert(
-            supertype != null, "No instance of $superclass found for $node.");
         supertypes.add(supertypeToText(
             supertype, TypeRepresentation.analyzerNonNullableByDefault));
       }
diff --git a/pkg/front_end/test/id_tests/nullability_test.dart b/pkg/front_end/test/id_tests/nullability_test.dart
index d77f169..0ffa7f2 100644
--- a/pkg/front_end/test/id_tests/nullability_test.dart
+++ b/pkg/front_end/test/id_tests/nullability_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
@@ -36,7 +34,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new NullabilityDataExtractor(compilerResult, actualMap));
   }
 }
@@ -47,10 +45,10 @@
       : super(compilerResult, actualMap);
 
   @override
-  String computeNodeValue(Id id, TreeNode node) {
+  String? computeNodeValue(Id id, TreeNode node) {
     if (node is VariableGet && node.promotedType != null) {
       if (node.variable.type.nullability != Nullability.nonNullable &&
-          node.promotedType.nullability == Nullability.nonNullable) {
+          node.promotedType!.nullability == Nullability.nonNullable) {
         return 'nonNullable';
       }
     }
diff --git a/pkg/front_end/test/id_tests/reachability_test.dart b/pkg/front_end/test/id_tests/reachability_test.dart
index d486fde..1362a08 100644
--- a/pkg/front_end/test/id_tests/reachability_test.dart
+++ b/pkg/front_end/test/id_tests/reachability_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
@@ -43,11 +41,11 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<Set<_ReachabilityAssertion>>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     MemberBuilderImpl memberBuilder =
-        lookupMemberBuilder(compilerResult, member);
+        lookupMemberBuilder(compilerResult, member) as MemberBuilderImpl;
     member.accept(new ReachabilityDataExtractor(compilerResult, actualMap,
-        memberBuilder.dataForTesting.inferenceData.flowAnalysisResult));
+        memberBuilder.dataForTesting!.inferenceData.flowAnalysisResult));
   }
 
   /// Errors are supported for testing erroneous code. The reported errors are
@@ -66,15 +64,15 @@
       Map<Id, ActualData<Set<_ReachabilityAssertion>>> actualMap,
       this._flowResult)
       : _sourceLoaderDataForTesting =
-            compilerResult.kernelTargetForTesting.loader.dataForTesting,
+            compilerResult.kernelTargetForTesting!.loader.dataForTesting!,
         super(compilerResult, actualMap);
 
   @override
-  Set<_ReachabilityAssertion> computeMemberValue(Id id, Member member) {
+  Set<_ReachabilityAssertion>? computeMemberValue(Id id, Member member) {
     Set<_ReachabilityAssertion> result = {};
     if (member.function != null) {
       TreeNode alias =
-          _sourceLoaderDataForTesting.toOriginal(member.function.body);
+          _sourceLoaderDataForTesting.toOriginal(member.function!.body!);
       if (_flowResult.functionBodiesThatDontComplete.contains(alias)) {
         result.add(_ReachabilityAssertion.doesNotComplete);
       }
@@ -83,7 +81,7 @@
   }
 
   @override
-  Set<_ReachabilityAssertion> computeNodeValue(Id id, TreeNode node) {
+  Set<_ReachabilityAssertion>? computeNodeValue(Id id, TreeNode node) {
     Set<_ReachabilityAssertion> result = {};
     TreeNode alias = _sourceLoaderDataForTesting.toOriginal(node);
     if (node is Expression && node.parent is ExpressionStatement) {
@@ -93,12 +91,12 @@
       // amount of redundancy in the test files.
       assert(_flowResult.unreachableNodes.contains(alias) ==
           _flowResult.unreachableNodes
-              .contains(_sourceLoaderDataForTesting.toOriginal(node.parent)));
+              .contains(_sourceLoaderDataForTesting.toOriginal(node.parent!)));
     } else if (_flowResult.unreachableNodes.contains(alias)) {
       result.add(_ReachabilityAssertion.unreachable);
     }
     if (node is FunctionDeclaration) {
-      Statement body = node.function.body;
+      Statement? body = node.function.body;
       if (body != null &&
           _flowResult.functionBodiesThatDontComplete
               .contains(_sourceLoaderDataForTesting.toOriginal(body))) {
@@ -120,12 +118,12 @@
 
   @override
   String getText(Set<_ReachabilityAssertion> actualData,
-          [String indentation]) =>
+          [String? indentation]) =>
       _sortedRepresentation(_toStrings(actualData));
 
   @override
-  String isAsExpected(
-      Set<_ReachabilityAssertion> actualData, String expectedData) {
+  String? isAsExpected(
+      Set<_ReachabilityAssertion> actualData, String? expectedData) {
     var actualStrings = _toStrings(actualData);
     var actualSorted = _sortedRepresentation(actualStrings);
     var expectedSorted = _sortedRepresentation(expectedData?.split(','));
@@ -139,7 +137,7 @@
   @override
   bool isEmpty(Set<_ReachabilityAssertion> actualData) => actualData.isEmpty;
 
-  String _sortedRepresentation(Iterable<String> values) {
+  String _sortedRepresentation(Iterable<String>? values) {
     var list = values == null || values.isEmpty ? ['none'] : values.toList();
     list.sort();
     return list.join(',');
diff --git a/pkg/front_end/test/id_tests/type_promotion_test.dart b/pkg/front_end/test/id_tests/type_promotion_test.dart
index fed4245..6aae1e8 100644
--- a/pkg/front_end/test/id_tests/type_promotion_test.dart
+++ b/pkg/front_end/test/id_tests/type_promotion_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
@@ -40,7 +38,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<DartType>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new TypePromotionDataExtractor(compilerResult, actualMap));
   }
 }
@@ -51,7 +49,7 @@
       : super(compilerResult, actualMap);
 
   @override
-  DartType computeNodeValue(Id id, TreeNode node) {
+  DartType? computeNodeValue(Id id, TreeNode node) {
     if (node is VariableGet) {
       return node.promotedType;
     }
@@ -63,11 +61,11 @@
   const _TypePromotionDataInterpreter();
 
   @override
-  String getText(DartType actualData, [String indentation]) =>
+  String getText(DartType actualData, [String? indentation]) =>
       typeToText(actualData, TypeRepresentation.analyzerNonNullableByDefault);
 
   @override
-  String isAsExpected(DartType actualData, String expectedData) {
+  String? isAsExpected(DartType actualData, String? expectedData) {
     if (getText(actualData) == expectedData) {
       return null;
     } else {
@@ -76,5 +74,5 @@
   }
 
   @override
-  bool isEmpty(DartType actualData) => actualData == null;
+  bool isEmpty(DartType? actualData) => actualData == null;
 }
diff --git a/pkg/front_end/test/id_tests/why_not_promoted_test.dart b/pkg/front_end/test/id_tests/why_not_promoted_test.dart
index ed82ac1..ca26b01 100644
--- a/pkg/front_end/test/id_tests/why_not_promoted_test.dart
+++ b/pkg/front_end/test/id_tests/why_not_promoted_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, Platform;
 
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
@@ -48,11 +46,11 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     MemberBuilderImpl memberBuilder =
-        lookupMemberBuilder(compilerResult, member);
+        lookupMemberBuilder(compilerResult, member) as MemberBuilderImpl;
     member.accept(new WhyNotPromotedDataExtractor(compilerResult, actualMap,
-        memberBuilder.dataForTesting.inferenceData.flowAnalysisResult));
+        memberBuilder.dataForTesting!.inferenceData.flowAnalysisResult));
   }
 }
 
@@ -64,8 +62,8 @@
       : super(compilerResult, actualMap);
 
   @override
-  String computeNodeValue(Id id, TreeNode node) {
-    String nonPromotionReason = _flowResult.nonPromotionReasons[node];
+  String? computeNodeValue(Id id, TreeNode node) {
+    String? nonPromotionReason = _flowResult.nonPromotionReasons[node];
     if (nonPromotionReason != null) {
       return 'notPromoted($nonPromotionReason)';
     }
@@ -77,10 +75,10 @@
   const _WhyNotPromotedDataInterpreter();
 
   @override
-  String getText(String actualData, [String indentation]) => actualData;
+  String getText(String actualData, [String? indentation]) => actualData;
 
   @override
-  String isAsExpected(String actualData, String expectedData) {
+  String? isAsExpected(String actualData, String? expectedData) {
     if (actualData == expectedData) {
       return null;
     } else {
@@ -89,5 +87,5 @@
   }
 
   @override
-  bool isEmpty(String actualData) => actualData == null;
+  bool isEmpty(String? actualData) => actualData == null;
 }
diff --git a/pkg/front_end/test/incremental_bulk_compiler_full.dart b/pkg/front_end/test/incremental_bulk_compiler_full.dart
index 61b3899..9edfd97 100644
--- a/pkg/front_end/test/incremental_bulk_compiler_full.dart
+++ b/pkg/front_end/test/incremental_bulk_compiler_full.dart
@@ -2,22 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:expect/expect.dart' show Expect;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart'
     show CompilerOptions, DiagnosticMessage;
 
 import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
-    show IncrementalKernelGenerator;
+    show IncrementalCompilerResult, IncrementalKernelGenerator;
 
 import 'package:front_end/src/compute_platform_binaries_location.dart'
     show computePlatformBinariesLocation;
 
-import 'package:front_end/src/fasta/incremental_compiler.dart'
-    show IncrementalCompiler;
-
 import 'package:kernel/kernel.dart' show Component;
 
 import 'package:kernel/text/ast_to_text.dart'
@@ -49,7 +44,7 @@
     return result;
   }
 
-  IncrementalCompiler compiler;
+  IncrementalKernelGenerator? compiler;
 }
 
 CompilerOptions getOptions() {
@@ -78,25 +73,27 @@
 
     // "One shot compile"
     bool oneShotFailed = false;
-    List<int> oneShotSerialized;
+    late List<int> oneShotSerialized;
     try {
-      IncrementalCompiler compiler =
+      IncrementalKernelGenerator compiler =
           new IncrementalKernelGenerator(getOptions(), uri);
-      oneShotSerialized = util.postProcess(await compiler.computeDelta());
+      oneShotSerialized =
+          util.postProcess((await compiler.computeDelta()).component);
     } catch (e) {
       oneShotFailed = true;
     }
 
     // Bulk
     bool bulkFailed = false;
-    List<int> bulkSerialized;
+    late List<int> bulkSerialized;
     try {
       globalDebuggingNames = new NameSystem();
       if (context.compiler == null) {
         context.compiler = new IncrementalKernelGenerator(getOptions(), uri);
       }
-      Component bulkCompiledComponent = await context.compiler
+      IncrementalCompilerResult compilerResult = await context.compiler!
           .computeDelta(entryPoints: [uri], fullComponent: true);
+      Component bulkCompiledComponent = compilerResult.component;
       bulkSerialized = util.postProcess(bulkCompiledComponent);
     } catch (e) {
       bulkFailed = true;
@@ -105,14 +102,15 @@
 
     // Compile again - the serialized output should be the same.
     bool bulk2Failed = false;
-    List<int> bulkSerialized2;
+    late List<int> bulkSerialized2;
     try {
       globalDebuggingNames = new NameSystem();
       if (context.compiler == null) {
         context.compiler = new IncrementalKernelGenerator(getOptions(), uri);
       }
-      Component bulkCompiledComponent = await context.compiler
+      IncrementalCompilerResult compilerResult = await context.compiler!
           .computeDelta(entryPoints: [uri], fullComponent: true);
+      Component bulkCompiledComponent = compilerResult.component;
       bulkSerialized2 = util.postProcess(bulkCompiledComponent);
     } catch (e) {
       bulk2Failed = true;
diff --git a/pkg/front_end/test/incremental_bulk_compiler_smoke_suite.dart b/pkg/front_end/test/incremental_bulk_compiler_smoke_suite.dart
index 03993a7..b60f41c 100644
--- a/pkg/front_end/test/incremental_bulk_compiler_smoke_suite.dart
+++ b/pkg/front_end/test/incremental_bulk_compiler_smoke_suite.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:testing/testing.dart' show Chain, runMe;
 
 import 'incremental_bulk_compiler_full.dart' show Context;
diff --git a/pkg/front_end/test/incremental_compiler_leak_tester.dart b/pkg/front_end/test/incremental_compiler_leak_tester.dart
index a9f3b81..d05460b 100644
--- a/pkg/front_end/test/incremental_compiler_leak_tester.dart
+++ b/pkg/front_end/test/incremental_compiler_leak_tester.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 import 'dart:async';
 import 'dart:io';
 
@@ -29,12 +27,12 @@
   @override
   Future<void> run() async {
     vmService.VM vm = await serviceClient.getVM();
-    if (vm.isolates.length != 1) {
-      throw "Expected 1 isolate, got ${vm.isolates.length}";
+    if (vm.isolates!.length != 1) {
+      throw "Expected 1 isolate, got ${vm.isolates!.length}";
     }
-    vmService.IsolateRef isolateRef = vm.isolates.single;
-    await waitUntilIsolateIsRunnable(isolateRef.id);
-    await serviceClient.resume(isolateRef.id);
+    vmService.IsolateRef isolateRef = vm.isolates!.single;
+    await waitUntilIsolateIsRunnable(isolateRef.id!);
+    await serviceClient.resume(isolateRef.id!);
 
     Map<vmService.ClassRef, List<int>> instanceCounts =
         new Map<vmService.ClassRef, List<int>>();
@@ -76,12 +74,12 @@
       Map<vmService.ClassRef, vmService.Class> classInfo) {
     bool foundLeak = false;
     for (vmService.ClassRef c in instanceCounts.keys) {
-      List<int> listOfInstanceCounts = instanceCounts[c];
+      List<int> listOfInstanceCounts = instanceCounts[c]!;
 
       // Ignore VM internal stuff like "PatchClass", "PcDescriptors" etc.
       // (they don't have a url).
-      vmService.Class classDetails = classInfo[c];
-      String uriString = classDetails.location?.script?.uri;
+      vmService.Class classDetails = classInfo[c]!;
+      String? uriString = classDetails.location?.script?.uri;
       if (uriString == null) continue;
 
       // For now ignore anything not in package:kernel or package:front_end.
@@ -136,30 +134,30 @@
     try {
       while (true) {
         if (shouldBail(iterationNumber)) break;
-        if (!await waitUntilPaused(isolateRef.id)) break;
+        if (!await waitUntilPaused(isolateRef.id!)) break;
         print("\n\n====================\n\nIteration #$iterationNumber");
         iterationNumber++;
         vmService.AllocationProfile allocationProfile =
-            await forceGC(isolateRef.id);
-        for (vmService.ClassHeapStats member in allocationProfile.members) {
+            await forceGC(isolateRef.id!);
+        for (vmService.ClassHeapStats member in allocationProfile.members!) {
           if (!classInfo.containsKey(member.classRef)) {
-            vmService.Class c = await serviceClient.getObject(
-                isolateRef.id, member.classRef.id);
-            classInfo[member.classRef] = c;
+            vmService.Class c = (await serviceClient.getObject(
+                isolateRef.id!, member.classRef!.id!)) as vmService.Class;
+            classInfo[member.classRef!] = c;
           }
-          List<int> listOfInstanceCounts = instanceCounts[member.classRef];
+          List<int>? listOfInstanceCounts = instanceCounts[member.classRef];
           if (listOfInstanceCounts == null) {
-            listOfInstanceCounts = instanceCounts[member.classRef] = <int>[];
+            listOfInstanceCounts = instanceCounts[member.classRef!] = <int>[];
           }
           while (listOfInstanceCounts.length < iterationNumber - 2) {
             listOfInstanceCounts.add(0);
           }
-          listOfInstanceCounts.add(member.instancesCurrent);
+          listOfInstanceCounts.add(member.instancesCurrent!);
           if (listOfInstanceCounts.length != iterationNumber - 1) {
             throw "Unexpected length";
           }
         }
-        await serviceClient.resume(isolateRef.id);
+        await serviceClient.resume(isolateRef.id!);
       }
     } catch (e) {
       print("Got error: $e");
@@ -173,7 +171,7 @@
   }
 
   bool ignoredClass(vmService.Class classDetails) {
-    String uriString = classDetails.location?.script?.uri;
+    String? uriString = classDetails.location?.script?.uri;
     if (uriString == null) return true;
     if (uriString.startsWith("package:front_end/")) {
       // Classes used for lazy initialization will naturally fluctuate.
@@ -210,7 +208,7 @@
       // naturally increase, e.g. we can get 2 more booleans every time (up to
       // a maximum of 2 per library or however many would have been there if we
       // didn't canonicalize at all).
-      if (classDetails.name.endsWith("Constant")) return true;
+      if (classDetails.name!.endsWith("Constant")) return true;
 
       // These classes have proved to fluctuate, although the reason is less
       // clear.
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 f4b0342..9c67a7c 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
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, File;
 
 import 'package:expect/expect.dart' show Expect;
@@ -20,7 +18,7 @@
 import 'incremental_suite.dart'
     show checkIsEqual, getOptions, initializedCompile, normalCompile;
 
-Directory outDir;
+late Directory outDir;
 
 Future<void> main() async {
   outDir =
@@ -64,10 +62,10 @@
         .readComponent(c);
     for (Uri uri in c.uriToSource.keys) {
       if (cSdk.uriToSource.containsKey(uri)) {
-        if ((c.uriToSource[uri].source?.length ?? 0) != 0) {
+        if (c.uriToSource[uri]!.source.length != 0) {
           throw "Compile contained sources for the sdk $uri";
         }
-        if ((c.uriToSource[uri].lineStarts?.length ?? 0) != 0) {
+        if ((c.uriToSource[uri]!.lineStarts?.length ?? 0) != 0) {
           throw "Compile contained line starts for the sdk $uri";
         }
       }
@@ -80,8 +78,8 @@
     [normalDill, true],
     [nonexisting, false],
   ]) {
-    Uri initializeWith = initializationData[0];
-    bool initializeExpect = initializationData[1];
+    Uri initializeWith = initializationData[0] as Uri;
+    bool initializeExpect = initializationData[1] as bool;
     stopwatch.reset();
     bool initializeResult = await initializedCompile(
         dart2jsUrl, fullDillFromInitialized, initializeWith, [invalidateUri],
@@ -135,16 +133,16 @@
         visitor.matchNamedNodes, visitor.checkNodes, 'procedures');
   }
 
-  bool _isMixinOrCloneReference(EquivalenceVisitor visitor, Reference a,
-      Reference b, String propertyName) {
+  bool _isMixinOrCloneReference(EquivalenceVisitor visitor, Reference? a,
+      Reference? b, String propertyName) {
     if (a != null && b != null) {
-      ReferenceName thisName = ReferenceName.fromReference(a);
-      ReferenceName otherName = ReferenceName.fromReference(b);
-      if (thisName.kind == ReferenceNameKind.Member &&
-          otherName.kind == ReferenceNameKind.Member &&
+      ReferenceName thisName = ReferenceName.fromReference(a)!;
+      ReferenceName otherName = ReferenceName.fromReference(b)!;
+      if (thisName.isMember &&
+          otherName.isMember &&
           thisName.memberName == otherName.memberName) {
-        String thisClassName = thisName.declarationName;
-        String otherClassName = otherName.declarationName;
+        String? thisClassName = thisName.declarationName;
+        String? otherClassName = otherName.declarationName;
         if (thisClassName != null &&
             otherClassName != null &&
             thisClassName.contains('&${otherClassName}')) {
diff --git a/pkg/front_end/test/incremental_dart2js_test.dart b/pkg/front_end/test/incremental_dart2js_test.dart
index 3a36586..d133437 100644
--- a/pkg/front_end/test/incremental_dart2js_test.dart
+++ b/pkg/front_end/test/incremental_dart2js_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import "incremental_dart2js_tester.dart";
 
 Future<void> main(List<String> args) async {
diff --git a/pkg/front_end/test/incremental_dart2js_tester.dart b/pkg/front_end/test/incremental_dart2js_tester.dart
index 3428af3..59add48 100644
--- a/pkg/front_end/test/incremental_dart2js_tester.dart
+++ b/pkg/front_end/test/incremental_dart2js_tester.dart
@@ -2,13 +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.
 
-// @dart = 2.9
-
 import "dart:developer";
 import 'dart:io' show Platform;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart';
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
+
 import 'package:front_end/src/fasta/kernel/utils.dart';
 
 import 'package:kernel/kernel.dart'
@@ -49,9 +50,9 @@
   final int limit;
 
   Stopwatch stopwatch = new Stopwatch();
-  List<int> firstCompileData;
-  Map<Uri, List<int>> libToData;
-  List<Uri> uris;
+  late List<int> firstCompileData;
+  late Map<Uri, List<int>> libToData;
+  late List<Uri> uris;
 
   List<Uri> diffs = <Uri>[];
   Set<Uri> componentUris = new Set<Uri>();
@@ -91,11 +92,14 @@
     print("Invalidating $uri ($i)");
     compiler.invalidate(uri);
     localStopwatch.reset();
-    Component c2 = await compiler.computeDelta(fullComponent: true);
+    IncrementalCompilerResult compilerResult =
+        await compiler.computeDelta(fullComponent: true);
+    Component c2 = compilerResult.component;
     print("Recompiled in ${localStopwatch.elapsedMilliseconds} ms");
     print("invalidatedImportUrisForTesting: "
-        "${compiler.invalidatedImportUrisForTesting}");
-    print("rebuildBodiesCount: ${compiler.rebuildBodiesCount}");
+        "${compiler.recorderForTesting.invalidatedImportUrisForTesting}");
+    print("rebuildBodiesCount: "
+        "${compiler.recorderForTesting.rebuildBodiesCount}");
     localStopwatch.reset();
     Set<Uri> thisUris = new Set<Uri>.from(c2.libraries.map((l) => l.importUri));
     if (componentUris.isNotEmpty) {
@@ -136,7 +140,7 @@
 
         List<int> libSerialized =
             serializeComponent(c2, filter: (l) => l == library);
-        if (!isEqual(libToData[library.importUri], libSerialized)) {
+        if (!isEqual(libToData[library.importUri]!, libSerialized)) {
           print("=====");
           print("=====");
           print("=====");
@@ -182,7 +186,8 @@
         .alternativeInvalidationStrategy] = useExperimentalInvalidation;
     helper.TestIncrementalCompiler compiler =
         new helper.TestIncrementalCompiler(options, input);
-    Component c = await compiler.computeDelta();
+    IncrementalCompilerResult compilerResult = await compiler.computeDelta();
+    Component? c = compilerResult.component;
     print("Compiled dart2js to Component with ${c.libraries.length} libraries "
         "in ${stopwatch.elapsedMilliseconds} ms.");
     stopwatch.reset();
@@ -213,8 +218,9 @@
     stopwatch.reset();
 
     uris = c.uriToSource.values
-        .map((s) => s != null ? s.importUri : null)
-        .where((u) => u != null && u.scheme != "dart")
+        .map((s) => s.importUri)
+        .whereType<Uri>()
+        .where((u) => u.scheme != "dart")
         .toSet()
         .toList();
 
diff --git a/pkg/front_end/test/incremental_flutter_tester.dart b/pkg/front_end/test/incremental_flutter_tester.dart
index 3663d30..4a745aa 100644
--- a/pkg/front_end/test/incremental_flutter_tester.dart
+++ b/pkg/front_end/test/incremental_flutter_tester.dart
@@ -2,13 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, File, exit;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart'
     show CompilerOptions, DiagnosticMessage;
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
 
 import 'package:front_end/src/fasta/kernel/utils.dart' show serializeComponent;
 
@@ -32,7 +32,7 @@
 
 import "incremental_utils.dart" as util;
 
-void usage(String extraMessage) {
+Never usage(String extraMessage) {
   print("""Usage as something like:
     out/ReleaseX64/dart pkg/front_end/test/incremental_flutter_tester.dart \
       --fast --experimental \
@@ -49,8 +49,8 @@
 Future<void> main(List<String> args) async {
   bool fast = false;
   bool useExperimentalInvalidation = false;
-  File inputFile;
-  Directory flutterPatchedSdk;
+  File? inputFile;
+  Directory? flutterPatchedSdk;
   for (String arg in args) {
     if (arg == "--fast") {
       fast = true;
@@ -84,12 +84,13 @@
       .alternativeInvalidationStrategy] = useExperimentalInvalidation;
   helper.TestIncrementalCompiler compiler =
       new helper.TestIncrementalCompiler(options, inputFile.uri);
-  Component c = await compiler.computeDelta();
+  IncrementalCompilerResult compilerResult = await compiler.computeDelta();
+  Component? c = compilerResult.component;
   print("Compiled to Component with ${c.libraries.length} "
       "libraries in ${stopwatch.elapsedMilliseconds} ms.");
   stopwatch.reset();
-  List<int> firstCompileData;
-  Map<Uri, List<int>> libToData;
+  late List<int> firstCompileData;
+  late Map<Uri, List<int>> libToData;
   if (fast) {
     libToData = {};
     c.libraries.sort((l1, l2) {
@@ -117,8 +118,9 @@
   stopwatch.reset();
 
   List<Uri> uris = c.uriToSource.values
-      .map((s) => s != null ? s.importUri : null)
-      .where((u) => u != null && u.scheme != "dart")
+      .map((s) => s.importUri)
+      .whereType<Uri>()
+      .where((u) => u.scheme != "dart")
       .toSet()
       .toList();
 
@@ -133,11 +135,14 @@
     print("Invalidating $uri ($i)");
     compiler.invalidate(uri);
     localStopwatch.reset();
-    Component c2 = await compiler.computeDelta(fullComponent: true);
+    IncrementalCompilerResult compilerResult =
+        await compiler.computeDelta(fullComponent: true);
+    Component c2 = compilerResult.component;
     print("Recompiled in ${localStopwatch.elapsedMilliseconds} ms");
     print("invalidatedImportUrisForTesting: "
-        "${compiler.invalidatedImportUrisForTesting}");
-    print("rebuildBodiesCount: ${compiler.rebuildBodiesCount}");
+        "${compiler.recorderForTesting.invalidatedImportUrisForTesting}");
+    print("rebuildBodiesCount: "
+        "${compiler.recorderForTesting.rebuildBodiesCount}");
     localStopwatch.reset();
     Set<Uri> thisUris = new Set<Uri>.from(c2.libraries.map((l) => l.importUri));
     if (componentUris.isNotEmpty) {
@@ -179,7 +184,7 @@
 
         List<int> libSerialized =
             serializeComponent(c2, filter: (l) => l == library);
-        if (!isEqual(libToData[library.importUri], libSerialized)) {
+        if (!isEqual(libToData[library.importUri]!, libSerialized)) {
           print("=====");
           print("=====");
           print("=====");
@@ -285,12 +290,12 @@
 
 class PrinterPrime extends Printer {
   PrinterPrime(StringSink sink,
-      {NameSystem syntheticNames,
+      {NameSystem? syntheticNames,
       bool showOffsets: false,
       bool showMetadata: false,
-      ImportTable importTable,
-      Annotator annotator,
-      Map<String, MetadataRepository<Object>> metadata})
+      ImportTable? importTable,
+      Annotator? annotator,
+      Map<String, MetadataRepository<dynamic>>? metadata})
       : super(sink,
             showOffsets: showOffsets,
             showMetadata: showMetadata,
@@ -300,7 +305,7 @@
 
   @override
   PrinterPrime createInner(ImportTable importTable,
-      Map<String, MetadataRepository<Object>> metadata) {
+      Map<String, MetadataRepository<dynamic>>? metadata) {
     return new PrinterPrime(sink,
         importTable: importTable,
         metadata: metadata,
@@ -311,7 +316,7 @@
   }
 
   @override
-  void writeInterfaceTarget(Name name, Reference target) {
+  void writeInterfaceTarget(Name name, Reference? target) {
     // Skipped!
   }
 }
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 ac40f6e..8280c8d 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
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show File;
 
 import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
@@ -19,6 +17,9 @@
 import 'package:front_end/src/api_prototype/experimental_flags.dart'
     show ExperimentalFlag;
 
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
+
 import "package:front_end/src/api_prototype/memory_file_system.dart"
     show MemoryFileSystem;
 
@@ -41,7 +42,7 @@
         codeInitializeFromDillUnknownProblemNoDump;
 
 import 'package:front_end/src/fasta/incremental_compiler.dart'
-    show IncrementalCompiler;
+    show IncrementalCompiler, RecorderForTesting;
 
 import 'package:front_end/src/fasta/kernel/utils.dart' show serializeComponent;
 
@@ -57,21 +58,21 @@
 }
 
 class Tester {
-  Uri sdkRoot;
-  Uri base;
-  Uri sdkSummary;
-  Uri initializeFrom;
-  Uri helperFile;
-  Uri helper2File;
-  Uri entryPoint;
-  Uri entryPointImportDartFoo;
-  Uri platformUri;
-  List<int> sdkSummaryData;
-  List<DiagnosticMessage> errorMessages;
-  List<DiagnosticMessage> warningMessages;
-  MemoryFileSystem fs;
-  CompilerOptions options;
-  IncrementalCompiler compiler;
+  late Uri sdkRoot;
+  late Uri base;
+  late Uri sdkSummary;
+  late Uri initializeFrom;
+  late Uri helperFile;
+  late Uri helper2File;
+  late Uri entryPoint;
+  late Uri entryPointImportDartFoo;
+  late Uri platformUri;
+  late List<int> sdkSummaryData;
+  late List<DiagnosticMessage> errorMessages;
+  late List<DiagnosticMessage> warningMessages;
+  late MemoryFileSystem fs;
+  late CompilerOptions options;
+  late IncrementalCompiler compiler;
 
   Future<void> compileExpectInitializeFailAndSpecificWarning(
       Code expectedWarningCode, bool writeFileOnCrashReport) async {
@@ -83,7 +84,7 @@
             new ProcessedOptions(options: options, inputs: [entryPoint])),
         initializeFrom);
     await compiler.computeDelta();
-    if (compiler.initializedFromDill) {
+    if (compiler.initializedFromDillForTesting) {
       Expect.fail("Expected to not be able to initialized from dill, but did.");
     }
     if (errorMessages.isNotEmpty) {
@@ -108,11 +109,12 @@
         new CompilerContext(
             new ProcessedOptions(options: options, inputs: [compileThis])),
         initializeFrom);
-    Component component = await compiler.computeDelta();
+    IncrementalCompilerResult compilerResult = await compiler.computeDelta();
+    Component component = compilerResult.component;
 
-    if (compiler.initializedFromDill != initializedFromDill) {
+    if (compiler.initializedFromDillForTesting != initializedFromDill) {
       Expect.fail("Expected initializedFromDill to be $initializedFromDill "
-          "but was ${compiler.initializedFromDill}");
+          "but was ${compiler.initializedFromDillForTesting}");
     }
     if (errorMessages.isNotEmpty) {
       Expect.fail("Got unexpected errors: " + joinMessages(errorMessages));
@@ -183,7 +185,9 @@
             new ProcessedOptions(options: options, inputs: [entryPoint])),
         initializeFrom);
 
-    Component componentGood = await compiler.computeDelta();
+    IncrementalCompilerResult compilerGoodResult =
+        await compiler.computeDelta();
+    Component componentGood = compilerGoodResult.component;
     List<int> dataGood = serializeComponent(componentGood);
     fs.entityForUri(initializeFrom).writeAsBytesSync(dataGood);
 
@@ -193,7 +197,9 @@
         new CompilerContext(
             new ProcessedOptions(options: options, inputs: [helper2File])),
         initializeFrom);
-    Component componentHelper = await compiler.computeDelta();
+    IncrementalCompilerResult compilerHelperResult =
+        await compiler.computeDelta();
+    Component componentHelper = compilerHelperResult.component;
     Library helper2Lib = componentHelper.libraries
         .firstWhere((lib) => lib.importUri == helper2File);
     helper2Lib.importUri = new Uri(scheme: "dart", path: "foo");
@@ -216,7 +222,8 @@
 
     // Create a partial dill file.
     compiler.invalidate(entryPoint);
-    component = await compiler.computeDelta();
+    IncrementalCompilerResult compilerResult = await compiler.computeDelta();
+    component = compilerResult.component;
     if (component.libraries.length != 1) {
       Expect.fail("Expected 1 library, got ${component.libraries.length}: "
           "${component.libraries}");
@@ -248,7 +255,7 @@
     List<int> mixedPart1;
     {
       // Create a component that is compiled without NNBD.
-      Map<ExperimentalFlag, bool> prevTesting =
+      Map<ExperimentalFlag, bool>? prevTesting =
           options.defaultExperimentFlagsForTesting;
       options.defaultExperimentFlagsForTesting = {
         ExperimentalFlag.nonNullable: false
@@ -259,7 +266,9 @@
           new CompilerContext(
               new ProcessedOptions(options: options, inputs: [helper2File])),
           null);
-      Component c = await compiler.computeDelta();
+
+      IncrementalCompilerResult result = await compiler.computeDelta();
+      Component c = result.component;
       c.setMainMethodAndMode(
           null, false, NonNullableByDefaultCompiledMode.Weak);
       mixedPart1 = serializeComponent(c);
@@ -270,7 +279,7 @@
     List<int> mixedPart2;
     {
       // Create a component that is compiled with strong NNBD.
-      Map<ExperimentalFlag, bool> prevTesting =
+      Map<ExperimentalFlag, bool>? prevTesting =
           options.defaultExperimentFlagsForTesting;
       options.defaultExperimentFlagsForTesting = {
         ExperimentalFlag.nonNullable: true
@@ -281,7 +290,8 @@
           new CompilerContext(
               new ProcessedOptions(options: options, inputs: [helperFile])),
           null);
-      Component c = await compiler.computeDelta();
+      IncrementalCompilerResult result = await compiler.computeDelta();
+      Component c = result.component;
       c.setMainMethodAndMode(
           null, false, NonNullableByDefaultCompiledMode.Strong);
       mixedPart2 = serializeComponent(c);
@@ -302,11 +312,19 @@
 
 class DeleteTempFilesIncrementalCompiler extends IncrementalCompiler {
   DeleteTempFilesIncrementalCompiler(CompilerContext context,
-      [Uri initializeFromDillUri])
+      [Uri? initializeFromDillUri])
       : super(context, initializeFromDillUri);
 
   @override
-  void recordTemporaryFileForTesting(Uri uri) {
+  final RecorderForTesting recorderForTesting =
+      const DeleteTempFilesRecorderForTesting();
+}
+
+class DeleteTempFilesRecorderForTesting extends RecorderForTesting {
+  const DeleteTempFilesRecorderForTesting();
+
+  @override
+  void recordTemporaryFile(Uri uri) {
     File f = new File.fromUri(uri);
     if (f.existsSync()) f.deleteSync();
   }
diff --git a/pkg/front_end/test/incremental_suite.dart b/pkg/front_end/test/incremental_suite.dart
index 2ce5c81..7c07a6a 100644
--- a/pkg/front_end/test/incremental_suite.dart
+++ b/pkg/front_end/test/incremental_suite.dart
@@ -24,7 +24,8 @@
 
 import 'package:front_end/src/api_prototype/experimental_flags.dart'
     show ExperimentalFlag, experimentEnabledVersion;
-
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
 import "package:front_end/src/api_prototype/memory_file_system.dart"
     show MemoryFileSystem, MemoryFileSystemEntity;
 
@@ -42,7 +43,7 @@
     show DiagnosticMessageFromJson, FormattedMessage;
 
 import 'package:front_end/src/fasta/incremental_compiler.dart'
-    show IncrementalCompiler;
+    show IncrementalCompiler, RecorderForTesting;
 
 import 'package:front_end/src/fasta/incremental_serializer.dart'
     show IncrementalSerializer;
@@ -304,7 +305,8 @@
     final List<int> sdkSummaryData,
     Target target,
     Target originalTarget,
-    String sdkSummary) async {
+    String sdkSummary,
+    {required bool trackNeededDillLibraries}) async {
   final Uri base = Uri.parse("org-dartlang-test:///");
   final Uri sdkSummaryUri = base.resolve(sdkSummary);
 
@@ -355,7 +357,10 @@
     }
     TestIncrementalCompiler compiler = new TestIncrementalCompiler(
         options, moduleSources.first, /* initializeFrom = */ null, outlineOnly);
-    Component c = await compiler.computeDelta(entryPoints: moduleSources);
+    IncrementalCompilerResult compilerResult = await compiler.computeDelta(
+        entryPoints: moduleSources,
+        trackNeededDillLibraries: trackNeededDillLibraries);
+    Component c = compilerResult.component;
     c.computeCanonicalNames();
     List<Library> wantedLibs = <Library>[];
     for (Library lib in c.libraries) {
@@ -452,7 +457,8 @@
 
     if (modules != null) {
       moduleData = await createModules(
-          modules, sdkSummaryData, target, originalTarget, sdkSummary);
+          modules, sdkSummaryData, target, originalTarget, sdkSummary,
+          trackNeededDillLibraries: false);
       sdk = newestWholeComponent = new Component();
       new BinaryBuilder(sdkSummaryData,
               filename: null, disableLazyReading: false)
@@ -660,15 +666,16 @@
       if (modulesToUse != null) {
         compiler!.setModulesToLoadOnNextComputeDelta(modulesToUse);
         compiler.invalidateAllSources();
-        compiler.trackNeededDillLibraries = true;
       }
 
       Stopwatch stopwatch = new Stopwatch()..start();
-      component = await compiler!.computeDelta(
+      IncrementalCompilerResult compilerResult = await compiler!.computeDelta(
           entryPoints: entries,
           fullComponent:
               brandNewWorld ? false : (noFullComponent ? false : true),
+          trackNeededDillLibraries: modulesToUse != null,
           simulateTransformer: world["simulateTransformer"]);
+      component = compilerResult.component;
       if (outlineOnly && !skipOutlineBodyCheck) {
         for (Library lib in component!.libraries) {
           for (Class c in lib.classes) {
@@ -722,7 +729,7 @@
       Result? contentResult = checkExpectedContent(world, component!);
       if (contentResult != null) return contentResult.copyWithOutput(data);
       result = checkNeededDillLibraries(
-          world, data, compiler.neededDillLibraries, base);
+          world, data, compilerResult.neededDillLibraries, base);
       if (result != null) return result;
 
       Result? nnbdCheck = checkNNBDSettings(component!);
@@ -794,8 +801,7 @@
       result = checkExpectFile(data, worldNum, "", context, actualSerialized);
       if (result != null) return result;
       if (world["skipClassHierarchyTest"] != true) {
-        result =
-            checkClassHierarchy(compiler, component!, data, worldNum, context);
+        result = checkClassHierarchy(compilerResult, data, worldNum, context);
         if (result != null) return result;
       }
 
@@ -844,7 +850,8 @@
       }
 
       if (world["expectsRebuildBodiesOnly"] != null) {
-        bool didRebuildBodiesOnly = compiler.rebuildBodiesCount! > 0;
+        bool didRebuildBodiesOnly =
+            compiler.recorderForTesting.rebuildBodiesCount! > 0;
         if (world["expectsRebuildBodiesOnly"] != didRebuildBodiesOnly) {
           return new Result<TestData>(
               data,
@@ -872,19 +879,20 @@
           }
         }
       }
-      if (compiler.initializedFromDill != expectInitializeFromDill) {
+      if (compiler.initializedFromDillForTesting != expectInitializeFromDill) {
         return new Result<TestData>(
             data,
             InitializedFromDillMismatch,
             "Expected that initializedFromDill would be "
             "$expectInitializeFromDill but was "
-            "${compiler.initializedFromDill}");
+            "${compiler.initializedFromDillForTesting}");
       }
 
-      if (incrementalSerialization == true && compiler.initializedFromDill) {
-        Expect.isTrue(compiler.initializedIncrementalSerializer);
+      if (incrementalSerialization == true &&
+          compiler.initializedFromDillForTesting) {
+        Expect.isTrue(compiler.initializedIncrementalSerializerForTesting);
       } else {
-        Expect.isFalse(compiler.initializedIncrementalSerializer);
+        Expect.isFalse(compiler.initializedIncrementalSerializerForTesting);
       }
 
       if (world["checkInvalidatedFiles"] != false) {
@@ -934,10 +942,11 @@
 
       if (!noFullComponent) {
         clearPrevErrorsEtc();
-        component2 = await compiler.computeDelta(
+        IncrementalCompilerResult compilerResult2 = await compiler.computeDelta(
             entryPoints: entries,
             fullComponent: true,
             simulateTransformer: world["simulateTransformer"]);
+        component2 = compilerResult2.component;
         Result<TestData>? result = performErrorAndWarningCheck(world, data,
             gotError, formattedErrors, gotWarning, formattedWarnings);
         if (result != null) return result;
@@ -1043,13 +1052,15 @@
         if (modulesToUse != null) {
           compilerFromScratch.setModulesToLoadOnNextComputeDelta(modulesToUse);
           compilerFromScratch.invalidateAllSources();
-          compilerFromScratch.trackNeededDillLibraries = true;
         }
 
         Stopwatch stopwatch = new Stopwatch()..start();
-        component3 = await compilerFromScratch.computeDelta(
-            entryPoints: entries,
-            simulateTransformer: world["simulateTransformer"]);
+        IncrementalCompilerResult compilerResult3 =
+            await compilerFromScratch.computeDelta(
+                entryPoints: entries,
+                trackNeededDillLibraries: modulesToUse != null,
+                simulateTransformer: world["simulateTransformer"]);
+        component3 = compilerResult3.component;
         compilerFromScratch = null;
         Result<TestData>? result = performErrorAndWarningCheck(world, data,
             gotError, formattedErrors, gotWarning, formattedWarnings);
@@ -1183,10 +1194,10 @@
 ///
 /// This has the option to do expect files, but it's disabled by default
 /// while we're trying to figure out if it's useful or not.
-Result<TestData>? checkClassHierarchy(TestIncrementalCompiler compiler,
-    Component component, TestData data, int worldNum, Context context,
+Result<TestData>? checkClassHierarchy(IncrementalCompilerResult compilerResult,
+    TestData data, int worldNum, Context context,
     {bool checkExpectFile: false}) {
-  ClassHierarchy? classHierarchy = compiler.getClassHierarchy();
+  ClassHierarchy? classHierarchy = compilerResult.classHierarchy;
   if (classHierarchy is! ClosedWorldClassHierarchy) {
     return new Result<TestData>(
         data,
@@ -1206,6 +1217,7 @@
     classHierarchyMap[info.classNode] = info;
   }
 
+  Component component = compilerResult.component;
   StringBuffer sb = new StringBuffer();
   for (Library library in component.libraries) {
     if (library.importUri.scheme == "dart") continue;
@@ -1764,7 +1776,7 @@
   List<int> bytes =
       await normalCompileToBytes(input, options: options, compiler: compiler);
   new File.fromUri(output).writeAsBytesSync(bytes);
-  return compiler.initializedFromDill;
+  return compiler.initializedFromDillForTesting;
 }
 
 Future<List<int>> normalCompileToBytes(Uri input,
@@ -1787,7 +1799,7 @@
     {CompilerOptions? options, IncrementalCompiler? compiler}) async {
   options ??= getOptions();
   compiler ??= new TestIncrementalCompiler(options, input);
-  return await compiler.computeDelta();
+  return (await compiler.computeDelta()).component;
 }
 
 Future<bool> initializedCompile(
@@ -1799,10 +1811,12 @@
   for (Uri invalidateUri in invalidateUris) {
     compiler.invalidate(invalidateUri);
   }
-  Component initializedComponent = await compiler.computeDelta();
+  IncrementalCompilerResult initializedCompilerResult =
+      await compiler.computeDelta();
+  Component initializedComponent = initializedCompilerResult.component;
   util.throwOnEmptyMixinBodies(initializedComponent);
   await util.throwOnInsufficientUriToSource(initializedComponent);
-  bool result = compiler.initializedFromDill;
+  bool result = compiler.initializedFromDillForTesting;
   new File.fromUri(output)
       .writeAsBytesSync(util.postProcess(initializedComponent));
   int actuallyInvalidatedCount = compiler
@@ -1814,8 +1828,9 @@
         "got $actuallyInvalidatedCount");
   }
 
-  Component initializedFullComponent =
+  IncrementalCompilerResult initializedFullCompilerResult =
       await compiler.computeDelta(fullComponent: true);
+  Component initializedFullComponent = initializedFullCompilerResult.component;
   util.throwOnEmptyMixinBodies(initializedFullComponent);
   await util.throwOnInsufficientUriToSource(initializedFullComponent);
   Expect.equals(initializedComponent.libraries.length,
@@ -1827,7 +1842,8 @@
     compiler.invalidate(invalidateUri);
   }
 
-  Component partialComponent = await compiler.computeDelta();
+  IncrementalCompilerResult partialResult = await compiler.computeDelta();
+  Component partialComponent = partialResult.component;
   util.throwOnEmptyMixinBodies(partialComponent);
   await util.throwOnInsufficientUriToSource(partialComponent);
   actuallyInvalidatedCount = (compiler
@@ -1839,7 +1855,8 @@
         "got $actuallyInvalidatedCount");
   }
 
-  Component emptyComponent = await compiler.computeDelta();
+  IncrementalCompilerResult emptyResult = await compiler.computeDelta();
+  Component emptyComponent = emptyResult.component;
   util.throwOnEmptyMixinBodies(emptyComponent);
   await util.throwOnInsufficientUriToSource(emptyComponent);
 
@@ -1860,8 +1877,9 @@
 }
 
 class TestIncrementalCompiler extends IncrementalCompiler {
-  Set<Uri>? invalidatedImportUrisForTesting;
-  int? rebuildBodiesCount;
+  @override
+  final TestRecorderForTesting recorderForTesting =
+      new TestRecorderForTesting();
   final Uri entryPoint;
 
   /// Filter out the automatically added entryPoint, unless it's explicitly
@@ -1871,12 +1889,12 @@
   /// This is not perfect, but works for what it's currently used for.
   Set<Uri>? getFilteredInvalidatedImportUrisForTesting(
       List<Uri> invalidatedUris) {
-    if (invalidatedImportUrisForTesting == null) return null;
+    if (recorderForTesting.invalidatedImportUrisForTesting == null) return null;
 
     Set<String> invalidatedFilenames =
         invalidatedUris.map((uri) => uri.pathSegments.last).toSet();
     Set<Uri> result = new Set<Uri>();
-    for (Uri uri in invalidatedImportUrisForTesting!) {
+    for (Uri uri in recorderForTesting.invalidatedImportUrisForTesting!) {
       if (uri.pathSegments.isNotEmpty &&
           uri.pathSegments.last == "nonexisting.dart") {
         continue;
@@ -1912,12 +1930,42 @@
             incrementalSerializer);
 
   @override
-  void recordInvalidatedImportUrisForTesting(List<Uri> uris) {
+  Future<IncrementalCompilerResult> computeDelta(
+      {List<Uri>? entryPoints,
+      bool fullComponent = false,
+      bool trackNeededDillLibraries: false,
+      bool? simulateTransformer}) async {
+    IncrementalCompilerResult result = await super.computeDelta(
+        entryPoints: entryPoints,
+        fullComponent: fullComponent,
+        trackNeededDillLibraries: trackNeededDillLibraries);
+
+    // We should at least have the SDK builders available. Slight smoke test.
+    if (!dillTargetForTesting!.loader.libraryImportUris
+        .map((uri) => uri.toString())
+        .contains("dart:core")) {
+      throw "Loaders builder should contain the sdk, "
+          "but didn't even contain dart:core.";
+    }
+
+    if (simulateTransformer == true) {
+      doSimulateTransformer(result.component);
+    }
+    return result;
+  }
+}
+
+class TestRecorderForTesting extends RecorderForTesting {
+  Set<Uri>? invalidatedImportUrisForTesting;
+  int? rebuildBodiesCount;
+
+  @override
+  void recordInvalidatedImportUris(List<Uri> uris) {
     invalidatedImportUrisForTesting = uris.isEmpty ? null : uris.toSet();
   }
 
   @override
-  void recordNonFullComponentForTesting(Component component) {
+  void recordNonFullComponent(Component component) {
     // It should at least contain the sdk. Slight smoke test.
     if (!component.libraries
         .map((lib) => lib.importUri.toString())
@@ -1928,34 +1976,12 @@
   }
 
   @override
-  void recordRebuildBodiesCountForTesting(int count) {
+  void recordRebuildBodiesCount(int count) {
     rebuildBodiesCount = count;
   }
 
   @override
-  Future<Component> computeDelta(
-      {List<Uri>? entryPoints,
-      bool fullComponent = false,
-      bool? simulateTransformer}) async {
-    Component result = await super
-        .computeDelta(entryPoints: entryPoints, fullComponent: fullComponent);
-
-    // We should at least have the SDK builders available. Slight smoke test.
-    if (!dillLoadedData!.loader.libraryImportUris
-        .map((uri) => uri.toString())
-        .contains("dart:core")) {
-      throw "Loaders builder should contain the sdk, "
-          "but didn't even contain dart:core.";
-    }
-
-    if (simulateTransformer == true) {
-      doSimulateTransformer(result);
-    }
-    return result;
-  }
-
-  @override
-  void recordTemporaryFileForTesting(Uri uri) {
+  void recordTemporaryFile(Uri uri) {
     File f = new File.fromUri(uri);
     if (f.existsSync()) f.deleteSync();
   }
diff --git a/pkg/front_end/test/issue_34856_test.dart b/pkg/front_end/test/issue_34856_test.dart
index a82d5c5..a0b5fc1 100644
--- a/pkg/front_end/test/issue_34856_test.dart
+++ b/pkg/front_end/test/issue_34856_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show File;
 
 import 'package:async_helper/async_helper.dart' show asyncTest;
@@ -68,14 +66,14 @@
   fs.entityForUri(platformDill).writeAsBytesSync(platformDillBytes);
   fs
       .entityForUri(base.resolve("lib.dart"))
-      .writeAsStringSync(files["lib.dart"]);
+      .writeAsStringSync(files["lib.dart"]!);
   CompilerOptions options = new CompilerOptions()
     ..fileSystem = fs
     ..sdkSummary = platformDill;
 
   Component component =
       (await kernelForModule(<Uri>[base.resolve("lib.dart")], options))
-          .component;
+          .component!;
 
   fs = new MemoryFileSystem(base);
   fs.entityForUri(platformDill).writeAsBytesSync(platformDillBytes);
@@ -84,7 +82,7 @@
       .writeAsBytesSync(serializeComponent(component));
   fs
       .entityForUri(base.resolve("repro.dart"))
-      .writeAsStringSync(files["repro.dart"]);
+      .writeAsStringSync(files["repro.dart"]!);
 
   options = new CompilerOptions()
     ..fileSystem = fs
@@ -94,12 +92,12 @@
 
   List<Uri> inputs = <Uri>[base.resolve("repro.dart")];
 
-  component = (await kernelForModule(inputs, options)).component;
+  component = (await kernelForModule(inputs, options)).component!;
 
   List<Object> errors = await CompilerContext.runWithOptions(
       new ProcessedOptions(options: options, inputs: inputs),
       (_) => new Future<List<Object>>.value(
-          verifyComponent(component, options.target, skipPlatform: true)));
+          verifyComponent(component, options.target!, skipPlatform: true)));
 
   serializeComponent(component);
 
diff --git a/pkg/front_end/test/kernel_generator_test.dart b/pkg/front_end/test/kernel_generator_test.dart
index 275df00..4c0bb6d 100644
--- a/pkg/front_end/test/kernel_generator_test.dart
+++ b/pkg/front_end/test/kernel_generator_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:kernel/ast.dart'
     show EmptyStatement, Component, ReturnStatement, StaticInvocation;
 
@@ -45,7 +43,7 @@
         ..compileSdk = true // To prevent FE from loading an sdk-summary.
         ..onDiagnostic = errors.add;
 
-      Component component =
+      Component? component =
           (await compileScript('main() => print("hi");', options: options))
               ?.component;
       expect(component, isNotNull);
@@ -59,7 +57,7 @@
             Uri.parse('org-dartlang-test:///not_existing_summary_file')
         ..onDiagnostic = errors.add;
 
-      Component component =
+      Component? component =
           (await compileScript('main() => print("hi");', options: options))
               ?.component;
       expect(component, isNotNull);
@@ -74,14 +72,14 @@
         // sources of the sdk directly.
         ..librariesSpecificationUri = invalidCoreLibsSpecUri;
       Component component =
-          (await compileScript('main() => print("hi");', options: options))
-              ?.component;
+          (await compileScript('main() => print("hi");', options: options))!
+              .component!;
       var core = component.libraries.firstWhere(isDartCoreLibrary);
       var printMember = core.members.firstWhere((m) => m.name.text == 'print');
 
       // Note: summaries created by the SDK today contain empty statements as
       // method bodies.
-      expect(printMember.function.body is! EmptyStatement, isTrue);
+      expect(printMember.function!.body is! EmptyStatement, isTrue);
     });
 
     test('compiler requires a main method', () async {
@@ -95,8 +93,8 @@
     test('generated program contains source-info', () async {
       Component component = (await compileScript(
               'a() => print("hi"); main() {}',
-              fileName: 'a.dart'))
-          ?.component;
+              fileName: 'a.dart'))!
+          .component!;
       // Kernel always store an empty '' key in the map, so there is always at
       // least one. Having more means that source-info is added.
       expect(component.uriToSource.keys.length, greaterThan(1));
@@ -139,13 +137,13 @@
 
       var unitA = await compileUnit(['a.dart'], sources);
       // Pretend that the compiled code is a summary
-      sources['a.dill'] = serializeComponent(unitA);
+      sources['a.dill'] = serializeComponent(unitA!);
 
       var unitBC = await compileUnit(['b.dart', 'c.dart'], sources,
           additionalDills: ['a.dill']);
 
       // Pretend that the compiled code is a summary
-      sources['bc.dill'] = serializeComponent(unitBC);
+      sources['bc.dill'] = serializeComponent(unitBC!);
 
       void checkDCallsC(Component component) {
         var dLib = findLibrary(component, 'd.dart');
@@ -160,11 +158,11 @@
 
       var unitD1 = await compileUnit(['d.dart'], sources,
           additionalDills: ['a.dill', 'bc.dill']);
-      checkDCallsC(unitD1);
+      checkDCallsC(unitD1!);
 
       var unitD2 = await compileUnit(['d.dart'], sources,
           additionalDills: ['bc.dill', 'a.dill']);
-      checkDCallsC(unitD2);
+      checkDCallsC(unitD2!);
     });
 
     // TODO(sigmund): add tests with trimming dependencies
diff --git a/pkg/front_end/test/language_versioning/language_versioning_test.dart b/pkg/front_end/test/language_versioning/language_versioning_test.dart
index 359c265..221ce79 100644
--- a/pkg/front_end/test/language_versioning/language_versioning_test.dart
+++ b/pkg/front_end/test/language_versioning/language_versioning_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, File, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/features.dart';
@@ -45,7 +43,7 @@
 }
 
 // Ugly hack.
-CompilerOptions stashedOptions;
+late CompilerOptions stashedOptions;
 
 class TestConfigWithLanguageVersion extends TestConfig {
   TestConfigWithLanguageVersion(String marker, String name)
@@ -110,7 +108,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new LanguageVersioningDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
   }
@@ -141,7 +139,7 @@
     Features features = new Features();
     features[Tags.languageVersion] =
         "${library.languageVersion.major}.${library.languageVersion.minor}";
-    LibraryBuilder libraryBuilder =
+    LibraryBuilder? libraryBuilder =
         lookupLibraryBuilder(compilerResult, library);
     if (libraryBuilder is SourceLibraryBuilder &&
         libraryBuilder.packageUriForTesting != null) {
diff --git a/pkg/front_end/test/language_versioning/language_versioning_up_to_date_git_test.dart b/pkg/front_end/test/language_versioning/language_versioning_up_to_date_git_test.dart
index 89c3833..88e84ac 100644
--- a/pkg/front_end/test/language_versioning/language_versioning_up_to_date_git_test.dart
+++ b/pkg/front_end/test/language_versioning/language_versioning_up_to_date_git_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Platform, Process, ProcessResult;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart';
@@ -35,8 +33,8 @@
   // E.g. "2.6.0-edge" (without the quotes).
   String versionString = stdout.split("\n")[0];
   List<String> dotSeparatedParts = versionString.split(".");
-  int major = int.tryParse(dotSeparatedParts[0]);
-  int minor = int.tryParse(dotSeparatedParts[1]);
+  int major = int.parse(dotSeparatedParts[0]);
+  int minor = int.parse(dotSeparatedParts[1]);
   kernel.Version version = new kernel.Version(major, minor);
 
   if (kernel.defaultLanguageVersion != version) {
@@ -51,8 +49,8 @@
 
   List<String> dotSeparatedPartsFromOptions =
       compilerOptions.currentSdkVersion.split(".");
-  int majorFromOptions = int.tryParse(dotSeparatedPartsFromOptions[0]);
-  int minorFromOptions = int.tryParse(dotSeparatedPartsFromOptions[1]);
+  int majorFromOptions = int.parse(dotSeparatedPartsFromOptions[0]);
+  int minorFromOptions = int.parse(dotSeparatedPartsFromOptions[1]);
   if (majorFromOptions != major || minorFromOptions != minor) {
     throw "CompilerOptions defaults "
         "${majorFromOptions}.${minorFromOptions}"
diff --git a/pkg/front_end/test/lint_suite.dart b/pkg/front_end/test/lint_suite.dart
index 130a452..cd16042 100644
--- a/pkg/front_end/test/lint_suite.dart
+++ b/pkg/front_end/test/lint_suite.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, File, FileSystemEntity;
 
 import 'dart:typed_data' show Uint8List;
@@ -58,10 +56,10 @@
   }
 
   String getErrorMessage(int offset, int squigglyLength, String message) {
-    cache.source ??= new Source(cache.lineStarts, cache.rawBytes, uri, uri);
-    Location location = cache.source.getLocation(uri, offset);
+    cache.source ??= new Source(cache.lineStarts, cache.rawBytes!, uri, uri);
+    Location location = cache.source!.getLocation(uri, offset);
     return command_line_reporting.formatErrorMessage(
-        cache.source.getTextLine(location.line),
+        cache.source!.getTextLine(location.line),
         location,
         squigglyLength,
         uri.toString(),
@@ -70,16 +68,16 @@
 }
 
 class LintTestCache {
-  List<int> rawBytes;
-  List<int> lineStarts;
-  Source source;
-  Token firstToken;
-  PackageConfig packages;
+  List<int>? rawBytes;
+  late List<int> lineStarts;
+  Source? source;
+  Token? firstToken;
+  PackageConfig? packages;
 }
 
 class Context extends ChainContext {
   final bool onlyInGit;
-  Context({this.onlyInGit});
+  Context({required this.onlyInGit});
 
   @override
   final List<Step> steps = const <Step>[
@@ -95,7 +93,7 @@
 
   @override
   Stream<LintTestDescription> list(Chain suite) async* {
-    Set<Uri> gitFiles;
+    late Set<Uri> gitFiles;
     if (onlyInGit) {
       gitFiles = await getGitFiles(suite.uri);
     }
@@ -160,9 +158,9 @@
       File f = new File.fromUri(description.uri);
       description.cache.rawBytes = f.readAsBytesSync();
 
-      Uint8List bytes = new Uint8List(description.cache.rawBytes.length + 1);
+      Uint8List bytes = new Uint8List(description.cache.rawBytes!.length + 1);
       bytes.setRange(
-          0, description.cache.rawBytes.length, description.cache.rawBytes);
+          0, description.cache.rawBytes!.length, description.cache.rawBytes!);
 
       Utf8BytesScanner scanner =
           new Utf8BytesScanner(bytes, includeComments: true);
@@ -195,7 +193,7 @@
 
     Parser parser = new Parser(description.listener,
         useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
-    parser.parseUnit(description.cache.firstToken);
+    parser.parseUnit(description.cache.firstToken!);
 
     if (description.listener.problems.isEmpty) {
       return pass(description);
@@ -206,9 +204,9 @@
 
 class LintListener extends Listener {
   List<String> problems = <String>[];
-  LintTestDescription description;
+  late final LintTestDescription description;
   @override
-  Uri uri;
+  late final Uri uri;
 
   void onProblem(int offset, int squigglyLength, String message) {
     problems.add(description.getErrorMessage(offset, squigglyLength, message));
@@ -220,15 +218,15 @@
 
   @override
   void beginVariablesDeclaration(
-      Token token, Token lateToken, Token varFinalOrConst) {
+      Token token, Token? lateToken, Token? varFinalOrConst) {
     if (!_latestTypes.last.type) {
       onProblem(
-          varFinalOrConst.offset, varFinalOrConst.length, "No explicit type.");
+          varFinalOrConst!.offset, varFinalOrConst.length, "No explicit type.");
     }
   }
 
   @override
-  void handleType(Token beginToken, Token questionMark) {
+  void handleType(Token beginToken, Token? questionMark) {
     _latestTypes.add(new LatestType(beginToken, true));
   }
 
@@ -238,17 +236,17 @@
   }
 
   @override
-  void endFunctionType(Token functionToken, Token questionMark) {
+  void endFunctionType(Token functionToken, Token? questionMark) {
     _latestTypes.add(new LatestType(functionToken, true));
   }
 
   @override
   void endTopLevelFields(
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token endToken) {
@@ -260,29 +258,30 @@
 
   @override
   void endClassFields(
-      Token abstractToken,
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token endToken) {
     if (!_latestTypes.last.type) {
       onProblem(
-          varFinalOrConst.offset, varFinalOrConst.length, "No explicit type.");
+          varFinalOrConst!.offset, varFinalOrConst.length, "No explicit type.");
     }
     _latestTypes.removeLast();
   }
 
   @override
   void endFormalParameter(
-      Token thisKeyword,
-      Token periodAfterThis,
+      Token? thisKeyword,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
-      Token initializerStart,
-      Token initializerEnd,
+      Token? initializerStart,
+      Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
     _latestTypes.removeLast();
@@ -300,8 +299,8 @@
   Set<Uri> seenImports = new Set<Uri>();
 
   @override
-  void endImport(Token importKeyword, Token semicolon) {
-    Token importUriToken = importKeyword.next;
+  void endImport(Token importKeyword, Token? semicolon) {
+    Token importUriToken = importKeyword.next!;
     String importUri = importUriToken.lexeme;
     if (importUri.startsWith("r")) {
       importUri = importUri.substring(2, importUri.length - 1);
@@ -311,7 +310,7 @@
     Uri resolved = uri.resolve(importUri);
     if (resolved.scheme == "package") {
       if (description.cache.packages != null) {
-        resolved = description.cache.packages.resolve(resolved);
+        resolved = description.cache.packages!.resolve(resolved)!;
       }
     }
     if (!seenImports.add(resolved)) {
@@ -324,7 +323,7 @@
 class ExportsLintListener extends LintListener {
   @override
   void endExport(Token exportKeyword, Token semicolon) {
-    Token exportUriToken = exportKeyword.next;
+    Token exportUriToken = exportKeyword.next!;
     String exportUri = exportUriToken.lexeme;
     if (exportUri.startsWith("r")) {
       exportUri = exportUri.substring(2, exportUri.length - 1);
@@ -334,7 +333,7 @@
     Uri resolved = uri.resolve(exportUri);
     if (resolved.scheme == "package") {
       if (description.cache.packages != null) {
-        resolved = description.cache.packages.resolve(resolved);
+        resolved = description.cache.packages!.resolve(resolved)!;
       }
     }
     onProblem(exportUriToken.offset, exportUriToken.lexeme.length,
diff --git a/pkg/front_end/test/lint_test.status b/pkg/front_end/test/lint_test.status
index e7d04be..9f581ba 100644
--- a/pkg/front_end/test/lint_test.status
+++ b/pkg/front_end/test/lint_test.status
@@ -14,6 +14,7 @@
 front_end/lib/src/api_prototype/front_end/Exports: Fail
 front_end/lib/src/api_prototype/incremental_kernel_generator/Exports: Fail
 front_end/lib/src/api_prototype/language_version/Exports: Fail
+front_end/lib/src/api_prototype/lowering_predicates/Exports: Fail
 front_end/lib/src/api_prototype/terminal_color_support/Exports: Fail
 front_end/lib/src/fasta/fasta_codes/Exports: Fail
 front_end/lib/src/fasta/incremental_compiler/ImportsTwice: Fail
diff --git a/pkg/front_end/test/macros/data/package_config.json b/pkg/front_end/test/macros/data/package_config.json
new file mode 100644
index 0000000..97031ce
--- /dev/null
+++ b/pkg/front_end/test/macros/data/package_config.json
@@ -0,0 +1,13 @@
+{
+  "configVersion": 2,
+  "packages": [
+    {
+      "name": "macro",
+      "rootUri": "pkgs/macro/lib/"
+    },
+    {
+      "name": "macro_builder",
+      "rootUri": "pkgs/macro_builder/lib/"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/pkg/front_end/test/macros/data/pkgs/macro/lib/macro.dart b/pkg/front_end/test/macros/data/pkgs/macro/lib/macro.dart
new file mode 100644
index 0000000..bfe0285
--- /dev/null
+++ b/pkg/front_end/test/macros/data/pkgs/macro/lib/macro.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:macro_builder/macro_builder.dart';
+
+class Macro1 implements Macro {
+  const Macro1();
+}
+
+class Macro2 implements Macro {
+  const Macro2();
+}
+
+class Macro3 implements Macro {
+  const Macro3();
+}
+
+class NonMacro {
+  const NonMacro();
+}
diff --git a/pkg/front_end/test/macros/data/pkgs/macro_builder/lib/macro_builder.dart b/pkg/front_end/test/macros/data/pkgs/macro_builder/lib/macro_builder.dart
new file mode 100644
index 0000000..14354da
--- /dev/null
+++ b/pkg/front_end/test/macros/data/pkgs/macro_builder/lib/macro_builder.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+export 'src/macro.dart';
diff --git a/pkg/front_end/test/macros/data/pkgs/macro_builder/lib/src/macro.dart b/pkg/front_end/test/macros/data/pkgs/macro_builder/lib/src/macro.dart
new file mode 100644
index 0000000..434331b
--- /dev/null
+++ b/pkg/front_end/test/macros/data/pkgs/macro_builder/lib/src/macro.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 Macro {}
diff --git a/pkg/front_end/test/macros/data/tests/declare_macro.dart b/pkg/front_end/test/macros/data/tests/declare_macro.dart
new file mode 100644
index 0000000..5d396f7
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/declare_macro.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: 
+ compilationSequence=[
+  package:macro_builder/src/macro.dart,
+  main.dart|package:macro_builder/macro_builder.dart],
+ declaredMacros=[MyMacro],
+ macrosAreAvailable
+*/
+
+import 'package:macro_builder/macro_builder.dart';
+
+class MyMacro implements Macro {}
+
+void main() {}
diff --git a/pkg/front_end/test/macros/data/tests/declare_vs_apply/apply_lib.dart b/pkg/front_end/test/macros/data/tests/declare_vs_apply/apply_lib.dart
new file mode 100644
index 0000000..f4e6484
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/declare_vs_apply/apply_lib.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: 
+ macrosAreApplied,
+ macrosAreAvailable
+*/
+
+import 'macro_lib.dart';
+import 'apply_lib_dep.dart';
+
+@Macro1()
+/*class: Class:
+ appliedMacros=[Macro1],
+ macrosAreApplied
+*/
+class Class extends Super {}
diff --git a/pkg/front_end/test/macros/data/tests/declare_vs_apply/apply_lib_dep.dart b/pkg/front_end/test/macros/data/tests/declare_vs_apply/apply_lib_dep.dart
new file mode 100644
index 0000000..018b909
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/declare_vs_apply/apply_lib_dep.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: macrosAreAvailable*/
+
+class Super {}
diff --git a/pkg/front_end/test/macros/data/tests/declare_vs_apply/macro_lib.dart b/pkg/front_end/test/macros/data/tests/declare_vs_apply/macro_lib.dart
new file mode 100644
index 0000000..149d512
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/declare_vs_apply/macro_lib.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: 
+ declaredMacros=[Macro1],
+ macrosAreAvailable
+*/
+
+import 'package:macro_builder/macro_builder.dart';
+import 'macro_lib_dep.dart';
+
+class Macro1 extends MacroBase implements Macro {
+  const Macro1();
+}
diff --git a/pkg/front_end/test/macros/data/tests/declare_vs_apply/macro_lib_dep.dart b/pkg/front_end/test/macros/data/tests/declare_vs_apply/macro_lib_dep.dart
new file mode 100644
index 0000000..13c27f8
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/declare_vs_apply/macro_lib_dep.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: macrosAreAvailable*/
+
+class MacroBase {
+  const MacroBase();
+}
diff --git a/pkg/front_end/test/macros/data/tests/declare_vs_apply/main.dart b/pkg/front_end/test/macros/data/tests/declare_vs_apply/main.dart
new file mode 100644
index 0000000..868f08d
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/declare_vs_apply/main.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: 
+ compilationSequence=[
+  apply_lib_dep.dart|macro_lib_dep.dart|main_lib_dep.dart|package:macro_builder/src/macro.dart,
+  macro_lib.dart|package:macro_builder/macro_builder.dart,
+  apply_lib.dart|main.dart],
+ macrosAreAvailable
+*/
+
+import 'apply_lib.dart';
+import 'main_lib_dep.dart';
+
+void main() {
+  new Class();
+  method();
+}
diff --git a/pkg/front_end/test/macros/data/tests/declare_vs_apply/main_lib_dep.dart b/pkg/front_end/test/macros/data/tests/declare_vs_apply/main_lib_dep.dart
new file mode 100644
index 0000000..684c9d7
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/declare_vs_apply/main_lib_dep.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: macrosAreAvailable*/
+
+void method() {}
diff --git a/pkg/front_end/test/macros/data/tests/direct_import.dart b/pkg/front_end/test/macros/data/tests/direct_import.dart
new file mode 100644
index 0000000..f3484cd
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/direct_import.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: 
+ compilationSequence=[
+  package:macro_builder/src/macro.dart,
+  main.dart],
+ macrosAreAvailable
+*/
+
+// ignore: unused_import
+import 'package:macro_builder/src/macro.dart';
+
+void main() {}
diff --git a/pkg/front_end/test/macros/data/tests/import_macro_builder.dart b/pkg/front_end/test/macros/data/tests/import_macro_builder.dart
new file mode 100644
index 0000000..dca3012
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/import_macro_builder.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: 
+ compilationSequence=[
+  package:macro_builder/src/macro.dart,
+  main.dart|package:macro_builder/macro_builder.dart],
+ macrosAreAvailable
+*/
+
+// ignore: unused_import
+import 'package:macro_builder/macro_builder.dart';
+
+void main() {}
diff --git a/pkg/front_end/test/macros/data/tests/import_macro_package.dart b/pkg/front_end/test/macros/data/tests/import_macro_package.dart
new file mode 100644
index 0000000..1fabb48
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/import_macro_package.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: 
+ compilationSequence=[
+  package:macro_builder/src/macro.dart,
+  package:macro/macro.dart|package:macro_builder/macro_builder.dart,
+  main.dart],
+ macrosAreAvailable
+*/
+
+// ignore: unused_import
+import 'package:macro/macro.dart';
+
+void main() {}
diff --git a/pkg/front_end/test/macros/data/tests/import_macro_source/macro_lib.dart b/pkg/front_end/test/macros/data/tests/import_macro_source/macro_lib.dart
new file mode 100644
index 0000000..a05f387
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/import_macro_source/macro_lib.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: 
+ declaredMacros=[Macro1],
+ macrosAreAvailable
+*/
+
+import 'package:macro_builder/macro_builder.dart';
+
+class Macro1 implements Macro {
+  const Macro1();
+}
diff --git a/pkg/front_end/test/macros/data/tests/import_macro_source/main.dart b/pkg/front_end/test/macros/data/tests/import_macro_source/main.dart
new file mode 100644
index 0000000..5b109f4
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/import_macro_source/main.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: 
+ compilationSequence=[
+  package:macro_builder/src/macro.dart,
+  macro_lib.dart|package:macro_builder/macro_builder.dart,
+  main.dart],
+ macrosAreAvailable
+*/
+
+// ignore: unused_import
+import 'macro_lib.dart';
+
+void main() {}
diff --git a/pkg/front_end/test/macros/data/tests/macro_declarations.dart b/pkg/front_end/test/macros/data/tests/macro_declarations.dart
new file mode 100644
index 0000000..872dad84
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/macro_declarations.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: 
+ compilationSequence=[
+  package:macro_builder/src/macro.dart,
+  main.dart|package:macro_builder/macro_builder.dart],
+ declaredMacros=[
+  Extends,
+  ExtendsAlias,
+  Implements,
+  ImplementsAlias,
+  Mixin,
+  MixinAlias,
+  _Mixin&Object&Macro,
+  _MixinAlias&Object&Alias],
+ macrosAreAvailable
+*/
+
+import 'package:macro_builder/macro_builder.dart';
+
+class Extends extends Macro {}
+
+class Implements implements Macro {}
+
+class Mixin with Macro {}
+
+typedef Alias = Macro;
+
+class ExtendsAlias extends Alias {}
+
+class ImplementsAlias implements Alias {}
+
+class MixinAlias with Alias {}
+
+void main() {}
diff --git a/pkg/front_end/test/macros/data/tests/marker.options b/pkg/front_end/test/macros/data/tests/marker.options
new file mode 100644
index 0000000..8416ef5
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/marker.options
@@ -0,0 +1 @@
+cfe=pkg/front_end/test/macros/macro_test.dart
diff --git a/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib1.dart b/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib1.dart
new file mode 100644
index 0000000..a05f387
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib1.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: 
+ declaredMacros=[Macro1],
+ macrosAreAvailable
+*/
+
+import 'package:macro_builder/macro_builder.dart';
+
+class Macro1 implements Macro {
+  const Macro1();
+}
diff --git a/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib2a.dart b/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib2a.dart
new file mode 100644
index 0000000..967801f
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib2a.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: 
+ declaredMacros=[Macro2a],
+ macrosAreAvailable
+*/
+
+import 'package:macro_builder/macro_builder.dart';
+
+class Macro2a implements Macro {
+  const Macro2a();
+}
diff --git a/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib2b.dart b/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib2b.dart
new file mode 100644
index 0000000..b9bc7d2
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib2b.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: 
+ declaredMacros=[Macro2b],
+ macrosAreApplied,
+ macrosAreAvailable
+*/
+
+import 'package:macro_builder/macro_builder.dart';
+import 'macro_lib2a.dart';
+
+@Macro2a()
+/*class: Macro2b:
+ appliedMacros=[Macro2a],
+ macrosAreApplied
+*/
+class Macro2b implements Macro {
+  const Macro2b();
+}
diff --git a/pkg/front_end/test/macros/data/tests/multiple_macros/main.dart b/pkg/front_end/test/macros/data/tests/multiple_macros/main.dart
new file mode 100644
index 0000000..9dee592
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/multiple_macros/main.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: 
+ compilationSequence=[
+  package:macro_builder/src/macro.dart,
+  macro_lib1.dart|macro_lib2a.dart|package:macro_builder/macro_builder.dart,
+  macro_lib2b.dart,
+  main.dart],
+ macrosAreApplied,
+ macrosAreAvailable
+*/
+
+import 'macro_lib1.dart';
+import 'macro_lib2a.dart';
+import 'macro_lib2b.dart';
+
+@Macro1()
+@Macro2a()
+@Macro2b()
+/*member: main:appliedMacros=[
+  Macro1,
+  Macro2a,
+  Macro2b]*/
+void main() {}
diff --git a/pkg/front_end/test/macros/data/tests/no_import.dart b/pkg/front_end/test/macros/data/tests/no_import.dart
new file mode 100644
index 0000000..80fd055
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/no_import.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: */
+
+void main() {}
diff --git a/pkg/front_end/test/macros/data/tests/use_macro_package.dart b/pkg/front_end/test/macros/data/tests/use_macro_package.dart
new file mode 100644
index 0000000..74f18ff
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/use_macro_package.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: 
+ appliedMacros=[Macro3],
+ compilationSequence=[
+  package:macro_builder/src/macro.dart,
+  package:macro/macro.dart|package:macro_builder/macro_builder.dart,
+  main.dart],
+ macrosAreApplied,
+ macrosAreAvailable
+*/
+@Macro3()
+library use_macro_package;
+
+import 'package:macro/macro.dart';
+
+@Macro1()
+/*member: main:appliedMacros=[Macro1]*/
+void main() {}
+
+@Macro2()
+/*class: Class1:
+ appliedMacros=[Macro2],
+ macrosAreApplied
+*/
+class Class1 {
+  @Macro1()
+  @Macro2()
+  /*member: Class1.method:appliedMacros=[
+    Macro1,
+    Macro2]*/
+  void method() {}
+}
+
+@NonMacro()
+class Class2 {}
+
+/*class: Class3:macrosAreApplied*/
+class Class3 {
+  @Macro3()
+  /*member: Class3.field:appliedMacros=[Macro3]*/
+  var field;
+}
+
+class Class4 {
+  @NonMacro()
+  var field;
+}
diff --git a/pkg/front_end/test/macros/data/tests/use_macro_source/macro_lib.dart b/pkg/front_end/test/macros/data/tests/use_macro_source/macro_lib.dart
new file mode 100644
index 0000000..3f926a8
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/use_macro_source/macro_lib.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: 
+ declaredMacros=[
+  Macro1,
+  Macro2],
+ macrosAreAvailable
+*/
+
+import 'package:macro_builder/macro_builder.dart';
+
+class Macro1 implements Macro {
+  const Macro1();
+}
+
+class Macro2 implements Macro {
+  const Macro2();
+}
+
+class NonMacro {
+  const NonMacro();
+}
diff --git a/pkg/front_end/test/macros/data/tests/use_macro_source/main.dart b/pkg/front_end/test/macros/data/tests/use_macro_source/main.dart
new file mode 100644
index 0000000..930eb5c
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/use_macro_source/main.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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: 
+ compilationSequence=[
+  package:macro_builder/src/macro.dart,
+  macro_lib.dart|package:macro_builder/macro_builder.dart,
+  main.dart],
+ macrosAreApplied,
+ macrosAreAvailable
+*/
+
+import 'macro_lib.dart';
+
+@Macro1()
+/*member: main:appliedMacros=[Macro1]*/
+void main() {}
+
+@Macro2()
+/*class: Class1:
+ appliedMacros=[Macro2],
+ macrosAreApplied
+*/
+class Class1 {
+  @Macro1()
+  @Macro2()
+  /*member: Class1.method:appliedMacros=[
+    Macro1,
+    Macro2]*/
+  void method() {}
+}
+
+@NonMacro()
+class Class2 {}
+
+/*class: Class3:macrosAreApplied*/
+class Class3 {
+  @Macro1()
+  /*member: Class3.field:appliedMacros=[Macro1]*/
+  var field;
+}
+
+class Class4 {
+  @NonMacro()
+  var field;
+}
diff --git a/pkg/front_end/test/macros/macro_test.dart b/pkg/front_end/test/macros/macro_test.dart
new file mode 100644
index 0000000..82fe62d
--- /dev/null
+++ b/pkg/front_end/test/macros/macro_test.dart
@@ -0,0 +1,195 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. 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, Platform;
+
+import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
+import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
+
+import 'package:_fe_analyzer_shared/src/testing/features.dart';
+import 'package:front_end/src/fasta/kernel/macro.dart';
+import 'package:front_end/src/testing/id_testing_helper.dart';
+import 'package:kernel/ast.dart';
+
+Future<void> main(List<String> args) async {
+  enableMacros = true;
+
+  Directory dataDir =
+      new Directory.fromUri(Platform.script.resolve('data/tests'));
+  await runTests<Features>(dataDir,
+      args: args,
+      createUriForFileName: createUriForFileName,
+      onFailure: onFailure,
+      runTest: runTestFor(const MacroDataComputer(), [
+        new TestConfig(cfeMarker, 'cfe',
+            packageConfigUri:
+                Platform.script.resolve('data/package_config.json'))
+      ]));
+}
+
+class MacroDataComputer extends DataComputer<Features> {
+  const MacroDataComputer();
+
+  @override
+  void computeMemberData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Member member,
+      Map<Id, ActualData<Features>> actualMap,
+      {bool? verbose}) {
+    member.accept(new MacroDataExtractor(compilerResult, actualMap));
+  }
+
+  @override
+  void computeClassData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Class cls,
+      Map<Id, ActualData<Features>> actualMap,
+      {bool? verbose}) {
+    new MacroDataExtractor(compilerResult, actualMap).computeForClass(cls);
+  }
+
+  @override
+  void computeLibraryData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Library library,
+      Map<Id, ActualData<Features>> actualMap,
+      {bool? verbose}) {
+    new MacroDataExtractor(compilerResult, actualMap)
+        .computeForLibrary(library);
+  }
+
+  @override
+  DataInterpreter<Features> get dataValidator =>
+      const FeaturesDataInterpreter();
+}
+
+class Tags {
+  static const String macrosAreAvailable = 'macrosAreAvailable';
+  static const String macrosAreApplied = 'macrosAreApplied';
+  static const String compilationSequence = 'compilationSequence';
+  static const String declaredMacros = 'declaredMacros';
+  static const String appliedMacros = 'appliedMacros';
+}
+
+String importUriToString(Uri importUri) {
+  if (importUri.scheme == 'package') {
+    return importUri.toString();
+  } else if (importUri.scheme == 'dart') {
+    return importUri.toString();
+  } else {
+    return importUri.pathSegments.last;
+  }
+}
+
+String libraryToString(Library library) => importUriToString(library.importUri);
+
+String strongComponentToString(Iterable<Uri> uris) {
+  List<String> list = uris.map(importUriToString).toList();
+  list.sort();
+  return list.join('|');
+}
+
+class MacroDataExtractor extends CfeDataExtractor<Features> {
+  late final MacroDeclarationData macroDeclarationData;
+  late final MacroApplicationData macroApplicationData;
+
+  MacroDataExtractor(InternalCompilerResult compilerResult,
+      Map<Id, ActualData<Features>> actualMap)
+      : super(compilerResult, actualMap) {
+    macroDeclarationData = compilerResult
+        .kernelTargetForTesting!.loader.dataForTesting!.macroDeclarationData;
+    macroApplicationData = compilerResult
+        .kernelTargetForTesting!.loader.dataForTesting!.macroApplicationData;
+  }
+
+  LibraryMacroApplicationData? getLibraryMacroApplicationData(Library library) {
+    return macroApplicationData.libraryData[library];
+  }
+
+  MacroApplications? getLibraryMacroApplications(Library library) {
+    return getLibraryMacroApplicationData(library)?.libraryApplications;
+  }
+
+  ClassMacroApplicationData? getClassMacroApplicationData(Class cls) {
+    LibraryMacroApplicationData? applicationData =
+        getLibraryMacroApplicationData(cls.enclosingLibrary);
+    if (applicationData != null) {
+      return applicationData.classData[cls];
+    }
+    return null;
+  }
+
+  MacroApplications? getClassMacroApplications(Class cls) {
+    return getClassMacroApplicationData(cls)?.classApplications;
+  }
+
+  MacroApplications? getMemberMacroApplications(Member member) {
+    Class? enclosingClass = member.enclosingClass;
+    if (enclosingClass != null) {
+      return getClassMacroApplicationData(enclosingClass)
+          ?.memberApplications[member];
+    } else {
+      return getLibraryMacroApplicationData(member.enclosingLibrary)
+          ?.memberApplications[member];
+    }
+  }
+
+  void registerMacroApplications(
+      Features features, MacroApplications? macroApplications) {
+    if (macroApplications != null) {
+      for (Class cls in macroApplications.macros) {
+        features.addElement(Tags.appliedMacros, cls.name);
+      }
+    }
+  }
+
+  @override
+  Features computeClassValue(Id id, Class node) {
+    Features features = new Features();
+    if (getClassMacroApplicationData(node) != null) {
+      features.add(Tags.macrosAreApplied);
+    }
+    registerMacroApplications(features, getClassMacroApplications(node));
+    return features;
+  }
+
+  @override
+  Features computeLibraryValue(Id id, Library node) {
+    Features features = new Features();
+    if (macroDeclarationData.macrosAreAvailable) {
+      features.add(Tags.macrosAreAvailable);
+    }
+    if (node == compilerResult.component!.mainMethod!.enclosingLibrary) {
+      if (macroDeclarationData.compilationSequence != null) {
+        features.markAsUnsorted(Tags.compilationSequence);
+        for (List<Uri> component in macroDeclarationData.compilationSequence!) {
+          features.addElement(
+              Tags.compilationSequence, strongComponentToString(component));
+        }
+      }
+    }
+    List<String>? macroClasses =
+        macroDeclarationData.macroDeclarations[node.importUri];
+    if (macroClasses != null) {
+      for (String clsName in macroClasses) {
+        features.addElement(Tags.declaredMacros, clsName);
+      }
+    }
+    if (getLibraryMacroApplicationData(node) != null) {
+      features.add(Tags.macrosAreApplied);
+    }
+    registerMacroApplications(features, getLibraryMacroApplications(node));
+    return features;
+  }
+
+  @override
+  Features computeMemberValue(Id id, Member node) {
+    Features features = new Features();
+    registerMacroApplications(features, getMemberMacroApplications(node));
+    return features;
+  }
+}
diff --git a/pkg/front_end/test/member_covariance_test.dart b/pkg/front_end/test/member_covariance_test.dart
index 93ff6e4..a9af238 100644
--- a/pkg/front_end/test/member_covariance_test.dart
+++ b/pkg/front_end/test/member_covariance_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:expect/expect.dart';
 import 'package:kernel/ast.dart';
 import 'package:front_end/src/fasta/kernel/member_covariance.dart';
diff --git a/pkg/front_end/test/memory_file_system_test.dart b/pkg/front_end/test/memory_file_system_test.dart
index 5c20d45..eb635c7 100644
--- a/pkg/front_end/test/memory_file_system_test.dart
+++ b/pkg/front_end/test/memory_file_system_test.dart
@@ -3,8 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 // SharedOptions=--supermixin
 
-// @dart = 2.9
-
 library front_end.test.memory_file_system_test;
 
 import 'dart:convert';
@@ -32,8 +30,8 @@
 
 @reflectiveTest
 class FileTest extends _BaseTestNative {
-  String path;
-  MemoryFileSystemEntity file;
+  late String path;
+  late MemoryFileSystemEntity file;
 
   void setUp() {
     _baseSetUp();
@@ -180,7 +178,7 @@
 }
 
 abstract class MemoryFileSystemTestMixin implements _BaseTest {
-  Uri tempUri;
+  late Uri tempUri;
 
   void setUp() {
     _baseSetUp();
@@ -287,13 +285,15 @@
 class _BaseTestNative extends _BaseTest {
   @override
   final pathos.Context context = pathos.context;
-  @override
-  MemoryFileSystem fileSystem;
-  @override
-  String tempPath;
 
   @override
-  String join(String path1, String path2, [String path3, String path4]) =>
+  late MemoryFileSystem fileSystem;
+
+  @override
+  late String tempPath;
+
+  @override
+  String join(String path1, String path2, [String? path3, String? path4]) =>
       pathos.join(path1, path2, path3, path4);
 
   @override
@@ -306,13 +306,15 @@
 class _BaseTestPosix extends _BaseTest {
   @override
   final pathos.Context context = pathos.posix;
-  @override
-  MemoryFileSystem fileSystem;
-  @override
-  String tempPath;
 
   @override
-  String join(String path1, String path2, [String path3, String path4]) =>
+  late MemoryFileSystem fileSystem;
+
+  @override
+  late String tempPath;
+
+  @override
+  String join(String path1, String path2, [String? path3, String? path4]) =>
       pathos.posix.join(path1, path2, path3, path4);
 
   @override
@@ -325,13 +327,15 @@
 class _BaseTestWindows extends _BaseTest {
   @override
   final pathos.Context context = pathos.windows;
-  @override
-  MemoryFileSystem fileSystem;
-  @override
-  String tempPath;
 
   @override
-  String join(String path1, String path2, [String path3, String path4]) =>
+  late MemoryFileSystem fileSystem;
+
+  @override
+  late String tempPath;
+
+  @override
+  String join(String path1, String path2, [String? path3, String? path4]) =>
       pathos.windows.join(path1, path2, path3, path4);
 
   @override
diff --git a/pkg/front_end/test/messages_json_test.dart b/pkg/front_end/test/messages_json_test.dart
index 8df7698..b86e4b9 100644
--- a/pkg/front_end/test/messages_json_test.dart
+++ b/pkg/front_end/test/messages_json_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
     show DiagnosticMessage, getMessageUri;
 
@@ -24,17 +22,17 @@
     Severity severity = Severity.values[i];
     Code code = new Code("MyCodeName");
     Message message = new Message(code, problemMessage: '');
-    LocatedMessage locatedMessage1 =
+    LocatedMessage locatedMessage =
         new LocatedMessage(Uri.parse("what:ever/fun_1.dart"), 117, 2, message);
     FormattedMessage formattedMessage2 = new FormattedMessage(
-        null,
+        locatedMessage,
         "Formatted string Plain #2",
         "Formatted string Colorized #2",
         13,
         2,
         Severity.error, []);
     FormattedMessage formattedMessage3 = new FormattedMessage(
-        null,
+        locatedMessage,
         "Formatted string Plain #3",
         "Formatted string Colorized #3",
         313,
@@ -42,7 +40,7 @@
         Severity.error, []);
 
     FormattedMessage formattedMessage1 = new FormattedMessage(
-        locatedMessage1,
+        locatedMessage,
         "Formatted string Plain",
         "Formatted string Colorized",
         42,
@@ -90,20 +88,20 @@
   expect(a.severity, b.severity);
   expect(getMessageUri(a), getMessageUri(b));
 
-  List<Uri> uriList1 = a.involvedFiles?.toList();
-  List<Uri> uriList2 = b.involvedFiles?.toList();
+  List<Uri>? uriList1 = a.involvedFiles?.toList();
+  List<Uri>? uriList2 = b.involvedFiles?.toList();
   expect(uriList1?.length, uriList2?.length);
   if (uriList1 != null) {
     for (int i = 0; i < uriList1.length; i++) {
-      expect(uriList1[i], uriList2[i]);
+      expect(uriList1[i], uriList2![i]);
     }
   }
 
-  String string1 = a.codeName;
-  String string2 = b.codeName;
+  String? string1 = a.codeName;
+  String? string2 = b.codeName;
   expect(string1, string2);
 }
 
-void expect(Object actual, Object expect) {
+void expect(Object? actual, Object? expect) {
   if (expect != actual) throw "Expected $expect got $actual";
 }
diff --git a/pkg/front_end/test/mixin_export_test.dart b/pkg/front_end/test/mixin_export_test.dart
index ff1f579..5fafac7 100644
--- a/pkg/front_end/test/mixin_export_test.dart
+++ b/pkg/front_end/test/mixin_export_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:async_helper/async_helper.dart' show asyncTest;
 
 import 'package:front_end/src/testing/compiler_common.dart';
diff --git a/pkg/front_end/test/mock_file_system.dart b/pkg/front_end/test/mock_file_system.dart
new file mode 100644
index 0000000..60e45be
--- /dev/null
+++ b/pkg/front_end/test/mock_file_system.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All 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_prototype/file_system.dart';
+
+class MockFileSystem implements FileSystem {
+  final String? scheme;
+
+  const MockFileSystem({this.scheme});
+
+  @override
+  FileSystemEntity entityForUri(Uri uri) {
+    if (scheme != null && uri.scheme != scheme) throw "unsupported";
+    return new MockFileSystemEntity(uri, this);
+  }
+}
+
+class MockFileSystemEntity implements FileSystemEntity {
+  @override
+  final Uri uri;
+  final FileSystem fileSystem;
+  MockFileSystemEntity(this.uri, this.fileSystem);
+
+  @override
+  dynamic noSuchMethod(m) => super.noSuchMethod(m);
+}
diff --git a/pkg/front_end/test/multiple_simultaneous_compiles_test.dart b/pkg/front_end/test/multiple_simultaneous_compiles_test.dart
index df42515..85d1d8c 100644
--- a/pkg/front_end/test/multiple_simultaneous_compiles_test.dart
+++ b/pkg/front_end/test/multiple_simultaneous_compiles_test.dart
@@ -2,10 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show File, Platform;
 
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
 import 'package:front_end/src/base/processed_options.dart'
     show ProcessedOptions;
 
@@ -27,7 +27,7 @@
   List<Future> futures = [];
   List<int> compilesLeft = new List<int>.filled(5, 8);
   for (int i = 0; i < compilesLeft.length; i++) {
-    Future<Component> compileAgain() async {
+    Future<Component?> compileAgain() async {
       print("$i has ${compilesLeft[i]} left.");
       if (compilesLeft[i] > 0) {
         compilesLeft[i]--;
@@ -56,13 +56,13 @@
       "(with the same compiler) (without crashing)");
 }
 
-List<IncrementalCompiler> compilers = [];
+List<IncrementalCompiler?> compilers = [];
 
 Future<Component> compile(int compilerNum, Uri uri) async {
   if (compilers.length <= compilerNum) {
     compilers.length = compilerNum + 1;
   }
-  IncrementalCompiler compiler = compilers[compilerNum];
+  IncrementalCompiler? compiler = compilers[compilerNum];
   if (compiler == null) {
     var options = getOptions();
     compiler = new IncrementalCompiler(new CompilerContext(
@@ -71,7 +71,8 @@
   } else {
     compiler.invalidateAllSources();
   }
-  Component result = await compiler.computeDelta();
+  IncrementalCompilerResult compilerResult = await compiler.computeDelta();
+  Component result = compilerResult.component;
   print("Now compile is done!");
   return result;
 }
diff --git a/pkg/front_end/test/outline_extractor_suite.dart b/pkg/front_end/test/outline_extractor_suite.dart
new file mode 100644
index 0000000..f022e0c
--- /dev/null
+++ b/pkg/front_end/test/outline_extractor_suite.dart
@@ -0,0 +1,315 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. 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;
+
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
+import 'package:front_end/src/fasta/util/outline_extractor.dart';
+import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
+import 'package:testing/testing.dart'
+    show
+        Chain,
+        ChainContext,
+        ExpectationSet,
+        Result,
+        Step,
+        TestDescription,
+        runMe;
+import 'package:kernel/src/equivalence.dart';
+import 'package:front_end/src/api_prototype/compiler_options.dart';
+import 'package:front_end/src/api_prototype/memory_file_system.dart';
+import 'package:kernel/ast.dart';
+
+import 'fasta/testing/suite.dart' show UPDATE_EXPECTATIONS;
+import 'utils/kernel_chain.dart' show MatchContext;
+
+import 'testing_utils.dart' show checkEnvironment;
+
+import 'incremental_suite.dart' as helper;
+
+const String EXPECTATIONS = '''
+[
+  {
+    "name": "ExpectationFileMismatch",
+    "group": "Fail"
+  },
+  {
+    "name": "ExpectationFileMissing",
+    "group": "Fail"
+  }
+]
+''';
+
+void main([List<String> arguments = const []]) =>
+    runMe(arguments, createContext, configurationPath: "../testing.json");
+
+Future<Context> createContext(
+    Chain suite, Map<String, String> environment) async {
+  const Set<String> knownEnvironmentKeys = {
+    "updateExpectations",
+  };
+  checkEnvironment(environment, knownEnvironmentKeys);
+
+  bool updateExpectations = environment["updateExpectations"] == "true";
+
+  return new Context(suite.name, updateExpectations);
+}
+
+class Context extends ChainContext with MatchContext {
+  @override
+  final bool updateExpectations;
+
+  @override
+  String get updateExpectationsOption => '${UPDATE_EXPECTATIONS}=true';
+
+  @override
+  bool get canBeFixWithUpdateExpectations => true;
+
+  final String suiteName;
+
+  Context(this.suiteName, this.updateExpectations);
+
+  @override
+  final List<Step> steps = const <Step>[
+    const OutlineExtractorStep(),
+    const CompileAndCompareStep(),
+  ];
+
+  @override
+  final ExpectationSet expectationSet =
+      new ExpectationSet.fromJsonList(jsonDecode(EXPECTATIONS));
+
+  // Override special handling of negative tests.
+  @override
+  Result processTestResult(
+      TestDescription description, Result result, bool last) {
+    return result;
+  }
+}
+
+class OutlineExtractorStep
+    extends Step<TestDescription, TestDescription, Context> {
+  const OutlineExtractorStep();
+
+  @override
+  String get name => "OutlineExtractorStep";
+
+  @override
+  Future<Result<TestDescription>> run(
+      TestDescription description, Context context) async {
+    Uri? packages = description.uri.resolve(".packages");
+    if (!new File.fromUri(packages).existsSync()) {
+      packages = null;
+    }
+    Map<Uri, String> result =
+        await extractOutline([description.uri], packages: packages);
+
+    StringBuffer sb = new StringBuffer();
+    Uri uri = description.uri;
+    Uri base = uri.resolve(".");
+    Uri dartBase = Uri.base;
+
+    for (MapEntry<Uri, String> entry in result.entries) {
+      sb.writeln("${entry.key}:");
+      sb.writeln(entry.value);
+      sb.writeln("\n\n");
+    }
+
+    String actual = sb.toString();
+    actual = actual.replaceAll("$base", "org-dartlang-testcase:///");
+    actual = actual.replaceAll("$dartBase", "org-dartlang-testcase-sdk:///");
+    actual = actual.replaceAll("\\n", "\n");
+
+    return context.match<TestDescription>(
+      ".outline_extracted",
+      actual,
+      description.uri,
+      description,
+    );
+  }
+}
+
+class CompileAndCompareStep
+    extends Step<TestDescription, TestDescription, Context> {
+  const CompileAndCompareStep();
+
+  @override
+  String get name => "CompileAndCompare";
+
+  @override
+  Future<Result<TestDescription>> run(
+      TestDescription description, Context context) async {
+    Uri? packages = description.uri.resolve(".packages");
+    if (!new File.fromUri(packages).existsSync()) {
+      packages = null;
+    }
+    Map<Uri, String> processedFiles =
+        await extractOutline([description.uri], packages: packages);
+
+    void onDiagnostic(DiagnosticMessage message) {
+      if (message.codeName == "InferredPackageUri") return;
+      if (message.severity == Severity.error ||
+          message.severity == Severity.warning) {
+        throw ("Unexpected error: ${message.plainTextFormatted.join('\n')}");
+      }
+    }
+
+    Library lib1;
+    {
+      CompilerOptions options = helper.getOptions();
+      options.onDiagnostic = onDiagnostic;
+      options.packagesFileUri = packages;
+      helper.TestIncrementalCompiler compiler =
+          new helper.TestIncrementalCompiler(options, description.uri,
+              /* initializeFrom = */ null, /* outlineOnly = */ true);
+      IncrementalCompilerResult c = await compiler.computeDelta();
+      lib1 = c.component.libraries
+          .firstWhere((element) => element.fileUri == description.uri);
+    }
+    Library lib2;
+    {
+      CompilerOptions options = helper.getOptions();
+      options.onDiagnostic = onDiagnostic;
+      options.packagesFileUri = packages;
+      MemoryFileSystem mfs = new MemoryFileSystem(Uri.base);
+      if (packages != null) {
+        mfs.entityForUri(packages).writeAsBytesSync(
+            await options.fileSystem.entityForUri(packages).readAsBytes());
+      }
+      if (options.sdkSummary != null) {
+        mfs.entityForUri(options.sdkSummary!).writeAsBytesSync(await options
+            .fileSystem
+            .entityForUri(options.sdkSummary!)
+            .readAsBytes());
+      }
+      if (options.librariesSpecificationUri != null) {
+        mfs.entityForUri(options.librariesSpecificationUri!).writeAsBytesSync(
+            await options.fileSystem
+                .entityForUri(options.librariesSpecificationUri!)
+                .readAsBytes());
+      }
+      for (MapEntry<Uri, String> entry in processedFiles.entries) {
+        mfs.entityForUri(entry.key).writeAsStringSync(entry.value);
+      }
+      options.fileSystem = mfs;
+      helper.TestIncrementalCompiler compiler =
+          new helper.TestIncrementalCompiler(options, description.uri,
+              /* initializeFrom = */ null, /* outlineOnly = */ true);
+      IncrementalCompilerResult c = await compiler.computeDelta();
+      lib2 = c.component.libraries
+          .firstWhere((element) => element.fileUri == description.uri);
+    }
+    EquivalenceResult result =
+        checkEquivalence(lib1, lib2, strategy: const Strategy());
+
+    if (result.isEquivalent) {
+      return new Result<TestDescription>.pass(description);
+    } else {
+      print("Bad:");
+      print(result);
+      return new Result<TestDescription>.fail(
+          description, /* error = */ result);
+    }
+  }
+}
+
+class Strategy extends EquivalenceStrategy {
+  const Strategy();
+
+  @override
+  bool checkTreeNode_fileOffset(
+      EquivalenceVisitor visitor, TreeNode node, TreeNode other) {
+    return true;
+  }
+
+  @override
+  bool checkAssertStatement_conditionStartOffset(
+      EquivalenceVisitor visitor, AssertStatement node, AssertStatement other) {
+    return true;
+  }
+
+  @override
+  bool checkAssertStatement_conditionEndOffset(
+      EquivalenceVisitor visitor, AssertStatement node, AssertStatement other) {
+    return true;
+  }
+
+  @override
+  bool checkClass_startFileOffset(
+      EquivalenceVisitor visitor, Class node, Class other) {
+    return true;
+  }
+
+  @override
+  bool checkClass_fileEndOffset(
+      EquivalenceVisitor visitor, Class node, Class other) {
+    return true;
+  }
+
+  @override
+  bool checkProcedure_startFileOffset(
+      EquivalenceVisitor visitor, Procedure node, Procedure other) {
+    return true;
+  }
+
+  @override
+  bool checkConstructor_startFileOffset(
+      EquivalenceVisitor visitor, Constructor node, Constructor other) {
+    return true;
+  }
+
+  @override
+  bool checkMember_fileEndOffset(
+      EquivalenceVisitor visitor, Member node, Member other) {
+    return true;
+  }
+
+  @override
+  bool checkFunctionNode_fileEndOffset(
+      EquivalenceVisitor visitor, FunctionNode node, FunctionNode other) {
+    return true;
+  }
+
+  @override
+  bool checkBlock_fileEndOffset(
+      EquivalenceVisitor visitor, Block node, Block other) {
+    return true;
+  }
+
+  @override
+  bool checkLibrary_additionalExports(
+      EquivalenceVisitor visitor, Library node, Library other) {
+    return visitor.checkSets(
+        node.additionalExports.toSet(),
+        other.additionalExports.toSet(),
+        visitor.matchReferences,
+        visitor.checkReferences,
+        'additionalExports');
+  }
+
+  @override
+  bool checkClass_procedures(
+      EquivalenceVisitor visitor, Class node, Class other) {
+    // Check procedures as a set instead of a list to allow for reordering.
+    List<Procedure> a = node.procedures.toList();
+    int sorter(Procedure x, Procedure y) {
+      int result = x.name.text.compareTo(y.name.text);
+      if (result != 0) return result;
+      result = x.kind.index - y.kind.index;
+      if (result != 0) return result;
+      // other stuff?
+      return 0;
+    }
+
+    a.sort(sorter);
+    List<Procedure> b = other.procedures.toList();
+    b.sort(sorter);
+    // return visitor.checkSets(a.toSet(), b.toSet(),
+    //     visitor.matchNamedNodes, visitor.checkNodes, 'procedures');
+
+    return visitor.checkLists(a, b, visitor.checkNodes, 'procedures');
+  }
+}
diff --git a/pkg/front_end/test/outline_extractor_tester.dart b/pkg/front_end/test/outline_extractor_tester.dart
new file mode 100644
index 0000000..941b5c0
--- /dev/null
+++ b/pkg/front_end/test/outline_extractor_tester.dart
@@ -0,0 +1,301 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. 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_prototype/compiler_options.dart';
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
+import 'package:front_end/src/api_prototype/memory_file_system.dart';
+import 'package:kernel/ast.dart';
+import 'package:kernel/src/equivalence.dart';
+import 'package:compiler/src/kernel/dart2js_target.dart' show Dart2jsTarget;
+import 'package:kernel/target/targets.dart';
+import 'incremental_suite.dart' as helper;
+import 'package:front_end/src/fasta/util/outline_extractor.dart';
+import 'package:package_config/package_config.dart';
+
+Future<void> main(List<String> args) async {
+  if (args.length != 1) throw "Wants 1 argument.";
+  Uri input = Uri.base.resolve(args.single);
+  Uri packageUri = input.resolve(".packages");
+  Stopwatch stopwatch = new Stopwatch()..start();
+  PackageConfig packageFile = await loadPackageConfigUri(packageUri);
+  print("Read packages file in ${stopwatch.elapsedMilliseconds} ms");
+  List<Package> packages = packageFile.packages.toList();
+  int packageNum = 0;
+  for (Package package in packages) {
+    packageNum++;
+    print("\n\nProcessing package #$packageNum (${package.name}) "
+        "of ${packages.length}");
+    Directory dir = new Directory.fromUri(package.packageUriRoot);
+    List<Uri> uris = [];
+    for (FileSystemEntity entry in dir.listSync(recursive: true)) {
+      if (entry is File && entry.path.endsWith(".dart")) {
+        // Hack.
+        String content = entry.readAsStringSync();
+        if (content.contains("part of")) continue;
+        String asString = "${entry.uri}";
+        String packageName = package.name;
+        Uri packageUri = package.packageUriRoot;
+        String prefix = "${packageUri}";
+        if (asString.startsWith(prefix)) {
+          Uri reversed = Uri.parse(
+              "package:$packageName/${asString.substring(prefix.length)}");
+          uris.add(reversed);
+        } else {
+          throw "Unexpected!";
+        }
+      }
+    }
+    print("(found ${uris.length} files)");
+    if (uris.isEmpty) continue;
+    await processUri(uris, null, packageUri);
+  }
+  print(" => That's ${packages.length} packages!");
+
+  if (1 + 1 == 2) return;
+
+  Component fullComponent = await processUri([input], null, packageUri);
+  List<Uri> uris = fullComponent.libraries.map((l) => l.importUri).toList();
+  int i = 0;
+  for (Uri uri in uris) {
+    i++;
+    print("\n\nProcessing $uri (${i} of ${uris.length})");
+    try {
+      await processUri([uri], fullComponent, packageUri);
+    } catch (e, st) {
+      print("\n\n-------------\n\n");
+      print("Crashed on uri $uri");
+      print("Exception: '$e'");
+      print(st);
+      print("\n\n-------------\n\n");
+    }
+  }
+}
+
+Future<Component> processUri(final List<Uri> inputs, Component? fullComponent,
+    final Uri packageUri) async {
+  TargetFlags targetFlags =
+      new TargetFlags(enableNullSafety: true, trackWidgetCreation: false);
+  Target? target = new Dart2jsTarget("dart2js", targetFlags);
+  Uri sdkSummary = Uri.base.resolve("out/ReleaseX64/dart2js_outline.dill");
+  Stopwatch stopwatch = new Stopwatch()..start();
+  Stopwatch extractCompile = new Stopwatch()..start();
+  Map<Uri, String> processedFiles = await extractOutline(inputs,
+      packages: packageUri, target: target, platform: sdkSummary);
+  extractCompile.stop();
+  print("Got ${processedFiles.keys.length} files "
+      "in ${stopwatch.elapsedMilliseconds} ms");
+
+  Set<Uri> inputsSet = inputs.toSet();
+
+  Stopwatch plainCompile = new Stopwatch()..start();
+  List<Library> libs1;
+  {
+    stopwatch.reset();
+    CompilerOptions options = helper.getOptions();
+    options.target = target;
+    options.sdkSummary = sdkSummary;
+    options.packagesFileUri = packageUri;
+    helper.TestIncrementalCompiler compiler =
+        new helper.TestIncrementalCompiler(options, inputs.first,
+            /* initializeFrom = */ null, /* outlineOnly = */ true);
+    fullComponent = fullComponent ??
+        (await compiler.computeDelta(entryPoints: inputs)).component;
+    print("Compiled full in ${stopwatch.elapsedMilliseconds} ms "
+        "to ${fullComponent.libraries.length} libraries");
+    plainCompile.stop();
+
+    libs1 = fullComponent.libraries
+        .where((element) => inputsSet.contains(element.importUri))
+        .toList();
+  }
+  List<Library> libs2;
+  {
+    stopwatch.reset();
+    extractCompile.start();
+    CompilerOptions options = helper.getOptions();
+    options.target = target;
+    options.sdkSummary = sdkSummary;
+    options.packagesFileUri = packageUri;
+    MemoryFileSystem mfs = new MemoryFileSystem(Uri.base);
+    mfs.entityForUri(packageUri).writeAsBytesSync(
+        await options.fileSystem.entityForUri(packageUri).readAsBytes());
+    if (options.sdkSummary != null) {
+      mfs.entityForUri(options.sdkSummary!).writeAsBytesSync(await options
+          .fileSystem
+          .entityForUri(options.sdkSummary!)
+          .readAsBytes());
+    }
+    if (options.librariesSpecificationUri != null) {
+      mfs.entityForUri(options.librariesSpecificationUri!).writeAsBytesSync(
+          await options.fileSystem
+              .entityForUri(options.librariesSpecificationUri!)
+              .readAsBytes());
+    }
+    for (MapEntry<Uri, String> entry in processedFiles.entries) {
+      mfs.entityForUri(entry.key).writeAsStringSync(entry.value);
+    }
+    options.fileSystem = mfs;
+    helper.TestIncrementalCompiler compiler =
+        new helper.TestIncrementalCompiler(options, inputs.first,
+            /* initializeFrom = */ null, /* outlineOnly = */ true);
+    IncrementalCompilerResult c =
+        await compiler.computeDelta(entryPoints: inputs);
+    print("Compiled outlined in ${stopwatch.elapsedMilliseconds} ms "
+        "to ${c.component.libraries.length} libraries");
+    extractCompile.stop();
+
+    libs2 = c.component.libraries
+        .where((element) => inputsSet.contains(element.importUri))
+        .toList();
+  }
+
+  int libSorter(Library a, Library b) {
+    return a.importUri.toString().compareTo(b.importUri.toString());
+  }
+
+  libs1.sort(libSorter);
+  libs2.sort(libSorter);
+  if (libs1.length != libs2.length) {
+    print("Bad:");
+    print(
+        "Not the same amount of libraries: ${libs1.length} vs ${libs2.length}");
+    throw "bad result for $inputs";
+  }
+  List<EquivalenceResult> badResults = [];
+  for (int i = 0; i < libs1.length; i++) {
+    EquivalenceResult result =
+        checkEquivalence(libs1[i], libs2[i], strategy: const Strategy());
+    if (!result.isEquivalent) {
+      badResults.add(result);
+    }
+  }
+
+  if (badResults.isEmpty) {
+    print("OK");
+  } else {
+    print("Bad:");
+    for (EquivalenceResult badResult in badResults) {
+      print(badResult);
+      print("---");
+    }
+    // globalDebuggingNames = new NameSystem();
+    // print(lib1.leakingDebugToString());
+    // print("\n---\nvs\n----\n");
+    // globalDebuggingNames = new NameSystem();
+    // print(lib2.leakingDebugToString());
+    throw "bad result for $inputs";
+  }
+
+  if (plainCompile.elapsedMilliseconds > extractCompile.elapsedMilliseconds) {
+    print("=> Plain compile slower! "
+        "(${plainCompile.elapsedMilliseconds} vs "
+        "${extractCompile.elapsedMilliseconds})");
+  } else {
+    print("=> Plain compile faster! "
+        "(${plainCompile.elapsedMilliseconds} vs "
+        "${extractCompile.elapsedMilliseconds})");
+  }
+
+  return fullComponent;
+}
+
+class Strategy extends EquivalenceStrategy {
+  const Strategy();
+
+  @override
+  bool checkTreeNode_fileOffset(
+      EquivalenceVisitor visitor, TreeNode node, TreeNode other) {
+    return true;
+  }
+
+  @override
+  bool checkAssertStatement_conditionStartOffset(
+      EquivalenceVisitor visitor, AssertStatement node, AssertStatement other) {
+    return true;
+  }
+
+  @override
+  bool checkAssertStatement_conditionEndOffset(
+      EquivalenceVisitor visitor, AssertStatement node, AssertStatement other) {
+    return true;
+  }
+
+  @override
+  bool checkClass_startFileOffset(
+      EquivalenceVisitor visitor, Class node, Class other) {
+    return true;
+  }
+
+  @override
+  bool checkClass_fileEndOffset(
+      EquivalenceVisitor visitor, Class node, Class other) {
+    return true;
+  }
+
+  @override
+  bool checkProcedure_startFileOffset(
+      EquivalenceVisitor visitor, Procedure node, Procedure other) {
+    return true;
+  }
+
+  @override
+  bool checkConstructor_startFileOffset(
+      EquivalenceVisitor visitor, Constructor node, Constructor other) {
+    return true;
+  }
+
+  @override
+  bool checkMember_fileEndOffset(
+      EquivalenceVisitor visitor, Member node, Member other) {
+    return true;
+  }
+
+  @override
+  bool checkFunctionNode_fileEndOffset(
+      EquivalenceVisitor visitor, FunctionNode node, FunctionNode other) {
+    return true;
+  }
+
+  @override
+  bool checkBlock_fileEndOffset(
+      EquivalenceVisitor visitor, Block node, Block other) {
+    return true;
+  }
+
+  @override
+  bool checkLibrary_additionalExports(
+      EquivalenceVisitor visitor, Library node, Library other) {
+    return visitor.checkSets(
+        node.additionalExports.toSet(),
+        other.additionalExports.toSet(),
+        visitor.matchReferences,
+        visitor.checkReferences,
+        'additionalExports');
+  }
+
+  @override
+  bool checkClass_procedures(
+      EquivalenceVisitor visitor, Class node, Class other) {
+    // Check procedures as a set instead of a list to allow for reordering.
+    List<Procedure> a = node.procedures.toList();
+    int sorter(Procedure x, Procedure y) {
+      int result = x.name.text.compareTo(y.name.text);
+      if (result != 0) return result;
+      result = x.kind.index - y.kind.index;
+      if (result != 0) return result;
+      // other stuff?
+      return 0;
+    }
+
+    a.sort(sorter);
+    List<Procedure> b = other.procedures.toList();
+    b.sort(sorter);
+    // return visitor.checkSets(a.toSet(), b.toSet(),
+    //     visitor.matchNamedNodes, visitor.checkNodes, 'procedures');
+
+    return visitor.checkLists(a, b, visitor.checkNodes, 'procedures');
+  }
+}
diff --git a/pkg/front_end/test/packages_format_error_test.dart b/pkg/front_end/test/packages_format_error_test.dart
index a9fa5f3..a19551f 100644
--- a/pkg/front_end/test/packages_format_error_test.dart
+++ b/pkg/front_end/test/packages_format_error_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
     show DiagnosticMessage, getMessageCodeObject;
 
diff --git a/pkg/front_end/test/parser_all_suite.dart b/pkg/front_end/test/parser_all_suite.dart
index 9aab3a5..bef7873 100644
--- a/pkg/front_end/test/parser_all_suite.dart
+++ b/pkg/front_end/test/parser_all_suite.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:testing/testing.dart' show Chain, ChainContext, runMe;
 
 import 'parser_suite.dart';
diff --git a/pkg/front_end/test/parser_equivalence_suite.dart b/pkg/front_end/test/parser_equivalence_suite.dart
index 5e4d772..b35a7b3 100644
--- a/pkg/front_end/test/parser_equivalence_suite.dart
+++ b/pkg/front_end/test/parser_equivalence_suite.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io';
 
 import "package:yaml/yaml.dart" show YamlMap, loadYamlNode;
@@ -53,13 +51,13 @@
       TestDescription description, Context context) {
     Uri uri = description.uri;
     String contents = new File.fromUri(uri).readAsStringSync();
-    YamlMap yaml = loadYamlNode(contents, sourceUrl: uri);
+    YamlMap yaml = loadYamlNode(contents, sourceUrl: uri) as YamlMap;
     List<Uri> files =
         (yaml["files"] as List).map((s) => uri.resolve(s)).toList();
     Set<String> filters = new Set<String>.from(yaml["filters"] ?? []);
     Set<String> ignored = new Set<String>.from(yaml["ignored"] ?? []);
 
-    ParserTestListenerWithMessageFormatting parserTestListenerFirst =
+    ParserTestListenerWithMessageFormatting? parserTestListenerFirst =
         ListenerStep.doListenerParsing(
       files[0],
       context.suiteName,
@@ -70,7 +68,7 @@
     }
 
     for (int i = 1; i < files.length; i++) {
-      ParserTestListenerWithMessageFormatting parserTestListener =
+      ParserTestListenerWithMessageFormatting? parserTestListener =
           ListenerStep.doListenerParsing(
         files[i],
         context.suiteName,
@@ -79,7 +77,7 @@
       if (parserTestListener == null) {
         return Future.value(crash(description, StackTrace.current));
       }
-      String compareResult = compare(
+      String? compareResult = compare(
           parserTestListenerFirst, parserTestListener, filters, ignored);
       if (compareResult != null) {
         return Future.value(
@@ -90,7 +88,7 @@
     return new Future.value(new Result<TestDescription>.pass(description));
   }
 
-  String compare(
+  String? compare(
       ParserTestListenerWithMessageFormatting a,
       ParserTestListenerWithMessageFormatting b,
       Set<String> filters,
diff --git a/pkg/front_end/test/parser_suite.dart b/pkg/front_end/test/parser_suite.dart
index cb24755..5910e30 100644
--- a/pkg/front_end/test/parser_suite.dart
+++ b/pkg/front_end/test/parser_suite.dart
@@ -15,7 +15,7 @@
 import 'package:front_end/src/fasta/source/diet_parser.dart'
     show useImplicitCreationExpressionInCfe;
 
-import 'package:front_end/src/fasta/util/direct_parser_ast.dart' show getAST;
+import 'package:front_end/src/fasta/util/parser_ast.dart' show getAST;
 
 import 'package:_fe_analyzer_shared/src/parser/parser.dart'
     show Parser, lengthOfSpan;
@@ -29,8 +29,8 @@
 import 'package:front_end/src/fasta/source/stack_listener_impl.dart'
     show offsetForToken;
 
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart'
-    show DirectParserASTContent;
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart'
+    show ParserAstNode;
 
 import 'package:kernel/ast.dart';
 
@@ -144,7 +144,7 @@
   @override
   final List<Step> steps = const <Step>[
     const ListenerStep(false),
-    const DirectParserASTStep(),
+    const ParserAstStep(),
   ];
 
   @override
@@ -159,18 +159,17 @@
   }
 }
 
-class DirectParserASTStep
-    extends Step<TestDescription, TestDescription, Context> {
-  const DirectParserASTStep();
+class ParserAstStep extends Step<TestDescription, TestDescription, Context> {
+  const ParserAstStep();
   @override
-  String get name => "DirectParserAST";
+  String get name => "ParserAst";
   @override
   Future<Result<TestDescription>> run(
       TestDescription description, Context context) {
     Uri uri = description.uri;
     File f = new File.fromUri(uri);
     List<int> rawBytes = f.readAsBytesSync();
-    DirectParserASTContent ast = getAST(rawBytes);
+    ParserAstNode ast = getAST(rawBytes);
     if (ast.what != "CompilationUnit") {
       throw "Expected a single element for 'CompilationUnit' "
           "but got ${ast.what}";
diff --git a/pkg/front_end/test/parser_test_listener.dart b/pkg/front_end/test/parser_test_listener.dart
index f82cd95..f90c7fa 100644
--- a/pkg/front_end/test/parser_test_listener.dart
+++ b/pkg/front_end/test/parser_test_listener.dart
@@ -214,12 +214,9 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
     seen(implementsKeyword);
-    doPrint('handleClassOrMixinImplements('
-        '$implementsKeyword, '
-        '$interfacesCount)');
+    doPrint('handleImplements(' '$implementsKeyword, ' '$interfacesCount)');
   }
 
   @override
@@ -450,11 +447,60 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
     indent--;
     seen(enumKeyword);
     seen(leftBrace);
-    doPrint('endEnum(' '$enumKeyword, ' '$leftBrace, ' '$count)');
+    doPrint('endEnum(' '$enumKeyword, ' '$leftBrace, ' '$memberCount)');
+  }
+
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    indent--;
+    seen(getOrSet);
+    seen(beginToken);
+    seen(beginParam);
+    seen(beginInitializers);
+    seen(endToken);
+    doPrint('endEnumConstructor('
+        '$getOrSet, '
+        '$beginToken, '
+        '$beginParam, '
+        '$beginInitializers, '
+        '$endToken)');
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    seen(elementsEndToken);
+    doPrint('handleEnumElements(' '$elementsEndToken, ' '$elementsCount)');
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    seen(enumKeyword);
+    seen(leftBrace);
+    doPrint('handleEnumHeader(' '$enumKeyword, ' '$leftBrace)');
+  }
+
+  @override
+  void handleEnumElement(Token beginToken) {
+    seen(beginToken);
+    doPrint('handleEnumElement(' '$beginToken)');
+  }
+
+  @override
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    indent--;
+    seen(beginToken);
+    seen(factoryKeyword);
+    seen(endToken);
+    doPrint('endEnumFactoryMethod('
+        '$beginToken, '
+        '$factoryKeyword, '
+        '$endToken)');
   }
 
   @override
@@ -556,7 +602,8 @@
   @override
   void endFormalParameter(
       Token? thisKeyword,
-      Token? periodAfterThis,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
       Token? initializerStart,
       Token? initializerEnd,
@@ -564,13 +611,15 @@
       MemberKind memberKind) {
     indent--;
     seen(thisKeyword);
-    seen(periodAfterThis);
+    seen(superKeyword);
+    seen(periodAfterThisOrSuper);
     seen(nameToken);
     seen(initializerStart);
     seen(initializerEnd);
     doPrint('endFormalParameter('
         '$thisKeyword, '
-        '$periodAfterThis, '
+        '$superKeyword, '
+        '$periodAfterThisOrSuper, '
         '$nameToken, '
         '$initializerStart, '
         '$initializerEnd, '
@@ -701,6 +750,55 @@
   }
 
   @override
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    indent--;
+    seen(abstractToken);
+    seen(externalToken);
+    seen(staticToken);
+    seen(covariantToken);
+    seen(lateToken);
+    seen(varFinalOrConst);
+    seen(beginToken);
+    seen(endToken);
+    doPrint('endEnumFields('
+        '$abstractToken, '
+        '$externalToken, '
+        '$staticToken, '
+        '$covariantToken, '
+        '$lateToken, '
+        '$varFinalOrConst, '
+        '$count, '
+        '$beginToken, '
+        '$endToken)');
+  }
+
+  @override
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    indent--;
+    seen(getOrSet);
+    seen(beginToken);
+    seen(beginParam);
+    seen(beginInitializers);
+    seen(endToken);
+    doPrint('endEnumMethod('
+        '$getOrSet, '
+        '$beginToken, '
+        '$beginParam, '
+        '$beginInitializers, '
+        '$endToken)');
+  }
+
+  @override
   void handleForInitializerEmptyStatement(Token token) {
     seen(token);
     doPrint('handleForInitializerEmptyStatement(' '$token)');
@@ -907,6 +1005,17 @@
   }
 
   @override
+  void handleEnumWithClause(Token withKeyword) {
+    seen(withKeyword);
+    doPrint('handleEnumWithClause(' '$withKeyword)');
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    doPrint('handleEnumNoWithClause()');
+  }
+
+  @override
   void beginNamedMixinApplication(
       Token begin, Token? abstractToken, Token name) {
     seen(begin);
@@ -2308,6 +2417,12 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    seen(token);
+    doPrint('handleNoTypeNameInConstructorReference(' '$token)');
+  }
+
+  @override
   void handleNoType(Token lastConsumed) {
     seen(lastConsumed);
     doPrint('handleNoType(' '$lastConsumed)');
diff --git a/pkg/front_end/test/parser_test_listener_creator.dart b/pkg/front_end/test/parser_test_listener_creator.dart
index c2c6df4..fab26f9 100644
--- a/pkg/front_end/test/parser_test_listener_creator.dart
+++ b/pkg/front_end/test/parser_test_listener_creator.dart
@@ -2,8 +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.
 
-// @dart=2.9
-
 import 'dart:io' show File;
 import 'dart:typed_data' show Uint8List;
 
@@ -120,15 +118,15 @@
 class ParserCreatorListener extends Listener {
   final StringSink out;
   bool insideListenerClass = false;
-  String currentMethodName;
-  String latestSeenParameterTypeToken;
-  List<String> parameters = <String>[];
-  List<String> parameterTypes = <String>[];
+  String? currentMethodName;
+  String? latestSeenParameterTypeToken;
+  List<String> parameters = [];
+  List<String?> parameterTypes = [];
 
   ParserCreatorListener(this.out);
 
   @override
-  void beginClassDeclaration(Token begin, Token abstractToken, Token name) {
+  void beginClassDeclaration(Token begin, Token? abstractToken, Token name) {
     if (name.lexeme == "Listener") insideListenerClass = true;
   }
 
@@ -140,23 +138,23 @@
   @override
   void beginMethod(
       DeclarationKind declarationKind,
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token varFinalOrConst,
-      Token getOrSet,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? varFinalOrConst,
+      Token? getOrSet,
       Token name) {
     currentMethodName = name.lexeme;
   }
 
   @override
-  void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     if (insideListenerClass) {
       out.writeln("  @override");
       out.write("  ");
       Token token = beginToken;
-      Token latestToken;
+      Token? latestToken;
       while (true) {
         if (latestToken != null && latestToken.charEnd < token.charOffset) {
           out.write(" ");
@@ -171,14 +169,14 @@
           throw token.runtimeType;
         }
         latestToken = token;
-        token = token.next;
+        token = token.next!;
       }
 
       if (token is SimpleToken && token.type == TokenType.FUNCTION) {
         out.write(" null;");
       } else {
         out.write("\n    ");
-        if (currentMethodName.startsWith("end")) {
+        if (currentMethodName!.startsWith("end")) {
           out.write("indent--;\n    ");
         }
         for (int i = 0; i < parameterTypes.length; i++) {
@@ -196,7 +194,7 @@
         }
         out.write(")');\n  ");
 
-        if (currentMethodName.startsWith("begin")) {
+        if (currentMethodName!.startsWith("begin")) {
           out.write("  indent++;\n  ");
         }
 
@@ -224,17 +222,18 @@
   }
 
   @override
-  void handleType(Token beginToken, Token questionMark) {
+  void handleType(Token beginToken, Token? questionMark) {
     latestSeenParameterTypeToken = beginToken.lexeme;
   }
 
   @override
   void endFormalParameter(
-      Token thisKeyword,
-      Token periodAfterThis,
+      Token? thisKeyword,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
-      Token initializerStart,
-      Token initializerEnd,
+      Token? initializerStart,
+      Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
     parameters.add(nameToken.lexeme);
diff --git a/pkg/front_end/test/parser_test_parser.dart b/pkg/front_end/test/parser_test_parser.dart
index a6ba2ca..139220a 100644
--- a/pkg/front_end/test/parser_test_parser.dart
+++ b/pkg/front_end/test/parser_test_parser.dart
@@ -392,10 +392,19 @@
   }
 
   @override
-  Token parseWithClauseOpt(Token token) {
-    doPrint('parseWithClauseOpt(' '$token)');
+  Token parseClassWithClauseOpt(Token token) {
+    doPrint('parseClassWithClauseOpt(' '$token)');
     indent++;
-    var result = super.parseWithClauseOpt(token);
+    var result = super.parseClassWithClauseOpt(token);
+    indent--;
+    return result;
+  }
+
+  @override
+  Token parseEnumWithClauseOpt(Token token) {
+    doPrint('parseEnumWithClauseOpt(' '$token)');
+    indent++;
+    var result = super.parseEnumWithClauseOpt(token);
     indent--;
     return result;
   }
@@ -555,6 +564,24 @@
   }
 
   @override
+  Token parseEnumHeaderOpt(Token token, Token enumKeyword) {
+    doPrint('parseEnumHeaderOpt(' '$token, ' '$enumKeyword)');
+    indent++;
+    var result = super.parseEnumHeaderOpt(token, enumKeyword);
+    indent--;
+    return result;
+  }
+
+  @override
+  Token parseEnumElement(Token token) {
+    doPrint('parseEnumElement(' '$token)');
+    indent++;
+    var result = super.parseEnumElement(token);
+    indent--;
+    return result;
+  }
+
+  @override
   Token parseClassOrNamedMixinApplication(
       Token? abstractToken, Token classKeyword) {
     doPrint('parseClassOrNamedMixinApplication('
@@ -628,10 +655,10 @@
   }
 
   @override
-  Token parseClassOrMixinImplementsOpt(Token token) {
-    doPrint('parseClassOrMixinImplementsOpt(' '$token)');
+  Token parseClassOrMixinOrEnumImplementsOpt(Token token) {
+    doPrint('parseClassOrMixinOrEnumImplementsOpt(' '$token)');
     indent++;
-    var result = super.parseClassOrMixinImplementsOpt(token);
+    var result = super.parseClassOrMixinOrEnumImplementsOpt(token);
     indent--;
     return result;
   }
@@ -1126,14 +1153,14 @@
   }
 
   @override
-  Token parseClassOrMixinOrExtensionMemberImpl(
+  Token parseClassOrMixinOrExtensionOrEnumMemberImpl(
       Token token, DeclarationKind kind, String? enclosingDeclarationName) {
-    doPrint('parseClassOrMixinOrExtensionMemberImpl('
+    doPrint('parseClassOrMixinOrExtensionOrEnumMemberImpl('
         '$token, '
         '$kind, '
         '$enclosingDeclarationName)');
     indent++;
-    var result = super.parseClassOrMixinOrExtensionMemberImpl(
+    var result = super.parseClassOrMixinOrExtensionOrEnumMemberImpl(
         token, kind, enclosingDeclarationName);
     indent--;
     return result;
@@ -1279,14 +1306,15 @@
   @override
   Token parseConstructorReference(
       Token token, ConstructorReferenceContext constructorReferenceContext,
-      [TypeParamOrArgInfo? typeArg]) {
+      [TypeParamOrArgInfo? typeArg, bool isImplicitTypeName = false]) {
     doPrint('parseConstructorReference('
         '$token, '
         '$constructorReferenceContext, '
-        '$typeArg)');
+        '$typeArg, '
+        '$isImplicitTypeName)');
     indent++;
-    var result = super
-        .parseConstructorReference(token, constructorReferenceContext, typeArg);
+    var result = super.parseConstructorReference(
+        token, constructorReferenceContext, typeArg, isImplicitTypeName);
     indent--;
     return result;
   }
diff --git a/pkg/front_end/test/parser_test_parser_creator.dart b/pkg/front_end/test/parser_test_parser_creator.dart
index 136e903..32cb010 100644
--- a/pkg/front_end/test/parser_test_parser_creator.dart
+++ b/pkg/front_end/test/parser_test_parser_creator.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io';
 import 'dart:typed_data';
 
@@ -106,14 +104,14 @@
 class ParserCreatorListener extends Listener {
   final StringSink out;
   bool insideParserClass = false;
-  String currentMethodName;
-  List<String> parameters = <String>[];
-  List<String> parametersNamed = <String>[];
+  String? currentMethodName;
+  List<String> parameters = [];
+  List<String?> parametersNamed = [];
 
   ParserCreatorListener(this.out);
 
   @override
-  void beginClassDeclaration(Token begin, Token abstractToken, Token name) {
+  void beginClassDeclaration(Token begin, Token? abstractToken, Token name) {
     if (name.lexeme == "Parser") insideParserClass = true;
   }
 
@@ -125,29 +123,29 @@
   @override
   void beginMethod(
       DeclarationKind declarationKind,
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token varFinalOrConst,
-      Token getOrSet,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? varFinalOrConst,
+      Token? getOrSet,
       Token name) {
     currentMethodName = name.lexeme;
   }
 
   @override
-  void endClassConstructor(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endClassConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     parameters.clear();
     parametersNamed.clear();
     currentMethodName = null;
   }
 
   @override
-  void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
-    if (insideParserClass && !currentMethodName.startsWith("_")) {
+  void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    if (insideParserClass && !currentMethodName!.startsWith("_")) {
       Token token = beginToken;
-      Token latestToken;
+      Token? latestToken;
       out.writeln("  @override");
       out.write("  ");
       while (true) {
@@ -156,7 +154,7 @@
             out.write(" ");
           }
           out.write("dynamic");
-          token = troubleParameterTokens[token];
+          token = troubleParameterTokens[token]!;
         }
         if (latestToken != null && latestToken.charEnd < token.charOffset) {
           out.write(" ");
@@ -169,16 +167,15 @@
         out.write(token.lexeme);
         if (token is BeginToken &&
             token.type == TokenType.OPEN_CURLY_BRACKET &&
-            (beginParam == null ||
-                beginParam.endGroup == endToken ||
-                token.charOffset > beginParam.endGroup.charOffset)) {
+            (beginParam.endGroup == endToken ||
+                token.charOffset > beginParam.endGroup!.charOffset)) {
           break;
         }
         if (token == endToken) {
           throw token.runtimeType;
         }
         latestToken = token;
-        token = token.next;
+        token = token.next!;
       }
 
       out.write("\n    ");
@@ -244,17 +241,17 @@
     formalParametersNestLevel--;
   }
 
-  Token currentFormalParameterToken;
+  Token? currentFormalParameterToken;
 
   @override
-  void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
-      Token covariantToken, Token varFinalOrConst) {
+  void beginFormalParameter(Token token, MemberKind kind, Token? requiredToken,
+      Token? covariantToken, Token? varFinalOrConst) {
     if (formalParametersNestLevel == 1) {
       currentFormalParameterToken = token;
     }
   }
 
-  Map<Token, Token> troubleParameterTokens = {};
+  Map<Token?, Token?> troubleParameterTokens = {};
 
   @override
   void handleIdentifier(Token token, IdentifierContext context) {
@@ -265,11 +262,12 @@
 
   @override
   void endFormalParameter(
-      Token thisKeyword,
-      Token periodAfterThis,
+      Token? thisKeyword,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
-      Token initializerStart,
-      Token initializerEnd,
+      Token? initializerStart,
+      Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
     if (formalParametersNestLevel != 1) {
diff --git a/pkg/front_end/test/parts/data/main_part_by_file/a.dart b/pkg/front_end/test/parts/data/main_part_by_file/a.dart
new file mode 100644
index 0000000..baa0fc8
--- /dev/null
+++ b/pkg/front_end/test/parts/data/main_part_by_file/a.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 'b.dart';
+
+void main() {
+  method();
+}
diff --git a/pkg/front_end/test/parts/data/main_part_by_file/b.dart b/pkg/front_end/test/parts/data/main_part_by_file/b.dart
new file mode 100644
index 0000000..b87eb7a3
--- /dev/null
+++ b/pkg/front_end/test/parts/data/main_part_by_file/b.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 'a.dart';
+
+void method() {}
diff --git a/pkg/front_end/test/parts/data/main_part_by_name/a.dart b/pkg/front_end/test/parts/data/main_part_by_name/a.dart
new file mode 100644
index 0000000..b78bc7e
--- /dev/null
+++ b/pkg/front_end/test/parts/data/main_part_by_name/a.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 a;
+
+part 'b.dart';
+
+void main() {
+  method();
+}
diff --git a/pkg/front_end/test/parts/data/main_part_by_name/b.dart b/pkg/front_end/test/parts/data/main_part_by_name/b.dart
new file mode 100644
index 0000000..69d3956
--- /dev/null
+++ b/pkg/front_end/test/parts/data/main_part_by_name/b.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 a;
+
+void method() {}
diff --git a/pkg/front_end/test/parts/data/part_main_by_file/a.dart b/pkg/front_end/test/parts/data/part_main_by_file/a.dart
new file mode 100644
index 0000000..28dfcd3
--- /dev/null
+++ b/pkg/front_end/test/parts/data/part_main_by_file/a.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 'b.dart';
+
+void method() {}
diff --git a/pkg/front_end/test/parts/data/part_main_by_file/b.dart b/pkg/front_end/test/parts/data/part_main_by_file/b.dart
new file mode 100644
index 0000000..0ec6788
--- /dev/null
+++ b/pkg/front_end/test/parts/data/part_main_by_file/b.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 'a.dart';
+
+void main() {
+  method();
+}
diff --git a/pkg/front_end/test/parts/data/part_main_by_name/a.dart b/pkg/front_end/test/parts/data/part_main_by_name/a.dart
new file mode 100644
index 0000000..c618591
--- /dev/null
+++ b/pkg/front_end/test/parts/data/part_main_by_name/a.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 b;
+
+void method() {}
diff --git a/pkg/front_end/test/parts/data/part_main_by_name/b.dart b/pkg/front_end/test/parts/data/part_main_by_name/b.dart
new file mode 100644
index 0000000..b0519ed
--- /dev/null
+++ b/pkg/front_end/test/parts/data/part_main_by_name/b.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 b;
+
+part 'a.dart';
+
+void main() {
+  method();
+}
diff --git a/pkg/front_end/test/parts/parts_test.dart b/pkg/front_end/test/parts/parts_test.dart
new file mode 100644
index 0000000..9bfe8ff
--- /dev/null
+++ b/pkg/front_end/test/parts/parts_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. 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:expect/expect.dart';
+import 'package:front_end/src/api_prototype/compiler_options.dart';
+import 'package:front_end/src/api_prototype/kernel_generator.dart';
+import 'package:front_end/src/compute_platform_binaries_location.dart';
+import 'package:front_end/src/fasta/messages.dart';
+
+Future<void> main() async {
+  Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
+  CompilerOptions options = new CompilerOptions()
+    ..sdkRoot = computePlatformBinariesLocation()
+    ..packagesFileUri = Uri.base.resolve('.packages');
+  for (FileSystemEntity dir in dataDir.listSync()) {
+    if (dir is Directory) {
+      print('Compiling ${dir.path}');
+      List<Uri> input = [];
+      for (FileSystemEntity file in dir.listSync()) {
+        input.add(file.absolute.uri);
+      }
+      input.sort((a, b) => a.path.compareTo(b.path));
+      bool hasError = false;
+      options.onDiagnostic = (message) {
+        if (message.severity == Severity.error) {
+          hasError = true;
+        }
+        message.plainTextFormatted.forEach(print);
+      };
+      await kernelForModule(input, options);
+      Expect.isFalse(hasError, "Unexpected errors");
+    }
+  }
+}
diff --git a/pkg/front_end/test/patching/patching_test.dart b/pkg/front_end/test/patching/patching_test.dart
index 9b7d6d9..1cd2220 100644
--- a/pkg/front_end/test/patching/patching_test.dart
+++ b/pkg/front_end/test/patching/patching_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, Platform;
 
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
@@ -49,9 +47,9 @@
 
 class TestConfigWithLanguageVersion extends TestConfig {
   TestConfigWithLanguageVersion(String marker, String name,
-      {Uri librariesSpecificationUri,
+      {Uri? librariesSpecificationUri,
       Map<ExperimentalFlag, bool> experimentalFlags = const {},
-      AllowedExperimentalFlags allowedExperimentalFlags})
+      AllowedExperimentalFlags? allowedExperimentalFlags})
       : super(marker, name,
             librariesSpecificationUri: librariesSpecificationUri,
             explicitExperimentalFlags: experimentalFlags,
@@ -72,7 +70,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new PatchingDataExtractor(compilerResult, actualMap));
   }
 
@@ -82,7 +80,7 @@
       InternalCompilerResult compilerResult,
       Class cls,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new PatchingDataExtractor(compilerResult, actualMap).computeForClass(cls);
   }
 
@@ -92,7 +90,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new PatchingDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
   }
@@ -136,7 +134,7 @@
 
   @override
   Features computeClassValue(Id id, Class cls) {
-    ClassBuilder clsBuilder = lookupClassBuilder(compilerResult, cls);
+    ClassBuilder clsBuilder = lookupClassBuilder(compilerResult, cls)!;
 
     Features features = new Features();
     clsBuilder.scope.forEach((String name, Builder builder) {
@@ -172,9 +170,10 @@
         features.addElement(Tags.initializers, desc);
       }
     }
-    MemberBuilderImpl memberBuilder =
-        lookupMemberBuilder(compilerResult, member, required: false);
-    MemberBuilder patchMember = memberBuilder?.dataForTesting?.patchForTesting;
+    MemberBuilderImpl? memberBuilder =
+        lookupMemberBuilder(compilerResult, member, required: false)
+            as MemberBuilderImpl?;
+    MemberBuilder? patchMember = memberBuilder?.dataForTesting?.patchForTesting;
     if (patchMember != null) {
       features.add(Tags.patch);
     }
diff --git a/pkg/front_end/test/precedence_info_test.dart b/pkg/front_end/test/precedence_info_test.dart
index cce5241..0508cc8 100644
--- a/pkg/front_end/test/precedence_info_test.dart
+++ b/pkg/front_end/test/precedence_info_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart';
 import 'package:_fe_analyzer_shared/src/scanner/abstract_scanner.dart'
     show AbstractScanner;
@@ -22,11 +20,11 @@
 @reflectiveTest
 class PrecedenceInfoTest {
   void assertInfo(check(String source, Token token)) {
-    void assertLexeme(String source) {
+    void assertLexeme(String? source) {
       if (source == null || source.isEmpty) return;
       var token = scanString(source, includeComments: true).tokens;
       while (token is ErrorToken) {
-        token = token.next;
+        token = token.next!;
       }
       check(source, token);
     }
@@ -290,11 +288,11 @@
   }
 
   void test_name() {
-    void assertName(String source, String name, {int offset: 0}) {
+    void assertName(String? source, String name, {int offset: 0}) {
       if (source == null || source.isEmpty) return;
       var token = scanString(source, includeComments: true).tokens;
       while (token is ErrorToken || token.offset < offset) {
-        token = token.next;
+        token = token.next!;
       }
       expect(token.type.name, name,
           reason: 'source: $source\ntoken: ${token.lexeme}');
@@ -393,7 +391,7 @@
       for (String source in lexemes) {
         var token = scanString(source, includeComments: true).tokens;
         while (token is ErrorToken) {
-          token = token.next;
+          token = token.next!;
         }
         expect(token.type.precedence, precedence, reason: source);
       }
diff --git a/pkg/front_end/test/predicates/data/late.dart b/pkg/front_end/test/predicates/data/late.dart
index ebf4162..1889a70 100644
--- a/pkg/front_end/test/predicates/data/late.dart
+++ b/pkg/front_end/test/predicates/data/late.dart
@@ -153,6 +153,10 @@
 */
 late final int? finalTopLevelNullableWithInitializer = 4;
 
+/*member: Class._#new#tearOff:
+ tearoffConstructor,
+ tearoffLowering
+*/
 class Class {
   /*member: Class._#Class#instanceNonNullableWithoutInitializer:
    lateField,
diff --git a/pkg/front_end/test/predicates/data/late_names.dart b/pkg/front_end/test/predicates/data/late_names.dart
index a67c9e9..c8de49a 100644
--- a/pkg/front_end/test/predicates/data/late_names.dart
+++ b/pkg/front_end/test/predicates/data/late_names.dart
@@ -68,6 +68,10 @@
 */
 late int? _a;
 
+/*member: Class._#new#tearOff:
+ tearoffConstructor,
+ tearoffLowering
+*/
 class Class {
   /*member: Class._#Class#a:
    lateField,
@@ -198,6 +202,10 @@
   static late int? _b;
 }
 
+/*member: _Class._#new#tearOff:
+ tearoffConstructor,
+ tearoffLowering
+*/
 class _Class {
   /*member: _Class._#_Class#a:
    lateField,
diff --git a/pkg/front_end/test/predicates/data/tear_off.dart b/pkg/front_end/test/predicates/data/tear_off.dart
new file mode 100644
index 0000000..9bd0a48
--- /dev/null
+++ b/pkg/front_end/test/predicates/data/tear_off.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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<T> {
+  /*member: Class._#new#tearOff:
+   tearoffConstructor,
+   tearoffLowering
+  */
+  Class();
+
+  /*member: Class._#fact#tearOff:
+   tearoffConstructor,
+   tearoffLowering
+  */
+  factory Class.fact() => new Class();
+
+  /*member: Class._#redirect#tearOff:
+   tearoffConstructor,
+   tearoffLowering
+  */
+  factory Class.redirect() = Class;
+}
+
+/*member: _#Typedef#new#tearOff:
+ tearoffLowering,
+ tearoffTypedef
+*/
+/*member: _#Typedef#fact#tearOff:
+tearoffLowering,
+tearoffTypedef
+*/
+/*member: _#Typedef#redirect#tearOff:
+ tearoffLowering,
+ tearoffTypedef
+*/
+typedef Typedef<T extends num> = Class<T>;
+
+main() {}
diff --git a/pkg/front_end/test/predicates/predicate_test.dart b/pkg/front_end/test/predicates/predicate_test.dart
index ec7b50d..5866119 100644
--- a/pkg/front_end/test/predicates/predicate_test.dart
+++ b/pkg/front_end/test/predicates/predicate_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart';
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
@@ -34,6 +32,8 @@
               ExperimentalFlag.nonNullable: true
             },
             targetFlags: const TestTargetFlags(
+                forceConstructorTearOffLoweringForTesting:
+                    ConstructorTearOffLowering.all,
                 forceLateLoweringsForTesting: LateLowering.all,
                 forceLateLoweringSentinelForTesting: false),
             nnbdMode: NnbdMode.Strong),
@@ -42,6 +42,8 @@
               ExperimentalFlag.nonNullable: true
             },
             targetFlags: const TestTargetFlags(
+                forceConstructorTearOffLoweringForTesting:
+                    ConstructorTearOffLowering.all,
                 forceLateLoweringsForTesting: LateLowering.all,
                 forceLateLoweringSentinelForTesting: true),
             nnbdMode: NnbdMode.Strong)
@@ -63,6 +65,10 @@
   static const String lateLocalSetter = 'lateLocalSetter';
 
   static const String extensionThis = 'extensionThis';
+
+  static const String tearoffLowering = 'tearoffLowering';
+  static const String tearoffConstructor = 'tearoffConstructor';
+  static const String tearoffTypedef = 'tearoffTypedef';
 }
 
 class PredicateDataComputer extends DataComputer<Features> {
@@ -77,7 +83,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new PredicateDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
   }
@@ -88,7 +94,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new PredicateDataExtractor(compilerResult, actualMap));
   }
 
@@ -106,14 +112,14 @@
       : super(compilerResult, actualMap);
 
   @override
-  Features computeLibraryValue(Id id, Library node) {
+  Features? computeLibraryValue(Id id, Library node) {
     return null;
   }
 
   @override
-  Features computeMemberValue(Id id, Member node) {
+  Features? computeMemberValue(Id id, Member node) {
+    Features features = new Features();
     if (node is Field) {
-      Features features = new Features();
       if (isLateLoweredField(node)) {
         features.add(Tags.lateField);
         features[Tags.lateFieldName] =
@@ -124,18 +130,16 @@
         features[Tags.lateFieldName] =
             extractFieldNameFromLateLoweredIsSetField(node).text;
       }
-      Field target = getLateFieldTarget(node);
+      Field? target = getLateFieldTarget(node);
       if (target != null) {
         features[Tags.lateFieldTarget] = getQualifiedMemberName(target);
       }
-      Expression initializer = getLateFieldInitializer(node);
+      Expression? initializer = getLateFieldInitializer(node);
       if (initializer != null) {
         features[Tags.lateFieldInitializer] =
             initializer.toText(astTextStrategyForTesting);
       }
-      return features;
     } else if (node is Procedure) {
-      Features features = new Features();
       if (isLateLoweredFieldGetter(node)) {
         features.add(Tags.lateFieldGetter);
         features[Tags.lateFieldName] =
@@ -146,29 +150,37 @@
         features[Tags.lateFieldName] =
             extractFieldNameFromLateLoweredFieldSetter(node).text;
       }
-      Field target = getLateFieldTarget(node);
+      Field? target = getLateFieldTarget(node);
       if (target != null) {
         features[Tags.lateFieldTarget] = getQualifiedMemberName(target);
       }
-      Expression initializer = getLateFieldInitializer(node);
+      Expression? initializer = getLateFieldInitializer(node);
       if (initializer != null) {
         features[Tags.lateFieldInitializer] =
             initializer.toText(astTextStrategyForTesting);
       }
-      return features;
+      if (isConstructorTearOffLowering(node)) {
+        features.add(Tags.tearoffConstructor);
+      }
+      if (isTypedefTearOffLowering(node)) {
+        features.add(Tags.tearoffTypedef);
+      }
     }
-    return null;
+    if (isTearOffLowering(node)) {
+      features.add(Tags.tearoffLowering);
+    }
+    return features;
   }
 
   @override
   void visitProcedure(Procedure node) {
     super.visitProcedure(node);
     nodeIdMap.forEach((String name, NodeId id) {
-      Features features = featureMap[name];
+      Features? features = featureMap[name];
       if (features != null) {
-        TreeNode nodeWithOffset = computeTreeNodeWithOffset(node);
+        TreeNode nodeWithOffset = computeTreeNodeWithOffset(node)!;
         registerValue(
-            nodeWithOffset.location.file, id.value, id, features, name);
+            nodeWithOffset.location!.file, id.value, id, features, name);
       }
     });
     nodeIdMap.clear();
@@ -177,22 +189,22 @@
 
   @override
   void visitVariableDeclaration(VariableDeclaration node) {
-    String name;
-    String tag;
+    String? name;
+    String? tag;
     if (isLateLoweredLocal(node)) {
-      name = extractLocalNameFromLateLoweredLocal(node.name);
+      name = extractLocalNameFromLateLoweredLocal(node.name!);
       tag = Tags.lateLocal;
     } else if (isLateLoweredIsSetLocal(node)) {
-      name = extractLocalNameFromLateLoweredIsSet(node.name);
+      name = extractLocalNameFromLateLoweredIsSet(node.name!);
       tag = Tags.lateIsSetLocal;
     } else if (isLateLoweredLocalGetter(node)) {
-      name = extractLocalNameFromLateLoweredGetter(node.name);
+      name = extractLocalNameFromLateLoweredGetter(node.name!);
       tag = Tags.lateLocalGetter;
     } else if (isLateLoweredLocalSetter(node)) {
-      name = extractLocalNameFromLateLoweredSetter(node.name);
+      name = extractLocalNameFromLateLoweredSetter(node.name!);
       tag = Tags.lateLocalSetter;
     } else if (isExtensionThis(node)) {
-      name = extractLocalNameForExtensionThis(node.name);
+      name = extractLocalNameForExtensionThis(node.name!);
       tag = Tags.extensionThis;
     } else if (node.name != null) {
       name = node.name;
@@ -210,7 +222,7 @@
   }
 
   @override
-  ActualData<Features> mergeData(
+  ActualData<Features>? mergeData(
       ActualData<Features> value1, ActualData<Features> value2) {
     if ('${value1.value}' == '${value2.value}') {
       // The extension this parameter is seen twice in the extension method
diff --git a/pkg/front_end/test/read_dill_from_binary_md_git_test.dart b/pkg/front_end/test/read_dill_from_binary_md_git_test.dart
index ec6277b..30a5ebd 100644
--- a/pkg/front_end/test/read_dill_from_binary_md_git_test.dart
+++ b/pkg/front_end/test/read_dill_from_binary_md_git_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show File, Platform;
 
 import 'package:kernel/target/targets.dart' show NoneTarget, TargetFlags;
diff --git a/pkg/front_end/test/relativize_test.dart b/pkg/front_end/test/relativize_test.dart
index c42fac6..ce5e36b 100644
--- a/pkg/front_end/test/relativize_test.dart
+++ b/pkg/front_end/test/relativize_test.dart
@@ -2,14 +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.
 
-// @dart = 2.9
-
 import 'package:_fe_analyzer_shared/src/util/relativize.dart';
 import 'package:test/test.dart';
 
 void main() {
   test('test relativeUri', () {
-    void c(String expected, String base, String path, bool isWindows) {
+    void c(String expected, String base, String path, bool? isWindows) {
       if (isWindows == null) {
         c(expected, base, path, true);
         c(expected, base, path, false);
diff --git a/pkg/front_end/test/scanner_fasta_test.dart b/pkg/front_end/test/scanner_fasta_test.dart
index b5c55b5..215423e 100644
--- a/pkg/front_end/test/scanner_fasta_test.dart
+++ b/pkg/front_end/test/scanner_fasta_test.dart
@@ -2,8 +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.
 
-// @dart=2.9
-
 import 'dart:convert';
 
 import 'package:_fe_analyzer_shared/src/scanner/error_token.dart' as fasta;
@@ -38,16 +36,16 @@
 
     usedForFuzzTesting.ScannerResult result =
         usedForFuzzTesting.scanString(source);
-    expect(result?.hasErrors, isFalse);
-    expect(result.tokens?.type, same(Keyword.CLASS));
+    expect(result.hasErrors, isFalse);
+    expect(result.tokens.type, same(Keyword.CLASS));
 
     // UTF8 encode source with trailing zero
     List<int> bytes = utf8.encode(source).toList();
     bytes.add(0);
 
     result = usedForFuzzTesting.scan(bytes);
-    expect(result?.hasErrors, isFalse);
-    expect(result.tokens?.type, same(Keyword.CLASS));
+    expect(result.hasErrors, isFalse);
+    expect(result.tokens.type, same(Keyword.CLASS));
   }
 }
 
@@ -55,7 +53,7 @@
 class ScannerTest_Fasta_UTF8 extends ScannerTest_Fasta {
   @override
   Token scanWithListener(String source, ErrorListener listener,
-      {ScannerConfiguration configuration}) {
+      {ScannerConfiguration? configuration}) {
     var bytes = utf8.encode(source).toList()..add(0);
     var result =
         scan(bytes, configuration: configuration, includeComments: true);
@@ -65,10 +63,10 @@
     if (result.hasErrors) {
       while (token is ErrorToken) {
         translateErrorToken(token,
-            (ScannerErrorCode errorCode, int offset, List<Object> arguments) {
+            (ScannerErrorCode errorCode, int offset, List<Object>? arguments) {
           listener.errors.add(new TestError(offset, errorCode, arguments));
         });
-        token = token.next;
+        token = token.next!;
       }
     }
 
@@ -113,7 +111,7 @@
 class ScannerTest_Fasta extends ScannerTestBase {
   @override
   Token scanWithListener(String source, ErrorListener listener,
-      {ScannerConfiguration configuration}) {
+      {ScannerConfiguration? configuration}) {
     var result =
         scanString(source, configuration: configuration, includeComments: true);
     var token = result.tokens;
@@ -122,10 +120,10 @@
     if (result.hasErrors) {
       while (token is ErrorToken) {
         translateErrorToken(token,
-            (ScannerErrorCode errorCode, int offset, List<Object> arguments) {
+            (ScannerErrorCode errorCode, int offset, List<Object>? arguments) {
           listener.errors.add(new TestError(offset, errorCode, arguments));
         });
-        token = token.next;
+        token = token.next!;
       }
     }
 
@@ -151,7 +149,7 @@
        } // EOF comment
     ''';
 
-    Token scanSource({bool includeComments}) {
+    Token scanSource({required bool includeComments}) {
       return scanString(source, includeComments: includeComments).tokens;
     }
 
@@ -162,7 +160,7 @@
       // Assert no comments
       expect(token.precedingComments, isNull);
       expect(token.type.kind, isNot(fasta.COMMENT_TOKEN));
-      token = token.next;
+      token = token.next!;
     }
     expect(token.precedingComments, isNull);
     expect(tokenCount, 26);
@@ -175,13 +173,13 @@
     while (!token.isEof) {
       ++tokenCount;
       // Assert valid comments
-      fasta.CommentToken comment = token.precedingComments;
+      fasta.CommentToken? comment = token.precedingComments;
       while (comment != null) {
         ++commentTokenCount;
         expect(comment.type.kind, fasta.COMMENT_TOKEN);
         expect(comment.charOffset, greaterThanOrEqualTo(previousEnd));
         previousEnd = comment.charOffset + comment.charCount;
-        comment = comment.next;
+        comment = comment.next as fasta.CommentToken?;
       }
       expect(token.type.kind, isNot(fasta.COMMENT_TOKEN));
       expect(token.charOffset, greaterThanOrEqualTo(previousEnd));
@@ -206,7 +204,7 @@
         }
       }
 
-      token = token.next;
+      token = token.next!;
     }
     expect(tokenCount, 26);
     expect(spotCheckCount, 3);
@@ -222,19 +220,19 @@
 main() {}
 ''';
 
-    Token token;
-    fasta.CommentToken c1;
-    fasta.CommentToken c2;
-    fasta.CommentToken c3;
+    late Token token;
+    late fasta.CommentToken c1;
+    late fasta.CommentToken c2;
+    late fasta.CommentToken c3;
 
     void prepareTokens() {
       token = scanString(code, includeComments: true).tokens;
 
       expect(token.type.kind, fasta.IDENTIFIER_TOKEN);
 
-      c1 = token.precedingComments;
-      c2 = c1.next;
-      c3 = c2.next;
+      c1 = token.precedingComments!;
+      c2 = c1.next as fasta.CommentToken;
+      c3 = c2.next as fasta.CommentToken;
       expect(c3.next, isNull);
 
       expect(c1.parent, token);
@@ -287,7 +285,7 @@
     // ... but the length does *not* include the additional character
     // so as to be true to the original source.
     expect(token.length, source.length);
-    expect(token.next.isEof, isTrue);
+    expect(token.next!.isEof, isTrue);
     expect(listener.errors, hasLength(1));
     TestError error = listener.errors[0];
     expect(error.errorCode, ScannerErrorCode.MISSING_DIGIT);
@@ -303,16 +301,16 @@
     // where both ')' are synthetic
     ErrorListener listener = new ErrorListener();
     BeginToken interpolationStart =
-        scanWithListener(r'"${({(}}"', listener).next;
-    BeginToken openParen1 = interpolationStart.next;
-    BeginToken openBrace = openParen1.next;
-    BeginToken openParen2 = openBrace.next;
-    var closeParen2 = openParen2.next;
-    var closeBrace = closeParen2.next;
-    var closeParen1 = closeBrace.next;
-    var interpolationEnd = closeParen1.next;
-    var stringEnd = interpolationEnd.next;
-    expect(stringEnd.next.type, TokenType.EOF);
+        scanWithListener(r'"${({(}}"', listener).next as BeginToken;
+    BeginToken openParen1 = interpolationStart.next as BeginToken;
+    BeginToken openBrace = openParen1.next as BeginToken;
+    BeginToken openParen2 = openBrace.next as BeginToken;
+    var closeParen2 = openParen2.next!;
+    var closeBrace = closeParen2.next!;
+    var closeParen1 = closeBrace.next!;
+    var interpolationEnd = closeParen1.next!;
+    var stringEnd = interpolationEnd.next!;
+    expect(stringEnd.next!.type, TokenType.EOF);
     expect(interpolationStart.endToken, same(interpolationEnd));
     expect(openParen1.endToken, same(closeParen1));
     expect(openBrace.endToken, same(closeBrace));
@@ -327,37 +325,37 @@
     const source = 'int a; /*1*/ /*2*/ /*3*/ B f(){if (a < 2) {}}';
     Token token = scanString(source, includeComments: true).tokens;
     while (!token.isEof) {
-      expect(token.next.previous, token);
-      fasta.CommentToken commentToken = token.precedingComments;
+      expect(token.next!.previous, token);
+      fasta.CommentToken? commentToken = token.precedingComments;
       while (commentToken != null) {
         if (commentToken.next != null) {
-          expect(commentToken.next.previous, commentToken);
+          expect(commentToken.next!.previous, commentToken);
         }
-        commentToken = commentToken.next;
+        commentToken = commentToken.next as fasta.CommentToken?;
       }
-      token = token.next;
+      token = token.next!;
     }
   }
 
   void test_spread_operators() {
     ErrorListener listener = new ErrorListener();
     Token openBracket = scanWithListener('[ 1, ...[2], ...?[3], ]', listener);
-    Token spreadToken = openBracket.next.next.next;
+    Token spreadToken = openBracket.next!.next!.next!;
     expect(spreadToken.lexeme, '...');
-    Token spreadQToken = spreadToken.next.next.next.next.next;
+    Token spreadQToken = spreadToken.next!.next!.next!.next!.next!;
     expect(spreadQToken.lexeme, '...?');
   }
 
   @override
   void test_unmatched_openers() {
     ErrorListener listener = new ErrorListener();
-    BeginToken openBrace = scanWithListener('{[(', listener);
-    BeginToken openBracket = openBrace.next;
-    BeginToken openParen = openBracket.next;
-    var closeParen = openParen.next;
-    var closeBracket = closeParen.next;
-    var closeBrace = closeBracket.next;
-    expect(closeBrace.next.type, TokenType.EOF);
+    BeginToken openBrace = scanWithListener('{[(', listener) as BeginToken;
+    BeginToken openBracket = openBrace.next as BeginToken;
+    BeginToken openParen = openBracket.next as BeginToken;
+    var closeParen = openParen.next!;
+    var closeBracket = closeParen.next!;
+    var closeBrace = closeBracket.next!;
+    expect(closeBrace.next!.type, TokenType.EOF);
     expect(openBrace.endToken, same(closeBrace));
     expect(openBracket.endToken, same(closeBracket));
     expect(openParen.endToken, same(closeParen));
@@ -374,7 +372,7 @@
   Token scan(String source);
 
   void expectToken(Token token, TokenType type, int offset, int length,
-      {bool isSynthetic: false, String lexeme}) {
+      {bool isSynthetic: false, String? lexeme}) {
     String description = '${token.type} $token';
     expect(token.type, type, reason: description);
     expect(token.offset, offset, reason: description);
@@ -390,26 +388,26 @@
     expect((token as fasta.ErrorToken).errorCode,
         same(codeUnexpectedDollarInString));
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 1, lexeme: "'");
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING_INTERPOLATION_IDENTIFIER, 1, 1);
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.IDENTIFIER, 2, 1, lexeme: 'x');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 3, 0, lexeme: '', isSynthetic: true);
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING_INTERPOLATION_IDENTIFIER, 3, 1);
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.IDENTIFIER, 4, 0,
         lexeme: '', isSynthetic: true);
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 4, 1, lexeme: "'");
   }
 
@@ -418,28 +416,28 @@
     expect((token as fasta.ErrorToken).errorCode, same(codeUnmatchedToken));
     var interpolationStartErrorToken = token as fasta.UnmatchedToken;
 
-    token = token.next;
+    token = token.next!;
     expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
     expect((token as fasta.UnterminatedString).start, '"');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 5, lexeme: '"foo ');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING_INTERPOLATION_EXPRESSION, 5, 2);
-    BeginToken interpolationStart = token;
+    BeginToken interpolationStart = token as BeginToken;
     expect(interpolationStartErrorToken.begin, same(interpolationStart));
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.IDENTIFIER, 7, 3, lexeme: 'bar');
 
     // Expect interpolation to be terminated before string is closed
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.CLOSE_CURLY_BRACKET, 10, 0,
         isSynthetic: true, lexeme: '}');
     expect(interpolationStart.endToken, same(token));
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 10, 0, isSynthetic: true, lexeme: '"');
   }
 
@@ -448,58 +446,58 @@
     expect((token as fasta.ErrorToken).errorCode, same(codeUnmatchedToken));
     var openSquareBracketErrorToken = token as fasta.UnmatchedToken;
 
-    token = token.next;
+    token = token.next!;
     expect((token as fasta.ErrorToken).errorCode, same(codeUnmatchedToken));
     var openParenErrorToken = token as fasta.UnmatchedToken;
 
-    token = token.next;
+    token = token.next!;
     expect((token as fasta.ErrorToken).errorCode, same(codeUnmatchedToken));
     var interpolationStartErrorToken = token as fasta.UnmatchedToken;
 
-    token = token.next;
+    token = token.next!;
     expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
     expect((token as fasta.UnterminatedString).start, '"');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 5, lexeme: '"foo ');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING_INTERPOLATION_EXPRESSION, 5, 2);
-    BeginToken interpolationStart = token;
+    BeginToken interpolationStart = token as BeginToken;
     expect(interpolationStartErrorToken.begin, same(interpolationStart));
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.IDENTIFIER, 7, 3, lexeme: 'bar');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.OPEN_PAREN, 10, 1);
-    BeginToken openParen = token;
+    BeginToken openParen = token as BeginToken;
     expect(openParenErrorToken.begin, same(openParen));
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.IDENTIFIER, 11, 3, lexeme: 'baz');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.OPEN_SQUARE_BRACKET, 14, 1);
-    BeginToken openSquareBracket = token;
+    BeginToken openSquareBracket = token as BeginToken;
     expect(openSquareBracketErrorToken.begin, same(openSquareBracket));
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.CLOSE_SQUARE_BRACKET, 15, 0,
         isSynthetic: true, lexeme: ']');
     expect(openSquareBracket.endToken, same(token));
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.CLOSE_PAREN, 15, 0,
         isSynthetic: true, lexeme: ')');
     expect(openParen.endToken, same(token));
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.CLOSE_CURLY_BRACKET, 15, 0,
         isSynthetic: true, lexeme: '}');
     expect(interpolationStart.endToken, same(token));
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 15, 0, isSynthetic: true, lexeme: '"');
   }
 
@@ -508,21 +506,21 @@
     expect((token as fasta.ErrorToken).errorCode,
         same(codeUnexpectedDollarInString));
 
-    token = token.next;
+    token = token.next!;
     expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
     expect((token as fasta.UnterminatedString).start, '"');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 5, lexeme: '"foo ');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING_INTERPOLATION_IDENTIFIER, 5, 1);
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.IDENTIFIER, 6, 0,
         isSynthetic: true, lexeme: '');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 6, 0, isSynthetic: true, lexeme: '"');
   }
 
@@ -531,7 +529,7 @@
     expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
     expect((token as fasta.UnterminatedString).start, "'''");
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 9,
         lexeme: "'''string'''", isSynthetic: true);
   }
@@ -541,7 +539,7 @@
     expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
     expect((token as fasta.UnterminatedString).start, "r'''");
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 10,
         lexeme: "r'''string'''", isSynthetic: true);
   }
@@ -551,7 +549,7 @@
     expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
     expect((token as fasta.UnterminatedString).start, "r'");
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 8,
         lexeme: "r'string'", isSynthetic: true);
   }
@@ -561,7 +559,7 @@
     expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
     expect((token as fasta.UnterminatedString).start, "r'");
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 8,
         lexeme: "r'string'", isSynthetic: true);
   }
@@ -571,7 +569,7 @@
     expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
     expect((token as fasta.UnterminatedString).start, "'");
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 7,
         lexeme: "'string'", isSynthetic: true);
   }
@@ -581,17 +579,17 @@
     expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
     expect((token as fasta.UnterminatedString).start, "'");
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 7,
         lexeme: "'string'", isSynthetic: true);
   }
 
   void test_match_angle_brackets() {
     var x = scan('x<y>');
-    BeginToken lessThan = x.next;
-    var y = lessThan.next;
-    var greaterThan = y.next;
-    expect(greaterThan.next.isEof, isTrue);
+    BeginToken lessThan = x.next as BeginToken;
+    var y = lessThan.next!;
+    var greaterThan = y.next!;
+    expect(greaterThan.next!.isEof, isTrue);
     expect(lessThan.endGroup, same(greaterThan));
   }
 
@@ -599,54 +597,54 @@
     // When a ">>" appears in the token stream, Fasta's scanner matches it to
     // the outer "<".  The inner "<" is left unmatched.
     var x = scan('x<y<z>>');
-    BeginToken lessThan1 = x.next;
-    var y = lessThan1.next;
-    BeginToken lessThan2 = y.next;
-    var z = lessThan2.next;
-    var greaterThans = z.next;
-    expect(greaterThans.next.isEof, isTrue);
+    BeginToken lessThan1 = x.next as BeginToken;
+    var y = lessThan1.next!;
+    BeginToken lessThan2 = y.next as BeginToken;
+    var z = lessThan2.next!;
+    var greaterThans = z.next!;
+    expect(greaterThans.next!.isEof, isTrue);
     expect(lessThan1.endGroup, same(greaterThans));
     expect(lessThan2.endGroup, isNull);
   }
 
   void test_match_angle_brackets_interrupted_by_close_brace() {
     // A "}" appearing in the token stream interrupts matching of "<" and ">".
-    BeginToken openBrace = scan('{x<y}>z');
-    var x = openBrace.next;
-    BeginToken lessThan = x.next;
-    var y = lessThan.next;
-    var closeBrace = y.next;
-    var greaterThan = closeBrace.next;
-    var z = greaterThan.next;
-    expect(z.next.isEof, isTrue);
+    BeginToken openBrace = scan('{x<y}>z') as BeginToken;
+    var x = openBrace.next!;
+    BeginToken lessThan = x.next as BeginToken;
+    var y = lessThan.next!;
+    var closeBrace = y.next!;
+    var greaterThan = closeBrace.next!;
+    var z = greaterThan.next!;
+    expect(z.next!.isEof, isTrue);
     expect(openBrace.endGroup, same(closeBrace));
     expect(lessThan.endGroup, isNull);
   }
 
   void test_match_angle_brackets_interrupted_by_close_bracket() {
     // A "]" appearing in the token stream interrupts matching of "<" and ">".
-    BeginToken openBracket = scan('[x<y]>z');
-    var x = openBracket.next;
-    BeginToken lessThan = x.next;
-    var y = lessThan.next;
-    var closeBracket = y.next;
-    var greaterThan = closeBracket.next;
-    var z = greaterThan.next;
-    expect(z.next.isEof, isTrue);
+    BeginToken openBracket = scan('[x<y]>z') as BeginToken;
+    var x = openBracket.next!;
+    BeginToken lessThan = x.next as BeginToken;
+    var y = lessThan.next!;
+    var closeBracket = y.next!;
+    var greaterThan = closeBracket.next!;
+    var z = greaterThan.next!;
+    expect(z.next!.isEof, isTrue);
     expect(openBracket.endGroup, same(closeBracket));
     expect(lessThan.endGroup, isNull);
   }
 
   void test_match_angle_brackets_interrupted_by_close_paren() {
     // A ")" appearing in the token stream interrupts matching of "<" and ">".
-    BeginToken openParen = scan('(x<y)>z');
-    var x = openParen.next;
-    BeginToken lessThan = x.next;
-    var y = lessThan.next;
-    var closeParen = y.next;
-    var greaterThan = closeParen.next;
-    var z = greaterThan.next;
-    expect(z.next.isEof, isTrue);
+    BeginToken openParen = scan('(x<y)>z') as BeginToken;
+    var x = openParen.next!;
+    BeginToken lessThan = x.next as BeginToken;
+    var y = lessThan.next!;
+    var closeParen = y.next!;
+    var greaterThan = closeParen.next!;
+    var z = greaterThan.next!;
+    expect(z.next!.isEof, isTrue);
     expect(openParen.endGroup, same(closeParen));
     expect(lessThan.endGroup, isNull);
   }
@@ -654,15 +652,15 @@
   void test_match_angle_brackets_interrupted_by_interpolation_expr() {
     // A "${" appearing in the token stream interrupts matching of "<" and ">".
     var x = scan(r'x<"${y>z}"');
-    BeginToken lessThan = x.next;
-    var beginString = lessThan.next;
-    BeginToken beginInterpolation = beginString.next;
-    var y = beginInterpolation.next;
-    var greaterThan = y.next;
-    var z = greaterThan.next;
-    var endInterpolation = z.next;
-    var endString = endInterpolation.next;
-    expect(endString.next.isEof, isTrue);
+    BeginToken lessThan = x.next as BeginToken;
+    var beginString = lessThan.next!;
+    BeginToken beginInterpolation = beginString.next as BeginToken;
+    var y = beginInterpolation.next!;
+    var greaterThan = y.next!;
+    var z = greaterThan.next!;
+    var endInterpolation = z.next!;
+    var endString = endInterpolation.next!;
+    expect(endString.next!.isEof, isTrue);
     expect(lessThan.endGroup, isNull);
     expect(beginInterpolation.endGroup, same(endInterpolation));
   }
@@ -670,13 +668,13 @@
   void test_match_angle_brackets_interrupted_by_open_brace() {
     // A "{" appearing in the token stream interrupts matching of "<" and ">".
     var x = scan('x<{y>z}');
-    BeginToken lessThan = x.next;
-    BeginToken openBrace = lessThan.next;
-    var y = openBrace.next;
-    var greaterThan = y.next;
-    var z = greaterThan.next;
-    var closeBrace = z.next;
-    expect(closeBrace.next.isEof, isTrue);
+    BeginToken lessThan = x.next as BeginToken;
+    BeginToken openBrace = lessThan.next as BeginToken;
+    var y = openBrace.next!;
+    var greaterThan = y.next!;
+    var z = greaterThan.next!;
+    var closeBrace = z.next!;
+    expect(closeBrace.next!.isEof, isTrue);
     expect(lessThan.endGroup, isNull);
     expect(openBrace.endGroup, same(closeBrace));
   }
@@ -684,14 +682,14 @@
   void test_match_angle_brackets_interrupted_by_open_bracket() {
     // A "[" appearing in the token stream interrupts matching of "<" and ">".
     var x = scan('x<y[z>a]');
-    BeginToken lessThan = x.next;
-    var y = lessThan.next;
-    BeginToken openBracket = y.next;
-    var z = openBracket.next;
-    var greaterThan = z.next;
-    var a = greaterThan.next;
-    var closeBracket = a.next;
-    expect(closeBracket.next.isEof, isTrue);
+    BeginToken lessThan = x.next as BeginToken;
+    var y = lessThan.next!;
+    BeginToken openBracket = y.next as BeginToken;
+    var z = openBracket.next!;
+    var greaterThan = z.next!;
+    var a = greaterThan.next!;
+    var closeBracket = a.next!;
+    expect(closeBracket.next!.isEof, isTrue);
     expect(lessThan.endGroup, isNull);
     expect(openBracket.endGroup, same(closeBracket));
   }
@@ -699,29 +697,29 @@
   void test_match_angle_brackets_interrupted_by_open_paren() {
     // A "(" appearing in the token stream interrupts matching of "<" and ">".
     var x = scan('x<y(z>a)');
-    BeginToken lessThan = x.next;
-    var y = lessThan.next;
-    BeginToken openParen = y.next;
-    var z = openParen.next;
-    var greaterThan = z.next;
-    var a = greaterThan.next;
-    var closeParen = a.next;
-    expect(closeParen.next.isEof, isTrue);
+    BeginToken lessThan = x.next as BeginToken;
+    var y = lessThan.next!;
+    BeginToken openParen = y.next as BeginToken;
+    var z = openParen.next!;
+    var greaterThan = z.next!;
+    var a = greaterThan.next!;
+    var closeParen = a.next!;
+    expect(closeParen.next!.isEof, isTrue);
     expect(lessThan.endGroup, isNull);
     expect(openParen.endGroup, same(closeParen));
   }
 
   void test_match_angle_brackets_nested() {
     var x = scan('x<y<z>,a>');
-    BeginToken lessThan1 = x.next;
-    var y = lessThan1.next;
-    BeginToken lessThan2 = y.next;
-    var z = lessThan2.next;
-    var greaterThan1 = z.next;
-    var comma = greaterThan1.next;
-    var a = comma.next;
-    var greaterThan2 = a.next;
-    expect(greaterThan2.next.isEof, isTrue);
+    BeginToken lessThan1 = x.next as BeginToken;
+    var y = lessThan1.next!;
+    BeginToken lessThan2 = y.next as BeginToken;
+    var z = lessThan2.next!;
+    var greaterThan1 = z.next!;
+    var comma = greaterThan1.next!;
+    var a = comma.next!;
+    var greaterThan2 = a.next!;
+    expect(greaterThan2.next!.isEof, isTrue);
     expect(lessThan1.endGroup, same(greaterThan2));
     expect(lessThan2.endGroup, same(greaterThan1));
   }
@@ -730,11 +728,11 @@
     // When a ">>" appears in the token stream and there is no outer "<",
     // Fasta's scanner leaves the inner "<" unmatched.
     var x = scan('x<y>>z');
-    BeginToken lessThan = x.next;
-    var y = lessThan.next;
-    var greaterThans = y.next;
-    var z = greaterThans.next;
-    expect(z.next.isEof, isTrue);
+    BeginToken lessThan = x.next as BeginToken;
+    var y = lessThan.next!;
+    var greaterThans = y.next!;
+    var z = greaterThans.next!;
+    expect(z.next!.isEof, isTrue);
     expect(lessThan.endGroup, isNull);
   }
 }
@@ -755,7 +753,7 @@
 /// Scanner tests that exercise the Fasta scanner directly.
 @reflectiveTest
 class ScannerTest_Fasta_Direct extends ScannerTest_Fasta_Base {
-  fasta.LanguageVersionToken languageVersion;
+  fasta.LanguageVersionToken? languageVersion;
 
   void languageVersionChanged(
       Scanner scanner, fasta.LanguageVersionToken languageVersion) {
@@ -773,7 +771,7 @@
     final Token first = result.tokens;
     Token token = first;
     while (!token.isEof) {
-      Token next = token.next;
+      Token next = token.next!;
       expect(token.next, next);
       expect(next.previous, token);
       if (next.isSynthetic && [')', ']', '}'].contains(next.lexeme)) {
@@ -802,8 +800,8 @@
 import 'foo.dart';
 main() {}
 ''');
-    expect(languageVersion.major, 2);
-    expect(languageVersion.minor, 3);
+    expect(languageVersion!.major, 2);
+    expect(languageVersion!.minor, 3);
     expectComments(
         result.tokens,
         [
@@ -819,8 +817,8 @@
 // @dart = 2.3
 main() {}
 ''');
-    expect(languageVersion.major, 2);
-    expect(languageVersion.minor, 3);
+    expect(languageVersion!.major, 2);
+    expect(languageVersion!.minor, 3);
     expectComments(result.tokens, ['// @dart = 2.3'], 0);
   }
 
@@ -838,8 +836,8 @@
 // @dart = 2.3
 main() {}
 ''', includeComments: false);
-    expect(languageVersion.major, 2);
-    expect(languageVersion.minor, 3);
+    expect(languageVersion!.major, 2);
+    expect(languageVersion!.minor, 3);
     expectComments(result.tokens, [], -1);
   }
 
@@ -849,8 +847,8 @@
 import 'foo.dart';
 main() {}
 ''');
-    expect(languageVersion.major, 2);
-    expect(languageVersion.minor, 3);
+    expect(languageVersion!.major, 2);
+    expect(languageVersion!.minor, 3);
     expectComments(result.tokens, ['// @dart = 2.3'], 0);
   }
 
@@ -861,9 +859,9 @@
 import 'foo.dart';
 main() {}
 ''');
-    expect(languageVersion.major, 2);
-    expect(languageVersion.minor, 3);
-    expectComments(result.tokens.next, ['// @dart = 2.3'], 0);
+    expect(languageVersion!.major, 2);
+    expect(languageVersion!.minor, 3);
+    expectComments(result.tokens.next!, ['// @dart = 2.3'], 0);
   }
 
   void test_languageVersion_beforeLibrary() {
@@ -872,8 +870,8 @@
 library foo;
 main() {}
 ''');
-    expect(languageVersion.major, 2);
-    expect(languageVersion.minor, 3);
+    expect(languageVersion!.major, 2);
+    expect(languageVersion!.minor, 3);
     expectComments(result.tokens, ['// @dart = 2.3'], 0);
   }
 
@@ -883,8 +881,8 @@
 library foo;
 main() {}
 ''');
-    expect(languageVersion.major, 2);
-    expect(languageVersion.minor, 3);
+    expect(languageVersion!.major, 2);
+    expect(languageVersion!.minor, 3);
     expectComments(result.tokens, ['// @dart=2.3'], 0);
   }
 
@@ -935,14 +933,14 @@
     expect(token.charOffset, 14, reason: 'error token : $token, ${token.type}');
     expect(token.charCount, 3, reason: 'error token : $token, ${token.type}');
 
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, 'var');
     int index = 0;
     while (!token.isEof) {
       expect(token.charOffset, lineStarts[index],
           reason: 'token # $index : $token, ${token.type}');
       ++index;
-      token = token.next;
+      token = token.next!;
     }
   }
 
@@ -955,21 +953,21 @@
     expect(token, const TypeMatcher<ErrorToken>());
     expect(token.charOffset, 14, reason: 'token # 0 : $token, ${token.type}');
 
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, 'var');
     int index = 0;
     while (!token.isEof) {
       expect(token.charOffset, lineStarts[index],
           reason: 'token # $index : $token, ${token.type}');
       ++index;
-      token = token.next;
+      token = token.next!;
     }
   }
 
   void expectComments(
-      Token token, List<String> expectedComments, int versionIndex) {
+      Token? token, List<String> expectedComments, int versionIndex) {
     int index = 0;
-    token = token.precedingComments;
+    token = token!.precedingComments;
     while (token != null) {
       if (index == versionIndex) {
         if (token is! fasta.LanguageVersionToken) {
diff --git a/pkg/front_end/test/scanner_replacement_test.dart b/pkg/front_end/test/scanner_replacement_test.dart
index dff9d26..f936db9 100644
--- a/pkg/front_end/test/scanner_replacement_test.dart
+++ b/pkg/front_end/test/scanner_replacement_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' as fasta;
 import 'package:_fe_analyzer_shared/src/scanner/error_token.dart' as fasta;
 import 'package:_fe_analyzer_shared/src/scanner/token.dart' as analyzer;
@@ -30,7 +28,7 @@
 class ScannerTest_Replacement extends ScannerTestBase {
   @override
   analyzer.Token scanWithListener(String source, ErrorListener listener,
-      {fasta.ScannerConfiguration configuration}) {
+      {fasta.ScannerConfiguration? configuration}) {
     // Process the source similar to
     // pkg/analyzer/lib/src/dart/scanner/scanner.dart
     // to simulate replacing the analyzer scanner
@@ -49,9 +47,9 @@
   }
 
   void _assertOpenClosePair(String source) {
-    analyzer.BeginToken open = _scan(source);
-    fasta.Token close = open.next;
-    expect(close.next.isEof, isTrue);
+    analyzer.BeginToken open = _scan(source) as analyzer.BeginToken;
+    fasta.Token close = open.next!;
+    expect(close.next!.isEof, isTrue);
     expect(open.endGroup, close);
     expect(open.isSynthetic, isFalse);
     expect(close.isSynthetic, isFalse);
@@ -59,9 +57,10 @@
 
   void _assertOpenOnly(String source, String expectedCloser) {
     ErrorListener listener = new ErrorListener();
-    analyzer.BeginToken open = scanWithListener(source, listener);
-    fasta.Token close = open.next;
-    expect(close.next.isEof, isTrue);
+    analyzer.BeginToken open =
+        scanWithListener(source, listener) as analyzer.BeginToken;
+    fasta.Token close = open.next!;
+    expect(close.next!.isEof, isTrue);
     expect(open.endGroup, close);
     expect(open.isSynthetic, isFalse);
     expect(close.isSynthetic, isTrue);
@@ -82,7 +81,7 @@
     // ... but the length does *not* include the additional character
     // so as to be true to the original source.
     expect(token.length, source.length);
-    expect(token.next.isEof, isTrue);
+    expect(token.next!.isEof, isTrue);
     expect(listener.errors, hasLength(1));
     TestError error = listener.errors[0];
     expect(error.errorCode, ScannerErrorCode.MISSING_DIGIT);
@@ -93,8 +92,8 @@
   void test_lt() {
     // fasta does not automatically insert a closer for '<'
     // because it could be part of an expression rather than an opener
-    analyzer.BeginToken lt = _scan('<');
-    expect(lt.next.isEof, isTrue);
+    analyzer.BeginToken lt = _scan('<') as analyzer.BeginToken;
+    expect(lt.next!.isEof, isTrue);
     expect(lt.isSynthetic, isFalse);
   }
 
@@ -138,16 +137,18 @@
     // where both ')' are synthetic
     ErrorListener listener = new ErrorListener();
     var stringStart = scanWithListener(r'"${({(}}"', listener);
-    analyzer.BeginToken interpolationStart = stringStart.next;
-    analyzer.BeginToken openParen1 = interpolationStart.next;
-    analyzer.BeginToken openBrace = openParen1.next;
-    analyzer.BeginToken openParen2 = openBrace.next;
-    var closeParen2 = openParen2.next;
-    var closeBrace = closeParen2.next;
-    var closeParen1 = closeBrace.next;
-    var interpolationEnd = closeParen1.next;
-    var stringEnd = interpolationEnd.next;
-    var eof = stringEnd.next;
+    analyzer.BeginToken interpolationStart =
+        stringStart.next as analyzer.BeginToken;
+    analyzer.BeginToken openParen1 =
+        interpolationStart.next as analyzer.BeginToken;
+    analyzer.BeginToken openBrace = openParen1.next as analyzer.BeginToken;
+    analyzer.BeginToken openParen2 = openBrace.next as analyzer.BeginToken;
+    var closeParen2 = openParen2.next!;
+    var closeBrace = closeParen2.next!;
+    var closeParen1 = closeBrace.next!;
+    var interpolationEnd = closeParen1.next!;
+    var stringEnd = interpolationEnd.next!;
+    var eof = stringEnd.next!;
 
     expect(interpolationStart.endToken, same(interpolationEnd));
     expect(interpolationEnd.isSynthetic, isFalse);
@@ -168,14 +169,15 @@
   void test_unmatched_openers() {
     ErrorListener listener = new ErrorListener();
     // fasta inserts missing closers except for '<'
-    analyzer.BeginToken openBrace = scanWithListener('{[(<', listener);
-    analyzer.BeginToken openBracket = openBrace.next;
-    analyzer.BeginToken openParen = openBracket.next;
-    analyzer.BeginToken openLT = openParen.next;
-    var closeParen = openLT.next;
-    var closeBracket = closeParen.next;
-    var closeBrace = closeBracket.next;
-    var eof = closeBrace.next;
+    analyzer.BeginToken openBrace =
+        scanWithListener('{[(<', listener) as analyzer.BeginToken;
+    analyzer.BeginToken openBracket = openBrace.next as analyzer.BeginToken;
+    analyzer.BeginToken openParen = openBracket.next as analyzer.BeginToken;
+    analyzer.BeginToken openLT = openParen.next as analyzer.BeginToken;
+    var closeParen = openLT.next!;
+    var closeBracket = closeParen.next!;
+    var closeBrace = closeBracket.next!;
+    var eof = closeBrace.next!;
 
     expect(openBrace.endGroup, same(closeBrace));
     expect(openBracket.endGroup, same(closeBracket));
@@ -201,13 +203,13 @@
     // The default recovery strategy used by scanString
     // places all error tokens at the head of the stream.
     while (token.type == analyzer.TokenType.BAD_INPUT) {
-      translateErrorToken(token,
-          (ScannerErrorCode errorCode, int offset, List<Object> arguments) {
+      translateErrorToken(token as fasta.ErrorToken,
+          (ScannerErrorCode errorCode, int offset, List<Object>? arguments) {
         listener.errors.add(new TestError(offset, errorCode, arguments));
       });
-      token = token.next;
+      token = token.next!;
     }
-    if (!token.previous.isEof) {
+    if (!token.previous!.isEof) {
       new analyzer.Token.eof(-1).setNext(token);
     }
     return token;
@@ -217,20 +219,20 @@
   void assertValidTokenStream(fasta.Token firstToken,
       {bool errorsFirst: false}) {
     fasta.Token token = firstToken;
-    fasta.Token previous = token.previous;
+    fasta.Token previous = token.previous!;
     expect(previous.isEof, isTrue, reason: 'Missing leading EOF');
     expect(previous.next, token, reason: 'Invalid leading EOF');
     expect(previous.previous, previous, reason: 'Invalid leading EOF');
     if (errorsFirst) {
       while (!token.isEof && token is fasta.ErrorToken) {
-        token = token.next;
+        token = token.next!;
       }
     }
     var isNotErrorToken = isNot(const TypeMatcher<fasta.ErrorToken>());
     while (!token.isEof) {
       if (errorsFirst) expect(token, isNotErrorToken);
       previous = token;
-      token = token.next;
+      token = token.next!;
       expect(token, isNotNull, reason: previous.toString());
       expect(token.previous, previous, reason: token.toString());
     }
@@ -258,7 +260,7 @@
       } else if (token is fasta.UnmatchedToken) {
         errorStack.add(token);
       }
-      token = token.next;
+      token = token.next!;
     }
     expect(openerStack, isEmpty, reason: 'Missing closers');
     expect(errorStack, isEmpty, reason: 'Extra error tokens');
diff --git a/pkg/front_end/test/scanner_test.dart b/pkg/front_end/test/scanner_test.dart
index cbf28bc..08c21e7 100644
--- a/pkg/front_end/test/scanner_test.dart
+++ b/pkg/front_end/test/scanner_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:_fe_analyzer_shared/src/base/errors.dart';
 import 'package:_fe_analyzer_shared/src/scanner/abstract_scanner.dart'
     show AbstractScanner, ScannerConfiguration;
@@ -82,7 +80,7 @@
 
 abstract class ScannerTestBase {
   Token scanWithListener(String source, ErrorListener listener,
-      {ScannerConfiguration configuration});
+      {ScannerConfiguration? configuration});
 
   void test_ampersand() {
     _assertToken(TokenType.AMPERSAND, "&");
@@ -104,9 +102,9 @@
 
   void test_angle_brackets() {
     var lessThan = _scan('<String>');
-    var identifier = lessThan.next;
-    var greaterThan = identifier.next;
-    expect(greaterThan.next.type, TokenType.EOF);
+    var identifier = lessThan.next!;
+    var greaterThan = identifier.next!;
+    expect(greaterThan.next!.type, TokenType.EOF);
     // Analyzer's token streams don't consider "<" to be an opener
     // but fasta does.
     if (lessThan is BeginToken) {
@@ -119,8 +117,8 @@
     Token token = _scan("async*");
     expect(token.type.isKeyword, true);
     expect(token.lexeme, 'async');
-    expect(token.next.type, TokenType.STAR);
-    expect(token.next.next.type, TokenType.EOF);
+    expect(token.next!.type, TokenType.STAR);
+    expect(token.next!.next!.type, TokenType.EOF);
   }
 
   void test_at() {
@@ -197,30 +195,30 @@
     Token token = _scan("/* x */ /* y */ z");
     expect(token.type, TokenType.IDENTIFIER);
     expect(token.precedingComments, isNotNull);
-    expect(token.precedingComments.value(), "/* x */");
-    expect(token.precedingComments.previous, isNull);
-    expect(token.precedingComments.next, isNotNull);
-    expect(token.precedingComments.next.value(), "/* y */");
+    expect(token.precedingComments!.value(), "/* x */");
+    expect(token.precedingComments!.previous, isNull);
+    expect(token.precedingComments!.next, isNotNull);
+    expect(token.precedingComments!.next!.value(), "/* y */");
     expect(
-        token.precedingComments.next.previous, same(token.precedingComments));
-    expect(token.precedingComments.next.next, isNull);
+        token.precedingComments!.next!.previous, same(token.precedingComments));
+    expect(token.precedingComments!.next!.next, isNull);
   }
 
   void test_comment_multi_consecutive_3() {
     Token token = _scan("/* x */ /* y */ /* z */ a");
     expect(token.type, TokenType.IDENTIFIER);
     expect(token.precedingComments, isNotNull);
-    expect(token.precedingComments.value(), "/* x */");
-    expect(token.precedingComments.previous, isNull);
-    expect(token.precedingComments.next, isNotNull);
-    expect(token.precedingComments.next.value(), "/* y */");
+    expect(token.precedingComments!.value(), "/* x */");
+    expect(token.precedingComments!.previous, isNull);
+    expect(token.precedingComments!.next, isNotNull);
+    expect(token.precedingComments!.next!.value(), "/* y */");
     expect(
-        token.precedingComments.next.previous, same(token.precedingComments));
-    expect(token.precedingComments.next.next, isNotNull);
-    expect(token.precedingComments.next.next.value(), "/* z */");
-    expect(token.precedingComments.next.next.previous,
-        same(token.precedingComments.next));
-    expect(token.precedingComments.next.next.next, isNull);
+        token.precedingComments!.next!.previous, same(token.precedingComments));
+    expect(token.precedingComments!.next!.next, isNotNull);
+    expect(token.precedingComments!.next!.next!.value(), "/* z */");
+    expect(token.precedingComments!.next!.next!.previous,
+        same(token.precedingComments!.next));
+    expect(token.precedingComments!.next!.next!.next, isNull);
   }
 
   void test_comment_multi_unterminated() {
@@ -307,9 +305,9 @@
   void test_hexadecimal_missingDigit() {
     var token = _assertError(ScannerErrorCode.MISSING_HEX_DIGIT, 5, "a = 0x");
     expect(token.lexeme, 'a');
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, '=');
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, '0x0');
   }
 
@@ -334,12 +332,12 @@
     ]);
     var token = tokens;
     expect(token.lexeme, 'a');
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, '=');
-    token = token.next;
+    token = token.next!;
     expect(token.type, TokenType.IDENTIFIER);
     expect(token.lexeme, "Shche\u0433lov\u0429x");
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, ';');
   }
 
@@ -355,12 +353,12 @@
     var token = _assertError(
         ScannerErrorCode.ILLEGAL_CHARACTER, 4, 'a = \u0429;', [0x429]);
     expect(token.lexeme, 'a');
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, '=');
-    token = token.next;
+    token = token.next!;
     expect(token.type, TokenType.IDENTIFIER);
     expect(token.lexeme, "\u0429");
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, ';');
   }
 
@@ -711,41 +709,41 @@
   }
 
   void test_matching_braces() {
-    BeginToken openBrace1 = _scan('{1: {2: 3}}');
-    var one = openBrace1.next;
-    var colon1 = one.next;
-    BeginToken openBrace2 = colon1.next;
-    var two = openBrace2.next;
-    var colon2 = two.next;
-    var three = colon2.next;
-    var closeBrace1 = three.next;
-    var closeBrace2 = closeBrace1.next;
-    expect(closeBrace2.next.type, TokenType.EOF);
+    BeginToken openBrace1 = _scan('{1: {2: 3}}') as BeginToken;
+    var one = openBrace1.next!;
+    var colon1 = one.next!;
+    BeginToken openBrace2 = colon1.next as BeginToken;
+    var two = openBrace2.next!;
+    var colon2 = two.next!;
+    var three = colon2.next!;
+    var closeBrace1 = three.next!;
+    var closeBrace2 = closeBrace1.next!;
+    expect(closeBrace2.next!.type, TokenType.EOF);
     expect(openBrace1.endToken, same(closeBrace2));
     expect(openBrace2.endToken, same(closeBrace1));
   }
 
   void test_matching_brackets() {
-    BeginToken openBracket1 = _scan('[1, [2]]');
-    var one = openBracket1.next;
-    var comma = one.next;
-    BeginToken openBracket2 = comma.next;
-    var two = openBracket2.next;
-    var closeBracket1 = two.next;
-    var closeBracket2 = closeBracket1.next;
-    expect(closeBracket2.next.type, TokenType.EOF);
+    BeginToken openBracket1 = _scan('[1, [2]]') as BeginToken;
+    var one = openBracket1.next!;
+    var comma = one.next!;
+    BeginToken openBracket2 = comma.next as BeginToken;
+    var two = openBracket2.next!;
+    var closeBracket1 = two.next!;
+    var closeBracket2 = closeBracket1.next!;
+    expect(closeBracket2.next!.type, TokenType.EOF);
     expect(openBracket1.endToken, same(closeBracket2));
     expect(openBracket2.endToken, same(closeBracket1));
   }
 
   void test_matching_parens() {
-    BeginToken openParen1 = _scan('(f(x))');
-    var f = openParen1.next;
-    BeginToken openParen2 = f.next;
-    var x = openParen2.next;
-    var closeParen1 = x.next;
-    var closeParen2 = closeParen1.next;
-    expect(closeParen2.next.type, TokenType.EOF);
+    BeginToken openParen1 = _scan('(f(x))') as BeginToken;
+    var f = openParen1.next!;
+    BeginToken openParen2 = f.next as BeginToken;
+    var x = openParen2.next!;
+    var closeParen1 = x.next!;
+    var closeParen2 = closeParen1.next!;
+    expect(closeParen2.next!.type, TokenType.EOF);
     expect(openParen1.endToken, same(closeParen2));
     expect(openParen2.endToken, same(closeParen1));
   }
@@ -769,10 +767,10 @@
     // In this particular case, fasta cannot find an opener for ']'
     // and thus marks ']' as an error and moves on.
     ErrorListener listener = new ErrorListener();
-    BeginToken openParen = scanWithListener('(])', listener);
-    var closeBracket = openParen.next;
-    var closeParen = closeBracket.next;
-    expect(closeParen.next.type, TokenType.EOF);
+    BeginToken openParen = scanWithListener('(])', listener) as BeginToken;
+    var closeBracket = openParen.next!;
+    var closeParen = closeBracket.next!;
+    expect(closeParen.next!.type, TokenType.EOF);
     expect(openParen.endToken, same(closeParen));
     listener.assertNoErrors();
   }
@@ -792,15 +790,15 @@
     //    2 recoveries).
     // Both options are "equally bad" and the first choise is made.
     ErrorListener listener = new ErrorListener();
-    BeginToken openBracket = scanWithListener('[(])', listener);
-    BeginToken openParen = openBracket.next;
-    var closeParen = openParen.next;
+    BeginToken openBracket = scanWithListener('[(])', listener) as BeginToken;
+    BeginToken openParen = openBracket.next as BeginToken;
+    var closeParen = openParen.next!;
     expect(closeParen.isSynthetic, isTrue);
-    var closeBracket = closeParen.next;
+    var closeBracket = closeParen.next!;
     expect(closeBracket.isSynthetic, isFalse);
-    var closeParen2 = closeBracket.next;
+    var closeParen2 = closeBracket.next!;
     expect(closeParen2.isSynthetic, isFalse);
-    expect(closeParen2.next.type, TokenType.EOF);
+    expect(closeParen2.next!.type, TokenType.EOF);
     expect(openBracket.endToken, same(closeBracket));
     expect(openParen.endToken, same(closeParen));
     listener.assertErrors([
@@ -813,17 +811,17 @@
     // closer to be mismatched, which means that `([)` parses as three unmatched
     // tokens.
     ErrorListener listener = new ErrorListener();
-    BeginToken openParen = scanWithListener('([)', listener);
-    BeginToken openBracket = openParen.next;
+    BeginToken openParen = scanWithListener('([)', listener) as BeginToken;
+    BeginToken openBracket = openParen.next as BeginToken;
     // When openers and closers are mismatched,
     // fasta favors considering the opener to be mismatched
     // and inserts synthetic closers as needed.
     // `([)` is scanned as `([])` where `]` is synthetic.
-    var closeBracket = openBracket.next;
+    var closeBracket = openBracket.next!;
     expect(closeBracket.isSynthetic, isTrue);
-    var closeParen = closeBracket.next;
+    var closeParen = closeBracket.next!;
     expect(closeParen.isSynthetic, isFalse);
-    expect(closeParen.next.type, TokenType.EOF);
+    expect(closeParen.next!.type, TokenType.EOF);
     expect(openBracket.endToken, closeBracket);
     expect(openParen.endToken, closeParen);
     listener.assertErrors([
@@ -837,14 +835,14 @@
     // unmatched tokens, which means that `"${({(}}"` parses as though the open
     // parens are unmatched but everything else is matched.
     var stringStart = _scan(r'"${({(}}"');
-    BeginToken interpolationStart = stringStart.next;
-    BeginToken openParen1 = interpolationStart.next;
-    BeginToken openBrace = openParen1.next;
-    BeginToken openParen2 = openBrace.next;
-    var closeBrace = openParen2.next;
-    var interpolationEnd = closeBrace.next;
-    var stringEnd = interpolationEnd.next;
-    expect(stringEnd.next.type, TokenType.EOF);
+    BeginToken interpolationStart = stringStart.next as BeginToken;
+    BeginToken openParen1 = interpolationStart.next as BeginToken;
+    BeginToken openBrace = openParen1.next as BeginToken;
+    BeginToken openParen2 = openBrace.next as BeginToken;
+    var closeBrace = openParen2.next!;
+    var interpolationEnd = closeBrace.next!;
+    var stringEnd = interpolationEnd.next!;
+    expect(stringEnd.next!.type, TokenType.EOF);
     expect(interpolationStart.endToken, same(interpolationEnd));
     expect(openParen1.endToken, isNull);
     expect(openBrace.endToken, same(closeBrace));
@@ -966,12 +964,12 @@
   void test_startAndEnd() {
     Token token = _scan("a");
     expect(token.offset, 0);
-    Token previous = token.previous;
+    Token previous = token.previous!;
     expect(previous.next, token);
     expect(previous.previous, previous);
     expect(previous.type, TokenType.EOF);
     expect(previous.offset, -1);
-    Token next = token.next;
+    Token next = token.next!;
     expect(next.next, next);
     expect(next.previous, token);
     expect(next.type, TokenType.EOF);
@@ -1290,8 +1288,8 @@
     Token token = _scan("sync*");
     expect(token.type.isKeyword, true);
     expect(token.lexeme, 'sync');
-    expect(token.next.type, TokenType.STAR);
-    expect(token.next.next.type, TokenType.EOF);
+    expect(token.next!.type, TokenType.STAR);
+    expect(token.next!.next!.type, TokenType.EOF);
   }
 
   void test_tilde() {
@@ -1312,10 +1310,10 @@
   }
 
   void test_unmatched_openers() {
-    BeginToken openBrace = _scan('{[(');
-    BeginToken openBracket = openBrace.next;
-    BeginToken openParen = openBracket.next;
-    expect(openParen.next.type, TokenType.EOF);
+    BeginToken openBrace = _scan('{[(') as BeginToken;
+    BeginToken openBracket = openBrace.next as BeginToken;
+    BeginToken openParen = openBracket.next as BeginToken;
+    expect(openParen.next!.type, TokenType.EOF);
     expect(openBrace.endToken, isNull);
     expect(openBracket.endToken, isNull);
     expect(openParen.endToken, isNull);
@@ -1328,9 +1326,9 @@
     Token token = _scan(source);
     expect(token, isNotNull);
     expect(token.type, TokenType.EOF);
-    Token comment = token.precedingComments;
+    Token? comment = token.precedingComments;
     expect(comment, isNotNull);
-    expect(comment.type, commentType);
+    expect(comment!.type, commentType);
     expect(comment.offset, 0);
     expect(comment.length, source.length);
     expect(comment.lexeme, source);
@@ -1342,7 +1340,7 @@
     expect(token.type, TokenType.EOF);
     comment = token.precedingComments;
     expect(comment, isNotNull);
-    expect(comment.type, commentType);
+    expect(comment!.type, commentType);
     expect(comment.offset, 0);
     expect(comment.length, source.length);
     expect(comment.lexeme, source);
@@ -1358,7 +1356,7 @@
    */
   Token _assertError(
       ScannerErrorCode expectedError, int expectedOffset, String source,
-      [List<Object> arguments]) {
+      [List<Object>? arguments]) {
     ErrorListener listener = new ErrorListener();
     var tokens = scanWithListener(source, listener);
     listener.assertErrors(
@@ -1388,7 +1386,7 @@
    * with the same lexeme as the original source.
    */
   void _assertKeywordToken(String source,
-      {ScannerConfiguration configuration}) {
+      {ScannerConfiguration? configuration}) {
     Token token = _scan(source, configuration: configuration);
     expect(token, isNotNull);
     expect(token.type.isKeyword, true);
@@ -1407,7 +1405,7 @@
     value = token.value();
     expect(value is Keyword, isTrue);
     expect((value as Keyword).lexeme, source);
-    expect(token.next.type, TokenType.EOF);
+    expect(token.next!.type, TokenType.EOF);
   }
 
   /**
@@ -1415,7 +1413,7 @@
    * token with the same lexeme as the original source.
    */
   void _assertNotKeywordToken(String source,
-      {ScannerConfiguration configuration}) {
+      {ScannerConfiguration? configuration}) {
     Token token = _scan(source, configuration: configuration);
     expect(token, isNotNull);
     expect(token.type.isKeyword, false);
@@ -1428,7 +1426,7 @@
     expect(token.offset, 1);
     expect(token.length, source.length);
     expect(token.lexeme, source);
-    expect(token.next.type, TokenType.EOF);
+    expect(token.next!.type, TokenType.EOF);
   }
 
   /**
@@ -1494,10 +1492,11 @@
 
   void _checkTokens(Token firstToken, List<Token> expectedTokens) {
     expect(firstToken, isNotNull);
-    Token token = firstToken;
+    Token? token = firstToken;
     for (int i = 0; i < expectedTokens.length; i++) {
       Token expectedToken = expectedTokens[i];
-      expect(token.type, expectedToken.type, reason: "Wrong type for token $i");
+      expect(token!.type, expectedToken.type,
+          reason: "Wrong type for token $i");
       expect(token.offset, expectedToken.offset,
           reason: "Wrong offset for token $i");
       expect(token.length, expectedToken.length,
@@ -1507,11 +1506,11 @@
       token = token.next;
       expect(token, isNotNull);
     }
-    expect(token.type, TokenType.EOF);
+    expect(token!.type, TokenType.EOF);
   }
 
   Token _scan(String source,
-      {ScannerConfiguration configuration, bool ignoreErrors: false}) {
+      {ScannerConfiguration? configuration, bool ignoreErrors: false}) {
     ErrorListener listener = new ErrorListener();
     Token token =
         scanWithListener(source, listener, configuration: configuration);
@@ -1539,7 +1538,7 @@
 class TestError {
   final int offset;
   final ErrorCode errorCode;
-  final List<Object> arguments;
+  final List<Object>? arguments;
 
   TestError(this.offset, this.errorCode, this.arguments);
 
@@ -1547,7 +1546,7 @@
   int get hashCode {
     int h = combineHash(combineHash(0, offset), errorCode.hashCode);
     if (arguments != null) {
-      for (Object argument in arguments) {
+      for (Object argument in arguments!) {
         h = combineHash(h, argument.hashCode);
       }
     }
@@ -1561,9 +1560,9 @@
         errorCode == other.errorCode) {
       if (arguments == null) return other.arguments == null;
       if (other.arguments == null) return false;
-      if (arguments.length != other.arguments.length) return false;
-      for (int i = 0; i < arguments.length; i++) {
-        if (arguments[i] != other.arguments[i]) return false;
+      if (arguments!.length != other.arguments!.length) return false;
+      for (int i = 0; i < arguments!.length; i++) {
+        if (arguments![i] != other.arguments![i]) return false;
       }
       return true;
     }
@@ -1572,7 +1571,7 @@
 
   @override
   String toString() {
-    var argString = arguments == null ? '' : '(${arguments.join(', ')})';
+    var argString = arguments == null ? '' : '(${arguments!.join(', ')})';
     return 'Error($offset, $errorCode$argString)';
   }
 }
diff --git a/pkg/front_end/test/scheme_based_file_system_test.dart b/pkg/front_end/test/scheme_based_file_system_test.dart
index 2cbe46e..4332fca 100644
--- a/pkg/front_end/test/scheme_based_file_system_test.dart
+++ b/pkg/front_end/test/scheme_based_file_system_test.dart
@@ -2,53 +2,32 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:front_end/src/api_prototype/file_system.dart';
 import 'package:front_end/src/scheme_based_file_system.dart';
 
 import 'package:test/test.dart';
 
+import 'mock_file_system.dart';
+
 void main() {
   test('lookup of registered schemes is handled', () {
-    var fs1 = new MockFileSystem('scheme1');
-    var fs2 = new MockFileSystem('scheme2');
+    var fs1 = new MockFileSystem(scheme: 'scheme1');
+    var fs2 = new MockFileSystem(scheme: 'scheme2');
     var fileSystem =
         new SchemeBasedFileSystem({'scheme1': fs1, 'scheme2': fs2});
 
-    MockFileSystemEntity e1 =
-        fileSystem.entityForUri(Uri.parse('scheme1:a.dart'));
-    MockFileSystemEntity e2 =
-        fileSystem.entityForUri(Uri.parse('scheme2:a.dart'));
+    MockFileSystemEntity e1 = fileSystem
+        .entityForUri(Uri.parse('scheme1:a.dart')) as MockFileSystemEntity;
+    MockFileSystemEntity e2 = fileSystem
+        .entityForUri(Uri.parse('scheme2:a.dart')) as MockFileSystemEntity;
     expect(e1.fileSystem, fs1);
     expect(e2.fileSystem, fs2);
   });
 
   test('lookup of an unregistered scheme will throw', () {
-    var fileSystem =
-        new SchemeBasedFileSystem({'scheme1': new MockFileSystem('scheme1')});
+    var fileSystem = new SchemeBasedFileSystem(
+        {'scheme1': new MockFileSystem(scheme: 'scheme1')});
     expect(() => fileSystem.entityForUri(Uri.parse('scheme2:a.dart')),
         throwsA((e) => e is FileSystemException));
   });
 }
-
-class MockFileSystem implements FileSystem {
-  String scheme;
-  MockFileSystem(this.scheme);
-
-  @override
-  FileSystemEntity entityForUri(Uri uri) {
-    if (uri.scheme != scheme) throw "unsupported";
-    return new MockFileSystemEntity(uri, this);
-  }
-}
-
-class MockFileSystemEntity implements FileSystemEntity {
-  @override
-  final Uri uri;
-  final FileSystem fileSystem;
-  MockFileSystemEntity(this.uri, this.fileSystem);
-
-  @override
-  dynamic noSuchMethod(m) => super.noSuchMethod(m);
-}
diff --git a/pkg/front_end/test/severity_index_test.dart b/pkg/front_end/test/severity_index_test.dart
index 105e46b..e404f6a 100644
--- a/pkg/front_end/test/severity_index_test.dart
+++ b/pkg/front_end/test/severity_index_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 
 /// Test that Severity has the expected indexes. Note that this is important
diff --git a/pkg/front_end/test/spell_checking_cleanup_lists.dart b/pkg/front_end/test/spell_checking_cleanup_lists.dart
index ea44732..f2b9684 100644
--- a/pkg/front_end/test/spell_checking_cleanup_lists.dart
+++ b/pkg/front_end/test/spell_checking_cleanup_lists.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io';
 
 import 'spell_checking_utils.dart' as spell;
@@ -12,7 +10,7 @@
   {
     spell.ensureDictionariesLoaded([spell.Dictionaries.common]);
     Set<String> commonWords =
-        spell.loadedDictionaries[spell.Dictionaries.common];
+        spell.loadedDictionaries![spell.Dictionaries.common]!;
     for (spell.Dictionaries dictionary in spell.Dictionaries.values) {
       if (dictionary == spell.Dictionaries.common) continue;
       Uri uri = spell.dictionaryToUri(dictionary);
@@ -30,7 +28,7 @@
   {
     spell.ensureDictionariesLoaded([spell.Dictionaries.cfeCode]);
     Set<String> codeWords =
-        spell.loadedDictionaries[spell.Dictionaries.cfeCode];
+        spell.loadedDictionaries![spell.Dictionaries.cfeCode]!;
     Uri uri = spell.dictionaryToUri(spell.Dictionaries.cfeTests);
     List<String> keep = <String>[];
     for (String line in new File.fromUri(uri).readAsLinesSync()) {
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 5746a68..89cc303 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -11,6 +11,7 @@
 
 a+b
 abbreviate
+abc
 abcdef
 abs
 accounting
@@ -178,6 +179,7 @@
 charcode
 chars
 checkpoint
+chloestefantsova
 chunks
 ci
 circuited
@@ -216,6 +218,7 @@
 codec
 codes
 collision
+coloring
 colorized
 com
 combinations
@@ -271,6 +274,7 @@
 cryptic
 crypto
 csslib
+cstefantsova
 ctx
 customized
 cut
@@ -329,6 +333,7 @@
 destination
 destinations
 destroy
+destructive
 deterministic
 dev
 device
@@ -398,6 +403,7 @@
 engineered
 enhanced
 enters
+entrypointish
 enumerates
 env
 eof
@@ -457,6 +463,7 @@
 fieldformal
 file's
 filenames
+fileuri
 finally's
 finv
 firsts
@@ -620,6 +627,7 @@
 int64
 int8
 integrate
+intends
 intentionally
 interested
 interim
@@ -677,6 +685,8 @@
 launched
 launcher
 layer
+layered
+layers
 layout
 lc
 ld
@@ -685,6 +695,7 @@
 len
 lets
 letting
+levels
 lex
 lexemes
 lf
@@ -721,6 +732,8 @@
 lz
 m
 macos
+macro
+macros
 maintaining
 mangled
 manipulation
@@ -857,6 +870,7 @@
 orphans
 ors
 os
+outlined
 outputs
 outputting
 overlap
@@ -888,6 +902,7 @@
 parens
 parenteses
 particularly
+partof
 patchup
 path
 patterns
@@ -928,7 +943,9 @@
 prebuilt
 preexisted
 preexisting
+premark
 preorder
+preprocess
 presented
 presubmit
 presumably
@@ -939,6 +956,7 @@
 println
 prioritization
 proc
+processor
 producers
 product
 progresses
@@ -1014,6 +1032,7 @@
 recompiling
 recompute
 recomputed
+recorder
 recoveries
 recreate
 recursion
@@ -1081,6 +1100,7 @@
 role
 room
 rooted
+rough
 roughly
 rounding
 roundtrip
@@ -1195,6 +1215,7 @@
 stopgap
 stopped
 storage
+story
 str
 strategies
 streak
@@ -1211,6 +1232,7 @@
 subexpression
 subexpression's
 subexpressions
+subgraph
 subnode
 subnodes
 subscription
@@ -1381,6 +1403,7 @@
 unsortable
 unsound
 unsoundness
+untouched
 unwrapper
 unwraps
 unwritten
@@ -1391,6 +1414,7 @@
 uri's
 url
 urls
+usages
 usr
 usual
 usually
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index cad9efd..28be9b1 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -436,7 +436,6 @@
 checking
 checkpoints
 checks
-chian
 child
 children
 choice
@@ -598,6 +597,7 @@
 consider
 considered
 considers
+consist
 consistency
 consistent
 consistently
@@ -2045,6 +2045,7 @@
 ok
 old
 older
+omission
 omit
 omitted
 on
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index e6c4cf0..2a6a8f4 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -158,6 +158,7 @@
 cc
 ccc
 cell
+certificate
 cf
 characteristics
 charset
@@ -598,10 +599,13 @@
 la
 launch
 launching
+layered
 layers
 le
 legs
 lengths
+lib2a
+lib2b
 lightly
 likewise
 lily
@@ -643,6 +647,10 @@
 lookahead
 loopback
 mac
+macro
+macro2a
+macro2b
+macros
 maker
 matters
 mds
@@ -652,6 +660,7 @@
 metric
 metrics
 mf
+mfs
 micro
 minimize
 minimizer
@@ -692,6 +701,7 @@
 nonexisting
 noo
 noted
+nottest
 numerator
 ob
 obool
@@ -702,6 +712,7 @@
 ol
 onull
 oo
+oobar
 oocf
 ooo
 oovf
@@ -776,6 +787,9 @@
 quux
 quuz
 qux
+qux1
+qux3x
+qux4x
 r"
 r"\s
 r"k
@@ -785,6 +799,7 @@
 reality
 recompile
 recompiles
+recorder
 redir
 redirections
 rediscover
@@ -836,6 +851,7 @@
 sdkroot
 sdks
 secondary
+secondtest12part1usage
 segment
 selection
 semifuzz
@@ -918,8 +934,19 @@
 tails
 talk
 templates
+test10
+test12
+test12part1usage
+test13
+test13andahalf
+test15thing
+test16
+test16toplevel
 test3a
 test3b
+test3partfoo
+test8
+test9
 theoretically
 thereof
 thread
@@ -989,6 +1016,7 @@
 waiting
 waits
 walt
+wants
 warmup
 week
 weekly
@@ -1007,8 +1035,10 @@
 xxx
 xxxxxxxx
 xxxxxxxxxxxx
+xyz
 y's
 year
 yxxx
 yy
+zyx
 zz
diff --git a/pkg/front_end/test/spell_checking_utils.dart b/pkg/front_end/test/spell_checking_utils.dart
index c08fb4c..19347ef 100644
--- a/pkg/front_end/test/spell_checking_utils.dart
+++ b/pkg/front_end/test/spell_checking_utils.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show File, stdin, stdout;
 
 import "utils/io_utils.dart";
@@ -19,17 +17,17 @@
   denylist,
 }
 
-Map<Dictionaries, Set<String>> loadedDictionaries;
+Map<Dictionaries, Set<String>>? loadedDictionaries;
 
 SpellingResult spellcheckString(String s,
-    {List<Dictionaries> dictionaries, bool splitAsCode: false}) {
+    {List<Dictionaries>? dictionaries, bool splitAsCode: false}) {
   dictionaries ??= const [Dictionaries.common];
   ensureDictionariesLoaded(dictionaries);
 
-  List<String> wrongWords;
-  List<List<String>> wrongWordsAlternatives;
-  List<int> wrongWordsOffset;
-  List<bool> wrongWordDenylisted;
+  List<String>? wrongWords;
+  List<List<String>?>? wrongWordsAlternatives;
+  List<int>? wrongWordsOffset;
+  List<bool>? wrongWordDenylisted;
   List<int> wordOffsets = <int>[];
   List<String> words =
       splitStringIntoWords(s, wordOffsets, splitAsCode: splitAsCode);
@@ -37,7 +35,7 @@
   for (int j = 0; j < dictionaries.length; j++) {
     Dictionaries dictionaryType = dictionaries[j];
     if (dictionaryType == Dictionaries.denylist) continue;
-    Set<String> dictionary = loadedDictionaries[dictionaryType];
+    Set<String> dictionary = loadedDictionaries![dictionaryType]!;
     dictionariesUnpacked.add(dictionary);
   }
   for (int i = 0; i < words.length; i++) {
@@ -53,15 +51,15 @@
       }
     }
     if (!found) {
-      wrongWords ??= <String>[];
+      wrongWords ??= [];
       wrongWords.add(word);
-      wrongWordsAlternatives ??= <List<String>>[];
+      wrongWordsAlternatives ??= [];
       wrongWordsAlternatives.add(findAlternatives(word, dictionariesUnpacked));
-      wrongWordsOffset ??= <int>[];
+      wrongWordsOffset ??= [];
       wrongWordsOffset.add(offset);
-      wrongWordDenylisted ??= <bool>[];
+      wrongWordDenylisted ??= [];
       wrongWordDenylisted
-          .add(loadedDictionaries[Dictionaries.denylist].contains(word));
+          .add(loadedDictionaries![Dictionaries.denylist]!.contains(word));
     }
   }
 
@@ -69,8 +67,8 @@
       wrongWordsAlternatives);
 }
 
-List<String> findAlternatives(String word, List<Set<String>> dictionaries) {
-  List<String> result;
+List<String>? findAlternatives(String word, List<Set<String>> dictionaries) {
+  List<String>? result;
 
   bool check(String w) {
     for (int j = 0; j < dictionaries.length; j++) {
@@ -81,8 +79,7 @@
   }
 
   void ok(String w) {
-    result ??= <String>[];
-    result.add(w);
+    (result ??= <String>[]).add(w);
   }
 
   // Delete a letter, insert a letter or change a letter and lookup.
@@ -111,10 +108,10 @@
 }
 
 class SpellingResult {
-  final List<String> misspelledWords;
-  final List<int> misspelledWordsOffset;
-  final List<bool> misspelledWordsDenylisted;
-  final List<List<String>> misspelledWordsAlternatives;
+  final List<String>? misspelledWords;
+  final List<int>? misspelledWordsOffset;
+  final List<bool>? misspelledWordsDenylisted;
+  final List<List<String>?>? misspelledWordsAlternatives;
 
   SpellingResult(this.misspelledWords, this.misspelledWordsOffset,
       this.misspelledWordsDenylisted, this.misspelledWordsAlternatives);
@@ -140,19 +137,19 @@
 
   loadedDictionaries ??= new Map<Dictionaries, Set<String>>();
   // Ensure the denylist is loaded.
-  Set<String> denylistDictionary = loadedDictionaries[Dictionaries.denylist];
+  Set<String>? denylistDictionary = loadedDictionaries![Dictionaries.denylist];
   if (denylistDictionary == null) {
     denylistDictionary = new Set<String>();
-    loadedDictionaries[Dictionaries.denylist] = denylistDictionary;
+    loadedDictionaries![Dictionaries.denylist] = denylistDictionary;
     addWords(dictionaryToUri(Dictionaries.denylist), denylistDictionary);
   }
 
   for (int j = 0; j < dictionaries.length; j++) {
     Dictionaries dictionaryType = dictionaries[j];
-    Set<String> dictionary = loadedDictionaries[dictionaryType];
+    Set<String>? dictionary = loadedDictionaries![dictionaryType];
     if (dictionary == null) {
       dictionary = new Set<String>();
-      loadedDictionaries[dictionaryType] = dictionary;
+      loadedDictionaries![dictionaryType] = dictionary;
       addWords(dictionaryToUri(dictionaryType), dictionary);
       // Check that no good words occur in the denylist.
       for (String s in dictionary) {
@@ -182,7 +179,6 @@
       return repoDir
           .resolve("pkg/front_end/test/spell_checking_list_denylist.txt");
   }
-  throw "Unknown Dictionary";
 }
 
 List<String> splitStringIntoWords(String s, List<int> splitOffsets,
@@ -370,7 +366,7 @@
     print("The following word(s) were reported as unknown:");
     print("----------------");
 
-    Dictionaries dictionaryToUse;
+    Dictionaries? dictionaryToUse;
     if (dictionaries.contains(Dictionaries.cfeTests)) {
       dictionaryToUse = Dictionaries.cfeTests;
     } else if (dictionaries.contains(Dictionaries.cfeMessages)) {
@@ -391,11 +387,11 @@
       for (String s in reportedWords) {
         print("- $s");
         String answer;
-        bool add;
+        bool? add;
         while (true) {
           stdout.write("Do you want to add the word to the dictionary "
               "$dictionaryToUse (y/n)? ");
-          answer = stdin.readLineSync().trim().toLowerCase();
+          answer = stdin.readLineSync()!.trim().toLowerCase();
           switch (answer) {
             case "y":
             case "yes":
diff --git a/pkg/front_end/test/spell_checking_utils_test.dart b/pkg/front_end/test/spell_checking_utils_test.dart
index 07c8904..b91ed891 100644
--- a/pkg/front_end/test/spell_checking_utils_test.dart
+++ b/pkg/front_end/test/spell_checking_utils_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'spell_checking_utils.dart';
 
 void main() {
@@ -98,7 +96,7 @@
   compareLists(actualOffsets, expectedOffsets);
 }
 
-void compareLists(List<dynamic> actual, List<dynamic> expected) {
+void compareLists(List<dynamic>? actual, List<dynamic>? expected) {
   if (actual == null && expected == null) return;
   if (actual == null) throw "Got null, expected $expected";
   if (expected == null) throw "Expected null, got $actual";
@@ -113,7 +111,7 @@
 }
 
 void expectAlternative(
-    String word, List<String> expected, Set<String> dictionary) {
-  List<String> alternatives = findAlternatives(word, [dictionary]);
+    String word, List<String>? expected, Set<String> dictionary) {
+  List<String>? alternatives = findAlternatives(word, [dictionary]);
   compareLists(alternatives, expected);
 }
diff --git a/pkg/front_end/test/spelling_test_base.dart b/pkg/front_end/test/spelling_test_base.dart
index fd1c94a..e6d43dc 100644
--- a/pkg/front_end/test/spelling_test_base.dart
+++ b/pkg/front_end/test/spelling_test_base.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show File, Platform;
 
 import 'dart:typed_data' show Uint8List;
@@ -37,7 +35,7 @@
   final bool interactive;
   final bool onlyInGit;
 
-  SpellContext({this.interactive, this.onlyInGit});
+  SpellContext({required this.interactive, required this.onlyInGit});
 
   // Override special handling of negative tests.
   @override
@@ -75,7 +73,7 @@
         dictionaries,
         interactive,
         '"$dartPath" "$suitePath" -DonlyInGit=$onlyInGit -Dinteractive=true');
-    return null;
+    return new Future.value();
   }
 }
 
@@ -97,14 +95,13 @@
     Utf8BytesScanner scanner =
         new Utf8BytesScanner(bytes, includeComments: true);
     Token firstToken = scanner.tokenize();
-    if (firstToken == null) return null;
-    Token token = firstToken;
+    Token? token = firstToken;
 
-    List<String> errors;
+    List<String>? errors;
     Source source = new Source(
         scanner.lineStarts, rawBytes, description.uri, description.uri);
     void addErrorMessage(
-        int offset, String word, bool denylisted, List<String> alternatives) {
+        int offset, String word, bool denylisted, List<String>? alternatives) {
       errors ??= <String>[];
       String message;
       if (denylisted) {
@@ -128,7 +125,7 @@
             "- $dictionaryPathString\n";
       }
       Location location = source.getLocation(description.uri, offset);
-      errors.add(command_line_reporting.formatErrorMessage(
+      errors!.add(command_line_reporting.formatErrorMessage(
           source.getTextLine(location.line),
           location,
           word.length,
@@ -142,20 +139,20 @@
         return pass(description);
       }
       if (token.precedingComments != null) {
-        Token comment = token.precedingComments;
+        Token? comment = token.precedingComments;
         while (comment != null) {
           spell.SpellingResult spellingResult = spell.spellcheckString(
               comment.lexeme,
               splitAsCode: true,
               dictionaries: context.dictionaries);
           if (spellingResult.misspelledWords != null) {
-            for (int i = 0; i < spellingResult.misspelledWords.length; i++) {
-              bool denylisted = spellingResult.misspelledWordsDenylisted[i];
+            for (int i = 0; i < spellingResult.misspelledWords!.length; i++) {
+              bool denylisted = spellingResult.misspelledWordsDenylisted![i];
               if (context.onlyDenylisted && !denylisted) continue;
               int offset =
-                  comment.offset + spellingResult.misspelledWordsOffset[i];
-              addErrorMessage(offset, spellingResult.misspelledWords[i],
-                  denylisted, spellingResult.misspelledWordsAlternatives[i]);
+                  comment.offset + spellingResult.misspelledWordsOffset![i];
+              addErrorMessage(offset, spellingResult.misspelledWords![i],
+                  denylisted, spellingResult.misspelledWordsAlternatives![i]);
             }
           }
           comment = comment.next;
@@ -167,12 +164,13 @@
             splitAsCode: true,
             dictionaries: context.dictionaries);
         if (spellingResult.misspelledWords != null) {
-          for (int i = 0; i < spellingResult.misspelledWords.length; i++) {
-            bool denylisted = spellingResult.misspelledWordsDenylisted[i];
+          for (int i = 0; i < spellingResult.misspelledWords!.length; i++) {
+            bool denylisted = spellingResult.misspelledWordsDenylisted![i];
             if (context.onlyDenylisted && !denylisted) continue;
-            int offset = token.offset + spellingResult.misspelledWordsOffset[i];
-            addErrorMessage(offset, spellingResult.misspelledWords[i],
-                denylisted, spellingResult.misspelledWordsAlternatives[i]);
+            int offset =
+                token.offset + spellingResult.misspelledWordsOffset![i];
+            addErrorMessage(offset, spellingResult.misspelledWords![i],
+                denylisted, spellingResult.misspelledWordsAlternatives![i]);
           }
         }
       } else if (token is KeywordToken || token is BeginToken) {
@@ -191,7 +189,7 @@
     if (errors == null) {
       return pass(description);
     } else {
-      return fail(description, errors.join("\n\n"));
+      return fail(description, errors!.join("\n\n"));
     }
   }
 }
diff --git a/pkg/front_end/test/spelling_test_external_targets.dart b/pkg/front_end/test/spelling_test_external_targets.dart
index 952f4b3..c2eef74 100644
--- a/pkg/front_end/test/spelling_test_external_targets.dart
+++ b/pkg/front_end/test/spelling_test_external_targets.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, File, FileSystemEntity;
 
 import 'package:testing/testing.dart'
@@ -30,7 +28,7 @@
 }
 
 class SpellContextExternal extends SpellContext {
-  SpellContextExternal({bool interactive, bool onlyInGit})
+  SpellContextExternal({required bool interactive, required bool onlyInGit})
       : super(interactive: interactive, onlyInGit: onlyInGit);
 
   @override
diff --git a/pkg/front_end/test/spelling_test_not_src_suite.dart b/pkg/front_end/test/spelling_test_not_src_suite.dart
index 9eb9921e..285e8fc 100644
--- a/pkg/front_end/test/spelling_test_not_src_suite.dart
+++ b/pkg/front_end/test/spelling_test_not_src_suite.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:testing/testing.dart' show Chain, runMe;
 
 import 'spelling_test_base.dart';
@@ -26,7 +24,7 @@
 }
 
 class SpellContextTest extends SpellContext {
-  SpellContextTest({bool interactive, bool onlyInGit})
+  SpellContextTest({required bool interactive, required bool onlyInGit})
       : super(interactive: interactive, onlyInGit: onlyInGit);
 
   @override
diff --git a/pkg/front_end/test/spelling_test_src_suite.dart b/pkg/front_end/test/spelling_test_src_suite.dart
index f77e918..066475a 100644
--- a/pkg/front_end/test/spelling_test_src_suite.dart
+++ b/pkg/front_end/test/spelling_test_src_suite.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:testing/testing.dart' show Chain, runMe;
 
 import 'spelling_test_base.dart';
@@ -26,7 +24,7 @@
 }
 
 class SpellContextSource extends SpellContext {
-  SpellContextSource({bool interactive, bool onlyInGit})
+  SpellContextSource({required bool interactive, required bool onlyInGit})
       : super(interactive: interactive, onlyInGit: onlyInGit);
 
   @override
diff --git a/pkg/front_end/test/split_dill_test.dart b/pkg/front_end/test/split_dill_test.dart
index 16484f2..9ff415d 100644
--- a/pkg/front_end/test/split_dill_test.dart
+++ b/pkg/front_end/test/split_dill_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, File, Platform, Process, ProcessResult;
 
 import 'dart:typed_data' show Uint8List;
diff --git a/pkg/front_end/test/src/base/processed_options_test.dart b/pkg/front_end/test/src/base/processed_options_test.dart
index 00c3a75..a0282ba 100644
--- a/pkg/front_end/test/src/base/processed_options_test.dart
+++ b/pkg/front_end/test/src/base/processed_options_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:front_end/src/api_prototype/compiler_options.dart';
 import 'package:front_end/src/api_prototype/memory_file_system.dart';
 import 'package:front_end/src/base/processed_options.dart';
@@ -36,7 +34,7 @@
   MemoryFileSystem fileSystem =
       new MemoryFileSystem(Uri.parse('org-dartlang-test:///'));
 
-  Component _mockOutline;
+  Component? _mockOutline;
 
   Component get mockSummary => _mockOutline ??= new Component(libraries: [
         new Library(Uri.parse('org-dartlang-test:///a/b.dart'),
@@ -87,7 +85,7 @@
       ..sdkSummary = uri;
     var processed = new ProcessedOptions(options: raw);
 
-    var bytes = await processed.loadSdkSummaryBytes();
+    var bytes = (await processed.loadSdkSummaryBytes())!;
     expect(bytes, isNotEmpty);
 
     var sdkSummary = loadComponentFromBytes(bytes);
@@ -111,7 +109,8 @@
 
   Future<Null> checkMockSummary(CompilerOptions raw) async {
     var processed = new ProcessedOptions(options: raw);
-    var sdkSummary = await processed.loadSdkSummary(new CanonicalName.root());
+    var sdkSummary =
+        (await processed.loadSdkSummary(new CanonicalName.root()))!;
     expect(sdkSummary.libraries.single.importUri,
         mockSummary.libraries.single.importUri);
   }
@@ -130,7 +129,7 @@
           Uri.parse('org-dartlang-test:///libraries.json');
     var processed = new ProcessedOptions(options: raw);
     var uriTranslator = await processed.getUriTranslator();
-    expect(uriTranslator.dartLibraries.libraryInfoFor('foo').uri.path,
+    expect(uriTranslator.dartLibraries.libraryInfoFor('foo')!.uri.path,
         '/bar.dart');
   }
 
@@ -149,7 +148,7 @@
       ..sdkRoot = Uri.parse('org-dartlang-test:///mysdk/');
     var processed = new ProcessedOptions(options: raw);
     var uriTranslator = await processed.getUriTranslator();
-    expect(uriTranslator.dartLibraries.libraryInfoFor('foo').uri.path,
+    expect(uriTranslator.dartLibraries.libraryInfoFor('foo')!.uri.path,
         '/mysdk/lib/bar.dart');
   }
 
diff --git a/pkg/front_end/test/standard_file_system_test.dart b/pkg/front_end/test/standard_file_system_test.dart
index c22913c..5092342 100644
--- a/pkg/front_end/test/standard_file_system_test.dart
+++ b/pkg/front_end/test/standard_file_system_test.dart
@@ -3,8 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 // SharedOptions=--supermixin
 
-// @dart = 2.9
-
 library front_end.test.standard_file_system_test;
 
 import 'dart:convert';
@@ -31,8 +29,8 @@
 
 @reflectiveTest
 class DirectoryTest extends _BaseTest {
-  String path;
-  FileSystemEntity dir;
+  late String path;
+  late FileSystemEntity dir;
 
   @override
   void setUp() {
@@ -70,8 +68,8 @@
 
 @reflectiveTest
 class FileTest extends _BaseTest {
-  String path;
-  FileSystemEntity file;
+  late String path;
+  late FileSystemEntity file;
 
   @override
   void setUp() {
@@ -146,7 +144,7 @@
 
 @reflectiveTest
 class StandardFileSystemTest extends _BaseTest {
-  Uri tempUri;
+  late Uri tempUri;
 
   @override
   void setUp() {
@@ -231,8 +229,8 @@
 }
 
 class _BaseTest {
-  io.Directory tempDirectory;
-  String tempPath;
+  late io.Directory tempDirectory;
+  late String tempPath;
 
   FileSystemEntity entityForPath(String path) =>
       StandardFileSystem.instance.entityForUri(p.toUri(path));
diff --git a/pkg/front_end/test/static_types/analysis_helper.dart b/pkg/front_end/test/static_types/analysis_helper.dart
index 2e57c0e..6564bd1 100644
--- a/pkg/front_end/test/static_types/analysis_helper.dart
+++ b/pkg/front_end/test/static_types/analysis_helper.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:convert' as json;
 import 'dart:io';
 
@@ -25,7 +23,7 @@
 Future<void> run(Uri entryPoint, String allowedListPath,
     {bool verbose = false,
     bool generate = false,
-    bool analyzedUrisFilter(Uri uri)}) async {
+    bool Function(Uri uri)? analyzedUrisFilter}) async {
   CompilerOptions options = new CompilerOptions();
   options.sdkRoot = computePlatformBinariesLocation(forceBuildDir: true);
 
@@ -33,10 +31,10 @@
     printDiagnosticMessage(message, print);
   };
   InternalCompilerResult compilerResult = await kernelForProgramInternal(
-      entryPoint, options,
-      retainDataForTesting: true, requireMain: false);
+          entryPoint, options, retainDataForTesting: true, requireMain: false)
+      as InternalCompilerResult;
 
-  new DynamicVisitor(options.onDiagnostic, compilerResult.component,
+  new DynamicVisitor(options.onDiagnostic!, compilerResult.component!,
           allowedListPath, analyzedUrisFilter)
       .run(verbose: verbose, generate: generate);
 }
@@ -44,7 +42,7 @@
 class StaticTypeVisitorBase extends RecursiveVisitor {
   final TypeEnvironment typeEnvironment;
 
-  StaticTypeContext staticTypeContext;
+  StaticTypeContext? staticTypeContext;
 
   StaticTypeVisitorBase(Component component, ClassHierarchy classHierarchy)
       : typeEnvironment =
@@ -86,8 +84,8 @@
 
   final DiagnosticMessageHandler onDiagnostic;
   final Component component;
-  final String _allowedListPath;
-  final bool Function(Uri uri) analyzedUrisFilter;
+  final String? _allowedListPath;
+  final bool Function(Uri uri)? analyzedUrisFilter;
 
   Map _expectedJson = {};
   Map<String, Map<String, List<FormattedMessage>>> _actualMessages = {};
@@ -99,7 +97,7 @@
 
   void run({bool verbose = false, bool generate = false}) {
     if (!generate && _allowedListPath != null) {
-      File file = new File(_allowedListPath);
+      File file = new File(_allowedListPath!);
       if (file.existsSync()) {
         try {
           _expectedJson = json.jsonDecode(file.readAsStringSync());
@@ -121,14 +119,14 @@
         actualJson[uri] = map;
       });
 
-      new File(_allowedListPath).writeAsStringSync(
+      new File(_allowedListPath!).writeAsStringSync(
           new json.JsonEncoder.withIndent('  ').convert(actualJson));
       return;
     }
 
     int errorCount = 0;
     _expectedJson.forEach((uri, expectedMessages) {
-      Map<String, List<FormattedMessage>> actualMessagesMap =
+      Map<String, List<FormattedMessage>>? actualMessagesMap =
           _actualMessages[uri];
       if (actualMessagesMap == null) {
         print("Error: Allowed-listing of uri '$uri' isn't used. "
@@ -136,7 +134,7 @@
         errorCount++;
       } else {
         expectedMessages.forEach((expectedMessage, expectedCount) {
-          List<FormattedMessage> actualMessages =
+          List<FormattedMessage>? actualMessages =
               actualMessagesMap[expectedMessage];
           if (actualMessages == null) {
             print("Error: Allowed-listing of message '$expectedMessage' "
@@ -223,8 +221,8 @@
                                 locatedMessage.messageObject.correctionMessage,
                             arguments: locatedMessage.messageObject.arguments)),
                     Severity.warning,
-                    location:
-                        new Location(message.uri, message.line, message.column),
+                    location: new Location(
+                        message.uri!, message.line, message.column),
                     uriToSource: component.uriToSource),
                 message.line,
                 message.column,
@@ -256,7 +254,7 @@
   @override
   void visitLibrary(Library node) {
     if (analyzedUrisFilter != null) {
-      if (analyzedUrisFilter(node.importUri)) {
+      if (analyzedUrisFilter!(node.importUri)) {
         super.visitLibrary(node);
       }
     } else {
@@ -309,9 +307,9 @@
   }
 
   void registerError(TreeNode node, String message) {
-    Location location = node.location;
+    Location location = node.location!;
     Uri uri = location.file;
-    String uriString = relativizeUri(uri);
+    String uriString = relativizeUri(uri)!;
     Map<String, List<FormattedMessage>> actualMap = _actualMessages.putIfAbsent(
         uriString, () => <String, List<FormattedMessage>>{});
     if (uri.scheme == 'org-dartlang-sdk') {
diff --git a/pkg/front_end/test/static_types/cfe_dynamic_test.dart b/pkg/front_end/test/static_types/cfe_dynamic_test.dart
index ff5e01c..06d08c1 100644
--- a/pkg/front_end/test/static_types/cfe_dynamic_test.dart
+++ b/pkg/front_end/test/static_types/cfe_dynamic_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'analysis_helper.dart';
 
 /// Filter function used to only analysis cfe source code.
diff --git a/pkg/front_end/test/static_types/static_type_test.dart b/pkg/front_end/test/static_types/static_type_test.dart
index 0f168be..cf4d5c3 100644
--- a/pkg/front_end/test/static_types/static_type_test.dart
+++ b/pkg/front_end/test/static_types/static_type_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart';
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
@@ -46,7 +44,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new StaticTypeDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
   }
@@ -57,7 +55,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new StaticTypeDataExtractor(compilerResult, actualMap));
   }
 
@@ -67,12 +65,12 @@
 
 class StaticTypeDataExtractor extends CfeDataExtractor<String> {
   final TypeEnvironment _environment;
-  StaticTypeContext _staticTypeContext;
+  StaticTypeContext? _staticTypeContext;
 
   StaticTypeDataExtractor(InternalCompilerResult compilerResult,
       Map<Id, ActualData<String>> actualMap)
       : _environment = new TypeEnvironment(
-            compilerResult.coreTypes, compilerResult.classHierarchy),
+            compilerResult.coreTypes!, compilerResult.classHierarchy!),
         super(compilerResult, actualMap);
 
   @override
@@ -102,23 +100,23 @@
   }
 
   @override
-  String computeMemberValue(Id id, Member node) {
+  String? computeMemberValue(Id id, Member node) {
     if (node is Procedure && node.function.futureValueType != null) {
-      return 'futureValueType=${typeToText(node.function.futureValueType)}';
+      return 'futureValueType=${typeToText(node.function.futureValueType!)}';
     }
     return null;
   }
 
   @override
-  String computeNodeValue(Id id, TreeNode node) {
+  String? computeNodeValue(Id id, TreeNode node) {
     if (isSkippedExpression(node)) {
       return null;
     }
     if (node is Expression) {
-      DartType type = node.getStaticType(_staticTypeContext);
+      DartType type = node.getStaticType(_staticTypeContext!);
       if (node is FunctionExpression && node.function.futureValueType != null) {
         return '${typeToText(type)},'
-            'futureValueType=${typeToText(node.function.futureValueType)}';
+            'futureValueType=${typeToText(node.function.futureValueType!)}';
       }
       return typeToText(type);
     } else if (node is Arguments) {
@@ -127,13 +125,13 @@
       }
     } else if (node is ForInStatement) {
       if (id.kind == IdKind.current) {
-        DartType type = _staticTypeContext.typeEnvironment.forInElementType(
-            node, node.iterable.getStaticType(_staticTypeContext));
+        DartType type = _staticTypeContext!.typeEnvironment.forInElementType(
+            node, node.iterable.getStaticType(_staticTypeContext!));
         return typeToText(type);
       }
     } else if (node is FunctionDeclaration) {
       if (node.function.futureValueType != null) {
-        return 'futureValueType=${typeToText(node.function.futureValueType)}';
+        return 'futureValueType=${typeToText(node.function.futureValueType!)}';
       }
     }
     return null;
@@ -151,7 +149,7 @@
 
   bool isNewReachabilityErrorArgument(object) {
     return object is StringLiteral &&
-        isNewReachabilityError(object.parent.parent);
+        isNewReachabilityError(object.parent!.parent);
   }
 
   bool isThrowReachabilityError(object) {
diff --git a/pkg/front_end/test/summary_generator_test.dart b/pkg/front_end/test/summary_generator_test.dart
index f3178d6..636cc41 100644
--- a/pkg/front_end/test/summary_generator_test.dart
+++ b/pkg/front_end/test/summary_generator_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:front_end/src/api_prototype/front_end.dart';
 import 'package:front_end/src/testing/compiler_common.dart';
 import 'package:kernel/kernel.dart';
@@ -13,19 +11,19 @@
 void main() {
   test('summary has no source-info by default', () async {
     var summary = await summarize(['a.dart'], allSources);
-    var component = loadComponentFromBytes(summary);
+    var component = loadComponentFromBytes(summary!);
 
     // Note: the kernel representation always includes the Uri entries, but
     // doesn't include the actual source here.
     for (Source source in component.uriToSource.values) {
       expect(source.source.length, 0);
-      expect(source.lineStarts.length, 0);
+      expect(source.lineStarts!.length, 0);
     }
   });
 
   test('summary includes declarations, but no method bodies', () async {
     var summary = await summarize(['a.dart'], allSources);
-    var component = loadComponentFromBytes(summary);
+    var component = loadComponentFromBytes(summary!);
     var aLib = findLibrary(component, 'a.dart');
     expect(aLib.importUri.path, '/a/b/c/a.dart');
     var classA = aLib.classes.first;
@@ -51,7 +49,7 @@
     var summaryD = await summarize(['d.dart'], sourcesWithABC,
         additionalDills: ['a.dill', 'bc.dill']);
 
-    checkDSummary(summaryD);
+    checkDSummary(summaryD!);
   });
 
   test('dependencies can be combined in any order', () async {
@@ -71,13 +69,13 @@
     // dill files and because of how the kernel loader merges definitions.
     var summaryD = await summarize(['d.dart'], sourcesWithABC,
         additionalDills: ['bc.dill', 'a.dill']);
-    checkDSummary(summaryD);
+    checkDSummary(summaryD!);
   });
 
   test('dependencies not included in truncated summaries', () async {
     // Note: by default this test is loading the SDK from summaries.
     var summaryA = await summarize(['a.dart'], allSources, truncate: true);
-    var component = loadComponentFromBytes(summaryA);
+    var component = loadComponentFromBytes(summaryA!);
     expect(component.libraries.length, 1);
     expect(
         component.libraries.single.importUri.path.endsWith('a.dart'), isTrue);
@@ -86,7 +84,7 @@
     sourcesWithA['a.dill'] = summaryA;
     var summaryB = await summarize(['b.dart'], sourcesWithA,
         additionalDills: ['a.dill'], truncate: true);
-    component = loadComponentFromBytes(summaryB);
+    component = loadComponentFromBytes(summaryB!);
     expect(component.libraries.length, 1);
     expect(
         component.libraries.single.importUri.path.endsWith('b.dart'), isTrue);
@@ -126,7 +124,7 @@
   expect(bClass.superclass, same(aClass));
 
   var dClass = dLib.classes.firstWhere((c) => c.name == 'D');
-  expect(dClass.superclass.superclass, same(bClass));
+  expect(dClass.superclass!.superclass, same(bClass));
 
   var dInterface = dClass.implementedTypes.first.classNode;
   expect(dInterface, same(aClass));
diff --git a/pkg/front_end/test/test_generator_test.dart b/pkg/front_end/test/test_generator_test.dart
index 2f009ea..569620a 100644
--- a/pkg/front_end/test/test_generator_test.dart
+++ b/pkg/front_end/test/test_generator_test.dart
@@ -2,11 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show exitCode, File, stdout;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart';
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
 import 'package:front_end/src/api_prototype/memory_file_system.dart';
 import 'package:front_end/src/compute_platform_binaries_location.dart';
 import 'package:front_end/src/fasta/kernel/utils.dart';
@@ -92,7 +91,9 @@
     StringBuffer sb = new StringBuffer();
     fs.entityForUri(testUri).writeAsStringSync(src);
     compiler.invalidate(testUri);
-    Component result = await compiler.computeDelta(entryPoints: [testUri]);
+    IncrementalCompilerResult compilerResult =
+        await compiler.computeDelta(entryPoints: [testUri]);
+    Component result = compilerResult.component;
     Iterator<Code> codeIterator = formattedWarningsCodes.iterator;
     for (String warning in formattedWarnings) {
       codeIterator.moveNext();
diff --git a/pkg/front_end/test/text_representation/empty_reference_test.dart b/pkg/front_end/test/text_representation/empty_reference_test.dart
index bd30c00..dd15aff 100644
--- a/pkg/front_end/test/text_representation/empty_reference_test.dart
+++ b/pkg/front_end/test/text_representation/empty_reference_test.dart
@@ -2,14 +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.
 
-// @dart = 2.9
-
 import 'package:expect/expect.dart';
 import 'package:kernel/ast.dart';
 import 'text_representation_test.dart';
 
 void testExpression(Expression node, String normal,
-    {String verbose, String limited}) {
+    {String? verbose, String? limited}) {
   Expect.stringEquals(normal, node.toText(normalStrategy),
       "Unexpected normal strategy text for ${node.runtimeType}");
   Expect.stringEquals(verbose ?? normal, node.toText(verboseStrategy),
@@ -18,7 +16,8 @@
       "Unexpected limited strategy text for ${node.runtimeType}");
 }
 
-void testType(DartType node, String normal, {String verbose, String limited}) {
+void testType(DartType node, String normal,
+    {String? verbose, String? limited}) {
   Expect.stringEquals(normal, node.toText(normalStrategy),
       "Unexpected normal strategy text for ${node.runtimeType}");
   Expect.stringEquals(verbose ?? normal, node.toText(verboseStrategy),
@@ -33,11 +32,6 @@
 }
 
 void testTypes() {
-  testType(new InterfaceType.byReference(null, Nullability.nonNullable, []),
-      '<missing-class-reference>');
-  testType(new TypedefType.byReference(null, Nullability.nonNullable, []),
-      '<missing-typedef-reference>');
-
   Reference unlinkedClassName = new Reference();
   testType(
       new InterfaceType.byReference(
@@ -83,9 +77,6 @@
 }
 
 void testMembers() {
-  testExpression(new StaticGet.byReference(null), '''
-<missing-member-reference>''');
-
   Reference unlinkedMemberName = new Reference();
   testExpression(
       new InstanceGet.byReference(
diff --git a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
index 3355ebf..4fd6fa1 100644
--- a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
+++ b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:expect/expect.dart';
 import 'package:front_end/src/fasta/kernel/collections.dart';
 import 'package:front_end/src/fasta/kernel/forest.dart';
@@ -12,7 +10,7 @@
 import 'text_representation_test.dart';
 
 void testStatement(Statement node, String normal,
-    {String verbose, String limited}) {
+    {String? verbose, String? limited}) {
   Expect.stringEquals(normal, node.toText(normalStrategy),
       "Unexpected normal strategy text for ${node.runtimeType}");
   Expect.stringEquals(verbose ?? normal, node.toText(verboseStrategy),
@@ -22,7 +20,7 @@
 }
 
 void testExpression(Expression node, String normal,
-    {String verbose, String limited}) {
+    {String? verbose, String? limited}) {
   Expect.stringEquals(normal, node.toText(normalStrategy),
       "Unexpected normal strategy text for ${node.runtimeType}");
   Expect.stringEquals(verbose ?? normal, node.toText(verboseStrategy),
@@ -592,10 +590,6 @@
   Library library = new Library(dummyUri, fileUri: dummyUri);
   LibraryDependency dependency =
       LibraryDependency.deferredImport(library, 'pre');
-
-  testExpression(new LoadLibraryTearOff(dependency, null), ''' 
-pre.loadLibrary''');
-
   Procedure procedure = new Procedure(new Name('get#loadLibrary'),
       ProcedureKind.Getter, new FunctionNode(new Block([])),
       fileUri: dummyUri);
diff --git a/pkg/front_end/test/text_representation/text_representation_test.dart b/pkg/front_end/test/text_representation/text_representation_test.dart
index 883ac09..b29f7ac 100644
--- a/pkg/front_end/test/text_representation/text_representation_test.dart
+++ b/pkg/front_end/test/text_representation/text_representation_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart';
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
@@ -103,7 +101,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new TextRepresentationDataExtractor(
             compilerResult, actualMap, getStrategy(config.marker))
         .computeForLibrary(library);
@@ -115,7 +113,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new TextRepresentationDataExtractor(
         compilerResult, actualMap, getStrategy(config.marker)));
   }
@@ -155,22 +153,22 @@
   }
 
   @override
-  String computeMemberValue(Id id, Member node) {
+  String? computeMemberValue(Id id, Member node) {
     if (node.name.text == 'stmtVariableDeclarationMulti') {
       print(node);
     }
     if (node.name.text.startsWith(expressionMarker)) {
       if (node is Procedure) {
-        Statement body = node.function.body;
+        Statement? body = node.function.body;
         if (body is ReturnStatement) {
-          return body.expression.toText(strategy);
+          return body.expression!.toText(strategy);
         }
       } else if (node is Field && node.initializer != null) {
-        return node.initializer.toText(strategy);
+        return node.initializer!.toText(strategy);
       }
     } else if (node.name.text.startsWith(statementMarker)) {
       if (node is Procedure) {
-        Statement body = node.function.body;
+        Statement? body = node.function.body;
         if (body is Block && body.statements.length == 1) {
           // Prefix with newline to make multiline text representations more
           // readable.
@@ -182,13 +180,13 @@
   }
 
   @override
-  String computeNodeValue(Id id, TreeNode node) {
+  String? computeNodeValue(Id id, TreeNode node) {
     if (node is ConstantExpression) {
       return node.constant.toText(strategy);
     } else if (node is VariableDeclaration) {
       DartType type = node.type;
       if (type is FunctionType && type.typedefType != null) {
-        return type.typedefType.toText(strategy);
+        return type.typedefType!.toText(strategy);
       } else {
         return type.toText(strategy);
       }
diff --git a/pkg/front_end/test/textual_outline_test.dart b/pkg/front_end/test/textual_outline_test.dart
index 4a2af05..fd50c3f 100644
--- a/pkg/front_end/test/textual_outline_test.dart
+++ b/pkg/front_end/test/textual_outline_test.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 import "dart:convert";
 
 import 'package:_fe_analyzer_shared/src/scanner/abstract_scanner.dart'
@@ -17,7 +15,7 @@
 
 void main() {
   // Doesn't sort if not asked to perform modelling.
-  String result = textualOutline(utf8.encode("""
+  String? result = textualOutline(utf8.encode("""
 b() { print("hello"); }
 a() { print("hello"); }
 """), scannerConfiguration, throwOnUnexpected: true, performModelling: false);
diff --git a/pkg/front_end/test/token_test.dart b/pkg/front_end/test/token_test.dart
index 9cf8377..301e6ec 100644
--- a/pkg/front_end/test/token_test.dart
+++ b/pkg/front_end/test/token_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
     show ScannerConfiguration, scanString;
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
@@ -38,11 +36,11 @@
 
     Token nextComment() {
       while (!token.isEof) {
-        Token comment = token.precedingComments;
-        token = token.next;
+        Token? comment = token.precedingComments;
+        token = token.next!;
         if (comment != null) return comment;
       }
-      return null;
+      throw new StateError("No comment found.");
     }
 
     Token comment = nextComment();
@@ -69,10 +67,10 @@
   void test_isSynthetic() {
     var token = scanString('/* 1 */ foo', includeComments: true).tokens;
     expect(token.isSynthetic, false);
-    expect(token.precedingComments.isSynthetic, false);
-    expect(token.previous.isSynthetic, true);
-    expect(token.next.isEof, true);
-    expect(token.next.isSynthetic, true);
+    expect(token.precedingComments!.isSynthetic, false);
+    expect(token.previous!.isSynthetic, true);
+    expect(token.next!.isEof, true);
+    expect(token.next!.isSynthetic, true);
   }
 
   void test_matchesAny() {
@@ -197,11 +195,11 @@
     expect(token.lexeme, 'true');
     expect(token.value(), Keyword.TRUE);
     // General tokens
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, '&');
     expect(token.value(), '&');
     // String tokens
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, '"home"');
     expect(token.value(), '"home"');
   }
diff --git a/pkg/front_end/test/tool/reload.dart b/pkg/front_end/test/tool/reload.dart
index 40a94a5..887ed3b 100644
--- a/pkg/front_end/test/tool/reload.dart
+++ b/pkg/front_end/test/tool/reload.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 /// A helper library to connect to an existing VM and trigger a hot-reload via
 /// its service protocol.
 ///
@@ -32,12 +30,12 @@
   /// An peer point used to send service protocol messages. The service
   /// protocol uses JSON rpc on top of web-sockets.
   json_rpc.Peer get rpc => _rpc ??= _createPeer();
-  json_rpc.Peer _rpc;
+  json_rpc.Peer? _rpc;
 
   /// The main isolate ID of the running VM. Needed to indicate to the VM which
   /// isolate to reload.
   FutureOr<String> get mainId async => _mainId ??= await _computeMainId();
-  String _mainId;
+  String? _mainId;
 
   RemoteVm([this.port = 8181]);
 
@@ -91,8 +89,8 @@
   Future disconnect() async {
     if (_rpc == null) return null;
     this._mainId = null;
-    if (!_rpc.isClosed) {
-      var future = _rpc.close();
+    if (!_rpc!.isClosed) {
+      var future = _rpc!.close();
       _rpc = null;
       return future;
     }
diff --git a/pkg/front_end/test/type_labeler_test.dart b/pkg/front_end/test/type_labeler_test.dart
index ec09139..af83e29 100644
--- a/pkg/front_end/test/type_labeler_test.dart
+++ b/pkg/front_end/test/type_labeler_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'package:kernel/ast.dart';
 
 import 'package:front_end/src/fasta/kernel/type_labeler.dart';
@@ -24,7 +22,7 @@
       }
     });
     expectations.forEach((Node node, String expected) {
-      Expect.stringEquals(expected, conversions[node].join());
+      Expect.stringEquals(expected, conversions[node]!.join());
     });
     int newlines = "\n".allMatches(labeler.originMessages).length;
     Expect.equals(bulletCount, newlines);
diff --git a/pkg/front_end/test/unit_test_suites.dart b/pkg/front_end/test/unit_test_suites.dart
index 4ccc389..ef12180 100644
--- a/pkg/front_end/test/unit_test_suites.dart
+++ b/pkg/front_end/test/unit_test_suites.dart
@@ -1,20 +1,660 @@
-// Copyright (c) 2021, 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.md file.
 
-// @dart = 2.9
+import 'dart:async' show Timer;
+import 'dart:convert' show jsonEncode;
+import 'dart:io' show File, Platform, exitCode;
+import 'dart:isolate' show Isolate, ReceivePort, SendPort;
 
-// This is a work-around for the automagically selecting weak/strong mode.
-// By marking this file (the entry) as non-nnbd, it becomes weak mode which
-// is required because many of the imports are not (yet) nnbd.
+import 'package:args/args.dart' show ArgParser;
+import 'package:testing/src/chain.dart' show CreateContext, Result, Step;
+import 'package:testing/src/expectation.dart' show Expectation;
+import 'package:testing/src/log.dart' show Logger;
+import 'package:testing/src/run.dart' show runMe;
+import 'package:testing/src/suite.dart' as testing show Suite;
+import 'package:testing/src/test_description.dart' show TestDescription;
 
-import 'unit_test_suites_impl.dart' as impl;
+import 'dartdoctest_suite.dart' as dartdoctest show createContext;
+import 'fasta/expression_suite.dart' as expression show createContext;
+import 'fasta/incremental_dartino_suite.dart' as incremental_dartino
+    show createContext;
+import 'fasta/messages_suite.dart' as messages show createContext;
+import 'fasta/outline_suite.dart' as outline show createContext;
+import 'fasta/strong_suite.dart' as strong show createContext;
+import 'fasta/text_serialization_suite.dart' as text_serialization
+    show createContext;
+import 'fasta/textual_outline_suite.dart' as textual_outline show createContext;
+import 'fasta/weak_suite.dart' as weak show createContext;
+import 'incremental_bulk_compiler_smoke_suite.dart' as incremental_bulk_compiler
+    show createContext;
+import 'incremental_suite.dart' as incremental show createContext;
+import 'lint_suite.dart' as lint show createContext;
+import 'parser_suite.dart' as parser show createContext;
+import 'parser_equivalence_suite.dart' as parserEquivalence show createContext;
+import 'parser_all_suite.dart' as parserAll show createContext;
+import 'spelling_test_not_src_suite.dart' as spelling_not_src
+    show createContext;
+import 'spelling_test_src_suite.dart' as spelling_src show createContext;
 
-/// Work around https://github.com/dart-lang/sdk/issues/45192.
-///
-/// TODO(paulberry): once #45192 is fixed, we can switch the `import` directive
-/// above to an `export` and remove this method, and this file will still be
-/// considered by the analysis server to be runnable.
-void main(List<String> args) {
-  impl.main(args);
+const suiteNamePrefix = "pkg/front_end/test";
+
+int getDefaultThreads() {
+  int numberOfWorkers = 1;
+  if (Platform.numberOfProcessors > 2) {
+    numberOfWorkers = Platform.numberOfProcessors - 1;
+  }
+  return numberOfWorkers;
+}
+
+class Options {
+  final String? configurationName;
+  final bool verbose;
+  final bool printFailureLog;
+  final Uri outputDirectory;
+  final String? testFilter;
+  final List<String> environmentOptions;
+  final int shardCount;
+  final int shard;
+  final bool skipTestsThatRequireGit;
+  final bool onlyTestsThatRequireGit;
+  final int numberOfWorkers;
+
+  Options(
+    this.configurationName,
+    this.verbose,
+    this.printFailureLog,
+    this.outputDirectory,
+    this.testFilter,
+    this.environmentOptions, {
+    required this.shardCount,
+    required this.shard,
+    required this.skipTestsThatRequireGit,
+    required this.onlyTestsThatRequireGit,
+    required this.numberOfWorkers,
+  });
+
+  static Options parse(List<String> args) {
+    var parser = new ArgParser()
+      ..addOption("named-configuration",
+          abbr: "n",
+          help: "configuration name to use for emitting json result files")
+      ..addOption("output-directory",
+          help: "directory to which results.json and logs.json are written")
+      ..addFlag("verbose",
+          abbr: "v", help: "print additional information", defaultsTo: false)
+      ..addFlag("print",
+          abbr: "p", help: "print failure logs", defaultsTo: false)
+      ..addMultiOption('environment',
+          abbr: 'D', help: "environment options for the test suite")
+      ..addOption("tasks",
+          abbr: "j",
+          help: "The number of parallel tasks to run.",
+          defaultsTo: "${getDefaultThreads()}")
+      ..addOption("shards", help: "Number of shards", defaultsTo: "1")
+      ..addOption("shard", help: "Which shard to run", defaultsTo: "1")
+      ..addFlag("skipTestsThatRequireGit",
+          help: "Whether to skip tests that require git to run",
+          defaultsTo: false)
+      ..addFlag("onlyTestsThatRequireGit",
+          help: "Whether to only run tests that require git",
+          defaultsTo: false);
+    var parsedOptions = parser.parse(args);
+    String outputPath = parsedOptions["output-directory"] ?? ".";
+    Uri outputDirectory = Uri.base.resolveUri(Uri.directory(outputPath));
+
+    bool verbose = parsedOptions["verbose"];
+
+    String? filter;
+    if (parsedOptions.rest.length == 1) {
+      filter = parsedOptions.rest.single;
+      if (filter.startsWith("$suiteNamePrefix/")) {
+        filter = filter.substring(suiteNamePrefix.length + 1);
+      }
+    }
+    String tasksString = parsedOptions["tasks"];
+    int? tasks = int.tryParse(tasksString);
+    if (tasks == null || tasks < 1) {
+      throw "--tasks (-j) has to be an integer >= 1";
+    }
+
+    String shardsString = parsedOptions["shards"];
+    int? shardCount = int.tryParse(shardsString);
+    if (shardCount == null || shardCount < 1) {
+      throw "--shards has to be an integer >= 1";
+    }
+    String shardString = parsedOptions["shard"];
+    int? shard = int.tryParse(shardString);
+    if (shard == null || shard < 1 || shard > shardCount) {
+      throw "--shard has to be an integer >= 1 (and <= --shards)";
+    }
+    bool skipTestsThatRequireGit = parsedOptions["skipTestsThatRequireGit"];
+    bool onlyTestsThatRequireGit = parsedOptions["onlyTestsThatRequireGit"];
+    if (skipTestsThatRequireGit && onlyTestsThatRequireGit) {
+      throw "Only one of --skipTestsThatRequireGit and "
+          "--onlyTestsThatRequireGit can be provided.";
+    }
+
+    if (verbose) {
+      print("NOTE: Created with options\n  "
+          "${parsedOptions["named-configuration"]},\n  "
+          "${verbose},\n  "
+          "${parsedOptions["print"]},\n  "
+          "${outputDirectory},\n  "
+          "${filter},\n  "
+          "${parsedOptions['environment']},\n  "
+          "shardCount: ${shardCount},\n  "
+          "shard: ${shard - 1 /* make it 0-indexed */},\n  "
+          "onlyTestsThatRequireGit: ${onlyTestsThatRequireGit},\n  "
+          "skipTestsThatRequireGit: ${skipTestsThatRequireGit},\n  "
+          "numberOfWorkers: ${tasks}");
+    }
+
+    return Options(
+      parsedOptions["named-configuration"],
+      verbose,
+      parsedOptions["print"],
+      outputDirectory,
+      filter,
+      parsedOptions['environment'],
+      shardCount: shardCount,
+      shard: shard - 1 /* make it 0-indexed */,
+      onlyTestsThatRequireGit: onlyTestsThatRequireGit,
+      skipTestsThatRequireGit: skipTestsThatRequireGit,
+      numberOfWorkers: tasks,
+    );
+  }
+}
+
+class ResultLogger implements Logger {
+  final String prefix;
+  final bool verbose;
+  final bool printFailureLog;
+  final SendPort resultsPort;
+  final SendPort logsPort;
+  final Map<String, Stopwatch> stopwatches = {};
+  final String? configurationName;
+  final Set<String> seenTests = {};
+  bool gotFrameworkError = false;
+
+  ResultLogger(this.prefix, this.resultsPort, this.logsPort, this.verbose,
+      this.printFailureLog, this.configurationName);
+
+  String getTestName(TestDescription description) {
+    return "$prefix/${description.shortName}";
+  }
+
+  @override
+  void logMessage(Object message) {}
+
+  @override
+  void logNumberedLines(String text) {}
+
+  @override
+  void logProgress(String message) {}
+
+  @override
+  void logStepComplete(int completed, int failed, int total,
+      testing.Suite suite, TestDescription description, Step step) {}
+
+  @override
+  void logStepStart(int completed, int failed, int total, testing.Suite suite,
+      TestDescription description, Step step) {}
+
+  @override
+  void logSuiteStarted(testing.Suite suite) {}
+
+  @override
+  void logSuiteComplete(testing.Suite suite) {}
+
+  void handleTestResult(
+      testing.Suite suite,
+      TestDescription testDescription,
+      Result result,
+      String fullSuiteName,
+      bool matchedExpectations,
+      Set<Expectation> expectedOutcomes) {
+    String testName = getTestName(testDescription);
+    String suiteName = "pkg";
+    String shortTestName = testName.substring(suiteName.length + 1);
+    resultsPort.send(jsonEncode({
+      "name": testName,
+      "configuration": configurationName,
+      "suite": suiteName,
+      "test_name": shortTestName,
+      "time_ms": stopwatches[testName]!.elapsedMilliseconds,
+      "expected": "Pass",
+      "result": matchedExpectations ? "Pass" : "Fail",
+      "matches": matchedExpectations,
+    }));
+    if (!matchedExpectations) {
+      StringBuffer sb = new StringBuffer();
+      if (printFailureLog) {
+        String outcome = "${result.outcome}";
+        sb.write("FAILED: $testName: $outcome");
+      }
+      sb.write(result.log);
+      if (result.error != null) {
+        sb.write("\n\n${result.error}");
+      }
+      if (result.trace != null) {
+        sb.write("\n\n${result.trace}");
+      }
+      sb.write("\n\nTo re-run this test, run:");
+      sb.write("\n\n   dart pkg/front_end/test/unit_test_suites.dart -p "
+          "$testName");
+      if (result.autoFixCommand != null) {
+        sb.write("\n\nTo automatically update the test expectations, run:");
+        sb.write("\n\n   dart pkg/front_end/test/unit_test_suites.dart -p "
+            "$testName -D${result.autoFixCommand}");
+        if (result.canBeFixWithUpdateExpectations) {
+          sb.write('\n\nTo update test expectations for all tests at once, '
+              'run:');
+          sb.write('\n\n  dart pkg/front_end/tool/update_expectations.dart');
+          sb.write('\n\nNote that this takes a long time and should only be '
+              'used when many tests need updating.\n');
+        }
+      }
+      if (result.outcome == Expectation.Pass) {
+        String expectedString =
+            expectedOutcomes.map((e) => e.toString()).join(", ");
+        sb.write("\n\nThe test passed, but wasn't expected to. "
+            "You should update the status file for this test."
+            "\nThere's a status entry looking something like"
+            "\n\n  ${testDescription.shortName}: ${expectedString}"
+            "\n\nwhich should be removed."
+            "\n\nThe status file is ${suite.statusFile}.");
+      } else if (result.autoFixCommand == null) {
+        String expectedString =
+            expectedOutcomes.map((e) => e.toString()).join(", ");
+        sb.write("\n\nThe test has outcome ${result.outcome}, "
+            "but was expected to have outcome(s) ${expectedOutcomes}. "
+            "You might have to update the status file to the new outcome"
+            "\nThere's a status entry looking something like"
+            "\n\n  ${testDescription.shortName}: ${expectedString}"
+            "\n\nwhich should be updated."
+            "\n\nThe status file is ${suite.statusFile}.");
+      }
+      String failureLog = sb.toString();
+      String outcome = "${result.outcome}";
+      logsPort.send(jsonEncode({
+        "name": testName,
+        "configuration": configurationName,
+        "result": outcome,
+        "log": failureLog,
+      }));
+      if (printFailureLog) {
+        print(failureLog);
+      }
+    }
+    if (verbose) {
+      String result = matchedExpectations ? "PASS" : "FAIL";
+      print("${testName}: ${result}");
+    }
+  }
+
+  @override
+  void logTestStart(int completed, int failed, int total, testing.Suite suite,
+      TestDescription description) {
+    String name = getTestName(description);
+    stopwatches[name] = Stopwatch()..start();
+  }
+
+  @override
+  void logTestComplete(int completed, int failed, int total,
+      testing.Suite suite, TestDescription description) {}
+
+  @override
+  void logUncaughtError(error, StackTrace stackTrace) {}
+
+  @override
+  void logExpectedResult(testing.Suite suite, TestDescription description,
+      Result result, Set<Expectation> expectedOutcomes) {
+    handleTestResult(
+        suite, description, result, prefix, true, expectedOutcomes);
+  }
+
+  @override
+  void logUnexpectedResult(testing.Suite suite, TestDescription description,
+      Result result, Set<Expectation> expectedOutcomes) {
+    // The test framework (pkg/testing) calls the logger with an unexpected
+    // results a second time to create a summary. We ignore the second call
+    // here.
+    String testName = getTestName(description);
+    if (seenTests.contains(testName)) return;
+    seenTests.add(testName);
+    handleTestResult(
+        suite, description, result, prefix, false, expectedOutcomes);
+  }
+
+  @override
+  void noticeFrameworkCatchError(error, StackTrace stackTrace) {
+    gotFrameworkError = true;
+  }
+}
+
+class Suite {
+  final CreateContext createContext;
+  final String testingRootPath;
+  final String? path;
+  final int shardCount;
+  final String prefix;
+  final bool requiresGit;
+
+  const Suite(
+    this.prefix,
+    this.createContext,
+    this.testingRootPath, {
+    required this.shardCount,
+    this.path,
+    this.requiresGit: false,
+  });
+}
+
+const List<Suite> suites = [
+  const Suite(
+    "dartdoctest",
+    dartdoctest.createContext,
+    "../testing.json",
+    shardCount: 1,
+  ),
+  const Suite(
+    "fasta/expression",
+    expression.createContext,
+    "../../testing.json",
+    shardCount: 1,
+  ),
+  const Suite(
+    "fasta/outline",
+    outline.createContext,
+    "../../testing.json",
+    shardCount: 2,
+  ),
+  const Suite(
+    "fasta/incremental_dartino",
+    incremental_dartino.createContext,
+    "../../testing.json",
+    shardCount: 1,
+  ),
+  const Suite(
+    "fasta/messages",
+    messages.createContext,
+    "../../testing.json",
+    shardCount: 1,
+    requiresGit: true,
+  ),
+  const Suite(
+    "fasta/text_serialization",
+    text_serialization.createContext,
+    "../../testing.json",
+    path: "fasta/text_serialization_suite.dart",
+    shardCount: 10,
+  ),
+  const Suite(
+    "fasta/strong",
+    strong.createContext,
+    "../../testing.json",
+    path: "fasta/strong_suite.dart",
+    shardCount: 2,
+  ),
+  const Suite(
+    "incremental_bulk_compiler_smoke",
+    incremental_bulk_compiler.createContext,
+    "../testing.json",
+    shardCount: 1,
+  ),
+  const Suite(
+    "incremental",
+    incremental.createContext,
+    "../testing.json",
+    shardCount: 2,
+  ),
+  const Suite(
+    "lint",
+    lint.createContext,
+    "../testing.json",
+    shardCount: 1,
+    requiresGit: true,
+  ),
+  const Suite(
+    "parser",
+    parser.createContext,
+    "../testing.json",
+    shardCount: 1,
+  ),
+  const Suite(
+    "parser_equivalence",
+    parserEquivalence.createContext,
+    "../testing.json",
+    shardCount: 1,
+  ),
+  const Suite(
+    "parser_all",
+    parserAll.createContext,
+    "../testing.json",
+    shardCount: 4,
+    requiresGit:
+        true /* technically not true, but tests *many* more files
+         than in test_matrix.json file set */
+    ,
+  ),
+  const Suite(
+    "spelling_test_not_src",
+    spelling_not_src.createContext,
+    "../testing.json",
+    shardCount: 1,
+    requiresGit: true,
+  ),
+  const Suite(
+    "spelling_test_src",
+    spelling_src.createContext,
+    "../testing.json",
+    shardCount: 1,
+    requiresGit: true,
+  ),
+  const Suite(
+    "fasta/weak",
+    weak.createContext,
+    "../../testing.json",
+    path: "fasta/weak_suite.dart",
+    shardCount: 10,
+  ),
+  const Suite(
+    "fasta/textual_outline",
+    textual_outline.createContext,
+    "../../testing.json",
+    shardCount: 1,
+  ),
+];
+
+const Duration timeoutDuration = Duration(minutes: 30);
+
+class SuiteConfiguration {
+  final Suite suite;
+  final SendPort resultsPort;
+  final SendPort logsPort;
+  final bool verbose;
+  final bool printFailureLog;
+  final String? configurationName;
+  final String? testFilter;
+  final List<String> environmentOptions;
+  final int shard;
+
+  const SuiteConfiguration(
+    this.suite,
+    this.resultsPort,
+    this.logsPort,
+    this.verbose,
+    this.printFailureLog,
+    this.configurationName,
+    this.testFilter,
+    this.environmentOptions,
+    this.shard,
+  );
+}
+
+Future<void> runSuite(SuiteConfiguration configuration) async {
+  Suite suite = configuration.suite;
+  String name = suite.prefix;
+  String fullSuiteName = "$suiteNamePrefix/$name";
+  Uri suiteUri = Platform.script.resolve(suite.path ?? "${name}_suite.dart");
+  if (!new File.fromUri(suiteUri).existsSync()) {
+    throw "File doesn't exist: $suiteUri";
+  }
+  ResultLogger logger = ResultLogger(
+      fullSuiteName,
+      configuration.resultsPort,
+      configuration.logsPort,
+      configuration.verbose,
+      configuration.printFailureLog,
+      configuration.configurationName);
+  await runMe(
+    <String>[
+      if (configuration.testFilter != null) configuration.testFilter!,
+      for (String option in configuration.environmentOptions) '-D${option}',
+    ],
+    suite.createContext,
+    me: suiteUri,
+    configurationPath: suite.testingRootPath,
+    logger: logger,
+    shards: suite.shardCount,
+    shard: configuration.shard,
+  );
+  if (logger.gotFrameworkError) {
+    throw "Got framework error!";
+  }
+}
+
+Future<void> writeLinesToFile(Uri uri, List<String> lines) async {
+  await File.fromUri(uri).writeAsString(lines.map((line) => "$line\n").join());
+}
+
+Future<void> main([List<String> arguments = const <String>[]]) async {
+  Stopwatch totalRuntime = new Stopwatch()..start();
+
+  List<String> results = [];
+  List<String> logs = [];
+  Options options = Options.parse(arguments);
+  ReceivePort resultsPort = new ReceivePort()
+    ..listen((resultEntry) => results.add(resultEntry));
+  ReceivePort logsPort = new ReceivePort()
+    ..listen((logEntry) => logs.add(logEntry));
+  List<Future<bool>> futures = [];
+
+  if (options.verbose) {
+    print("NOTE: Willing to run with ${options.numberOfWorkers} 'workers'");
+    print("");
+  }
+
+  int numberOfFreeWorkers = options.numberOfWorkers;
+  // Run test suites and record the results and possible failure logs.
+  int chunkNum = 0;
+  for (Suite suite in suites) {
+    if (options.onlyTestsThatRequireGit && !suite.requiresGit) continue;
+    if (options.skipTestsThatRequireGit && suite.requiresGit) continue;
+    String prefix = suite.prefix;
+    String? filter = options.testFilter;
+    if (filter != null) {
+      // Skip suites that are not hit by the test filter, is there is one.
+      if (!filter.startsWith(prefix)) {
+        continue;
+      }
+      // Remove the 'fasta/' from filters, if there, because it is not used
+      // in the name defined in testing.json.
+      if (filter.startsWith("fasta/")) {
+        filter = filter.substring("fasta/".length);
+      }
+    }
+    for (int shard = 0; shard < suite.shardCount; shard++) {
+      if (chunkNum++ % options.shardCount != options.shard) continue;
+
+      while (numberOfFreeWorkers <= 0) {
+        // This might not be great design, but it'll work fine.
+        await Future.delayed(const Duration(milliseconds: 50));
+      }
+      numberOfFreeWorkers--;
+      // Start the test suite in a new isolate.
+      ReceivePort exitPort = new ReceivePort();
+      ReceivePort errorPort = new ReceivePort();
+      SuiteConfiguration configuration = new SuiteConfiguration(
+          suite,
+          resultsPort.sendPort,
+          logsPort.sendPort,
+          options.verbose,
+          options.printFailureLog,
+          options.configurationName,
+          filter,
+          options.environmentOptions,
+          shard);
+      Future<bool> future = new Future<bool>(() async {
+        try {
+          Stopwatch stopwatch = new Stopwatch()..start();
+          String naming = "$prefix";
+          if (suite.shardCount > 1) {
+            naming += " (${shard + 1} of ${suite.shardCount})";
+          }
+          print("Running suite $naming");
+          Isolate isolate = await Isolate.spawn<SuiteConfiguration>(
+              runSuite, configuration,
+              onExit: exitPort.sendPort, onError: errorPort.sendPort);
+          bool timedOutOrCrash = false;
+          Timer timer = new Timer(timeoutDuration, () {
+            timedOutOrCrash = true;
+            print("Suite $naming timed out after "
+                "${timeoutDuration.inMilliseconds}ms");
+            isolate.kill(priority: Isolate.immediate);
+          });
+          await exitPort.first;
+          errorPort.close();
+          List<dynamic> allErrors = await errorPort.toList();
+          bool gotError = allErrors.isNotEmpty;
+          if (gotError) {
+            print("Suite $naming encountered ${allErrors.length} error(s).");
+            print("Errors:");
+            for (int i = 0; i < allErrors.length; i++) {
+              print("-----------");
+              print("Error #$i:");
+              print(allErrors[i]);
+            }
+            print("-----------");
+            timedOutOrCrash = true;
+          }
+          timer.cancel();
+          int seconds = stopwatch.elapsedMilliseconds ~/ 1000;
+          if (!timedOutOrCrash) {
+            print("Suite $naming finished (took ${seconds} seconds)");
+          } else {
+            print("Suite $naming finished badly (see above) "
+                "(took ${seconds} seconds)");
+          }
+          return timedOutOrCrash;
+        } finally {
+          numberOfFreeWorkers++;
+        }
+      });
+      futures.add(future);
+    }
+  }
+  // Wait for isolates to terminate and clean up.
+  Iterable<bool> timeoutsOrCrashes = await Future.wait(futures);
+  resultsPort.close();
+  logsPort.close();
+  // Write results.json and logs.json.
+  Uri resultJsonUri = options.outputDirectory.resolve("results.json");
+  Uri logsJsonUri = options.outputDirectory.resolve("logs.json");
+  await writeLinesToFile(resultJsonUri, results);
+  await writeLinesToFile(logsJsonUri, logs);
+  print("Log files written to ${resultJsonUri.toFilePath()} and"
+      " ${logsJsonUri.toFilePath()}");
+  print("Entire run took ${totalRuntime.elapsed}.");
+  // Return with exit code 1 if at least one suite timed out.
+  bool timedOutOrCrashed = timeoutsOrCrashes.any((timeout) => timeout);
+  if (timedOutOrCrashed) {
+    throw "Crashed or timed out. Check stdout for more details.";
+  } else {
+    // The testing framework (package:testing) sets the exitCode to `1` if any
+    // test failed, so we reset it here to indicate that the test runner was
+    // successful.
+    exitCode = 0;
+  }
 }
diff --git a/pkg/front_end/test/unit_test_suites_impl.dart b/pkg/front_end/test/unit_test_suites_impl.dart
deleted file mode 100644
index 997a51f..0000000
--- a/pkg/front_end/test/unit_test_suites_impl.dart
+++ /dev/null
@@ -1,662 +0,0 @@
-// 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.
-
-// ignore_for_file: import_of_legacy_library_into_null_safe
-
-import 'dart:async' show Timer;
-import 'dart:convert' show jsonEncode;
-import 'dart:io' show File, Platform, exitCode;
-import 'dart:isolate' show Isolate, ReceivePort, SendPort;
-
-import 'package:args/args.dart' show ArgParser;
-import 'package:testing/src/chain.dart' show CreateContext, Result, Step;
-import 'package:testing/src/expectation.dart' show Expectation;
-import 'package:testing/src/log.dart' show Logger;
-import 'package:testing/src/run.dart' show runMe;
-import 'package:testing/src/suite.dart' as testing show Suite;
-import 'package:testing/src/test_description.dart' show TestDescription;
-
-import 'dartdoctest_suite.dart' as dartdoctest show createContext;
-import 'fasta/expression_suite.dart' as expression show createContext;
-import 'fasta/incremental_dartino_suite.dart' as incremental_dartino
-    show createContext;
-import 'fasta/messages_suite.dart' as messages show createContext;
-import 'fasta/outline_suite.dart' as outline show createContext;
-import 'fasta/strong_suite.dart' as strong show createContext;
-import 'fasta/text_serialization_suite.dart' as text_serialization
-    show createContext;
-import 'fasta/textual_outline_suite.dart' as textual_outline show createContext;
-import 'fasta/weak_suite.dart' as weak show createContext;
-import 'incremental_bulk_compiler_smoke_suite.dart' as incremental_bulk_compiler
-    show createContext;
-import 'incremental_suite.dart' as incremental show createContext;
-import 'lint_suite.dart' as lint show createContext;
-import 'parser_suite.dart' as parser show createContext;
-import 'parser_equivalence_suite.dart' as parserEquivalence show createContext;
-import 'parser_all_suite.dart' as parserAll show createContext;
-import 'spelling_test_not_src_suite.dart' as spelling_not_src
-    show createContext;
-import 'spelling_test_src_suite.dart' as spelling_src show createContext;
-
-const suiteNamePrefix = "pkg/front_end/test";
-
-int getDefaultThreads() {
-  int numberOfWorkers = 1;
-  if (Platform.numberOfProcessors > 2) {
-    numberOfWorkers = Platform.numberOfProcessors - 1;
-  }
-  return numberOfWorkers;
-}
-
-class Options {
-  final String configurationName;
-  final bool verbose;
-  final bool printFailureLog;
-  final Uri outputDirectory;
-  final String? testFilter;
-  final List<String> environmentOptions;
-  final int shardCount;
-  final int shard;
-  final bool skipTestsThatRequireGit;
-  final bool onlyTestsThatRequireGit;
-  final int numberOfWorkers;
-
-  Options(
-    this.configurationName,
-    this.verbose,
-    this.printFailureLog,
-    this.outputDirectory,
-    this.testFilter,
-    this.environmentOptions, {
-    required this.shardCount,
-    required this.shard,
-    required this.skipTestsThatRequireGit,
-    required this.onlyTestsThatRequireGit,
-    required this.numberOfWorkers,
-  });
-
-  static Options parse(List<String> args) {
-    var parser = new ArgParser()
-      ..addOption("named-configuration",
-          abbr: "n",
-          help: "configuration name to use for emitting json result files")
-      ..addOption("output-directory",
-          help: "directory to which results.json and logs.json are written")
-      ..addFlag("verbose",
-          abbr: "v", help: "print additional information", defaultsTo: false)
-      ..addFlag("print",
-          abbr: "p", help: "print failure logs", defaultsTo: false)
-      ..addMultiOption('environment',
-          abbr: 'D', help: "environment options for the test suite")
-      ..addOption("tasks",
-          abbr: "j",
-          help: "The number of parallel tasks to run.",
-          defaultsTo: "${getDefaultThreads()}")
-      ..addOption("shards", help: "Number of shards", defaultsTo: "1")
-      ..addOption("shard", help: "Which shard to run", defaultsTo: "1")
-      ..addFlag("skipTestsThatRequireGit",
-          help: "Whether to skip tests that require git to run",
-          defaultsTo: false)
-      ..addFlag("onlyTestsThatRequireGit",
-          help: "Whether to only run tests that require git",
-          defaultsTo: false);
-    var parsedOptions = parser.parse(args);
-    String outputPath = parsedOptions["output-directory"] ?? ".";
-    Uri outputDirectory = Uri.base.resolveUri(Uri.directory(outputPath));
-
-    bool verbose = parsedOptions["verbose"];
-
-    String? filter;
-    if (parsedOptions.rest.length == 1) {
-      filter = parsedOptions.rest.single;
-      if (filter.startsWith("$suiteNamePrefix/")) {
-        filter = filter.substring(suiteNamePrefix.length + 1);
-      }
-    }
-    String tasksString = parsedOptions["tasks"];
-    int? tasks = int.tryParse(tasksString);
-    if (tasks == null || tasks < 1) {
-      throw "--tasks (-j) has to be an integer >= 1";
-    }
-
-    String shardsString = parsedOptions["shards"];
-    int? shardCount = int.tryParse(shardsString);
-    if (shardCount == null || shardCount < 1) {
-      throw "--shards has to be an integer >= 1";
-    }
-    String shardString = parsedOptions["shard"];
-    int? shard = int.tryParse(shardString);
-    if (shard == null || shard < 1 || shard > shardCount) {
-      throw "--shard has to be an integer >= 1 (and <= --shards)";
-    }
-    bool skipTestsThatRequireGit = parsedOptions["skipTestsThatRequireGit"];
-    bool onlyTestsThatRequireGit = parsedOptions["onlyTestsThatRequireGit"];
-    if (skipTestsThatRequireGit && onlyTestsThatRequireGit) {
-      throw "Only one of --skipTestsThatRequireGit and "
-          "--onlyTestsThatRequireGit can be provided.";
-    }
-
-    if (verbose) {
-      print("NOTE: Created with options\n  "
-          "${parsedOptions["named-configuration"]},\n  "
-          "${verbose},\n  "
-          "${parsedOptions["print"]},\n  "
-          "${outputDirectory},\n  "
-          "${filter},\n  "
-          "${parsedOptions['environment']},\n  "
-          "shardCount: ${shardCount},\n  "
-          "shard: ${shard - 1 /* make it 0-indexed */},\n  "
-          "onlyTestsThatRequireGit: ${onlyTestsThatRequireGit},\n  "
-          "skipTestsThatRequireGit: ${skipTestsThatRequireGit},\n  "
-          "numberOfWorkers: ${tasks}");
-    }
-
-    return Options(
-      parsedOptions["named-configuration"],
-      verbose,
-      parsedOptions["print"],
-      outputDirectory,
-      filter,
-      parsedOptions['environment'],
-      shardCount: shardCount,
-      shard: shard - 1 /* make it 0-indexed */,
-      onlyTestsThatRequireGit: onlyTestsThatRequireGit,
-      skipTestsThatRequireGit: skipTestsThatRequireGit,
-      numberOfWorkers: tasks,
-    );
-  }
-}
-
-class ResultLogger implements Logger {
-  final String prefix;
-  final bool verbose;
-  final bool printFailureLog;
-  final SendPort resultsPort;
-  final SendPort logsPort;
-  final Map<String, Stopwatch> stopwatches = {};
-  final String configurationName;
-  final Set<String> seenTests = {};
-  bool gotFrameworkError = false;
-
-  ResultLogger(this.prefix, this.resultsPort, this.logsPort, this.verbose,
-      this.printFailureLog, this.configurationName);
-
-  String getTestName(TestDescription description) {
-    return "$prefix/${description.shortName}";
-  }
-
-  @override
-  void logMessage(Object message) {}
-
-  @override
-  void logNumberedLines(String text) {}
-
-  @override
-  void logProgress(String message) {}
-
-  @override
-  void logStepComplete(int completed, int failed, int total,
-      testing.Suite suite, TestDescription description, Step step) {}
-
-  @override
-  void logStepStart(int completed, int failed, int total, testing.Suite suite,
-      TestDescription description, Step step) {}
-
-  @override
-  void logSuiteStarted(testing.Suite suite) {}
-
-  @override
-  void logSuiteComplete(testing.Suite suite) {}
-
-  void handleTestResult(
-      testing.Suite suite,
-      TestDescription testDescription,
-      Result result,
-      String fullSuiteName,
-      bool matchedExpectations,
-      Set<Expectation> expectedOutcomes) {
-    String testName = getTestName(testDescription);
-    String suiteName = "pkg";
-    String shortTestName = testName.substring(suiteName.length + 1);
-    resultsPort.send(jsonEncode({
-      "name": testName,
-      "configuration": configurationName,
-      "suite": suiteName,
-      "test_name": shortTestName,
-      "time_ms": stopwatches[testName]!.elapsedMilliseconds,
-      "expected": "Pass",
-      "result": matchedExpectations ? "Pass" : "Fail",
-      "matches": matchedExpectations,
-    }));
-    if (!matchedExpectations) {
-      StringBuffer sb = new StringBuffer();
-      if (printFailureLog) {
-        String outcome = "${result.outcome}";
-        sb.write("FAILED: $testName: $outcome");
-      }
-      sb.write(result.log);
-      if (result.error != null) {
-        sb.write("\n\n${result.error}");
-      }
-      if (result.trace != null) {
-        sb.write("\n\n${result.trace}");
-      }
-      sb.write("\n\nTo re-run this test, run:");
-      sb.write("\n\n   dart pkg/front_end/test/unit_test_suites.dart -p "
-          "$testName");
-      if (result.autoFixCommand != null) {
-        sb.write("\n\nTo automatically update the test expectations, run:");
-        sb.write("\n\n   dart pkg/front_end/test/unit_test_suites.dart -p "
-            "$testName -D${result.autoFixCommand}");
-        if (result.canBeFixWithUpdateExpectations) {
-          sb.write('\n\nTo update test expectations for all tests at once, '
-              'run:');
-          sb.write('\n\n  dart pkg/front_end/tool/update_expectations.dart');
-          sb.write('\n\nNote that this takes a long time and should only be '
-              'used when many tests need updating.\n');
-        }
-      }
-      if (result.outcome == Expectation.Pass) {
-        String expectedString =
-            expectedOutcomes.map((e) => e.toString()).join(", ");
-        sb.write("\n\nThe test passed, but wasn't expected to. "
-            "You should update the status file for this test."
-            "\nThere's a status entry looking something like"
-            "\n\n  ${testDescription.shortName}: ${expectedString}"
-            "\n\nwhich should be removed."
-            "\n\nThe status file is ${suite.statusFile}.");
-      } else if (result.autoFixCommand == null) {
-        String expectedString =
-            expectedOutcomes.map((e) => e.toString()).join(", ");
-        sb.write("\n\nThe test has outcome ${result.outcome}, "
-            "but was expected to have outcome(s) ${expectedOutcomes}. "
-            "You might have to update the status file to the new outcome"
-            "\nThere's a status entry looking something like"
-            "\n\n  ${testDescription.shortName}: ${expectedString}"
-            "\n\nwhich should be updated."
-            "\n\nThe status file is ${suite.statusFile}.");
-      }
-      String failureLog = sb.toString();
-      String outcome = "${result.outcome}";
-      logsPort.send(jsonEncode({
-        "name": testName,
-        "configuration": configurationName,
-        "result": outcome,
-        "log": failureLog,
-      }));
-      if (printFailureLog) {
-        print(failureLog);
-      }
-    }
-    if (verbose) {
-      String result = matchedExpectations ? "PASS" : "FAIL";
-      print("${testName}: ${result}");
-    }
-  }
-
-  @override
-  void logTestStart(int completed, int failed, int total, testing.Suite suite,
-      TestDescription description) {
-    String name = getTestName(description);
-    stopwatches[name] = Stopwatch()..start();
-  }
-
-  @override
-  void logTestComplete(int completed, int failed, int total,
-      testing.Suite suite, TestDescription description) {}
-
-  @override
-  void logUncaughtError(error, StackTrace stackTrace) {}
-
-  @override
-  void logExpectedResult(testing.Suite suite, TestDescription description,
-      Result result, Set<Expectation> expectedOutcomes) {
-    handleTestResult(
-        suite, description, result, prefix, true, expectedOutcomes);
-  }
-
-  @override
-  void logUnexpectedResult(testing.Suite suite, TestDescription description,
-      Result result, Set<Expectation> expectedOutcomes) {
-    // The test framework (pkg/testing) calls the logger with an unexpected
-    // results a second time to create a summary. We ignore the second call
-    // here.
-    String testName = getTestName(description);
-    if (seenTests.contains(testName)) return;
-    seenTests.add(testName);
-    handleTestResult(
-        suite, description, result, prefix, false, expectedOutcomes);
-  }
-
-  @override
-  void noticeFrameworkCatchError(error, StackTrace stackTrace) {
-    gotFrameworkError = true;
-  }
-}
-
-class Suite {
-  final CreateContext createContext;
-  final String testingRootPath;
-  final String? path;
-  final int shardCount;
-  final String prefix;
-  final bool requiresGit;
-
-  const Suite(
-    this.prefix,
-    this.createContext,
-    this.testingRootPath, {
-    required this.shardCount,
-    this.path,
-    this.requiresGit: false,
-  });
-}
-
-const List<Suite> suites = [
-  const Suite(
-    "dartdoctest",
-    dartdoctest.createContext,
-    "../testing.json",
-    shardCount: 1,
-  ),
-  const Suite(
-    "fasta/expression",
-    expression.createContext,
-    "../../testing.json",
-    shardCount: 1,
-  ),
-  const Suite(
-    "fasta/outline",
-    outline.createContext,
-    "../../testing.json",
-    shardCount: 2,
-  ),
-  const Suite(
-    "fasta/incremental_dartino",
-    incremental_dartino.createContext,
-    "../../testing.json",
-    shardCount: 1,
-  ),
-  const Suite(
-    "fasta/messages",
-    messages.createContext,
-    "../../testing.json",
-    shardCount: 1,
-    requiresGit: true,
-  ),
-  const Suite(
-    "fasta/text_serialization",
-    text_serialization.createContext,
-    "../../testing.json",
-    path: "fasta/text_serialization_suite.dart",
-    shardCount: 10,
-  ),
-  const Suite(
-    "fasta/strong",
-    strong.createContext,
-    "../../testing.json",
-    path: "fasta/strong_suite.dart",
-    shardCount: 2,
-  ),
-  const Suite(
-    "incremental_bulk_compiler_smoke",
-    incremental_bulk_compiler.createContext,
-    "../testing.json",
-    shardCount: 1,
-  ),
-  const Suite(
-    "incremental",
-    incremental.createContext,
-    "../testing.json",
-    shardCount: 2,
-  ),
-  const Suite(
-    "lint",
-    lint.createContext,
-    "../testing.json",
-    shardCount: 1,
-    requiresGit: true,
-  ),
-  const Suite(
-    "parser",
-    parser.createContext,
-    "../testing.json",
-    shardCount: 1,
-  ),
-  const Suite(
-    "parser_equivalence",
-    parserEquivalence.createContext,
-    "../testing.json",
-    shardCount: 1,
-  ),
-  const Suite(
-    "parser_all",
-    parserAll.createContext,
-    "../testing.json",
-    shardCount: 4,
-    requiresGit:
-        true /* technically not true, but tests *many* more files
-         than in test_matrix.json file set */
-    ,
-  ),
-  const Suite(
-    "spelling_test_not_src",
-    spelling_not_src.createContext,
-    "../testing.json",
-    shardCount: 1,
-    requiresGit: true,
-  ),
-  const Suite(
-    "spelling_test_src",
-    spelling_src.createContext,
-    "../testing.json",
-    shardCount: 1,
-    requiresGit: true,
-  ),
-  const Suite(
-    "fasta/weak",
-    weak.createContext,
-    "../../testing.json",
-    path: "fasta/weak_suite.dart",
-    shardCount: 10,
-  ),
-  const Suite(
-    "fasta/textual_outline",
-    textual_outline.createContext,
-    "../../testing.json",
-    shardCount: 1,
-  ),
-];
-
-const Duration timeoutDuration = Duration(minutes: 30);
-
-class SuiteConfiguration {
-  final Suite suite;
-  final SendPort resultsPort;
-  final SendPort logsPort;
-  final bool verbose;
-  final bool printFailureLog;
-  final String configurationName;
-  final String? testFilter;
-  final List<String> environmentOptions;
-  final int shard;
-
-  const SuiteConfiguration(
-    this.suite,
-    this.resultsPort,
-    this.logsPort,
-    this.verbose,
-    this.printFailureLog,
-    this.configurationName,
-    this.testFilter,
-    this.environmentOptions,
-    this.shard,
-  );
-}
-
-Future<void> runSuite(SuiteConfiguration configuration) async {
-  Suite suite = configuration.suite;
-  String name = suite.prefix;
-  String fullSuiteName = "$suiteNamePrefix/$name";
-  Uri suiteUri = Platform.script.resolve(suite.path ?? "${name}_suite.dart");
-  if (!new File.fromUri(suiteUri).existsSync()) {
-    throw "File doesn't exist: $suiteUri";
-  }
-  ResultLogger logger = ResultLogger(
-      fullSuiteName,
-      configuration.resultsPort,
-      configuration.logsPort,
-      configuration.verbose,
-      configuration.printFailureLog,
-      configuration.configurationName);
-  await runMe(
-    <String>[
-      if (configuration.testFilter != null) configuration.testFilter!,
-      for (String option in configuration.environmentOptions) '-D${option}',
-    ],
-    suite.createContext,
-    me: suiteUri,
-    configurationPath: suite.testingRootPath,
-    logger: logger,
-    shards: suite.shardCount,
-    shard: configuration.shard,
-  );
-  if (logger.gotFrameworkError) {
-    throw "Got framework error!";
-  }
-}
-
-Future<void> writeLinesToFile(Uri uri, List<String> lines) async {
-  await File.fromUri(uri).writeAsString(lines.map((line) => "$line\n").join());
-}
-
-Future<void> main([List<String> arguments = const <String>[]]) async {
-  Stopwatch totalRuntime = new Stopwatch()..start();
-
-  List<String> results = [];
-  List<String> logs = [];
-  Options options = Options.parse(arguments);
-  ReceivePort resultsPort = new ReceivePort()
-    ..listen((resultEntry) => results.add(resultEntry));
-  ReceivePort logsPort = new ReceivePort()
-    ..listen((logEntry) => logs.add(logEntry));
-  List<Future<bool>> futures = [];
-
-  if (options.verbose) {
-    print("NOTE: Willing to run with ${options.numberOfWorkers} 'workers'");
-    print("");
-  }
-
-  int numberOfFreeWorkers = options.numberOfWorkers;
-  // Run test suites and record the results and possible failure logs.
-  int chunkNum = 0;
-  for (Suite suite in suites) {
-    if (options.onlyTestsThatRequireGit && !suite.requiresGit) continue;
-    if (options.skipTestsThatRequireGit && suite.requiresGit) continue;
-    String prefix = suite.prefix;
-    String? filter = options.testFilter;
-    if (filter != null) {
-      // Skip suites that are not hit by the test filter, is there is one.
-      if (!filter.startsWith(prefix)) {
-        continue;
-      }
-      // Remove the 'fasta/' from filters, if there, because it is not used
-      // in the name defined in testing.json.
-      if (filter.startsWith("fasta/")) {
-        filter = filter.substring("fasta/".length);
-      }
-    }
-    for (int shard = 0; shard < suite.shardCount; shard++) {
-      if (chunkNum++ % options.shardCount != options.shard) continue;
-
-      while (numberOfFreeWorkers <= 0) {
-        // This might not be great design, but it'll work fine.
-        await Future.delayed(const Duration(milliseconds: 50));
-      }
-      numberOfFreeWorkers--;
-      // Start the test suite in a new isolate.
-      ReceivePort exitPort = new ReceivePort();
-      ReceivePort errorPort = new ReceivePort();
-      SuiteConfiguration configuration = new SuiteConfiguration(
-          suite,
-          resultsPort.sendPort,
-          logsPort.sendPort,
-          options.verbose,
-          options.printFailureLog,
-          options.configurationName,
-          filter,
-          options.environmentOptions,
-          shard);
-      Future<bool> future = new Future<bool>(() async {
-        try {
-          Stopwatch stopwatch = new Stopwatch()..start();
-          String naming = "$prefix";
-          if (suite.shardCount > 1) {
-            naming += " (${shard + 1} of ${suite.shardCount})";
-          }
-          print("Running suite $naming");
-          Isolate isolate = await Isolate.spawn<SuiteConfiguration>(
-              runSuite, configuration,
-              onExit: exitPort.sendPort, onError: errorPort.sendPort);
-          bool timedOutOrCrash = false;
-          Timer timer = new Timer(timeoutDuration, () {
-            timedOutOrCrash = true;
-            print("Suite $naming timed out after "
-                "${timeoutDuration.inMilliseconds}ms");
-            isolate.kill(priority: Isolate.immediate);
-          });
-          await exitPort.first;
-          errorPort.close();
-          List<dynamic> allErrors = await errorPort.toList();
-          bool gotError = allErrors.isNotEmpty;
-          if (gotError) {
-            print("Suite $naming encountered ${allErrors.length} error(s).");
-            print("Errors:");
-            for (int i = 0; i < allErrors.length; i++) {
-              print("-----------");
-              print("Error #$i:");
-              print(allErrors[i]);
-            }
-            print("-----------");
-            timedOutOrCrash = true;
-          }
-          timer.cancel();
-          int seconds = stopwatch.elapsedMilliseconds ~/ 1000;
-          if (!timedOutOrCrash) {
-            print("Suite $naming finished (took ${seconds} seconds)");
-          } else {
-            print("Suite $naming finished badly (see above) "
-                "(took ${seconds} seconds)");
-          }
-          return timedOutOrCrash;
-        } finally {
-          numberOfFreeWorkers++;
-        }
-      });
-      futures.add(future);
-    }
-  }
-  // Wait for isolates to terminate and clean up.
-  Iterable<bool> timeoutsOrCrashes = await Future.wait(futures);
-  resultsPort.close();
-  logsPort.close();
-  // Write results.json and logs.json.
-  Uri resultJsonUri = options.outputDirectory.resolve("results.json");
-  Uri logsJsonUri = options.outputDirectory.resolve("logs.json");
-  await writeLinesToFile(resultJsonUri, results);
-  await writeLinesToFile(logsJsonUri, logs);
-  print("Log files written to ${resultJsonUri.toFilePath()} and"
-      " ${logsJsonUri.toFilePath()}");
-  print("Entire run took ${totalRuntime.elapsed}.");
-  // Return with exit code 1 if at least one suite timed out.
-  bool timedOutOrCrashed = timeoutsOrCrashes.any((timeout) => timeout);
-  if (timedOutOrCrashed) {
-    throw "Crashed or timed out. Check stdout for more details.";
-  } else {
-    // The testing framework (package:testing) sets the exitCode to `1` if any
-    // test failed, so we reset it here to indicate that the test runner was
-    // successful.
-    exitCode = 0;
-  }
-}
diff --git a/pkg/front_end/test/utils/kernel_chain.dart b/pkg/front_end/test/utils/kernel_chain.dart
index a8412e8..2c96443 100644
--- a/pkg/front_end/test/utils/kernel_chain.dart
+++ b/pkg/front_end/test/utils/kernel_chain.dart
@@ -30,7 +30,7 @@
 import 'package:front_end/src/fasta/kernel/utils.dart' show ByteSink;
 
 import 'package:front_end/src/fasta/messages.dart'
-    show DiagnosticMessageFromJson, LocatedMessage;
+    show DiagnosticMessageFromJson, LocatedMessage, Message;
 
 import 'package:kernel/ast.dart' show Component, Library, Reference, Source;
 
@@ -392,10 +392,11 @@
 
       List<RoundTripStatus> failures = verifier.failures;
       for (RoundTripStatus failure in failures) {
-        LocatedMessage message = templateUnspecified
-            .withArguments("\n${failure}")
-            .withLocation(failure.uri!, failure.offset, 1);
-        options.report(message, message.code.severity);
+        Message message = templateUnspecified.withArguments("\n${failure}");
+        LocatedMessage locatedMessage = failure.uri != null
+            ? message.withLocation(failure.uri!, failure.offset, 1)
+            : message.withoutLocation();
+        options.report(locatedMessage, locatedMessage.code.severity);
       }
 
       if (writeRoundTripStatus) {
diff --git a/pkg/front_end/test/vm_service_coverage.dart b/pkg/front_end/test/vm_service_coverage.dart
index 0d4768a..2112bd0 100644
--- a/pkg/front_end/test/vm_service_coverage.dart
+++ b/pkg/front_end/test/vm_service_coverage.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 import 'dart:async';
 
 import 'vm_service_helper.dart' as vmService;
@@ -31,12 +29,12 @@
   @override
   Future<void> run() async {
     vmService.VM vm = await serviceClient.getVM();
-    if (vm.isolates.length != 1) {
-      throw "Expected 1 isolate, got ${vm.isolates.length}";
+    if (vm.isolates!.length != 1) {
+      throw "Expected 1 isolate, got ${vm.isolates!.length}";
     }
-    vmService.IsolateRef isolateRef = vm.isolates.single;
-    await waitUntilIsolateIsRunnable(isolateRef.id);
-    await serviceClient.resume(isolateRef.id);
+    vmService.IsolateRef isolateRef = vm.isolates!.single;
+    await waitUntilIsolateIsRunnable(isolateRef.id!);
+    await serviceClient.resume(isolateRef.id!);
     Completer<String> cTimeout = new Completer();
     Timer timer = new Timer(new Duration(minutes: 20), () {
       cTimeout.complete("Timeout");
@@ -45,13 +43,13 @@
 
     Completer<String> cRunDone = new Completer();
     // ignore: unawaited_futures
-    waitUntilPaused(isolateRef.id).then((value) => cRunDone.complete("Done"));
+    waitUntilPaused(isolateRef.id!).then((value) => cRunDone.complete("Done"));
 
     await Future.any([cRunDone.future, cTimeout.future, cProcessExited.future]);
 
     timer.cancel();
 
-    if (!await isPausedAtExit(isolateRef.id)) {
+    if (!await isPausedAtExit(isolateRef.id!)) {
       killProcess();
       throw "Expected to be paused at exit, but is just paused!";
     }
@@ -59,36 +57,36 @@
     // Get and process coverage information.
     Stopwatch stopwatch = new Stopwatch()..start();
     vmService.SourceReport sourceReport = await serviceClient.getSourceReport(
-        isolateRef.id, [vmService.SourceReportKind.kCoverage],
+        isolateRef.id!, [vmService.SourceReportKind.kCoverage],
         forceCompile: forceCompilation);
     print("Got source report from VM in ${stopwatch.elapsedMilliseconds} ms");
     stopwatch.reset();
     Map<Uri, Coverage> coverages = {};
-    for (vmService.SourceReportRange range in sourceReport.ranges) {
-      vmService.ScriptRef script = sourceReport.scripts[range.scriptIndex];
-      Uri scriptUri = Uri.parse(script.uri);
+    for (vmService.SourceReportRange range in sourceReport.ranges!) {
+      vmService.ScriptRef script = sourceReport.scripts![range.scriptIndex!];
+      Uri scriptUri = Uri.parse(script.uri!);
       if (!includeCoverageFor(scriptUri)) continue;
       Coverage coverage = coverages[scriptUri] ??= new Coverage();
 
-      vmService.SourceReportCoverage sourceReportCoverage = range.coverage;
+      vmService.SourceReportCoverage? sourceReportCoverage = range.coverage;
       if (sourceReportCoverage == null) {
         // Range not compiled. Record the range if provided.
-        assert(!range.compiled);
-        if (range.startPos >= 0 || range.endPos >= 0) {
+        assert(!range.compiled!);
+        if (range.startPos! >= 0 || range.endPos! >= 0) {
           coverage.notCompiled
-              .add(new StartEndPair(range.startPos, range.endPos));
+              .add(new StartEndPair(range.startPos!, range.endPos!));
         }
         continue;
       }
-      coverage.hits.addAll(sourceReportCoverage.hits);
-      coverage.misses.addAll(sourceReportCoverage.misses);
+      coverage.hits.addAll(sourceReportCoverage.hits!);
+      coverage.misses.addAll(sourceReportCoverage.misses!);
     }
     print("Processed source report from VM in "
         "${stopwatch.elapsedMilliseconds} ms");
     stopwatch.reset();
 
     // It's paused at exit, so resuming should allow us to exit.
-    await serviceClient.resume(isolateRef.id);
+    await serviceClient.resume(isolateRef.id!);
 
     for (MapEntry<Uri, Coverage> entry in coverages.entries) {
       assert(entry.value.hits.intersection(entry.value.misses).isEmpty);
@@ -142,7 +140,7 @@
   String toString() => "[$startPos - $endPos]";
 
   @override
-  int compareTo(Object other) {
+  int compareTo(dynamic other) {
     if (other is! StartEndPair) return -1;
     StartEndPair o = other;
     return startPos - o.startPos;
diff --git a/pkg/front_end/test/vm_service_coverage_constant_evaluator.dart b/pkg/front_end/test/vm_service_coverage_constant_evaluator.dart
index 56b167b..3128758 100644
--- a/pkg/front_end/test/vm_service_coverage_constant_evaluator.dart
+++ b/pkg/front_end/test/vm_service_coverage_constant_evaluator.dart
@@ -2,8 +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.md file.
 
-// @dart = 2.9
-
 import 'vm_service_coverage.dart' as helper;
 
 Future<void> main(List<String> args) async {
diff --git a/pkg/front_end/test/vm_service_for_leak_detection.dart b/pkg/front_end/test/vm_service_for_leak_detection.dart
index e5782a8..44b38c4 100644
--- a/pkg/front_end/test/vm_service_for_leak_detection.dart
+++ b/pkg/front_end/test/vm_service_for_leak_detection.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io';
 
 import "vm_service_heap_helper.dart" as helper;
diff --git a/pkg/front_end/test/vm_service_heap_finder.dart b/pkg/front_end/test/vm_service_heap_finder.dart
index a098317..a5aa11f 100644
--- a/pkg/front_end/test/vm_service_heap_finder.dart
+++ b/pkg/front_end/test/vm_service_heap_finder.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import "dart:io";
 
 import "vm_service_helper.dart" as vmService;
@@ -16,9 +14,9 @@
 }
 
 Future<void> main(List<String> args) async {
-  String connectTo;
-  String classToFind;
-  String whatToDo;
+  String? connectTo;
+  String? classToFind;
+  String? whatToDo;
   for (String arg in args) {
     if (arg.startsWith("--url=")) {
       connectTo = arg.substring("--url=".length);
@@ -62,25 +60,26 @@
 
 String ask(String question) {
   stdout.write("$question: ");
-  return stdin.readLineSync();
+  return stdin.readLineSync()!;
 }
 
 class VMServiceHeapHelperPrinter extends vmService.VMServiceHelper {
-  Future<void> printAllocationProfile(String isolateId, {String filter}) async {
+  Future<void> printAllocationProfile(String isolateId,
+      {String? filter}) async {
     await waitUntilIsolateIsRunnable(isolateId);
     vmService.AllocationProfile allocationProfile =
         await serviceClient.getAllocationProfile(isolateId);
-    for (vmService.ClassHeapStats member in allocationProfile.members) {
+    for (vmService.ClassHeapStats member in allocationProfile.members!) {
       if (filter != null) {
-        if (member.classRef.name != filter) continue;
+        if (member.classRef!.name != filter) continue;
       } else {
-        if (member.classRef.name == "") continue;
+        if (member.classRef!.name == "") continue;
         if (member.instancesCurrent == 0) continue;
       }
-      vmService.Class c =
-          await serviceClient.getObject(isolateId, member.classRef.id);
+      vmService.Class c = await serviceClient.getObject(
+          isolateId, member.classRef!.id!) as vmService.Class;
       if (c.location?.script?.uri == null) continue;
-      print("${member.classRef.name}: ${member.instancesCurrent}");
+      print("${member.classRef!.name}: ${member.instancesCurrent}");
     }
   }
 
@@ -89,32 +88,32 @@
     await waitUntilIsolateIsRunnable(isolateId);
     vmService.AllocationProfile allocationProfile =
         await serviceClient.getAllocationProfile(isolateId);
-    for (vmService.ClassHeapStats member in allocationProfile.members) {
-      if (member.classRef.name != filter) continue;
-      vmService.Class c =
-          await serviceClient.getObject(isolateId, member.classRef.id);
+    for (vmService.ClassHeapStats member in allocationProfile.members!) {
+      if (member.classRef!.name != filter) continue;
+      vmService.Class c = await serviceClient.getObject(
+          isolateId, member.classRef!.id!) as vmService.Class;
       if (c.location?.script?.uri == null) continue;
-      print("${member.classRef.name}: ${member.instancesCurrent}");
-      print(c.location.script.uri);
+      print("${member.classRef!.name}: ${member.instancesCurrent}");
+      print(c.location!.script!.uri);
 
       vmService.InstanceSet instances = await serviceClient.getInstances(
-          isolateId, member.classRef.id, 10000);
+          isolateId, member.classRef!.id!, 10000);
       int instanceNum = 0;
-      for (vmService.ObjRef instance in instances.instances) {
+      for (vmService.ObjRef instance in instances.instances!) {
         instanceNum++;
         vmService.Obj receivedObject =
-            await serviceClient.getObject(isolateId, instance.id);
+            await serviceClient.getObject(isolateId, instance.id!);
         if (receivedObject is! vmService.Instance) continue;
         vmService.Instance object = receivedObject;
-        for (vmService.BoundField field in object.fields) {
-          if (field.decl.name == fieldName) {
+        for (vmService.BoundField field in object.fields!) {
+          if (field.decl!.name == fieldName) {
             if (field.value is vmService.Sentinel) continue;
             vmService.Obj receivedValue =
                 await serviceClient.getObject(isolateId, field.value.id);
             if (receivedValue is! vmService.Instance) continue;
-            String value = (receivedValue as vmService.Instance).valueAsString;
+            String value = receivedValue.valueAsString!;
             if (!fieldValues.contains(value)) continue;
-            print("${instanceNum}: ${field.decl.name}: "
+            print("${instanceNum}: ${field.decl!.name}: "
                 "${value} --- ${instance.id}");
           }
         }
@@ -127,29 +126,29 @@
     await waitUntilIsolateIsRunnable(isolateId);
     vmService.AllocationProfile allocationProfile =
         await serviceClient.getAllocationProfile(isolateId);
-    for (vmService.ClassHeapStats member in allocationProfile.members) {
-      if (member.classRef.name != filter) continue;
-      vmService.Class c =
-          await serviceClient.getObject(isolateId, member.classRef.id);
+    for (vmService.ClassHeapStats member in allocationProfile.members!) {
+      if (member.classRef!.name != filter) continue;
+      vmService.Class c = await serviceClient.getObject(
+          isolateId, member.classRef!.id!) as vmService.Class;
       print("Found ${c.name} (location: ${c.location})");
-      print("${member.classRef.name}: "
+      print("${member.classRef!.name}: "
           "(instancesCurrent: ${member.instancesCurrent})");
       print("");
 
       vmService.InstanceSet instances = await serviceClient.getInstances(
-          isolateId, member.classRef.id, 10000);
-      print(" => Got ${instances.instances.length} instances");
+          isolateId, member.classRef!.id!, 10000);
+      print(" => Got ${instances.instances!.length} instances");
       print("");
 
-      for (vmService.ObjRef instance in instances.instances) {
+      for (vmService.ObjRef instance in instances.instances!) {
         vmService.Obj receivedObject =
-            await serviceClient.getObject(isolateId, instance.id);
+            await serviceClient.getObject(isolateId, instance.id!);
         print("Instance: $receivedObject");
         vmService.RetainingPath retainingPath =
-            await serviceClient.getRetainingPath(isolateId, instance.id, 1000);
+            await serviceClient.getRetainingPath(isolateId, instance.id!, 1000);
         print("Retaining path: (length ${retainingPath.length}");
-        for (int i = 0; i < retainingPath.elements.length; i++) {
-          print("  [$i] = ${retainingPath.elements[i]}");
+        for (int i = 0; i < retainingPath.elements!.length; i++) {
+          print("  [$i] = ${retainingPath.elements![i]}");
         }
 
         print("");
diff --git a/pkg/front_end/test/vm_service_heap_helper.dart b/pkg/front_end/test/vm_service_heap_helper.dart
index ac5e8d9..1511a51 100644
--- a/pkg/front_end/test/vm_service_heap_helper.dart
+++ b/pkg/front_end/test/vm_service_heap_helper.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import "vm_service_helper.dart" as vmService;
 
 class VMServiceHeapHelperSpecificExactLeakFinder
@@ -22,13 +20,13 @@
   }) {
     if (interests.isEmpty) throw "Empty list of interests given";
     for (Interest interest in interests) {
-      Map<String, List<String>> classToFields = _interests[interest.uri];
+      Map<String, List<String>>? classToFields = _interests[interest.uri];
       if (classToFields == null) {
         classToFields = Map<String, List<String>>();
         _interests[interest.uri] = classToFields;
       }
       _interestsClassNames.add(interest.className);
-      List<String> fields = classToFields[interest.className];
+      List<String>? fields = classToFields[interest.className];
       if (fields == null) {
         fields = <String>[];
         classToFields[interest.className] = fields;
@@ -36,12 +34,12 @@
       fields.addAll(interest.fieldNames);
     }
     for (Interest interest in prettyPrints) {
-      Map<String, List<String>> classToFields = _prettyPrints[interest.uri];
+      Map<String, List<String>>? classToFields = _prettyPrints[interest.uri];
       if (classToFields == null) {
         classToFields = Map<String, List<String>>();
         _prettyPrints[interest.uri] = classToFields;
       }
-      List<String> fields = classToFields[interest.className];
+      List<String>? fields = classToFields[interest.className];
       if (fields == null) {
         fields = <String>[];
         classToFields[interest.className] = fields;
@@ -51,20 +49,20 @@
   }
 
   Future<void> pause() async {
-    await serviceClient.pause(_isolateRef.id);
+    await serviceClient.pause(_isolateRef.id!);
   }
 
-  vmService.VM _vm;
-  vmService.IsolateRef _isolateRef;
-  int _iterationNumber;
+  late vmService.VM _vm;
+  late vmService.IsolateRef _isolateRef;
+  late int _iterationNumber;
   int get iterationNumber => _iterationNumber;
 
   /// Best effort check if the isolate is idle.
   Future<bool> isIdle() async {
-    dynamic tmp = await serviceClient.getIsolate(_isolateRef.id);
+    dynamic tmp = await serviceClient.getIsolate(_isolateRef.id!);
     if (tmp is vmService.Isolate) {
       vmService.Isolate isolate = tmp;
-      return isolate.pauseEvent.topFrame == null;
+      return isolate.pauseEvent!.topFrame == null;
     }
     return false;
   }
@@ -72,44 +70,44 @@
   @override
   Future<void> run() async {
     _vm = await serviceClient.getVM();
-    if (_vm.isolates.length == 0) {
+    if (_vm.isolates!.length == 0) {
       print("Didn't get any isolates. Will wait 1 second and retry.");
       await Future.delayed(new Duration(seconds: 1));
       _vm = await serviceClient.getVM();
     }
-    if (_vm.isolates.length != 1) {
-      throw "Expected 1 isolate, got ${_vm.isolates.length}";
+    if (_vm.isolates!.length != 1) {
+      throw "Expected 1 isolate, got ${_vm.isolates!.length}";
     }
-    _isolateRef = _vm.isolates.single;
-    await forceGC(_isolateRef.id);
+    _isolateRef = _vm.isolates!.single;
+    await forceGC(_isolateRef.id!);
 
-    assert(await isPausedAtStart(_isolateRef.id));
-    await serviceClient.resume(_isolateRef.id);
+    assert(await isPausedAtStart(_isolateRef.id!));
+    await serviceClient.resume(_isolateRef.id!);
 
     _iterationNumber = 1;
     while (true) {
       if (!shouldDoAnotherIteration(_iterationNumber)) break;
-      await waitUntilPaused(_isolateRef.id);
+      await waitUntilPaused(_isolateRef.id!);
       print("Iteration: #$_iterationNumber");
 
       Stopwatch stopwatch = new Stopwatch()..start();
 
       vmService.AllocationProfile allocationProfile =
-          await forceGC(_isolateRef.id);
+          await forceGC(_isolateRef.id!);
       print("Forced GC in ${stopwatch.elapsedMilliseconds} ms");
 
       stopwatch.reset();
       List<Leak> leaks = [];
-      for (vmService.ClassHeapStats member in allocationProfile.members) {
-        if (_interestsClassNames.contains(member.classRef.name)) {
-          vmService.Class c =
-              await serviceClient.getObject(_isolateRef.id, member.classRef.id);
-          String uriString = c.location?.script?.uri;
+      for (vmService.ClassHeapStats member in allocationProfile.members!) {
+        if (_interestsClassNames.contains(member.classRef!.name)) {
+          vmService.Class c = (await serviceClient.getObject(
+              _isolateRef.id!, member.classRef!.id!)) as vmService.Class;
+          String? uriString = c.location?.script?.uri;
           if (uriString == null) continue;
           Uri uri = Uri.parse(uriString);
-          Map<String, List<String>> uriInterest = _interests[uri];
+          Map<String, List<String>>? uriInterest = _interests[uri];
           if (uriInterest == null) continue;
-          List<String> fieldsForClass = uriInterest[c.name];
+          List<String>? fieldsForClass = uriInterest[c.name];
           if (fieldsForClass == null) continue;
 
           List<String> fieldsForClassPrettyPrint = fieldsForClass;
@@ -117,11 +115,11 @@
           uriInterest = _prettyPrints[uri];
           if (uriInterest != null) {
             if (uriInterest[c.name] != null) {
-              fieldsForClassPrettyPrint = uriInterest[c.name];
+              fieldsForClassPrettyPrint = uriInterest[c.name]!;
             }
           }
 
-          leaks.addAll(await _findLeaks(_isolateRef, member.classRef,
+          leaks.addAll(await _findLeaks(_isolateRef, member.classRef!,
               fieldsForClass, fieldsForClassPrettyPrint));
         }
       }
@@ -138,7 +136,7 @@
 
       print("Looked for leaks in ${stopwatch.elapsedMilliseconds} ms");
 
-      await serviceClient.resume(_isolateRef.id);
+      await serviceClient.resume(_isolateRef.id!);
       _iterationNumber++;
     }
   }
@@ -149,7 +147,7 @@
       List<String> fieldsForClass,
       List<String> fieldsForClassPrettyPrint) async {
     // Use undocumented (/ private?) method to get all instances of this class.
-    vmService.InstanceRef instancesAsList = await serviceClient.callMethod(
+    vmService.InstanceRef instancesAsList = (await serviceClient.callMethod(
       "_getInstancesAsArray",
       isolateId: isolateRef.id,
       args: {
@@ -157,7 +155,7 @@
         "includeSubclasses": false,
         "includeImplementors": false,
       },
-    );
+    )) as vmService.InstanceRef;
 
     // Create dart code that `toString`s a class instance according to
     // the fields given as wanting printed. Both for finding duplicates (1) and
@@ -165,14 +163,14 @@
     // them) (2).
 
     // 1:
-    String fieldsToStringCode = classRef.name +
+    String fieldsToStringCode = classRef.name! +
         "[" +
         fieldsForClass
             .map((value) => "$value: \"\${element.$value}\"")
             .join(", ") +
         "]";
     // 2:
-    String fieldsToStringPrettyPrintCode = classRef.name +
+    String fieldsToStringPrettyPrintCode = classRef.name! +
         "[" +
         fieldsForClassPrettyPrint
             .map((value) => "$value: \"\${element.$value}\"")
@@ -182,9 +180,9 @@
     // Expression evaluation to find duplicates: Put all entries into a map
     // indexed by the `toString` code created above, mapping to list of that
     // data.
-    vmService.InstanceRef mappedData = await serviceClient.evaluate(
-      isolateRef.id,
-      instancesAsList.id,
+    vmService.InstanceRef mappedData = (await serviceClient.evaluate(
+      isolateRef.id!,
+      instancesAsList.id!,
       """
           this
               .fold({}, (dynamic index, dynamic element) {
@@ -194,22 +192,22 @@
                 return index;
               })
         """,
-    );
+    )) as vmService.InstanceRef;
     // Expression calculation to find if any of the lists created as values
     // above contains more than one entry (i.e. there's a duplicate).
-    vmService.InstanceRef duplicatesLengthRef = await serviceClient.evaluate(
-      isolateRef.id,
-      mappedData.id,
+    vmService.InstanceRef duplicatesLengthRef = (await serviceClient.evaluate(
+      isolateRef.id!,
+      mappedData.id!,
       """
           this
               .values
               .where((dynamic element) => (element.length > 1) as bool)
               .length
         """,
-    );
-    vmService.Instance duplicatesLength =
-        await serviceClient.getObject(isolateRef.id, duplicatesLengthRef.id);
-    int duplicates = int.tryParse(duplicatesLength.valueAsString);
+    )) as vmService.InstanceRef;
+    vmService.Instance duplicatesLength = (await serviceClient.getObject(
+        isolateRef.id!, duplicatesLengthRef.id!)) as vmService.Instance;
+    int? duplicates = int.tryParse(duplicatesLength.valueAsString!);
     if (duplicates != 0) {
       // There are duplicates. Expression calculation to encode the duplication
       // data (both the string that caused it to be a duplicate and the pretty
@@ -219,9 +217,9 @@
       // e.g. encode the string "string" as "6:string" (length 6, string),
       // and the list ["foo", "bar"] as "2:3:foo:3:bar" (2 entries, length 3,
       // foo, length 3, bar).
-      vmService.ObjRef duplicatesDataRef = await serviceClient.evaluate(
-        isolateRef.id,
-        mappedData.id,
+      vmService.ObjRef duplicatesDataRef = (await serviceClient.evaluate(
+        isolateRef.id!,
+        mappedData.id!,
         """
           this
               .entries
@@ -237,11 +235,11 @@
             return "\${keyPart}:\${valuePart1}:\${valuePart2}";
           }).join(":")
           """,
-      );
+      )) as vmService.ObjRef;
       if (duplicatesDataRef is! vmService.InstanceRef) {
         if (duplicatesDataRef is vmService.ErrorRef) {
-          vmService.Error error = await serviceClient.getObject(
-              isolateRef.id, duplicatesDataRef.id);
+          vmService.Error error = (await serviceClient.getObject(
+              isolateRef.id!, duplicatesDataRef.id!)) as vmService.Error;
           throw "Leak found, but trying to evaluate pretty printing "
               "didn't go as planned.\n"
               "Got error with message "
@@ -254,9 +252,9 @@
         }
       }
 
-      vmService.Instance duplicatesData =
-          await serviceClient.getObject(isolateRef.id, duplicatesDataRef.id);
-      String encodedData = duplicatesData.valueAsString;
+      vmService.Instance duplicatesData = (await serviceClient.getObject(
+          isolateRef.id!, duplicatesDataRef.id!)) as vmService.Instance;
+      String encodedData = duplicatesData.valueAsString!;
       try {
         return parseEncodedLeakString(encodedData);
       } catch (e) {
diff --git a/pkg/front_end/test/vm_service_heap_helper_test.dart b/pkg/front_end/test/vm_service_heap_helper_test.dart
index 8a7df50..3879d88 100644
--- a/pkg/front_end/test/vm_service_heap_helper_test.dart
+++ b/pkg/front_end/test/vm_service_heap_helper_test.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:async';
 import 'dart:developer';
 import 'dart:io';
@@ -144,9 +142,9 @@
   Completer<List<String>> completer = new Completer<List<String>>();
 
   LeakFinderTest({
-    List<helper.Interest> interests,
-    List<helper.Interest> prettyPrints,
-    bool throwOnPossibleLeak,
+    required List<helper.Interest> interests,
+    required List<helper.Interest> prettyPrints,
+    required bool throwOnPossibleLeak,
   }) : super(
             interests: interests,
             prettyPrints: prettyPrints,
diff --git a/pkg/front_end/test/vm_service_helper.dart b/pkg/front_end/test/vm_service_helper.dart
index c796b41..f2d3cb6 100644
--- a/pkg/front_end/test/vm_service_helper.dart
+++ b/pkg/front_end/test/vm_service_helper.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import "dart:convert";
 import "dart:io";
 
@@ -14,7 +12,7 @@
 export "package:vm_service/vm_service_io.dart";
 
 class VMServiceHelper {
-  vmService.VmService _serviceClient;
+  late vmService.VmService _serviceClient;
   vmService.VmService get serviceClient => _serviceClient;
 
   VMServiceHelper();
@@ -34,7 +32,7 @@
   Future<bool> waitUntilPaused(String isolateId) async {
     int nulls = 0;
     while (true) {
-      bool result = await isPaused(isolateId);
+      bool? result = await isPaused(isolateId);
       if (result == null) {
         nulls++;
         if (nulls > 5) {
@@ -50,11 +48,11 @@
     }
   }
 
-  Future<bool> isPaused(String isolateId) async {
+  Future<bool?> isPaused(String isolateId) async {
     dynamic tmp = await _serviceClient.getIsolate(isolateId);
     if (tmp is vmService.Isolate) {
       vmService.Isolate isolate = tmp;
-      if (isolate.pauseEvent.kind != "Resume") return true;
+      if (isolate.pauseEvent!.kind != "Resume") return true;
       return false;
     }
     return null;
@@ -64,7 +62,7 @@
     dynamic tmp = await _serviceClient.getIsolate(isolateId);
     if (tmp is vmService.Isolate) {
       vmService.Isolate isolate = tmp;
-      return isolate.pauseEvent.kind == "PauseStart";
+      return isolate.pauseEvent!.kind == "PauseStart";
     }
     return false;
   }
@@ -73,7 +71,7 @@
     dynamic tmp = await _serviceClient.getIsolate(isolateId);
     if (tmp is vmService.Isolate) {
       vmService.Isolate isolate = tmp;
-      return isolate.pauseEvent.kind == "PauseExit";
+      return isolate.pauseEvent!.kind == "PauseExit";
     }
     return false;
   }
@@ -91,13 +89,13 @@
         rethrow;
       }
       if (allocationProfile.dateLastServiceGC != null &&
-          allocationProfile.dateLastServiceGC >= expectGcAfter) {
+          allocationProfile.dateLastServiceGC! >= expectGcAfter) {
         return allocationProfile;
       }
     }
   }
 
-  Future<bool> isIsolateRunnable(String isolateId) async {
+  Future<bool?> isIsolateRunnable(String isolateId) async {
     dynamic tmp = await _serviceClient.getIsolate(isolateId);
     if (tmp is vmService.Isolate) {
       vmService.Isolate isolate = tmp;
@@ -109,7 +107,7 @@
   Future<void> waitUntilIsolateIsRunnable(String isolateId) async {
     int nulls = 0;
     while (true) {
-      bool result = await isIsolateRunnable(isolateId);
+      bool? result = await isIsolateRunnable(isolateId);
       if (result == null) {
         nulls++;
         if (nulls > 5) {
@@ -127,11 +125,11 @@
 
   Future<String> getIsolateId() async {
     vmService.VM vm = await _serviceClient.getVM();
-    if (vm.isolates.length != 1) {
-      throw "Expected 1 isolate, got ${vm.isolates.length}";
+    if (vm.isolates!.length != 1) {
+      throw "Expected 1 isolate, got ${vm.isolates!.length}";
     }
-    vmService.IsolateRef isolateRef = vm.isolates.single;
-    return isolateRef.id;
+    vmService.IsolateRef isolateRef = vm.isolates!.single;
+    return isolateRef.id!;
   }
 }
 
@@ -150,14 +148,14 @@
 }
 
 abstract class LaunchingVMServiceHelper extends VMServiceHelper {
-  Process _process;
+  late Process _process;
   Process get process => _process;
 
   bool _started = false;
 
   Future<void> start(List<String> scriptAndArgs,
-      {void stdoutReceiver(String line),
-      void stderrReceiver(String line)}) async {
+      {void Function(String line)? stdoutReceiver,
+      void Function(String line)? stderrReceiver}) async {
     if (_started) throw "Already started";
     _started = true;
     _process = await Process.start(
diff --git a/pkg/front_end/testcases/dart2js/conditional_import.dart b/pkg/front_end/testcases/dart2js/conditional_import.dart
new file mode 100644
index 0000000..6122451
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/conditional_import.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// All three libraries have an HttpRequest class.
+import "conditional_import.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" as a;
+
+// All three libraries have an HttpRequest class.
+import "conditional_import.dart" if (dart.library.foo) "dart:foo" as b;
+
+class HttpRequest {}
+
+testA(a.HttpRequest request) {
+  request.certificate; // error (from dart:io)
+  request.response; // ok (from dart:io and dart:html)
+  request.readyState; // ok (from dart:html)
+  request.hashCode; // ok
+}
+
+testB(b.HttpRequest request) {
+  request.certificate; // error
+  request.response; // error
+  request.readyState; // error
+  request.hashCode; // ok
+}
+
+void main() {
+  expect(false, const bool.fromEnvironment("dart.library.io"));
+  expect(true, const bool.fromEnvironment("dart.library.html"));
+  expect(false, const bool.fromEnvironment("dart.library.foo"));
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
diff --git a/pkg/front_end/testcases/dart2js/conditional_import.dart.strong.expect b/pkg/front_end/testcases/dart2js/conditional_import.dart.strong.expect
new file mode 100644
index 0000000..5f33ec1
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/conditional_import.dart.strong.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // ok (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // ok (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(false, #C1);
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/dart2js/conditional_import.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/conditional_import.dart.strong.transformed.expect
new file mode 100644
index 0000000..5f33ec1
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/conditional_import.dart.strong.transformed.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // ok (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // ok (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(false, #C1);
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/dart2js/conditional_import.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/conditional_import.dart.textual_outline.expect
new file mode 100644
index 0000000..dc10727
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/conditional_import.dart.textual_outline.expect
@@ -0,0 +1,11 @@
+import "conditional_import.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" as a;
+import "conditional_import.dart" if (dart.library.foo) "dart:foo" as b;
+
+class HttpRequest {}
+
+testA(a.HttpRequest request) {}
+testB(b.HttpRequest request) {}
+void main() {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/dart2js/conditional_import.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/conditional_import.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..6e90f3d
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/conditional_import.dart.textual_outline_modelled.expect
@@ -0,0 +1,11 @@
+import "conditional_import.dart" if (dart.library.foo) "dart:foo" as b;
+import "conditional_import.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" as a;
+
+class HttpRequest {}
+
+expect(expected, actual) {}
+testA(a.HttpRequest request) {}
+testB(b.HttpRequest request) {}
+void main() {}
diff --git a/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.expect b/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.expect
new file mode 100644
index 0000000..5f33ec1
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // ok (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // ok (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(false, #C1);
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.outline.expect b/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.outline.expect
new file mode 100644
index 0000000..8e7ea0f
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.outline.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic
+  ;
+static method testB(self::HttpRequest request) → dynamic
+  ;
+static method main() → void
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.transformed.expect b/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.transformed.expect
new file mode 100644
index 0000000..5f33ec1
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.transformed.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // ok (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // ok (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(false, #C1);
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/dartdevc/conditional_import.dart b/pkg/front_end/testcases/dartdevc/conditional_import.dart
new file mode 100644
index 0000000..6122451
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/conditional_import.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// All three libraries have an HttpRequest class.
+import "conditional_import.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" as a;
+
+// All three libraries have an HttpRequest class.
+import "conditional_import.dart" if (dart.library.foo) "dart:foo" as b;
+
+class HttpRequest {}
+
+testA(a.HttpRequest request) {
+  request.certificate; // error (from dart:io)
+  request.response; // ok (from dart:io and dart:html)
+  request.readyState; // ok (from dart:html)
+  request.hashCode; // ok
+}
+
+testB(b.HttpRequest request) {
+  request.certificate; // error
+  request.response; // error
+  request.readyState; // error
+  request.hashCode; // ok
+}
+
+void main() {
+  expect(false, const bool.fromEnvironment("dart.library.io"));
+  expect(true, const bool.fromEnvironment("dart.library.html"));
+  expect(false, const bool.fromEnvironment("dart.library.foo"));
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
diff --git a/pkg/front_end/testcases/dartdevc/conditional_import.dart.strong.expect b/pkg/front_end/testcases/dartdevc/conditional_import.dart.strong.expect
new file mode 100644
index 0000000..3b668f7
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/conditional_import.dart.strong.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // ok (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // ok (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(false, #C1);
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/dartdevc/conditional_import.dart.strong.transformed.expect b/pkg/front_end/testcases/dartdevc/conditional_import.dart.strong.transformed.expect
new file mode 100644
index 0000000..3b668f7
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/conditional_import.dart.strong.transformed.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // ok (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // ok (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(false, #C1);
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/dartdevc/conditional_import.dart.textual_outline.expect b/pkg/front_end/testcases/dartdevc/conditional_import.dart.textual_outline.expect
new file mode 100644
index 0000000..dc10727
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/conditional_import.dart.textual_outline.expect
@@ -0,0 +1,11 @@
+import "conditional_import.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" as a;
+import "conditional_import.dart" if (dart.library.foo) "dart:foo" as b;
+
+class HttpRequest {}
+
+testA(a.HttpRequest request) {}
+testB(b.HttpRequest request) {}
+void main() {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/dartdevc/conditional_import.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dartdevc/conditional_import.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..6e90f3d
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/conditional_import.dart.textual_outline_modelled.expect
@@ -0,0 +1,11 @@
+import "conditional_import.dart" if (dart.library.foo) "dart:foo" as b;
+import "conditional_import.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" as a;
+
+class HttpRequest {}
+
+expect(expected, actual) {}
+testA(a.HttpRequest request) {}
+testB(b.HttpRequest request) {}
+void main() {}
diff --git a/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.expect b/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.expect
new file mode 100644
index 0000000..3b668f7
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // ok (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // ok (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(false, #C1);
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.outline.expect b/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.outline.expect
new file mode 100644
index 0000000..8e7ea0f
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.outline.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic
+  ;
+static method testB(self::HttpRequest request) → dynamic
+  ;
+static method main() → void
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.transformed.expect b/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.transformed.expect
new file mode 100644
index 0000000..3b668f7
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.transformed.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // ok (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // ok (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(false, #C1);
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart
new file mode 100644
index 0000000..a645a364
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+enum E<X, Y> {
+  one<int, String>(),
+  two<double, num>(),
+  three<int, int>.named(42);
+
+  const E();
+  const E.named(int value);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect
new file mode 100644
index 0000000..b4016d7
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C10;
+  static const field self::E one = #C3;
+  static const field self::E two = #C6;
+  static const field self::E three = #C9;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "one"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "two"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "three"
+  #C9 = self::E {index:#C7, _name:#C8}
+  #C10 = <self::E>[#C3, #C6, #C9]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///entries_with_type_arguments.dart:
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect
new file mode 100644
index 0000000..b4016d7
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C10;
+  static const field self::E one = #C3;
+  static const field self::E two = #C6;
+  static const field self::E three = #C9;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "one"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "two"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "three"
+  #C9 = self::E {index:#C7, _name:#C8}
+  #C10 = <self::E>[#C3, #C6, #C9]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///entries_with_type_arguments.dart:
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.textual_outline.expect
new file mode 100644
index 0000000..4fa6f4d
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.textual_outline.expect
@@ -0,0 +1,2 @@
+enum E<X, Y> { one<int, String>(), two<double, num>(), three<int, int>.named(42); const E(); const E.named(int value); }
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect
new file mode 100644
index 0000000..a7d67d3
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C10;
+  static const field self::E one = #C3;
+  static const field self::E two = #C6;
+  static const field self::E three = #C9;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "one"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "two"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "three"
+  #C9 = self::E {index:#C7, _name:#C8}
+  #C10 = <self::E*>[#C3, #C6, #C9]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///entries_with_type_arguments.dart:
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect
new file mode 100644
index 0000000..61d174a
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = const <self::E>[self::E::one, self::E::two, self::E::three];
+  static const field self::E one = const self::E::•(0, "one");
+  static const field self::E two = const self::E::•(1, "two");
+  static const field self::E three = const self::E::•(2, "three");
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///entries_with_type_arguments.dart:5:6 -> ListConstant(const <E*>[const E{_Enum.index: 0, _Enum._name: "one"}, const E{_Enum.index: 1, _Enum._name: "two"}, const E{_Enum.index: 2, _Enum._name: "three"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:6:3 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:7:3 -> InstanceConstant(const E{_Enum.index: 1, _Enum._name: "two"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:8:3 -> InstanceConstant(const E{_Enum.index: 2, _Enum._name: "three"})
+Extra constant evaluation: evaluated: 9, effectively constant: 4
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect
new file mode 100644
index 0000000..a7d67d3
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C10;
+  static const field self::E one = #C3;
+  static const field self::E two = #C6;
+  static const field self::E three = #C9;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "one"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "two"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "three"
+  #C9 = self::E {index:#C7, _name:#C8}
+  #C10 = <self::E*>[#C3, #C6, #C9]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///entries_with_type_arguments.dart:
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/folder.options b/pkg/front_end/testcases/enhanced_enums/folder.options
new file mode 100644
index 0000000..ecd97db
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/folder.options
@@ -0,0 +1 @@
+--enable-experiment=enhanced-enums
\ No newline at end of file
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart
new file mode 100644
index 0000000..b1dcf70
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+enum E {
+  a.b() // Qualified name with no type arguments.
+  ;
+  const E.b();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.expect
new file mode 100644
index 0000000..b209df1
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C4;
+  static const field self::E a = #C3;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
+- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.transformed.expect
new file mode 100644
index 0000000..b209df1
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.transformed.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C4;
+  static const field self::E a = #C3;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
+- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.textual_outline.expect
new file mode 100644
index 0000000..bc9f7ff
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.textual_outline.expect
@@ -0,0 +1,2 @@
+enum E { a.b() ; const E.b(); }
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.expect
new file mode 100644
index 0000000..5cc89c4
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C4;
+  static const field self::E a = #C3;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E*>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
+- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.outline.expect
new file mode 100644
index 0000000..2732493
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.outline.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = const <self::E>[self::E::a];
+  static const field self::E a = const self::E::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6 -> ListConstant(const <E*>[const E{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:6:3 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "a"})
+Extra constant evaluation: evaluated: 7, effectively constant: 2
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.transformed.expect
new file mode 100644
index 0000000..5cc89c4
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.transformed.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C4;
+  static const field self::E a = #C3;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E*>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
+- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/conditional_import.dart b/pkg/front_end/testcases/general/conditional_import.dart
new file mode 100644
index 0000000..067c784
--- /dev/null
+++ b/pkg/front_end/testcases/general/conditional_import.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// All three libraries have an HttpRequest class.
+import "conditional_import.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" as a;
+
+// All three libraries have an HttpRequest class.
+import "conditional_import.dart" if (dart.library.foo) "dart:foo" as b;
+
+class HttpRequest {}
+
+testA(a.HttpRequest request) {
+  request.certificate; // ok (from dart:io)
+  request.response; // ok (from dart:io and dart:html)
+  request.readyState; // error (from dart:html)
+  request.hashCode; // ok
+}
+
+testB(b.HttpRequest request) {
+  request.certificate; // error
+  request.response; // error
+  request.readyState; // error
+  request.hashCode; // ok
+}
+
+void main() {
+  expect(true, const bool.fromEnvironment("dart.library.io"));
+  expect(false, const bool.fromEnvironment("dart.library.html"));
+  expect(false, const bool.fromEnvironment("dart.library.foo"));
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
diff --git a/pkg/front_end/testcases/general/conditional_import.dart.textual_outline.expect b/pkg/front_end/testcases/general/conditional_import.dart.textual_outline.expect
new file mode 100644
index 0000000..dc10727
--- /dev/null
+++ b/pkg/front_end/testcases/general/conditional_import.dart.textual_outline.expect
@@ -0,0 +1,11 @@
+import "conditional_import.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" as a;
+import "conditional_import.dart" if (dart.library.foo) "dart:foo" as b;
+
+class HttpRequest {}
+
+testA(a.HttpRequest request) {}
+testB(b.HttpRequest request) {}
+void main() {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/general/conditional_import.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/conditional_import.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..6e90f3d
--- /dev/null
+++ b/pkg/front_end/testcases/general/conditional_import.dart.textual_outline_modelled.expect
@@ -0,0 +1,11 @@
+import "conditional_import.dart" if (dart.library.foo) "dart:foo" as b;
+import "conditional_import.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" as a;
+
+class HttpRequest {}
+
+expect(expected, actual) {}
+testA(a.HttpRequest request) {}
+testB(b.HttpRequest request) {}
+void main() {}
diff --git a/pkg/front_end/testcases/general/conditional_import.dart.weak.expect b/pkg/front_end/testcases/general/conditional_import.dart.weak.expect
new file mode 100644
index 0000000..0ae3432
--- /dev/null
+++ b/pkg/front_end/testcases/general/conditional_import.dart.weak.expect
@@ -0,0 +1,82 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/general/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/general/conditional_import.dart.weak.outline.expect b/pkg/front_end/testcases/general/conditional_import.dart.weak.outline.expect
new file mode 100644
index 0000000..17e396c
--- /dev/null
+++ b/pkg/front_end/testcases/general/conditional_import.dart.weak.outline.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    ;
+}
+static method testA(_ht::HttpRequest request) → dynamic
+  ;
+static method testB(self::HttpRequest request) → dynamic
+  ;
+static method main() → void
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/conditional_import.dart.weak.transformed.expect b/pkg/front_end/testcases/general/conditional_import.dart.weak.transformed.expect
new file mode 100644
index 0000000..0ae3432
--- /dev/null
+++ b/pkg/front_end/testcases/general/conditional_import.dart.weak.transformed.expect
@@ -0,0 +1,82 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/general/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.expect b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.expect
index 776ec91..cd13068 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.expect
@@ -14,7 +14,7 @@
 // typedef F<Glib.=
 //                ^
 //
-// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-function type.
+// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-type.
 // typedef F<Glib.=
 //                ^
 //
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.outline.expect b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.outline.expect
index 776ec91..cd13068 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.outline.expect
@@ -14,7 +14,7 @@
 // typedef F<Glib.=
 //                ^
 //
-// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-function type.
+// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-type.
 // typedef F<Glib.=
 //                ^
 //
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.transformed.expect b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.transformed.expect
index 776ec91..cd13068 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.transformed.expect
@@ -14,7 +14,7 @@
 // typedef F<Glib.=
 //                ^
 //
-// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-function type.
+// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-type.
 // typedef F<Glib.=
 //                ^
 //
diff --git a/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.expect b/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.expect
index bc4eb86..dfe0844 100644
--- a/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.expect
+++ b/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.expect
@@ -3,7 +3,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart:11:6: Error: This requires the 'extension-types' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
 // test(E e) {} // Error.
 //      ^
 //
diff --git a/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.outline.expect b/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.outline.expect
index 1a1b4af..7be45bb 100644
--- a/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.outline.expect
@@ -3,7 +3,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart:11:6: Error: This requires the 'extension-types' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
 // test(E e) {} // Error.
 //      ^
 //
diff --git a/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.transformed.expect b/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.transformed.expect
index bc4eb86..dfe0844 100644
--- a/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart:11:6: Error: This requires the 'extension-types' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
 // test(E e) {} // Error.
 //      ^
 //
diff --git a/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.expect b/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.expect
index e55b3b5..0c596cb 100644
--- a/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.expect
+++ b/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.expect
@@ -3,7 +3,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart:9:11: Error: This requires the 'extension-types' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
 // extension type E on A {} // Error because of 'type'.
 //           ^^^^
 //
diff --git a/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.outline.expect b/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.outline.expect
index a219bab..8b21c25 100644
--- a/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.outline.expect
@@ -3,7 +3,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart:9:11: Error: This requires the 'extension-types' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
 // extension type E on A {} // Error because of 'type'.
 //           ^^^^
 //
diff --git a/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.transformed.expect b/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.transformed.expect
index e55b3b5..0c596cb 100644
--- a/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart:9:11: Error: This requires the 'extension-types' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
 // extension type E on A {} // Error because of 'type'.
 //           ^^^^
 //
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect b/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect
index 8f1e1c3..57cc30b 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect
@@ -59,16 +59,16 @@
   #C7 = core::pragma {name:#C1, options:#C6}
   #C8 = ffi::Double {}
   #C9 = 0
-  #C10 = <core::int*>[#C9, #C9, #C9]
+  #C10 = <core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 8
-  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C12 = <core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = 16
-  #C14 = <core::int*>[#C13, #C13, #C13]
+  #C14 = <core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
   #C15 = "vm:prefer-inline"
   #C16 = core::pragma {name:#C15, options:#C5}
   #C17 = 24
   #C18 = 20
-  #C19 = <core::int*>[#C17, #C18, #C17]
+  #C19 = <core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17]
 }
 
 
diff --git a/pkg/front_end/testcases/general/issue47495.dart.weak.expect b/pkg/front_end/testcases/general/issue47495.dart.weak.expect
index 1c6fab0..aeebd16 100644
--- a/pkg/front_end/testcases/general/issue47495.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue47495.dart.weak.expect
@@ -17,20 +17,6 @@
 // typedef MAlias = M;
 //         ^
 //
-// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'SAlias' which is an alias of 'invalid-type' can't be used as supertype.
-// class C = SAlias with MAlias;
-//       ^
-// pkg/front_end/testcases/general/issue47495.dart:10:9: Context: The issue arises via this type alias.
-// typedef SAlias = S;
-//         ^
-//
-// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'MAlias' which is an alias of 'invalid-type' can't be used as supertype.
-// class C = SAlias with MAlias;
-//       ^
-// pkg/front_end/testcases/general/issue47495.dart:11:9: Context: The issue arises via this type alias.
-// typedef MAlias = M;
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/issue47495.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47495.dart.weak.outline.expect
index f366ace..697ca5b 100644
--- a/pkg/front_end/testcases/general/issue47495.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue47495.dart.weak.outline.expect
@@ -17,20 +17,6 @@
 // typedef MAlias = M;
 //         ^
 //
-// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'SAlias' which is an alias of 'invalid-type' can't be used as supertype.
-// class C = SAlias with MAlias;
-//       ^
-// pkg/front_end/testcases/general/issue47495.dart:10:9: Context: The issue arises via this type alias.
-// typedef SAlias = S;
-//         ^
-//
-// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'MAlias' which is an alias of 'invalid-type' can't be used as supertype.
-// class C = SAlias with MAlias;
-//       ^
-// pkg/front_end/testcases/general/issue47495.dart:11:9: Context: The issue arises via this type alias.
-// typedef MAlias = M;
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/issue47495.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47495.dart.weak.transformed.expect
index 1c6fab0..aeebd16 100644
--- a/pkg/front_end/testcases/general/issue47495.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue47495.dart.weak.transformed.expect
@@ -17,20 +17,6 @@
 // typedef MAlias = M;
 //         ^
 //
-// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'SAlias' which is an alias of 'invalid-type' can't be used as supertype.
-// class C = SAlias with MAlias;
-//       ^
-// pkg/front_end/testcases/general/issue47495.dart:10:9: Context: The issue arises via this type alias.
-// typedef SAlias = S;
-//         ^
-//
-// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'MAlias' which is an alias of 'invalid-type' can't be used as supertype.
-// class C = SAlias with MAlias;
-//       ^
-// pkg/front_end/testcases/general/issue47495.dart:11:9: Context: The issue arises via this type alias.
-// typedef MAlias = M;
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart b/pkg/front_end/testcases/general/issue47728_1.dart
new file mode 100644
index 0000000..c21c8d9
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.12
+
+typedef A = Function()?;
+
+class B {}
+
+class C = A with B;
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue47728_1.dart.textual_outline.expect
new file mode 100644
index 0000000..ce30a6e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart.textual_outline.expect
@@ -0,0 +1,7 @@
+// @dart = 2.12
+typedef A = Function()?;
+
+class B {}
+
+class C = A with B;
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue47728_1.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..41cba10
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart.textual_outline_modelled.expect
@@ -0,0 +1,6 @@
+// @dart = 2.12
+class B {}
+
+class C = A with B;
+main() {}
+typedef A = Function()?;
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart.weak.expect b/pkg/front_end/testcases/general/issue47728_1.dart.weak.expect
new file mode 100644
index 0000000..a0401b1
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart.weak.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_1.dart:7:11: Error: Can't create typedef from nullable type.
+// typedef A = Function()?;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47728_1.dart.weak.outline.expect
new file mode 100644
index 0000000..f10b81e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart.weak.outline.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_1.dart:7:11: Error: Can't create typedef from nullable type.
+// typedef A = Function()?;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47728_1.dart.weak.transformed.expect
new file mode 100644
index 0000000..047429d
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart.weak.transformed.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_1.dart:7:11: Error: Can't create typedef from nullable type.
+// typedef A = Function()?;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object implements self::B /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_2.dart b/pkg/front_end/testcases/general/issue47728_2.dart
new file mode 100644
index 0000000..70ff02c
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_2.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef A = ;
+
+class B {}
+
+class C = A with B;
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_2.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue47728_2.dart.textual_outline.expect
new file mode 100644
index 0000000..d2e4a8cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_2.dart.textual_outline.expect
@@ -0,0 +1,4 @@
+typedef A = ;
+class B {}
+class C = A with B;
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_2.dart.weak.expect b/pkg/front_end/testcases/general/issue47728_2.dart.weak.expect
new file mode 100644
index 0000000..82e50f8
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_2.dart.weak.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_2.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47728_2.dart.weak.outline.expect
new file mode 100644
index 0000000..836ab09
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_2.dart.weak.outline.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue47728_2.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47728_2.dart.weak.transformed.expect
new file mode 100644
index 0000000..3b07de4
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_2.dart.weak.transformed.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object implements self::B /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_3.dart b/pkg/front_end/testcases/general/issue47728_3.dart
new file mode 100644
index 0000000..cc160b7
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_3.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.12
+
+typedef A = ;
+
+class B {}
+
+class C = A with B;
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_3.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue47728_3.dart.textual_outline.expect
new file mode 100644
index 0000000..f5e4116
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_3.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+// @dart = 2.12
+typedef A = ;
+class B {}
+class C = A with B;
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_3.dart.weak.expect b/pkg/front_end/testcases/general/issue47728_3.dart.weak.expect
new file mode 100644
index 0000000..7f3c778
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_3.dart.weak.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_3.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47728_3.dart.weak.outline.expect
new file mode 100644
index 0000000..e34cb28
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_3.dart.weak.outline.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue47728_3.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47728_3.dart.weak.transformed.expect
new file mode 100644
index 0000000..11c3c9f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_3.dart.weak.transformed.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object implements self::B /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart b/pkg/front_end/testcases/general/issue47728_4.dart
new file mode 100644
index 0000000..bd0512e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef A = Function()?;
+
+class B {}
+
+class C = A with B;
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue47728_4.dart.textual_outline.expect
new file mode 100644
index 0000000..aca4ab4
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+typedef A = Function()?;
+
+class B {}
+
+class C = A with B;
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue47728_4.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..09de3de
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart.textual_outline_modelled.expect
@@ -0,0 +1,5 @@
+class B {}
+
+class C = A with B;
+main() {}
+typedef A = Function()?;
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart.weak.expect b/pkg/front_end/testcases/general/issue47728_4.dart.weak.expect
new file mode 100644
index 0000000..b242e08
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart.weak.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_4.dart:9:7: Error: The type 'A' which is an alias of 'dynamic Function()?' can't be used as supertype because it is nullable.
+// class C = A with B;
+//       ^
+// pkg/front_end/testcases/general/issue47728_4.dart:5:9: Context: The issue arises via this type alias.
+// typedef A = Function()?;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = () →? dynamic;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47728_4.dart.weak.outline.expect
new file mode 100644
index 0000000..bcc7a6f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart.weak.outline.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_4.dart:9:7: Error: The type 'A' which is an alias of 'dynamic Function()?' can't be used as supertype because it is nullable.
+// class C = A with B;
+//       ^
+// pkg/front_end/testcases/general/issue47728_4.dart:5:9: Context: The issue arises via this type alias.
+// typedef A = Function()?;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = () →? dynamic;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47728_4.dart.weak.transformed.expect
new file mode 100644
index 0000000..a92eb47
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart.weak.transformed.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_4.dart:9:7: Error: The type 'A' which is an alias of 'dynamic Function()?' can't be used as supertype because it is nullable.
+// class C = A with B;
+//       ^
+// pkg/front_end/testcases/general/issue47728_4.dart:5:9: Context: The issue arises via this type alias.
+// typedef A = Function()?;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = () →? dynamic;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object implements self::B /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/incremental/crash_05.yaml.world.1.expect b/pkg/front_end/testcases/incremental/crash_05.yaml.world.1.expect
index 9ecd41a..cd22c39 100644
--- a/pkg/front_end/testcases/incremental/crash_05.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/crash_05.yaml.world.1.expect
@@ -56,11 +56,11 @@
   #C6 = dart.core::pragma {name:#C1, options:#C5}
   #C7 = dart.ffi::Uint32 {}
   #C8 = 0
-  #C9 = <dart.core::int*>[#C8, #C8, #C8]
+  #C9 = <dart.core::int*>[#C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8]
   #C10 = "vm:prefer-inline"
   #C11 = dart.core::pragma {name:#C10, options:#C4}
   #C12 = 4
-  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C13 = <dart.core::int*>[#C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12]
   #C14 = TypeLiteralConstant(lib::Y)
   #C15 = <dart.core::Type>[#C14]
   #C16 = dart.ffi::_FfiStructLayout {fieldTypes:#C15, packing:#C4}
diff --git a/pkg/front_end/testcases/incremental/crash_05.yaml.world.2.expect b/pkg/front_end/testcases/incremental/crash_05.yaml.world.2.expect
index 9ecd41a..cd22c39 100644
--- a/pkg/front_end/testcases/incremental/crash_05.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/crash_05.yaml.world.2.expect
@@ -56,11 +56,11 @@
   #C6 = dart.core::pragma {name:#C1, options:#C5}
   #C7 = dart.ffi::Uint32 {}
   #C8 = 0
-  #C9 = <dart.core::int*>[#C8, #C8, #C8]
+  #C9 = <dart.core::int*>[#C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8]
   #C10 = "vm:prefer-inline"
   #C11 = dart.core::pragma {name:#C10, options:#C4}
   #C12 = 4
-  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C13 = <dart.core::int*>[#C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12]
   #C14 = TypeLiteralConstant(lib::Y)
   #C15 = <dart.core::Type>[#C14]
   #C16 = dart.ffi::_FfiStructLayout {fieldTypes:#C15, packing:#C4}
diff --git a/pkg/front_end/testcases/incremental/crash_06.yaml.world.1.expect b/pkg/front_end/testcases/incremental/crash_06.yaml.world.1.expect
index e06b9d6..2b217e2 100644
--- a/pkg/front_end/testcases/incremental/crash_06.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/crash_06.yaml.world.1.expect
@@ -62,7 +62,7 @@
   #C5 = dart.ffi::_FfiStructLayout {fieldTypes:#C3, packing:#C4}
   #C6 = dart.core::pragma {name:#C1, options:#C5}
   #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
+  #C8 = <dart.core::int*>[#C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7]
   #C9 = "vm:prefer-inline"
   #C10 = dart.core::pragma {name:#C9, options:#C4}
 }
diff --git a/pkg/front_end/testcases/incremental/crash_06.yaml.world.2.expect b/pkg/front_end/testcases/incremental/crash_06.yaml.world.2.expect
index e06b9d6..2b217e2 100644
--- a/pkg/front_end/testcases/incremental/crash_06.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/crash_06.yaml.world.2.expect
@@ -62,7 +62,7 @@
   #C5 = dart.ffi::_FfiStructLayout {fieldTypes:#C3, packing:#C4}
   #C6 = dart.core::pragma {name:#C1, options:#C5}
   #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
+  #C8 = <dart.core::int*>[#C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7]
   #C9 = "vm:prefer-inline"
   #C10 = dart.core::pragma {name:#C9, options:#C4}
 }
diff --git a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect
index 7f32b12..2e5c180 100644
--- a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect
@@ -62,14 +62,14 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Double {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 8
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = 16
-  #C14 = <dart.core::int*>[#C13, #C13, #C13]
+  #C14 = <dart.core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
   #C15 = "vm:prefer-inline"
   #C16 = dart.core::pragma {name:#C15, options:#C5}
   #C17 = 24
   #C18 = 20
-  #C19 = <dart.core::int*>[#C17, #C18, #C17]
+  #C19 = <dart.core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect
index 17f1531..a82af2e 100644
--- a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect
@@ -66,14 +66,14 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Double {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 8
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = 16
-  #C14 = <dart.core::int*>[#C13, #C13, #C13]
+  #C14 = <dart.core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
   #C15 = "vm:prefer-inline"
   #C16 = dart.core::pragma {name:#C15, options:#C5}
   #C17 = 24
   #C18 = 20
-  #C19 = <dart.core::int*>[#C17, #C18, #C17]
+  #C19 = <dart.core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect b/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect
index 583ebfd..68633a6 100644
--- a/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect
@@ -63,14 +63,14 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Double {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 8
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = 16
-  #C14 = <dart.core::int*>[#C13, #C13, #C13]
+  #C14 = <dart.core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
   #C15 = "vm:prefer-inline"
   #C16 = dart.core::pragma {name:#C15, options:#C5}
   #C17 = 24
   #C18 = 20
-  #C19 = <dart.core::int*>[#C17, #C18, #C17]
+  #C19 = <dart.core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/issue_46666.yaml.world.1.expect b/pkg/front_end/testcases/incremental/issue_46666.yaml.world.1.expect
index 3456d148..e925f93 100644
--- a/pkg/front_end/testcases/incremental/issue_46666.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/issue_46666.yaml.world.1.expect
@@ -101,19 +101,19 @@
   #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = 0
-  #C9 = <dart.core::int*>[#C8, #C8, #C8]
-  #C10 = 8
-  #C11 = 4
-  #C12 = <dart.core::int*>[#C10, #C11, #C11]
+  #C9 = <dart.core::int*>[#C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8]
+  #C10 = 4
+  #C11 = 8
+  #C12 = <dart.core::int*>[#C10, #C11, #C10, #C11, #C11, #C11, #C10, #C11, #C11, #C10, #C11, #C10, #C11, #C11, #C11, #C11, #C10, #C11]
   #C13 = 16
-  #C14 = <dart.core::int*>[#C13, #C10, #C10]
-  #C15 = 24
-  #C16 = 12
-  #C17 = <dart.core::int*>[#C15, #C16, #C16]
+  #C14 = <dart.core::int*>[#C11, #C13, #C11, #C13, #C13, #C13, #C11, #C13, #C13, #C11, #C13, #C11, #C13, #C13, #C13, #C13, #C11, #C13]
+  #C15 = 12
+  #C16 = 24
+  #C17 = <dart.core::int*>[#C15, #C16, #C15, #C16, #C16, #C16, #C15, #C16, #C16, #C15, #C16, #C15, #C16, #C16, #C16, #C16, #C15, #C16]
   #C18 = "vm:prefer-inline"
   #C19 = dart.core::pragma {name:#C18, options:#C5}
   #C20 = 48
-  #C21 = <dart.core::int*>[#C20, #C15, #C15]
+  #C21 = <dart.core::int*>[#C16, #C20, #C16, #C20, #C20, #C20, #C16, #C20, #C20, #C16, #C20, #C16, #C20, #C20, #C20, #C20, #C16, #C20]
   #C22 = <dart.core::Type>[#C2, #C2, #C2]
   #C23 = dart.ffi::_FfiStructLayout {fieldTypes:#C22, packing:#C5}
   #C24 = dart.core::pragma {name:#C1, options:#C23}
diff --git a/pkg/front_end/testcases/incremental/issue_46666.yaml.world.2.expect b/pkg/front_end/testcases/incremental/issue_46666.yaml.world.2.expect
index 3456d148..e925f93 100644
--- a/pkg/front_end/testcases/incremental/issue_46666.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/issue_46666.yaml.world.2.expect
@@ -101,19 +101,19 @@
   #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = 0
-  #C9 = <dart.core::int*>[#C8, #C8, #C8]
-  #C10 = 8
-  #C11 = 4
-  #C12 = <dart.core::int*>[#C10, #C11, #C11]
+  #C9 = <dart.core::int*>[#C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8]
+  #C10 = 4
+  #C11 = 8
+  #C12 = <dart.core::int*>[#C10, #C11, #C10, #C11, #C11, #C11, #C10, #C11, #C11, #C10, #C11, #C10, #C11, #C11, #C11, #C11, #C10, #C11]
   #C13 = 16
-  #C14 = <dart.core::int*>[#C13, #C10, #C10]
-  #C15 = 24
-  #C16 = 12
-  #C17 = <dart.core::int*>[#C15, #C16, #C16]
+  #C14 = <dart.core::int*>[#C11, #C13, #C11, #C13, #C13, #C13, #C11, #C13, #C13, #C11, #C13, #C11, #C13, #C13, #C13, #C13, #C11, #C13]
+  #C15 = 12
+  #C16 = 24
+  #C17 = <dart.core::int*>[#C15, #C16, #C15, #C16, #C16, #C16, #C15, #C16, #C16, #C15, #C16, #C15, #C16, #C16, #C16, #C16, #C15, #C16]
   #C18 = "vm:prefer-inline"
   #C19 = dart.core::pragma {name:#C18, options:#C5}
   #C20 = 48
-  #C21 = <dart.core::int*>[#C20, #C15, #C15]
+  #C21 = <dart.core::int*>[#C16, #C20, #C16, #C20, #C20, #C20, #C16, #C20, #C20, #C16, #C20, #C16, #C20, #C20, #C20, #C20, #C16, #C20]
   #C22 = <dart.core::Type>[#C2, #C2, #C2]
   #C23 = dart.ffi::_FfiStructLayout {fieldTypes:#C22, packing:#C5}
   #C24 = dart.core::pragma {name:#C1, options:#C23}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect
index 7f32b12..2e5c180 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect
@@ -62,14 +62,14 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Double {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 8
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = 16
-  #C14 = <dart.core::int*>[#C13, #C13, #C13]
+  #C14 = <dart.core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
   #C15 = "vm:prefer-inline"
   #C16 = dart.core::pragma {name:#C15, options:#C5}
   #C17 = 24
   #C18 = 20
-  #C19 = <dart.core::int*>[#C17, #C18, #C17]
+  #C19 = <dart.core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect
index ea6646e..9d91273 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect
@@ -63,14 +63,14 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Double {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 8
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = 16
-  #C14 = <dart.core::int*>[#C13, #C13, #C13]
+  #C14 = <dart.core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
   #C15 = "vm:prefer-inline"
   #C16 = dart.core::pragma {name:#C15, options:#C5}
   #C17 = 24
   #C18 = 20
-  #C19 = <dart.core::int*>[#C17, #C18, #C17]
+  #C19 = <dart.core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect
index 127f040..afef6e0 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect
@@ -64,14 +64,14 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Double {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 8
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = 16
-  #C14 = <dart.core::int*>[#C13, #C13, #C13]
+  #C14 = <dart.core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
   #C15 = "vm:prefer-inline"
   #C16 = dart.core::pragma {name:#C15, options:#C5}
   #C17 = 24
   #C18 = 20
-  #C19 = <dart.core::int*>[#C17, #C18, #C17]
+  #C19 = <dart.core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect
index e53139b..3f3d73e 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect
@@ -82,26 +82,26 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Uint8 {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 1
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = dart.ffi::Uint64 {}
   #C14 = 8
   #C15 = 4
-  #C16 = <dart.core::int*>[#C14, #C15, #C14]
+  #C16 = <dart.core::int*>[#C14, #C14, #C15, #C14, #C14, #C14, #C15, #C14, #C14, #C14, #C14, #C15, #C14, #C14, #C14, #C14, #C14, #C14]
   #C17 = "vm:prefer-inline"
   #C18 = dart.core::pragma {name:#C17, options:#C5}
   #C19 = 16
   #C20 = 12
-  #C21 = <dart.core::int*>[#C19, #C20, #C19]
+  #C21 = <dart.core::int*>[#C19, #C19, #C20, #C19, #C19, #C19, #C20, #C19, #C19, #C19, #C19, #C20, #C19, #C19, #C19, #C19, #C19, #C19]
   #C22 = TypeLiteralConstant(lib::Y)
   #C23 = <dart.core::Type>[#C22, #C22, #C2]
   #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
   #C25 = dart.core::pragma {name:#C1, options:#C24}
   #C26 = 32
   #C27 = 24
-  #C28 = <dart.core::int*>[#C26, #C27, #C26]
+  #C28 = <dart.core::int*>[#C26, #C26, #C27, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C26, #C26]
   #C29 = 40
   #C30 = 28
-  #C31 = <dart.core::int*>[#C29, #C30, #C29]
+  #C31 = <dart.core::int*>[#C29, #C29, #C30, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C29, #C29]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect
index c5fa703..e241ee1 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect
@@ -82,26 +82,26 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Uint8 {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = dart.ffi::Uint64 {}
   #C12 = 8
   #C13 = 4
-  #C14 = <dart.core::int*>[#C12, #C13, #C12]
+  #C14 = <dart.core::int*>[#C12, #C12, #C13, #C12, #C12, #C12, #C13, #C12, #C12, #C12, #C12, #C13, #C12, #C12, #C12, #C12, #C12, #C12]
   #C15 = 16
   #C16 = 12
-  #C17 = <dart.core::int*>[#C15, #C16, #C15]
+  #C17 = <dart.core::int*>[#C15, #C15, #C16, #C15, #C15, #C15, #C16, #C15, #C15, #C15, #C15, #C16, #C15, #C15, #C15, #C15, #C15, #C15]
   #C18 = "vm:prefer-inline"
   #C19 = dart.core::pragma {name:#C18, options:#C5}
   #C20 = 24
-  #C21 = <dart.core::int*>[#C20, #C15, #C20]
+  #C21 = <dart.core::int*>[#C20, #C20, #C15, #C20, #C20, #C20, #C15, #C20, #C20, #C20, #C20, #C15, #C20, #C20, #C20, #C20, #C20, #C20]
   #C22 = TypeLiteralConstant(lib::Y)
   #C23 = <dart.core::Type>[#C22, #C22, #C2]
   #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
   #C25 = dart.core::pragma {name:#C1, options:#C24}
   #C26 = 48
   #C27 = 32
-  #C28 = <dart.core::int*>[#C26, #C27, #C26]
+  #C28 = <dart.core::int*>[#C26, #C26, #C27, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C26, #C26]
   #C29 = 56
   #C30 = 36
-  #C31 = <dart.core::int*>[#C29, #C30, #C29]
+  #C31 = <dart.core::int*>[#C29, #C29, #C30, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C29, #C29]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect
index e53139b..3f3d73e 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect
@@ -82,26 +82,26 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Uint8 {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 1
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = dart.ffi::Uint64 {}
   #C14 = 8
   #C15 = 4
-  #C16 = <dart.core::int*>[#C14, #C15, #C14]
+  #C16 = <dart.core::int*>[#C14, #C14, #C15, #C14, #C14, #C14, #C15, #C14, #C14, #C14, #C14, #C15, #C14, #C14, #C14, #C14, #C14, #C14]
   #C17 = "vm:prefer-inline"
   #C18 = dart.core::pragma {name:#C17, options:#C5}
   #C19 = 16
   #C20 = 12
-  #C21 = <dart.core::int*>[#C19, #C20, #C19]
+  #C21 = <dart.core::int*>[#C19, #C19, #C20, #C19, #C19, #C19, #C20, #C19, #C19, #C19, #C19, #C20, #C19, #C19, #C19, #C19, #C19, #C19]
   #C22 = TypeLiteralConstant(lib::Y)
   #C23 = <dart.core::Type>[#C22, #C22, #C2]
   #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
   #C25 = dart.core::pragma {name:#C1, options:#C24}
   #C26 = 32
   #C27 = 24
-  #C28 = <dart.core::int*>[#C26, #C27, #C26]
+  #C28 = <dart.core::int*>[#C26, #C26, #C27, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C26, #C26]
   #C29 = 40
   #C30 = 28
-  #C31 = <dart.core::int*>[#C29, #C30, #C29]
+  #C31 = <dart.core::int*>[#C29, #C29, #C30, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C29, #C29]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect
index c5fa703..e241ee1 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect
@@ -82,26 +82,26 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Uint8 {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = dart.ffi::Uint64 {}
   #C12 = 8
   #C13 = 4
-  #C14 = <dart.core::int*>[#C12, #C13, #C12]
+  #C14 = <dart.core::int*>[#C12, #C12, #C13, #C12, #C12, #C12, #C13, #C12, #C12, #C12, #C12, #C13, #C12, #C12, #C12, #C12, #C12, #C12]
   #C15 = 16
   #C16 = 12
-  #C17 = <dart.core::int*>[#C15, #C16, #C15]
+  #C17 = <dart.core::int*>[#C15, #C15, #C16, #C15, #C15, #C15, #C16, #C15, #C15, #C15, #C15, #C16, #C15, #C15, #C15, #C15, #C15, #C15]
   #C18 = "vm:prefer-inline"
   #C19 = dart.core::pragma {name:#C18, options:#C5}
   #C20 = 24
-  #C21 = <dart.core::int*>[#C20, #C15, #C20]
+  #C21 = <dart.core::int*>[#C20, #C20, #C15, #C20, #C20, #C20, #C15, #C20, #C20, #C20, #C20, #C15, #C20, #C20, #C20, #C20, #C20, #C20]
   #C22 = TypeLiteralConstant(lib::Y)
   #C23 = <dart.core::Type>[#C22, #C22, #C2]
   #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
   #C25 = dart.core::pragma {name:#C1, options:#C24}
   #C26 = 48
   #C27 = 32
-  #C28 = <dart.core::int*>[#C26, #C27, #C26]
+  #C28 = <dart.core::int*>[#C26, #C26, #C27, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C26, #C26]
   #C29 = 56
   #C30 = 36
-  #C31 = <dart.core::int*>[#C29, #C30, #C29]
+  #C31 = <dart.core::int*>[#C29, #C29, #C30, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C29, #C29]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect
index 1d8965d..4e4f764 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect
@@ -39,6 +39,7 @@
   ffi::unsized,
   ffi::sizeOf,
   ffi::Dart_NativeMessageHandler,
+  ffi::Abi,
   ffi::Allocator,
   ffi::AllocatorAlloc,
   ffi::Array,
@@ -112,6 +113,7 @@
   ffi::unsized,
   ffi::sizeOf,
   ffi::Dart_NativeMessageHandler,
+  ffi::Abi,
   ffi::Allocator,
   ffi::AllocatorAlloc,
   ffi::Array,
@@ -228,26 +230,26 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Uint8 {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 1
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = dart.ffi::Uint64 {}
   #C14 = 8
   #C15 = 4
-  #C16 = <dart.core::int*>[#C14, #C15, #C14]
+  #C16 = <dart.core::int*>[#C14, #C14, #C15, #C14, #C14, #C14, #C15, #C14, #C14, #C14, #C14, #C15, #C14, #C14, #C14, #C14, #C14, #C14]
   #C17 = "vm:prefer-inline"
   #C18 = dart.core::pragma {name:#C17, options:#C5}
   #C19 = 16
   #C20 = 12
-  #C21 = <dart.core::int*>[#C19, #C20, #C19]
+  #C21 = <dart.core::int*>[#C19, #C19, #C20, #C19, #C19, #C19, #C20, #C19, #C19, #C19, #C19, #C20, #C19, #C19, #C19, #C19, #C19, #C19]
   #C22 = TypeLiteralConstant(lib::Y)
   #C23 = <dart.core::Type>[#C22, #C22, #C2]
   #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
   #C25 = dart.core::pragma {name:#C1, options:#C24}
   #C26 = 32
   #C27 = 24
-  #C28 = <dart.core::int*>[#C26, #C27, #C26]
+  #C28 = <dart.core::int*>[#C26, #C26, #C27, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C26, #C26]
   #C29 = 40
   #C30 = 28
-  #C31 = <dart.core::int*>[#C29, #C30, #C29]
+  #C31 = <dart.core::int*>[#C29, #C29, #C30, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C29, #C29]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect
index 6bf1e19..ead3ad4 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect
@@ -39,6 +39,7 @@
   ffi::unsized,
   ffi::sizeOf,
   ffi::Dart_NativeMessageHandler,
+  ffi::Abi,
   ffi::Allocator,
   ffi::AllocatorAlloc,
   ffi::Array,
@@ -112,6 +113,7 @@
   ffi::unsized,
   ffi::sizeOf,
   ffi::Dart_NativeMessageHandler,
+  ffi::Abi,
   ffi::Allocator,
   ffi::AllocatorAlloc,
   ffi::Array,
@@ -228,26 +230,26 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Uint8 {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = dart.ffi::Uint64 {}
   #C12 = 8
   #C13 = 4
-  #C14 = <dart.core::int*>[#C12, #C13, #C12]
+  #C14 = <dart.core::int*>[#C12, #C12, #C13, #C12, #C12, #C12, #C13, #C12, #C12, #C12, #C12, #C13, #C12, #C12, #C12, #C12, #C12, #C12]
   #C15 = 16
   #C16 = 12
-  #C17 = <dart.core::int*>[#C15, #C16, #C15]
+  #C17 = <dart.core::int*>[#C15, #C15, #C16, #C15, #C15, #C15, #C16, #C15, #C15, #C15, #C15, #C16, #C15, #C15, #C15, #C15, #C15, #C15]
   #C18 = "vm:prefer-inline"
   #C19 = dart.core::pragma {name:#C18, options:#C5}
   #C20 = 24
-  #C21 = <dart.core::int*>[#C20, #C15, #C20]
+  #C21 = <dart.core::int*>[#C20, #C20, #C15, #C20, #C20, #C20, #C15, #C20, #C20, #C20, #C20, #C15, #C20, #C20, #C20, #C20, #C20, #C20]
   #C22 = TypeLiteralConstant(lib::Y)
   #C23 = <dart.core::Type>[#C22, #C22, #C2]
   #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
   #C25 = dart.core::pragma {name:#C1, options:#C24}
   #C26 = 48
   #C27 = 32
-  #C28 = <dart.core::int*>[#C26, #C27, #C26]
+  #C28 = <dart.core::int*>[#C26, #C26, #C27, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C26, #C26]
   #C29 = 56
   #C30 = 36
-  #C31 = <dart.core::int*>[#C29, #C30, #C29]
+  #C31 = <dart.core::int*>[#C29, #C29, #C30, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C29, #C29]
 }
diff --git a/pkg/front_end/testcases/incremental/regress_46004.yaml.world.1.expect b/pkg/front_end/testcases/incremental/regress_46004.yaml.world.1.expect
index ef8614b..9cb7f28 100644
--- a/pkg/front_end/testcases/incremental/regress_46004.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/regress_46004.yaml.world.1.expect
@@ -55,12 +55,12 @@
   #C5 = dart.ffi::_FfiStructLayout {fieldTypes:#C3, packing:#C4}
   #C6 = dart.core::pragma {name:#C1, options:#C5}
   #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
+  #C8 = <dart.core::int*>[#C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7]
   #C9 = "vm:prefer-inline"
   #C10 = dart.core::pragma {name:#C9, options:#C4}
-  #C11 = 8
-  #C12 = 4
-  #C13 = <dart.core::int*>[#C11, #C12, #C12]
+  #C11 = 4
+  #C12 = 8
+  #C13 = <dart.core::int*>[#C11, #C12, #C11, #C12, #C12, #C12, #C11, #C12, #C12, #C11, #C12, #C11, #C12, #C12, #C12, #C12, #C11, #C12]
   #C14 = TypeLiteralConstant(lib::COMObject)
   #C15 = <dart.core::Type>[#C14]
   #C16 = dart.ffi::_FfiStructLayout {fieldTypes:#C15, packing:#C4}
diff --git a/pkg/front_end/testcases/incremental/regress_46004.yaml.world.2.expect b/pkg/front_end/testcases/incremental/regress_46004.yaml.world.2.expect
index ef8614b..9cb7f28 100644
--- a/pkg/front_end/testcases/incremental/regress_46004.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/regress_46004.yaml.world.2.expect
@@ -55,12 +55,12 @@
   #C5 = dart.ffi::_FfiStructLayout {fieldTypes:#C3, packing:#C4}
   #C6 = dart.core::pragma {name:#C1, options:#C5}
   #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
+  #C8 = <dart.core::int*>[#C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7]
   #C9 = "vm:prefer-inline"
   #C10 = dart.core::pragma {name:#C9, options:#C4}
-  #C11 = 8
-  #C12 = 4
-  #C13 = <dart.core::int*>[#C11, #C12, #C12]
+  #C11 = 4
+  #C12 = 8
+  #C13 = <dart.core::int*>[#C11, #C12, #C11, #C12, #C12, #C12, #C11, #C12, #C12, #C11, #C12, #C11, #C12, #C12, #C12, #C12, #C11, #C12]
   #C14 = TypeLiteralConstant(lib::COMObject)
   #C15 = <dart.core::Type>[#C14]
   #C16 = dart.ffi::_FfiStructLayout {fieldTypes:#C15, packing:#C4}
diff --git a/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect
index 1f2d2a4..6b19c1d 100644
--- a/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect
@@ -50,16 +50,16 @@
   #C7 = core::pragma {name:#C1, options:#C6}
   #C8 = ffi::Double {}
   #C9 = 0
-  #C10 = <core::int*>[#C9, #C9, #C9]
+  #C10 = <core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 8
-  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C12 = <core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = 16
-  #C14 = <core::int*>[#C13, #C13, #C13]
+  #C14 = <core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
   #C15 = "vm:prefer-inline"
   #C16 = core::pragma {name:#C15, options:#C5}
   #C17 = 24
   #C18 = 20
-  #C19 = <core::int*>[#C17, #C18, #C17]
+  #C19 = <core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17]
 }
 
 
diff --git a/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect
index 1f2d2a4..6b19c1d 100644
--- a/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect
@@ -50,16 +50,16 @@
   #C7 = core::pragma {name:#C1, options:#C6}
   #C8 = ffi::Double {}
   #C9 = 0
-  #C10 = <core::int*>[#C9, #C9, #C9]
+  #C10 = <core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 8
-  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C12 = <core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = 16
-  #C14 = <core::int*>[#C13, #C13, #C13]
+  #C14 = <core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
   #C15 = "vm:prefer-inline"
   #C16 = core::pragma {name:#C15, options:#C5}
   #C17 = 24
   #C18 = 20
-  #C19 = <core::int*>[#C17, #C18, #C17]
+  #C19 = <core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17]
 }
 
 
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.expect
index 0a88f78..0f9dc6d 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.expect
@@ -25,5 +25,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:136:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:137:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect
index 1513405..edf8c40 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect
@@ -42,8 +42,8 @@
   #C8 = core::pragma {name:#C1, options:#C7}
   #C9 = ffi::_ArraySize<ffi::NativeType> {dimension1:#C3, dimension2:#C6, dimension3:#C6, dimension4:#C6, dimension5:#C6, dimensions:#C6}
   #C10 = 0
-  #C11 = <core::int*>[#C10, #C10, #C10]
-  #C12 = <core::int*>[#C3, #C3, #C3]
+  #C11 = <core::int*>[#C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10]
+  #C12 = <core::int*>[#C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3]
   #C13 = <core::int*>[]
   #C14 = "vm:prefer-inline"
   #C15 = core::pragma {name:#C14, options:#C6}
@@ -52,5 +52,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:136:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:137:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.expect
index c47d067..732d282 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.expect
@@ -25,5 +25,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:136:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:137:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect
index ce41031..a445d62 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect
@@ -42,8 +42,8 @@
   #C8 = core::pragma {name:#C1, options:#C7}
   #C9 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C3, dimension2:#C6, dimension3:#C6, dimension4:#C6, dimension5:#C6, dimensions:#C6}
   #C10 = 0
-  #C11 = <core::int*>[#C10, #C10, #C10]
-  #C12 = <core::int*>[#C3, #C3, #C3]
+  #C11 = <core::int*>[#C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10]
+  #C12 = <core::int*>[#C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3]
   #C13 = <core::int*>[]
   #C14 = "vm:prefer-inline"
   #C15 = core::pragma {name:#C14, options:#C6}
@@ -52,5 +52,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:136:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:137:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.expect
index 0dd2727..eaeea63 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.expect
@@ -33,5 +33,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:136:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:137:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
index 1648007..c77db0d 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
@@ -67,8 +67,8 @@
   #C9 = 2
   #C10 = ffi::_ArraySize<ffi::NativeType> {dimension1:#C9, dimension2:#C9, dimension3:#C9, dimension4:#C6, dimension5:#C6, dimensions:#C6}
   #C11 = 0
-  #C12 = <core::int*>[#C11, #C11, #C11]
-  #C13 = <core::int*>[#C3, #C3, #C3]
+  #C12 = <core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
+  #C13 = <core::int*>[#C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3]
   #C14 = <core::int*>[#C9, #C9]
   #C15 = "vm:prefer-inline"
   #C16 = core::pragma {name:#C15, options:#C6}
@@ -84,5 +84,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:136:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:137:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.expect
index 8c3d96b..b6819cb 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.expect
@@ -33,5 +33,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:136:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:137:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect
index ca6f28b..7de8504 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect
@@ -67,8 +67,8 @@
   #C9 = 2
   #C10 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C9, dimension2:#C9, dimension3:#C9, dimension4:#C6, dimension5:#C6, dimensions:#C6}
   #C11 = 0
-  #C12 = <core::int*>[#C11, #C11, #C11]
-  #C13 = <core::int*>[#C3, #C3, #C3]
+  #C12 = <core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
+  #C13 = <core::int*>[#C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3]
   #C14 = <core::int*>[#C9, #C9]
   #C15 = "vm:prefer-inline"
   #C16 = core::pragma {name:#C15, options:#C6}
@@ -84,5 +84,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:136:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:137:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.strong.expect b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.strong.expect
index 1a2fe24..6095355 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.strong.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.strong.expect
@@ -37,13 +37,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
-// class D3 = A with TAlias<B>;
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:42:32: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // class D4 = A with B implements TAlias<C>;
 //                                ^
@@ -58,13 +51,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
-// class D5 extends A with TAlias<B> {}
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:46:13: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // mixin N1 on TAlias<A> {}
 //             ^
@@ -100,6 +86,20 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
+// class D3 = A with TAlias<B>;
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
+// class D5 extends A with TAlias<B> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:16:7: Error: The type 'AAlias' which is an alias of 'A?' can't be used as supertype because it is nullable.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
 // class C1 extends AAlias {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.strong.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.strong.transformed.expect
index 5dac514..62c7762 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.strong.transformed.expect
@@ -37,13 +37,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
-// class D3 = A with TAlias<B>;
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:42:32: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // class D4 = A with B implements TAlias<C>;
 //                                ^
@@ -58,13 +51,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
-// class D5 extends A with TAlias<B> {}
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:46:13: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // mixin N1 on TAlias<A> {}
 //             ^
@@ -100,6 +86,20 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
+// class D3 = A with TAlias<B>;
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
+// class D5 extends A with TAlias<B> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:16:7: Error: The type 'AAlias' which is an alias of 'A?' can't be used as supertype because it is nullable.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
 // class C1 extends AAlias {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.expect b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.expect
index 1a2fe24..6095355 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.expect
@@ -37,13 +37,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
-// class D3 = A with TAlias<B>;
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:42:32: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // class D4 = A with B implements TAlias<C>;
 //                                ^
@@ -58,13 +51,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
-// class D5 extends A with TAlias<B> {}
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:46:13: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // mixin N1 on TAlias<A> {}
 //             ^
@@ -100,6 +86,20 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
+// class D3 = A with TAlias<B>;
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
+// class D5 extends A with TAlias<B> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:16:7: Error: The type 'AAlias' which is an alias of 'A?' can't be used as supertype because it is nullable.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
 // class C1 extends AAlias {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.outline.expect b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.outline.expect
index a0cf738..22df973 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.outline.expect
@@ -37,13 +37,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
-// class D3 = A with TAlias<B>;
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:42:32: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // class D4 = A with B implements TAlias<C>;
 //                                ^
@@ -58,13 +51,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
-// class D5 extends A with TAlias<B> {}
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:46:13: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // mixin N1 on TAlias<A> {}
 //             ^
@@ -100,6 +86,20 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
+// class D3 = A with TAlias<B>;
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
+// class D5 extends A with TAlias<B> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:16:7: Error: The type 'AAlias' which is an alias of 'A?' can't be used as supertype because it is nullable.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
 // class C1 extends AAlias {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.transformed.expect
index 5dac514..62c7762 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.transformed.expect
@@ -37,13 +37,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
-// class D3 = A with TAlias<B>;
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:42:32: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // class D4 = A with B implements TAlias<C>;
 //                                ^
@@ -58,13 +51,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
-// class D5 extends A with TAlias<B> {}
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:46:13: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // mixin N1 on TAlias<A> {}
 //             ^
@@ -100,6 +86,20 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
+// class D3 = A with TAlias<B>;
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
+// class D5 extends A with TAlias<B> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:16:7: Error: The type 'AAlias' which is an alias of 'A?' can't be used as supertype because it is nullable.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
 // class C1 extends AAlias {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.weak.expect b/pkg/front_end/testcases/regress/issue_31171.dart.weak.expect
index af8ae54..7b520a3 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.weak.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.weak.expect
@@ -10,7 +10,7 @@
 // typedef T =
 //           ^
 //
-// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-type.
 // typedef T =
 //           ^
 //
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.weak.outline.expect b/pkg/front_end/testcases/regress/issue_31171.dart.weak.outline.expect
index d0b75ac..1b5d642 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.weak.outline.expect
@@ -10,7 +10,7 @@
 // typedef T =
 //           ^
 //
-// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-type.
 // typedef T =
 //           ^
 //
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.weak.transformed.expect b/pkg/front_end/testcases/regress/issue_31171.dart.weak.transformed.expect
index af8ae54..7b520a3 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.weak.transformed.expect
@@ -10,7 +10,7 @@
 // typedef T =
 //           ^
 //
-// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-type.
 // typedef T =
 //           ^
 //
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 3619d46..e35f2a1 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -6,6 +6,11 @@
 # Kernel ASTs directly, that is, code in pkg/fasta/lib/src/kernel/ with
 # strong-mode enabled.
 
+dart2js/late_fields: SemiFuzzFailure
+dart2js/late_from_dill/main: SemiFuzzFailure
+dart2js/late_statics: SemiFuzzFailure
+static_field_lowering/opt_in: SemiFuzzFailure
+
 constructor_tearoffs/call_instantiation: TypeCheckError
 constructor_tearoffs/lowering/invalid_redirect: VerificationError
 extension_types/access_setter_as_getter: ExpectationFileMismatchSerialized # Expected.
diff --git a/pkg/front_end/testcases/super_parameters/folder.options b/pkg/front_end/testcases/super_parameters/folder.options
new file mode 100644
index 0000000..b69b691
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/folder.options
@@ -0,0 +1 @@
+--enable-experiment=super-parameters
\ No newline at end of file
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart b/pkg/front_end/testcases/super_parameters/simple.dart
new file mode 100644
index 0000000..fad88d0
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 {
+  final int foo;
+  A(this.foo);
+}
+
+class B extends A {
+  B(super.foo);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.strong.expect b/pkg/front_end/testcases/super_parameters/simple.dart.strong.expect
new file mode 100644
index 0000000..a1ba70a
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.strong.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple.dart:11:3: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+//   B(super.foo);
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+}
+class B extends self::A {
+  constructor •(dynamic foo) → self::B
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple.dart:11:3: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+  B(super.foo);
+  ^"
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/simple.dart.strong.transformed.expect
new file mode 100644
index 0000000..a1ba70a
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.strong.transformed.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple.dart:11:3: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+//   B(super.foo);
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+}
+class B extends self::A {
+  constructor •(dynamic foo) → self::B
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple.dart:11:3: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+  B(super.foo);
+  ^"
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/simple.dart.textual_outline.expect
new file mode 100644
index 0000000..f0bc3ea
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.textual_outline.expect
@@ -0,0 +1,8 @@
+class A {
+  final int foo;
+  A(this.foo);
+}
+class B extends A {
+  B(super.foo);
+}
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.weak.expect b/pkg/front_end/testcases/super_parameters/simple.dart.weak.expect
new file mode 100644
index 0000000..a1ba70a
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.weak.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple.dart:11:3: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+//   B(super.foo);
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+}
+class B extends self::A {
+  constructor •(dynamic foo) → self::B
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple.dart:11:3: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+  B(super.foo);
+  ^"
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/simple.dart.weak.outline.expect
new file mode 100644
index 0000000..997a20e
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.weak.outline.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A
+    ;
+}
+class B extends self::A {
+  constructor •(dynamic foo) → self::B
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/simple.dart.weak.transformed.expect
new file mode 100644
index 0000000..a1ba70a
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.weak.transformed.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple.dart:11:3: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+//   B(super.foo);
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+}
+class B extends self::A {
+  constructor •(dynamic foo) → self::B
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple.dart:11:3: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+  B(super.foo);
+  ^"
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 0c51eb2..8d551bb 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -33,6 +33,7 @@
 general/bug31124: RuntimeError
 general/call: RuntimeError
 general/cascade: RuntimeError
+general/conditional_import: RuntimeError # Issue 47814
 general/constructor_initializer_invalid: RuntimeError
 general/covariant_field: TypeCheckError
 general/covariant_generic: RuntimeError
@@ -135,7 +136,7 @@
 inference_new/infer_assign_to_index_this_upwards: TypeCheckError
 inference_new/infer_assign_to_index_upwards: TypeCheckError
 late_lowering/covariant_late_field: TypeCheckError
-named_arguments_anywhere/redirecting_constructor_initializers: Crash # Issue 47524.
+named_arguments_anywhere/redirecting_constructor_initializers: TextSerializationFailure # Issue 47524.
 nnbd/covariant_late_field: TypeCheckError
 nnbd/getter_vs_setter_type: TypeCheckError
 nnbd/issue42603: TypeCheckError
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 260c55f..956276e 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -28,6 +28,8 @@
 constructor_tearoffs/new_as_selector: FormatterCrash
 dart2js/late_fields: FormatterCrash
 dart2js/late_statics: FormatterCrash
+enhanced_enums/entries_with_type_arguments: FormatterCrash
+enhanced_enums/qualified_names_with_no_type_arguments: FormatterCrash
 extension_types/basic_show: FormatterCrash
 extension_types/call_not_get: FormatterCrash
 extension_types/keyword_in_show_hide_element: FormatterCrash
@@ -88,6 +90,8 @@
 general/issue45490: FormatterCrash
 general/issue45700.crash: FormatterCrash
 general/issue47495: FormatterCrash
+general/issue47728_2: FormatterCrash
+general/issue47728_3: FormatterCrash
 general/many_errors: FormatterCrash
 general/missing_prefix_name: FormatterCrash
 general/new_as_selector: FormatterCrash
@@ -195,6 +199,7 @@
 regress/issue_39091_1: FormatterCrash
 regress/issue_41265.crash: Crash
 regress/issue_41265.crash: FormatterCrash
+super_parameters/simple: FormatterCrash
 triple_shift/invalid_operator: FormatterCrash
 variance/class_type_parameter_modifier: FormatterCrash
 variance/generic_covariance_sound_variance: FormatterCrash
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 3b2aaee..9c9ea5e 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -4,11 +4,20 @@
 
 # Status file for the weak_suite.dart test suite.
 
-general/platform_invalid_uris/main: SemiFuzzFailure
+dart2js/late_fields: SemiFuzzFailure
+dart2js/late_from_dill/main: SemiFuzzFailure
+dart2js/late_statics: SemiFuzzFailure
+dart2js/mixin_from_opt_in/main: SemiFuzzFailure
+dart2js/mixin_from_opt_in/main.no_link: SemiFuzzFailure
 general/error_recovery/issue_39058_prime.crash: SemiFuzzFailure
 general/error_recovery/issue_39202.crash: SemiFuzzCrash
 general/error_recovery/issue_39058.crash: SemiFuzzFailure
+general/issue47339: SemiFuzzCrash
+general/platform_invalid_uris/main: SemiFuzzFailure
+nnbd_mixed/mixin_from_opt_in/main: SemiFuzzFailure
+nnbd_mixed/mixin_from_opt_in/main.no_link: SemiFuzzFailure
 regress/utf_16_le_content.crash: SemiFuzzCrash
+static_field_lowering/opt_in: SemiFuzzFailure
 
 constructor_tearoffs/call_instantiation: TypeCheckError
 constructor_tearoffs/lowering/invalid_redirect: VerificationError
@@ -37,6 +46,7 @@
 general/bug31124: RuntimeError # Test has no main method (and we shouldn't add one).
 general/call: RuntimeError
 general/cascade: RuntimeError
+general/conditional_import: RuntimeError # Issue 47814
 general/constructor_initializer_invalid: RuntimeError # Fails execution after recovery
 general/covariant_field: TypeCheckError
 general/covariant_generic: RuntimeError
diff --git a/pkg/front_end/testing.json b/pkg/front_end/testing.json
index cc90a5b..11fca520 100644
--- a/pkg/front_end/testing.json
+++ b/pkg/front_end/testing.json
@@ -229,6 +229,17 @@
       "exclude": []
     },
     {
+      "name": "outline_extractor",
+      "kind": "Chain",
+      "source": "test/outline_extractor_suite.dart",
+      "path": "outline_extraction_testcases/",
+      "status": "outline_extraction_testcases/outline_extractor.status",
+      "pattern": [
+        "main\\.dart$"
+      ],
+      "exclude": []
+    },
+    {
       "name": "parser_equivalence",
       "kind": "Chain",
       "source": "test/parser_equivalence_suite.dart",
@@ -466,6 +477,7 @@
       "test/extensions/data/",
       "test/id_testing/data/",
       "test/language_versioning/data/",
+      "test/macros/data/",
       "test/patching/data",
       "test/predicates/data",
       "test/static_types/data/",
diff --git a/pkg/front_end/tool/_fasta/entry_points.dart b/pkg/front_end/tool/_fasta/entry_points.dart
index 2aa92c9..70b5606 100644
--- a/pkg/front_end/tool/_fasta/entry_points.dart
+++ b/pkg/front_end/tool/_fasta/entry_points.dart
@@ -126,7 +126,7 @@
 }
 
 class BatchCompiler {
-  final Stream<String> lines;
+  final Stream<String>? lines;
 
   Uri? platformUri;
 
@@ -137,7 +137,7 @@
   BatchCompiler(this.lines);
 
   Future<void> run() async {
-    await for (String line in lines) {
+    await for (String line in lines!) {
       try {
         if (await batchCompileArguments(
             new List<String>.from(jsonDecode(line)))) {
diff --git a/pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart b/pkg/front_end/tool/_fasta/parser_ast_helper_creator.dart
similarity index 89%
rename from pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart
rename to pkg/front_end/tool/_fasta/parser_ast_helper_creator.dart
index 301e0cb..b9999d6 100644
--- a/pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart
+++ b/pkg/front_end/tool/_fasta/parser_ast_helper_creator.dart
@@ -19,8 +19,8 @@
 }
 
 Uri computeAstHelperUri(Uri repoDir) {
-  return repoDir.resolve(
-      "pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart");
+  return repoDir
+      .resolve("pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart");
 }
 
 String generateAstHelper(Uri repoDir) {
@@ -55,27 +55,28 @@
 // ignore_for_file: lines_longer_than_80_chars
 
 // THIS FILE IS AUTO GENERATED BY
-// 'tool/_fasta/direct_parser_ast_helper_creator.dart'
+// 'tool/_fasta/parser_ast_helper_creator.dart'
 // Run this command to update it:
-// 'dart pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart'
+// 'dart pkg/front_end/tool/_fasta/parser_ast_helper_creator.dart'
 
-abstract class DirectParserASTContent {
+abstract class ParserAstNode {
   final String what;
-  final DirectParserASTType type;
+  final ParserAstType type;
   Map<String, Object?> get deprecatedArguments;
-  List<DirectParserASTContent>? children;
+  List<ParserAstNode>? children;
+  ParserAstNode? parent;
 
-  DirectParserASTContent(this.what, this.type);
+  ParserAstNode(this.what, this.type);
 
   // TODO(jensj): Compare two ASTs.
 }
 
-enum DirectParserASTType { BEGIN, END, HANDLE }
+enum ParserAstType { BEGIN, END, HANDLE }
 
-abstract class AbstractDirectParserASTListener implements Listener {
-  List<DirectParserASTContent> data = [];
+abstract class AbstractParserAstListener implements Listener {
+  List<ParserAstNode> data = [];
 
-  void seen(DirectParserASTContent entry);
+  void seen(ParserAstNode entry);
 
 """);
 
@@ -180,9 +181,9 @@
           throw "Unexpected.";
         }
 
-        String className = "DirectParserASTContent${name}${typeStringCamel}";
+        String className = "${name}${typeStringCamel}";
         sb.write("$className data = new $className(");
-        sb.write("DirectParserASTType.");
+        sb.write("ParserAstType.");
         sb.write(typeString);
         for (int i = 0; i < parameters.length; i++) {
           Parameter param = parameters[i];
@@ -197,9 +198,8 @@
         sb.write("seen(data);");
         sb.write("\n  ");
 
-        newClasses
-            .write("class DirectParserASTContent${name}${typeStringCamel} "
-                "extends DirectParserASTContent {\n");
+        newClasses.write("class ${name}${typeStringCamel} "
+            "extends ParserAstNode {\n");
 
         for (int i = 0; i < parameters.length; i++) {
           Parameter param = parameters[i];
@@ -211,8 +211,8 @@
           newClasses.write(';\n');
         }
         newClasses.write('\n');
-        newClasses.write("  DirectParserASTContent${name}${typeStringCamel}"
-            "(DirectParserASTType type");
+        newClasses.write("  ${name}${typeStringCamel}"
+            "(ParserAstType type");
         String separator = ", {";
         for (int i = 0; i < parameters.length; i++) {
           Parameter param = parameters[i];
@@ -265,7 +265,8 @@
   @override
   void endFormalParameter(
       Token? thisKeyword,
-      Token? periodAfterThis,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
       Token? initializerStart,
       Token? initializerEnd,
diff --git a/pkg/front_end/tool/dart_doctest_impl.dart b/pkg/front_end/tool/dart_doctest_impl.dart
index 1e51b84..64d0aa7 100644
--- a/pkg/front_end/tool/dart_doctest_impl.dart
+++ b/pkg/front_end/tool/dart_doctest_impl.dart
@@ -28,6 +28,7 @@
 
 import 'package:front_end/src/api_prototype/compiler_options.dart';
 import 'package:front_end/src/api_prototype/file_system.dart';
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
 import 'package:front_end/src/api_prototype/memory_file_system.dart';
 import 'package:front_end/src/api_prototype/standard_file_system.dart';
 import 'package:front_end/src/base/processed_options.dart';
@@ -160,8 +161,9 @@
     incrementalCompiler!.invalidate(processedOpts.packagesUri);
 
     Stopwatch stopwatch = new Stopwatch()..start();
-    kernel.Component component =
+    IncrementalCompilerResult compilerResult =
         await incrementalCompiler!.computeDelta(entryPoints: [uri]);
+    kernel.Component component = compilerResult.component;
     if (errors) {
       _print("Got errors in ${stopwatch.elapsedMilliseconds} ms.");
       return [
@@ -181,8 +183,9 @@
         .writeAsStringSync(mainFileContent);
 
     incrementalCompiler!.invalidate(dartDocMainUri);
-    kernel.Component componentMain = await incrementalCompiler!
+    IncrementalCompilerResult compilerMainResult = await incrementalCompiler!
         .computeDelta(entryPoints: [dartDocMainUri], fullComponent: true);
+    kernel.Component componentMain = compilerMainResult.component;
     if (errors) {
       _print("Got errors in ${stopwatch.elapsedMilliseconds} ms.");
       return [
@@ -794,37 +797,40 @@
 
   Future<kernel.Component> compileDartDocTestLibrary(
       String dartDocTestCode, Uri libraryUri) async {
-    assert(dillLoadedData != null && userCode != null);
+    assert(dillTargetForTesting != null && kernelTargetForTesting != null);
 
     return await context.runInContext((_) async {
-      LibraryBuilder libraryBuilder = userCode!.loader
-          .read(libraryUri, -1, accessor: userCode!.loader.first);
+      LibraryBuilder libraryBuilder = kernelTargetForTesting!.loader.read(
+          libraryUri, -1,
+          accessorUri: kernelTargetForTesting!.loader.firstUri);
 
-      userCode!.loader.resetSeenMessages();
+      kernelTargetForTesting!.loader.resetSeenMessages();
 
       _dartDocTestLibraryBuilder = libraryBuilder;
       _dartDocTestCode = dartDocTestCode;
 
       invalidate(dartDocTestUri);
-      kernel.Component result = await computeDelta(
+      IncrementalCompilerResult compilerResult = await computeDelta(
           entryPoints: [dartDocTestUri], fullComponent: true);
+      kernel.Component result = compilerResult.component;
       _dartDocTestLibraryBuilder = null;
       _dartDocTestCode = null;
 
-      userCode!.uriToSource.remove(dartDocTestUri);
-      userCode!.loader.sourceBytes.remove(dartDocTestUri);
+      kernelTargetForTesting!.uriToSource.remove(dartDocTestUri);
+      kernelTargetForTesting!.loader.sourceBytes.remove(dartDocTestUri);
 
       return result;
     });
   }
 
-  SourceLibraryBuilder createDartDocTestLibrary(LibraryBuilder libraryBuilder) {
+  SourceLibraryBuilder createDartDocTestLibrary(
+      SourceLoader loader, LibraryBuilder libraryBuilder) {
     SourceLibraryBuilder dartDocTestLibrary = new SourceLibraryBuilder(
       dartDocTestUri,
       dartDocTestUri,
       /*packageUri*/ null,
       new ImplicitLanguageVersion(libraryBuilder.library.languageVersion),
-      userCode!.loader,
+      loader,
       null,
       scope: libraryBuilder.scope.createNestedScope("dartdoctest"),
       nameOrigin: libraryBuilder,
@@ -901,13 +907,13 @@
       kernel.Library? referencesFrom,
       bool? referenceIsPartOwner) {
     if (uri == DocTestIncrementalCompiler.dartDocTestUri) {
-      HybridFileSystem hfs = compiler.userCode!.fileSystem as HybridFileSystem;
+      HybridFileSystem hfs = target.fileSystem as HybridFileSystem;
       MemoryFileSystem fs = hfs.memory;
       fs
           .entityForUri(DocTestIncrementalCompiler.dartDocTestUri)
           .writeAsStringSync(compiler._dartDocTestCode!);
-      return compiler
-          .createDartDocTestLibrary(compiler._dartDocTestLibraryBuilder!);
+      return compiler.createDartDocTestLibrary(
+          this, compiler._dartDocTestLibraryBuilder!);
     }
     return super.createLibraryBuilder(uri, fileUri, packageUri,
         packageLanguageVersion, origin, referencesFrom, referenceIsPartOwner);
diff --git a/pkg/front_end/tool/generate_ast_coverage.dart b/pkg/front_end/tool/generate_ast_coverage.dart
index d3a299b..833e707 100644
--- a/pkg/front_end/tool/generate_ast_coverage.dart
+++ b/pkg/front_end/tool/generate_ast_coverage.dart
@@ -2,8 +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.
 
-// @dart = 2.9
-
 import 'dart:io';
 
 import 'ast_model.dart';
@@ -21,7 +19,7 @@
   new File.fromUri(output).writeAsStringSync(result);
 }
 
-Future<String> generateAstCoverage(Uri repoDir, [AstModel astModel]) async {
+Future<String> generateAstCoverage(Uri repoDir, [AstModel? astModel]) async {
   astModel ??= await deriveAstModel(repoDir);
   return generateVisitor(astModel, new CoverageVisitorStrategy());
 }
@@ -47,7 +45,7 @@
 
   @override
   void handleVisit(AstModel astModel, AstClass astClass, StringBuffer sb) {
-    AstClass superAstClass = astClass.superclass;
+    AstClass? superAstClass = astClass.superclass;
     while (superAstClass != null && !superAstClass.isInterchangeable) {
       superAstClass = superAstClass.superclass;
     }
@@ -61,13 +59,13 @@
   @override
   void handleVisitReference(
       AstModel astModel, AstClass astClass, StringBuffer sb) {
-    AstClass superAstClass = astClass.superclass;
+    AstClass? superAstClass = astClass.superclass;
     while (superAstClass != null && !superAstClass.isInterchangeable) {
       superAstClass = superAstClass.superclass;
     }
     if (superAstClass == astModel.constantClass) {
       // Constants are only visited as references.
-      String innerName = superAstClass.name;
+      String innerName = superAstClass!.name;
       (nestedClassNames[innerName] ??= {}).add(astClass.name);
       sb.writeln('''
         visited.add(${innerName}Kind.${astClass.name});
diff --git a/pkg/front_end/tool/incremental_perf.dart b/pkg/front_end/tool/incremental_perf.dart
index e3dda75..6b91a96 100644
--- a/pkg/front_end/tool/incremental_perf.dart
+++ b/pkg/front_end/tool/incremental_perf.dart
@@ -125,7 +125,8 @@
   collector.start("Initial compilation");
   var generator = new IncrementalKernelGenerator(compilerOptions, entryUri);
 
-  var component = await generator.computeDelta();
+  var compilerResult = await generator.computeDelta();
+  var component = compilerResult.component;
   collector.stop("Initial compilation");
   if (verbose) {
     print("Libraries changed: ${component.libraries.length}");
@@ -139,7 +140,8 @@
     await applyEdits(
         changeSet.edits, overlayFs, generator, uriTranslator, verbose);
     collector.start(name);
-    component = await generator.computeDelta();
+    compilerResult = await generator.computeDelta();
+    component = compilerResult.component;
     collector.stop(name);
     if (verbose) {
       print("Change '${changeSet.name}' - "
diff --git a/pkg/front_end/tool/kernel_ast_file_rewriter.dart b/pkg/front_end/tool/kernel_ast_file_rewriter.dart
index 16f15e7..091640d 100644
--- a/pkg/front_end/tool/kernel_ast_file_rewriter.dart
+++ b/pkg/front_end/tool/kernel_ast_file_rewriter.dart
@@ -11,28 +11,27 @@
 import 'package:_fe_analyzer_shared/src/scanner/token.dart'
     show CommentToken, Token;
 
-import "package:front_end/src/fasta/util/direct_parser_ast.dart";
+import "package:front_end/src/fasta/util/parser_ast.dart";
 
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart';
 
 void main(List<String> args) {
   Uri uri = Platform.script;
   uri = uri.resolve("../../kernel/lib/ast.dart");
   Uint8List bytes = new File.fromUri(uri).readAsBytesSync();
-  DirectParserASTContentCompilationUnitEnd ast =
+  CompilationUnitEnd ast =
       getAST(bytes, includeBody: true, includeComments: true);
-  Map<String, DirectParserASTContentTopLevelDeclarationEnd> classes = {};
-  for (DirectParserASTContentTopLevelDeclarationEnd cls in ast.getClasses()) {
-    DirectParserASTContentIdentifierHandle identifier = cls.getIdentifier();
+  Map<String, TopLevelDeclarationEnd> classes = {};
+  for (TopLevelDeclarationEnd cls in ast.getClasses()) {
+    IdentifierHandle identifier = cls.getIdentifier();
     assert(classes[identifier.token] == null);
     classes[identifier.token.toString()] = cls;
   }
 
   Set<String?> goodNames = {"TreeNode"};
   Map<Token, Replacement> replacements = {};
-  for (MapEntry<String, DirectParserASTContentTopLevelDeclarationEnd> entry
-      in classes.entries) {
-    DirectParserASTContentTopLevelDeclarationEnd cls = entry.value;
+  for (MapEntry<String, TopLevelDeclarationEnd> entry in classes.entries) {
+    TopLevelDeclarationEnd cls = entry.value;
 
     // Simple "class hierarchy" to only work on TreeNodes.
     if (goodNames.contains(entry.key)) {
@@ -40,7 +39,7 @@
     } else {
       // Check if good.
       String? parent = getExtends(cls);
-      DirectParserASTContentTopLevelDeclarationEnd? parentCls = classes[parent];
+      TopLevelDeclarationEnd? parentCls = classes[parent];
       List<String?> allParents = [parent];
       while (
           parent != null && parentCls != null && !goodNames.contains(parent)) {
@@ -55,18 +54,15 @@
       }
     }
 
-    DirectParserASTContentClassDeclarationEnd classDeclaration =
-        cls.getClassDeclaration();
-    DirectParserASTContentClassOrMixinOrExtensionBodyEnd classOrMixinBody =
+    ClassDeclarationEnd classDeclaration = cls.getClassDeclaration();
+    ClassOrMixinOrExtensionBodyEnd classOrMixinBody =
         classDeclaration.getClassOrMixinOrExtensionBody();
 
     Set<String> namedClassConstructors = {};
     Set<String> namedFields = {};
-    for (DirectParserASTContentMemberEnd member
-        in classOrMixinBody.getMembers()) {
+    for (MemberEnd member in classOrMixinBody.getMembers()) {
       if (member.isClassConstructor()) {
-        DirectParserASTContentClassConstructorEnd constructor =
-            member.getClassConstructor();
+        ClassConstructorEnd constructor = member.getClassConstructor();
         Token nameToken = constructor.beginToken;
         // String name = nameToken.lexeme;
         if (nameToken.next!.lexeme == ".") {
@@ -78,9 +74,8 @@
           throw "Unexpected";
         }
       } else if (member.isClassFields()) {
-        DirectParserASTContentClassFieldsEnd classFields =
-            member.getClassFields();
-        Token identifierToken = classFields.getFieldIdentifiers().single!.token;
+        ClassFieldsEnd classFields = member.getClassFields();
+        Token identifierToken = classFields.getFieldIdentifiers().single.token;
         String identifier = identifierToken.toString();
         namedFields.add(identifier);
       }
@@ -94,8 +89,7 @@
           classBraceToken, classBraceToken, "{\n  bool frozen = false;");
     }
 
-    for (DirectParserASTContentMemberEnd member
-        in classOrMixinBody.getMembers()) {
+    for (MemberEnd member in classOrMixinBody.getMembers()) {
       if (member.isClassConstructor()) {
         processConstructor(
             member, replacements, namedClassConstructors, namedFields);
@@ -143,16 +137,16 @@
 }
 
 void processField(
-    DirectParserASTContentMemberEnd member,
-    MapEntry<String, DirectParserASTContentTopLevelDeclarationEnd> entry,
+    MemberEnd member,
+    MapEntry<String, TopLevelDeclarationEnd> entry,
     Map<Token, Replacement> replacements) {
-  DirectParserASTContentClassFieldsEnd classFields = member.getClassFields();
+  ClassFieldsEnd classFields = member.getClassFields();
 
   if (classFields.count != 1) {
     throw "Notice ${classFields.count}";
   }
 
-  Token identifierToken = classFields.getFieldIdentifiers().single!.token;
+  Token identifierToken = classFields.getFieldIdentifiers().single.token;
   String identifier = identifierToken.toString();
 
   if (identifier == "frozen" && entry.key == "TreeNode") return;
@@ -165,7 +159,7 @@
     isFinal = true;
   }
 
-  DirectParserASTContentTypeHandle? type = classFields.getFirstType();
+  TypeHandle? type = classFields.getFirstType();
   String typeString = "dynamic";
   if (type != null) {
     Token token = type.beginToken;
@@ -177,8 +171,7 @@
     typeString = typeString.trim();
   }
 
-  DirectParserASTContentFieldInitializerEnd? initializer =
-      classFields.getFieldInitializer();
+  FieldInitializerEnd? initializer = classFields.getFieldInitializer();
   String initializerString = "";
   if (initializer != null) {
     Token token = initializer.assignment;
@@ -240,19 +233,13 @@
   }
 }
 
-void processConstructor(
-    DirectParserASTContentMemberEnd member,
-    Map<Token, Replacement> replacements,
-    Set<String> namedClassConstructors,
-    Set<String> namedFields) {
-  DirectParserASTContentClassConstructorEnd constructor =
-      member.getClassConstructor();
-  DirectParserASTContentFormalParametersEnd formalParameters =
-      constructor.getFormalParameters();
-  List<DirectParserASTContentFormalParameterEnd> parameters =
-      formalParameters.getFormalParameters();
+void processConstructor(MemberEnd member, Map<Token, Replacement> replacements,
+    Set<String> namedClassConstructors, Set<String> namedFields) {
+  ClassConstructorEnd constructor = member.getClassConstructor();
+  FormalParametersEnd formalParameters = constructor.getFormalParameters();
+  List<FormalParameterEnd> parameters = formalParameters.getFormalParameters();
 
-  for (DirectParserASTContentFormalParameterEnd parameter in parameters) {
+  for (FormalParameterEnd parameter in parameters) {
     Token token = parameter.getBegin().token;
     if (token.lexeme != "this") {
       continue;
@@ -262,14 +249,14 @@
     replacements[afterDot] = new Replacement(afterDot, afterDot, "_$afterDot");
   }
 
-  DirectParserASTContentOptionalFormalParametersEnd? optionalFormalParameters =
+  OptionalFormalParametersEnd? optionalFormalParameters =
       formalParameters.getOptionalFormalParameters();
   Set<String> addInitializers = {};
   if (optionalFormalParameters != null) {
-    List<DirectParserASTContentFormalParameterEnd> parameters =
+    List<FormalParameterEnd> parameters =
         optionalFormalParameters.getFormalParameters();
 
-    for (DirectParserASTContentFormalParameterEnd parameter in parameters) {
+    for (FormalParameterEnd parameter in parameters) {
       Token token = parameter.getBegin().token;
       if (token.lexeme != "this") {
         continue;
@@ -284,15 +271,12 @@
     }
   }
 
-  DirectParserASTContentInitializersEnd? initializers =
-      constructor.getInitializers();
+  InitializersEnd? initializers = constructor.getInitializers();
 
   // First patch up any existing initializers.
   if (initializers != null) {
-    List<DirectParserASTContentInitializerEnd> actualInitializers =
-        initializers.getInitializers();
-    for (DirectParserASTContentInitializerEnd initializer
-        in actualInitializers) {
+    List<InitializerEnd> actualInitializers = initializers.getInitializers();
+    for (InitializerEnd initializer in actualInitializers) {
       Token token = initializer.getBegin().token;
       // This is only afterDot if there's a dot --- which (probably) is
       // only there if there's a `this`.
@@ -318,8 +302,8 @@
       } else if (token.lexeme == "super") {
         // Don't try to patch this one.
       } else if (token.lexeme == "assert") {
-        List<DirectParserASTContentIdentifierHandle> identifiers = initializer
-            .recursivelyFind<DirectParserASTContentIdentifierHandle>();
+        List<IdentifierHandle> identifiers =
+            initializer.recursivelyFind<IdentifierHandle>();
         for (Token token in identifiers.map((e) => e.token)) {
           if (namedFields.contains(token.lexeme)) {
             replacements[token] = new Replacement(token, token, "_$token");
@@ -345,7 +329,7 @@
   } else if (addInitializers.isNotEmpty) {
     // Add to existing initializer list. We add them as the first one(s)
     // so we don't have to insert before the potential super call.
-    DirectParserASTContentInitializersBegin firstOne = initializers!.getBegin();
+    InitializersBegin firstOne = initializers!.getBegin();
     Token colon = firstOne.token;
     assert(colon.lexeme == ":");
     String initializerString =
@@ -365,13 +349,12 @@
   //    C(this.field1) : field2 = field1 + 1;
   //  }
   if (addInitializers.isNotEmpty) {
-    DirectParserASTContentBlockFunctionBodyEnd? blockFunctionBody =
+    BlockFunctionBodyEnd? blockFunctionBody =
         constructor.getBlockFunctionBody();
     if (blockFunctionBody != null) {
-      List<DirectParserASTContentIdentifierHandle> identifiers =
-          blockFunctionBody
-              .recursivelyFind<DirectParserASTContentIdentifierHandle>();
-      for (DirectParserASTContentIdentifierHandle identifier in identifiers) {
+      List<IdentifierHandle> identifiers =
+          blockFunctionBody.recursivelyFind<IdentifierHandle>();
+      for (IdentifierHandle identifier in identifiers) {
         Token token = identifier.token;
         IdentifierContext context = identifier.context;
         if (namedFields.contains(token.lexeme) &&
@@ -395,12 +378,10 @@
   Replacement(this.beginToken, this.endToken, this.replacement);
 }
 
-String? getExtends(DirectParserASTContentTopLevelDeclarationEnd cls) {
-  DirectParserASTContentClassDeclarationEnd classDeclaration =
-      cls.getClassDeclaration();
+String? getExtends(TopLevelDeclarationEnd cls) {
+  ClassDeclarationEnd classDeclaration = cls.getClassDeclaration();
 
-  DirectParserASTContentClassExtendsHandle classExtends =
-      classDeclaration.getClassExtends();
+  ClassExtendsHandle classExtends = classDeclaration.getClassExtends();
   Token? extendsKeyword = classExtends.extendsKeyword;
   if (extendsKeyword == null) {
     return null;
@@ -409,15 +390,14 @@
   }
 }
 
-void debugDumpNode(DirectParserASTContent node) {
+void debugDumpNode(ParserAstNode node) {
   node.children!.forEach((element) {
     print("${element.what} (${element.deprecatedArguments}) "
         "(${element.children})");
   });
 }
 
-void debugDumpNodeRecursively(DirectParserASTContent node,
-    {String indent = ""}) {
+void debugDumpNodeRecursively(ParserAstNode node, {String indent = ""}) {
   print("$indent${node.what} (${node.deprecatedArguments})");
   if (node.children == null) return;
   node.children!.forEach((element) {
diff --git a/pkg/front_end/tool/parser_direct_ast/viewer.dart b/pkg/front_end/tool/parser_direct_ast/viewer.dart
index aeee1b5..8650f0f 100644
--- a/pkg/front_end/tool/parser_direct_ast/viewer.dart
+++ b/pkg/front_end/tool/parser_direct_ast/viewer.dart
@@ -5,9 +5,9 @@
 import "dart:io" show File, Platform;
 import "dart:typed_data" show Uint8List;
 
-import "package:front_end/src/fasta/util/direct_parser_ast.dart" show getAST;
-import "package:front_end/src/fasta/util/direct_parser_ast_helper.dart"
-    show DirectParserASTContent, DirectParserASTType;
+import "package:front_end/src/fasta/util/parser_ast.dart" show getAST;
+import "package:front_end/src/fasta/util/parser_ast_helper.dart"
+    show ParserAstNode, ParserAstType;
 
 import "console_helper.dart";
 
@@ -17,7 +17,7 @@
     uri = Uri.base.resolve(args.first);
   }
   Uint8List bytes = new File.fromUri(uri).readAsBytesSync();
-  DirectParserASTContent ast = getAST(bytes);
+  ParserAstNode ast = getAST(bytes, enableExtensionMethods: true);
 
   Widget widget = new QuitOnQWidget(
     new WithSingleLineBottomWidget(
@@ -33,7 +33,7 @@
 
 class PrintedLine {
   final String text;
-  final DirectParserASTContent? ast;
+  final ParserAstNode? ast;
   final List<PrintedLine>? parentShown;
   final int? selected;
 
@@ -53,21 +53,21 @@
   late List<PrintedLine> shown;
   int selected = 0;
 
-  AstWidget(DirectParserASTContent ast) {
+  AstWidget(ParserAstNode ast) {
     shown = [new PrintedLine.ast(ast, textualize(ast))];
   }
 
-  String textualize(DirectParserASTContent element,
+  String textualize(ParserAstNode element,
       {bool indent: false, bool withEndHeader: false}) {
     String header;
     switch (element.type) {
-      case DirectParserASTType.BEGIN:
+      case ParserAstType.BEGIN:
         header = "begin";
         break;
-      case DirectParserASTType.HANDLE:
+      case ParserAstType.HANDLE:
         header = "handle";
         break;
-      case DirectParserASTType.END:
+      case ParserAstType.END:
         header = withEndHeader ? "end" : "";
         break;
     }
@@ -114,7 +114,7 @@
       selected = selectedElement.selected!;
     } else {
       shown = [new PrintedLine.parent(shown, selected)];
-      List<DirectParserASTContent>? children = selectedElement.ast!.children;
+      List<ParserAstNode>? children = selectedElement.ast!.children;
       if (children != null) {
         for (int i = 0; i < children.length; i++) {
           shown.add(new PrintedLine.ast(
diff --git a/pkg/frontend_server/lib/compute_kernel.dart b/pkg/frontend_server/lib/compute_kernel.dart
index a75573e..3fd7f05 100644
--- a/pkg/frontend_server/lib/compute_kernel.dart
+++ b/pkg/frontend_server/lib/compute_kernel.dart
@@ -15,6 +15,7 @@
 import 'package:build_integration/file_system/multi_root.dart';
 import 'package:compiler/src/kernel/dart2js_target.dart';
 import 'package:dev_compiler/src/kernel/target.dart';
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
 import 'package:front_end/src/api_unstable/bazel_worker.dart' as fe;
 import 'package:kernel/ast.dart' show Component, Library, Reference;
 import 'package:kernel/target/targets.dart';
@@ -56,12 +57,17 @@
       defaultsTo: true,
       negatable: true,
       help: 'Whether to only build summary files.')
+  ..addFlag('summary',
+      defaultsTo: true,
+      negatable: true,
+      help: 'Whether or not to build summary files.')
   ..addOption('target',
       allowed: const [
         'vm',
         'flutter',
         'flutter_runner',
         'dart2js',
+        'dart2js_summary',
         'ddc',
       ],
       help: 'Build kernel for the vm, flutter, flutter_runner, dart2js or ddc')
@@ -136,6 +142,10 @@
       ? fe.NnbdMode.Strong
       : fe.NnbdMode.Weak;
   var summaryOnly = parsedArgs['summary-only'] as bool;
+  var summary = parsedArgs['summary'] as bool;
+  if (summaryOnly && !summary) {
+    throw new ArgumentError('--summary-only conflicts with --no-summary');
+  }
   var trackWidgetCreation = parsedArgs['track-widget-creation'] as bool;
 
   // TODO(sigmund,jakemac): make target mandatory. We allow null to be backwards
@@ -174,6 +184,14 @@
             'error: --summary-only not supported for the dart2js target');
       }
       break;
+    case 'dart2js_summary':
+      target = new Dart2jsSummaryTarget(
+          'dart2js', sources, excludeNonSources, targetFlags);
+      if (!summaryOnly) {
+        out.writeln(
+            'error: --no-summary-only not supported for the dart2js summary target');
+      }
+      break;
     case 'ddc':
       // TODO(jakemac):If `generateKernel` changes to return a summary
       // component, process the component instead.
@@ -268,12 +286,16 @@
   bool wroteUsedDills = false;
   if (usingIncrementalCompiler) {
     state.options.onDiagnostic = onDiagnostic;
-    Component incrementalComponent = await state.incrementalCompiler
-        .computeDelta(entryPoints: sources, fullComponent: true);
+    IncrementalCompilerResult incrementalCompilerResult =
+        await state.incrementalCompiler.computeDelta(
+            entryPoints: sources,
+            fullComponent: true,
+            trackNeededDillLibraries: recordUsedInputs);
+    Component incrementalComponent = incrementalCompilerResult.component;
 
     if (recordUsedInputs) {
       Set<Uri> usedOutlines = {};
-      for (Library lib in state.incrementalCompiler.neededDillLibraries) {
+      for (Library lib in incrementalCompilerResult.neededDillLibraries) {
         if (lib.importUri.scheme == "dart") continue;
         Uri uri = state.libraryToInputDill[lib.importUri];
         if (uri == null) {
@@ -312,8 +334,8 @@
     kernel = await fe.compileSummary(state, sources, onDiagnostic,
         includeOffsets: false);
   } else {
-    Component component =
-        await fe.compileComponent(state, sources, onDiagnostic);
+    Component component = await fe
+        .compileComponent(state, sources, onDiagnostic, buildSummary: summary);
     kernel = fe.serializeComponent(component,
         filter: excludeNonSources
             ? (library) => sources.contains(library.importUri)
@@ -358,47 +380,13 @@
   }
 }
 
-/// Extends the DevCompilerTarget to transform outlines to meet the requirements
-/// of summaries in bazel and package-build.
-///
-/// Build systems like package-build may provide the same input file twice to
-/// the summary worker, but only intends to have it in one output summary.  The
-/// convention is that if it is listed as a source, it is intended to be part of
-/// the output, if the source file was loaded as a dependency, then it was
-/// already included in a different summary.  The transformation below ensures
-/// that the output summary doesn't include those implicit inputs.
-///
-/// Note: this transformation is destructive and is only intended to be used
-/// when generating summaries.
-class DevCompilerSummaryTarget extends DevCompilerTarget {
+class DevCompilerSummaryTarget extends DevCompilerTarget with SummaryMixin {
   final List<Uri> sources;
   final bool excludeNonSources;
 
   DevCompilerSummaryTarget(
       this.sources, this.excludeNonSources, TargetFlags targetFlags)
       : super(targetFlags);
-
-  @override
-  void performOutlineTransformations(Component component) {
-    super.performOutlineTransformations(component);
-    if (!excludeNonSources) return;
-
-    List<Library> libraries = new List.from(component.libraries);
-    component.libraries.clear();
-    Set<Uri> include = sources.toSet();
-    for (var lib in libraries) {
-      if (include.contains(lib.importUri)) {
-        component.libraries.add(lib);
-      } else {
-        // Excluding the library also means that their canonical names will not
-        // be computed as part of serialization, so we need to do that
-        // preemtively here to avoid errors when serializing references to
-        // elements of these libraries.
-        component.root.getChildFromUri(lib.importUri).bindTo(lib.reference);
-        lib.computeCanonicalNames();
-      }
-    }
-  }
 }
 
 Uri toUri(String uriString) {
diff --git a/pkg/frontend_server/lib/frontend_server.dart b/pkg/frontend_server/lib/frontend_server.dart
index 9545afb..706448e 100644
--- a/pkg/frontend_server/lib/frontend_server.dart
+++ b/pkg/frontend_server/lib/frontend_server.dart
@@ -111,6 +111,13 @@
           'initialize from, but it can be overwritten here.',
       defaultsTo: null,
       hide: true)
+  ..addFlag('assume-initialize-from-dill-up-to-date',
+      help: 'Normally the dill used for initializing is checked against the '
+          "files it was compiled against. If we somehow know that it's "
+          'up-to-date we can skip it safely. Under normal circumstances this '
+          "isn't safe though.",
+      defaultsTo: false,
+      hide: true)
   ..addMultiOption('define',
       abbr: 'D',
       help: 'The values for the environment constants (e.g. -Dkey=value).',
@@ -357,6 +364,7 @@
   String _kernelBinaryFilenameIncremental;
   String _kernelBinaryFilenameFull;
   String _initializeFromDill;
+  bool _assumeInitializeFromDillUpToDate;
 
   Set<Uri> previouslyReportedDependencies = Set<Uri>();
 
@@ -412,6 +420,8 @@
     _kernelBinaryFilename = _kernelBinaryFilenameFull;
     _initializeFromDill =
         _options['initialize-from-dill'] ?? _kernelBinaryFilenameFull;
+    _assumeInitializeFromDillUpToDate =
+        _options['assume-initialize-from-dill-up-to-date'] ?? false;
     _printIncrementalDependencies = _options['print-incremental-dependencies'];
     final String boundaryKey = Uuid().generateV4();
     _outputStream.writeln('result $boundaryKey');
@@ -517,13 +527,14 @@
       _compilerOptions.omitPlatform = false;
       _generator = generator ?? _createGenerator(Uri.file(_initializeFromDill));
       await invalidateIfInitializingFromDill();
-      Component component =
+      IncrementalCompilerResult compilerResult =
           await _runWithPrintRedirection(() => _generator.compile());
+      Component component = compilerResult.component;
       results = KernelCompilationResults(
           component,
           const {},
-          _generator.getClassHierarchy(),
-          _generator.getCoreTypes(),
+          compilerResult.classHierarchy,
+          compilerResult.coreTypes,
           component.uriToSource.keys);
 
       incrementalSerializer = _generator.incrementalSerializer;
@@ -706,6 +717,7 @@
   }
 
   Future<Null> invalidateIfInitializingFromDill() async {
+    if (_assumeInitializeFromDillUpToDate) return null;
     if (_kernelBinaryFilename != _kernelBinaryFilenameFull) return null;
     // If the generator is initialized, it's not going to initialize from dill
     // again anyway, so there's no reason to spend time invalidating what should
@@ -772,7 +784,9 @@
     }
     errors.clear();
 
-    Component deltaProgram = await _generator.compile(entryPoint: _mainSource);
+    IncrementalCompilerResult deltaProgramResult =
+        await _generator.compile(entryPoint: _mainSource);
+    Component deltaProgram = deltaProgramResult.component;
     if (deltaProgram != null && transformer != null) {
       transformer.transform(deltaProgram);
     }
@@ -780,8 +794,8 @@
     KernelCompilationResults results = KernelCompilationResults(
         deltaProgram,
         const {},
-        _generator.getClassHierarchy(),
-        _generator.getCoreTypes(),
+        deltaProgramResult.classHierarchy,
+        deltaProgramResult.coreTypes,
         deltaProgram.uriToSource.keys);
 
     if (_compilerOptions.target.name == 'dartdevc') {
@@ -860,7 +874,8 @@
         .logMs('Compiling expression to JavaScript in $moduleName');
 
     final kernel2jsCompiler = cachedProgramCompilers[moduleName];
-    Component component = _generator.lastKnownGoodComponent;
+    IncrementalCompilerResult compilerResult = _generator.lastKnownGoodResult;
+    Component component = compilerResult.component;
     component.computeCanonicalNames();
 
     _processedOptions.ticker.logMs('Computed component');
@@ -1044,9 +1059,9 @@
     }
     final String singleModifiedClassName =
         _widgetCache.checkSingleWidgetTypeModified(
-      _generator.lastKnownGoodComponent,
+      _generator.lastKnownGoodResult?.component,
       partialComponent,
-      _generator.getClassHierarchy(),
+      _generator.lastKnownGoodResult?.classHierarchy,
     );
     final File outputFile = File('$_kernelBinaryFilename.widget_cache');
     if (singleModifiedClassName != null) {
diff --git a/pkg/frontend_server/test/frontend_server_test.dart b/pkg/frontend_server/test/frontend_server_test.dart
index a586bf7..35f6315 100644
--- a/pkg/frontend_server/test/frontend_server_test.dart
+++ b/pkg/frontend_server/test/frontend_server_test.dart
@@ -3,6 +3,7 @@
 import 'dart:io';
 import 'dart:isolate';
 
+import 'package:front_end/src/api_unstable/vm.dart';
 import 'package:kernel/binary/ast_to_binary.dart';
 import 'package:kernel/ast.dart' show Component;
 import 'package:kernel/kernel.dart' show loadComponentFromBinary;
@@ -420,10 +421,12 @@
 
       final _MockedIncrementalCompiler generator = _MockedIncrementalCompiler();
       when(generator.initialized).thenAnswer((_) => false);
-      when(generator.compile())
-          .thenAnswer((_) => Future<Component>.value(Component()));
-      when(generator.compile(entryPoint: anyNamed("entryPoint")))
-          .thenAnswer((_) => Future<Component>.value(Component()));
+      when(generator.compile()).thenAnswer((_) =>
+          Future<IncrementalCompilerResult>.value(
+              IncrementalCompilerResult(Component())));
+      when(generator.compile(entryPoint: anyNamed("entryPoint"))).thenAnswer(
+          (_) => Future<IncrementalCompilerResult>.value(
+              IncrementalCompilerResult(Component())));
       final _MockedBinaryPrinterFactory printerFactory =
           _MockedBinaryPrinterFactory();
       when(printerFactory.newBinaryPrinter(any))
diff --git a/pkg/js/analysis_options.yaml b/pkg/js/analysis_options.yaml
index afaa4eb..21a6ace 100644
--- a/pkg/js/analysis_options.yaml
+++ b/pkg/js/analysis_options.yaml
@@ -1,8 +1,8 @@
 include: package:pedantic/analysis_options.yaml
 
 analyzer:
-  strong-mode:
-    implicit-casts: false
+  language:
+    strict-casts: true
 
 linter:
   rules:
diff --git a/pkg/js_ast/lib/src/nodes.dart b/pkg/js_ast/lib/src/nodes.dart
index b84ef51..0d4e490 100644
--- a/pkg/js_ast/lib/src/nodes.dart
+++ b/pkg/js_ast/lib/src/nodes.dart
@@ -436,12 +436,12 @@
   R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg);
   void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg);
 
-  // Shallow clone of node.  Does not clone positions since the only use of this
-  // private method is create a copy with a new position.
+  /// Shallow clone of node.  Does not clone positions since the only use of
+  /// this private method is create a copy with a new position.
   Node _clone();
 
-  // Returns a node equivalent to [this], but with new source position and end
-  // source position.
+  /// Returns a node equivalent to [this], but with new source position and end
+  /// source position.
   Node withSourceInformation(
       JavaScriptNodeSourceInformation sourceInformation) {
     if (sourceInformation == _sourceInformation) {
@@ -456,13 +456,23 @@
 
   bool get isCommaOperator => false;
 
-  bool get isFinalized => true;
-
   Statement toStatement() {
     throw UnsupportedError('toStatement');
   }
 
   String debugPrint() => DebugPrint(this);
+
+  /// Some nodes, e.g. DeferredExpression, become finalized in a 'linking'
+  /// phase.
+  bool get isFinalized => true;
+
+  /// If a node is not finalized, debug printing can print something indicative
+  /// of the node instead of the finalized AST. This method returns the
+  /// replacement text.
+  String nonfinalizedDebugText() {
+    assert(!isFinalized);
+    return '$runtimeType';
+  }
 }
 
 class Program extends Node {
diff --git a/pkg/js_ast/lib/src/printer.dart b/pkg/js_ast/lib/src/printer.dart
index 5c5620e..0f3c329 100644
--- a/pkg/js_ast/lib/src/printer.dart
+++ b/pkg/js_ast/lib/src/printer.dart
@@ -45,6 +45,10 @@
   /// [enterNode] is called in post-traversal order.
   void exitNode(
       Node node, int startPosition, int endPosition, int closingPosition) {}
+
+  /// Should return `true` if the printing tolerates unfinalized deferred AST
+  /// nodes.
+  bool get isDebugContext => false;
 }
 
 /// A simple implementation of [JavaScriptPrintingContext] suitable for tests.
@@ -58,9 +62,13 @@
   String getText() => buffer.toString();
 }
 
+class _DebugJavaScriptPrintingContext extends SimpleJavaScriptPrintingContext {
+  bool get isDebugContext => true;
+}
+
 String DebugPrint(Node node, {bool utf8 = false}) {
   JavaScriptPrintingOptions options = JavaScriptPrintingOptions(utf8: utf8);
-  SimpleJavaScriptPrintingContext context = SimpleJavaScriptPrintingContext();
+  SimpleJavaScriptPrintingContext context = _DebugJavaScriptPrintingContext();
   Printer printer = Printer(options, context);
   printer.visit(node);
   return context.getText();
@@ -72,6 +80,7 @@
   final bool shouldCompressOutput;
   final DanglingElseVisitor danglingElseVisitor;
   final LocalNamer localNamer;
+  final bool isDebugContext;
 
   int _charCount = 0;
   bool inForInit = false;
@@ -90,6 +99,7 @@
   Printer(JavaScriptPrintingOptions options, JavaScriptPrintingContext context)
       : options = options,
         context = context,
+        isDebugContext = context.isDebugContext,
         shouldCompressOutput = options.shouldCompressOutput,
         danglingElseVisitor = DanglingElseVisitor(context),
         localNamer = determineRenamer(
@@ -220,7 +230,9 @@
   void startNode(Node node) {
     currentNode = EnterExitNode(currentNode, node);
     if (node is DeferredExpression) {
-      startNode(node.value);
+      if (!isDebugContext || node.isFinalized) {
+        startNode(node.value);
+      }
     }
   }
 
@@ -230,7 +242,9 @@
 
   void endNode(Node node) {
     if (node is DeferredExpression) {
-      endNode(node.value);
+      if (!isDebugContext || node.isFinalized) {
+        endNode(node.value);
+      }
     }
     assert(currentNode.node == node);
     currentNode = currentNode.exitNode(context, _charCount);
@@ -259,6 +273,12 @@
     nodes.forEach(visit);
   }
 
+  Node _undefer(Node node) {
+    if (isDebugContext && !node.isFinalized) return node;
+    if (node is DeferredExpression) return _undefer(node.value);
+    return node;
+  }
+
   @override
   void visitProgram(Program program) {
     if (program.body.isNotEmpty) {
@@ -657,10 +677,12 @@
 
   visitNestedExpression(Expression node, int requiredPrecedence,
       {bool newInForInit, bool newAtStatementBegin}) {
+    int precedenceLevel =
+        (isDebugContext && !node.isFinalized) ? CALL : node.precedenceLevel;
     bool needsParentheses =
         // a - (b + c).
         (requiredPrecedence != EXPRESSION &&
-                node.precedenceLevel < requiredPrecedence) ||
+                precedenceLevel < requiredPrecedence) ||
             // for (a = (x in o); ... ; ... ) { ... }
             (newInForInit && node is Binary && node.op == "in") ||
             // (function() { ... })().
@@ -720,9 +742,10 @@
     }
   }
 
-  static bool _isSmallInitialization(Node node) {
+  bool _isSmallInitialization(Node node) {
     if (node is VariableInitialization) {
-      Node value = undefer(node.value);
+      if (node.value == null) return true;
+      Node value = _undefer(node.value);
       if (value == null) return true;
       if (value is This) return true;
       if (value is LiteralNull) return true;
@@ -755,8 +778,9 @@
     /// `++a` and `a += b` in the face of [DeferredExpression]s we detect the
     /// pattern of the undeferred assignment.
     String op = assignment.op;
-    Node leftHandSide = undefer(assignment.leftHandSide);
-    Node rightHandSide = undefer(assignment.value);
+    Node leftHandSide = _undefer(assignment.leftHandSide);
+    Node value = assignment.value;
+    Node rightHandSide = value == null ? value : _undefer(value);
     if ((op == '+' || op == '-') &&
         leftHandSide is VariableUse &&
         rightHandSide is LiteralNumber &&
@@ -768,8 +792,8 @@
     if (!assignment.isCompound &&
         leftHandSide is VariableUse &&
         rightHandSide is Binary) {
-      Node rLeft = undefer(rightHandSide.left);
-      Node rRight = undefer(rightHandSide.right);
+      Node rLeft = _undefer(rightHandSide.left);
+      Node rRight = _undefer(rightHandSide.right);
       String op = rightHandSide.op;
       if (op == '+' ||
           op == '-' ||
@@ -804,12 +828,12 @@
     }
     visitNestedExpression(assignment.leftHandSide, CALL,
         newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
-    if (assignment.value != null) {
+    if (value != null) {
       spaceOut();
       if (op != null) out(op);
       out("=");
       spaceOut();
-      visitNestedExpression(assignment.value, ASSIGNMENT,
+      visitNestedExpression(value, ASSIGNMENT,
           newInForInit: inForInit, newAtStatementBegin: false);
     }
   }
@@ -1045,15 +1069,23 @@
     visitNestedExpression(access.receiver, CALL,
         newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
 
-    Node selector = undefer(access.selector);
+    Node selector = _undefer(access.selector);
+    if (isDebugContext && !selector.isFinalized) {
+      _dotString(
+          access.selector, access.receiver, selector.nonfinalizedDebugText(),
+          assumeValid: true);
+      return;
+    }
     if (selector is LiteralString) {
       _dotString(access.selector, access.receiver, selector.value);
       return;
-    } else if (selector is StringConcatenation) {
+    }
+    if (selector is StringConcatenation) {
       _dotString(access.selector, access.receiver,
-          _StringContentsCollector().collect(selector));
+          _StringContentsCollector(isDebugContext).collect(selector));
       return;
-    } else if (selector is Name) {
+    }
+    if (selector is Name) {
       _dotString(access.selector, access.receiver, selector.name);
       return;
     }
@@ -1064,9 +1096,10 @@
     out(']');
   }
 
-  void _dotString(Node selector, Node receiver, String selectorValue) {
-    if (isValidJavaScriptId(selectorValue)) {
-      if (undefer(receiver) is LiteralNumber &&
+  void _dotString(Node selector, Node receiver, String selectorValue,
+      {bool assumeValid = false}) {
+    if (assumeValid || isValidJavaScriptId(selectorValue)) {
+      if (_undefer(receiver) is LiteralNumber &&
           lastCharCode != charCodes.$CLOSE_PAREN) {
         out(' ', isWhitespace: true);
       }
@@ -1157,6 +1190,10 @@
 
   @override
   visitDeferredExpression(DeferredExpression node) {
+    if (isDebugContext && !node.isFinalized) {
+      out(node.nonfinalizedDebugText());
+      return;
+    }
     // Continue printing with the expression value.
     assert(node.precedenceLevel == node.value.precedenceLevel);
     node.value.accept(this);
@@ -1194,12 +1231,16 @@
 
   @override
   void visitLiteralString(LiteralString node) {
+    if (isDebugContext && !node.isFinalized) {
+      _handleString(node.nonfinalizedDebugText());
+      return;
+    }
     _handleString(node.value);
   }
 
   @override
   visitStringConcatenation(StringConcatenation node) {
-    _handleString(_StringContentsCollector().collect(node));
+    _handleString(_StringContentsCollector(isDebugContext).collect(node));
   }
 
   void _handleString(String value) {
@@ -1217,6 +1258,10 @@
 
   @override
   visitName(Name node) {
+    if (isDebugContext && !node.isFinalized) {
+      out(node.nonfinalizedDebugText());
+      return;
+    }
     out(node.name);
   }
 
@@ -1342,7 +1387,7 @@
 
   void propertyNameOut(Property node) {
     startNode(node.name);
-    Node name = undefer(node.name);
+    Node name = _undefer(node.name);
     if (name is LiteralString) {
       _outPropertyName(name.value);
     } else if (name is Name) {
@@ -1433,6 +1478,9 @@
 
 class _StringContentsCollector extends BaseVisitor<void> {
   final StringBuffer _buffer = StringBuffer();
+  final bool isDebugContext;
+
+  _StringContentsCollector(this.isDebugContext);
 
   String collect(Node node) {
     node.accept(this);
@@ -1450,17 +1498,29 @@
 
   @override
   void visitLiteralString(LiteralString node) {
-    _add(node.value);
+    if (isDebugContext && !node.isFinalized) {
+      _add(node.nonfinalizedDebugText());
+    } else {
+      _add(node.value);
+    }
   }
 
   @override
   void visitLiteralNumber(LiteralNumber node) {
-    _add(node.value);
+    if (isDebugContext && !node.isFinalized) {
+      _add(node.nonfinalizedDebugText());
+    } else {
+      _add(node.value);
+    }
   }
 
   @override
   void visitName(Name node) {
-    _add(node.name);
+    if (isDebugContext && !node.isFinalized) {
+      _add(node.nonfinalizedDebugText());
+    } else {
+      _add(node.name);
+    }
   }
 
   @override
@@ -1609,6 +1669,8 @@
   bool visitLabeledStatement(LabeledStatement node) => node.body.accept(this);
   bool visitLiteralStatement(LiteralStatement node) => true;
 
+  bool visitDartYield(DartYield node) => false;
+
   bool visitExpression(Expression node) => false;
 }
 
diff --git a/pkg/js_ast/test/deferred_expression_test.dart b/pkg/js_ast/test/deferred_expression_test.dart
index afd9805..29fc4d1 100644
--- a/pkg/js_ast/test/deferred_expression_test.dart
+++ b/pkg/js_ast/test/deferred_expression_test.dart
@@ -127,6 +127,9 @@
   Map<Node, _Position> exitPositions = {};
 
   @override
+  bool get isDebugContext => false;
+
+  @override
   void emit(String string) {
     sb.write(string);
   }
diff --git a/pkg/kernel/lib/default_language_version.dart b/pkg/kernel/lib/default_language_version.dart
index 96327d4..d4c3163 100644
--- a/pkg/kernel/lib/default_language_version.dart
+++ b/pkg/kernel/lib/default_language_version.dart
@@ -9,4 +9,4 @@
 
 import "ast.dart";
 
-Version defaultLanguageVersion = const Version(2, 15);
+Version defaultLanguageVersion = const Version(2, 16);
diff --git a/pkg/kernel/lib/src/equivalence_helpers.dart b/pkg/kernel/lib/src/equivalence_helpers.dart
index a36ee07..bb7bf62 100644
--- a/pkg/kernel/lib/src/equivalence_helpers.dart
+++ b/pkg/kernel/lib/src/equivalence_helpers.dart
@@ -236,8 +236,20 @@
   /// A reference name of a class or extension.
   Declaration,
 
-  /// A reference name of a typedef or member.
-  Member,
+  /// A reference name of a typedef.
+  Typedef,
+
+  /// A reference name of a method or constructor.
+  Function,
+
+  /// A reference name of a field.
+  Field,
+
+  /// A reference name of a getter.
+  Getter,
+
+  /// A reference name of a setter.
+  Setter,
 }
 
 /// Abstract representation of a [Reference] or [CanonicalName].
@@ -251,25 +263,29 @@
   final String? name;
   final String? uri;
 
-  ReferenceName.internal(this.kind, this.name, [this.parent, this.uri]);
+  ReferenceName.internal(this.kind, this.name, {this.parent, this.uri});
 
-  factory ReferenceName.fromNamedNode(NamedNode node) {
+  factory ReferenceName.fromNamedNode(NamedNode node,
+      [ReferenceNameKind? memberKind]) {
     if (node is Library) {
       return new ReferenceName.internal(
           ReferenceNameKind.Library, node.importUri.toString());
     } else if (node is Extension) {
-      return new ReferenceName.internal(ReferenceNameKind.Declaration,
-          node.name, new ReferenceName.fromNamedNode(node.enclosingLibrary));
+      return new ReferenceName.internal(
+          ReferenceNameKind.Declaration, node.name,
+          parent: new ReferenceName.fromNamedNode(node.enclosingLibrary));
     } else if (node is Class) {
-      return new ReferenceName.internal(ReferenceNameKind.Declaration,
-          node.name, new ReferenceName.fromNamedNode(node.enclosingLibrary));
+      return new ReferenceName.internal(
+          ReferenceNameKind.Declaration, node.name,
+          parent: new ReferenceName.fromNamedNode(node.enclosingLibrary));
     } else if (node is Typedef) {
-      return new ReferenceName.internal(ReferenceNameKind.Member, node.name,
-          new ReferenceName.fromNamedNode(node.enclosingLibrary));
+      return new ReferenceName.internal(ReferenceNameKind.Typedef, node.name,
+          parent: new ReferenceName.fromNamedNode(node.enclosingLibrary));
     } else if (node is Member) {
       TreeNode? parent = node.parent;
       Reference? libraryReference = node.name.libraryName;
       String? uri;
+
       if (libraryReference != null) {
         Library? library = libraryReference.node as Library?;
         if (library != null) {
@@ -278,15 +294,31 @@
           uri = libraryReference.canonicalName?.name;
         }
       }
+
+      String name = node.name.text;
+      if (memberKind == null) {
+        if (node is Procedure) {
+          if (node.isGetter) {
+            memberKind = ReferenceNameKind.Getter;
+          } else if (node.isSetter) {
+            memberKind = ReferenceNameKind.Setter;
+          } else {
+            memberKind = ReferenceNameKind.Function;
+          }
+        } else if (node is Constructor) {
+          memberKind = ReferenceNameKind.Function;
+        } else {
+          memberKind = ReferenceNameKind.Field;
+        }
+      }
       if (parent is Class) {
-        return new ReferenceName.internal(ReferenceNameKind.Member,
-            node.name.text, new ReferenceName.fromNamedNode(parent), uri);
+        return new ReferenceName.internal(memberKind, name,
+            parent: new ReferenceName.fromNamedNode(parent), uri: uri);
       } else if (parent is Library) {
-        return new ReferenceName.internal(ReferenceNameKind.Member,
-            node.name.text, new ReferenceName.fromNamedNode(parent), uri);
+        return new ReferenceName.internal(memberKind, name,
+            parent: new ReferenceName.fromNamedNode(parent), uri: uri);
       } else {
-        return new ReferenceName.internal(
-            ReferenceNameKind.Member, node.name.text, null, uri);
+        return new ReferenceName.internal(memberKind, name, uri: uri);
       }
     } else {
       throw new ArgumentError(
@@ -305,22 +337,24 @@
     ReferenceName? referenceName;
     ReferenceNameKind kind = ReferenceNameKind.Declaration;
     for (int index = 1; index < parents.length; index++) {
+      String name = parents[index].name;
       if (index == 1) {
         // Library reference.
-        referenceName = new ReferenceName.internal(
-            ReferenceNameKind.Library, parents[index].name);
-      } else if (CanonicalName.isSymbolicName(parents[index].name)) {
+        referenceName =
+            new ReferenceName.internal(ReferenceNameKind.Library, name);
+      } else if (CanonicalName.isSymbolicName(name)) {
         // Skip symbolic names
-        kind = ReferenceNameKind.Member;
+        kind = kindFromSymbolicName(name);
       } else {
         if (index + 2 == parents.length) {
           // This is a private name.
-          referenceName = new ReferenceName.internal(ReferenceNameKind.Member,
-              parents[index + 1].name, referenceName, parents[index].name);
+          referenceName = new ReferenceName.internal(
+              kind, parents[index + 1].name,
+              parent: referenceName, uri: name);
           break;
         } else {
-          referenceName = new ReferenceName.internal(
-              kind, parents[index].name, referenceName);
+          referenceName =
+              new ReferenceName.internal(kind, name, parent: referenceName);
         }
       }
     }
@@ -328,6 +362,21 @@
         new ReferenceName.internal(ReferenceNameKind.Unknown, null);
   }
 
+  static ReferenceNameKind kindFromSymbolicName(String name) {
+    assert(CanonicalName.isSymbolicName(name));
+    if (name == CanonicalName.typedefsName) {
+      return ReferenceNameKind.Typedef;
+    } else if (name == CanonicalName.fieldsName) {
+      return ReferenceNameKind.Field;
+    } else if (name == CanonicalName.gettersName) {
+      return ReferenceNameKind.Getter;
+    } else if (name == CanonicalName.settersName) {
+      return ReferenceNameKind.Setter;
+    } else {
+      return ReferenceNameKind.Function;
+    }
+  }
+
   String? get libraryUri {
     if (kind == ReferenceNameKind.Library) {
       return name;
@@ -344,15 +393,30 @@
     }
   }
 
+  bool get isMember {
+    switch (kind) {
+      case ReferenceNameKind.Unknown:
+      case ReferenceNameKind.Library:
+      case ReferenceNameKind.Declaration:
+        return false;
+      case ReferenceNameKind.Typedef:
+      case ReferenceNameKind.Function:
+      case ReferenceNameKind.Field:
+      case ReferenceNameKind.Getter:
+      case ReferenceNameKind.Setter:
+        return true;
+    }
+  }
+
   String? get memberName {
-    if (kind == ReferenceNameKind.Member) {
+    if (isMember) {
       return name;
     }
     return null;
   }
 
   String? get memberUri {
-    if (kind == ReferenceNameKind.Member) {
+    if (isMember) {
       return uri;
     }
     return null;
@@ -364,7 +428,18 @@
     }
     NamedNode? node = reference.node;
     if (node != null) {
-      return new ReferenceName.fromNamedNode(node);
+      ReferenceNameKind? memberKind;
+      if (node is Field) {
+        if (node.getterReference == reference) {
+          memberKind = ReferenceNameKind.Getter;
+        } else if (node.setterReference == reference) {
+          memberKind = ReferenceNameKind.Setter;
+        } else {
+          assert(node.fieldReference == reference);
+          memberKind = ReferenceNameKind.Field;
+        }
+      }
+      return new ReferenceName.fromNamedNode(node, memberKind);
     }
     CanonicalName? canonicalName = reference.canonicalName;
     if (canonicalName != null) {
@@ -375,19 +450,22 @@
 
   @override
   int get hashCode =>
-      name.hashCode * 13 + uri.hashCode * 17 + parent.hashCode * 19;
+      kind.hashCode * 11 +
+      name.hashCode * 13 +
+      uri.hashCode * 17 +
+      parent.hashCode * 19;
 
   @override
   bool operator ==(Object other) {
     if (identical(this, other)) return true;
     return other is ReferenceName &&
+        kind == other.kind &&
         name == other.name &&
         uri == other.uri &&
         parent == other.parent;
   }
 
-  @override
-  String toString() {
+  String _toStringInternal() {
     if (parent != null) {
       return '${parent}/$name';
     } else if (name != null) {
@@ -396,4 +474,15 @@
       return '<null>';
     }
   }
+
+  @override
+  String toString() {
+    if (parent != null) {
+      return '${kind}:${parent!._toStringInternal()}/$name';
+    } else if (name != null) {
+      return '${kind}:/$name';
+    } else {
+      return '<null>';
+    }
+  }
 }
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index 1cb1b2c..14f30a3 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -918,3 +918,44 @@
 
   TestTargetWrapper(Target target, this.flags) : super(target);
 }
+
+/// Extends a Target to transform outlines to meet the requirements
+/// of summaries in bazel and package-build.
+///
+/// Build systems like package-build may provide the same input file twice to
+/// the summary worker, but only intends to have it in one output summary.  The
+/// convention is that if it is listed as a source, it is intended to be part of
+/// the output, if the source file was loaded as a dependency, then it was
+/// already included in a different summary.  The transformation below ensures
+/// that the output summary doesn't include those implicit inputs.
+///
+/// Note: this transformation is destructive and is only intended to be used
+/// when generating summaries.
+mixin SummaryMixin on Target {
+  List<Uri> get sources;
+  bool get excludeNonSources;
+
+  @override
+  void performOutlineTransformations(Component component) {
+    super.performOutlineTransformations(component);
+    if (!excludeNonSources) return;
+
+    List<Library> libraries = new List.from(component.libraries);
+    component.libraries.clear();
+    Set<Uri> include = sources.toSet();
+    for (Library library in libraries) {
+      if (include.contains(library.importUri)) {
+        component.libraries.add(library);
+      } else {
+        // Excluding the library also means that their canonical names will not
+        // be computed as part of serialization, so we need to do that
+        // preemptively here to avoid errors when serializing references to
+        // elements of these libraries.
+        component.root
+            .getChildFromUri(library.importUri)
+            .bindTo(library.reference);
+        library.computeCanonicalNames();
+      }
+    }
+  }
+}
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index 3c00de0..2ee98c3 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -207,16 +207,17 @@
 }
 
 TextSerializer<Not> notSerializer =
-    new Wrapped(unwrapNot, wrapNot, expressionSerializer);
+    new Wrapped<Expression, Not>(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));
+TextSerializer<LogicalExpression> logicalAndSerializer =
+    new Wrapped<Tuple2<Expression, Expression>, LogicalExpression>(
+        unwrapLogicalExpression,
+        wrapLogicalAnd,
+        new Tuple2Serializer(expressionSerializer, expressionSerializer));
 
 Tuple2<Expression, Expression> unwrapLogicalExpression(
     LogicalExpression expression) {
@@ -228,20 +229,22 @@
       tuple.first, LogicalExpressionOperator.AND, tuple.second);
 }
 
-TextSerializer<LogicalExpression> logicalOrSerializer = new Wrapped(
-    unwrapLogicalExpression,
-    wrapLogicalOr,
-    new Tuple2Serializer(expressionSerializer, expressionSerializer));
+TextSerializer<LogicalExpression> logicalOrSerializer =
+    new Wrapped<Tuple2<Expression, Expression>, LogicalExpression>(
+        unwrapLogicalExpression,
+        wrapLogicalOr,
+        new Tuple2Serializer(expressionSerializer, expressionSerializer));
 
 LogicalExpression wrapLogicalOr(Tuple2<Expression, Expression> tuple) {
   return new LogicalExpression(
       tuple.first, LogicalExpressionOperator.OR, tuple.second);
 }
 
-TextSerializer<StringConcatenation> stringConcatenationSerializer = new Wrapped(
-    unwrapStringConcatenation,
-    wrapStringConcatenation,
-    new ListSerializer(expressionSerializer));
+TextSerializer<StringConcatenation> stringConcatenationSerializer =
+    new Wrapped<List<Expression>, StringConcatenation>(
+        unwrapStringConcatenation,
+        wrapStringConcatenation,
+        new ListSerializer(expressionSerializer));
 
 List<Expression> unwrapStringConcatenation(StringConcatenation expression) {
   return expression.expressions;
@@ -252,70 +255,78 @@
 }
 
 const TextSerializer<StringLiteral> stringLiteralSerializer =
-    const Wrapped(unwrapStringLiteral, wrapStringLiteral, const DartString());
+    const Wrapped<String, StringLiteral>(
+        unwrapStringLiteral, wrapStringLiteral, const DartString());
 
 String unwrapStringLiteral(StringLiteral literal) => literal.value;
 
 StringLiteral wrapStringLiteral(String value) => new StringLiteral(value);
 
 const TextSerializer<IntLiteral> intLiteralSerializer =
-    const Wrapped(unwrapIntLiteral, wrapIntLiteral, const DartInt());
+    const Wrapped<int, IntLiteral>(
+        unwrapIntLiteral, wrapIntLiteral, const DartInt());
 
 int unwrapIntLiteral(IntLiteral literal) => literal.value;
 
 IntLiteral wrapIntLiteral(int value) => new IntLiteral(value);
 
 const TextSerializer<DoubleLiteral> doubleLiteralSerializer =
-    const Wrapped(unwrapDoubleLiteral, wrapDoubleLiteral, const DartDouble());
+    const Wrapped<double, DoubleLiteral>(
+        unwrapDoubleLiteral, wrapDoubleLiteral, const DartDouble());
 
 double unwrapDoubleLiteral(DoubleLiteral literal) => literal.value;
 
 DoubleLiteral wrapDoubleLiteral(double value) => new DoubleLiteral(value);
 
 const TextSerializer<BoolLiteral> boolLiteralSerializer =
-    const Wrapped(unwrapBoolLiteral, wrapBoolLiteral, const DartBool());
+    const Wrapped<bool, BoolLiteral>(
+        unwrapBoolLiteral, wrapBoolLiteral, const DartBool());
 
 bool unwrapBoolLiteral(BoolLiteral literal) => literal.value;
 
 BoolLiteral wrapBoolLiteral(bool value) => new BoolLiteral(value);
 
 const TextSerializer<NullLiteral> nullLiteralSerializer =
-    const Wrapped(unwrapNullLiteral, wrapNullLiteral, const Nothing());
+    const Wrapped<void, NullLiteral>(
+        unwrapNullLiteral, wrapNullLiteral, const Nothing());
 
 void unwrapNullLiteral(NullLiteral literal) {}
 
 NullLiteral wrapNullLiteral(void ignored) => new NullLiteral();
 
 const TextSerializer<SymbolLiteral> symbolLiteralSerializer =
-    const Wrapped(unwrapSymbolLiteral, wrapSymbolLiteral, const DartString());
+    const Wrapped<String, SymbolLiteral>(
+        unwrapSymbolLiteral, wrapSymbolLiteral, const DartString());
 
 String unwrapSymbolLiteral(SymbolLiteral expression) => expression.value;
 
 SymbolLiteral wrapSymbolLiteral(String value) => new SymbolLiteral(value);
 
 const TextSerializer<ThisExpression> thisExpressionSerializer =
-    const Wrapped(unwrapThisExpression, wrapThisExpression, const Nothing());
+    const Wrapped<void, ThisExpression>(
+        unwrapThisExpression, wrapThisExpression, const Nothing());
 
 void unwrapThisExpression(ThisExpression expression) {}
 
 ThisExpression wrapThisExpression(void ignored) => new ThisExpression();
 
 const TextSerializer<Rethrow> rethrowSerializer =
-    const Wrapped(unwrapRethrow, wrapRethrow, const Nothing());
+    const Wrapped<void, Rethrow>(unwrapRethrow, wrapRethrow, const Nothing());
 
 void unwrapRethrow(Rethrow expression) {}
 
 Rethrow wrapRethrow(void ignored) => new Rethrow();
 
-TextSerializer<Throw> throwSerializer =
-    new Wrapped(unwrapThrow, wrapThrow, expressionSerializer);
+TextSerializer<Throw> throwSerializer = new Wrapped<Expression, Throw>(
+    unwrapThrow, wrapThrow, expressionSerializer);
 
 Expression unwrapThrow(Throw expression) => expression.expression;
 
 Throw wrapThrow(Expression expression) => new Throw(expression);
 
-TextSerializer<AwaitExpression> awaitExpressionSerializer = new Wrapped(
-    unwrapAwaitExpression, wrapAwaitExpression, expressionSerializer);
+TextSerializer<AwaitExpression> awaitExpressionSerializer =
+    new Wrapped<Expression, AwaitExpression>(
+        unwrapAwaitExpression, wrapAwaitExpression, expressionSerializer);
 
 Expression unwrapAwaitExpression(AwaitExpression expression) =>
     expression.operand;
@@ -324,7 +335,8 @@
     new AwaitExpression(operand);
 
 TextSerializer<ConditionalExpression> conditionalExpressionSerializer =
-    new Wrapped(
+    new Wrapped<Tuple4<Expression, DartType, Expression, Expression>,
+            ConditionalExpression>(
         unwrapConditionalExpression,
         wrapConditionalExpression,
         new Tuple4Serializer(expressionSerializer, dartTypeSerializer,
@@ -342,10 +354,11 @@
       tuple.first, tuple.third, tuple.fourth, tuple.second);
 }
 
-TextSerializer<IsExpression> isExpressionSerializer = new Wrapped(
-    unwrapIsExpression,
-    wrapIsExpression,
-    new Tuple2Serializer(expressionSerializer, dartTypeSerializer));
+TextSerializer<IsExpression> isExpressionSerializer =
+    new Wrapped<Tuple2<Expression, DartType>, IsExpression>(
+        unwrapIsExpression,
+        wrapIsExpression,
+        new Tuple2Serializer(expressionSerializer, dartTypeSerializer));
 
 Tuple2<Expression, DartType> unwrapIsExpression(IsExpression expression) {
   return new Tuple2(expression.operand, expression.type);
@@ -355,10 +368,11 @@
   return new IsExpression(tuple.first, tuple.second);
 }
 
-TextSerializer<AsExpression> asExpressionSerializer = new Wrapped(
-    unwrapAsExpression,
-    wrapAsExpression,
-    new Tuple2Serializer(expressionSerializer, dartTypeSerializer));
+TextSerializer<AsExpression> asExpressionSerializer =
+    new Wrapped<Tuple2<Expression, DartType>, AsExpression>(
+        unwrapAsExpression,
+        wrapAsExpression,
+        new Tuple2Serializer(expressionSerializer, dartTypeSerializer));
 
 Tuple2<Expression, DartType> unwrapAsExpression(AsExpression expression) {
   return new Tuple2(expression.operand, expression.type);
@@ -369,17 +383,19 @@
 }
 
 TextSerializer<TypeLiteral> typeLiteralSerializer =
-    new Wrapped(unwrapTypeLiteral, wrapTypeLiteral, dartTypeSerializer);
+    new Wrapped<DartType, TypeLiteral>(
+        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)));
+TextSerializer<ListLiteral> listLiteralSerializer =
+    new Wrapped<Tuple2<DartType, List<Expression>>, ListLiteral>(
+        unwrapListLiteral,
+        wrapListLiteral,
+        new Tuple2Serializer(
+            dartTypeSerializer, new ListSerializer(expressionSerializer)));
 
 Tuple2<DartType, List<Expression>> unwrapListLiteral(ListLiteral expression) {
   return new Tuple2(expression.typeArgument, expression.expressions);
@@ -390,22 +406,24 @@
       typeArgument: tuple.first, isConst: false);
 }
 
-TextSerializer<ListLiteral> constListLiteralSerializer = new Wrapped(
-    unwrapListLiteral,
-    wrapConstListLiteral,
-    new Tuple2Serializer(
-        dartTypeSerializer, new ListSerializer(expressionSerializer)));
+TextSerializer<ListLiteral> constListLiteralSerializer =
+    new Wrapped<Tuple2<DartType, List<Expression>>, ListLiteral>(
+        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)));
+TextSerializer<SetLiteral> setLiteralSerializer =
+    new Wrapped<Tuple2<DartType, List<Expression>>, SetLiteral>(
+        unwrapSetLiteral,
+        wrapSetLiteral,
+        new Tuple2Serializer(
+            dartTypeSerializer, new ListSerializer(expressionSerializer)));
 
 Tuple2<DartType, List<Expression>> unwrapSetLiteral(SetLiteral expression) {
   return new Tuple2(expression.typeArgument, expression.expressions);
@@ -416,21 +434,23 @@
       typeArgument: tuple.first, isConst: false);
 }
 
-TextSerializer<SetLiteral> constSetLiteralSerializer = new Wrapped(
-    unwrapSetLiteral,
-    wrapConstSetLiteral,
-    new Tuple2Serializer(
-        dartTypeSerializer, new ListSerializer(expressionSerializer)));
+TextSerializer<SetLiteral> constSetLiteralSerializer =
+    new Wrapped<Tuple2<DartType, List<Expression>>, SetLiteral>(
+        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)));
+TextSerializer<MapLiteral> mapLiteralSerializer =
+    new Wrapped<Tuple3<DartType, DartType, List<Expression>>, MapLiteral>(
+        unwrapMapLiteral,
+        wrapMapLiteral,
+        new Tuple3Serializer(dartTypeSerializer, dartTypeSerializer,
+            new ListSerializer(expressionSerializer)));
 
 Tuple3<DartType, DartType, List<Expression>> unwrapMapLiteral(
     MapLiteral expression) {
@@ -454,11 +474,12 @@
       keyType: tuple.first, valueType: tuple.second, isConst: false);
 }
 
-TextSerializer<MapLiteral> constMapLiteralSerializer = new Wrapped(
-    unwrapMapLiteral,
-    wrapConstMapLiteral,
-    new Tuple3Serializer(dartTypeSerializer, dartTypeSerializer,
-        new ListSerializer(expressionSerializer)));
+TextSerializer<MapLiteral> constMapLiteralSerializer =
+    new Wrapped<Tuple3<DartType, DartType, List<Expression>>, MapLiteral>(
+        unwrapMapLiteral,
+        wrapConstMapLiteral,
+        new Tuple3Serializer(dartTypeSerializer, dartTypeSerializer,
+            new ListSerializer(expressionSerializer)));
 
 MapLiteral wrapConstMapLiteral(
     Tuple3<DartType, DartType, List<Expression>> tuple) {
@@ -471,8 +492,9 @@
       keyType: tuple.first, valueType: tuple.second, isConst: true);
 }
 
-TextSerializer<Let> letSerializer = new Wrapped(unwrapLet, wrapLet,
-    new Bind(variableDeclarationSerializer, expressionSerializer));
+TextSerializer<Let> letSerializer =
+    new Wrapped<Tuple2<VariableDeclaration, Expression>, Let>(unwrapLet,
+        wrapLet, new Bind(variableDeclarationSerializer, expressionSerializer));
 
 Tuple2<VariableDeclaration, Expression> unwrapLet(Let expression) {
   return new Tuple2(expression.variable, expression.body);
@@ -603,7 +625,8 @@
 }
 
 TextSerializer<SuperPropertyGet> superPropertyGetSerializer =
-    new Wrapped(unwrapSuperPropertyGet, wrapSuperPropertyGet, nameSerializer);
+    new Wrapped<Name, SuperPropertyGet>(
+        unwrapSuperPropertyGet, wrapSuperPropertyGet, nameSerializer);
 
 Name unwrapSuperPropertyGet(SuperPropertyGet expression) {
   return expression.name;
@@ -613,10 +636,11 @@
   return new SuperPropertyGet(name);
 }
 
-TextSerializer<SuperPropertySet> superPropertySetSerializer = new Wrapped(
-    unwrapSuperPropertySet,
-    wrapSuperPropertySet,
-    new Tuple2Serializer(nameSerializer, expressionSerializer));
+TextSerializer<SuperPropertySet> superPropertySetSerializer =
+    new Wrapped<Tuple2<Name, Expression>, SuperPropertySet>(
+        unwrapSuperPropertySet,
+        wrapSuperPropertySet,
+        new Tuple2Serializer(nameSerializer, expressionSerializer));
 
 Tuple2<Name, Expression> unwrapSuperPropertySet(SuperPropertySet expression) {
   return new Tuple2(expression.name, expression.value);
@@ -854,7 +878,9 @@
 }
 
 TextSerializer<SuperMethodInvocation> superMethodInvocationSerializer =
-    new Wrapped(unwrapSuperMethodInvocation, wrapSuperMethodInvocation,
+    new Wrapped<Tuple2<Name, Arguments>, SuperMethodInvocation>(
+        unwrapSuperMethodInvocation,
+        wrapSuperMethodInvocation,
         new Tuple2Serializer(nameSerializer, argumentsSerializer));
 
 Tuple2<Name, Arguments> unwrapSuperMethodInvocation(
@@ -882,11 +908,12 @@
   return new VariableGet(tuple.first, tuple.second);
 }
 
-TextSerializer<VariableSet> variableSetSerializer = new Wrapped(
-    unwrapVariableSet,
-    wrapVariableSet,
-    new Tuple2Serializer(
-        const ScopedUse<VariableDeclaration>(), expressionSerializer));
+TextSerializer<VariableSet> variableSetSerializer =
+    new Wrapped<Tuple2<VariableDeclaration, Expression>, VariableSet>(
+        unwrapVariableSet,
+        wrapVariableSet,
+        new Tuple2Serializer(
+            const ScopedUse<VariableDeclaration>(), expressionSerializer));
 
 Tuple2<VariableDeclaration, Expression> unwrapVariableSet(VariableSet node) {
   return new Tuple2<VariableDeclaration, Expression>(node.variable, node.value);
@@ -949,8 +976,9 @@
   return new StaticGet.byReference(name.reference);
 }
 
-const TextSerializer<StaticTearOff> staticTearOffSerializer = const Wrapped(
-    unwrapStaticTearOff, wrapStaticTearOff, canonicalNameSerializer);
+const TextSerializer<StaticTearOff> staticTearOffSerializer =
+    const Wrapped<CanonicalName, StaticTearOff>(
+        unwrapStaticTearOff, wrapStaticTearOff, canonicalNameSerializer);
 
 CanonicalName unwrapStaticTearOff(StaticTearOff expression) {
   return expression.targetReference.canonicalName!;
@@ -961,8 +989,8 @@
 }
 
 const TextSerializer<ConstructorTearOff> constructorTearOffSerializer =
-    const Wrapped(unwrapConstructorTearOff, wrapConstructorTearOff,
-        canonicalNameSerializer);
+    const Wrapped<CanonicalName, ConstructorTearOff>(unwrapConstructorTearOff,
+        wrapConstructorTearOff, canonicalNameSerializer);
 
 CanonicalName unwrapConstructorTearOff(ConstructorTearOff expression) {
   return expression.targetReference.canonicalName!;
@@ -973,7 +1001,8 @@
 }
 
 const TextSerializer<RedirectingFactoryTearOff>
-    redirectingFactoryTearOffSerializer = const Wrapped(
+    redirectingFactoryTearOffSerializer =
+    const Wrapped<CanonicalName, RedirectingFactoryTearOff>(
         unwrapRedirectingFactoryTearOff,
         wrapRedirectingFactoryTearOff,
         canonicalNameSerializer);
@@ -1009,10 +1038,11 @@
       tuple.first, tuple.second.first, tuple.second.second);
 }
 
-TextSerializer<StaticSet> staticSetSerializer = new Wrapped(
-    unwrapStaticSet,
-    wrapStaticSet,
-    new Tuple2Serializer(canonicalNameSerializer, expressionSerializer));
+TextSerializer<StaticSet> staticSetSerializer =
+    new Wrapped<Tuple2<CanonicalName, Expression>, StaticSet>(
+        unwrapStaticSet,
+        wrapStaticSet,
+        new Tuple2Serializer(canonicalNameSerializer, expressionSerializer));
 
 Tuple2<CanonicalName, Expression> unwrapStaticSet(StaticSet expression) {
   return new Tuple2(
@@ -1023,10 +1053,11 @@
   return new StaticSet.byReference(tuple.first.reference, tuple.second);
 }
 
-TextSerializer<StaticInvocation> staticInvocationSerializer = new Wrapped(
-    unwrapStaticInvocation,
-    wrapStaticInvocation,
-    new Tuple2Serializer(canonicalNameSerializer, argumentsSerializer));
+TextSerializer<StaticInvocation> staticInvocationSerializer =
+    new Wrapped<Tuple2<CanonicalName, Arguments>, StaticInvocation>(
+        unwrapStaticInvocation,
+        wrapStaticInvocation,
+        new Tuple2Serializer(canonicalNameSerializer, argumentsSerializer));
 
 Tuple2<CanonicalName, Arguments> unwrapStaticInvocation(
     StaticInvocation expression) {
@@ -1039,10 +1070,11 @@
       isConst: false);
 }
 
-TextSerializer<StaticInvocation> constStaticInvocationSerializer = new Wrapped(
-    unwrapStaticInvocation,
-    wrapConstStaticInvocation,
-    new Tuple2Serializer(canonicalNameSerializer, argumentsSerializer));
+TextSerializer<StaticInvocation> constStaticInvocationSerializer =
+    new Wrapped<Tuple2<CanonicalName, Arguments>, StaticInvocation>(
+        unwrapStaticInvocation,
+        wrapConstStaticInvocation,
+        new Tuple2Serializer(canonicalNameSerializer, argumentsSerializer));
 
 StaticInvocation wrapConstStaticInvocation(
     Tuple2<CanonicalName, Arguments> tuple) {
@@ -1051,7 +1083,9 @@
 }
 
 TextSerializer<ConstructorInvocation> constructorInvocationSerializer =
-    new Wrapped(unwrapConstructorInvocation, wrapConstructorInvocation,
+    new Wrapped<Tuple2<CanonicalName, Arguments>, ConstructorInvocation>(
+        unwrapConstructorInvocation,
+        wrapConstructorInvocation,
         new Tuple2Serializer(canonicalNameSerializer, argumentsSerializer));
 
 Tuple2<CanonicalName, Arguments> unwrapConstructorInvocation(
@@ -1068,7 +1102,9 @@
 }
 
 TextSerializer<ConstructorInvocation> constConstructorInvocationSerializer =
-    new Wrapped(unwrapConstructorInvocation, wrapConstConstructorInvocation,
+    new Wrapped<Tuple2<CanonicalName, Arguments>, ConstructorInvocation>(
+        unwrapConstructorInvocation,
+        wrapConstConstructorInvocation,
         Tuple2Serializer(canonicalNameSerializer, argumentsSerializer));
 
 ConstructorInvocation wrapConstConstructorInvocation(
@@ -1078,8 +1114,9 @@
       isConst: true);
 }
 
-TextSerializer<FunctionExpression> functionExpressionSerializer = new Wrapped(
-    unwrapFunctionExpression, wrapFunctionExpression, functionNodeSerializer);
+TextSerializer<FunctionExpression> functionExpressionSerializer =
+    new Wrapped<FunctionNode, FunctionExpression>(unwrapFunctionExpression,
+        wrapFunctionExpression, functionNodeSerializer);
 
 FunctionNode unwrapFunctionExpression(FunctionExpression expression) {
   return expression.function;
@@ -1177,10 +1214,11 @@
 TextSerializer<Expression?> nullableExpressionSerializer =
     new Optional(expressionSerializer);
 
-TextSerializer<NamedExpression> namedExpressionSerializer = new Wrapped(
-    unwrapNamedExpression,
-    wrapNamedExpression,
-    new Tuple2Serializer(const DartString(), expressionSerializer));
+TextSerializer<NamedExpression> namedExpressionSerializer =
+    new Wrapped<Tuple2<String, Expression>, NamedExpression>(
+        unwrapNamedExpression,
+        wrapNamedExpression,
+        new Tuple2Serializer(const DartString(), expressionSerializer));
 
 Tuple2<String, Expression> unwrapNamedExpression(NamedExpression expression) {
   return new Tuple2(expression.name, expression.value);
@@ -1190,7 +1228,9 @@
   return new NamedExpression(tuple.first, tuple.second);
 }
 
-TextSerializer<Arguments> argumentsSerializer = new Wrapped(
+TextSerializer<Arguments> argumentsSerializer = new Wrapped<
+        Tuple3<List<DartType>, List<Expression>, List<NamedExpression>>,
+        Arguments>(
     unwrapArguments,
     wrapArguments,
     Tuple3Serializer(
@@ -1259,7 +1299,8 @@
     Wrapped<Tuple2<String?, TypeParameter>, TypeParameter>(
         (p) => Tuple2(p.name, p),
         (t) => t.second..name = t.first,
-        Binder(Wrapped((_) => null, (_) => TypeParameter(), const Nothing())));
+        Binder<TypeParameter>(Wrapped<void, TypeParameter>(
+            (_) => null, (_) => TypeParameter(), const Nothing())));
 
 TextSerializer<List<TypeParameter>> typeParametersSerializer = new Zip(
     new Rebind(
@@ -1325,35 +1366,42 @@
 }
 
 const TextSerializer<InvalidType> invalidTypeSerializer =
-    const Wrapped(unwrapInvalidType, wrapInvalidType, const Nothing());
+    const Wrapped<void, InvalidType>(
+        unwrapInvalidType, wrapInvalidType, const Nothing());
 
 void unwrapInvalidType(InvalidType type) {}
 
 InvalidType wrapInvalidType(void ignored) => const InvalidType();
 
 const TextSerializer<DynamicType> dynamicTypeSerializer =
-    const Wrapped(unwrapDynamicType, wrapDynamicType, const Nothing());
+    const Wrapped<void, DynamicType>(
+        unwrapDynamicType, wrapDynamicType, const Nothing());
 
 void unwrapDynamicType(DynamicType type) {}
 
 DynamicType wrapDynamicType(void ignored) => const DynamicType();
 
 const TextSerializer<VoidType> voidTypeSerializer =
-    const Wrapped(unwrapVoidType, wrapVoidType, const Nothing());
+    const Wrapped<void, VoidType>(
+        unwrapVoidType, wrapVoidType, const Nothing());
 
 void unwrapVoidType(VoidType type) {}
 
 VoidType wrapVoidType(void ignored) => const VoidType();
 
 const TextSerializer<NeverType> neverTypeSerializer =
-    const Wrapped(unwrapNeverType, wrapNeverType, const Nothing());
+    const Wrapped<void, NeverType>(
+        unwrapNeverType, wrapNeverType, const Nothing());
 
 void unwrapNeverType(NeverType type) {}
 
 NeverType wrapNeverType(void ignored) => const NeverType.legacy();
 
 // TODO(dmitryas):  Also handle nameParameters, and typedefType.
-TextSerializer<FunctionType> functionTypeSerializer = new Wrapped(
+TextSerializer<FunctionType> functionTypeSerializer = new Wrapped<
+        Tuple2<List<TypeParameter>,
+            Tuple4<List<DartType>, List<DartType>, List<NamedType>, DartType>>,
+        FunctionType>(
     unwrapFunctionType,
     wrapFunctionType,
     new Bind(
@@ -1387,8 +1435,11 @@
       namedParameters: tuple.second.third);
 }
 
-TextSerializer<NamedType> namedTypeSerializer = new Wrapped(unwrapNamedType,
-    wrapNamedType, Tuple2Serializer(const DartString(), dartTypeSerializer));
+TextSerializer<NamedType> namedTypeSerializer =
+    new Wrapped<Tuple2<String, DartType>, NamedType>(
+        unwrapNamedType,
+        wrapNamedType,
+        Tuple2Serializer(const DartString(), dartTypeSerializer));
 
 Tuple2<String, DartType> unwrapNamedType(NamedType namedType) {
   return new Tuple2(namedType.name, namedType.type);
@@ -1398,11 +1449,12 @@
   return new NamedType(tuple.first, tuple.second);
 }
 
-TextSerializer<TypeParameterType> typeParameterTypeSerializer = new Wrapped(
-    unwrapTypeParameterType,
-    wrapTypeParameterType,
-    Tuple2Serializer(
-        new ScopedUse<TypeParameter>(), new Optional(dartTypeSerializer)));
+TextSerializer<TypeParameterType> typeParameterTypeSerializer =
+    new Wrapped<Tuple2<TypeParameter, DartType?>, TypeParameterType>(
+        unwrapTypeParameterType,
+        wrapTypeParameterType,
+        Tuple2Serializer(
+            new ScopedUse<TypeParameter>(), new Optional(dartTypeSerializer)));
 
 Tuple2<TypeParameter, DartType?> unwrapTypeParameterType(
     TypeParameterType node) {
@@ -1414,11 +1466,12 @@
   return new TypeParameterType(tuple.first, Nullability.legacy, tuple.second);
 }
 
-TextSerializer<InterfaceType> interfaceTypeSerializer = new Wrapped(
-    unwrapInterfaceType,
-    wrapInterfaceType,
-    Tuple2Serializer(
-        canonicalNameSerializer, new ListSerializer(dartTypeSerializer)));
+TextSerializer<InterfaceType> interfaceTypeSerializer =
+    new Wrapped<Tuple2<CanonicalName, List<DartType>>, InterfaceType>(
+        unwrapInterfaceType,
+        wrapInterfaceType,
+        Tuple2Serializer(
+            canonicalNameSerializer, new ListSerializer(dartTypeSerializer)));
 
 Tuple2<CanonicalName, List<DartType>> unwrapInterfaceType(InterfaceType node) {
   return new Tuple2(node.className.canonicalName!, node.typeArguments);
@@ -1429,11 +1482,12 @@
       tuple.first.reference, Nullability.legacy, tuple.second);
 }
 
-TextSerializer<TypedefType> typedefTypeSerializer = new Wrapped(
-    unwrapTypedefType,
-    wrapTypedefType,
-    Tuple2Serializer(
-        canonicalNameSerializer, new ListSerializer(dartTypeSerializer)));
+TextSerializer<TypedefType> typedefTypeSerializer =
+    new Wrapped<Tuple2<CanonicalName, List<DartType>>, TypedefType>(
+        unwrapTypedefType,
+        wrapTypedefType,
+        Tuple2Serializer(
+            canonicalNameSerializer, new ListSerializer(dartTypeSerializer)));
 
 Tuple2<CanonicalName, List<DartType>> unwrapTypedefType(TypedefType node) {
   return new Tuple2(node.typedefReference.canonicalName!, node.typeArguments);
@@ -1445,7 +1499,8 @@
 }
 
 TextSerializer<FutureOrType> futureOrTypeSerializer =
-    new Wrapped(unwrapFutureOrType, wrapFutureOrType, dartTypeSerializer);
+    new Wrapped<DartType, FutureOrType>(
+        unwrapFutureOrType, wrapFutureOrType, dartTypeSerializer);
 
 DartType unwrapFutureOrType(FutureOrType node) {
   return node.typeArgument;
@@ -1456,7 +1511,7 @@
 }
 
 TextSerializer<NullType> nullTypeSerializer =
-    new Wrapped(unwrapNullType, wrapNullType, const Nothing());
+    new Wrapped<void, NullType>(unwrapNullType, wrapNullType, const Nothing());
 
 void unwrapNullType(NullType type) {}
 
@@ -1530,8 +1585,9 @@
   }
 }
 
-TextSerializer<ExpressionStatement> expressionStatementSerializer = new Wrapped(
-    unwrapExpressionStatement, wrapExpressionStatement, expressionSerializer);
+TextSerializer<ExpressionStatement> expressionStatementSerializer =
+    new Wrapped<Expression, ExpressionStatement>(unwrapExpressionStatement,
+        wrapExpressionStatement, expressionSerializer);
 
 Expression unwrapExpressionStatement(ExpressionStatement statement) {
   return statement.expression;
@@ -1553,15 +1609,17 @@
   return new ReturnStatement(expression);
 }
 
-TextSerializer<ReturnStatement> returnVoidStatementSerializer = new Wrapped(
-    unwrapReturnVoidStatement, wrapReturnVoidStatement, const Nothing());
+TextSerializer<ReturnStatement> returnVoidStatementSerializer =
+    new Wrapped<void, ReturnStatement>(
+        unwrapReturnVoidStatement, wrapReturnVoidStatement, const Nothing());
 
 void unwrapReturnVoidStatement(void ignored) {}
 
 ReturnStatement wrapReturnVoidStatement(void ignored) => new ReturnStatement();
 
 TextSerializer<YieldStatement> yieldStatementSerializer =
-    new Wrapped(unwrapYieldStatement, wrapYieldStatement, expressionSerializer);
+    new Wrapped<Expression, YieldStatement>(
+        unwrapYieldStatement, wrapYieldStatement, expressionSerializer);
 
 Expression unwrapYieldStatement(YieldStatement node) => node.expression;
 
@@ -1657,10 +1715,11 @@
   }
 }
 
-TextSerializer<IfStatement> ifStatementSerializer = new Wrapped(
-    unwrapIfStatement,
-    wrapIfStatement,
-    Tuple2Serializer(expressionSerializer, statementSerializer));
+TextSerializer<IfStatement> ifStatementSerializer =
+    new Wrapped<Tuple2<Expression, Statement>, IfStatement>(
+        unwrapIfStatement,
+        wrapIfStatement,
+        Tuple2Serializer(expressionSerializer, statementSerializer));
 
 Tuple2<Expression, Statement> unwrapIfStatement(IfStatement node) {
   return new Tuple2(node.condition, node.then);
@@ -1670,11 +1729,12 @@
   return new IfStatement(tuple.first, tuple.second, null);
 }
 
-TextSerializer<IfStatement> ifElseStatementSerializer = new Wrapped(
-    unwrapIfElseStatement,
-    wrapIfElseStatement,
-    Tuple3Serializer(
-        expressionSerializer, statementSerializer, statementSerializer));
+TextSerializer<IfStatement> ifElseStatementSerializer =
+    new Wrapped<Tuple3<Expression, Statement, Statement?>, IfStatement>(
+        unwrapIfElseStatement,
+        wrapIfElseStatement,
+        Tuple3Serializer<Expression, Statement, Statement?>(
+            expressionSerializer, statementSerializer, statementSerializer));
 
 Tuple3<Expression, Statement, Statement?> unwrapIfElseStatement(
     IfStatement node) {
@@ -1687,16 +1747,18 @@
 }
 
 TextSerializer<EmptyStatement> emptyStatementSerializer =
-    new Wrapped(unwrapEmptyStatement, wrapEmptyStatement, const Nothing());
+    new Wrapped<void, EmptyStatement>(
+        unwrapEmptyStatement, wrapEmptyStatement, const Nothing());
 
 void unwrapEmptyStatement(EmptyStatement node) {}
 
 EmptyStatement wrapEmptyStatement(void ignored) => new EmptyStatement();
 
-TextSerializer<WhileStatement> whileStatementSerializer = new Wrapped(
-    unwrapWhileStatement,
-    wrapWhileStatement,
-    new Tuple2Serializer(expressionSerializer, statementSerializer));
+TextSerializer<WhileStatement> whileStatementSerializer =
+    new Wrapped<Tuple2<Expression, Statement>, WhileStatement>(
+        unwrapWhileStatement,
+        wrapWhileStatement,
+        new Tuple2Serializer(expressionSerializer, statementSerializer));
 
 Tuple2<Expression, Statement> unwrapWhileStatement(WhileStatement node) {
   return new Tuple2(node.condition, node.body);
@@ -1706,10 +1768,11 @@
   return new WhileStatement(tuple.first, tuple.second);
 }
 
-TextSerializer<DoStatement> doStatementSerializer = new Wrapped(
-    unwrapDoStatement,
-    wrapDoStatement,
-    new Tuple2Serializer(statementSerializer, expressionSerializer));
+TextSerializer<DoStatement> doStatementSerializer =
+    new Wrapped<Tuple2<Statement, Expression>, DoStatement>(
+        unwrapDoStatement,
+        wrapDoStatement,
+        new Tuple2Serializer(statementSerializer, expressionSerializer));
 
 Tuple2<Statement, Expression> unwrapDoStatement(DoStatement node) {
   return new Tuple2(node.body, node.condition);
@@ -1731,7 +1794,9 @@
         new Tuple3Serializer(Optional(expressionSerializer),
             new ListSerializer(expressionSerializer), statementSerializer)));
 
-TextSerializer<ForInStatement> forInStatementSerializer = new Wrapped(
+TextSerializer<ForInStatement> forInStatementSerializer = new Wrapped<
+        Tuple2<Expression, Tuple2<VariableDeclaration, Statement>>,
+        ForInStatement>(
     unwrapForInStatement,
     wrapForInStatement,
     new Tuple2Serializer(expressionSerializer,
@@ -1748,7 +1813,9 @@
       tuple.second.first, tuple.first, tuple.second.second);
 }
 
-TextSerializer<ForInStatement> awaitForInStatementSerializer = new Wrapped(
+TextSerializer<ForInStatement> awaitForInStatementSerializer = new Wrapped<
+        Tuple2<Expression, Tuple2<VariableDeclaration, Statement>>,
+        ForInStatement>(
     unwrapForInStatement,
     wrapAwaitForInStatement,
     new Tuple2Serializer(expressionSerializer,
@@ -1769,14 +1836,13 @@
             Wrapped<Tuple2<String?, LabeledStatement>, LabeledStatement>(
                 (ls) => Tuple2("L", ls),
                 (t) => t.second,
-                Binder(Wrapped(
+                Binder(Wrapped<void, LabeledStatement>(
                     (_) => null, (_) => LabeledStatement(null), Nothing()))),
             statementSerializer));
 
-TextSerializer<BreakStatement> breakSerializer = new Wrapped(
-    unwrapBreakStatement,
-    wrapBreakStatement,
-    const ScopedUse<LabeledStatement>());
+TextSerializer<BreakStatement> breakSerializer =
+    new Wrapped<LabeledStatement, BreakStatement>(unwrapBreakStatement,
+        wrapBreakStatement, const ScopedUse<LabeledStatement>());
 
 LabeledStatement unwrapBreakStatement(BreakStatement node) {
   return node.target;
@@ -1844,12 +1910,12 @@
             (u) => SwitchCase(u, List.filled(u.length, 0), null),
             ListSerializer(expressionSerializer))));
 
-TextSerializer<SwitchCase> switchCaseDefaultSerializer = Wrapped<
-        Tuple2<String?, SwitchCase>, SwitchCase>(
-    (w) => Tuple2("L", w),
-    (u) => u.second,
-    Binder(
-        Wrapped((w) => null, (u) => SwitchCase.defaultCase(null), Nothing())));
+TextSerializer<SwitchCase> switchCaseDefaultSerializer =
+    Wrapped<Tuple2<String?, SwitchCase>, SwitchCase>(
+        (w) => Tuple2("L", w),
+        (u) => u.second,
+        Binder(Wrapped<void, SwitchCase>(
+            (w) => null, (u) => SwitchCase.defaultCase(null), Nothing())));
 
 TextSerializer<SwitchCase> switchCaseSerializer = Case(SwitchCaseTagger(), {
   "case": switchCaseCaseSerializer,
@@ -2837,7 +2903,7 @@
 Map<String, Wrapped<void, T>> convertFlagsMap<T>(Map<T, String> map) {
   return map.entries.toMap(
       key: (e) => e.value,
-      value: (e) => Wrapped((_) => null, (_) => e.key, Nothing()));
+      value: (e) => Wrapped<void, T>((_) => null, (_) => e.key, Nothing()));
 }
 
 extension MapFromIterable<E> on Iterable<E> {
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index e9d5c3c..d6ef537 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -442,7 +442,8 @@
         type: FunctionType([], syncOpType, staticTypeContext.nonNullable));
 
     final syncOpVariable = VariableDeclaration(ContinuationVariables.syncOp);
-    final syncOpDecl = FunctionDeclaration(syncOpVariable, syncOpFN);
+    final syncOpDecl = FunctionDeclaration(syncOpVariable, syncOpFN)
+      ..fileOffset = enclosingFunction.fileOffset;
 
     enclosingFunction.body = Block([
       // :sync_op_gen() {
@@ -466,7 +467,8 @@
                 // return sync_op;
                 ReturnStatement(VariableGet(syncOpVariable)),
               ]),
-              returnType: syncOpType)),
+              returnType: syncOpType))
+        ..fileOffset = enclosingFunction.fileOffset,
 
       // return _SyncIterable<T>(:sync_op_gen);
       ReturnStatement(ConstructorInvocation(
diff --git a/pkg/kernel/lib/util/graph.dart b/pkg/kernel/lib/util/graph.dart
index 4119f1b..105b170b 100644
--- a/pkg/kernel/lib/util/graph.dart
+++ b/pkg/kernel/lib/util/graph.dart
@@ -4,12 +4,42 @@
 
 library fasta.graph;
 
+import 'dart:math';
+
+import '../ast.dart';
+
 abstract class Graph<T> {
   Iterable<T> get vertices;
 
   Iterable<T> neighborsOf(T vertex);
 }
 
+/// [Graph] implementation using a collection of [Library] nodes as the graph
+/// vertices and using library dependencies to compute neighbors.
+///
+/// If [coreLibrary] is provided, it will be included in the neighbor of all
+/// vertices. Otherwise, `dart:core` will only be neighboring libraries that
+/// explicitly dependent on it.
+class LibraryGraph implements Graph<Library> {
+  final Iterable<Library> libraries;
+  final Library? coreLibrary;
+
+  LibraryGraph(this.libraries, {this.coreLibrary});
+
+  @override
+  Iterable<Library> get vertices => libraries;
+
+  @override
+  Iterable<Library> neighborsOf(Library library) sync* {
+    if (coreLibrary != null && library != coreLibrary) {
+      yield coreLibrary!;
+    }
+    for (LibraryDependency dependency in library.dependencies) {
+      yield dependency.targetLibrary;
+    }
+  }
+}
+
 /// Computes the strongly connected components of [graph].
 ///
 /// This implementation is based on [Dijkstra's path-based strong component
@@ -77,3 +107,104 @@
 
   return result;
 }
+
+/// A [Graph] using strongly connected components, as computed by
+/// [computeStrongComponents], as vertices. Neighbors are computed using the
+/// neighbors of the provided [subgraph] which was used to compute the strongly
+/// connected components.
+class StrongComponentGraph<T> implements Graph<List<T>> {
+  final Graph<T> subgraph;
+  final List<List<T>> components;
+  final Map<T, List<T>> _elementToComponentMap = {};
+  final Map<List<T>, Set<List<T>>> _neighborsMap = {};
+
+  StrongComponentGraph(this.subgraph, this.components) {
+    for (List<T> component in components) {
+      for (T element in component) {
+        _elementToComponentMap[element] = component;
+      }
+    }
+  }
+
+  Set<List<T>> _computeNeighborsOf(List<T> component) {
+    Set<List<T>> neighbors = {};
+    for (T element in component) {
+      for (T neighborElement in subgraph.neighborsOf(element)) {
+        List<T> neighborComponent = _elementToComponentMap[neighborElement]!;
+        if (component != neighborComponent) {
+          neighbors.add(neighborComponent);
+        }
+      }
+    }
+    return neighbors;
+  }
+
+  @override
+  Iterable<List<T>> neighborsOf(List<T> vertex) {
+    return _neighborsMap[vertex] ??= _computeNeighborsOf(vertex);
+  }
+
+  @override
+  Iterable<List<T>> get vertices => components;
+}
+
+const int cyclicMarker = -1;
+
+int _topologicalSortInternal<T>(
+    Graph<T> graph, TopologicalSortResult<T> result, T vertex) {
+  int? index = result.indexMap[vertex];
+  if (index == null) {
+    result.indexMap[vertex] = cyclicMarker;
+    int index = 0;
+    for (T neighbor in graph.neighborsOf(vertex)) {
+      int neighborIndex = _topologicalSortInternal(graph, result, neighbor);
+      if (neighborIndex == cyclicMarker) {
+        result.cyclicVertices.add(vertex);
+        return cyclicMarker;
+      } else {
+        index = max(index, neighborIndex + 1);
+      }
+    }
+    result.sortedVertices.add(vertex);
+    if (index >= result.layers.length) {
+      assert(index == result.layers.length);
+      result.layers.add([vertex]);
+    } else {
+      result.layers[index].add(vertex);
+    }
+    return result.indexMap[vertex] = index;
+  }
+  return index;
+}
+
+/// Perform a topological sorting of the vertices in [graph], returning a
+/// [TopologicalSortResult] object with the result.
+TopologicalSortResult<T> topologicalSort<T>(Graph<T> graph) {
+  TopologicalSortResult<T> result = new TopologicalSortResult();
+
+  for (T vertex in graph.vertices) {
+    _topologicalSortInternal(graph, result, vertex);
+  }
+  return result;
+}
+
+/// The result of computing the [topologicalSort] on a [Graph].
+class TopologicalSortResult<T> {
+  /// The non-cyclic vertices of the graph sorted in topological order.
+  final List<T> sortedVertices = [];
+
+  /// The cyclic vertices of graph, including vertices that have a path to
+  /// a vertex.
+  final List<T> cyclicVertices = [];
+
+  /// The topological index of all non-cyclic vertices of the graph.
+  ///
+  /// The "topological index" of a vertex is the length of the longest path
+  /// through neighbors. For vertices with no neighbors, the index is 0.
+  /// For any other vertex, it is 1 plus max of the index of its neighbors.
+  final Map<T, int> indexMap = {};
+
+  /// The non-cyclic vertices in layers according to their topological index.
+  /// That is, `layers[i]` contain the list of vertices with index `i`.
+  final List<List<T>> layers = [];
+}
diff --git a/pkg/kernel/test/clone_test.dart b/pkg/kernel/test/clone_test.dart
index 5501551..51ee518 100644
--- a/pkg/kernel/test/clone_test.dart
+++ b/pkg/kernel/test/clone_test.dart
@@ -155,7 +155,8 @@
     if (reference1 != null && reference2 != null) {
       ReferenceName referenceName1 = ReferenceName.fromNamedNode(member1);
       ReferenceName referenceName2 = ReferenceName.fromNamedNode(member2);
-      if (referenceName1.memberName == referenceName2.memberName &&
+      if (referenceName1.kind == referenceName2.kind &&
+              referenceName1.memberName == referenceName2.memberName &&
               referenceName1.memberUri == referenceName2.memberUri &&
               referenceName2.declarationName == null ||
           referenceName2.libraryUri == null) {
diff --git a/pkg/kernel/test/graph_test.dart b/pkg/kernel/test/graph_test.dart
index 143ab01..83827be 100644
--- a/pkg/kernel/test/graph_test.dart
+++ b/pkg/kernel/test/graph_test.dart
@@ -8,6 +8,13 @@
 
 import 'package:kernel/util/graph.dart';
 
+const String A = 'A';
+const String B = 'B';
+const String C = 'C';
+const String D = 'D';
+const String E = 'E';
+const String F = 'F';
+
 class TestGraph implements Graph<String> {
   final Map<String, List<String>> graph;
 
@@ -20,185 +27,533 @@
   Iterable<String> neighborsOf(String vertex) => graph[vertex]!;
 }
 
-void test(String expected, Map<String, List<String>> graph) {
-  List<List<String>> result = computeStrongComponents(new TestGraph(graph));
-  Expect.stringEquals(expected, "$result");
-}
+void test(
+    {required List<List<String>> expectedStrongComponents,
+    List<String> expectedSortedVertices = const [],
+    List<String> expectedCyclicVertices = const [],
+    List<List<String>> expectedLayers = const [],
+    List<List<List<String>>> expectedStrongLayers = const [],
+    required Map<String, List<String>> graphData}) {
+  Graph<String> graph = new TestGraph(graphData);
 
-void checkGraph(Map<String, List<String>> graph, String startingNodeName,
-    List<List<String>> expectedEvaluations, List<bool> expectedSccFlags) {
-  List<List<String>> result = computeStrongComponents(new TestGraph(graph));
-  List<List<String>> expectedReversed = <List<String>>[];
-  for (List<String> list in expectedEvaluations) {
-    expectedReversed.add(list.reversed.toList());
+  List<List<String>> strongComponentResult = computeStrongComponents(graph);
+  Expect.equals(
+      expectedStrongComponents.length,
+      strongComponentResult.length,
+      "Unexpected strongly connected components count. "
+      "Expected ${expectedStrongComponents}, "
+      "actual ${strongComponentResult}");
+  for (int index = 0; index < expectedStrongComponents.length; index++) {
+    Expect.listEquals(
+        expectedStrongComponents[index],
+        strongComponentResult[index],
+        "Unexpected strongly connected components. "
+        "Expected $expectedStrongComponents, actual $strongComponentResult.");
   }
-  Expect.stringEquals(expectedReversed.join(", "), result.join(", "));
+
+  TopologicalSortResult<String> topologicalResult = topologicalSort(graph);
+  Set<String> sortedAndCyclicVertices = topologicalResult.sortedVertices
+      .toSet()
+      .intersection(topologicalResult.cyclicVertices.toSet());
+  Expect.isTrue(sortedAndCyclicVertices.isEmpty,
+      "Found vertices both sorted and cyclic: $sortedAndCyclicVertices");
+  List<String> sortedOrCyclicVertices = [
+    ...topologicalResult.sortedVertices,
+    ...topologicalResult.cyclicVertices
+  ];
+  Expect.equals(
+      graphData.length,
+      sortedOrCyclicVertices.length,
+      "Unexpected vertex count. Expected ${graphData.length}, "
+      "found ${sortedOrCyclicVertices.length}.");
+  Expect.listEquals(
+      expectedSortedVertices,
+      topologicalResult.sortedVertices,
+      "Unexpected sorted vertices. "
+      "Expected $expectedSortedVertices, "
+      "actual ${topologicalResult.sortedVertices}.");
+  Expect.listEquals(
+      expectedCyclicVertices,
+      topologicalResult.cyclicVertices,
+      "Unexpected cyclic vertices. "
+      "Expected $expectedCyclicVertices, "
+      "actual ${topologicalResult.cyclicVertices}.");
+  Expect.equals(
+      expectedLayers.length,
+      topologicalResult.layers.length,
+      "Unexpected topological layer count. "
+      "Expected ${expectedLayers}, "
+      "actual ${topologicalResult.layers}");
+  for (int index = 0; index < expectedLayers.length; index++) {
+    Expect.listEquals(
+        expectedLayers[index],
+        topologicalResult.layers[index],
+        "Unexpected topological layers. "
+        "Expected $expectedLayers, "
+        "actual ${topologicalResult.layers}.");
+    for (String vertex in topologicalResult.layers[index]) {
+      int actualIndex = topologicalResult.indexMap[vertex]!;
+      Expect.equals(
+          index,
+          actualIndex,
+          "Unexpected topological index for $vertex. "
+          "Expected $index, found $actualIndex.");
+    }
+  }
+
+  StrongComponentGraph<String> strongComponentGraph =
+      new StrongComponentGraph(graph, strongComponentResult);
+  TopologicalSortResult<List<String>> strongTopologicalResult =
+      topologicalSort(strongComponentGraph);
+  Expect.equals(
+      expectedStrongLayers.length,
+      strongTopologicalResult.layers.length,
+      "Unexpected strong topological layer count. "
+      "Expected ${expectedStrongLayers}, "
+      "actual ${strongTopologicalResult.layers}");
+  for (int index = 0; index < expectedStrongLayers.length; index++) {
+    List<List<String>> expectedStrongLayer = expectedStrongLayers[index];
+    List<List<String>> strongLayer = strongTopologicalResult.layers[index];
+    Expect.equals(
+        expectedStrongLayer.length,
+        strongLayer.length,
+        "Unexpected strong topological layer $index count. "
+        "Expected ${expectedStrongLayers}, "
+        "actual ${strongTopologicalResult.layers}");
+
+    for (int subIndex = 0; subIndex < expectedStrongLayer.length; subIndex++) {
+      Expect.listEquals(
+          expectedStrongLayer[subIndex],
+          strongLayer[subIndex],
+          "Unexpected strong topological layer $index. "
+          "Expected $expectedStrongLayer, "
+          "actual $strongLayer.");
+    }
+    for (List<String> vertex in strongTopologicalResult.layers[index]) {
+      int actualIndex = strongTopologicalResult.indexMap[vertex]!;
+      Expect.equals(
+          index,
+          actualIndex,
+          "Unexpected strong topological index for $vertex. "
+          "Expected $index, found $actualIndex.");
+    }
+  }
 }
 
 void main() {
-  test("[[B, A], [C], [D]]", {
-    "A": ["B"],
-    "B": ["A"],
-    "C": ["A"],
-    "D": ["C"],
-  });
+  test(graphData: {
+    A: [B],
+    B: [A],
+    C: [A],
+    D: [C],
+  }, expectedStrongComponents: [
+    [B, A],
+    [C],
+    [D]
+  ], expectedCyclicVertices: [
+    B,
+    A,
+    C,
+    D
+  ], expectedStrongLayers: [
+    [
+      [B, A]
+    ],
+    [
+      [C]
+    ],
+    [
+      [D]
+    ]
+  ]);
 
-  test("[]", {});
+  test(graphData: {}, expectedStrongComponents: []);
 
-  test("[[A], [B], [C], [D]]", {
-    "A": [],
-    "B": [],
-    "C": [],
-    "D": [],
-  });
+  test(graphData: {
+    A: [],
+    B: [],
+    C: [],
+    D: [],
+  }, expectedStrongComponents: [
+    [A],
+    [B],
+    [C],
+    [D]
+  ], expectedSortedVertices: [
+    A,
+    B,
+    C,
+    D
+  ], expectedLayers: [
+    [A, B, C, D]
+  ], expectedStrongLayers: [
+    [
+      [A],
+      [B],
+      [C],
+      [D]
+    ]
+  ]);
 
-  test("[[B, A], [C], [D]]", {
-    "D": ["C"],
-    "C": ["A"],
-    "B": ["A"],
-    "A": ["B"],
-  });
+  test(graphData: {
+    D: [C],
+    C: [A],
+    B: [A],
+    A: [B],
+  }, expectedStrongComponents: [
+    [B, A],
+    [C],
+    [D]
+  ], expectedCyclicVertices: [
+    B,
+    A,
+    C,
+    D
+  ], expectedStrongLayers: [
+    [
+      [B, A]
+    ],
+    [
+      [C]
+    ],
+    [
+      [D]
+    ]
+  ]);
 
-  test("[[D], [C], [B], [A]]", {
-    "A": ["B"],
-    "B": ["C"],
-    "C": ["D"],
-    "D": [],
-  });
+  test(graphData: {
+    A: [B],
+    B: [C],
+    C: [D],
+    D: [],
+  }, expectedStrongComponents: [
+    [D],
+    [C],
+    [B],
+    [A]
+  ], expectedSortedVertices: [
+    D,
+    C,
+    B,
+    A
+  ], expectedLayers: [
+    [D],
+    [C],
+    [B],
+    [A]
+  ], expectedStrongLayers: [
+    [
+      [D]
+    ],
+    [
+      [C]
+    ],
+    [
+      [B]
+    ],
+    [
+      [A]
+    ]
+  ]);
 
-  test("[[D], [C], [B], [A]]", {
-    "D": [],
-    "C": ["D"],
-    "B": ["C"],
-    "A": ["B"],
-  });
+  test(graphData: {
+    D: [],
+    C: [D],
+    B: [C],
+    A: [B],
+  }, expectedStrongComponents: [
+    [D],
+    [C],
+    [B],
+    [A]
+  ], expectedSortedVertices: [
+    D,
+    C,
+    B,
+    A
+  ], expectedLayers: [
+    [D],
+    [C],
+    [B],
+    [A]
+  ], expectedStrongLayers: [
+    [
+      [D]
+    ],
+    [
+      [C]
+    ],
+    [
+      [B]
+    ],
+    [
+      [A]
+    ]
+  ]);
 
-  test("[[A], [B], [C], [D]]", {
-    "A": [],
-    "B": ["A"],
-    "C": ["A"],
-    "D": ["B", "C"],
-  });
+  test(graphData: {
+    A: [],
+    B: [A],
+    C: [A],
+    D: [B, C],
+  }, expectedStrongComponents: [
+    [A],
+    [B],
+    [C],
+    [D]
+  ], expectedSortedVertices: [
+    A,
+    B,
+    C,
+    D
+  ], expectedLayers: [
+    [A],
+    [B, C],
+    [D]
+  ], expectedStrongLayers: [
+    [
+      [A]
+    ],
+    [
+      [B],
+      [C]
+    ],
+    [
+      [D]
+    ]
+  ]);
 
   // Test a complex graph.
-  checkGraph(
-      {
-        'a': ['b', 'c'],
-        'b': ['c', 'd'],
-        'c': [],
-        'd': ['c', 'e'],
-        'e': ['b', 'f'],
-        'f': ['c', 'd']
-      },
-      'a',
-      [
-        ['c'],
-        ['b', 'd', 'e', 'f'],
-        ['a']
-      ],
-      [false, true, false]);
+  test(graphData: {
+    A: [B, C],
+    B: [C, D],
+    C: [],
+    D: [C, E],
+    E: [B, F],
+    F: [C, D]
+  }, expectedStrongComponents: [
+    [C],
+    [F, E, D, B],
+    [A],
+  ], expectedSortedVertices: [
+    C
+  ], expectedCyclicVertices: [
+    E,
+    D,
+    B,
+    A,
+    F
+  ], expectedLayers: [
+    [C]
+  ], expectedStrongLayers: [
+    [
+      [C]
+    ],
+    [
+      [F, E, D, B]
+    ],
+    [
+      [A]
+    ]
+  ]);
 
   // Test a diamond-shaped graph.
-  checkGraph(
-      {
-        'a': ['b', 'c'],
-        'b': ['d'],
-        'c': ['d'],
-        'd': []
-      },
-      'a',
-      [
-        ['d'],
-        ['b'],
-        ['c'],
-        ['a']
-      ],
-      [false, false, false, false]);
+  test(graphData: {
+    A: [B, C],
+    B: [D],
+    C: [D],
+    D: []
+  }, expectedStrongComponents: [
+    [D],
+    [B],
+    [C],
+    [A],
+  ], expectedSortedVertices: [
+    D,
+    B,
+    C,
+    A
+  ], expectedLayers: [
+    [D],
+    [B, C],
+    [A]
+  ], expectedStrongLayers: [
+    [
+      [D]
+    ],
+    [
+      [B],
+      [C]
+    ],
+    [
+      [A]
+    ]
+  ]);
 
   // Test a graph with a single node.
-  checkGraph(
-      {'a': []},
-      'a',
-      [
-        ['a']
-      ],
-      [false]);
+  test(graphData: {
+    A: []
+  }, expectedStrongComponents: [
+    [A]
+  ], expectedSortedVertices: [
+    A
+  ], expectedLayers: [
+    [A]
+  ], expectedStrongLayers: [
+    [
+      [A]
+    ]
+  ]);
 
   // Test a graph with a single node and a trivial cycle.
-  checkGraph(
-      {
-        'a': ['a']
-      },
-      'a',
-      [
-        ['a']
-      ],
-      [true]);
+  test(graphData: {
+    A: [A]
+  }, expectedStrongComponents: [
+    [A]
+  ], expectedCyclicVertices: [
+    A
+  ], expectedStrongLayers: [
+    [
+      [A]
+    ]
+  ]);
 
   // Test a graph with three nodes with circular dependencies.
-  checkGraph(
-      {
-        'a': ['b'],
-        'b': ['c'],
-        'c': ['a'],
-      },
-      'a',
-      [
-        ['a', 'b', 'c']
-      ],
-      [true]);
+  test(graphData: {
+    A: [B],
+    B: [C],
+    C: [A],
+  }, expectedStrongComponents: [
+    [C, B, A]
+  ], expectedCyclicVertices: [
+    C,
+    B,
+    A
+  ], expectedStrongLayers: [
+    [
+      [C, B, A]
+    ]
+  ]);
+
   // Test a graph A->B->C->D, where D points back to B and then C.
-  checkGraph(
-      {
-        'a': ['b'],
-        'b': ['c'],
-        'c': ['d'],
-        'd': ['b', 'c']
-      },
-      'a',
-      [
-        ['b', 'c', 'd'],
-        ['a']
-      ],
-      [true, false]);
+  test(graphData: {
+    A: [B],
+    B: [C],
+    C: [D],
+    D: [B, C]
+  }, expectedStrongComponents: [
+    [D, C, B],
+    [A]
+  ], expectedCyclicVertices: [
+    D,
+    C,
+    B,
+    A
+  ], expectedStrongLayers: [
+    [
+      [D, C, B]
+    ],
+    [
+      [A]
+    ]
+  ]);
 
   // Test a graph A->B->C->D, where D points back to C and then B.
-  checkGraph(
-      {
-        'a': ['b'],
-        'b': ['c'],
-        'c': ['d'],
-        'd': ['c', 'b']
-      },
-      'a',
-      [
-        ['b', 'c', 'd'],
-        ['a']
-      ],
-      [true, false]);
+  test(graphData: {
+    A: [B],
+    B: [C],
+    C: [D],
+    D: [C, B]
+  }, expectedStrongComponents: [
+    [D, C, B],
+    [A]
+  ], expectedCyclicVertices: [
+    D,
+    C,
+    B,
+    A
+  ], expectedStrongLayers: [
+    [
+      [D, C, B]
+    ],
+    [
+      [A]
+    ]
+  ]);
 
   // Test a graph with two nodes with circular dependencies.
-  checkGraph(
-      {
-        'a': ['b'],
-        'b': ['a']
-      },
-      'a',
-      [
-        ['a', 'b']
-      ],
-      [true]);
+  test(graphData: {
+    A: [B],
+    B: [A]
+  }, expectedStrongComponents: [
+    [B, A]
+  ], expectedCyclicVertices: [
+    B,
+    A
+  ], expectedStrongLayers: [
+    [
+      [B, A]
+    ]
+  ]);
 
   // Test a graph with two nodes and a single dependency.
-  checkGraph(
-      {
-        'a': ['b'],
-        'b': []
-      },
-      'a',
-      [
-        ['b'],
-        ['a']
-      ],
-      [false, false]);
+  test(graphData: {
+    A: [B],
+    B: []
+  }, expectedStrongComponents: [
+    [B],
+    [A]
+  ], expectedSortedVertices: [
+    B,
+    A
+  ], expectedLayers: [
+    [B],
+    [A]
+  ], expectedStrongLayers: [
+    [
+      [B]
+    ],
+    [
+      [A]
+    ]
+  ]);
+
+  test(graphData: {
+    A: [],
+    B: [A],
+    C: [B, D],
+    D: [C],
+    E: [A],
+    F: [B],
+  }, expectedStrongComponents: [
+    [A],
+    [B],
+    [D, C],
+    [E],
+    [F],
+  ], expectedSortedVertices: [
+    A,
+    B,
+    E,
+    F,
+  ], expectedCyclicVertices: [
+    D,
+    C,
+  ], expectedLayers: [
+    [A],
+    [B, E],
+    [F],
+  ], expectedStrongLayers: [
+    [
+      [A]
+    ],
+    [
+      [B],
+      [E]
+    ],
+    [
+      [D, C],
+      [F]
+    ]
+  ]);
 }
diff --git a/pkg/kernel/test/reference_name_test.dart b/pkg/kernel/test/reference_name_test.dart
new file mode 100644
index 0000000..23c7b97
--- /dev/null
+++ b/pkg/kernel/test/reference_name_test.dart
@@ -0,0 +1,333 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All 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:kernel/ast.dart';
+import 'package:kernel/src/equivalence.dart';
+
+void testReferenceNames(Map<ReferenceNameKind, List<ReferenceNameObject>> map1,
+    Map<ReferenceNameKind, List<ReferenceNameObject>> map2) {
+  Expect.setEquals(map1.keys, map2.keys);
+  map1.forEach((ReferenceNameKind kind1, List<ReferenceNameObject> list1) {
+    map1.forEach((ReferenceNameKind kind2, List<ReferenceNameObject> list2) {
+      for (int index1 = 0; index1 < list1.length; index1++) {
+        for (int index2 = 0; index2 < list2.length; index2++) {
+          ReferenceName name1 = list1[index1].referenceName;
+          Object object1 = list1[index1].object;
+          ReferenceName name2 = list2[index2].referenceName;
+          Object object2 = list2[index2].object;
+          if (kind1 == kind2 && index1 == index2) {
+            Expect.equals(
+                name1,
+                name2,
+                "Expected $name1 for ${object1} (${object1.runtimeType}) and "
+                "$name2 for $object2 (${object2.runtimeType}) to be equal.");
+          } else {
+            Expect.notEquals(
+                name1,
+                name2,
+                "Expected $name1 for ${object1} (${object1.runtimeType}) and "
+                "$name2 for $object2 (${object2.runtimeType}) to be unequal.");
+          }
+        }
+      }
+    });
+  });
+}
+
+void main() {
+  Component component1 = createComponent();
+  Map<ReferenceNameKind, List<ReferenceNameObject>> referenceNames1 =
+      computeReferenceNamesFromComponent(component1);
+
+  Component component2 = createComponent();
+  Map<ReferenceNameKind, List<ReferenceNameObject>> referenceNames2 =
+      computeReferenceNamesFromComponent(component2);
+
+  Component component3 = createComponent();
+  component3.computeCanonicalNames();
+  CanonicalName root3 = component3.root;
+  Map<ReferenceNameKind, List<ReferenceNameObject>> referenceNames3 =
+      computeReferenceNamesFromCanonicalName(root3);
+
+  Component component4 = createComponent();
+  component4.computeCanonicalNames();
+  CanonicalName root4 = component3.root;
+  Map<ReferenceNameKind, List<ReferenceNameObject>> referenceNames4 =
+      computeReferenceNamesFromCanonicalName(root4);
+
+  testReferenceNames(referenceNames1, referenceNames2);
+  testReferenceNames(referenceNames1, referenceNames3);
+  testReferenceNames(referenceNames3, referenceNames4);
+}
+
+Component createComponent() {
+  Component component = new Component();
+  Library library1 = new Library(Uri.parse('test:library1'), fileUri: dummyUri);
+  component.libraries.add(library1);
+  Library library2 = new Library(Uri.parse('test:library2'), fileUri: dummyUri);
+  component.libraries.add(library2);
+
+  library1.addProcedure(new Procedure(
+      new Name('foo'), ProcedureKind.Method, new FunctionNode(null),
+      fileUri: dummyUri));
+  library1.addProcedure(new Procedure(
+      new Name('bar'), ProcedureKind.Operator, new FunctionNode(null),
+      fileUri: dummyUri));
+  library1.addProcedure(new Procedure(
+      new Name('baz'), ProcedureKind.Factory, new FunctionNode(null),
+      fileUri: dummyUri));
+  library1.addProcedure(new Procedure(
+      new Name('boz'), ProcedureKind.Getter, new FunctionNode(null),
+      fileUri: dummyUri));
+  // The setter should be distinct from the getter even when they have the same
+  // name.
+  library1.addProcedure(new Procedure(
+      new Name('boz'), ProcedureKind.Setter, new FunctionNode(null),
+      fileUri: dummyUri));
+
+  library1.addProcedure(new Procedure(
+      new Name('_boz', library2), ProcedureKind.Getter, new FunctionNode(null),
+      fileUri: dummyUri));
+  // The setter should be distinct from the getter even when they have the same
+  // name.
+  library1.addProcedure(new Procedure(
+      new Name('_boz', library2), ProcedureKind.Setter, new FunctionNode(null),
+      fileUri: dummyUri));
+
+  library1.addField(
+      new Field.immutable(new Name('_foo', library1), fileUri: dummyUri));
+  library1.addField(
+      new Field.mutable(new Name('_bar', library2), fileUri: dummyUri));
+
+  Class class1 = new Class(name: 'Foo', fileUri: dummyUri);
+  library2.addClass(class1);
+  Class class2 = new Class(name: 'Bar', fileUri: dummyUri);
+  library2.addClass(class2);
+
+  class2.addConstructor(new Constructor(new FunctionNode(null),
+      name: new Name(''), fileUri: dummyUri));
+  class2.addConstructor(new Constructor(new FunctionNode(null),
+      name: new Name('_', library1), fileUri: dummyUri));
+
+  class2.addProcedure(new Procedure(
+      new Name('foo'), ProcedureKind.Method, new FunctionNode(null),
+      fileUri: dummyUri));
+  class2.addProcedure(new Procedure(
+      new Name('bar'), ProcedureKind.Operator, new FunctionNode(null),
+      fileUri: dummyUri));
+  class2.addProcedure(new Procedure(
+      new Name('baz'), ProcedureKind.Factory, new FunctionNode(null),
+      fileUri: dummyUri));
+  class2.addProcedure(new Procedure(
+      new Name('boz'), ProcedureKind.Getter, new FunctionNode(null),
+      fileUri: dummyUri));
+  // The setter should be distinct from the getter even when they have the same
+  // name.
+  class2.addProcedure(new Procedure(
+      new Name('boz'), ProcedureKind.Setter, new FunctionNode(null),
+      fileUri: dummyUri));
+
+  class2.addProcedure(new Procedure(
+      new Name('_boz', library2), ProcedureKind.Getter, new FunctionNode(null),
+      fileUri: dummyUri));
+  // The setter should be distinct from the getter even when they have the same
+  // name.
+  class2.addProcedure(new Procedure(
+      new Name('_boz', library2), ProcedureKind.Setter, new FunctionNode(null),
+      fileUri: dummyUri));
+
+  class2.addField(
+      new Field.immutable(new Name('_foo', library1), fileUri: dummyUri));
+  class2.addField(
+      new Field.mutable(new Name('_bar', library2), fileUri: dummyUri));
+
+  class2.addRedirectingFactory(new RedirectingFactory(null,
+      name: new Name('_boz', library1),
+      function: new FunctionNode(null),
+      fileUri: dummyUri));
+
+  library1.addExtension(new Extension(name: 'Baz', fileUri: dummyUri));
+
+  library1.addTypedef(new Typedef('Boz', dummyDartType, fileUri: dummyUri));
+
+  return component;
+}
+
+void sortReferenceNames(Map<ReferenceNameKind, List<ReferenceNameObject>> map) {
+  map.forEach((key, value) {
+    value.sort(
+        (n1, n2) => n1.referenceName.name!.compareTo(n2.referenceName.name!));
+  });
+}
+
+Map<ReferenceNameKind, List<ReferenceNameObject>>
+    computeReferenceNamesFromComponent(Component component) {
+  Map<ReferenceNameKind, List<ReferenceNameObject>> map = {};
+  void add(ReferenceNameKind kind, ReferenceNameObject object) {
+    (map[kind] ??= []).add(object);
+  }
+
+  for (Library library in component.libraries) {
+    add(ReferenceNameKind.Library,
+        new ReferenceNameObject(ReferenceName.fromNamedNode(library), library));
+    for (Typedef typedef in library.typedefs) {
+      add(
+          ReferenceNameKind.Typedef,
+          new ReferenceNameObject(
+              ReferenceName.fromNamedNode(typedef), typedef));
+    }
+    for (Field field in library.fields) {
+      add(
+          ReferenceNameKind.Field,
+          new ReferenceNameObject(
+              ReferenceName.fromNamedNode(field, ReferenceNameKind.Field),
+              field));
+      add(
+          ReferenceNameKind.Getter,
+          new ReferenceNameObject(
+              ReferenceName.fromNamedNode(field, ReferenceNameKind.Getter),
+              field));
+      if (field.hasSetter) {
+        add(
+            ReferenceNameKind.Setter,
+            new ReferenceNameObject(
+                ReferenceName.fromNamedNode(field, ReferenceNameKind.Setter),
+                field));
+      }
+    }
+    for (Procedure procedure in library.procedures) {
+      ReferenceNameKind kind;
+      if (procedure.isGetter) {
+        kind = ReferenceNameKind.Getter;
+      } else if (procedure.isSetter) {
+        kind = ReferenceNameKind.Setter;
+      } else {
+        kind = ReferenceNameKind.Function;
+      }
+      add(
+          kind,
+          new ReferenceNameObject(
+              ReferenceName.fromNamedNode(procedure), procedure));
+    }
+    for (Class cls in library.classes) {
+      add(ReferenceNameKind.Declaration,
+          new ReferenceNameObject(ReferenceName.fromNamedNode(cls), cls));
+
+      for (Constructor constructor in cls.constructors) {
+        add(
+            ReferenceNameKind.Function,
+            new ReferenceNameObject(
+                ReferenceName.fromNamedNode(constructor), constructor));
+      }
+      for (Procedure procedure in cls.procedures) {
+        ReferenceNameKind kind;
+        if (procedure.isGetter) {
+          kind = ReferenceNameKind.Getter;
+        } else if (procedure.isSetter) {
+          kind = ReferenceNameKind.Setter;
+        } else {
+          kind = ReferenceNameKind.Function;
+        }
+        add(
+            kind,
+            new ReferenceNameObject(
+                ReferenceName.fromNamedNode(procedure), procedure));
+      }
+      for (Field field in cls.fields) {
+        add(ReferenceNameKind.Field,
+            new ReferenceNameObject(ReferenceName.fromNamedNode(field), field));
+        add(
+            ReferenceNameKind.Getter,
+            new ReferenceNameObject(
+                ReferenceName.fromNamedNode(field, ReferenceNameKind.Getter),
+                field));
+        if (field.hasSetter) {
+          add(
+              ReferenceNameKind.Setter,
+              new ReferenceNameObject(
+                  ReferenceName.fromNamedNode(field, ReferenceNameKind.Setter),
+                  field));
+        }
+      }
+      for (RedirectingFactory redirectingFactory in cls.redirectingFactories) {
+        add(
+            ReferenceNameKind.Function,
+            new ReferenceNameObject(
+                ReferenceName.fromNamedNode(redirectingFactory),
+                redirectingFactory));
+      }
+    }
+    for (Extension extension in library.extensions) {
+      add(
+          ReferenceNameKind.Declaration,
+          new ReferenceNameObject(
+              ReferenceName.fromNamedNode(extension), extension));
+    }
+  }
+  sortReferenceNames(map);
+  return map;
+}
+
+Map<ReferenceNameKind, List<ReferenceNameObject>>
+    computeReferenceNamesFromCanonicalName(CanonicalName root) {
+  Map<ReferenceNameKind, List<ReferenceNameObject>> map = {};
+
+  void visit(CanonicalName canonicalName, ReferenceNameKind kind) {
+    void addObject() {
+      (map[kind] ??= []).add(new ReferenceNameObject(
+          ReferenceName.fromCanonicalName(canonicalName), canonicalName));
+    }
+
+    switch (kind) {
+      case ReferenceNameKind.Unknown:
+        for (CanonicalName child in canonicalName.children) {
+          visit(child, ReferenceNameKind.Library);
+        }
+        break;
+      case ReferenceNameKind.Library:
+        addObject();
+        for (CanonicalName child in canonicalName.children) {
+          ReferenceNameKind childKind = ReferenceNameKind.Declaration;
+          if (CanonicalName.isSymbolicName(child.name)) {
+            childKind = ReferenceName.kindFromSymbolicName(child.name);
+          }
+          visit(child, childKind);
+        }
+        break;
+      case ReferenceNameKind.Declaration:
+        addObject();
+        for (CanonicalName child in canonicalName.children) {
+          visit(child, ReferenceName.kindFromSymbolicName(child.name));
+        }
+        break;
+      case ReferenceNameKind.Typedef:
+      case ReferenceNameKind.Function:
+      case ReferenceNameKind.Field:
+      case ReferenceNameKind.Getter:
+      case ReferenceNameKind.Setter:
+        if (canonicalName.childrenOrNull != null) {
+          // Private name
+          for (CanonicalName child in canonicalName.children) {
+            visit(child, kind);
+          }
+        } else {
+          addObject();
+        }
+        break;
+    }
+  }
+
+  visit(root, ReferenceNameKind.Unknown);
+
+  sortReferenceNames(map);
+  return map;
+}
+
+class ReferenceNameObject {
+  final ReferenceName referenceName;
+  final Object object;
+
+  ReferenceNameObject(this.referenceName, this.object);
+}
diff --git a/pkg/meta/lib/meta.dart b/pkg/meta/lib/meta.dart
index 584fe42..ba14be9 100644
--- a/pkg/meta/lib/meta.dart
+++ b/pkg/meta/lib/meta.dart
@@ -274,7 +274,7 @@
 
 /// Used to annotate a method, field, or getter within a class, mixin, or
 /// extension, or a or top-level getter, variable or function to indicate that
-/// the value obtained by invoking it should be use. A value is considered used
+/// the value obtained by invoking it should be used. A value is considered used
 /// if it is assigned to a variable, passed to a function, or used as the target
 /// of an invocation, or invoked (if the result is itself a function).
 ///
diff --git a/pkg/nnbd_migration/analysis_options.yaml b/pkg/nnbd_migration/analysis_options.yaml
index d38c130..7f93d4a 100644
--- a/pkg/nnbd_migration/analysis_options.yaml
+++ b/pkg/nnbd_migration/analysis_options.yaml
@@ -11,8 +11,8 @@
     # There are currently 20 violations.
     unawaited_futures: ignore
 
-  strong-mode:
-    implicit-casts: false
+  language:
+    strict-casts: true
 
 linter:
   rules:
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index 030f06f..0fc0c32 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -84,6 +84,9 @@
   }
 
   @override
+  DecoratedType? _getCallMethodType(DecoratedType type) => null;
+
+  @override
   DecoratedType _getTypeParameterTypeBound(DecoratedType type) {
     return bounds[(type.type as TypeParameterType).element] ??
         (throw StateError('Unknown bound for $type'));
@@ -241,8 +244,10 @@
   /// assigned to so far inside it.  Otherwise `null`.
   Set<Element>? _elementsWrittenToInLocalFunction;
 
+  final LibraryElement _library;
+
   EdgeBuilder(this.typeProvider, this._typeSystem, this._variables, this._graph,
-      this.source, this.listener, this._decoratedClassHierarchy,
+      this.source, this.listener, this._decoratedClassHierarchy, this._library,
       {this.instrumentation})
       : _inheritanceManager = InheritanceManager3(),
         _whereOrNullTransformer =
@@ -490,7 +495,9 @@
   DecoratedType visitAwaitExpression(AwaitExpression node) {
     var expressionType = _dispatch(node.expression)!;
     var type = expressionType.type!;
-    if (_typeSystem.isSubtypeOf(type, typeProvider.futureDynamicType)) {
+    if (type.isDartCoreNull) {
+      // Nothing to do; awaiting `null` produces `null`.
+    } else if (_typeSystem.isSubtypeOf(type, typeProvider.futureDynamicType)) {
       expressionType = _decoratedClassHierarchy!
           .asInstanceOf(expressionType, typeProvider.futureElement)
           .typeArguments[0]!;
@@ -2363,6 +2370,20 @@
           typeArguments: [type]);
 
   @override
+  DecoratedType? _getCallMethodType(DecoratedType type) {
+    var typeType = type.type;
+    if (typeType is InterfaceType) {
+      var callMethod = typeType.lookUpMethod2('call', _library);
+      if (callMethod != null) {
+        return _variables!
+            .decoratedElementType(callMethod.declaration)
+            .substitute(type.asSubstitution);
+      }
+    }
+    return null;
+  }
+
+  @override
   DecoratedType? _getTypeParameterTypeBound(DecoratedType type) {
     // TODO(paulberry): once we've wired up flow analysis, return promoted
     // bounds if applicable.
@@ -3526,6 +3547,19 @@
             source: source, destination: destination, hard: hard);
         return;
       }
+      if (destinationType is FunctionType) {
+        var callMethodType = _getCallMethodType(source);
+        if (callMethodType != null) {
+          // Handle implicit `.call` coercion
+          _checkAssignment(origin, edgeTarget,
+              source: callMethodType,
+              destination: destination,
+              hard: false,
+              checkable: false,
+              sourceIsFunctionLiteral: sourceIsFunctionLiteral);
+          return;
+        }
+      }
       // A side cast. This may be an explicit side cast, or illegal code. There
       // is no nullability we can infer here.
       assert(
@@ -3796,6 +3830,11 @@
       EdgeOrigin origin, FixReasonTarget edgeTarget,
       {bool hard = false, bool checkable = true});
 
+  /// If [type] represents a class containing a `call` method, returns the
+  /// decorated type of the `call` method, with appropriate substitutions.
+  /// Otherwise returns `null`.
+  DecoratedType? _getCallMethodType(DecoratedType type);
+
   /// Given a [type] representing a type parameter, retrieves the type's bound.
   DecoratedType? _getTypeParameterTypeBound(DecoratedType type);
 }
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
index 5e57c8b..0caee26 100644
--- a/pkg/nnbd_migration/lib/src/fix_builder.dart
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -292,6 +292,7 @@
     return TypeSystemImpl(
         implicitCasts: typeSystem.implicitCasts,
         isNonNullableByDefault: true,
+        strictCasts: typeSystem.strictCasts,
         strictInference: typeSystem.strictInference,
         typeProvider: nnbdTypeProvider);
   }
@@ -671,6 +672,31 @@
     return null;
   }
 
+  bool _isSubtypeOrCoercible(DartType type, DartType context) {
+    var fixBuilder = _fixBuilder!;
+    var typeSystem = fixBuilder._typeSystem;
+    if (typeSystem.isSubtypeOf(type, context)) {
+      return true;
+    }
+    if (context is FunctionType && type is InterfaceType) {
+      var callMethod =
+          type.lookUpMethod2('call', fixBuilder.unit!.declaredElement!.library);
+      if (callMethod != null) {
+        var variables = fixBuilder._variables!;
+        var callMethodType = variables.toFinalType(
+            variables.decoratedElementType(callMethod.declaration));
+        if (callMethod is MethodMember) {
+          callMethodType =
+              callMethod.substitution.substituteType(callMethodType);
+        }
+        if (typeSystem.isSubtypeOf(callMethodType, context)) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
   DartType _modifyRValueType(Expression node, DartType type,
       {DartType? context}) {
     if (node is MethodInvocation) {
@@ -696,7 +722,7 @@
     var ancestor = _findNullabilityContextAncestor(node);
     context ??=
         InferenceContext.getContext(ancestor) ?? DynamicTypeImpl.instance;
-    if (!_fixBuilder!._typeSystem.isSubtypeOf(type, context)) {
+    if (!_isSubtypeOrCoercible(type, context)) {
       var transformationInfo =
           _fixBuilder!._whereOrNullTransformer.tryTransformOrElseArgument(node);
       if (transformationInfo != null) {
@@ -1029,8 +1055,22 @@
       if (explicitTypeNeeded) {
         var firstNeededType = neededTypes[0];
         if (neededTypes.any((t) => t != firstNeededType)) {
-          throw UnimplementedError(
-              'Different explicit types needed in multi-variable declaration');
+          // Different variables need different types.  We handle this by
+          // introducing casts, which is not great but gets the job done.
+          for (int i = 0; i < node.variables.length; i++) {
+            if (neededTypes[i] != inferredTypes[i]) {
+              // We only have to worry about variables with initializers because
+              // variables without initializers will get the type `dynamic`.
+              var initializer = node.variables[i].initializer;
+              if (initializer != null) {
+                (_fixBuilder._getChange(initializer) as NodeChangeForExpression)
+                    .addExpressionChange(
+                        IntroduceAsChange(neededTypes[i], isDowncast: false),
+                        AtomicEditInfo(
+                            NullabilityFixDescription.otherCastExpression, {}));
+              }
+            }
+          }
         } else {
           (_fixBuilder._getChange(node) as NodeChangeForVariableDeclarationList)
               .addExplicitType = firstNeededType;
diff --git a/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart b/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart
index 53dc64a..2616d26 100644
--- a/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart
@@ -7708,7 +7708,7 @@
 ''';
 
 String? _migration_js;
-// migration_dart md5 is 'b415a0a8e74e830025f1153f10871ddd'
+// migration_dart md5 is '14d25a61d6f2ddb7ec83f7e257afa33d'
 String _migration_js_base64 = '''
 KGZ1bmN0aW9uIGRhcnRQcm9ncmFtKCl7ZnVuY3Rpb24gY29weVByb3BlcnRpZXMoYSxiKXt2YXIgcz1P
 YmplY3Qua2V5cyhhKQpmb3IodmFyIHI9MDtyPHMubGVuZ3RoO3IrKyl7dmFyIHE9c1tyXQpiW3FdPWFb
@@ -7787,7 +7787,7 @@
 JCl9dmFyIEI9ewp3Uigpe3JldHVybiBuZXcgQi5xcCgiIiwiIiwiIixDLkR4KX0sCllmKGEpe3ZhciBz
 LHIscSxwLG8sbixtLGwsaz1ILmsoYS5xKDAsInJlZ2lvbnMiKSksaj1ILmsoYS5xKDAsIm5hdmlnYXRp
 b25Db250ZW50IikpLGk9SC5rKGEucSgwLCJzb3VyY2VDb2RlIikpLGg9UC5GbCh0Lk4sdC5mNCkKZm9y
-KHM9dC5HLmEoYS5xKDAsImVkaXRzIikpLHM9cy5nUHUocykscz1zLmdtKHMpLHI9dC5SLHE9dC5naTtz
+KHM9dC5HLmEoYS5xKDAsImVkaXRzIikpLHM9cy5nUHUocykscz1zLmdtKHMpLHI9dC5hLHE9dC5naTtz
 LkYoKTspe3A9cy5nbCgpCm89cC5hCm49SC5RSShbXSxxKQpmb3IocD1KLklUKHIuYShwLmIpKTtwLkYo
 KTspe209cC5nbCgpCmw9Si5VNihtKQpuLnB1c2gobmV3IEIuajgoSC5VYyhsLnEobSwibGluZSIpKSxI
 LmsobC5xKG0sImV4cGxhbmF0aW9uIikpLEguVWMobC5xKG0sIm9mZnNldCIpKSkpfWguWTUoMCxvLG4p
@@ -7812,9 +7812,9 @@
 biBzLTg3CnJldHVybi0xfSwKY2IoYSxiLGMpe3JldHVybiBhfSwKcUMoYSxiLGMsZCl7UC5rMShiLCJz
 dGFydCIpCmlmKGMhPW51bGwpe1AuazEoYywiZW5kIikKaWYoYj5jKUgudihQLlRFKGIsMCxjLCJzdGFy
 dCIsbnVsbCkpfXJldHVybiBuZXcgSC5uSChhLGIsYyxkLkMoIm5IPDA+IikpfSwKSzEoYSxiLGMsZCl7
-aWYodC5XLmIoYSkpcmV0dXJuIG5ldyBILnh5KGEsYixjLkMoIkA8MD4iKS5LcShkKS5DKCJ4eTwxLDI+
+aWYodC5VLmIoYSkpcmV0dXJuIG5ldyBILnh5KGEsYixjLkMoIkA8MD4iKS5LcShkKS5DKCJ4eTwxLDI+
 IikpCnJldHVybiBuZXcgSC5pMShhLGIsYy5DKCJAPDA+IikuS3EoZCkuQygiaTE8MSwyPiIpKX0sCmJL
-KGEsYixjKXtpZih0LlcuYihhKSl7UC5rMShiLCJjb3VudCIpCnJldHVybiBuZXcgSC5kNShhLGIsYy5D
+KGEsYixjKXtpZih0LlUuYihhKSl7UC5rMShiLCJjb3VudCIpCnJldHVybiBuZXcgSC5kNShhLGIsYy5D
 KCJkNTwwPiIpKX1QLmsxKGIsImNvdW50IikKcmV0dXJuIG5ldyBILkFNKGEsYixjLkMoIkFNPDA+Iikp
 fSwKV3AoKXtyZXR1cm4gbmV3IFAubGooIk5vIGVsZW1lbnQiKX0sCkFtKCl7cmV0dXJuIG5ldyBQLmxq
 KCJUb28gbWFueSBlbGVtZW50cyIpfSwKYXIoKXtyZXR1cm4gbmV3IFAubGooIlRvbyBmZXcgZWxlbWVu
@@ -7926,7 +7926,7 @@
 IG5ldyBILmF6KGEscixzP251bGw6Yi5yZWNlaXZlcil9LApSdShhKXtpZihhPT1udWxsKXJldHVybiBu
 ZXcgSC50ZShhKQppZihhIGluc3RhbmNlb2YgSC5icSlyZXR1cm4gSC50VyhhLHQuSy5hKGEuYSkpCmlm
 KHR5cGVvZiBhIT09Im9iamVjdCIpcmV0dXJuIGEKaWYoImRhcnRFeGNlcHRpb24iIGluIGEpcmV0dXJu
-IEgudFcoYSxhLmRhcnRFeGNlcHRpb24pCnJldHVybiBILnRsKGEpfSwKdFcoYSxiKXtpZih0Lm0uYihi
+IEgudFcoYSxhLmRhcnRFeGNlcHRpb24pCnJldHVybiBILnRsKGEpfSwKdFcoYSxiKXtpZih0LnIuYihi
 KSlpZihiLiR0aHJvd25Kc0Vycm9yPT1udWxsKWIuJHRocm93bkpzRXJyb3I9YQpyZXR1cm4gYn0sCnRs
 KGEpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZT1udWxsCmlmKCEoIm1lc3NhZ2UiIGlu
 IGEpKXJldHVybiBhCnM9YS5tZXNzYWdlCmlmKCJudW1iZXIiIGluIGEmJnR5cGVvZiBhLm51bWJlcj09
@@ -8355,11 +8355,11 @@
 cyYmSC5XZShhLGIueixjLGQsZSl9aWYocD09PTgpe2lmKEguV2UoYSxiLGMsZC56LGUpKXJldHVybiEw
 CnJldHVybiBILldlKGEsYixjLEgueFooYSxkKSxlKX1pZihwPT09Nyl7cz1ILldlKGEsYixjLHQuUCxl
 KQpyZXR1cm4gc3x8SC5XZShhLGIsYyxkLnosZSl9aWYocSlyZXR1cm4hMQpzPXIhPT0xMQppZigoIXN8
-fHI9PT0xMikmJmQ9PT10LlkpcmV0dXJuITAKaWYocD09PTEyKXtpZihiPT09dC51KXJldHVybiEwCmlm
+fHI9PT0xMikmJmQ9PT10LlkpcmV0dXJuITAKaWYocD09PTEyKXtpZihiPT09dC54KXJldHVybiEwCmlm
 KHIhPT0xMilyZXR1cm4hMQpvPWIuUQpuPWQuUQptPW8ubGVuZ3RoCmlmKG0hPT1uLmxlbmd0aClyZXR1
 cm4hMQpjPWM9PW51bGw/bzpvLmNvbmNhdChjKQplPWU9PW51bGw/bjpuLmNvbmNhdChlKQpmb3IobD0w
 O2w8bTsrK2wpe2s9b1tsXQpqPW5bbF0KaWYoIUguV2UoYSxrLGMsaixlKXx8IUguV2UoYSxqLGUsayxj
-KSlyZXR1cm4hMX1yZXR1cm4gSC5iTyhhLGIueixjLGQueixlKX1pZihwPT09MTEpe2lmKGI9PT10LnUp
+KSlyZXR1cm4hMX1yZXR1cm4gSC5iTyhhLGIueixjLGQueixlKX1pZihwPT09MTEpe2lmKGI9PT10Lngp
 cmV0dXJuITAKaWYocylyZXR1cm4hMQpyZXR1cm4gSC5iTyhhLGIsYyxkLGUpfWlmKHI9PT05KXtpZihw
 IT09OSlyZXR1cm4hMQpyZXR1cm4gSC5wRyhhLGIsYyxkLGUpfXJldHVybiExfSwKYk8oYTMsYTQsYTUs
 YTYsYTcpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYixhLGEwLGExLGEyCmlm
@@ -8473,7 +8473,7 @@
 CnM9cC5DKCJ+KDEpPyIpLmEobmV3IEwuV3gocixhKSkKdC5aLmEobnVsbCkKVy5KRShxLmEscS5iLHMs
 ITEscC5jKX0sCnlYKGEsYil7dmFyIHMscixxLHAsbyxuLG09InF1ZXJ5U2VsZWN0b3JBbGwiLGw9ZG9j
 dW1lbnQucXVlcnlTZWxlY3RvcihhKQpsLnRvU3RyaW5nCnM9dC5oCkguRGgocyxzLCJUIixtKQpyPXQu
-VQpxPW5ldyBXLnd6KGwucXVlcnlTZWxlY3RvckFsbCgiLm5hdi1saW5rIikscikKcS5LKHEsbmV3IEwu
+UgpxPW5ldyBXLnd6KGwucXVlcnlTZWxlY3RvckFsbCgiLm5hdi1saW5rIikscikKcS5LKHEsbmV3IEwu
 SG8oYikpCkguRGgocyxzLCJUIixtKQpwPW5ldyBXLnd6KGwucXVlcnlTZWxlY3RvckFsbCgiLnJlZ2lv
 biIpLHIpCmlmKCFwLmdsMChwKSl7bz1sLnF1ZXJ5U2VsZWN0b3IoInRhYmxlW2RhdGEtcGF0aF0iKQpv
 LnRvU3RyaW5nCnAuSyhwLG5ldyBMLklDKG8uZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3
@@ -8564,3073 +8564,3074 @@
 KSxxLkMoImxKPGxELkUscVU+IikpLmsoMCwiXG4iKQpxPXAucXVlcnlTZWxlY3RvcigiYS5ib3R0b20i
 KS5zdHlsZQpxLmRpc3BsYXk9Im5vbmUiCnM9cC5zdHlsZQpzLmRpc3BsYXk9ImluaXRpYWwifSwKR2co
 KXt2YXIgcz1kb2N1bWVudCxyPXQuaApILkRoKHIsciwiVCIsInF1ZXJ5U2VsZWN0b3JBbGwiKQpzPW5l
-dyBXLnd6KHMucXVlcnlTZWxlY3RvckFsbCgiLmNvZGUiKSx0LlUpCnMuSyhzLG5ldyBMLkdIKCkpfSwK
+dyBXLnd6KHMucXVlcnlTZWxlY3RvckFsbCgiLmNvZGUiKSx0LlIpCnMuSyhzLG5ldyBMLkdIKCkpfSwK
 aFgoYSxiLGMpe3JldHVybiBMLll3KGEsYixjKX0sCll3KGEsYixjKXt2YXIgcz0wLHI9UC5GWCh0Lnop
-LHE9MSxwLG89W10sbixtLGwsayxqLGksaCxnCnZhciAkYXN5bmMkaFg9UC5seihmdW5jdGlvbihkLGUp
-e2lmKGQ9PT0xKXtwPWUKcz1xfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDpxPTMKaj10Lk4Kcz02
-CnJldHVybiBQLmpRKEwuUTYoYSxQLkVGKFsicmVnaW9uIiwicmVnaW9uIiwib2Zmc2V0IixILkVqKGIp
-XSxqLGopLHQuRyksJGFzeW5jJGhYKQpjYXNlIDY6bj1lCmo9bgppPUouVTYoaikKbT1uZXcgVS5kMihV
-LmpmKGkucShqLCJlZGl0cyIpKSxILmsoaS5xKGosImV4cGxhbmF0aW9uIikpLEguVWMoaS5xKGosImxp
-bmUiKSksSC5rKGkucShqLCJkaXNwbGF5UGF0aCIpKSxILmsoaS5xKGosInVyaVBhdGgiKSksVS5OZChp
-LnEoaiwidHJhY2VzIikpKQpMLlQxKG0pCkwuRnIoYSxiLGMpCkwueVgoIi5lZGl0LXBhbmVsIC5wYW5l
-bC1jb250ZW50IiwhMSkKcT0xCnM9NQpicmVhawpjYXNlIDM6cT0yCmc9cApsPUguUnUoZykKaz1ILnRz
-KGcpCkwuQzIoImNvdWxkbid0IGxvYWQgZWRpdCBkZXRhaWxzIixsLGspCnM9NQpicmVhawpjYXNlIDI6
-cz0xCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIp
-fX0pCnJldHVybiBQLkRJKCRhc3luYyRoWCxyKX0sCkc3KGEsYixjLGQsZSl7cmV0dXJuIEwuTDUoYSxi
-LGMsZCxlKX0sCkw1KGEsYixjLGQsZSl7dmFyIHM9MCxyPVAuRlgodC5IKSxxLHA9MixvLG49W10sbSxs
-LGssaixpLGgsZwp2YXIgJGFzeW5jJEc3PVAubHooZnVuY3Rpb24oZixhMCl7aWYoZj09PTEpe289YTAK
-cz1wfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDppZighQy54Qi5UYyhhLCIuZGFydCIpKXtMLkJF
-KGEsQi53UigpLGQpCkwuQlgoYSxudWxsKQppZihlIT1udWxsKWUuJDAoKQpzPTEKYnJlYWt9cD00Cmk9
-dC5OCnM9NwpyZXR1cm4gUC5qUShMLlE2KGEsUC5FRihbImlubGluZSIsInRydWUiXSxpLGkpLHQuRyks
-JGFzeW5jJEc3KQpjYXNlIDc6bT1hMApMLkJFKGEsQi5ZZihtKSxkKQpMLmZHKGIsYykKbD1MLlVzKGEp
-CkwuQlgobCxiKQppZihlIT1udWxsKWUuJDAoKQpwPTIKcz02CmJyZWFrCmNhc2UgNDpwPTMKZz1vCms9
-SC5SdShnKQpqPUgudHMoZykKTC5DMigiY291bGRuJ3QgbG9hZCBkYXJ0IGZpbGUgIithLGssaikKcz02
-CmJyZWFrCmNhc2UgMzpzPTIKYnJlYWsKY2FzZSA2OmNhc2UgMTpyZXR1cm4gUC55QyhxLHIpCmNhc2Ug
-MjpyZXR1cm4gUC5mMyhvLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyRHNyxyKX0sCkdlKCl7dmFyIHM9
-MCxyPVAuRlgodC56KSxxPTEscCxvPVtdLG4sbSxsLGssaixpLGgsZwp2YXIgJGFzeW5jJEdlPVAubHoo
-ZnVuY3Rpb24oYSxiKXtpZihhPT09MSl7cD1iCnM9cX13aGlsZSh0cnVlKXN3aXRjaChzKXtjYXNlIDA6
-aD0iL19wcmV2aWV3L25hdmlnYXRpb25UcmVlLmpzb24iCnE9MwpzPTYKcmV0dXJuIFAualEoTC5RNiho
-LEMuQ00sdC5lZSksJGFzeW5jJEdlKQpjYXNlIDY6bj1iCmo9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigi
-Lm5hdi10cmVlIikKai50b1N0cmluZwptPWoKSi5sNShtLCIiKQpqPUwubUsobikKJC5JUj1qCkwudFgo
-bSxqLCEwKQpxPTEKcz01CmJyZWFrCmNhc2UgMzpxPTIKZz1wCmw9SC5SdShnKQprPUgudHMoZykKTC5D
-MigiY291bGRuJ3QgbG9hZCBuYXZpZ2F0aW9uIHRyZWUiLGwsaykKcz01CmJyZWFrCmNhc2UgMjpzPTEK
-YnJlYWsKY2FzZSA1OnJldHVybiBQLnlDKG51bGwscikKY2FzZSAxOnJldHVybiBQLmYzKHAscil9fSkK
-cmV0dXJuIFAuREkoJGFzeW5jJEdlLHIpfSwKcU8oYSl7dmFyIHMscixxPWEuZ2V0Qm91bmRpbmdDbGll
-bnRSZWN0KCkscD1DLkNELnpRKCQuZmkoKS5vZmZzZXRIZWlnaHQpLG89d2luZG93LmlubmVySGVpZ2h0
-Cm8udG9TdHJpbmcKcz1DLkNELnpRKCQuRFcoKS5vZmZzZXRIZWlnaHQpCnI9cS5ib3R0b20Kci50b1N0
-cmluZwppZihyPm8tKHMrMTQpKUouZGgoYSkKZWxzZXtvPXEudG9wCm8udG9TdHJpbmcKaWYobzxwKzE0
-KUouZGgoYSl9fSwKZkcoYSxiKXt2YXIgcyxyLHEscCxvCmlmKGEhPW51bGwpe3M9ZG9jdW1lbnQKcj1z
-LmdldEVsZW1lbnRCeUlkKCJvIitILkVqKGEpKQpxPXMucXVlcnlTZWxlY3RvcigiLmxpbmUtIitILkVq
-KGIpKQppZihyIT1udWxsKXtMLnFPKHIpCkouZFIocikuaSgwLCJ0YXJnZXQiKX1lbHNlIGlmKHEhPW51
-bGwpe3M9cS5wYXJlbnRFbGVtZW50CnMudG9TdHJpbmcKTC5xTyhzKX1pZihxIT1udWxsKUouZFIodC5o
-LmEocS5wYXJlbnROb2RlKSkuaSgwLCJoaWdobGlnaHQiKX1lbHNle3M9ZG9jdW1lbnQKcD10LmgKSC5E
-aChwLHAsIlQiLCJxdWVyeVNlbGVjdG9yQWxsIikKcz1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi5saW5lLW5v
-IikKbz1uZXcgVy53eihzLHQuVSkKaWYoby5nQShvKT09PTApcmV0dXJuCkwucU8ocC5hKEMudDUuZ3RI
-KHMpKSl9fSwKYWYoYSxiLGMsZCxlKXt2YXIgcyxyLHEscD10LkYsbz1MLkc2KHAuYSh3aW5kb3cubG9j
-YXRpb24pLmhyZWYpLG49TC5hSyhwLmEod2luZG93LmxvY2F0aW9uKS5ocmVmKQppZihvIT1udWxsKXtz
-PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvIitILkVqKG8pKQppZihzIT1udWxsKUouZFIocykuUigw
-LCJ0YXJnZXQiKX1pZihuIT1udWxsKXtyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5saW5lLSIrSC5F
-aihuKSkKaWYociE9bnVsbCl7cT1yLnBhcmVudEVsZW1lbnQKcS50b1N0cmluZwpKLmRSKHEpLlIoMCwi
-aGlnaGxpZ2h0Iil9fWlmKGE9PXAuYSh3aW5kb3cubG9jYXRpb24pLnBhdGhuYW1lKXtMLmZHKGIsYykK
-ZS4kMCgpfWVsc2V7YS50b1N0cmluZwpMLkc3KGEsYixjLGQsZSl9fSwKUTQoYSxiKXt2YXIgcyxyLHE9
-UC5oSyhhKSxwPVAuRmwodC5OLHQuZGspCmZvcihzPXEuZ2hZKCkscz1zLmdQdShzKSxzPXMuZ20ocyk7
-cy5GKCk7KXtyPXMuZ2woKQpwLlk1KDAsci5hLHIuYil9Zm9yKHM9Yi5nUHUoYikscz1zLmdtKHMpO3Mu
-RigpOyl7cj1zLmdsKCkKcC5ZNSgwLHIuYSxyLmIpfXAuWTUoMCwiYXV0aFRva2VuIiwkLlVFKCkpCnJl
-dHVybiBxLm5tKDAscCkuZ25EKCl9LApUMShhKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpPSQuaEwo
-KQppLnRvU3RyaW5nCkoubDUoaSwiIikKaWYoYT09bnVsbCl7cz1kb2N1bWVudC5jcmVhdGVFbGVtZW50
-KCJwIikKQy5MdC5zYTQocywiU2VlIGRldGFpbHMgYWJvdXQgYSBwcm9wb3NlZCBlZGl0LiIpCkMuTHQu
-c1AocyxILlFJKFsicGxhY2Vob2xkZXIiXSx0LnMpKQppLmFwcGVuZENoaWxkKHMpCkMuTHQuRkYocykK
-cmV0dXJufXI9YS5kCnIudG9TdHJpbmcKcT0kLm5VKCkKcD1xLnpmKHIpCm89YS5iCm49ZG9jdW1lbnQK
-bT1uLnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4dENvbnRlbnQKbS50b1N0cmluZwpsPXEuSFAocixD
-LnhCLmJTKG0pKQprPWEuYwpqPW4uY3JlYXRlRWxlbWVudCgicCIpCmkuYXBwZW5kQ2hpbGQoaikKai5h
-cHBlbmRDaGlsZChuLmNyZWF0ZVRleHROb2RlKEguRWoobykrIiBhdCAiKSkKcj1hLmUKci50b1N0cmlu
-ZwpxPXQuTgpxPVcuSjYoTC5RNChyLFAuRUYoWyJsaW5lIixKLncoayldLHEscSkpKQpxLmFwcGVuZENo
-aWxkKG4uY3JlYXRlVGV4dE5vZGUobCsiOiIrSC5FaihrKSsiLiIpKQpqLmFwcGVuZENoaWxkKHEpCkou
-ZGgoaikKTC5DQyhhLGkscCkKTC5GeihhLGkpfSwKTEgoYSxiLGMpe3ZhciBzLHIscSxwLG8sbixtLGws
-ayxqLGksaCxnLGYsZSxkPSQueVAoKQpkLnRvU3RyaW5nCkoubDUoZCwiIikKaWYoYi5nQShiKT09PTAp
-e3M9ZG9jdW1lbnQKcj1zLmNyZWF0ZUVsZW1lbnQoInAiKQpkLmFwcGVuZENoaWxkKHIpCnIuYXBwZW5k
-Q2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgiTm8gcHJvcG9zZWQgZWRpdHMiKSl9ZWxzZSBmb3IoZD1iLmdQ
-dShiKSxkPWQuZ20oZCkscz10LkYscT10Lk4scD10LlEsbz1wLkMoIn4oMSk/Iiksbj10LloscD1wLmM7
-ZC5GKCk7KXttPWQuZ2woKQpsPWRvY3VtZW50CnI9bC5jcmVhdGVFbGVtZW50KCJwIikKaz0kLnlQKCkK
-ay5hcHBlbmRDaGlsZChyKQpyLmFwcGVuZENoaWxkKGwuY3JlYXRlVGV4dE5vZGUoSC5FaihtLmEpKyI6
-IikpCmo9bC5jcmVhdGVFbGVtZW50KCJ1bCIpCmsuYXBwZW5kQ2hpbGQoaikKZm9yKG09Si5JVChtLmIp
-O20uRigpOyl7az1tLmdsKCkKaT1sLmNyZWF0ZUVsZW1lbnQoImxpIikKai5hcHBlbmRDaGlsZChpKQpK
-LmRSKGkpLmkoMCwiZWRpdCIpCmg9bC5jcmVhdGVFbGVtZW50KCJhIikKaS5hcHBlbmRDaGlsZChoKQpo
-LmNsYXNzTGlzdC5hZGQoImVkaXQtbGluayIpCmc9ay5jCmY9SC5FaihnKQpoLnNldEF0dHJpYnV0ZSgi
-ZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KGgpKS5PVSgib2Zmc2V0IiksZikKZT1rLmEKZj1ILkVqKGUp
-Cmguc2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcoaCkpLk9VKCJsaW5lIiksZikK
-aC5hcHBlbmRDaGlsZChsLmNyZWF0ZVRleHROb2RlKCJsaW5lICIrSC5FaihlKSkpCmY9cy5hKHdpbmRv
-dy5sb2NhdGlvbikucGF0aG5hbWUKZi50b1N0cmluZwpoLnNldEF0dHJpYnV0ZSgiaHJlZiIsTC5RNChm
-LFAuRUYoWyJsaW5lIixILkVqKGUpLCJvZmZzZXQiLEguRWooZyldLHEscSkpKQpmPW8uYShuZXcgTC5F
-RShnLGUsYSkpCm4uYShudWxsKQpXLkpFKGgsImNsaWNrIixmLCExLHApCmkuYXBwZW5kQ2hpbGQobC5j
-cmVhdGVUZXh0Tm9kZSgiOiAiK0guRWooay5iKSkpfX1pZihjKUwuVDEobnVsbCl9LApGcihhLGIsYyl7
-dmFyIHMscixxPVAuaEsoQy5FeC5nRHIodC5GLmEod2luZG93LmxvY2F0aW9uKSkrSC5FaihhKSkscD1Q
-LkZsKHQuTix0LmRrKQppZihiIT1udWxsKXAuWTUoMCwib2Zmc2V0IixILkVqKGIpKQppZihjIT1udWxs
-KXAuWTUoMCwibGluZSIsSC5FaihjKSkKcC5ZNSgwLCJhdXRoVG9rZW4iLCQuVUUoKSkKcT1xLm5tKDAs
-cCkKcD13aW5kb3cuaGlzdG9yeQpzPXQuegpyPXEuZ25EKCkKcC5wdXNoU3RhdGUobmV3IFAuQmYoW10s
-W10pLlB2KFAuRmwocyxzKSksIiIscil9LApFbihhKXt2YXIgcyxyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0
-b3IoIi5yb290IikudGV4dENvbnRlbnQKci50b1N0cmluZwpzPXIrIi8iCmlmKEMueEIubihhLHMpKXJl
-dHVybiBDLnhCLnluKGEscy5sZW5ndGgpCmVsc2UgcmV0dXJuIGF9LApPdChhKXtzd2l0Y2goYS5yKXtj
-YXNlIEMuY3c6YnJlYWsKY2FzZSBDLldEOmEucj1DLlhqCmJyZWFrCmNhc2UgQy5YajphLnI9Qy5XRApi
-cmVhawpjYXNlIEMuZGM6dGhyb3cgSC5iKFAuUFYoIkZpbGUgIitILkVqKGEuYykrIiBzaG91bGQgbm90
-IGhhdmUgaW5kZXRlcm1pbmF0ZSBtaWdyYXRpb24gc3RhdHVzIikpCmRlZmF1bHQ6YnJlYWt9fSwKdGEo
-YSxiKXt2YXIgcyxyPSJjaGVja19ib3giLHE9InRpdGxlIixwPSJvcHRlZC1vdXQiLG89Im1pZ3JhdGlu
-ZyIKc3dpdGNoKGIpe2Nhc2UgQy5jdzphLmlubmVyVGV4dD1yCnM9Si5ZRShhKQpzLmdQKGEpLmkoMCwi
-YWxyZWFkeS1taWdyYXRlZCIpCnMuZ1AoYSkuaSgwLCJkaXNhYmxlZCIpCmEuc2V0QXR0cmlidXRlKHEs
-IkFscmVhZHkgbWlncmF0ZWQiKQpicmVhawpjYXNlIEMuV0Q6YS5pbm5lclRleHQ9cgpzPUouWUUoYSkK
-cy5nUChhKS5SKDAscCkKcy5nUChhKS5pKDAsbykKYS5zZXRBdHRyaWJ1dGUocSwiTWlncmF0aW5nIHRv
-IG51bGwgc2FmZXR5IikKYnJlYWsKY2FzZSBDLlhqOmEuaW5uZXJUZXh0PSJjaGVja19ib3hfb3V0bGlu
-ZV9ibGFuayIKcz1KLllFKGEpCnMuZ1AoYSkuUigwLG8pCnMuZ1AoYSkuaSgwLHApCmEuc2V0QXR0cmli
-dXRlKHEsIk9wdGluZyBvdXQgb2YgbnVsbCBzYWZldHkiKQpicmVhawpkZWZhdWx0OmEuaW5uZXJUZXh0
-PSJpbmRldGVybWluYXRlX2NoZWNrX2JveCIKcz1KLllFKGEpCnMuZ1AoYSkuUigwLG8pCnMuZ1AoYSku
-aSgwLHApCmEuc2V0QXR0cmlidXRlKHEsIk1peGVkIHN0YXR1c2VzIG9mICdtaWdyYXRpbmcnIGFuZCAn
-b3B0aW5nIG91dCciKQpicmVha319LAp4bihhLGIpe3ZhciBzLHI9ImRpc2FibGVkIixxPWIuZ0woKQpM
-LnRhKGEscSkKaWYoYi5jPT09JC5EOSgpLmlubmVyVGV4dCl7aWYoYiBpbnN0YW5jZW9mIEwuY0Qpe3M9
-Yi54CnMudG9TdHJpbmcKcz0hc31lbHNlIHM9ITEKaWYocyl7YS50b1N0cmluZwpKLmRSKGEpLmkoMCxy
-KX1lbHNle2EudG9TdHJpbmcKSi5kUihhKS5SKDAscil9TC50YSgkLmMwKCkscSl9fSwKQlgoYSxiKXt2
-YXIgcyxyLHEscD17fQpwLmE9YQphPUwuRW4oYSkKcC5hPWEKcz0kLkQ5KCkKcy50b1N0cmluZwpKLmRy
-KHMsYSkKcz1kb2N1bWVudApyPXQuaApILkRoKHIsciwiVCIsInF1ZXJ5U2VsZWN0b3JBbGwiKQpzPW5l
-dyBXLnd6KHMucXVlcnlTZWxlY3RvckFsbCgiLm5hdi1wYW5lbCAubmF2LWxpbmsiKSx0LlUpCnMuSyhz
-LG5ldyBMLlZTKHApKQpzPSQuSVIKcT1zPT1udWxsP251bGw6TC55dyhzLHAuYSkKaWYocT09bnVsbCl7
-cD0kLmJOKCkKcC50b1N0cmluZwpKLmRSKHApLlIoMCwidmlzaWJsZSIpfWVsc2V7cD0kLmJOKCkKcC50
-b1N0cmluZwpKLmRSKHApLmkoMCwidmlzaWJsZSIpCkwudGEoJC5jMCgpLHEuZ0woKSl9fSwKQVIoYSxi
-KXt2YXIgcyxyLHE9Yi5iCmlmKHE9PT0kKXE9SC52KG5ldyBILmMoIkZpZWxkICdwYXJlbnQnIGhhcyBu
-b3QgYmVlbiBpbml0aWFsaXplZC4iKSkKcz10LmgKcj1zLmEocy5hKGEucGFyZW50Tm9kZSkucGFyZW50
-Tm9kZSkKTC54bihyLnF1ZXJ5U2VsZWN0b3IoIjpzY29wZSA+IC5zdGF0dXMtaWNvbiIpLHEpCkwuQVIo
-cixxKX0sCmJMKGEsYil7dmFyIHMscixxLHAsbyxuLG0sbD0iOnNjb3BlID4gLnN0YXR1cy1pY29uIgpm
-b3Iocz1iLmQscj1zLmxlbmd0aCxxPXQuaCxwPTA7cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgu
-bGspKHMpLCsrcCl7bz1zW3BdCmEudG9TdHJpbmcKbj1vLmMKbi50b1N0cmluZwptPWEucXVlcnlTZWxl
-Y3RvcignW2RhdGEtbmFtZSo9IicrVy5MaihuKSsnIl0nKQppZihvIGluc3RhbmNlb2YgTC52dCl7TC5i
-TChtLG8pCkwueG4obS5xdWVyeVNlbGVjdG9yKGwpLGIpfWVsc2UgTC54bihxLmEobS5wYXJlbnROb2Rl
-KS5xdWVyeVNlbGVjdG9yKGwpLG8pfX0sCkJFKGEsYixjKXt2YXIgcz0iLnJlZ2lvbnMiLHI9ZG9jdW1l
-bnQscT1yLnF1ZXJ5U2VsZWN0b3IocykKcS50b1N0cmluZwpyPXIucXVlcnlTZWxlY3RvcigiLmNvZGUi
-KQpyLnRvU3RyaW5nCkoudEgocSxiLmEsJC5LRygpKQpKLnRIKHIsYi5iLCQuS0coKSkKTC5MSChhLGIu
-ZCxjKQppZihiLmMubGVuZ3RoPDJlNSlMLkdnKCkKTC55WCgiLmNvZGUiLCEwKQpMLnlYKHMsITApfSwK
-dFgoYTAsYTEsYTIpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkPSJtYXRlcmlhbC1p
-Y29ucyIsYz0ic3RhdHVzLWljb24iLGI9ZG9jdW1lbnQsYT1iLmNyZWF0ZUVsZW1lbnQoInVsIikKYTAu
-YXBwZW5kQ2hpbGQoYSkKZm9yKHM9YTEubGVuZ3RoLHI9dC5OLHE9dC5aLHA9MDtwPGExLmxlbmd0aDth
-MS5sZW5ndGg9PT1zfHwoMCxILmxrKShhMSksKytwKXtvPWExW3BdCm49Yi5jcmVhdGVFbGVtZW50KCJs
-aSIpCmEuYXBwZW5kQ2hpbGQobikKaWYobyBpbnN0YW5jZW9mIEwudnQpe209Si5ZRShuKQptLmdQKG4p
-LmkoMCwiZGlyIikKbD1vLmMKbC50b1N0cmluZwpuLnNldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5
-KG5ldyBXLmk3KG4pKS5PVSgibmFtZSIpLGwpCms9Yi5jcmVhdGVFbGVtZW50KCJzcGFuIikKbi5hcHBl
-bmRDaGlsZChrKQpsPUouWUUoaykKbC5nUChrKS5pKDAsImFycm93IikKbC5zaGYoaywiJiN4MjVCQzsi
-KQpqPWIuY3JlYXRlRWxlbWVudCgic3BhbiIpCkouZFIoaikuaSgwLGQpCmouaW5uZXJUZXh0PSJmb2xk
-ZXJfb3BlbiIKbi5hcHBlbmRDaGlsZChqKQpsPW8uYQpsLnRvU3RyaW5nCm4uYXBwZW5kQ2hpbGQoYi5j
-cmVhdGVUZXh0Tm9kZShsKSkKbD1vLmQKbC50b1N0cmluZwpMLnRYKG4sbCwhMCkKaT1iLmNyZWF0ZUVs
-ZW1lbnQoInNwYW4iKQpsPUouWUUoaSkKbC5nUChpKS5pKDAsZCkKaS5pbm5lclRleHQ9ImluZGV0ZXJt
-aW5hdGVfY2hlY2tfYm94IgpsLmdQKGkpLmkoMCxjKQpMLnhuKGksbykKbD1sLmdWbChpKQpoPWwuJHRp
-Cmc9aC5DKCJ+KDEpPyIpLmEobmV3IEwuVEQobyxuLGkpKQpxLmEobnVsbCkKVy5KRShsLmEsbC5iLGcs
-ITEsaC5jKQptLm1LKG4saSxqKQpMLmt6KGspfWVsc2UgaWYobyBpbnN0YW5jZW9mIEwuY0Qpe2k9Yi5j
-cmVhdGVFbGVtZW50KCJzcGFuIikKbT1KLllFKGkpCm0uZ1AoaSkuaSgwLGQpCmkuaW5uZXJUZXh0PSIi
-Cm0uZ1AoaSkuaSgwLGMpCmw9by54CmwudG9TdHJpbmcKaWYoIWwpbS5nUChpKS5pKDAsImRpc2FibGVk
-IikKTC54bihpLG8pCmlmKGwpe209bS5nVmwoaSkKbD1tLiR0aQpoPWwuQygifigxKT8iKS5hKG5ldyBM
-LklmKG8saSxuKSkKcS5hKG51bGwpClcuSkUobS5hLG0uYixoLCExLGwuYyl9bi5hcHBlbmRDaGlsZChp
-KQptPWIuY3JlYXRlRWxlbWVudCgic3BhbiIpCkouZFIobSkuaSgwLGQpCm0uaW5uZXJUZXh0PSJpbnNl
-cnRfZHJpdmVfZmlsZSIKbi5hcHBlbmRDaGlsZChtKQpmPWIuY3JlYXRlRWxlbWVudCgiYSIpCm4uYXBw
-ZW5kQ2hpbGQoZikKbT1KLllFKGYpCm0uZ1AoZikuaSgwLCJuYXYtbGluayIpCmw9by5jCmwudG9TdHJp
-bmcKZi5zZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyhmKSkuT1UoIm5hbWUiKSxs
-KQpsPW8uZApsLnRvU3RyaW5nCmYuc2V0QXR0cmlidXRlKCJocmVmIixMLlE0KGwsUC5GbChyLHIpKSkK
-bD1vLmEKbC50b1N0cmluZwpmLmFwcGVuZENoaWxkKGIuY3JlYXRlVGV4dE5vZGUobCkpCm09bS5nVmwo
-ZikKbD1tLiR0aQpoPWwuQygifigxKT8iKS5hKG5ldyBMLnRCKCkpCnEuYShudWxsKQpXLkpFKG0uYSxt
-LmIsaCwhMSxsLmMpCmw9by5lCmwudG9TdHJpbmcKaWYobD4wKXtlPWIuY3JlYXRlRWxlbWVudCgic3Bh
-biIpCm4uYXBwZW5kQ2hpbGQoZSkKSi5kUihlKS5pKDAsImVkaXQtY291bnQiKQptPSIiK2wrIiAiCmlm
-KGw9PT0xKWg9InByb3Bvc2VkIGVkaXQiCmVsc2UgaD0icHJvcG9zZWQgZWRpdHMiCmUuc2V0QXR0cmli
-dXRlKCJ0aXRsZSIsbStoKQplLmFwcGVuZENoaWxkKGIuY3JlYXRlVGV4dE5vZGUoQy5qbi53KGwpKSl9
-fX19LAp1eihhLGIsYyl7dmFyIHM9ZG9jdW1lbnQscj1zLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpLHE9
-dC5RLHA9cS5DKCJ+KDEpPyIpLmEobmV3IEwubTIoYSxjKSkKdC5aLmEobnVsbCkKVy5KRShyLCJjbGlj
-ayIscCwhMSxxLmMpCnE9Ui5PWChhLmEpCnEudG9TdHJpbmcKci5hcHBlbmRDaGlsZChzLmNyZWF0ZVRl
-eHROb2RlKHEpKQpiLmFwcGVuZENoaWxkKHIpfSwKRnooYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGss
-aixpLGg9YS5hCmlmKGg9PW51bGwpcmV0dXJuCmIudG9TdHJpbmcKcz1kb2N1bWVudApyPXMuY3JlYXRl
-RWxlbWVudCgicCIpCnE9Yi5hcHBlbmRDaGlsZChyKQpyPXMuY3JlYXRlRWxlbWVudCgic3BhbiIpCnA9
-dC5zCkouTXUocixILlFJKFsidHlwZS1kZXNjcmlwdGlvbiJdLHApKQpyLmFwcGVuZENoaWxkKHMuY3Jl
-YXRlVGV4dE5vZGUoIkFjdGlvbnMiKSkKcS5hcHBlbmRDaGlsZChyKQpxLmFwcGVuZENoaWxkKHMuY3Jl
-YXRlVGV4dE5vZGUoIjoiKSkKbz1zLmNyZWF0ZUVsZW1lbnQoInAiKQpiLmFwcGVuZENoaWxkKG8pCmZv
-cihyPWgubGVuZ3RoLG49dC5PLG09MDttPGgubGVuZ3RoO2gubGVuZ3RoPT09cnx8KDAsSC5saykoaCks
-KyttKXtsPWhbbV0Kaz1zLmNyZWF0ZUVsZW1lbnQoImEiKQpvLmFwcGVuZENoaWxkKGspCmo9bC5hCmou
-dG9TdHJpbmcKay5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKGopKQpqPWwuYgpqLnRvU3RyaW5n
-Cmsuc2V0QXR0cmlidXRlKCJocmVmIixqKQpqPW4uYShILlFJKFsiYWRkLWhpbnQtbGluayIsImJlZm9y
-ZS1hcHBseSIsImJ1dHRvbiJdLHApKQppPUouZFIoaykKaS5WMSgwKQppLkZWKDAsail9fSwKQ0MoYTQs
-YTUsYTYpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYixhLGEwLGExLGEyLGEz
-CmZvcihzPWE0LmYscj1zLmxlbmd0aCxxPXQucyxwPXQuTyxvPTA7bzxzLmxlbmd0aDtzLmxlbmd0aD09
-PXJ8fCgwLEgubGspKHMpLCsrbyl7bj1zW29dCmE1LnRvU3RyaW5nCm09ZG9jdW1lbnQKbD1tLmNyZWF0
-ZUVsZW1lbnQoInAiKQprPXAuYShILlFJKFsidHJhY2UiXSxxKSkKaj1KLmRSKGwpCmouVjEoMCkKai5G
-VigwLGspCmk9YTUuYXBwZW5kQ2hpbGQobCkKbD1tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQprPXAuYShI
-LlFJKFsidHlwZS1kZXNjcmlwdGlvbiJdLHEpKQpqPUouZFIobCkKai5WMSgwKQpqLkZWKDAsaykKaz1u
-LmEKay50b1N0cmluZwpsLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoaykpCmkuYXBwZW5kQ2hp
-bGQobCkKaS5hcHBlbmRDaGlsZChtLmNyZWF0ZVRleHROb2RlKCI6IikpCmw9bS5jcmVhdGVFbGVtZW50
-KCJ1bCIpCms9cC5hKEguUUkoWyJ0cmFjZSJdLHEpKQpqPUouZFIobCkKai5WMSgwKQpqLkZWKDAsaykK
-aD1pLmFwcGVuZENoaWxkKGwpCmZvcihsPW4uYixrPWwubGVuZ3RoLGc9MDtnPGwubGVuZ3RoO2wubGVu
-Z3RoPT09a3x8KDAsSC5saykobCksKytnKXtmPWxbZ10KZT1tLmNyZWF0ZUVsZW1lbnQoImxpIikKaC5h
-cHBlbmRDaGlsZChlKQpkPW0uY3JlYXRlRWxlbWVudCgic3BhbiIpCmM9cC5hKEguUUkoWyJmdW5jdGlv
-biJdLHEpKQpqPUouZFIoZCkKai5WMSgwKQpqLkZWKDAsYykKYz1mLmIKTC5XaihkLGM9PW51bGw/InVu
-a25vd24iOmMpCmUuYXBwZW5kQ2hpbGQoZCkKYj1mLmMKaWYoYiE9bnVsbCl7ZS5hcHBlbmRDaGlsZCht
-LmNyZWF0ZVRleHROb2RlKCIgKCIpKQphPWIuYgphMD1tLmNyZWF0ZUVsZW1lbnQoImEiKQphMC5hcHBl
-bmRDaGlsZChtLmNyZWF0ZVRleHROb2RlKEguRWooYi5jKSsiOiIrSC5FaihhKSkpCmQ9Yi5hCmQudG9T
-dHJpbmcKYTAuc2V0QXR0cmlidXRlKCJocmVmIixkKQphMC5jbGFzc0xpc3QuYWRkKCJuYXYtbGluayIp
-CmUuYXBwZW5kQ2hpbGQoYTApCmUuYXBwZW5kQ2hpbGQobS5jcmVhdGVUZXh0Tm9kZSgiKSIpKX1lLmFw
-cGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoIjogIikpCmQ9Zi5hCkwuV2ooZSxkPT1udWxsPyJ1bmtu
-b3duIjpkKQpkPWYuZAppZihkLmxlbmd0aCE9PTApe2M9bS5jcmVhdGVFbGVtZW50KCJwIikKYTE9cC5h
-KEguUUkoWyJkcmF3ZXIiLCJiZWZvcmUtYXBwbHkiXSxxKSkKaj1KLmRSKGMpCmouVjEoMCkKai5GVigw
-LGExKQphMj1lLmFwcGVuZENoaWxkKGMpCmZvcihjPWQubGVuZ3RoLGEzPTA7YTM8ZC5sZW5ndGg7ZC5s
-ZW5ndGg9PT1jfHwoMCxILmxrKShkKSwrK2EzKUwudXooZFthM10sYTIsYil9fX19LApVcyhhKXtyZXR1
-cm4gQy54Qi50ZyhhLCI/Iik/Qy54Qi5OaihhLDAsQy54Qi5PWShhLCI/IikpOmF9LApURyhhLGIpe3Jl
-dHVybiBuZXcgTC5RVyhhLGIpfSwKeXcoYSxiKXt2YXIgcyxyLHEscCxvCmZvcihzPWEubGVuZ3RoLHI9
-MDtyPGEubGVuZ3RoO2EubGVuZ3RoPT09c3x8KDAsSC5saykoYSksKytyKXtxPWFbcl0KaWYocSBpbnN0
-YW5jZW9mIEwudnQpe3A9cS5kCnAudG9TdHJpbmcKbz1MLnl3KHAsYikKaWYobyE9bnVsbClyZXR1cm4g
-b31lbHNlIGlmKHEuYz09PWIpcmV0dXJuIHF9cmV0dXJuIG51bGx9LApXaihhLGIpe3ZhciBzLHIscSxw
-PUguUUkoYi5zcGxpdCgiLiIpLHQucyksbz1DLk5tLmd0SChwKSxuPWRvY3VtZW50CmEuYXBwZW5kQ2hp
-bGQobi5jcmVhdGVUZXh0Tm9kZShvKSkKZm9yKG89SC5xQyhwLDEsbnVsbCx0Lk4pLHM9by4kdGksbz1u
-ZXcgSC5hNyhvLG8uZ0Eobykscy5DKCJhNzxhTC5FPiIpKSxzPXMuQygiYUwuRSIpLHI9Si5ZRShhKTtv
-LkYoKTspe3E9cy5hKG8uZCkKci5ueihhLCJiZWZvcmVlbmQiLCImIzgyMDM7LiIsbnVsbCxudWxsKQph
-LmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUocSkpfX0sCmU6ZnVuY3Rpb24gZSgpe30sClZXOmZ1
-bmN0aW9uIFZXKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCm9aOmZ1bmN0aW9uIG9a
-KCl7fSwKanI6ZnVuY3Rpb24ganIoKXt9LApxbDpmdW5jdGlvbiBxbCgpe30sCnk4OmZ1bmN0aW9uIHk4
-KCl7fSwKSGk6ZnVuY3Rpb24gSGkoKXt9LApCVDpmdW5jdGlvbiBCVCgpe30sClBZOmZ1bmN0aW9uIFBZ
-KCl7fSwKTDpmdW5jdGlvbiBMKCl7fSwKV3g6ZnVuY3Rpb24gV3goYSxiKXt0aGlzLmE9YQp0aGlzLmI9
-Yn0sCkhvOmZ1bmN0aW9uIEhvKGEpe3RoaXMuYT1hfSwKZE46ZnVuY3Rpb24gZE4oYSl7dGhpcy5hPWF9
-LApJQzpmdW5jdGlvbiBJQyhhKXt0aGlzLmE9YX0sCnh6OmZ1bmN0aW9uIHh6KGEsYil7dGhpcy5hPWEK
-dGhpcy5iPWJ9LApCTjpmdW5jdGlvbiBCTigpe30sCmZDOmZ1bmN0aW9uIGZDKGEsYil7dGhpcy5hPWEK
-dGhpcy5iPWJ9LApUbTpmdW5jdGlvbiBUbSgpe30sCm5UOmZ1bmN0aW9uIG5UKGEsYixjKXt0aGlzLmE9
-YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCk5ZOmZ1bmN0aW9uIE5ZKGEpe3RoaXMuYT1hfSwKdWU6ZnVuY3Rp
-b24gdWUoKXt9LApHSDpmdW5jdGlvbiBHSCgpe30sCkVFOmZ1bmN0aW9uIEVFKGEsYixjKXt0aGlzLmE9
-YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClFMOmZ1bmN0aW9uIFFMKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9
-LApWUzpmdW5jdGlvbiBWUyhhKXt0aGlzLmE9YX0sClREOmZ1bmN0aW9uIFREKGEsYixjKXt0aGlzLmE9
-YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCklmOmZ1bmN0aW9uIElmKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9
-Ygp0aGlzLmM9Y30sCnRCOmZ1bmN0aW9uIHRCKCl7fSwKbTI6ZnVuY3Rpb24gbTIoYSxiKXt0aGlzLmE9
-YQp0aGlzLmI9Yn0sClFXOmZ1bmN0aW9uIFFXKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApYQTpmdW5j
-dGlvbiBYQSgpe30sClpzKGEpe3ZhciBzLHIscT1KLlU2KGEpCmlmKEwucDIoSC5rKHEucShhLCJ0eXBl
-IikpKT09PUMuWTIpe3M9SC5rKHEucShhLCJuYW1lIikpCnI9SC5rKHEucShhLCJwYXRoIikpCnE9cS5x
-KGEsInN1YnRyZWUiKQpxPW5ldyBMLnZ0KHE9PW51bGw/bnVsbDpMLm1LKHEpLHMscikKcS5MVigpCnJl
-dHVybiBxfWVsc2V7cz1ILmsocS5xKGEsIm5hbWUiKSkKcj1ILmsocS5xKGEsInBhdGgiKSkKcmV0dXJu
-IG5ldyBMLmNEKEguayhxLnEoYSwiaHJlZiIpKSxILlVjKHEucShhLCJlZGl0Q291bnQiKSksSC5NNChx
-LnEoYSwid2FzRXhwbGljaXRseU9wdGVkT3V0IikpLEwudkIoSC5VYyhxLnEoYSwibWlncmF0aW9uU3Rh
-dHVzIikpKSxILk00KHEucShhLCJtaWdyYXRpb25TdGF0dXNDYW5CZUNoYW5nZWQiKSkscyxyKX19LApt
-SyhhKXt2YXIgcyxyPUguUUkoW10sdC5maCkKZm9yKHM9Si5JVCh0LlIuYShhKSk7cy5GKCk7KXIucHVz
-aChMLlpzKHMuZ2woKSkpCnJldHVybiByfSwKVkQoYSl7dmFyIHMscixxPUguUUkoW10sdC5kKQpmb3Io
-cz1hLmxlbmd0aCxyPTA7cjxhLmxlbmd0aDthLmxlbmd0aD09PXN8fCgwLEgubGspKGEpLCsrcilxLnB1
-c2goYVtyXS5MdCgpKQpyZXR1cm4gcX0sCnZCKGEpe2lmKGE9PW51bGwpcmV0dXJuIG51bGwKaWYoYT4+
-PjAhPT1hfHxhPj00KXJldHVybiBILk9IKEMubDAsYSkKcmV0dXJuIEMubDBbYV19LApwMihhKXtzd2l0
-Y2goYSl7Y2FzZSJkaXJlY3RvcnkiOnJldHVybiBDLlkyCmNhc2UiZmlsZSI6cmV0dXJuIEMucmYKZGVm
-YXVsdDp0aHJvdyBILmIoUC5QVigiVW5yZWNvZ25pemVkIG5hdmlnYXRpb24gdHJlZSBub2RlIHR5cGU6
-ICIrSC5FaihhKSkpfX0sCnZ0OmZ1bmN0aW9uIHZ0KGEsYixjKXt2YXIgXz10aGlzCl8uZD1hCl8uYT1i
-Cl8uYj0kCl8uYz1jfSwKY0Q6ZnVuY3Rpb24gY0QoYSxiLGMsZCxlLGYsZyl7dmFyIF89dGhpcwpfLmQ9
-YQpfLmU9YgpfLmY9YwpfLnI9ZApfLng9ZQpfLmE9ZgpfLmI9JApfLmM9Z30sCkQ4OmZ1bmN0aW9uIEQ4
-KCl7fSwKTzk6ZnVuY3Rpb24gTzkoYSl7dGhpcy5iPWF9LApHYjpmdW5jdGlvbiBHYihhLGIpe3RoaXMu
-YT1hCnRoaXMuYj1ifSwKSVY6ZnVuY3Rpb24gSVYoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmQ9YQpfLmU9
-YgpfLmY9YwpfLnI9ZH19LE09ewpZRihhLGIpe3ZhciBzLHIscSxwLG8sbixtLGwKZm9yKHM9Yi5sZW5n
-dGgscj0xO3I8czsrK3Ipe2lmKGJbcl09PW51bGx8fGJbci0xXSE9bnVsbCljb250aW51ZQpmb3IoO3M+
-PTE7cz1xKXtxPXMtMQppZihiW3FdIT1udWxsKWJyZWFrfXA9bmV3IFAuTSgiIikKbz0iIisoYSsiKCIp
-CnAuYT1vCm49SC50NihiKQptPW4uQygibkg8MT4iKQpsPW5ldyBILm5IKGIsMCxzLG0pCmwuSGQoYiww
-LHMsbi5jKQptPW8rbmV3IEgubEoobCxtLkMoInFVKGFMLkUpIikuYShuZXcgTS5ObygpKSxtLkMoImxK
-PGFMLkUscVU+IikpLmsoMCwiLCAiKQpwLmE9bQpwLmE9bSsoIik6IHBhcnQgIisoci0xKSsiIHdhcyBu
-dWxsLCBidXQgcGFydCAiK3IrIiB3YXMgbm90LiIpCnRocm93IEguYihQLnhZKHAudygwKSxudWxsKSl9
-fSwKbEk6ZnVuY3Rpb24gbEkoYSl7dGhpcy5hPWF9LApxNzpmdW5jdGlvbiBxNygpe30sCk5vOmZ1bmN0
-aW9uIE5vKCl7fX0sTz17ClJoKCl7dmFyIHMscj1udWxsCmlmKFAudW8oKS5nRmkoKSE9PSJmaWxlIily
-ZXR1cm4gJC5FYigpCnM9UC51bygpCmlmKCFDLnhCLlRjKHMuZ0lpKHMpLCIvIikpcmV0dXJuICQuRWIo
-KQppZihQLktMKHIsImEvYiIscixyLHIscixyKS50NCgpPT09ImFcXGIiKXJldHVybiAkLktrKCkKcmV0
-dXJuICQuYkQoKX0sCnpMOmZ1bmN0aW9uIHpMKCl7fX0sUD17Ck9qKCl7dmFyIHMscixxPXt9CmlmKHNl
-bGYuc2NoZWR1bGVJbW1lZGlhdGUhPW51bGwpcmV0dXJuIFAuRVgoKQppZihzZWxmLk11dGF0aW9uT2Jz
-ZXJ2ZXIhPW51bGwmJnNlbGYuZG9jdW1lbnQhPW51bGwpe3M9c2VsZi5kb2N1bWVudC5jcmVhdGVFbGVt
-ZW50KCJkaXYiKQpyPXNlbGYuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpCnEuYT1udWxsCm5l
-dyBzZWxmLk11dGF0aW9uT2JzZXJ2ZXIoSC50UihuZXcgUC50aChxKSwxKSkub2JzZXJ2ZShzLHtjaGls
-ZExpc3Q6dHJ1ZX0pCnJldHVybiBuZXcgUC5oYShxLHMscil9ZWxzZSBpZihzZWxmLnNldEltbWVkaWF0
-ZSE9bnVsbClyZXR1cm4gUC55dCgpCnJldHVybiBQLnFXKCl9LApaVihhKXtzZWxmLnNjaGVkdWxlSW1t
-ZWRpYXRlKEgudFIobmV3IFAuVnModC5NLmEoYSkpLDApKX0sCm9BKGEpe3NlbGYuc2V0SW1tZWRpYXRl
-KEgudFIobmV3IFAuRnQodC5NLmEoYSkpLDApKX0sCkJ6KGEpe3QuTS5hKGEpClAuUU4oMCxhKX0sClFO
-KGEsYil7dmFyIHM9bmV3IFAuVzMoKQpzLkNZKGEsYikKcmV0dXJuIHN9LApGWChhKXtyZXR1cm4gbmV3
-IFAuaWgobmV3IFAudnMoJC5YMyxhLkMoInZzPDA+IikpLGEuQygiaWg8MD4iKSl9LApESShhLGIpe2Eu
-JDIoMCxudWxsKQpiLmI9ITAKcmV0dXJuIGIuYX0sCmpRKGEsYil7UC5KZShhLGIpfSwKeUMoYSxiKXti
-LmFNKDAsYSl9LApmMyhhLGIpe2IudzAoSC5SdShhKSxILnRzKGEpKX0sCkplKGEsYil7dmFyIHMscixx
-PW5ldyBQLldNKGIpLHA9bmV3IFAuU1goYikKaWYoYSBpbnN0YW5jZW9mIFAudnMpYS5RZChxLHAsdC56
-KQplbHNle3M9dC56CmlmKHQuaS5iKGEpKWEuU3EocSxwLHMpCmVsc2V7cj1uZXcgUC52cygkLlgzLHQu
-YykKci5hPTgKci5jPWEKci5RZChxLHAscyl9fX0sCmx6KGEpe3ZhciBzPWZ1bmN0aW9uKGIsYyl7cmV0
-dXJuIGZ1bmN0aW9uKGQsZSl7d2hpbGUodHJ1ZSl0cnl7YihkLGUpCmJyZWFrfWNhdGNoKHIpe2U9cgpk
-PWN9fX0oYSwxKQpyZXR1cm4gJC5YMy5MaihuZXcgUC5HcyhzKSx0LkgsdC5TLHQueil9LApHUShhKXty
-ZXR1cm4gbmV3IFAuRnkoYSwxKX0sClRoKCl7cmV0dXJuIEMud1F9LApZbShhKXtyZXR1cm4gbmV3IFAu
-RnkoYSwzKX0sCmwwKGEsYil7cmV0dXJuIG5ldyBQLnE0KGEsYi5DKCJxNDwwPiIpKX0sClRsKGEsYil7
-dmFyIHM9SC5jYihhLCJlcnJvciIsdC5LKQpyZXR1cm4gbmV3IFAuQ3cocyxiPT1udWxsP1AudjAoYSk6
-Yil9LAp2MChhKXt2YXIgcwppZih0Lm0uYihhKSl7cz1hLmdJSSgpCmlmKHMhPW51bGwpcmV0dXJuIHN9
-cmV0dXJuIEMucGR9LApBOShhLGIpe3ZhciBzLHIscQpmb3Iocz10LmM7cj1hLmEsKHImNCkhPT0wOylh
-PXMuYShhLmMpCmlmKChyJjI0KSE9PTApe3E9Yi5haCgpCmIudWcoYSkKUC5IWihiLHEpfWVsc2V7cT10
-LmUuYShiLmMpCmIuYT1iLmEmMXw0CmIuYz1hCmEualEocSl9fSwKSFooYSxhMCl7dmFyIHMscixxLHAs
-byxuLG0sbCxrLGosaSxoLGcsZixlLGQsYz17fSxiPWMuYT1hCmZvcihzPXQubixyPXQuZSxxPXQuaTsh
-MDspe3A9e30Kbz1iLmEKbj0obyYxNik9PT0wCm09IW4KaWYoYTA9PW51bGwpe2lmKG0mJihvJjEpPT09
-MCl7bD1zLmEoYi5jKQpQLlNpKGwuYSxsLmIpfXJldHVybn1wLmE9YTAKaz1hMC5hCmZvcihiPWEwO2sh
-PW51bGw7Yj1rLGs9ail7Yi5hPW51bGwKUC5IWihjLmEsYikKcC5hPWsKaj1rLmF9bz1jLmEKaT1vLmMK
-cC5iPW0KcC5jPWkKaWYobil7aD1iLmMKaD0oaCYxKSE9PTB8fChoJjE1KT09PTh9ZWxzZSBoPSEwCmlm
-KGgpe2c9Yi5iLmIKaWYobSl7bz1vLmI9PT1nCm89IShvfHxvKX1lbHNlIG89ITEKaWYobyl7cy5hKGkp
-ClAuU2koaS5hLGkuYikKcmV0dXJufWY9JC5YMwppZihmIT09ZykkLlgzPWcKZWxzZSBmPW51bGwKYj1i
-LmMKaWYoKGImMTUpPT09OCluZXcgUC5SVChwLGMsbSkuJDAoKQplbHNlIGlmKG4pe2lmKChiJjEpIT09
-MCluZXcgUC5ycShwLGkpLiQwKCl9ZWxzZSBpZigoYiYyKSE9PTApbmV3IFAuUlcoYyxwKS4kMCgpCmlm
-KGYhPW51bGwpJC5YMz1mCmI9cC5jCmlmKHEuYihiKSl7bz1wLmEuJHRpCm89by5DKCJiODwyPiIpLmIo
-Yil8fCFvLlFbMV0uYihiKX1lbHNlIG89ITEKaWYobyl7cS5hKGIpCmU9cC5hLmIKaWYoKGIuYSYyNCkh
-PT0wKXtkPXIuYShlLmMpCmUuYz1udWxsCmEwPWUuTjgoZCkKZS5hPWIuYSYzMHxlLmEmMQplLmM9Yi5j
-CmMuYT1iCmNvbnRpbnVlfWVsc2UgUC5BOShiLGUpCnJldHVybn19ZT1wLmEuYgpkPXIuYShlLmMpCmUu
-Yz1udWxsCmEwPWUuTjgoZCkKYj1wLmIKbz1wLmMKaWYoIWIpe2UuJHRpLmMuYShvKQplLmE9OAplLmM9
-b31lbHNle3MuYShvKQplLmE9ZS5hJjF8MTYKZS5jPW99Yy5hPWUKYj1lfX0sClZIKGEsYil7dmFyIHMK
-aWYodC5hLmIoYSkpcmV0dXJuIGIuTGooYSx0LnosdC5LLHQubCkKcz10LnYKaWYocy5iKGEpKXJldHVy
-biBzLmEoYSkKdGhyb3cgSC5iKFAuTDMoYSwib25FcnJvciIsdS5jKSl9LApwdSgpe3ZhciBzLHIKZm9y
-KHM9JC5TNjtzIT1udWxsO3M9JC5TNil7JC5tZz1udWxsCnI9cy5iCiQuUzY9cgppZihyPT1udWxsKSQu
-azg9bnVsbApzLmEuJDAoKX19LAplTigpeyQuVUQ9ITAKdHJ5e1AucHUoKX1maW5hbGx5eyQubWc9bnVs
-bAokLlVEPSExCmlmKCQuUzYhPW51bGwpJC51dCgpLiQxKFAuVUkoKSl9fSwKZVcoYSl7dmFyIHM9bmV3
-IFAuT00oYSkscj0kLms4CmlmKHI9PW51bGwpeyQuUzY9JC5rOD1zCmlmKCEkLlVEKSQudXQoKS4kMShQ
-LlVJKCkpfWVsc2UgJC5rOD1yLmI9c30sCnJSKGEpe3ZhciBzLHIscSxwPSQuUzYKaWYocD09bnVsbCl7
-UC5lVyhhKQokLm1nPSQuazgKcmV0dXJufXM9bmV3IFAuT00oYSkKcj0kLm1nCmlmKHI9PW51bGwpe3Mu
-Yj1wCiQuUzY9JC5tZz1zfWVsc2V7cT1yLmIKcy5iPXEKJC5tZz1yLmI9cwppZihxPT1udWxsKSQuazg9
-c319LApyYihhKXt2YXIgcz1udWxsLHI9JC5YMwppZihDLk5VPT09cil7UC5UayhzLHMsQy5OVSxhKQpy
-ZXR1cm59UC5UayhzLHMscix0Lk0uYShyLkdZKGEpKSl9LApRdyhhLGIpe0guY2IoYSwic3RyZWFtIix0
-LkspCnJldHVybiBuZXcgUC54SShiLkMoInhJPDA+IikpfSwKU2koYSxiKXtQLnJSKG5ldyBQLkV2KGEs
-YikpfSwKVDgoYSxiLGMsZCxlKXt2YXIgcyxyPSQuWDMKaWYocj09PWMpcmV0dXJuIGQuJDAoKQokLlgz
-PWMKcz1yCnRyeXtyPWQuJDAoKQpyZXR1cm4gcn1maW5hbGx5eyQuWDM9c319LAp5dihhLGIsYyxkLGUs
-ZixnKXt2YXIgcyxyPSQuWDMKaWYocj09PWMpcmV0dXJuIGQuJDEoZSkKJC5YMz1jCnM9cgp0cnl7cj1k
-LiQxKGUpCnJldHVybiByfWZpbmFsbHl7JC5YMz1zfX0sClF4KGEsYixjLGQsZSxmLGcsaCxpKXt2YXIg
-cyxyPSQuWDMKaWYocj09PWMpcmV0dXJuIGQuJDIoZSxmKQokLlgzPWMKcz1yCnRyeXtyPWQuJDIoZSxm
-KQpyZXR1cm4gcn1maW5hbGx5eyQuWDM9c319LApUayhhLGIsYyxkKXt0Lk0uYShkKQppZihDLk5VIT09
-YylkPWMuR1koZCkKUC5lVyhkKX0sCnRoOmZ1bmN0aW9uIHRoKGEpe3RoaXMuYT1hfSwKaGE6ZnVuY3Rp
-b24gaGEoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKVnM6ZnVuY3Rpb24gVnMoYSl7
-dGhpcy5hPWF9LApGdDpmdW5jdGlvbiBGdChhKXt0aGlzLmE9YX0sClczOmZ1bmN0aW9uIFczKCl7fSwK
-eUg6ZnVuY3Rpb24geUgoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCmloOmZ1bmN0aW9uIGloKGEsYil7
-dGhpcy5hPWEKdGhpcy5iPSExCnRoaXMuJHRpPWJ9LApXTTpmdW5jdGlvbiBXTShhKXt0aGlzLmE9YX0s
-ClNYOmZ1bmN0aW9uIFNYKGEpe3RoaXMuYT1hfSwKR3M6ZnVuY3Rpb24gR3MoYSl7dGhpcy5hPWF9LApG
-eTpmdW5jdGlvbiBGeShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKR1Y6ZnVuY3Rpb24gR1YoYSxiKXt2
-YXIgXz10aGlzCl8uYT1hCl8uZD1fLmM9Xy5iPW51bGwKXy4kdGk9Yn0sCnE0OmZ1bmN0aW9uIHE0KGEs
-Yil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCkN3OmZ1bmN0aW9uIEN3KGEsYil7dGhpcy5hPWEKdGhpcy5i
-PWJ9LApQZjpmdW5jdGlvbiBQZigpe30sClpmOmZ1bmN0aW9uIFpmKGEsYil7dGhpcy5hPWEKdGhpcy4k
-dGk9Yn0sCkZlOmZ1bmN0aW9uIEZlKGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmE9bnVsbApfLmI9YQpf
-LmM9YgpfLmQ9YwpfLmU9ZApfLiR0aT1lfSwKdnM6ZnVuY3Rpb24gdnMoYSxiKXt2YXIgXz10aGlzCl8u
-YT0wCl8uYj1hCl8uYz1udWxsCl8uJHRpPWJ9LApkYTpmdW5jdGlvbiBkYShhLGIpe3RoaXMuYT1hCnRo
-aXMuYj1ifSwKb1E6ZnVuY3Rpb24gb1EoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnBWOmZ1bmN0aW9u
-IHBWKGEpe3RoaXMuYT1hfSwKVTc6ZnVuY3Rpb24gVTcoYSl7dGhpcy5hPWF9LAp2cjpmdW5jdGlvbiB2
-cihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApydDpmdW5jdGlvbiBydChhLGIpe3Ro
-aXMuYT1hCnRoaXMuYj1ifSwKS0Y6ZnVuY3Rpb24gS0YoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClpM
-OmZ1bmN0aW9uIFpMKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClJUOmZ1bmN0aW9u
-IFJUKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCmpaOmZ1bmN0aW9uIGpaKGEpe3Ro
-aXMuYT1hfSwKcnE6ZnVuY3Rpb24gcnEoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClJXOmZ1bmN0aW9u
-IFJXKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApPTTpmdW5jdGlvbiBPTShhKXt0aGlzLmE9YQp0aGlz
-LmI9bnVsbH0sCnFoOmZ1bmN0aW9uIHFoKCl7fSwKQjU6ZnVuY3Rpb24gQjUoYSxiKXt0aGlzLmE9YQp0
-aGlzLmI9Yn0sCnVPOmZ1bmN0aW9uIHVPKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApNTzpmdW5jdGlv
-biBNTygpe30sCmtUOmZ1bmN0aW9uIGtUKCl7fSwKeEk6ZnVuY3Rpb24geEkoYSl7dGhpcy4kdGk9YX0s
-Cm0wOmZ1bmN0aW9uIG0wKCl7fSwKRXY6ZnVuY3Rpb24gRXYoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0s
-CkppOmZ1bmN0aW9uIEppKCl7fSwKVnA6ZnVuY3Rpb24gVnAoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0s
-Ck9SOmZ1bmN0aW9uIE9SKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCkVGKGEsYixj
-KXtyZXR1cm4gYi5DKCJAPDA+IikuS3EoYykuQygiRm88MSwyPiIpLmEoSC5CNyhhLG5ldyBILk41KGIu
-QygiQDwwPiIpLktxKGMpLkMoIk41PDEsMj4iKSkpKX0sCkZsKGEsYil7cmV0dXJuIG5ldyBILk41KGEu
-QygiQDwwPiIpLktxKGIpLkMoIk41PDEsMj4iKSl9LApMcyhhKXtyZXR1cm4gbmV3IFAuYjYoYS5DKCJi
-NjwwPiIpKX0sClQyKCl7dmFyIHM9T2JqZWN0LmNyZWF0ZShudWxsKQpzWyI8bm9uLWlkZW50aWZpZXIt
-a2V5PiJdPXMKZGVsZXRlIHNbIjxub24taWRlbnRpZmllci1rZXk+Il0KcmV0dXJuIHN9LApyaihhLGIs
-Yyl7dmFyIHM9bmV3IFAubG0oYSxiLGMuQygibG08MD4iKSkKcy5jPWEuZQpyZXR1cm4gc30sCkVQKGEs
-YixjKXt2YXIgcyxyCmlmKFAuaEIoYSkpe2lmKGI9PT0iKCImJmM9PT0iKSIpcmV0dXJuIiguLi4pIgpy
-ZXR1cm4gYisiLi4uIitjfXM9SC5RSShbXSx0LnMpCkMuTm0uaSgkLnhnLGEpCnRyeXtQLlZyKGEscyl9
-ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXI9
-UC5sKGIsdC5SLmEocyksIiwgIikrYwpyZXR1cm4gci5jaGFyQ29kZUF0KDApPT0wP3I6cn0sCngoYSxi
-LGMpe3ZhciBzLHIKaWYoUC5oQihhKSlyZXR1cm4gYisiLi4uIitjCnM9bmV3IFAuTShiKQpDLk5tLmko
-JC54ZyxhKQp0cnl7cj1zCnIuYT1QLmwoci5hLGEsIiwgIil9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0
-aClyZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXMuYSs9YwpyPXMuYQpyZXR1cm4gci5jaGFy
-Q29kZUF0KDApPT0wP3I6cn0sCmhCKGEpe3ZhciBzLHIKZm9yKHM9JC54Zy5sZW5ndGgscj0wO3I8czsr
-K3IpaWYoYT09PSQueGdbcl0pcmV0dXJuITAKcmV0dXJuITF9LApWcihhLGIpe3ZhciBzLHIscSxwLG8s
-bixtLGw9YS5nbShhKSxrPTAsaj0wCndoaWxlKCEwKXtpZighKGs8ODB8fGo8MykpYnJlYWsKaWYoIWwu
-RigpKXJldHVybgpzPUguRWoobC5nbCgpKQpDLk5tLmkoYixzKQprKz1zLmxlbmd0aCsyOysran1pZigh
-bC5GKCkpe2lmKGo8PTUpcmV0dXJuCmlmKDA+PWIubGVuZ3RoKXJldHVybiBILk9IKGIsLTEpCnI9Yi5w
-b3AoKQppZigwPj1iLmxlbmd0aClyZXR1cm4gSC5PSChiLC0xKQpxPWIucG9wKCl9ZWxzZXtwPWwuZ2wo
-KTsrK2oKaWYoIWwuRigpKXtpZihqPD00KXtDLk5tLmkoYixILkVqKHApKQpyZXR1cm59cj1ILkVqKHAp
-CmlmKDA+PWIubGVuZ3RoKXJldHVybiBILk9IKGIsLTEpCnE9Yi5wb3AoKQprKz1yLmxlbmd0aCsyfWVs
-c2V7bz1sLmdsKCk7KytqCmZvcig7bC5GKCk7cD1vLG89bil7bj1sLmdsKCk7KytqCmlmKGo+MTAwKXt3
-aGlsZSghMCl7aWYoIShrPjc1JiZqPjMpKWJyZWFrCmlmKDA+PWIubGVuZ3RoKXJldHVybiBILk9IKGIs
-LTEpCmstPWIucG9wKCkubGVuZ3RoKzI7LS1qfUMuTm0uaShiLCIuLi4iKQpyZXR1cm59fXE9SC5Faihw
-KQpyPUguRWoobykKays9ci5sZW5ndGgrcS5sZW5ndGgrNH19aWYoaj5iLmxlbmd0aCsyKXtrKz01Cm09
-Ii4uLiJ9ZWxzZSBtPW51bGwKd2hpbGUoITApe2lmKCEoaz44MCYmYi5sZW5ndGg+MykpYnJlYWsKaWYo
-MD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKay09Yi5wb3AoKS5sZW5ndGgrMgppZihtPT1udWxs
-KXtrKz01Cm09Ii4uLiJ9fWlmKG0hPW51bGwpQy5ObS5pKGIsbSkKQy5ObS5pKGIscSkKQy5ObS5pKGIs
-cil9LAp0TShhLGIpe3ZhciBzLHIscT1QLkxzKGIpCmZvcihzPWEubGVuZ3RoLHI9MDtyPGEubGVuZ3Ro
-O2EubGVuZ3RoPT09c3x8KDAsSC5saykoYSksKytyKXEuaSgwLGIuYShhW3JdKSkKcmV0dXJuIHF9LApu
-TyhhKXt2YXIgcyxyPXt9CmlmKFAuaEIoYSkpcmV0dXJuInsuLi59IgpzPW5ldyBQLk0oIiIpCnRyeXtD
-Lk5tLmkoJC54ZyxhKQpzLmErPSJ7IgpyLmE9ITAKYS5LKDAsbmV3IFAucmEocixzKSkKcy5hKz0ifSJ9
-ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXI9
-cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfSwKYjY6ZnVuY3Rpb24gYjYoYSl7dmFyIF89
-dGhpcwpfLmE9MApfLmY9Xy5lPV8uZD1fLmM9Xy5iPW51bGwKXy5yPTAKXy4kdGk9YX0sCmJuOmZ1bmN0
-aW9uIGJuKGEpe3RoaXMuYT1hCnRoaXMuYz10aGlzLmI9bnVsbH0sCmxtOmZ1bmN0aW9uIGxtKGEsYixj
-KXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uZD1fLmM9bnVsbApfLiR0aT1jfSwKbVc6ZnVuY3Rpb24g
-bVcoKXt9LAp1eTpmdW5jdGlvbiB1eSgpe30sCmxEOmZ1bmN0aW9uIGxEKCl7fSwKaWw6ZnVuY3Rpb24g
-aWwoKXt9LApyYTpmdW5jdGlvbiByYShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKWWs6ZnVuY3Rpb24g
-WWsoKXt9LAp5UTpmdW5jdGlvbiB5UShhKXt0aGlzLmE9YX0sCktQOmZ1bmN0aW9uIEtQKCl7fSwKUG46
-ZnVuY3Rpb24gUG4oKXt9LApHajpmdW5jdGlvbiBHaihhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LAps
-ZjpmdW5jdGlvbiBsZigpe30sClZqOmZ1bmN0aW9uIFZqKCl7fSwKWHY6ZnVuY3Rpb24gWHYoKXt9LApu
-WTpmdW5jdGlvbiBuWSgpe30sCldZOmZ1bmN0aW9uIFdZKCl7fSwKUlU6ZnVuY3Rpb24gUlUoKXt9LApw
-UjpmdW5jdGlvbiBwUigpe30sCkJTKGEsYil7dmFyIHMscixxLHA9bnVsbAp0cnl7cD1KU09OLnBhcnNl
-KGEpfWNhdGNoKHIpe3M9SC5SdShyKQpxPVAucnIoU3RyaW5nKHMpLG51bGwsbnVsbCkKdGhyb3cgSC5i
-KHEpfXE9UC5RZShwKQpyZXR1cm4gcX0sClFlKGEpe3ZhciBzCmlmKGE9PW51bGwpcmV0dXJuIG51bGwK
-aWYodHlwZW9mIGEhPSJvYmplY3QiKXJldHVybiBhCmlmKE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSE9
-PUFycmF5LnByb3RvdHlwZSlyZXR1cm4gbmV3IFAudXcoYSxPYmplY3QuY3JlYXRlKG51bGwpKQpmb3Io
-cz0wO3M8YS5sZW5ndGg7KytzKWFbc109UC5RZShhW3NdKQpyZXR1cm4gYX0sCmt5KGEsYixjLGQpe3Zh
-ciBzLHIKaWYoYiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe3M9YgpkPXMubGVuZ3RoCmlmKGQtYzwxNSly
-ZXR1cm4gbnVsbApyPVAuUlAoYSxzLGMsZCkKaWYociE9bnVsbCYmYSlpZihyLmluZGV4T2YoIlx1ZmZm
-ZCIpPj0wKXJldHVybiBudWxsCnJldHVybiByfXJldHVybiBudWxsfSwKUlAoYSxiLGMsZCl7dmFyIHM9
-YT8kLkhHKCk6JC5yZigpCmlmKHM9PW51bGwpcmV0dXJuIG51bGwKaWYoMD09PWMmJmQ9PT1iLmxlbmd0
-aClyZXR1cm4gUC5SYihzLGIpCnJldHVybiBQLlJiKHMsYi5zdWJhcnJheShjLFAuakIoYyxkLGIubGVu
-Z3RoKSkpfSwKUmIoYSxiKXt2YXIgcyxyCnRyeXtzPWEuZGVjb2RlKGIpCnJldHVybiBzfWNhdGNoKHIp
-e0guUnUocil9cmV0dXJuIG51bGx9LAp4TShhLGIsYyxkLGUsZil7aWYoQy5qbi56WShmLDQpIT09MCl0
-aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNlNjQgcGFkZGluZywgcGFkZGVkIGxlbmd0aCBtdXN0IGJl
-IG11bHRpcGxlIG9mIGZvdXIsIGlzICIrZixhLGMpKQppZihkK2UhPT1mKXRocm93IEguYihQLnJyKCJJ
-bnZhbGlkIGJhc2U2NCBwYWRkaW5nLCAnPScgbm90IGF0IHRoZSBlbmQiLGEsYikpCmlmKGU+Mil0aHJv
-dyBILmIoUC5ycigiSW52YWxpZCBiYXNlNjQgcGFkZGluZywgbW9yZSB0aGFuIHR3byAnPScgY2hhcmFj
-dGVycyIsYSxiKSl9LApHeShhLGIsYyl7cmV0dXJuIG5ldyBQLlVkKGEsYil9LApOQyhhKXtyZXR1cm4g
-YS5MdCgpfSwKVWcoYSxiKXtyZXR1cm4gbmV3IFAudHUoYSxbXSxQLkN5KCkpfSwKdVgoYSxiLGMpe3Zh
-ciBzLHI9bmV3IFAuTSgiIikscT1QLlVnKHIsYikKcS5pVShhKQpzPXIuYQpyZXR1cm4gcy5jaGFyQ29k
-ZUF0KDApPT0wP3M6c30sCmo0KGEpe3N3aXRjaChhKXtjYXNlIDY1OnJldHVybiJNaXNzaW5nIGV4dGVu
-c2lvbiBieXRlIgpjYXNlIDY3OnJldHVybiJVbmV4cGVjdGVkIGV4dGVuc2lvbiBieXRlIgpjYXNlIDY5
-OnJldHVybiJJbnZhbGlkIFVURi04IGJ5dGUiCmNhc2UgNzE6cmV0dXJuIk92ZXJsb25nIGVuY29kaW5n
-IgpjYXNlIDczOnJldHVybiJPdXQgb2YgdW5pY29kZSByYW5nZSIKY2FzZSA3NTpyZXR1cm4iRW5jb2Rl
-ZCBzdXJyb2dhdGUiCmNhc2UgNzc6cmV0dXJuIlVuZmluaXNoZWQgVVRGLTggb2N0ZXQgc2VxdWVuY2Ui
-CmRlZmF1bHQ6cmV0dXJuIiJ9fSwKankoYSxiLGMpe3ZhciBzLHIscSxwPWMtYixvPW5ldyBVaW50OEFy
-cmF5KHApCmZvcihzPUouVTYoYSkscj0wO3I8cDsrK3Ipe3E9cy5xKGEsYityKQppZigocSY0Mjk0OTY3
-MDQwKT4+PjAhPT0wKXE9MjU1CmlmKHI+PXApcmV0dXJuIEguT0gobyxyKQpvW3JdPXF9cmV0dXJuIG99
-LAp1dzpmdW5jdGlvbiB1dyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1udWxsfSwKaTg6ZnVu
-Y3Rpb24gaTgoYSl7dGhpcy5hPWF9LAp4cjpmdW5jdGlvbiB4cigpe30sCk56OmZ1bmN0aW9uIE56KCl7
-fSwKQ1Y6ZnVuY3Rpb24gQ1YoKXt9LApVODpmdW5jdGlvbiBVOCgpe30sClVrOmZ1bmN0aW9uIFVrKCl7
-fSwKd0k6ZnVuY3Rpb24gd0koKXt9LApaaTpmdW5jdGlvbiBaaSgpe30sClVkOmZ1bmN0aW9uIFVkKGEs
-Yil7dGhpcy5hPWEKdGhpcy5iPWJ9LApLODpmdW5jdGlvbiBLOChhLGIpe3RoaXMuYT1hCnRoaXMuYj1i
-fSwKYnk6ZnVuY3Rpb24gYnkoKXt9LApvajpmdW5jdGlvbiBvaihhKXt0aGlzLmI9YX0sCk14OmZ1bmN0
-aW9uIE14KGEpe3RoaXMuYT1hfSwKU2g6ZnVuY3Rpb24gU2goKXt9LAp0aTpmdW5jdGlvbiB0aShhLGIp
-e3RoaXMuYT1hCnRoaXMuYj1ifSwKdHU6ZnVuY3Rpb24gdHUoYSxiLGMpe3RoaXMuYz1hCnRoaXMuYT1i
-CnRoaXMuYj1jfSwKdTU6ZnVuY3Rpb24gdTUoKXt9LApFMzpmdW5jdGlvbiBFMygpe30sClJ3OmZ1bmN0
-aW9uIFJ3KGEpe3RoaXMuYj0wCnRoaXMuYz1hfSwKR1k6ZnVuY3Rpb24gR1koYSl7dGhpcy5hPWF9LApi
-ejpmdW5jdGlvbiBieihhKXt0aGlzLmE9YQp0aGlzLmI9MTYKdGhpcy5jPTB9LApRQShhLGIpe3ZhciBz
-PUguSHAoYSxiKQppZihzIT1udWxsKXJldHVybiBzCnRocm93IEguYihQLnJyKGEsbnVsbCxudWxsKSl9
-LApvcyhhKXtpZihhIGluc3RhbmNlb2YgSC5UcClyZXR1cm4gYS53KDApCnJldHVybiJJbnN0YW5jZSBv
-ZiAnIitILmxoKGEpKyInIn0sCk84KGEsYixjLGQpe3ZhciBzLHI9Yz9KLktoKGEsZCk6Si5RaShhLGQp
-CmlmKGEhPT0wJiZiIT1udWxsKWZvcihzPTA7czxyLmxlbmd0aDsrK3MpcltzXT1iCnJldHVybiByfSwK
-UFcoYSxiLGMpe3ZhciBzLHI9SC5RSShbXSxjLkMoImpkPDA+IikpCmZvcihzPUouSVQoYSk7cy5GKCk7
-KUMuTm0uaShyLGMuYShzLmdsKCkpKQppZihiKXJldHVybiByCnJldHVybiBKLkVwKHIsYyl9LApZMShh
-LGIsYyl7dmFyIHMKaWYoYilyZXR1cm4gUC5ldihhLGMpCnM9Si5FcChQLmV2KGEsYyksYykKcmV0dXJu
-IHN9LApldihhLGIpe3ZhciBzLHIKaWYoQXJyYXkuaXNBcnJheShhKSlyZXR1cm4gSC5RSShhLnNsaWNl
-KDApLGIuQygiamQ8MD4iKSkKcz1ILlFJKFtdLGIuQygiamQ8MD4iKSkKZm9yKHI9Si5JVChhKTtyLkYo
-KTspQy5ObS5pKHMsci5nbCgpKQpyZXR1cm4gc30sCkFGKGEsYil7cmV0dXJuIEouekMoUC5QVyhhLCEx
-LGIpKX0sCkhNKGEsYixjKXt2YXIgcz1ILmZ3KGEsYixQLmpCKGIsYyxhLmxlbmd0aCkpCnJldHVybiBz
-fSwKT28oYSl7cmV0dXJuIEguTHcoYSl9LApudShhKXtyZXR1cm4gbmV3IEguVlIoYSxILnY0KGEsITEs
-ITAsITEsITEsITEpKX0sCmwoYSxiLGMpe3ZhciBzPUouSVQoYikKaWYoIXMuRigpKXJldHVybiBhCmlm
-KGMubGVuZ3RoPT09MCl7ZG8gYSs9SC5FaihzLmdsKCkpCndoaWxlKHMuRigpKX1lbHNle2ErPUguRWoo
-cy5nbCgpKQpmb3IoO3MuRigpOylhPWErYytILkVqKHMuZ2woKSl9cmV0dXJuIGF9LApscihhLGIsYyxk
-KXtyZXR1cm4gbmV3IFAubXAoYSxiLGMsZCl9LAp1bygpe3ZhciBzPUguTTAoKQppZihzIT1udWxsKXJl
-dHVybiBQLmhLKHMpCnRocm93IEguYihQLkw0KCInVXJpLmJhc2UnIGlzIG5vdCBzdXBwb3J0ZWQiKSl9
-LAplUChhLGIsYyxkKXt2YXIgcyxyLHEscCxvLG4sbT0iMDEyMzQ1Njc4OUFCQ0RFRiIKaWYoYz09PUMu
-eE0pe3M9JC56NCgpLmIKcz1zLnRlc3QoYil9ZWxzZSBzPSExCmlmKHMpcmV0dXJuIGIKSC5MaChjKS5D
-KCJVay5TIikuYShiKQpyPWMuZ1pFKCkuV0ooYikKZm9yKHM9ci5sZW5ndGgscT0wLHA9IiI7cTxzOysr
-cSl7bz1yW3FdCmlmKG88MTI4KXtuPW8+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goYSxuKQpuPShhW25d
-JjE8PChvJjE1KSkhPT0wfWVsc2Ugbj0hMQppZihuKXArPUguTHcobykKZWxzZSBwPWQmJm89PT0zMj9w
-KyIrIjpwKyIlIittW28+Pj40JjE1XSttW28mMTVdfXJldHVybiBwLmNoYXJDb2RlQXQoMCk9PTA/cDpw
-fSwKR3EoYSl7dmFyIHM9TWF0aC5hYnMoYSkscj1hPDA/Ii0iOiIiCmlmKHM+PTEwMDApcmV0dXJuIiIr
-YQppZihzPj0xMDApcmV0dXJuIHIrIjAiK3MKaWYocz49MTApcmV0dXJuIHIrIjAwIitzCnJldHVybiBy
-KyIwMDAiK3N9LApWeChhKXtpZihhPj0xMDApcmV0dXJuIiIrYQppZihhPj0xMClyZXR1cm4iMCIrYQpy
-ZXR1cm4iMDAiK2F9LApoMChhKXtpZihhPj0xMClyZXR1cm4iIithCnJldHVybiIwIithfSwKaGwoYSl7
-aWYodHlwZW9mIGE9PSJudW1iZXIifHxILnJRKGEpfHxhPT1udWxsKXJldHVybiBKLncoYSkKaWYodHlw
-ZW9mIGE9PSJzdHJpbmciKXJldHVybiBKU09OLnN0cmluZ2lmeShhKQpyZXR1cm4gUC5vcyhhKX0sCmhW
-KGEpe3JldHVybiBuZXcgUC5DNihhKX0sCnhZKGEsYil7cmV0dXJuIG5ldyBQLkFUKCExLG51bGwsYixh
-KX0sCkwzKGEsYixjKXtyZXR1cm4gbmV3IFAuQVQoITAsYSxiLGMpfSwKTzcoYSxiKXtyZXR1cm4gbmV3
-IFAuYkoobnVsbCxudWxsLCEwLGEsYiwiVmFsdWUgbm90IGluIHJhbmdlIil9LApURShhLGIsYyxkLGUp
-e3JldHVybiBuZXcgUC5iSihiLGMsITAsYSxkLCJJbnZhbGlkIHZhbHVlIil9LAp3QShhLGIsYyxkKXtp
-ZihhPGJ8fGE+Yyl0aHJvdyBILmIoUC5URShhLGIsYyxkLG51bGwpKQpyZXR1cm4gYX0sCmpCKGEsYixj
-KXtpZigwPmF8fGE+Yyl0aHJvdyBILmIoUC5URShhLDAsYywic3RhcnQiLG51bGwpKQppZihiIT1udWxs
-KXtpZihhPmJ8fGI+Yyl0aHJvdyBILmIoUC5URShiLGEsYywiZW5kIixudWxsKSkKcmV0dXJuIGJ9cmV0
-dXJuIGN9LAprMShhLGIpe2lmKGE8MCl0aHJvdyBILmIoUC5URShhLDAsbnVsbCxiLG51bGwpKQpyZXR1
-cm4gYX0sCkNmKGEsYixjLGQsZSl7dmFyIHM9SC5JWihlPT1udWxsP0ouSG0oYik6ZSkKcmV0dXJuIG5l
-dyBQLmVZKHMsITAsYSxjLCJJbmRleCBvdXQgb2YgcmFuZ2UiKX0sCkw0KGEpe3JldHVybiBuZXcgUC51
-YihhKX0sClNZKGEpe3JldHVybiBuZXcgUC5kcyhhKX0sClBWKGEpe3JldHVybiBuZXcgUC5saihhKX0s
-CmE0KGEpe3JldHVybiBuZXcgUC5VVihhKX0sCnJyKGEsYixjKXtyZXR1cm4gbmV3IFAuYUUoYSxiLGMp
-fSwKaEsoYTUpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYixhLGEwLGExLGEy
-LGEzPW51bGwsYTQ9YTUubGVuZ3RoCmlmKGE0Pj01KXtzPSgoQy54Qi5XKGE1LDQpXjU4KSozfEMueEIu
-VyhhNSwwKV4xMDB8Qy54Qi5XKGE1LDEpXjk3fEMueEIuVyhhNSwyKV4xMTZ8Qy54Qi5XKGE1LDMpXjk3
-KT4+PjAKaWYocz09PTApcmV0dXJuIFAuS0QoYTQ8YTQ/Qy54Qi5OaihhNSwwLGE0KTphNSw1LGEzKS5n
-bFIoKQplbHNlIGlmKHM9PT0zMilyZXR1cm4gUC5LRChDLnhCLk5qKGE1LDUsYTQpLDAsYTMpLmdsUigp
-fXI9UC5POCg4LDAsITEsdC5TKQpDLk5tLlk1KHIsMCwwKQpDLk5tLlk1KHIsMSwtMSkKQy5ObS5ZNShy
-LDIsLTEpCkMuTm0uWTUociw3LC0xKQpDLk5tLlk1KHIsMywwKQpDLk5tLlk1KHIsNCwwKQpDLk5tLlk1
-KHIsNSxhNCkKQy5ObS5ZNShyLDYsYTQpCmlmKFAuVUIoYTUsMCxhNCwwLHIpPj0xNClDLk5tLlk1KHIs
-NyxhNCkKcT1yWzFdCmlmKHE+PTApaWYoUC5VQihhNSwwLHEsMjAscik9PT0yMClyWzddPXEKcD1yWzJd
-KzEKbz1yWzNdCm49cls0XQptPXJbNV0KbD1yWzZdCmlmKGw8bSltPWwKaWYobjxwKW49bQplbHNlIGlm
-KG48PXEpbj1xKzEKaWYobzxwKW89bgprPXJbN108MAppZihrKWlmKHA+cSszKXtqPWEzCms9ITF9ZWxz
-ZXtpPW8+MAppZihpJiZvKzE9PT1uKXtqPWEzCms9ITF9ZWxzZXtpZighKG08YTQmJm09PT1uKzImJkMu
-eEIuUWkoYTUsIi4uIixuKSkpaD1tPm4rMiYmQy54Qi5RaShhNSwiLy4uIixtLTMpCmVsc2UgaD0hMApp
-ZihoKXtqPWEzCms9ITF9ZWxzZXtpZihxPT09NClpZihDLnhCLlFpKGE1LCJmaWxlIiwwKSl7aWYocDw9
-MCl7aWYoIUMueEIuUWkoYTUsIi8iLG4pKXtnPSJmaWxlOi8vLyIKcz0zfWVsc2V7Zz0iZmlsZTovLyIK
-cz0yfWE1PWcrQy54Qi5OaihhNSxuLGE0KQpxLT0wCmk9cy0wCm0rPWkKbCs9aQphND1hNS5sZW5ndGgK
-cD03Cm89NwpuPTd9ZWxzZSBpZihuPT09bSl7KytsCmY9bSsxCmE1PUMueEIuaTcoYTUsbixtLCIvIik7
-KythNAptPWZ9aj0iZmlsZSJ9ZWxzZSBpZihDLnhCLlFpKGE1LCJodHRwIiwwKSl7aWYoaSYmbyszPT09
-biYmQy54Qi5RaShhNSwiODAiLG8rMSkpe2wtPTMKZT1uLTMKbS09MwphNT1DLnhCLmk3KGE1LG8sbiwi
-IikKYTQtPTMKbj1lfWo9Imh0dHAifWVsc2Ugaj1hMwplbHNlIGlmKHE9PT01JiZDLnhCLlFpKGE1LCJo
-dHRwcyIsMCkpe2lmKGkmJm8rND09PW4mJkMueEIuUWkoYTUsIjQ0MyIsbysxKSl7bC09NAplPW4tNApt
-LT00CmE1PUMueEIuaTcoYTUsbyxuLCIiKQphNC09MwpuPWV9aj0iaHR0cHMifWVsc2Ugaj1hMwprPSEw
-fX19ZWxzZSBqPWEzCmlmKGspe2lmKGE0PGE1Lmxlbmd0aCl7YTU9Qy54Qi5OaihhNSwwLGE0KQpxLT0w
-CnAtPTAKby09MApuLT0wCm0tPTAKbC09MH1yZXR1cm4gbmV3IFAuVWYoYTUscSxwLG8sbixtLGwsail9
-aWYoaj09bnVsbClpZihxPjApaj1QLlBpKGE1LDAscSkKZWxzZXtpZihxPT09MClQLlIzKGE1LDAsIklu
-dmFsaWQgZW1wdHkgc2NoZW1lIikKaj0iIn1pZihwPjApe2Q9cSszCmM9ZDxwP1AuelIoYTUsZCxwLTEp
-OiIiCmI9UC5PZShhNSxwLG8sITEpCmk9bysxCmlmKGk8bil7YT1ILkhwKEMueEIuTmooYTUsaSxuKSxh
-MykKYTA9UC53QihhPT1udWxsP0gudihQLnJyKCJJbnZhbGlkIHBvcnQiLGE1LGkpKTphLGopfWVsc2Ug
-YTA9YTN9ZWxzZXthMD1hMwpiPWEwCmM9IiJ9YTE9UC5rYShhNSxuLG0sYTMsaixiIT1udWxsKQphMj1t
-PGw/UC5sZShhNSxtKzEsbCxhMyk6YTMKcmV0dXJuIG5ldyBQLkRuKGosYyxiLGEwLGExLGEyLGw8YTQ/
-UC50RyhhNSxsKzEsYTQpOmEzKX0sCk10KGEpe0gubihhKQpyZXR1cm4gUC5rdShhLDAsYS5sZW5ndGgs
-Qy54TSwhMSl9LApXWChhKXt2YXIgcz10Lk4KcmV0dXJuIEMuTm0uTjAoSC5RSShhLnNwbGl0KCImIiks
-dC5zKSxQLkZsKHMscyksbmV3IFAubjEoQy54TSksdC5FKX0sCkhoKGEsYixjKXt2YXIgcyxyLHEscCxv
-LG4sbT0iSVB2NCBhZGRyZXNzIHNob3VsZCBjb250YWluIGV4YWN0bHkgNCBwYXJ0cyIsbD0iZWFjaCBw
-YXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIDAuLjI1NSIsaz1uZXcgUC5jUyhhKSxqPW5ldyBVaW50OEFy
-cmF5KDQpCmZvcihzPWIscj1zLHE9MDtzPGM7KytzKXtwPUMueEIuTyhhLHMpCmlmKHAhPT00Nil7aWYo
-KHBeNDgpPjkpay4kMigiaW52YWxpZCBjaGFyYWN0ZXIiLHMpfWVsc2V7aWYocT09PTMpay4kMihtLHMp
-Cm89UC5RQShDLnhCLk5qKGEscixzKSxudWxsKQppZihvPjI1NSlrLiQyKGwscikKbj1xKzEKaWYocT49
-NClyZXR1cm4gSC5PSChqLHEpCmpbcV09bwpyPXMrMQpxPW59fWlmKHEhPT0zKWsuJDIobSxjKQpvPVAu
-UUEoQy54Qi5OaihhLHIsYyksbnVsbCkKaWYobz4yNTUpay4kMihsLHIpCmlmKHE+PTQpcmV0dXJuIEgu
-T0goaixxKQpqW3FdPW8KcmV0dXJuIGp9LAplZyhhLGIsYTApe3ZhciBzLHIscSxwLG8sbixtLGwsayxq
-LGksaCxnLGYsZSxkPW5ldyBQLlZDKGEpLGM9bmV3IFAuSlQoZCxhKQppZihhLmxlbmd0aDwyKWQuJDEo
-ImFkZHJlc3MgaXMgdG9vIHNob3J0IikKcz1ILlFJKFtdLHQudCkKZm9yKHI9YixxPXIscD0hMSxvPSEx
-O3I8YTA7KytyKXtuPUMueEIuTyhhLHIpCmlmKG49PT01OCl7aWYocj09PWIpeysrcgppZihDLnhCLk8o
-YSxyKSE9PTU4KWQuJDIoImludmFsaWQgc3RhcnQgY29sb24uIixyKQpxPXJ9aWYocj09PXEpe2lmKHAp
-ZC4kMigib25seSBvbmUgd2lsZGNhcmQgYDo6YCBpcyBhbGxvd2VkIixyKQpDLk5tLmkocywtMSkKcD0h
-MH1lbHNlIEMuTm0uaShzLGMuJDIocSxyKSkKcT1yKzF9ZWxzZSBpZihuPT09NDYpbz0hMH1pZihzLmxl
-bmd0aD09PTApZC4kMSgidG9vIGZldyBwYXJ0cyIpCm09cT09PWEwCmw9Qy5ObS5ncloocykKaWYobSYm
-bCE9PS0xKWQuJDIoImV4cGVjdGVkIGEgcGFydCBhZnRlciBsYXN0IGA6YCIsYTApCmlmKCFtKWlmKCFv
-KUMuTm0uaShzLGMuJDIocSxhMCkpCmVsc2V7az1QLkhoKGEscSxhMCkKQy5ObS5pKHMsKGtbMF08PDh8
-a1sxXSk+Pj4wKQpDLk5tLmkocywoa1syXTw8OHxrWzNdKT4+PjApfWlmKHApe2lmKHMubGVuZ3RoPjcp
-ZC4kMSgiYW4gYWRkcmVzcyB3aXRoIGEgd2lsZGNhcmQgbXVzdCBoYXZlIGxlc3MgdGhhbiA3IHBhcnRz
-Iil9ZWxzZSBpZihzLmxlbmd0aCE9PTgpZC4kMSgiYW4gYWRkcmVzcyB3aXRob3V0IGEgd2lsZGNhcmQg
-bXVzdCBjb250YWluIGV4YWN0bHkgOCBwYXJ0cyIpCmo9bmV3IFVpbnQ4QXJyYXkoMTYpCmZvcihsPXMu
-bGVuZ3RoLGk9OS1sLHI9MCxoPTA7cjxsOysrcil7Zz1zW3JdCmlmKGc9PT0tMSlmb3IoZj0wO2Y8aTsr
-K2Ype2lmKGg8MHx8aD49MTYpcmV0dXJuIEguT0goaixoKQpqW2hdPTAKZT1oKzEKaWYoZT49MTYpcmV0
-dXJuIEguT0goaixlKQpqW2VdPTAKaCs9Mn1lbHNle2U9Qy5qbi53RyhnLDgpCmlmKGg8MHx8aD49MTYp
-cmV0dXJuIEguT0goaixoKQpqW2hdPWUKZT1oKzEKaWYoZT49MTYpcmV0dXJuIEguT0goaixlKQpqW2Vd
-PWcmMjU1CmgrPTJ9fXJldHVybiBqfSwKS0woYSxiLGMsZCxlLGYsZyl7dmFyIHMscixxLHAsbyxuCmY9
-Zj09bnVsbD8iIjpQLlBpKGYsMCxmLmxlbmd0aCkKZz1QLnpSKGcsMCxnPT1udWxsPzA6Zy5sZW5ndGgp
-CmE9UC5PZShhLDAsYT09bnVsbD8wOmEubGVuZ3RoLCExKQpzPVAubGUobnVsbCwwLDAsZSkKcj1QLnRH
-KG51bGwsMCwwKQpkPVAud0IoZCxmKQpxPWY9PT0iZmlsZSIKaWYoYT09bnVsbClwPWcubGVuZ3RoIT09
-MHx8ZCE9bnVsbHx8cQplbHNlIHA9ITEKaWYocClhPSIiCnA9YT09bnVsbApvPSFwCmI9UC5rYShiLDAs
-Yj09bnVsbD8wOmIubGVuZ3RoLGMsZixvKQpuPWYubGVuZ3RoPT09MAppZihuJiZwJiYhQy54Qi5uKGIs
-Ii8iKSliPVAud0YoYiwhbnx8bykKZWxzZSBiPVAueGUoYikKcmV0dXJuIG5ldyBQLkRuKGYsZyxwJiZD
-LnhCLm4oYiwiLy8iKT8iIjphLGQsYixzLHIpfSwKd0soYSl7aWYoYT09PSJodHRwIilyZXR1cm4gODAK
-aWYoYT09PSJodHRwcyIpcmV0dXJuIDQ0MwpyZXR1cm4gMH0sCk5SKGEsYil7dmFyIHMscixxLHAsbyxu
-CmZvcihzPWEubGVuZ3RoLHI9MDtyPHM7KytyKXtxPUMueEIuVyhhLHIpCnA9Qy54Qi5XKGIscikKbz1x
-XnAKaWYobyE9PTApe2lmKG89PT0zMil7bj1wfG8KaWYoOTc8PW4mJm48PTEyMiljb250aW51ZX1yZXR1
-cm4hMX19cmV0dXJuITB9LApSMyhhLGIsYyl7dGhyb3cgSC5iKFAucnIoYyxhLGIpKX0sClhkKGEsYixj
-LGQpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaD1udWxsLGc9Yi5sZW5ndGgKaWYoZyE9PTApe3E9
-MAp3aGlsZSghMCl7aWYoIShxPGcpKXtzPSIiCnI9MApicmVha31pZihDLnhCLlcoYixxKT09PTY0KXtz
-PUMueEIuTmooYiwwLHEpCnI9cSsxCmJyZWFrfSsrcX1pZihyPGcmJkMueEIuVyhiLHIpPT09OTEpe2Zv
-cihwPXIsbz0tMTtwPGc7KytwKXtuPUMueEIuVyhiLHApCmlmKG49PT0zNyYmbzwwKXttPUMueEIuUWko
-YiwiMjUiLHArMSk/cCsyOnAKbz1wCnA9bX1lbHNlIGlmKG49PT05MylicmVha31pZihwPT09Zyl0aHJv
-dyBILmIoUC5ycigiSW52YWxpZCBJUHY2IGhvc3QgZW50cnkuIixiLHIpKQpsPW88MD9wOm8KUC5lZyhi
-LHIrMSxsKTsrK3AKaWYocCE9PWcmJkMueEIuVyhiLHApIT09NTgpdGhyb3cgSC5iKFAucnIoIkludmFs
-aWQgZW5kIG9mIGF1dGhvcml0eSIsYixwKSl9ZWxzZSBwPXIKd2hpbGUoITApe2lmKCEocDxnKSl7az1o
-CmJyZWFrfWlmKEMueEIuVyhiLHApPT09NTgpe2o9Qy54Qi55bihiLHArMSkKaz1qLmxlbmd0aCE9PTA/
-UC5RQShqLGgpOmgKYnJlYWt9KytwfWk9Qy54Qi5OaihiLHIscCl9ZWxzZXtrPWgKaT1rCnM9IiJ9cmV0
-dXJuIFAuS0woaSxoLEguUUkoYy5zcGxpdCgiLyIpLHQucyksayxkLGEscyl9LAprRShhLGIpe3ZhciBz
-LHIscSxwLG8KZm9yKHM9YS5sZW5ndGgscj0wO3I8czsrK3Ipe3E9YVtyXQpwPUouVTYocSkKbz1wLmdB
-KHEpCmlmKDA+bylILnYoUC5URSgwLDAscC5nQShxKSxudWxsLG51bGwpKQppZihILlNRKHEsIi8iLDAp
-KXtzPVAuTDQoIklsbGVnYWwgcGF0aCBjaGFyYWN0ZXIgIitILkVqKHEpKQp0aHJvdyBILmIocyl9fX0s
-CkhOKGEsYixjKXt2YXIgcyxyLHEscApmb3Iocz1ILnFDKGEsYyxudWxsLEgudDYoYSkuYykscj1zLiR0
-aSxzPW5ldyBILmE3KHMscy5nQShzKSxyLkMoImE3PGFMLkU+IikpLHI9ci5DKCJhTC5FIik7cy5GKCk7
-KXtxPXIuYShzLmQpCnA9UC5udSgnWyIqLzo8Pj9cXFxcfF0nKQppZihILlNRKHEscCwwKSl7cz1QLkw0
-KCJJbGxlZ2FsIGNoYXJhY3RlciBpbiBwYXRoOiAiK3EpCnRocm93IEguYihzKX19fSwKcmcoYSxiKXt2
-YXIgcwppZighKDY1PD1hJiZhPD05MCkpcz05Nzw9YSYmYTw9MTIyCmVsc2Ugcz0hMAppZihzKXJldHVy
-bgpzPVAuTDQoIklsbGVnYWwgZHJpdmUgbGV0dGVyICIrUC5PbyhhKSkKdGhyb3cgSC5iKHMpfSwKd0Io
-YSxiKXtpZihhIT1udWxsJiZhPT09UC53SyhiKSlyZXR1cm4gbnVsbApyZXR1cm4gYX0sCk9lKGEsYixj
-LGQpe3ZhciBzLHIscSxwLG8sbgppZihhPT1udWxsKXJldHVybiBudWxsCmlmKGI9PT1jKXJldHVybiIi
-CmlmKEMueEIuTyhhLGIpPT09OTEpe3M9Yy0xCmlmKEMueEIuTyhhLHMpIT09OTMpUC5SMyhhLGIsIk1p
-c3NpbmcgZW5kIGBdYCB0byBtYXRjaCBgW2AgaW4gaG9zdCIpCnI9YisxCnE9UC50byhhLHIscykKaWYo
-cTxzKXtwPXErMQpvPVAuT0EoYSxDLnhCLlFpKGEsIjI1IixwKT9xKzM6cCxzLCIlMjUiKX1lbHNlIG89
-IiIKUC5lZyhhLHIscSkKcmV0dXJuIEMueEIuTmooYSxiLHEpLnRvTG93ZXJDYXNlKCkrbysiXSJ9Zm9y
-KG49YjtuPGM7KytuKWlmKEMueEIuTyhhLG4pPT09NTgpe3E9Qy54Qi5YVShhLCIlIixiKQpxPXE+PWIm
-JnE8Yz9xOmMKaWYocTxjKXtwPXErMQpvPVAuT0EoYSxDLnhCLlFpKGEsIjI1IixwKT9xKzM6cCxjLCIl
-MjUiKX1lbHNlIG89IiIKUC5lZyhhLGIscSkKcmV0dXJuIlsiK0MueEIuTmooYSxiLHEpK28rIl0ifXJl
-dHVybiBQLk9MKGEsYixjKX0sCnRvKGEsYixjKXt2YXIgcz1DLnhCLlhVKGEsIiUiLGIpCnJldHVybiBz
-Pj1iJiZzPGM/czpjfSwKT0EoYSxiLGMsZCl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaT1kIT09IiI/
-bmV3IFAuTShkKTpudWxsCmZvcihzPWIscj1zLHE9ITA7czxjOyl7cD1DLnhCLk8oYSxzKQppZihwPT09
-Mzcpe289UC5ydihhLHMsITApCm49bz09bnVsbAppZihuJiZxKXtzKz0zCmNvbnRpbnVlfWlmKGk9PW51
-bGwpaT1uZXcgUC5NKCIiKQptPWkuYSs9Qy54Qi5OaihhLHIscykKaWYobilvPUMueEIuTmooYSxzLHMr
-MykKZWxzZSBpZihvPT09IiUiKVAuUjMoYSxzLCJab25lSUQgc2hvdWxkIG5vdCBjb250YWluICUgYW55
-bW9yZSIpCmkuYT1tK28Kcys9MwpyPXMKcT0hMH1lbHNle2lmKHA8MTI3KXtuPXA+Pj40CmlmKG4+PTgp
-cmV0dXJuIEguT0goQy5GMyxuKQpuPShDLkYzW25dJjE8PChwJjE1KSkhPT0wfWVsc2Ugbj0hMQppZihu
-KXtpZihxJiY2NTw9cCYmOTA+PXApe2lmKGk9PW51bGwpaT1uZXcgUC5NKCIiKQppZihyPHMpe2kuYSs9
-Qy54Qi5OaihhLHIscykKcj1zfXE9ITF9KytzfWVsc2V7aWYoKHAmNjQ1MTIpPT09NTUyOTYmJnMrMTxj
-KXtsPUMueEIuTyhhLHMrMSkKaWYoKGwmNjQ1MTIpPT09NTYzMjApe3A9KHAmMTAyMyk8PDEwfGwmMTAy
-M3w2NTUzNgprPTJ9ZWxzZSBrPTF9ZWxzZSBrPTEKaj1DLnhCLk5qKGEscixzKQppZihpPT1udWxsKXtp
-PW5ldyBQLk0oIiIpCm49aX1lbHNlIG49aQpuLmErPWoKbi5hKz1QLnpYKHApCnMrPWsKcj1zfX19aWYo
-aT09bnVsbClyZXR1cm4gQy54Qi5OaihhLGIsYykKaWYocjxjKWkuYSs9Qy54Qi5OaihhLHIsYykKbj1p
-LmEKcmV0dXJuIG4uY2hhckNvZGVBdCgwKT09MD9uOm59LApPTChhLGIsYyl7dmFyIHMscixxLHAsbyxu
-LG0sbCxrLGosaQpmb3Iocz1iLHI9cyxxPW51bGwscD0hMDtzPGM7KXtvPUMueEIuTyhhLHMpCmlmKG89
-PT0zNyl7bj1QLnJ2KGEscywhMCkKbT1uPT1udWxsCmlmKG0mJnApe3MrPTMKY29udGludWV9aWYocT09
-bnVsbClxPW5ldyBQLk0oIiIpCmw9Qy54Qi5OaihhLHIscykKaz1xLmErPSFwP2wudG9Mb3dlckNhc2Uo
-KTpsCmlmKG0pe249Qy54Qi5OaihhLHMscyszKQpqPTN9ZWxzZSBpZihuPT09IiUiKXtuPSIlMjUiCmo9
-MX1lbHNlIGo9MwpxLmE9aytuCnMrPWoKcj1zCnA9ITB9ZWxzZXtpZihvPDEyNyl7bT1vPj4+NAppZiht
-Pj04KXJldHVybiBILk9IKEMuZWEsbSkKbT0oQy5lYVttXSYxPDwobyYxNSkpIT09MH1lbHNlIG09ITEK
-aWYobSl7aWYocCYmNjU8PW8mJjkwPj1vKXtpZihxPT1udWxsKXE9bmV3IFAuTSgiIikKaWYocjxzKXtx
-LmErPUMueEIuTmooYSxyLHMpCnI9c31wPSExfSsrc31lbHNle2lmKG88PTkzKXttPW8+Pj40CmlmKG0+
-PTgpcmV0dXJuIEguT0goQy5hayxtKQptPShDLmFrW21dJjE8PChvJjE1KSkhPT0wfWVsc2UgbT0hMQpp
-ZihtKVAuUjMoYSxzLCJJbnZhbGlkIGNoYXJhY3RlciIpCmVsc2V7aWYoKG8mNjQ1MTIpPT09NTUyOTYm
-JnMrMTxjKXtpPUMueEIuTyhhLHMrMSkKaWYoKGkmNjQ1MTIpPT09NTYzMjApe289KG8mMTAyMyk8PDEw
-fGkmMTAyM3w2NTUzNgpqPTJ9ZWxzZSBqPTF9ZWxzZSBqPTEKbD1DLnhCLk5qKGEscixzKQppZighcCls
-PWwudG9Mb3dlckNhc2UoKQppZihxPT1udWxsKXtxPW5ldyBQLk0oIiIpCm09cX1lbHNlIG09cQptLmEr
-PWwKbS5hKz1QLnpYKG8pCnMrPWoKcj1zfX19fWlmKHE9PW51bGwpcmV0dXJuIEMueEIuTmooYSxiLGMp
-CmlmKHI8Yyl7bD1DLnhCLk5qKGEscixjKQpxLmErPSFwP2wudG9Mb3dlckNhc2UoKTpsfW09cS5hCnJl
-dHVybiBtLmNoYXJDb2RlQXQoMCk9PTA/bTptfSwKUGkoYSxiLGMpe3ZhciBzLHIscSxwCmlmKGI9PT1j
-KXJldHVybiIiCmlmKCFQLkV0KEMueEIuVyhhLGIpKSlQLlIzKGEsYiwiU2NoZW1lIG5vdCBzdGFydGlu
-ZyB3aXRoIGFscGhhYmV0aWMgY2hhcmFjdGVyIikKZm9yKHM9YixyPSExO3M8YzsrK3Mpe3E9Qy54Qi5X
-KGEscykKaWYocTwxMjgpe3A9cT4+PjQKaWYocD49OClyZXR1cm4gSC5PSChDLm1LLHApCnA9KEMubUtb
-cF0mMTw8KHEmMTUpKSE9PTB9ZWxzZSBwPSExCmlmKCFwKVAuUjMoYSxzLCJJbGxlZ2FsIHNjaGVtZSBj
-aGFyYWN0ZXIiKQppZig2NTw9cSYmcTw9OTApcj0hMH1hPUMueEIuTmooYSxiLGMpCnJldHVybiBQLllh
-KHI/YS50b0xvd2VyQ2FzZSgpOmEpfSwKWWEoYSl7aWYoYT09PSJodHRwIilyZXR1cm4iaHR0cCIKaWYo
-YT09PSJmaWxlIilyZXR1cm4iZmlsZSIKaWYoYT09PSJodHRwcyIpcmV0dXJuImh0dHBzIgppZihhPT09
-InBhY2thZ2UiKXJldHVybiJwYWNrYWdlIgpyZXR1cm4gYX0sCnpSKGEsYixjKXtpZihhPT1udWxsKXJl
-dHVybiIiCnJldHVybiBQLlBJKGEsYixjLEMudG8sITEpfSwKa2EoYSxiLGMsZCxlLGYpe3ZhciBzLHIs
-cT1lPT09ImZpbGUiLHA9cXx8ZgppZihhPT1udWxsKXtpZihkPT1udWxsKXJldHVybiBxPyIvIjoiIgpz
-PUgudDYoZCkKcj1uZXcgSC5sSihkLHMuQygicVUoMSkiKS5hKG5ldyBQLlJaKCkpLHMuQygibEo8MSxx
-VT4iKSkuaygwLCIvIil9ZWxzZSBpZihkIT1udWxsKXRocm93IEguYihQLnhZKCJCb3RoIHBhdGggYW5k
-IHBhdGhTZWdtZW50cyBzcGVjaWZpZWQiLG51bGwpKQplbHNlIHI9UC5QSShhLGIsYyxDLldkLCEwKQpp
-ZihyLmxlbmd0aD09PTApe2lmKHEpcmV0dXJuIi8ifWVsc2UgaWYocCYmIUMueEIubihyLCIvIikpcj0i
-LyIrcgpyZXR1cm4gUC5KcihyLGUsZil9LApKcihhLGIsYyl7dmFyIHM9Yi5sZW5ndGg9PT0wCmlmKHMm
-JiFjJiYhQy54Qi5uKGEsIi8iKSlyZXR1cm4gUC53RihhLCFzfHxjKQpyZXR1cm4gUC54ZShhKX0sCmxl
-KGEsYixjLGQpe3ZhciBzLHI9e30KaWYoYSE9bnVsbCl7aWYoZCE9bnVsbCl0aHJvdyBILmIoUC54WSgi
-Qm90aCBxdWVyeSBhbmQgcXVlcnlQYXJhbWV0ZXJzIHNwZWNpZmllZCIsbnVsbCkpCnJldHVybiBQLlBJ
-KGEsYixjLEMuVkMsITApfWlmKGQ9PW51bGwpcmV0dXJuIG51bGwKcz1uZXcgUC5NKCIiKQpyLmE9IiIK
-ZC5LKDAsbmV3IFAueTUobmV3IFAuTUUocixzKSkpCnI9cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9
-PTA/cjpyfSwKdEcoYSxiLGMpe2lmKGE9PW51bGwpcmV0dXJuIG51bGwKcmV0dXJuIFAuUEkoYSxiLGMs
-Qy5WQywhMCl9LApydihhLGIsYyl7dmFyIHMscixxLHAsbyxuPWIrMgppZihuPj1hLmxlbmd0aClyZXR1
-cm4iJSIKcz1DLnhCLk8oYSxiKzEpCnI9Qy54Qi5PKGEsbikKcT1ILm9vKHMpCnA9SC5vbyhyKQppZihx
-PDB8fHA8MClyZXR1cm4iJSIKbz1xKjE2K3AKaWYobzwxMjcpe249Qy5qbi53RyhvLDQpCmlmKG4+PTgp
-cmV0dXJuIEguT0goQy5GMyxuKQpuPShDLkYzW25dJjE8PChvJjE1KSkhPT0wfWVsc2Ugbj0hMQppZihu
-KXJldHVybiBILkx3KGMmJjY1PD1vJiY5MD49bz8ob3wzMik+Pj4wOm8pCmlmKHM+PTk3fHxyPj05Nyly
-ZXR1cm4gQy54Qi5OaihhLGIsYiszKS50b1VwcGVyQ2FzZSgpCnJldHVybiBudWxsfSwKelgoYSl7dmFy
-IHMscixxLHAsbyxuLG0sbCxrPSIwMTIzNDU2Nzg5QUJDREVGIgppZihhPDEyOCl7cz1uZXcgVWludDhB
-cnJheSgzKQpzWzBdPTM3CnNbMV09Qy54Qi5XKGssYT4+PjQpCnNbMl09Qy54Qi5XKGssYSYxNSl9ZWxz
-ZXtpZihhPjIwNDcpaWYoYT42NTUzNSl7cj0yNDAKcT00fWVsc2V7cj0yMjQKcT0zfWVsc2V7cj0xOTIK
-cT0yfXA9MypxCnM9bmV3IFVpbnQ4QXJyYXkocCkKZm9yKG89MDstLXEscT49MDtyPTEyOCl7bj1DLmpu
-LmJmKGEsNipxKSY2M3xyCmlmKG8+PXApcmV0dXJuIEguT0gocyxvKQpzW29dPTM3Cm09bysxCmw9Qy54
-Qi5XKGssbj4+PjQpCmlmKG0+PXApcmV0dXJuIEguT0gocyxtKQpzW21dPWwKbD1vKzIKbT1DLnhCLlco
-ayxuJjE1KQppZihsPj1wKXJldHVybiBILk9IKHMsbCkKc1tsXT1tCm8rPTN9fXJldHVybiBQLkhNKHMs
-MCxudWxsKX0sClBJKGEsYixjLGQsZSl7dmFyIHM9UC5VbChhLGIsYyxkLGUpCnJldHVybiBzPT1udWxs
-P0MueEIuTmooYSxiLGMpOnN9LApVbChhLGIsYyxkLGUpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqPW51
-bGwKZm9yKHM9IWUscj1iLHE9cixwPWo7cjxjOyl7bz1DLnhCLk8oYSxyKQppZihvPDEyNyl7bj1vPj4+
-NAppZihuPj04KXJldHVybiBILk9IKGQsbikKbj0oZFtuXSYxPDwobyYxNSkpIT09MH1lbHNlIG49ITEK
-aWYobikrK3IKZWxzZXtpZihvPT09Mzcpe209UC5ydihhLHIsITEpCmlmKG09PW51bGwpe3IrPTMKY29u
-dGludWV9aWYoIiUiPT09bSl7bT0iJTI1IgpsPTF9ZWxzZSBsPTN9ZWxzZXtpZihzKWlmKG88PTkzKXtu
-PW8+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goQy5hayxuKQpuPShDLmFrW25dJjE8PChvJjE1KSkhPT0w
-fWVsc2Ugbj0hMQplbHNlIG49ITEKaWYobil7UC5SMyhhLHIsIkludmFsaWQgY2hhcmFjdGVyIikKbD1q
-Cm09bH1lbHNle2lmKChvJjY0NTEyKT09PTU1Mjk2KXtuPXIrMQppZihuPGMpe2s9Qy54Qi5PKGEsbikK
-aWYoKGsmNjQ1MTIpPT09NTYzMjApe289KG8mMTAyMyk8PDEwfGsmMTAyM3w2NTUzNgpsPTJ9ZWxzZSBs
-PTF9ZWxzZSBsPTF9ZWxzZSBsPTEKbT1QLnpYKG8pfX1pZihwPT1udWxsKXtwPW5ldyBQLk0oIiIpCm49
-cH1lbHNlIG49cApuLmErPUMueEIuTmooYSxxLHIpCm4uYSs9SC5FaihtKQppZih0eXBlb2YgbCE9PSJu
-dW1iZXIiKXJldHVybiBILnBZKGwpCnIrPWwKcT1yfX1pZihwPT1udWxsKXJldHVybiBqCmlmKHE8Yylw
-LmErPUMueEIuTmooYSxxLGMpCnM9cC5hCnJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKeUIo
-YSl7aWYoQy54Qi5uKGEsIi4iKSlyZXR1cm4hMApyZXR1cm4gQy54Qi5PWShhLCIvLiIpIT09LTF9LAp4
-ZShhKXt2YXIgcyxyLHEscCxvLG4sbQppZighUC55QihhKSlyZXR1cm4gYQpzPUguUUkoW10sdC5zKQpm
-b3Iocj1hLnNwbGl0KCIvIikscT1yLmxlbmd0aCxwPSExLG89MDtvPHE7KytvKXtuPXJbb10KaWYoSi5S
-TShuLCIuLiIpKXttPXMubGVuZ3RoCmlmKG0hPT0wKXtpZigwPj1tKXJldHVybiBILk9IKHMsLTEpCnMu
-cG9wKCkKaWYocy5sZW5ndGg9PT0wKUMuTm0uaShzLCIiKX1wPSEwfWVsc2UgaWYoIi4iPT09bilwPSEw
-CmVsc2V7Qy5ObS5pKHMsbikKcD0hMX19aWYocClDLk5tLmkocywiIikKcmV0dXJuIEMuTm0uayhzLCIv
-Iil9LAp3RihhLGIpe3ZhciBzLHIscSxwLG8sbgppZighUC55QihhKSlyZXR1cm4hYj9QLkMxKGEpOmEK
-cz1ILlFJKFtdLHQucykKZm9yKHI9YS5zcGxpdCgiLyIpLHE9ci5sZW5ndGgscD0hMSxvPTA7bzxxOysr
-byl7bj1yW29dCmlmKCIuLiI9PT1uKWlmKHMubGVuZ3RoIT09MCYmQy5ObS5ncloocykhPT0iLi4iKXtp
-ZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnA9ITB9ZWxzZXtDLk5tLmkocywi
-Li4iKQpwPSExfWVsc2UgaWYoIi4iPT09bilwPSEwCmVsc2V7Qy5ObS5pKHMsbikKcD0hMX19cj1zLmxl
-bmd0aAppZihyIT09MClpZihyPT09MSl7aWYoMD49cilyZXR1cm4gSC5PSChzLDApCnI9c1swXS5sZW5n
-dGg9PT0wfWVsc2Ugcj0hMQplbHNlIHI9ITAKaWYocilyZXR1cm4iLi8iCmlmKHB8fEMuTm0uZ3JaKHMp
-PT09Ii4uIilDLk5tLmkocywiIikKaWYoIWIpe2lmKDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsMCkK
-Qy5ObS5ZNShzLDAsUC5DMShzWzBdKSl9cmV0dXJuIEMuTm0uayhzLCIvIil9LApDMShhKXt2YXIgcyxy
-LHEscD1hLmxlbmd0aAppZihwPj0yJiZQLkV0KEMueEIuVyhhLDApKSlmb3Iocz0xO3M8cDsrK3Mpe3I9
-Qy54Qi5XKGEscykKaWYocj09PTU4KXJldHVybiBDLnhCLk5qKGEsMCxzKSsiJTNBIitDLnhCLnluKGEs
-cysxKQppZihyPD0xMjcpe3E9cj4+PjQKaWYocT49OClyZXR1cm4gSC5PSChDLm1LLHEpCnE9KEMubUtb
-cV0mMTw8KHImMTUpKT09PTB9ZWxzZSBxPSEwCmlmKHEpYnJlYWt9cmV0dXJuIGF9LAp1aihhLGIpe2lm
-KGEuaEIoInBhY2thZ2UiKSYmYS5jPT1udWxsKXJldHVybiBQLmZGKGIsMCxiLmxlbmd0aCkKcmV0dXJu
-LTF9LAptbihhKXt2YXIgcyxyLHEscD1hLmdGaigpLG89cC5sZW5ndGgKaWYobz4wJiZKLkhtKHBbMF0p
-PT09MiYmSi5hNihwWzBdLDEpPT09NTgpe2lmKDA+PW8pcmV0dXJuIEguT0gocCwwKQpQLnJnKEouYTYo
-cFswXSwwKSwhMSkKUC5ITihwLCExLDEpCnM9ITB9ZWxzZXtQLkhOKHAsITEsMCkKcz0hMX1yPWEuZ3RU
-KCkmJiFzPyIiKyJcXCI6IiIKaWYoYS5nY2ooKSl7cT1hLmdKZihhKQppZihxLmxlbmd0aCE9PTApcj1y
-KyJcXCIrcSsiXFwifXI9UC5sKHIscCwiXFwiKQpvPXMmJm89PT0xP3IrIlxcIjpyCnJldHVybiBvLmNo
-YXJDb2RlQXQoMCk9PTA/bzpvfSwKSWgoYSxiKXt2YXIgcyxyLHEKZm9yKHM9MCxyPTA7cjwyOysrcil7
-cT1DLnhCLlcoYSxiK3IpCmlmKDQ4PD1xJiZxPD01NylzPXMqMTYrcS00OAplbHNle3F8PTMyCmlmKDk3
-PD1xJiZxPD0xMDIpcz1zKjE2K3EtODcKZWxzZSB0aHJvdyBILmIoUC54WSgiSW52YWxpZCBVUkwgZW5j
-b2RpbmciLG51bGwpKX19cmV0dXJuIHN9LAprdShhLGIsYyxkLGUpe3ZhciBzLHIscSxwLG89Ygp3aGls
-ZSghMCl7aWYoIShvPGMpKXtzPSEwCmJyZWFrfXI9Qy54Qi5XKGEsbykKaWYocjw9MTI3KWlmKHIhPT0z
-NylxPWUmJnI9PT00MwplbHNlIHE9ITAKZWxzZSBxPSEwCmlmKHEpe3M9ITEKYnJlYWt9KytvfWlmKHMp
-e2lmKEMueE0hPT1kKXE9ITEKZWxzZSBxPSEwCmlmKHEpcmV0dXJuIEMueEIuTmooYSxiLGMpCmVsc2Ug
-cD1uZXcgSC5xaihDLnhCLk5qKGEsYixjKSl9ZWxzZXtwPUguUUkoW10sdC50KQpmb3IocT1hLmxlbmd0
-aCxvPWI7bzxjOysrbyl7cj1DLnhCLlcoYSxvKQppZihyPjEyNyl0aHJvdyBILmIoUC54WSgiSWxsZWdh
-bCBwZXJjZW50IGVuY29kaW5nIGluIFVSSSIsbnVsbCkpCmlmKHI9PT0zNyl7aWYobyszPnEpdGhyb3cg
-SC5iKFAueFkoIlRydW5jYXRlZCBVUkkiLG51bGwpKQpDLk5tLmkocCxQLkloKGEsbysxKSkKbys9Mn1l
-bHNlIGlmKGUmJnI9PT00MylDLk5tLmkocCwzMikKZWxzZSBDLk5tLmkocCxyKX19dC5MLmEocCkKcmV0
-dXJuIEMub0UuV0oocCl9LApFdChhKXt2YXIgcz1hfDMyCnJldHVybiA5Nzw9cyYmczw9MTIyfSwKS0Qo
-YSxiLGMpe3ZhciBzLHIscSxwLG8sbixtLGwsaz0iSW52YWxpZCBNSU1FIHR5cGUiLGo9SC5RSShbYi0x
-XSx0LnQpCmZvcihzPWEubGVuZ3RoLHI9YixxPS0xLHA9bnVsbDtyPHM7KytyKXtwPUMueEIuVyhhLHIp
-CmlmKHA9PT00NHx8cD09PTU5KWJyZWFrCmlmKHA9PT00Nyl7aWYocTwwKXtxPXIKY29udGludWV9dGhy
-b3cgSC5iKFAucnIoayxhLHIpKX19aWYocTwwJiZyPmIpdGhyb3cgSC5iKFAucnIoayxhLHIpKQpmb3Io
-O3AhPT00NDspe0MuTm0uaShqLHIpOysrcgpmb3Iobz0tMTtyPHM7KytyKXtwPUMueEIuVyhhLHIpCmlm
-KHA9PT02MSl7aWYobzwwKW89cn1lbHNlIGlmKHA9PT01OXx8cD09PTQ0KWJyZWFrfWlmKG8+PTApQy5O
-bS5pKGosbykKZWxzZXtuPUMuTm0uZ3JaKGopCmlmKHAhPT00NHx8ciE9PW4rN3x8IUMueEIuUWkoYSwi
-YmFzZTY0IixuKzEpKXRocm93IEguYihQLnJyKCJFeHBlY3RpbmcgJz0nIixhLHIpKQpicmVha319Qy5O
-bS5pKGoscikKbT1yKzEKaWYoKGoubGVuZ3RoJjEpPT09MSlhPUMuaDkueXIoYSxtLHMpCmVsc2V7bD1Q
-LlVsKGEsbSxzLEMuVkMsITApCmlmKGwhPW51bGwpYT1DLnhCLmk3KGEsbSxzLGwpfXJldHVybiBuZXcg
-UC5QRShhLGosYyl9LApLTigpe3ZhciBzLHIscSxwLG8sbixtPSIwMTIzNDU2Nzg5QUJDREVGR0hJSktM
-TU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei0uX34hJCYnKCkqKyw7PSIsbD0i
-LiIsaz0iOiIsaj0iLyIsaT0iPyIsaD0iIyIsZz1ILlFJKG5ldyBBcnJheSgyMiksdC5nTikKZm9yKHM9
-MDtzPDIyOysrcylnW3NdPW5ldyBVaW50OEFycmF5KDk2KQpyPW5ldyBQLnlJKGcpCnE9bmV3IFAuYzYo
-KQpwPW5ldyBQLnFkKCkKbz10LmdjCm49by5hKHIuJDIoMCwyMjUpKQpxLiQzKG4sbSwxKQpxLiQzKG4s
-bCwxNCkKcS4kMyhuLGssMzQpCnEuJDMobixqLDMpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpu
-PW8uYShyLiQyKDE0LDIyNSkpCnEuJDMobixtLDEpCnEuJDMobixsLDE1KQpxLiQzKG4saywzNCkKcS4k
-MyhuLGosMjM0KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxNSwyMjUpKQpx
-LiQzKG4sbSwxKQpxLiQzKG4sIiUiLDIyNSkKcS4kMyhuLGssMzQpCnEuJDMobixqLDkpCnEuJDMobixp
-LDE3MikKcS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDEsMjI1KSkKcS4kMyhuLG0sMSkKcS4kMyhuLGss
-MzQpCnEuJDMobixqLDEwKQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigyLDIz
-NSkpCnEuJDMobixtLDEzOSkKcS4kMyhuLGosMTMxKQpxLiQzKG4sbCwxNDYpCnEuJDMobixpLDE3MikK
-cS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDMsMjM1KSkKcS4kMyhuLG0sMTEpCnEuJDMobixqLDY4KQpx
-LiQzKG4sbCwxOCkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoNCwyMjkpKQpx
-LiQzKG4sbSw1KQpwLiQzKG4sIkFaIiwyMjkpCnEuJDMobixrLDEwMikKcS4kMyhuLCJAIiw2OCkKcS4k
-MyhuLCJbIiwyMzIpCnEuJDMobixqLDEzOCkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5h
-KHIuJDIoNSwyMjkpKQpxLiQzKG4sbSw1KQpwLiQzKG4sIkFaIiwyMjkpCnEuJDMobixrLDEwMikKcS4k
-MyhuLCJAIiw2OCkKcS4kMyhuLGosMTM4KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEo
-ci4kMig2LDIzMSkpCnAuJDMobiwiMTkiLDcpCnEuJDMobiwiQCIsNjgpCnEuJDMobixqLDEzOCkKcS4k
-MyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoNywyMzEpKQpwLiQzKG4sIjA5Iiw3KQpx
-LiQzKG4sIkAiLDY4KQpxLiQzKG4saiwxMzgpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpxLiQz
-KG8uYShyLiQyKDgsOCkpLCJdIiw1KQpuPW8uYShyLiQyKDksMjM1KSkKcS4kMyhuLG0sMTEpCnEuJDMo
-bixsLDE2KQpxLiQzKG4saiwyMzQpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpuPW8uYShyLiQy
-KDE2LDIzNSkpCnEuJDMobixtLDExKQpxLiQzKG4sbCwxNykKcS4kMyhuLGosMjM0KQpxLiQzKG4saSwx
-NzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxNywyMzUpKQpxLiQzKG4sbSwxMSkKcS4kMyhuLGos
-OSkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoMTAsMjM1KSkKcS4kMyhuLG0s
-MTEpCnEuJDMobixsLDE4KQpxLiQzKG4saiwyMzQpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpu
-PW8uYShyLiQyKDE4LDIzNSkpCnEuJDMobixtLDExKQpxLiQzKG4sbCwxOSkKcS4kMyhuLGosMjM0KQpx
-LiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxOSwyMzUpKQpxLiQzKG4sbSwxMSkK
-cS4kMyhuLGosMjM0KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxMSwyMzUp
-KQpxLiQzKG4sbSwxMSkKcS4kMyhuLGosMTApCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpuPW8u
-YShyLiQyKDEyLDIzNikpCnEuJDMobixtLDEyKQpxLiQzKG4saSwxMikKcS4kMyhuLGgsMjA1KQpuPW8u
-YShyLiQyKDEzLDIzNykpCnEuJDMobixtLDEzKQpxLiQzKG4saSwxMykKcC4kMyhvLmEoci4kMigyMCwy
-NDUpKSwiYXoiLDIxKQpyPW8uYShyLiQyKDIxLDI0NSkpCnAuJDMociwiYXoiLDIxKQpwLiQzKHIsIjA5
-IiwyMSkKcS4kMyhyLCIrLS4iLDIxKQpyZXR1cm4gZ30sClVCKGEsYixjLGQsZSl7dmFyIHMscixxLHAs
-bz0kLnZaKCkKZm9yKHM9YjtzPGM7KytzKXtpZihkPDB8fGQ+PW8ubGVuZ3RoKXJldHVybiBILk9IKG8s
-ZCkKcj1vW2RdCnE9Qy54Qi5XKGEscyleOTYKcD1yW3E+OTU/MzE6cV0KZD1wJjMxCkMuTm0uWTUoZSxw
-Pj4+NSxzKX1yZXR1cm4gZH0sClJ4KGEpe2lmKGEuYj09PTcmJkMueEIubihhLmEsInBhY2thZ2UiKSYm
-YS5jPD0wKXJldHVybiBQLmZGKGEuYSxhLmUsYS5mKQpyZXR1cm4tMX0sCmZGKGEsYixjKXt2YXIgcyxy
-LHEKZm9yKHM9YixyPTA7czxjOysrcyl7cT1DLnhCLk8oYSxzKQppZihxPT09NDcpcmV0dXJuIHIhPT0w
-P3M6LTEKaWYocT09PTM3fHxxPT09NTgpcmV0dXJuLTEKcnw9cV40Nn1yZXR1cm4tMX0sCldGOmZ1bmN0
-aW9uIFdGKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAppUDpmdW5jdGlvbiBpUChhLGIpe3RoaXMuYT1h
-CnRoaXMuYj1ifSwKWFM6ZnVuY3Rpb24gWFMoKXt9LApDNjpmdW5jdGlvbiBDNihhKXt0aGlzLmE9YX0s
-CkV6OmZ1bmN0aW9uIEV6KCl7fSwKRjpmdW5jdGlvbiBGKCl7fSwKQVQ6ZnVuY3Rpb24gQVQoYSxiLGMs
-ZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZH0sCmJKOmZ1bmN0aW9uIGJKKGEsYixj
-LGQsZSxmKXt2YXIgXz10aGlzCl8uZT1hCl8uZj1iCl8uYT1jCl8uYj1kCl8uYz1lCl8uZD1mfSwKZVk6
-ZnVuY3Rpb24gZVkoYSxiLGMsZCxlKXt2YXIgXz10aGlzCl8uZj1hCl8uYT1iCl8uYj1jCl8uYz1kCl8u
-ZD1lfSwKbXA6ZnVuY3Rpb24gbXAoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9Ywpf
-LmQ9ZH0sCnViOmZ1bmN0aW9uIHViKGEpe3RoaXMuYT1hfSwKZHM6ZnVuY3Rpb24gZHMoYSl7dGhpcy5h
-PWF9LApsajpmdW5jdGlvbiBsaihhKXt0aGlzLmE9YX0sClVWOmZ1bmN0aW9uIFVWKGEpe3RoaXMuYT1h
-fSwKazU6ZnVuY3Rpb24gazUoKXt9LApLWTpmdW5jdGlvbiBLWSgpe30sCnA6ZnVuY3Rpb24gcChhKXt0
-aGlzLmE9YX0sCkNEOmZ1bmN0aW9uIENEKGEpe3RoaXMuYT1hfSwKYUU6ZnVuY3Rpb24gYUUoYSxiLGMp
-e3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKY1g6ZnVuY3Rpb24gY1goKXt9LApBbjpmdW5jdGlv
-biBBbigpe30sCk4zOmZ1bmN0aW9uIE4zKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLiR0aT1j
-fSwKYzg6ZnVuY3Rpb24gYzgoKXt9LApNaDpmdW5jdGlvbiBNaCgpe30sClpkOmZ1bmN0aW9uIFpkKCl7
-fSwKTTpmdW5jdGlvbiBNKGEpe3RoaXMuYT1hfSwKbjE6ZnVuY3Rpb24gbjEoYSl7dGhpcy5hPWF9LApj
-UzpmdW5jdGlvbiBjUyhhKXt0aGlzLmE9YX0sClZDOmZ1bmN0aW9uIFZDKGEpe3RoaXMuYT1hfSwKSlQ6
-ZnVuY3Rpb24gSlQoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkRuOmZ1bmN0aW9uIERuKGEsYixjLGQs
-ZSxmLGcpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcK
-Xy5RPV8uej1fLnk9Xy54PW51bGx9LApSWjpmdW5jdGlvbiBSWigpe30sCk1FOmZ1bmN0aW9uIE1FKGEs
-Yil7dGhpcy5hPWEKdGhpcy5iPWJ9LAp5NTpmdW5jdGlvbiB5NShhKXt0aGlzLmE9YX0sClBFOmZ1bmN0
-aW9uIFBFKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCnlJOmZ1bmN0aW9uIHlJKGEp
-e3RoaXMuYT1hfSwKYzY6ZnVuY3Rpb24gYzYoKXt9LApxZDpmdW5jdGlvbiBxZCgpe30sClVmOmZ1bmN0
-aW9uIFVmKGEsYixjLGQsZSxmLGcsaCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZApf
-LmU9ZQpfLmY9ZgpfLnI9ZwpfLng9aApfLnk9bnVsbH0sCnFlOmZ1bmN0aW9uIHFlKGEsYixjLGQsZSxm
-LGcpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcKXy5R
-PV8uej1fLnk9Xy54PW51bGx9LAppSjpmdW5jdGlvbiBpSigpe30sCkUyOmZ1bmN0aW9uIEUyKGEsYil7
-dGhpcy5hPWEKdGhpcy5iPWJ9LApqZzpmdW5jdGlvbiBqZyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwK
-QmY6ZnVuY3Rpb24gQmYoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkFzOmZ1bmN0aW9uIEFzKCl7fSwK
-R0U6ZnVuY3Rpb24gR0UoYSl7dGhpcy5hPWF9LApONzpmdW5jdGlvbiBONyhhLGIpe3RoaXMuYT1hCnRo
-aXMuYj1ifSwKdVE6ZnVuY3Rpb24gdVEoKXt9LApoRjpmdW5jdGlvbiBoRigpe30sClI0KGEsYixjLGQp
-e3ZhciBzLHIscQpILnA4KGIpCnQuai5hKGQpCmlmKGIpe3M9W2NdCkMuTm0uRlYocyxkKQpkPXN9cj10
-LnoKcT1QLlBXKEouTTEoZCxQLncwKCksciksITAscikKdC5ZLmEoYSkKcmV0dXJuIFAud1koSC5Fayhh
-LHEsbnVsbCkpfSwKRG0oYSxiLGMpe3ZhciBzCnRyeXtpZihPYmplY3QuaXNFeHRlbnNpYmxlKGEpJiYh
-T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYikpe09iamVjdC5kZWZpbmVQcm9w
-ZXJ0eShhLGIse3ZhbHVlOmN9KQpyZXR1cm4hMH19Y2F0Y2gocyl7SC5SdShzKX1yZXR1cm4hMX0sCk9t
-KGEsYil7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYikpcmV0dXJuIGFb
-Yl0KcmV0dXJuIG51bGx9LAp3WShhKXtpZihhPT1udWxsfHx0eXBlb2YgYT09InN0cmluZyJ8fHR5cGVv
-ZiBhPT0ibnVtYmVyInx8SC5yUShhKSlyZXR1cm4gYQppZihhIGluc3RhbmNlb2YgUC5FNClyZXR1cm4g
-YS5hCmlmKEguUjkoYSkpcmV0dXJuIGEKaWYodC5hay5iKGEpKXJldHVybiBhCmlmKGEgaW5zdGFuY2Vv
-ZiBQLmlQKXJldHVybiBILm8yKGEpCmlmKHQuWS5iKGEpKXJldHVybiBQLmhFKGEsIiRkYXJ0X2pzRnVu
-Y3Rpb24iLG5ldyBQLkRWKCkpCnJldHVybiBQLmhFKGEsIl8kZGFydF9qc09iamVjdCIsbmV3IFAuUEMo
-JC5rSSgpKSl9LApoRShhLGIsYyl7dmFyIHM9UC5PbShhLGIpCmlmKHM9PW51bGwpe3M9Yy4kMShhKQpQ
-LkRtKGEsYixzKX1yZXR1cm4gc30sCmRVKGEpe3ZhciBzLHIKaWYoYT09bnVsbHx8dHlwZW9mIGE9PSJz
-dHJpbmcifHx0eXBlb2YgYT09Im51bWJlciJ8fHR5cGVvZiBhPT0iYm9vbGVhbiIpcmV0dXJuIGEKZWxz
-ZSBpZihhIGluc3RhbmNlb2YgT2JqZWN0JiZILlI5KGEpKXJldHVybiBhCmVsc2UgaWYoYSBpbnN0YW5j
-ZW9mIE9iamVjdCYmdC5hay5iKGEpKXJldHVybiBhCmVsc2UgaWYoYSBpbnN0YW5jZW9mIERhdGUpe3M9
-SC5JWihhLmdldFRpbWUoKSkKaWYoTWF0aC5hYnMocyk8PTg2NGUxMylyPSExCmVsc2Ugcj0hMAppZihy
-KUgudihQLnhZKCJEYXRlVGltZSBpcyBvdXRzaWRlIHZhbGlkIHJhbmdlOiAiK3MsbnVsbCkpCkguY2Io
-ITEsImlzVXRjIix0LnkpCnJldHVybiBuZXcgUC5pUChzLCExKX1lbHNlIGlmKGEuY29uc3RydWN0b3I9
-PT0kLmtJKCkpcmV0dXJuIGEubwplbHNlIHJldHVybiBQLk5EKGEpfSwKTkQoYSl7aWYodHlwZW9mIGE9
-PSJmdW5jdGlvbiIpcmV0dXJuIFAuaVEoYSwkLnooKSxuZXcgUC5RUygpKQppZihhIGluc3RhbmNlb2Yg
-QXJyYXkpcmV0dXJuIFAuaVEoYSwkLlI4KCksbmV3IFAubnAoKSkKcmV0dXJuIFAuaVEoYSwkLlI4KCks
-bmV3IFAuVXQoKSl9LAppUShhLGIsYyl7dmFyIHM9UC5PbShhLGIpCmlmKHM9PW51bGx8fCEoYSBpbnN0
-YW5jZW9mIE9iamVjdCkpe3M9Yy4kMShhKQpQLkRtKGEsYixzKX1yZXR1cm4gc30sCkRWOmZ1bmN0aW9u
-IERWKCl7fSwKUEM6ZnVuY3Rpb24gUEMoYSl7dGhpcy5hPWF9LApRUzpmdW5jdGlvbiBRUygpe30sCm5w
-OmZ1bmN0aW9uIG5wKCl7fSwKVXQ6ZnVuY3Rpb24gVXQoKXt9LApFNDpmdW5jdGlvbiBFNChhKXt0aGlz
-LmE9YX0sCnI3OmZ1bmN0aW9uIHI3KGEpe3RoaXMuYT1hfSwKVHo6ZnVuY3Rpb24gVHooYSxiKXt0aGlz
-LmE9YQp0aGlzLiR0aT1ifSwKdmc6ZnVuY3Rpb24gdmcoKXt9LApuZDpmdW5jdGlvbiBuZCgpe30sCktl
-OmZ1bmN0aW9uIEtlKGEpe3RoaXMuYT1hfSwKaGk6ZnVuY3Rpb24gaGkoKXt9fSxSPXsKbnooYSl7dmFy
-IHM9SC5VYyhhLnEoMCwibm9kZUlkIikpCnJldHVybiBuZXcgUi5MTChDLk5tLkh0KEMucmssbmV3IFIu
-TUQoYSkpLHMpfSwKT1goYSl7c3dpdGNoKGEpe2Nhc2UgQy5BZDpyZXR1cm4iQWRkIC8qPyovIGhpbnQi
-CmNhc2UgQy5uZTpyZXR1cm4iQWRkIC8qISovIGhpbnQiCmNhc2UgQy53VjpyZXR1cm4iUmVtb3ZlIC8q
-PyovIGhpbnQiCmNhc2UgQy5mUjpyZXR1cm4iUmVtb3ZlIC8qISovIGhpbnQiCmNhc2UgQy5teTpyZXR1
-cm4iQ2hhbmdlIHRvIC8qPyovIGhpbnQiCmNhc2UgQy5yeDpyZXR1cm4iQ2hhbmdlIHRvIC8qISovIGhp
-bnQifX0sCkxMOmZ1bmN0aW9uIExMKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApNRDpmdW5jdGlvbiBN
-RChhKXt0aGlzLmE9YX0sCkg3OmZ1bmN0aW9uIEg3KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9fSxUPXtt
-UTpmdW5jdGlvbiBtUSgpe319LFU9ewpqZihhKXt2YXIgcyxyLHEscAppZihhPT1udWxsKXM9bnVsbApl
-bHNle3M9SC5RSShbXSx0LmZBKQpmb3Iocj1KLklUKHQuUi5hKGEpKTtyLkYoKTspe3E9ci5nbCgpCnA9
-Si5VNihxKQpzLnB1c2gobmV3IFUuU2UoSC5rKHAucShxLCJkZXNjcmlwdGlvbiIpKSxILmsocC5xKHEs
-ImhyZWYiKSkpKX19cmV0dXJuIHN9LApOZChhKXt2YXIgcyxyCmlmKGE9PW51bGwpcz1udWxsCmVsc2V7
-cz1ILlFJKFtdLHQuaGgpCmZvcihyPUouSVQodC5SLmEoYSkpO3IuRigpOylzLnB1c2goVS5OZihyLmds
-KCkpKX1yZXR1cm4gc30sCk5mKGEpe3ZhciBzPUouVTYoYSkscj1ILmsocy5xKGEsImRlc2NyaXB0aW9u
-IikpLHE9SC5RSShbXSx0LmFKKQpmb3Iocz1KLklUKHQuUi5hKHMucShhLCJlbnRyaWVzIikpKTtzLkYo
-KTspcS5wdXNoKFUuUmoocy5nbCgpKSkKcmV0dXJuIG5ldyBVLnlEKHIscSl9LApSaihhKXt2YXIgcyxy
-PUouVTYoYSkscT1ILmsoci5xKGEsImRlc2NyaXB0aW9uIikpLHA9SC5rKHIucShhLCJmdW5jdGlvbiIp
-KSxvPXIucShhLCJsaW5rIikKaWYobz09bnVsbClvPW51bGwKZWxzZXtzPUouVTYobykKbz1uZXcgVS5N
-bChILmsocy5xKG8sImhyZWYiKSksSC5VYyhzLnEobywibGluZSIpKSxILmsocy5xKG8sInBhdGgiKSkp
-fXI9dC5iTS5hKHIucShhLCJoaW50QWN0aW9ucyIpKQpyPXI9PW51bGw/bnVsbDpKLk0xKHIsbmV3IFUu
-YU4oKSx0LkopLmJyKDApCnJldHVybiBuZXcgVS53YihxLHAsbyxyPT1udWxsP0MuZG46cil9LApkMjpm
-dW5jdGlvbiBkMihhLGIsYyxkLGUsZil7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZApf
-LmU9ZQpfLmY9Zn0sClNlOmZ1bmN0aW9uIFNlKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApNbDpmdW5j
-dGlvbiBNbChhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LAp5RDpmdW5jdGlvbiB5RChh
-LGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKd2I6ZnVuY3Rpb24gd2IoYSxiLGMsZCl7dmFyIF89dGhpcwpf
-LmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZH0sCmFOOmZ1bmN0aW9uIGFOKCl7fSwKYjA6ZnVuY3Rpb24gYjAo
-KXt9fSxXPXsKeDMoKXtyZXR1cm4gd2luZG93fSwKWnIoKXtyZXR1cm4gZG9jdW1lbnR9LApKNihhKXt2
-YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikKaWYoYSE9bnVsbClDLnhuLnNMVShzLGEpCnJl
-dHVybiBzfSwKTGooYSl7cmV0dXJuIENTUy5lc2NhcGUoYSl9LApVOShhLGIsYyl7dmFyIHMscj1kb2N1
-bWVudC5ib2R5CnIudG9TdHJpbmcKcz10LmFjCnM9bmV3IEguVTUobmV3IFcuZTcoQy5SWS5yNihyLGEs
-YixjKSkscy5DKCJhMihsRC5FKSIpLmEobmV3IFcuQ3YoKSkscy5DKCJVNTxsRC5FPiIpKQpyZXR1cm4g
-dC5oLmEocy5ncjgocykpfSwKclMoYSl7dmFyIHMscixxPSJlbGVtZW50IHRhZyB1bmF2YWlsYWJsZSIK
-dHJ5e3M9Si5ZRShhKQpzLmducyhhKQpxPXMuZ25zKGEpfWNhdGNoKHIpe0guUnUocil9cmV0dXJuIHF9
-LApDMChhLGIpe2E9YStiJjUzNjg3MDkxMQphPWErKChhJjUyNDI4Nyk8PDEwKSY1MzY4NzA5MTEKcmV0
-dXJuIGFeYT4+PjZ9LApyRShhLGIsYyxkKXt2YXIgcz1XLkMwKFcuQzAoVy5DMChXLkMwKDAsYSksYiks
-YyksZCkscj1zKygocyY2NzEwODg2Myk8PDMpJjUzNjg3MDkxMQpyXj1yPj4+MTEKcmV0dXJuIHIrKChy
-JjE2MzgzKTw8MTUpJjUzNjg3MDkxMX0sClROKGEsYil7dmFyIHMscixxPWEuY2xhc3NMaXN0CmZvcihz
-PWIubGVuZ3RoLHI9MDtyPGIubGVuZ3RoO2IubGVuZ3RoPT09c3x8KDAsSC5saykoYiksKytyKXEuYWRk
-KGJbcl0pfSwKSkUoYSxiLGMsZCxlKXt2YXIgcz1XLmFGKG5ldyBXLnZOKGMpLHQuQikKaWYocyE9bnVs
-bCYmITApSi5kWihhLGIscywhMSkKcmV0dXJuIG5ldyBXLnhDKGEsYixzLCExLGUuQygieEM8MD4iKSl9
-LApUdyhhKXt2YXIgcz1XLko2KG51bGwpLHI9dC5GLmEod2luZG93LmxvY2F0aW9uKQpzPW5ldyBXLkpR
-KG5ldyBXLm1rKHMscikpCnMuQ1koYSkKcmV0dXJuIHN9LApxRChhLGIsYyxkKXt0LmguYShhKQpILm4o
-YikKSC5uKGMpCnQuY3IuYShkKQpyZXR1cm4hMH0sCm5aKGEsYixjLGQpe3ZhciBzLHIscQp0LmguYShh
-KQpILm4oYikKSC5uKGMpCnM9dC5jci5hKGQpLmEKcj1zLmEKQy54bi5zTFUocixjKQpxPXIuaG9zdG5h
-bWUKcz1zLmIKaWYoIShxPT1zLmhvc3RuYW1lJiZyLnBvcnQ9PT1zLnBvcnQmJnIucHJvdG9jb2w9PT1z
-LnByb3RvY29sKSlpZihxPT09IiIpaWYoci5wb3J0PT09IiIpe3M9ci5wcm90b2NvbApzPXM9PT0iOiJ8
-fHM9PT0iIn1lbHNlIHM9ITEKZWxzZSBzPSExCmVsc2Ugcz0hMApyZXR1cm4gc30sCkJsKCl7dmFyIHM9
-dC5OLHI9UC50TShDLlF4LHMpLHE9dC5kRy5hKG5ldyBXLklBKCkpLHA9SC5RSShbIlRFTVBMQVRFIl0s
-dC5zKQpzPW5ldyBXLmN0KHIsUC5McyhzKSxQLkxzKHMpLFAuTHMocyksbnVsbCkKcy5DWShudWxsLG5l
-dyBILmxKKEMuUXgscSx0LmR2KSxwLG51bGwpCnJldHVybiBzfSwKcWMoYSl7dmFyIHMKaWYoYT09bnVs
-bClyZXR1cm4gbnVsbAppZigicG9zdE1lc3NhZ2UiIGluIGEpe3M9Vy5QMShhKQpyZXR1cm4gc31lbHNl
-IHJldHVybiB0LmNoLmEoYSl9LApQMShhKXtpZihhPT09d2luZG93KXJldHVybiB0LmNpLmEoYSkKZWxz
-ZSByZXR1cm4gbmV3IFcuZFcoKX0sCmFGKGEsYil7dmFyIHM9JC5YMwppZihzPT09Qy5OVSlyZXR1cm4g
-YQpyZXR1cm4gcy5QeShhLGIpfSwKcUU6ZnVuY3Rpb24gcUUoKXt9LApHaDpmdW5jdGlvbiBHaCgpe30s
-CmZZOmZ1bmN0aW9uIGZZKCl7fSwKclo6ZnVuY3Rpb24gclooKXt9LApBejpmdW5jdGlvbiBBeigpe30s
-ClFQOmZ1bmN0aW9uIFFQKCl7fSwKbng6ZnVuY3Rpb24gbngoKXt9LApvSjpmdW5jdGlvbiBvSigpe30s
-CmlkOmZ1bmN0aW9uIGlkKCl7fSwKUUY6ZnVuY3Rpb24gUUYoKXt9LApOaDpmdW5jdGlvbiBOaCgpe30s
-CmFlOmZ1bmN0aW9uIGFlKCl7fSwKSUI6ZnVuY3Rpb24gSUIoKXt9LApuNzpmdW5jdGlvbiBuNygpe30s
-Cnd6OmZ1bmN0aW9uIHd6KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCmN2OmZ1bmN0aW9uIGN2KCl7
-fSwKQ3Y6ZnVuY3Rpb24gQ3YoKXt9LAplYTpmdW5jdGlvbiBlYSgpe30sCkQwOmZ1bmN0aW9uIEQwKCl7
-fSwKaEg6ZnVuY3Rpb24gaEgoKXt9LApoNDpmdW5jdGlvbiBoNCgpe30sCmJyOmZ1bmN0aW9uIGJyKCl7
-fSwKVmI6ZnVuY3Rpb24gVmIoKXt9LApmSjpmdW5jdGlvbiBmSigpe30sCndhOmZ1bmN0aW9uIHdhKCl7
-fSwKU2c6ZnVuY3Rpb24gU2coKXt9LAp1ODpmdW5jdGlvbiB1OCgpe30sCkFqOmZ1bmN0aW9uIEFqKCl7
-fSwKZTc6ZnVuY3Rpb24gZTcoYSl7dGhpcy5hPWF9LApLVjpmdW5jdGlvbiBLVigpe30sCkJIOmZ1bmN0
-aW9uIEJIKCl7fSwKU046ZnVuY3Rpb24gU04oKXt9LApldzpmdW5jdGlvbiBldygpe30sCmxwOmZ1bmN0
-aW9uIGxwKCl7fSwKVGI6ZnVuY3Rpb24gVGIoKXt9LApJdjpmdW5jdGlvbiBJdigpe30sCldQOmZ1bmN0
-aW9uIFdQKCl7fSwKeVk6ZnVuY3Rpb24geVkoKXt9LAp3NjpmdW5jdGlvbiB3Nigpe30sCks1OmZ1bmN0
-aW9uIEs1KCl7fSwKQ206ZnVuY3Rpb24gQ20oKXt9LApDUTpmdW5jdGlvbiBDUSgpe30sCnc0OmZ1bmN0
-aW9uIHc0KCl7fSwKcmg6ZnVuY3Rpb24gcmgoKXt9LApjZjpmdW5jdGlvbiBjZigpe30sCmk3OmZ1bmN0
-aW9uIGk3KGEpe3RoaXMuYT1hfSwKU3k6ZnVuY3Rpb24gU3koYSl7dGhpcy5hPWF9LApLUzpmdW5jdGlv
-biBLUyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKQTM6ZnVuY3Rpb24gQTMoYSxiKXt0aGlzLmE9YQp0
-aGlzLmI9Yn0sCkk0OmZ1bmN0aW9uIEk0KGEpe3RoaXMuYT1hfSwKRms6ZnVuY3Rpb24gRmsoYSxiKXt0
-aGlzLmE9YQp0aGlzLiR0aT1ifSwKUk86ZnVuY3Rpb24gUk8oYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9
-YQpfLmI9YgpfLmM9YwpfLiR0aT1kfSwKQ3E6ZnVuY3Rpb24gQ3EoYSxiLGMsZCl7dmFyIF89dGhpcwpf
-LmE9YQpfLmI9YgpfLmM9YwpfLiR0aT1kfSwKeEM6ZnVuY3Rpb24geEMoYSxiLGMsZCxlKXt2YXIgXz10
-aGlzCl8uYj1hCl8uYz1iCl8uZD1jCl8uZT1kCl8uJHRpPWV9LAp2TjpmdW5jdGlvbiB2TihhKXt0aGlz
-LmE9YX0sCkpROmZ1bmN0aW9uIEpRKGEpe3RoaXMuYT1hfSwKR206ZnVuY3Rpb24gR20oKXt9LAp2RDpm
-dW5jdGlvbiB2RChhKXt0aGlzLmE9YX0sClV2OmZ1bmN0aW9uIFV2KGEpe3RoaXMuYT1hfSwKRWc6ZnVu
-Y3Rpb24gRWcoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKbTY6ZnVuY3Rpb24gbTYo
-KXt9LApFbzpmdW5jdGlvbiBFbygpe30sCldrOmZ1bmN0aW9uIFdrKCl7fSwKY3Q6ZnVuY3Rpb24gY3Qo
-YSxiLGMsZCxlKXt2YXIgXz10aGlzCl8uZT1hCl8uYT1iCl8uYj1jCl8uYz1kCl8uZD1lfSwKSUE6ZnVu
-Y3Rpb24gSUEoKXt9LApPdzpmdW5jdGlvbiBPdygpe30sClc5OmZ1bmN0aW9uIFc5KGEsYixjKXt2YXIg
-Xz10aGlzCl8uYT1hCl8uYj1iCl8uYz0tMQpfLmQ9bnVsbApfLiR0aT1jfSwKZFc6ZnVuY3Rpb24gZFco
-KXt9LAptazpmdW5jdGlvbiBtayhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKS286ZnVuY3Rpb24gS28o
-YSl7dGhpcy5hPWEKdGhpcy5iPTB9LApmbTpmdW5jdGlvbiBmbShhKXt0aGlzLmE9YX0sCkxlOmZ1bmN0
-aW9uIExlKCl7fSwKSzc6ZnVuY3Rpb24gSzcoKXt9LApyQjpmdW5jdGlvbiByQigpe30sClhXOmZ1bmN0
-aW9uIFhXKCl7fSwKb2E6ZnVuY3Rpb24gb2EoKXt9fSxYPXsKQ0woYSxiKXt2YXIgcyxyLHEscCxvLG49
-Yi54WihhKQpiLmhLKGEpCmlmKG4hPW51bGwpYT1DLnhCLnluKGEsbi5sZW5ndGgpCnM9dC5zCnI9SC5R
-SShbXSxzKQpxPUguUUkoW10scykKcz1hLmxlbmd0aAppZihzIT09MCYmYi5yNChDLnhCLlcoYSwwKSkp
-e2lmKDA+PXMpcmV0dXJuIEguT0goYSwwKQpDLk5tLmkocSxhWzBdKQpwPTF9ZWxzZXtDLk5tLmkocSwi
-IikKcD0wfWZvcihvPXA7bzxzOysrbylpZihiLnI0KEMueEIuVyhhLG8pKSl7Qy5ObS5pKHIsQy54Qi5O
-aihhLHAsbykpCkMuTm0uaShxLGFbb10pCnA9bysxfWlmKHA8cyl7Qy5ObS5pKHIsQy54Qi55bihhLHAp
-KQpDLk5tLmkocSwiIil9cmV0dXJuIG5ldyBYLldEKGIsbixyLHEpfSwKV0Q6ZnVuY3Rpb24gV0QoYSxi
-LGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmQ9YwpfLmU9ZH0sCkk3KGEpe3JldHVybiBuZXcg
-WC5kdihhKX0sCmR2OmZ1bmN0aW9uIGR2KGEpe3RoaXMuYT1hfX0KdmFyIHc9W0IsQyxELEUsRixILEos
-TCxNLE8sUCxSLFQsVSxXLFhdCmh1bmtIZWxwZXJzLnNldEZ1bmN0aW9uTmFtZXNJZk5lY2Vzc2FyeSh3
-KQp2YXIgJD17fQpILkZLLnByb3RvdHlwZT17fQpKLkd2LnByb3RvdHlwZT17CkROKGEsYil7cmV0dXJu
-IGE9PT1ifSwKZ2lPKGEpe3JldHVybiBILmVRKGEpfSwKdyhhKXtyZXR1cm4iSW5zdGFuY2Ugb2YgJyIr
-SC5saChhKSsiJyJ9LAplNyhhLGIpe3Quby5hKGIpCnRocm93IEguYihQLmxyKGEsYi5nV2EoKSxiLmdu
-ZCgpLGIuZ1ZtKCkpKX19CkoueUUucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4gU3RyaW5nKGEpfSwKZ2lP
-KGEpe3JldHVybiBhPzUxOTAxODoyMTgxNTl9LAokaWEyOjF9Ckoud2UucHJvdG90eXBlPXsKRE4oYSxi
-KXtyZXR1cm4gbnVsbD09Yn0sCncoYSl7cmV0dXJuIm51bGwifSwKZ2lPKGEpe3JldHVybiAwfSwKJGlj
-ODoxfQpKLk1GLnByb3RvdHlwZT17CmdpTyhhKXtyZXR1cm4gMH0sCncoYSl7cmV0dXJuIFN0cmluZyhh
-KX0sCiRpdm06MX0KSi5pQy5wcm90b3R5cGU9e30KSi5rZC5wcm90b3R5cGU9e30KSi5jNS5wcm90b3R5
-cGU9ewp3KGEpe3ZhciBzPWFbJC56KCldCmlmKHM9PW51bGwpcmV0dXJuIHRoaXMudChhKQpyZXR1cm4i
-SmF2YVNjcmlwdCBmdW5jdGlvbiBmb3IgIitILkVqKEoudyhzKSl9LAokaUVIOjF9CkouamQucHJvdG90
-eXBlPXsKZHIoYSxiKXtyZXR1cm4gbmV3IEgualYoYSxILnQ2KGEpLkMoIkA8MT4iKS5LcShiKS5DKCJq
-VjwxLDI+IikpfSwKaShhLGIpe0gudDYoYSkuYy5hKGIpCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52KFAu
-TDQoImFkZCIpKQphLnB1c2goYil9LApXNChhLGIpe3ZhciBzCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52
-KFAuTDQoInJlbW92ZUF0IikpCnM9YS5sZW5ndGgKaWYoYj49cyl0aHJvdyBILmIoUC5PNyhiLG51bGwp
-KQpyZXR1cm4gYS5zcGxpY2UoYiwxKVswXX0sClVHKGEsYixjKXt2YXIgcyxyCkgudDYoYSkuQygiY1g8
-MT4iKS5hKGMpCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52KFAuTDQoImluc2VydEFsbCIpKQpQLndBKGIs
-MCxhLmxlbmd0aCwiaW5kZXgiKQppZighdC5XLmIoYykpYz1KLlJYKGMpCnM9Si5IbShjKQphLmxlbmd0
-aD1hLmxlbmd0aCtzCnI9YitzCnRoaXMuWVcoYSxyLGEubGVuZ3RoLGEsYikKdGhpcy52ZyhhLGIscixj
-KX0sCkZWKGEsYil7dmFyIHMKSC50NihhKS5DKCJjWDwxPiIpLmEoYikKaWYoISFhLmZpeGVkJGxlbmd0
-aClILnYoUC5MNCgiYWRkQWxsIikpCmlmKEFycmF5LmlzQXJyYXkoYikpe3RoaXMuS2goYSxiKQpyZXR1
-cm59Zm9yKHM9Si5JVChiKTtzLkYoKTspYS5wdXNoKHMuZ2woKSl9LApLaChhLGIpe3ZhciBzLHIKdC5i
-LmEoYikKcz1iLmxlbmd0aAppZihzPT09MClyZXR1cm4KaWYoYT09PWIpdGhyb3cgSC5iKFAuYTQoYSkp
-CmZvcihyPTA7cjxzOysrcilhLnB1c2goYltyXSl9LApFMihhLGIsYyl7dmFyIHM9SC50NihhKQpyZXR1
-cm4gbmV3IEgubEooYSxzLktxKGMpLkMoIjEoMikiKS5hKGIpLHMuQygiQDwxPiIpLktxKGMpLkMoImxK
-PDEsMj4iKSl9LAprKGEsYil7dmFyIHMscj1QLk84KGEubGVuZ3RoLCIiLCExLHQuTikKZm9yKHM9MDtz
-PGEubGVuZ3RoOysrcyl0aGlzLlk1KHIscyxILkVqKGFbc10pKQpyZXR1cm4gci5qb2luKGIpfSwKZVIo
-YSxiKXtyZXR1cm4gSC5xQyhhLGIsbnVsbCxILnQ2KGEpLmMpfSwKTjAoYSxiLGMsZCl7dmFyIHMscixx
-CmQuYShiKQpILnQ2KGEpLktxKGQpLkMoIjEoMSwyKSIpLmEoYykKcz1hLmxlbmd0aApmb3Iocj1iLHE9
-MDtxPHM7KytxKXtyPWMuJDIocixhW3FdKQppZihhLmxlbmd0aCE9PXMpdGhyb3cgSC5iKFAuYTQoYSkp
-fXJldHVybiByfSwKSHQoYSxiKXt2YXIgcyxyLHEscCxvLG49SC50NihhKQpuLkMoImEyKDEpIikuYShi
-KQpzPWEubGVuZ3RoCmZvcihyPW51bGwscT0hMSxwPTA7cDxzOysrcCl7bz1hW3BdCmlmKEgub1QoYi4k
-MShvKSkpe2lmKHEpdGhyb3cgSC5iKEguQW0oKSkKcj1vCnE9ITB9aWYocyE9PWEubGVuZ3RoKXRocm93
-IEguYihQLmE0KGEpKX1pZihxKXJldHVybiBuLmMuYShyKQp0aHJvdyBILmIoSC5XcCgpKX0sCkUoYSxi
-KXtpZihiPDB8fGI+PWEubGVuZ3RoKXJldHVybiBILk9IKGEsYikKcmV0dXJuIGFbYl19LApndEgoYSl7
-aWYoYS5sZW5ndGg+MClyZXR1cm4gYVswXQp0aHJvdyBILmIoSC5XcCgpKX0sCmdyWihhKXt2YXIgcz1h
-Lmxlbmd0aAppZihzPjApcmV0dXJuIGFbcy0xXQp0aHJvdyBILmIoSC5XcCgpKX0sCllXKGEsYixjLGQs
-ZSl7dmFyIHMscixxLHAsbwpILnQ2KGEpLkMoImNYPDE+IikuYShkKQppZighIWEuaW1tdXRhYmxlJGxp
-c3QpSC52KFAuTDQoInNldFJhbmdlIikpClAuakIoYixjLGEubGVuZ3RoKQpzPWMtYgppZihzPT09MCly
-ZXR1cm4KUC5rMShlLCJza2lwQ291bnQiKQppZih0LmouYihkKSl7cj1kCnE9ZX1lbHNle3I9Si5BNShk
-LGUpLnR0KDAsITEpCnE9MH1wPUouVTYocikKaWYocStzPnAuZ0EocikpdGhyb3cgSC5iKEguYXIoKSkK
-aWYocTxiKWZvcihvPXMtMTtvPj0wOy0tbylhW2Irb109cC5xKHIscStvKQplbHNlIGZvcihvPTA7bzxz
-OysrbylhW2Irb109cC5xKHIscStvKX0sCnZnKGEsYixjLGQpe3JldHVybiB0aGlzLllXKGEsYixjLGQs
-MCl9LApWcihhLGIpe3ZhciBzLHIKSC50NihhKS5DKCJhMigxKSIpLmEoYikKcz1hLmxlbmd0aApmb3Io
-cj0wO3I8czsrK3Ipe2lmKEgub1QoYi4kMShhW3JdKSkpcmV0dXJuITAKaWYoYS5sZW5ndGghPT1zKXRo
-cm93IEguYihQLmE0KGEpKX1yZXR1cm4hMX0sCnRnKGEsYil7dmFyIHMKZm9yKHM9MDtzPGEubGVuZ3Ro
-OysrcylpZihKLlJNKGFbc10sYikpcmV0dXJuITAKcmV0dXJuITF9LApnbDAoYSl7cmV0dXJuIGEubGVu
-Z3RoPT09MH0sCmdvcihhKXtyZXR1cm4gYS5sZW5ndGghPT0wfSwKdyhhKXtyZXR1cm4gUC54KGEsIlsi
-LCJdIil9LAp0dChhLGIpe3ZhciBzPUguUUkoYS5zbGljZSgwKSxILnQ2KGEpKQpyZXR1cm4gc30sCmJy
-KGEpe3JldHVybiB0aGlzLnR0KGEsITApfSwKZ20oYSl7cmV0dXJuIG5ldyBKLm0xKGEsYS5sZW5ndGgs
-SC50NihhKS5DKCJtMTwxPiIpKX0sCmdpTyhhKXtyZXR1cm4gSC5lUShhKX0sCmdBKGEpe3JldHVybiBh
-Lmxlbmd0aH0sCnNBKGEsYil7aWYoISFhLmZpeGVkJGxlbmd0aClILnYoUC5MNCgic2V0IGxlbmd0aCIp
-KQppZihiPDApdGhyb3cgSC5iKFAuVEUoYiwwLG51bGwsIm5ld0xlbmd0aCIsbnVsbCkpCmlmKGI+YS5s
-ZW5ndGgpSC50NihhKS5jLmEobnVsbCkKYS5sZW5ndGg9Yn0sCnEoYSxiKXtILklaKGIpCmlmKGI+PWEu
-bGVuZ3RofHxiPDApdGhyb3cgSC5iKEgudShhLGIpKQpyZXR1cm4gYVtiXX0sClk1KGEsYixjKXtILnQ2
-KGEpLmMuYShjKQppZighIWEuaW1tdXRhYmxlJGxpc3QpSC52KFAuTDQoImluZGV4ZWQgc2V0IikpCmlm
-KGI+PWEubGVuZ3RofHxiPDApdGhyb3cgSC5iKEgudShhLGIpKQphW2JdPWN9LAokaWJROjEsCiRpY1g6
-MSwKJGl6TToxfQpKLlBvLnByb3RvdHlwZT17fQpKLm0xLnByb3RvdHlwZT17CmdsKCl7cmV0dXJuIHRo
-aXMuJHRpLmMuYSh0aGlzLmQpfSwKRigpe3ZhciBzLHI9dGhpcyxxPXIuYSxwPXEubGVuZ3RoCmlmKHIu
-YiE9PXApdGhyb3cgSC5iKEgubGsocSkpCnM9ci5jCmlmKHM+PXApe3Iuc00obnVsbCkKcmV0dXJuITF9
-ci5zTShxW3NdKTsrK3IuYwpyZXR1cm4hMH0sCnNNKGEpe3RoaXMuZD10aGlzLiR0aS5DKCIxPyIpLmEo
-YSl9LAokaUFuOjF9CkoucUkucHJvdG90eXBlPXsKelEoYSl7aWYoYT4wKXtpZihhIT09MS8wKXJldHVy
-biBNYXRoLnJvdW5kKGEpfWVsc2UgaWYoYT4tMS8wKXJldHVybiAwLU1hdGgucm91bmQoMC1hKQp0aHJv
-dyBILmIoUC5MNCgiIithKyIucm91bmQoKSIpKX0sCncoYSl7aWYoYT09PTAmJjEvYTwwKXJldHVybiIt
-MC4wIgplbHNlIHJldHVybiIiK2F9LApnaU8oYSl7dmFyIHMscixxLHAsbz1hfDAKaWYoYT09PW8pcmV0
-dXJuIG8mNTM2ODcwOTExCnM9TWF0aC5hYnMoYSkKcj1NYXRoLmxvZyhzKS8wLjY5MzE0NzE4MDU1OTk0
-NTN8MApxPU1hdGgucG93KDIscikKcD1zPDE/cy9xOnEvcwpyZXR1cm4oKHAqOTAwNzE5OTI1NDc0MDk5
-MnwwKSsocCozNTQyMjQzMTgxMTc2NTIxfDApKSo1OTkxOTcrcioxMjU5JjUzNjg3MDkxMX0sCnpZKGEs
-Yil7dmFyIHM9YSViCmlmKHM9PT0wKXJldHVybiAwCmlmKHM+MClyZXR1cm4gcwpyZXR1cm4gcytifSwK
-QlUoYSxiKXtyZXR1cm4oYXwwKT09PWE/YS9ifDA6dGhpcy5ESihhLGIpfSwKREooYSxiKXt2YXIgcz1h
-L2IKaWYocz49LTIxNDc0ODM2NDgmJnM8PTIxNDc0ODM2NDcpcmV0dXJuIHN8MAppZihzPjApe2lmKHMh
-PT0xLzApcmV0dXJuIE1hdGguZmxvb3Iocyl9ZWxzZSBpZihzPi0xLzApcmV0dXJuIE1hdGguY2VpbChz
-KQp0aHJvdyBILmIoUC5MNCgiUmVzdWx0IG9mIHRydW5jYXRpbmcgZGl2aXNpb24gaXMgIitILkVqKHMp
-KyI6ICIrSC5FaihhKSsiIH4vICIrYikpfSwKd0coYSxiKXt2YXIgcwppZihhPjApcz10aGlzLnAzKGEs
-YikKZWxzZXtzPWI+MzE/MzE6YgpzPWE+PnM+Pj4wfXJldHVybiBzfSwKYmYoYSxiKXtpZigwPmIpdGhy
-b3cgSC5iKEgudEwoYikpCnJldHVybiB0aGlzLnAzKGEsYil9LApwMyhhLGIpe3JldHVybiBiPjMxPzA6
-YT4+PmJ9LAokaUNQOjEsCiRpWlo6MX0KSi5iVS5wcm90b3R5cGU9eyRpSWo6MX0KSi5rRC5wcm90b3R5
-cGU9e30KSi5Eci5wcm90b3R5cGU9ewpPKGEsYil7aWYoYjwwKXRocm93IEguYihILnUoYSxiKSkKaWYo
-Yj49YS5sZW5ndGgpSC52KEgudShhLGIpKQpyZXR1cm4gYS5jaGFyQ29kZUF0KGIpfSwKVyhhLGIpe2lm
-KGI+PWEubGVuZ3RoKXRocm93IEguYihILnUoYSxiKSkKcmV0dXJuIGEuY2hhckNvZGVBdChiKX0sCmRk
-KGEsYil7cmV0dXJuIG5ldyBILnVuKGIsYSwwKX0sCmgoYSxiKXtyZXR1cm4gYStifSwKVGMoYSxiKXt2
-YXIgcz1iLmxlbmd0aCxyPWEubGVuZ3RoCmlmKHM+cilyZXR1cm4hMQpyZXR1cm4gYj09PXRoaXMueW4o
-YSxyLXMpfSwKaTcoYSxiLGMsZCl7dmFyIHM9UC5qQihiLGMsYS5sZW5ndGgpLHI9YS5zdWJzdHJpbmco
-MCxiKSxxPWEuc3Vic3RyaW5nKHMpCnJldHVybiByK2QrcX0sClFpKGEsYixjKXt2YXIgcwppZihjPDB8
-fGM+YS5sZW5ndGgpdGhyb3cgSC5iKFAuVEUoYywwLGEubGVuZ3RoLG51bGwsbnVsbCkpCnM9YytiLmxl
-bmd0aAppZihzPmEubGVuZ3RoKXJldHVybiExCnJldHVybiBiPT09YS5zdWJzdHJpbmcoYyxzKX0sCm4o
-YSxiKXtyZXR1cm4gdGhpcy5RaShhLGIsMCl9LApOaihhLGIsYyl7cmV0dXJuIGEuc3Vic3RyaW5nKGIs
-UC5qQihiLGMsYS5sZW5ndGgpKX0sCnluKGEsYil7cmV0dXJuIHRoaXMuTmooYSxiLG51bGwpfSwKaGMo
-YSl7cmV0dXJuIGEudG9Mb3dlckNhc2UoKX0sCmJTKGEpe3ZhciBzLHIscSxwPWEudHJpbSgpLG89cC5s
-ZW5ndGgKaWYobz09PTApcmV0dXJuIHAKaWYodGhpcy5XKHAsMCk9PT0xMzMpe3M9Si5tbShwLDEpCmlm
-KHM9PT1vKXJldHVybiIifWVsc2Ugcz0wCnI9by0xCnE9dGhpcy5PKHAscik9PT0xMzM/Si5jMShwLHIp
-Om8KaWYocz09PTAmJnE9PT1vKXJldHVybiBwCnJldHVybiBwLnN1YnN0cmluZyhzLHEpfSwKVChhLGIp
-e3ZhciBzLHIKaWYoMD49YilyZXR1cm4iIgppZihiPT09MXx8YS5sZW5ndGg9PT0wKXJldHVybiBhCmlm
-KGIhPT1iPj4+MCl0aHJvdyBILmIoQy5FcSkKZm9yKHM9YSxyPSIiOyEwOyl7aWYoKGImMSk9PT0xKXI9
-cytyCmI9Yj4+PjEKaWYoYj09PTApYnJlYWsKcys9c31yZXR1cm4gcn0sClhVKGEsYixjKXt2YXIgcwpp
-ZihjPDB8fGM+YS5sZW5ndGgpdGhyb3cgSC5iKFAuVEUoYywwLGEubGVuZ3RoLG51bGwsbnVsbCkpCnM9
-YS5pbmRleE9mKGIsYykKcmV0dXJuIHN9LApPWShhLGIpe3JldHVybiB0aGlzLlhVKGEsYiwwKX0sClBr
-KGEsYixjKXt2YXIgcyxyCmlmKGM9PW51bGwpYz1hLmxlbmd0aAplbHNlIGlmKGM8MHx8Yz5hLmxlbmd0
-aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5ndGgsbnVsbCxudWxsKSkKcz1iLmxlbmd0aApyPWEubGVu
-Z3RoCmlmKGMrcz5yKWM9ci1zCnJldHVybiBhLmxhc3RJbmRleE9mKGIsYyl9LApjbihhLGIpe3JldHVy
-biB0aGlzLlBrKGEsYixudWxsKX0sCklzKGEsYixjKXt2YXIgcz1hLmxlbmd0aAppZihjPnMpdGhyb3cg
-SC5iKFAuVEUoYywwLHMsbnVsbCxudWxsKSkKcmV0dXJuIEguU1EoYSxiLGMpfSwKdGcoYSxiKXtyZXR1
-cm4gdGhpcy5JcyhhLGIsMCl9LAp3KGEpe3JldHVybiBhfSwKZ2lPKGEpe3ZhciBzLHIscQpmb3Iocz1h
-Lmxlbmd0aCxyPTAscT0wO3E8czsrK3Epe3I9cithLmNoYXJDb2RlQXQocSkmNTM2ODcwOTExCnI9ciso
-KHImNTI0Mjg3KTw8MTApJjUzNjg3MDkxMQpyXj1yPj42fXI9cisoKHImNjcxMDg4NjMpPDwzKSY1MzY4
-NzA5MTEKcl49cj4+MTEKcmV0dXJuIHIrKChyJjE2MzgzKTw8MTUpJjUzNjg3MDkxMX0sCmdBKGEpe3Jl
-dHVybiBhLmxlbmd0aH0sCnEoYSxiKXtILklaKGIpCmlmKGI+PWEubGVuZ3RofHwhMSl0aHJvdyBILmIo
-SC51KGEsYikpCnJldHVybiBhW2JdfSwKJGl2WDoxLAokaXFVOjF9CkguQlIucHJvdG90eXBlPXsKZ20o
-YSl7dmFyIHM9SC5MaCh0aGlzKQpyZXR1cm4gbmV3IEguZVQoSi5JVCh0aGlzLmdPTigpKSxzLkMoIkA8
-MT4iKS5LcShzLlFbMV0pLkMoImVUPDEsMj4iKSl9LApnQShhKXtyZXR1cm4gSi5IbSh0aGlzLmdPTigp
-KX0sCmdsMChhKXtyZXR1cm4gSi51VSh0aGlzLmdPTigpKX0sCmdvcihhKXtyZXR1cm4gSi5GNyh0aGlz
-LmdPTigpKX0sCmVSKGEsYil7dmFyIHM9SC5MaCh0aGlzKQpyZXR1cm4gSC5HSihKLkE1KHRoaXMuZ09O
-KCksYikscy5jLHMuUVsxXSl9LApFKGEsYil7cmV0dXJuIEguTGgodGhpcykuUVsxXS5hKEouR0EodGhp
-cy5nT04oKSxiKSl9LAp3KGEpe3JldHVybiBKLncodGhpcy5nT04oKSl9fQpILmVULnByb3RvdHlwZT17
-CkYoKXtyZXR1cm4gdGhpcy5hLkYoKX0sCmdsKCl7cmV0dXJuIHRoaXMuJHRpLlFbMV0uYSh0aGlzLmEu
-Z2woKSl9LAokaUFuOjF9CkguWnkucHJvdG90eXBlPXsKZ09OKCl7cmV0dXJuIHRoaXMuYX19Ckgub2wu
-cHJvdG90eXBlPXskaWJROjF9CkguVXEucHJvdG90eXBlPXsKcShhLGIpe3JldHVybiB0aGlzLiR0aS5R
-WzFdLmEoSi54OSh0aGlzLmEsSC5JWihiKSkpfSwKWTUoYSxiLGMpe3ZhciBzPXRoaXMuJHRpCkoudTko
-dGhpcy5hLGIscy5jLmEocy5RWzFdLmEoYykpKX0sCiRpYlE6MSwKJGl6TToxfQpILmpWLnByb3RvdHlw
-ZT17CmRyKGEsYil7cmV0dXJuIG5ldyBILmpWKHRoaXMuYSx0aGlzLiR0aS5DKCJAPDE+IikuS3EoYiku
-QygialY8MSwyPiIpKX0sCmdPTigpe3JldHVybiB0aGlzLmF9fQpILmMucHJvdG90eXBlPXsKdyhhKXt2
-YXIgcz0iTGF0ZUluaXRpYWxpemF0aW9uRXJyb3I6ICIrdGhpcy5hCnJldHVybiBzfX0KSC5xai5wcm90
-b3R5cGU9ewpnQShhKXtyZXR1cm4gdGhpcy5hLmxlbmd0aH0sCnEoYSxiKXtyZXR1cm4gQy54Qi5PKHRo
-aXMuYSxILklaKGIpKX19CkguYlEucHJvdG90eXBlPXt9CkguYUwucHJvdG90eXBlPXsKZ20oYSl7dmFy
-IHM9dGhpcwpyZXR1cm4gbmV3IEguYTcocyxzLmdBKHMpLEguTGgocykuQygiYTc8YUwuRT4iKSl9LApn
-bDAoYSl7cmV0dXJuIHRoaXMuZ0EodGhpcyk9PT0wfSwKayhhLGIpe3ZhciBzLHIscSxwPXRoaXMsbz1w
-LmdBKHApCmlmKGIubGVuZ3RoIT09MCl7aWYobz09PTApcmV0dXJuIiIKcz1ILkVqKHAuRSgwLDApKQpp
-ZihvIT09cC5nQShwKSl0aHJvdyBILmIoUC5hNChwKSkKZm9yKHI9cyxxPTE7cTxvOysrcSl7cj1yK2Ir
-SC5FaihwLkUoMCxxKSkKaWYobyE9PXAuZ0EocCkpdGhyb3cgSC5iKFAuYTQocCkpfXJldHVybiByLmNo
-YXJDb2RlQXQoMCk9PTA/cjpyfWVsc2V7Zm9yKHE9MCxyPSIiO3E8bzsrK3Epe3IrPUguRWoocC5FKDAs
-cSkpCmlmKG8hPT1wLmdBKHApKXRocm93IEguYihQLmE0KHApKX1yZXR1cm4gci5jaGFyQ29kZUF0KDAp
-PT0wP3I6cn19LApldihhLGIpe3JldHVybiB0aGlzLkdHKDAsSC5MaCh0aGlzKS5DKCJhMihhTC5FKSIp
-LmEoYikpfSwKRTIoYSxiLGMpe3ZhciBzPUguTGgodGhpcykKcmV0dXJuIG5ldyBILmxKKHRoaXMscy5L
-cShjKS5DKCIxKGFMLkUpIikuYShiKSxzLkMoIkA8YUwuRT4iKS5LcShjKS5DKCJsSjwxLDI+IikpfSwK
-ZVIoYSxiKXtyZXR1cm4gSC5xQyh0aGlzLGIsbnVsbCxILkxoKHRoaXMpLkMoImFMLkUiKSl9LAp0dChh
-LGIpe3JldHVybiBQLlkxKHRoaXMsITAsSC5MaCh0aGlzKS5DKCJhTC5FIikpfSwKYnIoYSl7cmV0dXJu
-IHRoaXMudHQoYSwhMCl9fQpILm5ILnByb3RvdHlwZT17CkhkKGEsYixjLGQpe3ZhciBzLHI9dGhpcy5i
-ClAuazEociwic3RhcnQiKQpzPXRoaXMuYwppZihzIT1udWxsKXtQLmsxKHMsImVuZCIpCmlmKHI+cyl0
-aHJvdyBILmIoUC5URShyLDAscywic3RhcnQiLG51bGwpKX19LApnVUQoKXt2YXIgcz1KLkhtKHRoaXMu
-YSkscj10aGlzLmMKaWYocj09bnVsbHx8cj5zKXJldHVybiBzCnJldHVybiByfSwKZ0FzKCl7dmFyIHM9
-Si5IbSh0aGlzLmEpLHI9dGhpcy5iCmlmKHI+cylyZXR1cm4gcwpyZXR1cm4gcn0sCmdBKGEpe3ZhciBz
-LHI9Si5IbSh0aGlzLmEpLHE9dGhpcy5iCmlmKHE+PXIpcmV0dXJuIDAKcz10aGlzLmMKaWYocz09bnVs
-bHx8cz49cilyZXR1cm4gci1xCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMuSE4oKQpyZXR1
-cm4gcy1xfSwKRShhLGIpe3ZhciBzPXRoaXMscj1zLmdBcygpK2IKaWYoYjwwfHxyPj1zLmdVRCgpKXRo
-cm93IEguYihQLkNmKGIscywiaW5kZXgiLG51bGwsbnVsbCkpCnJldHVybiBKLkdBKHMuYSxyKX0sCmVS
-KGEsYil7dmFyIHMscixxPXRoaXMKUC5rMShiLCJjb3VudCIpCnM9cS5iK2IKcj1xLmMKaWYociE9bnVs
-bCYmcz49cilyZXR1cm4gbmV3IEguTUIocS4kdGkuQygiTUI8MT4iKSkKcmV0dXJuIEgucUMocS5hLHMs
-cixxLiR0aS5jKX0sCnR0KGEsYil7dmFyIHMscixxLHA9dGhpcyxvPXAuYixuPXAuYSxtPUouVTYobiks
-bD1tLmdBKG4pLGs9cC5jCmlmKGshPW51bGwmJms8bClsPWsKcz1sLW8KaWYoczw9MCl7bj1KLlFpKDAs
-cC4kdGkuYykKcmV0dXJuIG59cj1QLk84KHMsbS5FKG4sbyksITEscC4kdGkuYykKZm9yKHE9MTtxPHM7
-KytxKXtDLk5tLlk1KHIscSxtLkUobixvK3EpKQppZihtLmdBKG4pPGwpdGhyb3cgSC5iKFAuYTQocCkp
-fXJldHVybiByfX0KSC5hNy5wcm90b3R5cGU9ewpnbCgpe3JldHVybiB0aGlzLiR0aS5jLmEodGhpcy5k
-KX0sCkYoKXt2YXIgcyxyPXRoaXMscT1yLmEscD1KLlU2KHEpLG89cC5nQShxKQppZihyLmIhPT1vKXRo
-cm93IEguYihQLmE0KHEpKQpzPXIuYwppZihzPj1vKXtyLnNJKG51bGwpCnJldHVybiExfXIuc0kocC5F
-KHEscykpOysrci5jCnJldHVybiEwfSwKc0koYSl7dGhpcy5kPXRoaXMuJHRpLkMoIjE/IikuYShhKX0s
-CiRpQW46MX0KSC5pMS5wcm90b3R5cGU9ewpnbShhKXt2YXIgcz1ILkxoKHRoaXMpCnJldHVybiBuZXcg
-SC5NSChKLklUKHRoaXMuYSksdGhpcy5iLHMuQygiQDwxPiIpLktxKHMuUVsxXSkuQygiTUg8MSwyPiIp
-KX0sCmdBKGEpe3JldHVybiBKLkhtKHRoaXMuYSl9LApnbDAoYSl7cmV0dXJuIEoudVUodGhpcy5hKX0s
-CkUoYSxiKXtyZXR1cm4gdGhpcy5iLiQxKEouR0EodGhpcy5hLGIpKX19CkgueHkucHJvdG90eXBlPXsk
-aWJROjF9CkguTUgucHJvdG90eXBlPXsKRigpe3ZhciBzPXRoaXMscj1zLmIKaWYoci5GKCkpe3Muc0ko
-cy5jLiQxKHIuZ2woKSkpCnJldHVybiEwfXMuc0kobnVsbCkKcmV0dXJuITF9LApnbCgpe3JldHVybiB0
-aGlzLiR0aS5RWzFdLmEodGhpcy5hKX0sCnNJKGEpe3RoaXMuYT10aGlzLiR0aS5DKCIyPyIpLmEoYSl9
-fQpILmxKLnByb3RvdHlwZT17CmdBKGEpe3JldHVybiBKLkhtKHRoaXMuYSl9LApFKGEsYil7cmV0dXJu
-IHRoaXMuYi4kMShKLkdBKHRoaXMuYSxiKSl9fQpILlU1LnByb3RvdHlwZT17CmdtKGEpe3JldHVybiBu
-ZXcgSC5TTyhKLklUKHRoaXMuYSksdGhpcy5iLHRoaXMuJHRpLkMoIlNPPDE+IikpfX0KSC5TTy5wcm90
-b3R5cGU9ewpGKCl7dmFyIHMscgpmb3Iocz10aGlzLmEscj10aGlzLmI7cy5GKCk7KWlmKEgub1Qoci4k
-MShzLmdsKCkpKSlyZXR1cm4hMApyZXR1cm4hMX0sCmdsKCl7cmV0dXJuIHRoaXMuYS5nbCgpfX0KSC5B
-TS5wcm90b3R5cGU9ewplUihhLGIpe1AuazEoYiwiY291bnQiKQpyZXR1cm4gbmV3IEguQU0odGhpcy5h
-LHRoaXMuYitiLEguTGgodGhpcykuQygiQU08MT4iKSl9LApnbShhKXtyZXR1cm4gbmV3IEguVTEoSi5J
-VCh0aGlzLmEpLHRoaXMuYixILkxoKHRoaXMpLkMoIlUxPDE+IikpfX0KSC5kNS5wcm90b3R5cGU9ewpn
-QShhKXt2YXIgcz1KLkhtKHRoaXMuYSktdGhpcy5iCmlmKHM+PTApcmV0dXJuIHMKcmV0dXJuIDB9LApl
-UihhLGIpe1AuazEoYiwiY291bnQiKQpyZXR1cm4gbmV3IEguZDUodGhpcy5hLHRoaXMuYitiLHRoaXMu
-JHRpKX0sCiRpYlE6MX0KSC5VMS5wcm90b3R5cGU9ewpGKCl7dmFyIHMscgpmb3Iocz10aGlzLmEscj0w
-O3I8dGhpcy5iOysrcilzLkYoKQp0aGlzLmI9MApyZXR1cm4gcy5GKCl9LApnbCgpe3JldHVybiB0aGlz
-LmEuZ2woKX19CkguTUIucHJvdG90eXBlPXsKZ20oYSl7cmV0dXJuIEMuR3d9LApnbDAoYSl7cmV0dXJu
-ITB9LApnQShhKXtyZXR1cm4gMH0sCkUoYSxiKXt0aHJvdyBILmIoUC5URShiLDAsMCwiaW5kZXgiLG51
-bGwpKX0sCmVSKGEsYil7UC5rMShiLCJjb3VudCIpCnJldHVybiB0aGlzfX0KSC5GdS5wcm90b3R5cGU9
-ewpGKCl7cmV0dXJuITF9LApnbCgpe3Rocm93IEguYihILldwKCkpfSwKJGlBbjoxfQpILnU2LnByb3Rv
-dHlwZT17CmdtKGEpe3JldHVybiBuZXcgSC5KQihKLklUKHRoaXMuYSksdGhpcy4kdGkuQygiSkI8MT4i
-KSl9fQpILkpCLnByb3RvdHlwZT17CkYoKXt2YXIgcyxyCmZvcihzPXRoaXMuYSxyPXRoaXMuJHRpLmM7
-cy5GKCk7KWlmKHIuYihzLmdsKCkpKXJldHVybiEwCnJldHVybiExfSwKZ2woKXtyZXR1cm4gdGhpcy4k
-dGkuYy5hKHRoaXMuYS5nbCgpKX0sCiRpQW46MX0KSC5TVS5wcm90b3R5cGU9e30KSC5SZS5wcm90b3R5
-cGU9ewpZNShhLGIsYyl7SC5MaCh0aGlzKS5DKCJSZS5FIikuYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fu
-bm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpKX19CkgudzIucHJvdG90eXBlPXt9Ckgud3Yu
-cHJvdG90eXBlPXsKZ2lPKGEpe3ZhciBzPXRoaXMuX2hhc2hDb2RlCmlmKHMhPW51bGwpcmV0dXJuIHMK
-cz02NjQ1OTcqSi5oZih0aGlzLmEpJjUzNjg3MDkxMQp0aGlzLl9oYXNoQ29kZT1zCnJldHVybiBzfSwK
-dyhhKXtyZXR1cm4nU3ltYm9sKCInK0guRWoodGhpcy5hKSsnIiknfSwKRE4oYSxiKXtpZihiPT1udWxs
-KXJldHVybiExCnJldHVybiBiIGluc3RhbmNlb2YgSC53diYmdGhpcy5hPT1iLmF9LAokaUdEOjF9Ckgu
-UUMucHJvdG90eXBlPXt9CkguUEQucHJvdG90eXBlPXt9CkguV1UucHJvdG90eXBlPXsKZ2wwKGEpe3Jl
-dHVybiB0aGlzLmdBKHRoaXMpPT09MH0sCncoYSl7cmV0dXJuIFAubk8odGhpcyl9LApZNShhLGIsYyl7
-dmFyIHM9SC5MaCh0aGlzKQpzLmMuYShiKQpzLlFbMV0uYShjKQpILmRjKCl9LApnUHUoYSl7cmV0dXJu
-IHRoaXMucTQoMCxILkxoKHRoaXMpLkMoIk4zPDEsMj4iKSl9LApxNChhLGIpe3ZhciBzPXRoaXMKcmV0
-dXJuIFAubDAoZnVuY3Rpb24oKXt2YXIgcj1hCnZhciBxPTAscD0xLG8sbixtLGwsawpyZXR1cm4gZnVu
-Y3Rpb24gJGFzeW5jJGdQdShjLGQpe2lmKGM9PT0xKXtvPWQKcT1wfXdoaWxlKHRydWUpc3dpdGNoKHEp
-e2Nhc2UgMDpuPXMuZ3ZjKCksbj1uLmdtKG4pLG09SC5MaChzKSxsPW0uUVsxXSxtPW0uQygiQDwxPiIp
-LktxKGwpLkMoIk4zPDEsMj4iKQpjYXNlIDI6aWYoIW4uRigpKXtxPTMKYnJlYWt9az1uLmdsKCkKcT00
-CnJldHVybiBuZXcgUC5OMyhrLGwuYShzLnEoMCxrKSksbSkKY2FzZSA0OnE9MgpicmVhawpjYXNlIDM6
-cmV0dXJuIFAuVGgoKQpjYXNlIDE6cmV0dXJuIFAuWW0obyl9fX0sYil9LAokaVowOjF9CkguTFAucHJv
-dG90eXBlPXsKZ0EoYSl7cmV0dXJuIHRoaXMuYX0sCng0KGEpe2lmKHR5cGVvZiBhIT0ic3RyaW5nIily
-ZXR1cm4hMQppZigiX19wcm90b19fIj09PWEpcmV0dXJuITEKcmV0dXJuIHRoaXMuYi5oYXNPd25Qcm9w
-ZXJ0eShhKX0sCnEoYSxiKXtpZighdGhpcy54NChiKSlyZXR1cm4gbnVsbApyZXR1cm4gdGhpcy5iW0gu
-bihiKV19LApLKGEsYil7dmFyIHMscixxLHAsbyxuPXRoaXMuJHRpCm4uQygifigxLDIpIikuYShiKQpz
-PXRoaXMuYwpmb3Iocj1zLmxlbmd0aCxxPXRoaXMuYixuPW4uUVsxXSxwPTA7cDxyOysrcCl7bz1ILm4o
-c1twXSkKYi4kMihvLG4uYShxW29dKSl9fSwKZ3ZjKCl7cmV0dXJuIG5ldyBILlhSKHRoaXMsdGhpcy4k
-dGkuQygiWFI8MT4iKSl9fQpILlhSLnByb3RvdHlwZT17CmdtKGEpe3ZhciBzPXRoaXMuYS5jCnJldHVy
-biBuZXcgSi5tMShzLHMubGVuZ3RoLEgudDYocykuQygibTE8MT4iKSl9LApnQShhKXtyZXR1cm4gdGhp
-cy5hLmMubGVuZ3RofX0KSC5MSS5wcm90b3R5cGU9ewpnV2EoKXt2YXIgcz10aGlzLmEKcmV0dXJuIHN9
-LApnbmQoKXt2YXIgcyxyLHEscCxvPXRoaXMKaWYoby5jPT09MSlyZXR1cm4gQy5oVQpzPW8uZApyPXMu
-bGVuZ3RoLW8uZS5sZW5ndGgtby5mCmlmKHI9PT0wKXJldHVybiBDLmhVCnE9W10KZm9yKHA9MDtwPHI7
-KytwKXtpZihwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLHApCnEucHVzaChzW3BdKX1yZXR1cm4gSi56
-QyhxKX0sCmdWbSgpe3ZhciBzLHIscSxwLG8sbixtLGwsaz10aGlzCmlmKGsuYyE9PTApcmV0dXJuIEMu
-V08Kcz1rLmUKcj1zLmxlbmd0aApxPWsuZApwPXEubGVuZ3RoLXItay5mCmlmKHI9PT0wKXJldHVybiBD
-LldPCm89bmV3IEguTjUodC5lbykKZm9yKG49MDtuPHI7KytuKXtpZihuPj1zLmxlbmd0aClyZXR1cm4g
-SC5PSChzLG4pCm09c1tuXQpsPXArbgppZihsPDB8fGw+PXEubGVuZ3RoKXJldHVybiBILk9IKHEsbCkK
-by5ZNSgwLG5ldyBILnd2KG0pLHFbbF0pfXJldHVybiBuZXcgSC5QRChvLHQuZ0YpfSwKJGl2UToxfQpI
-LkNqLnByb3RvdHlwZT17CiQyKGEsYil7dmFyIHMKSC5uKGEpCnM9dGhpcy5hCnMuYj1zLmIrIiQiK2EK
-Qy5ObS5pKHRoaXMuYixhKQpDLk5tLmkodGhpcy5jLGIpOysrcy5hfSwKJFM6MTF9CkguZjkucHJvdG90
-eXBlPXsKcVMoYSl7dmFyIHMscixxPXRoaXMscD1uZXcgUmVnRXhwKHEuYSkuZXhlYyhhKQppZihwPT1u
-dWxsKXJldHVybiBudWxsCnM9T2JqZWN0LmNyZWF0ZShudWxsKQpyPXEuYgppZihyIT09LTEpcy5hcmd1
-bWVudHM9cFtyKzFdCnI9cS5jCmlmKHIhPT0tMSlzLmFyZ3VtZW50c0V4cHI9cFtyKzFdCnI9cS5kCmlm
-KHIhPT0tMSlzLmV4cHI9cFtyKzFdCnI9cS5lCmlmKHIhPT0tMSlzLm1ldGhvZD1wW3IrMV0Kcj1xLmYK
-aWYociE9PS0xKXMucmVjZWl2ZXI9cFtyKzFdCnJldHVybiBzfX0KSC5XMC5wcm90b3R5cGU9ewp3KGEp
-e3ZhciBzPXRoaXMuYgppZihzPT1udWxsKXJldHVybiJOb1N1Y2hNZXRob2RFcnJvcjogIit0aGlzLmEK
-cmV0dXJuIk5vU3VjaE1ldGhvZEVycm9yOiBtZXRob2Qgbm90IGZvdW5kOiAnIitzKyInIG9uIG51bGwi
-fX0KSC5hei5wcm90b3R5cGU9ewp3KGEpe3ZhciBzLHI9dGhpcyxxPSJOb1N1Y2hNZXRob2RFcnJvcjog
-bWV0aG9kIG5vdCBmb3VuZDogJyIscD1yLmIKaWYocD09bnVsbClyZXR1cm4iTm9TdWNoTWV0aG9kRXJy
-b3I6ICIrci5hCnM9ci5jCmlmKHM9PW51bGwpcmV0dXJuIHErcCsiJyAoIityLmErIikiCnJldHVybiBx
-K3ArIicgb24gJyIrcysiJyAoIityLmErIikifX0KSC52Vi5wcm90b3R5cGU9ewp3KGEpe3ZhciBzPXRo
-aXMuYQpyZXR1cm4gcy5sZW5ndGg9PT0wPyJFcnJvciI6IkVycm9yOiAiK3N9fQpILnRlLnByb3RvdHlw
-ZT17CncoYSl7cmV0dXJuIlRocm93IG9mIG51bGwgKCciKyh0aGlzLmE9PT1udWxsPyJudWxsIjoidW5k
-ZWZpbmVkIikrIicgZnJvbSBKYXZhU2NyaXB0KSJ9LAokaVJ6OjF9CkguYnEucHJvdG90eXBlPXt9Ckgu
-WE8ucHJvdG90eXBlPXsKdyhhKXt2YXIgcyxyPXRoaXMuYgppZihyIT1udWxsKXJldHVybiByCnI9dGhp
-cy5hCnM9ciE9PW51bGwmJnR5cGVvZiByPT09Im9iamVjdCI/ci5zdGFjazpudWxsCnJldHVybiB0aGlz
-LmI9cz09bnVsbD8iIjpzfSwKJGlHejoxfQpILlRwLnByb3RvdHlwZT17CncoYSl7dmFyIHM9dGhpcy5j
-b25zdHJ1Y3RvcixyPXM9PW51bGw/bnVsbDpzLm5hbWUKcmV0dXJuIkNsb3N1cmUgJyIrSC5OUShyPT1u
-dWxsPyJ1bmtub3duIjpyKSsiJyJ9LAokaUVIOjEsCmdLdSgpe3JldHVybiB0aGlzfSwKJEM6IiQxIiwK
-JFI6MSwKJEQ6bnVsbH0KSC5BeS5wcm90b3R5cGU9eyRDOiIkMCIsJFI6MH0KSC5FMS5wcm90b3R5cGU9
-eyRDOiIkMiIsJFI6Mn0KSC5sYy5wcm90b3R5cGU9e30KSC56eC5wcm90b3R5cGU9ewp3KGEpe3ZhciBz
-PXRoaXMuJHN0YXRpY19uYW1lCmlmKHM9PW51bGwpcmV0dXJuIkNsb3N1cmUgb2YgdW5rbm93biBzdGF0
-aWMgbWV0aG9kIgpyZXR1cm4iQ2xvc3VyZSAnIitILk5RKHMpKyInIn19CkguclQucHJvdG90eXBlPXsK
-RE4oYSxiKXtpZihiPT1udWxsKXJldHVybiExCmlmKHRoaXM9PT1iKXJldHVybiEwCmlmKCEoYiBpbnN0
-YW5jZW9mIEguclQpKXJldHVybiExCnJldHVybiB0aGlzLiRfdGFyZ2V0PT09Yi4kX3RhcmdldCYmdGhp
-cy5hPT09Yi5hfSwKZ2lPKGEpe3JldHVybihILkNVKHRoaXMuYSleSC5lUSh0aGlzLiRfdGFyZ2V0KSk+
-Pj4wfSwKdyhhKXtyZXR1cm4iQ2xvc3VyZSAnIit0aGlzLiRfbmFtZSsiJyBvZiAiKygiSW5zdGFuY2Ug
-b2YgJyIrSC5saCh0LksuYSh0aGlzLmEpKSsiJyIpfX0KSC5FcS5wcm90b3R5cGU9ewp3KGEpe3JldHVy
-biJSdW50aW1lRXJyb3I6ICIrdGhpcy5hfX0KSC5rWS5wcm90b3R5cGU9ewp3KGEpe3JldHVybiJBc3Nl
-cnRpb24gZmFpbGVkOiAiK1AuaGwodGhpcy5hKX19Ckgua3IucHJvdG90eXBlPXt9CkguTjUucHJvdG90
-eXBlPXsKZ0EoYSl7cmV0dXJuIHRoaXMuYX0sCmdsMChhKXtyZXR1cm4gdGhpcy5hPT09MH0sCmdvcihh
-KXtyZXR1cm4hdGhpcy5nbDAodGhpcyl9LApndmMoKXtyZXR1cm4gbmV3IEguaTUodGhpcyxILkxoKHRo
-aXMpLkMoImk1PDE+IikpfSwKeDQoYSl7dmFyIHM9dGhpcy5iCmlmKHM9PW51bGwpcmV0dXJuITEKcmV0
-dXJuIHRoaXMuWHUocyxhKX0sCnEoYSxiKXt2YXIgcyxyLHEscCxvPXRoaXMsbj1udWxsCmlmKHR5cGVv
-ZiBiPT0ic3RyaW5nIil7cz1vLmIKaWYocz09bnVsbClyZXR1cm4gbgpyPW8uajIocyxiKQpxPXI9PW51
-bGw/bjpyLmIKcmV0dXJuIHF9ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciImJihiJjB4M2ZmZmZmZik9
-PT1iKXtwPW8uYwppZihwPT1udWxsKXJldHVybiBuCnI9by5qMihwLGIpCnE9cj09bnVsbD9uOnIuYgpy
-ZXR1cm4gcX1lbHNlIHJldHVybiBvLmFhKGIpfSwKYWEoYSl7dmFyIHMscixxPXRoaXMscD1xLmQKaWYo
-cD09bnVsbClyZXR1cm4gbnVsbApzPXEuQnQocCxxLnhpKGEpKQpyPXEuRmgocyxhKQppZihyPDApcmV0
-dXJuIG51bGwKcmV0dXJuIHNbcl0uYn0sClk1KGEsYixjKXt2YXIgcyxyLHE9dGhpcyxwPUguTGgocSkK
-cC5jLmEoYikKcC5RWzFdLmEoYykKaWYodHlwZW9mIGI9PSJzdHJpbmciKXtzPXEuYgpxLkVIKHM9PW51
-bGw/cS5iPXEueksoKTpzLGIsYyl9ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciImJihiJjB4M2ZmZmZm
-Zik9PT1iKXtyPXEuYwpxLkVIKHI9PW51bGw/cS5jPXEueksoKTpyLGIsYyl9ZWxzZSBxLnh3KGIsYyl9
-LAp4dyhhLGIpe3ZhciBzLHIscSxwLG89dGhpcyxuPUguTGgobykKbi5jLmEoYSkKbi5RWzFdLmEoYikK
-cz1vLmQKaWYocz09bnVsbClzPW8uZD1vLnpLKCkKcj1vLnhpKGEpCnE9by5CdChzLHIpCmlmKHE9PW51
-bGwpby5FSShzLHIsW28uSG4oYSxiKV0pCmVsc2V7cD1vLkZoKHEsYSkKaWYocD49MClxW3BdLmI9Ygpl
-bHNlIHEucHVzaChvLkhuKGEsYikpfX0sCksoYSxiKXt2YXIgcyxyLHE9dGhpcwpILkxoKHEpLkMoIn4o
-MSwyKSIpLmEoYikKcz1xLmUKcj1xLnIKZm9yKDtzIT1udWxsOyl7Yi4kMihzLmEscy5iKQppZihyIT09
-cS5yKXRocm93IEguYihQLmE0KHEpKQpzPXMuY319LApFSChhLGIsYyl7dmFyIHMscj10aGlzLHE9SC5M
-aChyKQpxLmMuYShiKQpxLlFbMV0uYShjKQpzPXIuajIoYSxiKQppZihzPT1udWxsKXIuRUkoYSxiLHIu
-SG4oYixjKSkKZWxzZSBzLmI9Y30sCmtzKCl7dGhpcy5yPXRoaXMucisxJjY3MTA4ODYzfSwKSG4oYSxi
-KXt2YXIgcz10aGlzLHI9SC5MaChzKSxxPW5ldyBILnZoKHIuYy5hKGEpLHIuUVsxXS5hKGIpKQppZihz
-LmU9PW51bGwpcy5lPXMuZj1xCmVsc2V7cj1zLmYKci50b1N0cmluZwpxLmQ9cgpzLmY9ci5jPXF9Kytz
-LmEKcy5rcygpCnJldHVybiBxfSwKeGkoYSl7cmV0dXJuIEouaGYoYSkmMHgzZmZmZmZmfSwKRmgoYSxi
-KXt2YXIgcyxyCmlmKGE9PW51bGwpcmV0dXJuLTEKcz1hLmxlbmd0aApmb3Iocj0wO3I8czsrK3IpaWYo
-Si5STShhW3JdLmEsYikpcmV0dXJuIHIKcmV0dXJuLTF9LAp3KGEpe3JldHVybiBQLm5PKHRoaXMpfSwK
-ajIoYSxiKXtyZXR1cm4gYVtiXX0sCkJ0KGEsYil7cmV0dXJuIGFbYl19LApFSShhLGIsYyl7YVtiXT1j
-fSwKcm4oYSxiKXtkZWxldGUgYVtiXX0sClh1KGEsYil7cmV0dXJuIHRoaXMuajIoYSxiKSE9bnVsbH0s
-CnpLKCl7dmFyIHM9Ijxub24taWRlbnRpZmllci1rZXk+IixyPU9iamVjdC5jcmVhdGUobnVsbCkKdGhp
-cy5FSShyLHMscikKdGhpcy5ybihyLHMpCnJldHVybiByfSwKJGlGbzoxfQpILnZoLnByb3RvdHlwZT17
-fQpILmk1LnByb3RvdHlwZT17CmdBKGEpe3JldHVybiB0aGlzLmEuYX0sCmdsMChhKXtyZXR1cm4gdGhp
-cy5hLmE9PT0wfSwKZ20oYSl7dmFyIHM9dGhpcy5hLHI9bmV3IEguTjYocyxzLnIsdGhpcy4kdGkuQygi
-TjY8MT4iKSkKci5jPXMuZQpyZXR1cm4gcn0sCnRnKGEsYil7cmV0dXJuIHRoaXMuYS54NChiKX19Ckgu
-TjYucHJvdG90eXBlPXsKZ2woKXtyZXR1cm4gdGhpcy5kfSwKRigpe3ZhciBzLHI9dGhpcyxxPXIuYQpp
-ZihyLmIhPT1xLnIpdGhyb3cgSC5iKFAuYTQocSkpCnM9ci5jCmlmKHM9PW51bGwpe3Iuc3FZKG51bGwp
-CnJldHVybiExfWVsc2V7ci5zcVkocy5hKQpyLmM9cy5jCnJldHVybiEwfX0sCnNxWShhKXt0aGlzLmQ9
-dGhpcy4kdGkuQygiMT8iKS5hKGEpfSwKJGlBbjoxfQpILmRDLnByb3RvdHlwZT17CiQxKGEpe3JldHVy
-biB0aGlzLmEoYSl9LAokUzo0fQpILndOLnByb3RvdHlwZT17CiQyKGEsYil7cmV0dXJuIHRoaXMuYShh
-LGIpfSwKJFM6NTB9CkguVlgucHJvdG90eXBlPXsKJDEoYSl7cmV0dXJuIHRoaXMuYShILm4oYSkpfSwK
-JFM6MjF9CkguVlIucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4iUmVnRXhwLyIrdGhpcy5hKyIvIit0aGlz
-LmIuZmxhZ3N9LApnSGMoKXt2YXIgcz10aGlzLHI9cy5jCmlmKHIhPW51bGwpcmV0dXJuIHIKcj1zLmIK
-cmV0dXJuIHMuYz1ILnY0KHMuYSxyLm11bHRpbGluZSwhci5pZ25vcmVDYXNlLHIudW5pY29kZSxyLmRv
-dEFsbCwhMCl9LApkZChhLGIpe3JldHVybiBuZXcgSC5LVyh0aGlzLGIsMCl9LApVWihhLGIpe3ZhciBz
-LHI9dC5LLmEodGhpcy5nSGMoKSkKci5sYXN0SW5kZXg9YgpzPXIuZXhlYyhhKQppZihzPT1udWxsKXJl
-dHVybiBudWxsCnJldHVybiBuZXcgSC5FSyhzKX0sCiRpdlg6MSwKJGl3TDoxfQpILkVLLnByb3RvdHlw
-ZT17CnEoYSxiKXt2YXIgcwpILklaKGIpCnM9dGhpcy5iCmlmKGI+PXMubGVuZ3RoKXJldHVybiBILk9I
-KHMsYikKcmV0dXJuIHNbYl19LAokaU9kOjEsCiRpaWI6MX0KSC5LVy5wcm90b3R5cGU9ewpnbShhKXty
-ZXR1cm4gbmV3IEguUGIodGhpcy5hLHRoaXMuYix0aGlzLmMpfX0KSC5QYi5wcm90b3R5cGU9ewpnbCgp
-e3JldHVybiB0LmN6LmEodGhpcy5kKX0sCkYoKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9bS5iCmlm
-KGw9PW51bGwpcmV0dXJuITEKcz1tLmMKcj1sLmxlbmd0aAppZihzPD1yKXtxPW0uYQpwPXEuVVoobCxz
-KQppZihwIT1udWxsKXttLmQ9cApzPXAuYgpvPXMuaW5kZXgKbj1vK3NbMF0ubGVuZ3RoCmlmKG89PT1u
-KXtpZihxLmIudW5pY29kZSl7cz1tLmMKcT1zKzEKaWYocTxyKXtzPUMueEIuTyhsLHMpCmlmKHM+PTU1
-Mjk2JiZzPD01NjMxOSl7cz1DLnhCLk8obCxxKQpzPXM+PTU2MzIwJiZzPD01NzM0M31lbHNlIHM9ITF9
-ZWxzZSBzPSExfWVsc2Ugcz0hMQpuPShzP24rMTpuKSsxfW0uYz1uCnJldHVybiEwfX1tLmI9bS5kPW51
-bGwKcmV0dXJuITF9LAokaUFuOjF9CkgudFEucHJvdG90eXBlPXsKcShhLGIpe0guSVooYikKaWYoYiE9
-PTApSC52KFAuTzcoYixudWxsKSkKcmV0dXJuIHRoaXMuY30sCiRpT2Q6MX0KSC51bi5wcm90b3R5cGU9
-ewpnbShhKXtyZXR1cm4gbmV3IEguU2QodGhpcy5hLHRoaXMuYix0aGlzLmMpfX0KSC5TZC5wcm90b3R5
-cGU9ewpGKCl7dmFyIHMscixxPXRoaXMscD1xLmMsbz1xLmIsbj1vLmxlbmd0aCxtPXEuYSxsPW0ubGVu
-Z3RoCmlmKHArbj5sKXtxLmQ9bnVsbApyZXR1cm4hMX1zPW0uaW5kZXhPZihvLHApCmlmKHM8MCl7cS5j
-PWwrMQpxLmQ9bnVsbApyZXR1cm4hMX1yPXMrbgpxLmQ9bmV3IEgudFEocyxvKQpxLmM9cj09PXEuYz9y
-KzE6cgpyZXR1cm4hMH0sCmdsKCl7dmFyIHM9dGhpcy5kCnMudG9TdHJpbmcKcmV0dXJuIHN9LAokaUFu
-OjF9CkguRVQucHJvdG90eXBlPXskaUVUOjEsJGlBUzoxfQpILkxaLnByb3RvdHlwZT17CmdBKGEpe3Jl
-dHVybiBhLmxlbmd0aH0sCiRpWGo6MX0KSC5EZy5wcm90b3R5cGU9ewpxKGEsYil7SC5JWihiKQpILm9k
-KGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19LApZNShhLGIsYyl7SC5yVihjKQpILm9kKGIsYSxhLmxl
-bmd0aCkKYVtiXT1jfSwKJGliUToxLAokaWNYOjEsCiRpek06MX0KSC5QZy5wcm90b3R5cGU9ewpZNShh
-LGIsYyl7SC5JWihjKQpILm9kKGIsYSxhLmxlbmd0aCkKYVtiXT1jfSwKJGliUToxLAokaWNYOjEsCiRp
-ek06MX0KSC54ai5wcm90b3R5cGU9ewpxKGEsYil7SC5JWihiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0
-dXJuIGFbYl19fQpILmRFLnByb3RvdHlwZT17CnEoYSxiKXtILklaKGIpCkgub2QoYixhLGEubGVuZ3Ro
-KQpyZXR1cm4gYVtiXX19CkguWkEucHJvdG90eXBlPXsKcShhLGIpe0guSVooYikKSC5vZChiLGEsYS5s
-ZW5ndGgpCnJldHVybiBhW2JdfX0KSC5kVC5wcm90b3R5cGU9ewpxKGEsYil7SC5JWihiKQpILm9kKGIs
-YSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILlBxLnByb3RvdHlwZT17CnEoYSxiKXtILklaKGIpCkgu
-b2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguZUUucHJvdG90eXBlPXsKZ0EoYSl7cmV0dXJu
-IGEubGVuZ3RofSwKcShhLGIpe0guSVooYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0K
-SC5WNi5wcm90b3R5cGU9ewpnQShhKXtyZXR1cm4gYS5sZW5ndGh9LApxKGEsYil7SC5JWihiKQpILm9k
-KGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19LAokaW42OjF9CkguUkcucHJvdG90eXBlPXt9CkguVlAu
-cHJvdG90eXBlPXt9CkguV0IucHJvdG90eXBlPXt9CkguWkcucHJvdG90eXBlPXt9CkguSmMucHJvdG90
-eXBlPXsKQyhhKXtyZXR1cm4gSC5jRSh2LnR5cGVVbml2ZXJzZSx0aGlzLGEpfSwKS3EoYSl7cmV0dXJu
-IEgudjUodi50eXBlVW5pdmVyc2UsdGhpcyxhKX19CkguRy5wcm90b3R5cGU9e30KSC5rUy5wcm90b3R5
-cGU9ewp3KGEpe3JldHVybiB0aGlzLmF9fQpILmlNLnByb3RvdHlwZT17JGlFejoxfQpQLnRoLnByb3Rv
-dHlwZT17CiQxKGEpe3ZhciBzPXRoaXMuYSxyPXMuYQpzLmE9bnVsbApyLiQwKCl9LAokUzoxM30KUC5o
-YS5wcm90b3R5cGU9ewokMShhKXt2YXIgcyxyCnRoaXMuYS5hPXQuTS5hKGEpCnM9dGhpcy5iCnI9dGhp
-cy5jCnMuZmlyc3RDaGlsZD9zLnJlbW92ZUNoaWxkKHIpOnMuYXBwZW5kQ2hpbGQocil9LAokUzo0MX0K
-UC5Wcy5wcm90b3R5cGU9ewokMCgpe3RoaXMuYS4kMCgpfSwKJFM6MTV9ClAuRnQucHJvdG90eXBlPXsK
-JDAoKXt0aGlzLmEuJDAoKX0sCiRTOjE1fQpQLlczLnByb3RvdHlwZT17CkNZKGEsYil7aWYoc2VsZi5z
-ZXRUaW1lb3V0IT1udWxsKXNlbGYuc2V0VGltZW91dChILnRSKG5ldyBQLnlIKHRoaXMsYiksMCksYSkK
-ZWxzZSB0aHJvdyBILmIoUC5MNCgiYHNldFRpbWVvdXQoKWAgbm90IGZvdW5kLiIpKX19ClAueUgucHJv
-dG90eXBlPXsKJDAoKXt0aGlzLmIuJDAoKX0sCiRTOjB9ClAuaWgucHJvdG90eXBlPXsKYU0oYSxiKXt2
-YXIgcyxyPXRoaXMscT1yLiR0aQpxLkMoIjEvPyIpLmEoYikKaWYoYj09bnVsbCliPXEuYy5hKGIpCmlm
-KCFyLmIpci5hLlhmKGIpCmVsc2V7cz1yLmEKaWYocS5DKCJiODwxPiIpLmIoYikpcy5jVShiKQplbHNl
-IHMuWDIocS5jLmEoYikpfX0sCncwKGEsYil7dmFyIHM9dGhpcy5hCmlmKHRoaXMuYilzLlpMKGEsYikK
-ZWxzZSBzLk5rKGEsYil9fQpQLldNLnByb3RvdHlwZT17CiQxKGEpe3JldHVybiB0aGlzLmEuJDIoMCxh
-KX0sCiRTOjUxfQpQLlNYLnByb3RvdHlwZT17CiQyKGEsYil7dGhpcy5hLiQyKDEsbmV3IEguYnEoYSx0
-LmwuYShiKSkpfSwKJFM6NTN9ClAuR3MucHJvdG90eXBlPXsKJDIoYSxiKXt0aGlzLmEoSC5JWihhKSxi
-KX0sCiRTOjQ1fQpQLkZ5LnByb3RvdHlwZT17CncoYSl7cmV0dXJuIkl0ZXJhdGlvbk1hcmtlcigiK3Ro
-aXMuYisiLCAiK0guRWoodGhpcy5hKSsiKSJ9fQpQLkdWLnByb3RvdHlwZT17CmdsKCl7dmFyIHM9dGhp
-cy5jCmlmKHM9PW51bGwpcmV0dXJuIHRoaXMuJHRpLmMuYSh0aGlzLmIpCnJldHVybiBzLmdsKCl9LApG
-KCl7dmFyIHMscixxLHAsbyxuLG09dGhpcwpmb3Iocz1tLiR0aS5DKCJBbjwxPiIpOyEwOyl7cj1tLmMK
-aWYociE9bnVsbClpZihyLkYoKSlyZXR1cm4hMAplbHNlIG0uc1g5KG51bGwpCnE9ZnVuY3Rpb24oYSxi
-LGMpe3ZhciBsLGs9Ygp3aGlsZSh0cnVlKXRyeXtyZXR1cm4gYShrLGwpfWNhdGNoKGope2w9agprPWN9
-fShtLmEsMCwxKQppZihxIGluc3RhbmNlb2YgUC5GeSl7cD1xLmIKaWYocD09PTIpe289bS5kCmlmKG89
-PW51bGx8fG8ubGVuZ3RoPT09MCl7bS5zRUMobnVsbCkKcmV0dXJuITF9aWYoMD49by5sZW5ndGgpcmV0
-dXJuIEguT0gobywtMSkKbS5hPW8ucG9wKCkKY29udGludWV9ZWxzZXtyPXEuYQppZihwPT09Myl0aHJv
-dyByCmVsc2V7bj1zLmEoSi5JVChyKSkKaWYobiBpbnN0YW5jZW9mIFAuR1Ype3I9bS5kCmlmKHI9PW51
-bGwpcj1tLmQ9W10KQy5ObS5pKHIsbS5hKQptLmE9bi5hCmNvbnRpbnVlfWVsc2V7bS5zWDkobikKY29u
-dGludWV9fX19ZWxzZXttLnNFQyhxKQpyZXR1cm4hMH19cmV0dXJuITF9LApzRUMoYSl7dGhpcy5iPXRo
-aXMuJHRpLkMoIjE/IikuYShhKX0sCnNYOShhKXt0aGlzLmM9dGhpcy4kdGkuQygiQW48MT4/IikuYShh
-KX0sCiRpQW46MX0KUC5xNC5wcm90b3R5cGU9ewpnbShhKXtyZXR1cm4gbmV3IFAuR1YodGhpcy5hKCks
-dGhpcy4kdGkuQygiR1Y8MT4iKSl9fQpQLkN3LnByb3RvdHlwZT17CncoYSl7cmV0dXJuIEguRWoodGhp
-cy5hKX0sCiRpWFM6MSwKZ0lJKCl7cmV0dXJuIHRoaXMuYn19ClAuUGYucHJvdG90eXBlPXsKdzAoYSxi
-KXt2YXIgcwpILmNiKGEsImVycm9yIix0LkspCnM9dGhpcy5hCmlmKChzLmEmMzApIT09MCl0aHJvdyBI
-LmIoUC5QVigiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIikpCmlmKGI9PW51bGwpYj1QLnYwKGEpCnMu
-TmsoYSxiKX0sCnBtKGEpe3JldHVybiB0aGlzLncwKGEsbnVsbCl9fQpQLlpmLnByb3RvdHlwZT17CmFN
-KGEsYil7dmFyIHMscj10aGlzLiR0aQpyLkMoIjEvPyIpLmEoYikKcz10aGlzLmEKaWYoKHMuYSYzMCkh
-PT0wKXRocm93IEguYihQLlBWKCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKcy5YZihyLkMoIjEv
-IikuYShiKSl9fQpQLkZlLnByb3RvdHlwZT17CkhSKGEpe2lmKCh0aGlzLmMmMTUpIT09NilyZXR1cm4h
-MApyZXR1cm4gdGhpcy5iLmIuYnYodC5hbC5hKHRoaXMuZCksYS5hLHQueSx0LkspfSwKS3coYSl7dmFy
-IHMscj10aGlzLHE9ci5lLHA9bnVsbCxvPXQueixuPXQuSyxtPWEuYSxsPXIuYi5iCmlmKHQuYS5iKHEp
-KXA9bC5ycChxLG0sYS5iLG8sbix0LmwpCmVsc2UgcD1sLmJ2KHQudi5hKHEpLG0sbyxuKQp0cnl7bz1y
-LiR0aS5DKCIyLyIpLmEocCkKcmV0dXJuIG99Y2F0Y2gocyl7aWYodC5lSy5iKEguUnUocykpKXtpZigo
-ci5jJjEpIT09MCl0aHJvdyBILmIoUC54WSgiVGhlIGVycm9yIGhhbmRsZXIgb2YgRnV0dXJlLnRoZW4g
-bXVzdCByZXR1cm4gYSB2YWx1ZSBvZiB0aGUgcmV0dXJuZWQgZnV0dXJlJ3MgdHlwZSIsIm9uRXJyb3Ii
-KSkKdGhyb3cgSC5iKFAueFkoIlRoZSBlcnJvciBoYW5kbGVyIG9mIEZ1dHVyZS5jYXRjaEVycm9yIG11
-c3QgcmV0dXJuIGEgdmFsdWUgb2YgdGhlIGZ1dHVyZSdzIHR5cGUiLCJvbkVycm9yIikpfWVsc2UgdGhy
-b3cgc319fQpQLnZzLnByb3RvdHlwZT17ClNxKGEsYixjKXt2YXIgcyxyLHEscD10aGlzLiR0aQpwLktx
-KGMpLkMoIjEvKDIpIikuYShhKQpzPSQuWDMKaWYocz09PUMuTlUpe2lmKGIhPW51bGwmJiF0LmEuYihi
-KSYmIXQudi5iKGIpKXRocm93IEguYihQLkwzKGIsIm9uRXJyb3IiLHUuYykpfWVsc2V7Yy5DKCJAPDAv
-PiIpLktxKHAuYykuQygiMSgyKSIpLmEoYSkKaWYoYiE9bnVsbCliPVAuVkgoYixzKX1yPW5ldyBQLnZz
-KHMsYy5DKCJ2czwwPiIpKQpxPWI9PW51bGw/MTozCnRoaXMueGYobmV3IFAuRmUocixxLGEsYixwLkMo
-IkA8MT4iKS5LcShjKS5DKCJGZTwxLDI+IikpKQpyZXR1cm4gcn0sClc3KGEsYil7cmV0dXJuIHRoaXMu
-U3EoYSxudWxsLGIpfSwKUWQoYSxiLGMpe3ZhciBzLHI9dGhpcy4kdGkKci5LcShjKS5DKCIxLygyKSIp
-LmEoYSkKcz1uZXcgUC52cygkLlgzLGMuQygidnM8MD4iKSkKdGhpcy54ZihuZXcgUC5GZShzLDE5LGEs
-YixyLkMoIkA8MT4iKS5LcShjKS5DKCJGZTwxLDI+IikpKQpyZXR1cm4gc30sClA5KGEpe3RoaXMuYT10
-aGlzLmEmMXwxNgp0aGlzLmM9YX0sCnVnKGEpe3RoaXMuYT1hLmEmMzB8dGhpcy5hJjEKdGhpcy5jPWEu
-Y30sCnhmKGEpe3ZhciBzLHI9dGhpcyxxPXIuYQppZihxPD0zKXthLmE9dC5lLmEoci5jKQpyLmM9YX1l
-bHNle2lmKChxJjQpIT09MCl7cz10LmMuYShyLmMpCmlmKChzLmEmMjQpPT09MCl7cy54ZihhKQpyZXR1
-cm59ci51ZyhzKX1QLlRrKG51bGwsbnVsbCxyLmIsdC5NLmEobmV3IFAuZGEocixhKSkpfX0sCmpRKGEp
-e3ZhciBzLHIscSxwLG8sbixtPXRoaXMsbD17fQpsLmE9YQppZihhPT1udWxsKXJldHVybgpzPW0uYQpp
-ZihzPD0zKXtyPXQuZS5hKG0uYykKbS5jPWEKaWYociE9bnVsbCl7cT1hLmEKZm9yKHA9YTtxIT1udWxs
-O3A9cSxxPW8pbz1xLmEKcC5hPXJ9fWVsc2V7aWYoKHMmNCkhPT0wKXtuPXQuYy5hKG0uYykKaWYoKG4u
-YSYyNCk9PT0wKXtuLmpRKGEpCnJldHVybn1tLnVnKG4pfWwuYT1tLk44KGEpClAuVGsobnVsbCxudWxs
-LG0uYix0Lk0uYShuZXcgUC5vUShsLG0pKSl9fSwKYWgoKXt2YXIgcz10LmUuYSh0aGlzLmMpCnRoaXMu
-Yz1udWxsCnJldHVybiB0aGlzLk44KHMpfSwKTjgoYSl7dmFyIHMscixxCmZvcihzPWEscj1udWxsO3Mh
-PW51bGw7cj1zLHM9cSl7cT1zLmEKcy5hPXJ9cmV0dXJuIHJ9LAplYyhhKXt2YXIgcyxyLHEscD10aGlz
-CnAuYV49Mgp0cnl7YS5TcShuZXcgUC5wVihwKSxuZXcgUC5VNyhwKSx0LlApfWNhdGNoKHEpe3M9SC5S
-dShxKQpyPUgudHMocSkKUC5yYihuZXcgUC52cihwLHMscikpfX0sClgyKGEpe3ZhciBzLHI9dGhpcwpy
-LiR0aS5jLmEoYSkKcz1yLmFoKCkKci5hPTgKci5jPWEKUC5IWihyLHMpfSwKWkwoYSxiKXt2YXIgcwp0
-LmwuYShiKQpzPXRoaXMuYWgoKQp0aGlzLlA5KFAuVGwoYSxiKSkKUC5IWih0aGlzLHMpfSwKWGYoYSl7
-dmFyIHM9dGhpcy4kdGkKcy5DKCIxLyIpLmEoYSkKaWYocy5DKCJiODwxPiIpLmIoYSkpe3RoaXMuY1Uo
-YSkKcmV0dXJufXRoaXMud1Uocy5jLmEoYSkpfSwKd1UoYSl7dmFyIHM9dGhpcwpzLiR0aS5jLmEoYSkK
-cy5hXj0yClAuVGsobnVsbCxudWxsLHMuYix0Lk0uYShuZXcgUC5ydChzLGEpKSl9LApjVShhKXt2YXIg
-cz10aGlzLHI9cy4kdGkKci5DKCJiODwxPiIpLmEoYSkKaWYoci5iKGEpKXtpZigoYS5hJjE2KSE9PTAp
-e3MuYV49MgpQLlRrKG51bGwsbnVsbCxzLmIsdC5NLmEobmV3IFAuS0YocyxhKSkpfWVsc2UgUC5BOShh
-LHMpCnJldHVybn1zLmVjKGEpfSwKTmsoYSxiKXt0aGlzLmFePTIKUC5UayhudWxsLG51bGwsdGhpcy5i
-LHQuTS5hKG5ldyBQLlpMKHRoaXMsYSxiKSkpfSwKJGliODoxfQpQLmRhLnByb3RvdHlwZT17CiQwKCl7
-UC5IWih0aGlzLmEsdGhpcy5iKX0sCiRTOjB9ClAub1EucHJvdG90eXBlPXsKJDAoKXtQLkhaKHRoaXMu
-Yix0aGlzLmEuYSl9LAokUzowfQpQLnBWLnByb3RvdHlwZT17CiQxKGEpe3ZhciBzLHIscSxwPXRoaXMu
-YQpwLmFePTIKdHJ5e3AuWDIocC4kdGkuYy5hKGEpKX1jYXRjaChxKXtzPUguUnUocSkKcj1ILnRzKHEp
-CnAuWkwocyxyKX19LAokUzoxM30KUC5VNy5wcm90b3R5cGU9ewokMihhLGIpe3RoaXMuYS5aTCh0Lksu
-YShhKSx0LmwuYShiKSl9LAokUzozNH0KUC52ci5wcm90b3R5cGU9ewokMCgpe3RoaXMuYS5aTCh0aGlz
-LmIsdGhpcy5jKX0sCiRTOjB9ClAucnQucHJvdG90eXBlPXsKJDAoKXt0aGlzLmEuWDIodGhpcy5iKX0s
-CiRTOjB9ClAuS0YucHJvdG90eXBlPXsKJDAoKXtQLkE5KHRoaXMuYix0aGlzLmEpfSwKJFM6MH0KUC5a
-TC5wcm90b3R5cGU9ewokMCgpe3RoaXMuYS5aTCh0aGlzLmIsdGhpcy5jKX0sCiRTOjB9ClAuUlQucHJv
-dG90eXBlPXsKJDAoKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9bnVsbAp0cnl7cT1tLmEuYQpsPXEu
-Yi5iLnp6KHQuZk8uYShxLmQpLHQueil9Y2F0Y2gocCl7cz1ILlJ1KHApCnI9SC50cyhwKQpxPW0uYyYm
-dC5uLmEobS5iLmEuYykuYT09PXMKbz1tLmEKaWYocSlvLmM9dC5uLmEobS5iLmEuYykKZWxzZSBvLmM9
-UC5UbChzLHIpCm8uYj0hMApyZXR1cm59aWYobCBpbnN0YW5jZW9mIFAudnMmJihsLmEmMjQpIT09MCl7
-aWYoKGwuYSYxNikhPT0wKXtxPW0uYQpxLmM9dC5uLmEobC5jKQpxLmI9ITB9cmV0dXJufWlmKHQuaS5i
-KGwpKXtuPW0uYi5hCnE9bS5hCnEuYz1sLlc3KG5ldyBQLmpaKG4pLHQueikKcS5iPSExfX0sCiRTOjB9
-ClAualoucHJvdG90eXBlPXsKJDEoYSl7cmV0dXJuIHRoaXMuYX0sCiRTOjI5fQpQLnJxLnByb3RvdHlw
-ZT17CiQwKCl7dmFyIHMscixxLHAsbyxuLG0sbAp0cnl7cT10aGlzLmEKcD1xLmEKbz1wLiR0aQpuPW8u
-YwptPW4uYSh0aGlzLmIpCnEuYz1wLmIuYi5idihvLkMoIjIvKDEpIikuYShwLmQpLG0sby5DKCIyLyIp
-LG4pfWNhdGNoKGwpe3M9SC5SdShsKQpyPUgudHMobCkKcT10aGlzLmEKcS5jPVAuVGwocyxyKQpxLmI9
-ITB9fSwKJFM6MH0KUC5SVy5wcm90b3R5cGU9ewokMCgpe3ZhciBzLHIscSxwLG8sbixtPXRoaXMKdHJ5
-e3M9dC5uLmEobS5hLmEuYykKcD1tLmIKaWYocC5hLkhSKHMpJiZwLmEuZSE9bnVsbCl7cC5jPXAuYS5L
-dyhzKQpwLmI9ITF9fWNhdGNoKG8pe3I9SC5SdShvKQpxPUgudHMobykKcD10Lm4uYShtLmEuYS5jKQpu
-PW0uYgppZihwLmE9PT1yKW4uYz1wCmVsc2Ugbi5jPVAuVGwocixxKQpuLmI9ITB9fSwKJFM6MH0KUC5P
-TS5wcm90b3R5cGU9e30KUC5xaC5wcm90b3R5cGU9ewpnQShhKXt2YXIgcyxyLHE9dGhpcyxwPXt9LG89
-bmV3IFAudnMoJC5YMyx0LmZKKQpwLmE9MApzPUguTGgocSkKcj1zLkMoIn4oMSk/IikuYShuZXcgUC5C
-NShwLHEpKQp0LlouYShuZXcgUC51TyhwLG8pKQpXLkpFKHEuYSxxLmIsciwhMSxzLmMpCnJldHVybiBv
-fX0KUC5CNS5wcm90b3R5cGU9ewokMShhKXtILkxoKHRoaXMuYikuYy5hKGEpOysrdGhpcy5hLmF9LAok
-Uygpe3JldHVybiBILkxoKHRoaXMuYikuQygifigxKSIpfX0KUC51Ty5wcm90b3R5cGU9ewokMCgpe3Zh
-ciBzPXRoaXMuYixyPXMuJHRpLHE9ci5DKCIxLyIpLmEodGhpcy5hLmEpLHA9cy5haCgpCnIuYy5hKHEp
-CnMuYT04CnMuYz1xClAuSFoocyxwKX0sCiRTOjB9ClAuTU8ucHJvdG90eXBlPXt9ClAua1QucHJvdG90
-eXBlPXt9ClAueEkucHJvdG90eXBlPXt9ClAubTAucHJvdG90eXBlPXskaVFtOjF9ClAuRXYucHJvdG90
-eXBlPXsKJDAoKXt2YXIgcz10LksuYShILmIodGhpcy5hKSkKcy5zdGFjaz10aGlzLmIudygwKQp0aHJv
-dyBzfSwKJFM6MH0KUC5KaS5wcm90b3R5cGU9ewpiSChhKXt2YXIgcyxyLHEscCxvCnQuTS5hKGEpCnRy
-eXtpZihDLk5VPT09JC5YMyl7YS4kMCgpCnJldHVybn1QLlQ4KG51bGwsbnVsbCx0aGlzLGEsdC5IKX1j
-YXRjaChxKXtzPUguUnUocSkKcj1ILnRzKHEpCnA9dC5LLmEocykKbz10LmwuYShyKQpQLlNpKHAsbyl9
-fSwKRGwoYSxiLGMpe3ZhciBzLHIscSxwLG8KYy5DKCJ+KDApIikuYShhKQpjLmEoYikKdHJ5e2lmKEMu
-TlU9PT0kLlgzKXthLiQxKGIpCnJldHVybn1QLnl2KG51bGwsbnVsbCx0aGlzLGEsYix0LkgsYyl9Y2F0
-Y2gocSl7cz1ILlJ1KHEpCnI9SC50cyhxKQpwPXQuSy5hKHMpCm89dC5sLmEocikKUC5TaShwLG8pfX0s
-CkdZKGEpe3JldHVybiBuZXcgUC5WcCh0aGlzLHQuTS5hKGEpKX0sClB5KGEsYil7cmV0dXJuIG5ldyBQ
-Lk9SKHRoaXMsYi5DKCJ+KDApIikuYShhKSxiKX0sCnEoYSxiKXtyZXR1cm4gbnVsbH0sCnp6KGEsYil7
-Yi5DKCIwKCkiKS5hKGEpCmlmKCQuWDM9PT1DLk5VKXJldHVybiBhLiQwKCkKcmV0dXJuIFAuVDgobnVs
-bCxudWxsLHRoaXMsYSxiKX0sCmJ2KGEsYixjLGQpe2MuQygiQDwwPiIpLktxKGQpLkMoIjEoMikiKS5h
-KGEpCmQuYShiKQppZigkLlgzPT09Qy5OVSlyZXR1cm4gYS4kMShiKQpyZXR1cm4gUC55dihudWxsLG51
-bGwsdGhpcyxhLGIsYyxkKX0sCnJwKGEsYixjLGQsZSxmKXtkLkMoIkA8MD4iKS5LcShlKS5LcShmKS5D
-KCIxKDIsMykiKS5hKGEpCmUuYShiKQpmLmEoYykKaWYoJC5YMz09PUMuTlUpcmV0dXJuIGEuJDIoYixj
-KQpyZXR1cm4gUC5ReChudWxsLG51bGwsdGhpcyxhLGIsYyxkLGUsZil9LApMaihhLGIsYyxkKXtyZXR1
-cm4gYi5DKCJAPDA+IikuS3EoYykuS3EoZCkuQygiMSgyLDMpIikuYShhKX19ClAuVnAucHJvdG90eXBl
-PXsKJDAoKXtyZXR1cm4gdGhpcy5hLmJIKHRoaXMuYil9LAokUzowfQpQLk9SLnByb3RvdHlwZT17CiQx
-KGEpe3ZhciBzPXRoaXMuYwpyZXR1cm4gdGhpcy5hLkRsKHRoaXMuYixzLmEoYSkscyl9LAokUygpe3Jl
-dHVybiB0aGlzLmMuQygifigwKSIpfX0KUC5iNi5wcm90b3R5cGU9ewpnbShhKXt2YXIgcz10aGlzLHI9
-bmV3IFAubG0ocyxzLnIsSC5MaChzKS5DKCJsbTwxPiIpKQpyLmM9cy5lCnJldHVybiByfSwKZ0EoYSl7
-cmV0dXJuIHRoaXMuYX0sCmdsMChhKXtyZXR1cm4gdGhpcy5hPT09MH0sCmdvcihhKXtyZXR1cm4gdGhp
-cy5hIT09MH0sCnRnKGEsYil7dmFyIHMscgppZihiIT09Il9fcHJvdG9fXyIpe3M9dGhpcy5iCmlmKHM9
-PW51bGwpcmV0dXJuITEKcmV0dXJuIHQuZy5hKHNbYl0pIT1udWxsfWVsc2V7cj10aGlzLlBSKGIpCnJl
-dHVybiByfX0sClBSKGEpe3ZhciBzPXRoaXMuZAppZihzPT1udWxsKXJldHVybiExCnJldHVybiB0aGlz
-LkRGKHNbdGhpcy5OKGEpXSxhKT49MH0sCmkoYSxiKXt2YXIgcyxyLHE9dGhpcwpILkxoKHEpLmMuYShi
-KQppZih0eXBlb2YgYj09InN0cmluZyImJmIhPT0iX19wcm90b19fIil7cz1xLmIKcmV0dXJuIHEuSihz
-PT1udWxsP3EuYj1QLlQyKCk6cyxiKX1lbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMTA3Mzc0
-MTgyMyk9PT1iKXtyPXEuYwpyZXR1cm4gcS5KKHI9PW51bGw/cS5jPVAuVDIoKTpyLGIpfWVsc2UgcmV0
-dXJuIHEuWShiKX0sClkoYSl7dmFyIHMscixxLHA9dGhpcwpILkxoKHApLmMuYShhKQpzPXAuZAppZihz
-PT1udWxsKXM9cC5kPVAuVDIoKQpyPXAuTihhKQpxPXNbcl0KaWYocT09bnVsbClzW3JdPVtwLnlvKGEp
-XQplbHNle2lmKHAuREYocSxhKT49MClyZXR1cm4hMQpxLnB1c2gocC55byhhKSl9cmV0dXJuITB9LApS
-KGEsYil7dmFyIHM9dGhpcwppZih0eXBlb2YgYj09InN0cmluZyImJmIhPT0iX19wcm90b19fIilyZXR1
-cm4gcy5IKHMuYixiKQplbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMTA3Mzc0MTgyMyk9PT1i
-KXJldHVybiBzLkgocy5jLGIpCmVsc2UgcmV0dXJuIHMucWcoYil9LApxZyhhKXt2YXIgcyxyLHEscCxv
-PXRoaXMsbj1vLmQKaWYobj09bnVsbClyZXR1cm4hMQpzPW8uTihhKQpyPW5bc10KcT1vLkRGKHIsYSkK
-aWYocTwwKXJldHVybiExCnA9ci5zcGxpY2UocSwxKVswXQppZigwPT09ci5sZW5ndGgpZGVsZXRlIG5b
-c10Kby5HKHApCnJldHVybiEwfSwKSihhLGIpe0guTGgodGhpcykuYy5hKGIpCmlmKHQuZy5hKGFbYl0p
-IT1udWxsKXJldHVybiExCmFbYl09dGhpcy55byhiKQpyZXR1cm4hMH0sCkgoYSxiKXt2YXIgcwppZihh
-PT1udWxsKXJldHVybiExCnM9dC5nLmEoYVtiXSkKaWYocz09bnVsbClyZXR1cm4hMQp0aGlzLkcocykK
-ZGVsZXRlIGFbYl0KcmV0dXJuITB9LApTKCl7dGhpcy5yPXRoaXMucisxJjEwNzM3NDE4MjN9LAp5byhh
-KXt2YXIgcyxyPXRoaXMscT1uZXcgUC5ibihILkxoKHIpLmMuYShhKSkKaWYoci5lPT1udWxsKXIuZT1y
-LmY9cQplbHNle3M9ci5mCnMudG9TdHJpbmcKcS5jPXMKci5mPXMuYj1xfSsrci5hCnIuUygpCnJldHVy
-biBxfSwKRyhhKXt2YXIgcz10aGlzLHI9YS5jLHE9YS5iCmlmKHI9PW51bGwpcy5lPXEKZWxzZSByLmI9
-cQppZihxPT1udWxsKXMuZj1yCmVsc2UgcS5jPXI7LS1zLmEKcy5TKCl9LApOKGEpe3JldHVybiBKLmhm
-KGEpJjEwNzM3NDE4MjN9LApERihhLGIpe3ZhciBzLHIKaWYoYT09bnVsbClyZXR1cm4tMQpzPWEubGVu
-Z3RoCmZvcihyPTA7cjxzOysrcilpZihKLlJNKGFbcl0uYSxiKSlyZXR1cm4gcgpyZXR1cm4tMX19ClAu
-Ym4ucHJvdG90eXBlPXt9ClAubG0ucHJvdG90eXBlPXsKZ2woKXtyZXR1cm4gdGhpcy4kdGkuYy5hKHRo
-aXMuZCl9LApGKCl7dmFyIHM9dGhpcyxyPXMuYyxxPXMuYQppZihzLmIhPT1xLnIpdGhyb3cgSC5iKFAu
-YTQocSkpCmVsc2UgaWYocj09bnVsbCl7cy5zaihudWxsKQpyZXR1cm4hMX1lbHNle3Muc2oocy4kdGku
-QygiMT8iKS5hKHIuYSkpCnMuYz1yLmIKcmV0dXJuITB9fSwKc2ooYSl7dGhpcy5kPXRoaXMuJHRpLkMo
-IjE/IikuYShhKX0sCiRpQW46MX0KUC5tVy5wcm90b3R5cGU9e30KUC51eS5wcm90b3R5cGU9eyRpYlE6
-MSwkaWNYOjEsJGl6TToxfQpQLmxELnByb3RvdHlwZT17CmdtKGEpe3JldHVybiBuZXcgSC5hNyhhLHRo
-aXMuZ0EoYSksSC56SyhhKS5DKCJhNzxsRC5FPiIpKX0sCkUoYSxiKXtyZXR1cm4gdGhpcy5xKGEsYil9
-LApLKGEsYil7dmFyIHMscgpILnpLKGEpLkMoIn4obEQuRSkiKS5hKGIpCnM9dGhpcy5nQShhKQpmb3Io
-cj0wO3I8czsrK3Ipe2IuJDEodGhpcy5xKGEscikpCmlmKHMhPT10aGlzLmdBKGEpKXRocm93IEguYihQ
-LmE0KGEpKX19LApnbDAoYSl7cmV0dXJuIHRoaXMuZ0EoYSk9PT0wfSwKZ29yKGEpe3JldHVybiF0aGlz
-LmdsMChhKX0sCkUyKGEsYixjKXt2YXIgcz1ILnpLKGEpCnJldHVybiBuZXcgSC5sSihhLHMuS3EoYyku
-QygiMShsRC5FKSIpLmEoYikscy5DKCJAPGxELkU+IikuS3EoYykuQygibEo8MSwyPiIpKX0sCmVSKGEs
-Yil7cmV0dXJuIEgucUMoYSxiLG51bGwsSC56SyhhKS5DKCJsRC5FIikpfSwKZHIoYSxiKXtyZXR1cm4g
-bmV3IEgualYoYSxILnpLKGEpLkMoIkA8bEQuRT4iKS5LcShiKS5DKCJqVjwxLDI+IikpfSwKZHUoYSxi
-LGMsZCl7dmFyIHMscj1ILnpLKGEpCmQ9ci5DKCJsRC5FIikuYShyLkMoImxELkU/IikuYShkKSkKUC5q
-QihiLGMsdGhpcy5nQShhKSkKZm9yKHM9YjtzPGM7KytzKXRoaXMuWTUoYSxzLGQpfSwKdyhhKXtyZXR1
-cm4gUC54KGEsIlsiLCJdIil9fQpQLmlsLnByb3RvdHlwZT17fQpQLnJhLnByb3RvdHlwZT17CiQyKGEs
-Yil7dmFyIHMscj10aGlzLmEKaWYoIXIuYSl0aGlzLmIuYSs9IiwgIgpyLmE9ITEKcj10aGlzLmIKcz1y
-LmErPUguRWooYSkKci5hPXMrIjogIgpyLmErPUguRWooYil9LAokUzo5fQpQLllrLnByb3RvdHlwZT17
-CksoYSxiKXt2YXIgcyxyLHE9SC5MaCh0aGlzKQpxLkMoIn4oWWsuSyxZay5WKSIpLmEoYikKZm9yKHM9
-Si5JVCh0aGlzLmd2YygpKSxxPXEuQygiWWsuViIpO3MuRigpOyl7cj1zLmdsKCkKYi4kMihyLHEuYSh0
-aGlzLnEoMCxyKSkpfX0sCmdQdShhKXtyZXR1cm4gSi5NMSh0aGlzLmd2YygpLG5ldyBQLnlRKHRoaXMp
-LEguTGgodGhpcykuQygiTjM8WWsuSyxZay5WPiIpKX0sCng0KGEpe3JldHVybiBKLnpsKHRoaXMuZ3Zj
-KCksYSl9LApnQShhKXtyZXR1cm4gSi5IbSh0aGlzLmd2YygpKX0sCmdsMChhKXtyZXR1cm4gSi51VSh0
-aGlzLmd2YygpKX0sCncoYSl7cmV0dXJuIFAubk8odGhpcyl9LAokaVowOjF9ClAueVEucHJvdG90eXBl
-PXsKJDEoYSl7dmFyIHMscj10aGlzLmEscT1ILkxoKHIpCnEuQygiWWsuSyIpLmEoYSkKcz1xLkMoIllr
-LlYiKQpyZXR1cm4gbmV3IFAuTjMoYSxzLmEoci5xKDAsYSkpLHEuQygiQDxZay5LPiIpLktxKHMpLkMo
-Ik4zPDEsMj4iKSl9LAokUygpe3JldHVybiBILkxoKHRoaXMuYSkuQygiTjM8WWsuSyxZay5WPihZay5L
-KSIpfX0KUC5LUC5wcm90b3R5cGU9ewpZNShhLGIsYyl7dmFyIHM9SC5MaCh0aGlzKQpzLmMuYShiKQpz
-LlFbMV0uYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSB1bm1vZGlmaWFibGUgbWFwIikp
-fX0KUC5Qbi5wcm90b3R5cGU9ewpxKGEsYil7cmV0dXJuIHRoaXMuYS5xKDAsYil9LApZNShhLGIsYyl7
-dmFyIHM9SC5MaCh0aGlzKQp0aGlzLmEuWTUoMCxzLmMuYShiKSxzLlFbMV0uYShjKSl9LAp4NChhKXty
-ZXR1cm4gdGhpcy5hLng0KGEpfSwKSyhhLGIpe3RoaXMuYS5LKDAsSC5MaCh0aGlzKS5DKCJ+KDEsMiki
-KS5hKGIpKX0sCmdsMChhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ2wwKHMpfSwKZ0EoYSl7dmFyIHM9
-dGhpcy5hCnJldHVybiBzLmdBKHMpfSwKdyhhKXtyZXR1cm4gdGhpcy5hLncoMCl9LApnUHUoYSl7dmFy
-IHM9dGhpcy5hCnJldHVybiBzLmdQdShzKX0sCiRpWjA6MX0KUC5Hai5wcm90b3R5cGU9e30KUC5sZi5w
-cm90b3R5cGU9ewpnbDAoYSl7cmV0dXJuIHRoaXMuZ0EodGhpcyk9PT0wfSwKZ29yKGEpe3JldHVybiB0
-aGlzLmdBKHRoaXMpIT09MH0sCkZWKGEsYil7dmFyIHMKZm9yKHM9Si5JVChILkxoKHRoaXMpLkMoImNY
-PGxmLkU+IikuYShiKSk7cy5GKCk7KXRoaXMuaSgwLHMuZ2woKSl9LAp3KGEpe3JldHVybiBQLngodGhp
-cywieyIsIn0iKX0sCmsoYSxiKXt2YXIgcyxyLHE9dGhpcy5nbSh0aGlzKQppZighcS5GKCkpcmV0dXJu
-IiIKcz1xLiR0aS5jCmlmKGI9PT0iIil7cj0iIgpkbyByKz1ILkVqKHMuYShxLmQpKQp3aGlsZShxLkYo
-KSkKcz1yfWVsc2V7cj0iIitILkVqKHMuYShxLmQpKQpmb3IoO3EuRigpOylyPXIrYitILkVqKHMuYShx
-LmQpKQpzPXJ9cmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LAplUihhLGIpe3JldHVybiBILmJL
-KHRoaXMsYixILkxoKHRoaXMpLkMoImxmLkUiKSl9LApFKGEsYil7dmFyIHMscixxLHAsbz0iaW5kZXgi
-CkguY2IoYixvLHQuUykKUC5rMShiLG8pCmZvcihzPXRoaXMuZ20odGhpcykscj1zLiR0aS5jLHE9MDtz
-LkYoKTspe3A9ci5hKHMuZCkKaWYoYj09PXEpcmV0dXJuIHA7KytxfXRocm93IEguYihQLkNmKGIsdGhp
-cyxvLG51bGwscSkpfX0KUC5Wai5wcm90b3R5cGU9eyRpYlE6MSwkaWNYOjEsJGl4dToxfQpQLlh2LnBy
-b3RvdHlwZT17JGliUToxLCRpY1g6MSwkaXh1OjF9ClAublkucHJvdG90eXBlPXt9ClAuV1kucHJvdG90
-eXBlPXt9ClAuUlUucHJvdG90eXBlPXt9ClAucFIucHJvdG90eXBlPXt9ClAudXcucHJvdG90eXBlPXsK
-cShhLGIpe3ZhciBzLHI9dGhpcy5iCmlmKHI9PW51bGwpcmV0dXJuIHRoaXMuYy5xKDAsYikKZWxzZSBp
-Zih0eXBlb2YgYiE9InN0cmluZyIpcmV0dXJuIG51bGwKZWxzZXtzPXJbYl0KcmV0dXJuIHR5cGVvZiBz
-PT0idW5kZWZpbmVkIj90aGlzLmZiKGIpOnN9fSwKZ0EoYSl7dmFyIHMKaWYodGhpcy5iPT1udWxsKXtz
-PXRoaXMuYwpzPXMuZ0Eocyl9ZWxzZSBzPXRoaXMuQ2YoKS5sZW5ndGgKcmV0dXJuIHN9LApnbDAoYSl7
-cmV0dXJuIHRoaXMuZ0EodGhpcyk9PT0wfSwKZ3ZjKCl7aWYodGhpcy5iPT1udWxsKXJldHVybiB0aGlz
-LmMuZ3ZjKCkKcmV0dXJuIG5ldyBQLmk4KHRoaXMpfSwKWTUoYSxiLGMpe3ZhciBzLHIscT10aGlzCmlm
-KHEuYj09bnVsbClxLmMuWTUoMCxiLGMpCmVsc2UgaWYocS54NChiKSl7cz1xLmIKc1tiXT1jCnI9cS5h
-CmlmKHI9PW51bGw/cyE9bnVsbDpyIT09cylyW2JdPW51bGx9ZWxzZSBxLlhLKCkuWTUoMCxiLGMpfSwK
-eDQoYSl7aWYodGhpcy5iPT1udWxsKXJldHVybiB0aGlzLmMueDQoYSkKcmV0dXJuIE9iamVjdC5wcm90
-b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmEsYSl9LApLKGEsYil7dmFyIHMscixxLHAsbz10
-aGlzCnQuY0EuYShiKQppZihvLmI9PW51bGwpcmV0dXJuIG8uYy5LKDAsYikKcz1vLkNmKCkKZm9yKHI9
-MDtyPHMubGVuZ3RoOysrcil7cT1zW3JdCnA9by5iW3FdCmlmKHR5cGVvZiBwPT0idW5kZWZpbmVkIil7
-cD1QLlFlKG8uYVtxXSkKby5iW3FdPXB9Yi4kMihxLHApCmlmKHMhPT1vLmMpdGhyb3cgSC5iKFAuYTQo
-bykpfX0sCkNmKCl7dmFyIHM9dC5iTS5hKHRoaXMuYykKaWYocz09bnVsbClzPXRoaXMuYz1ILlFJKE9i
-amVjdC5rZXlzKHRoaXMuYSksdC5zKQpyZXR1cm4gc30sClhLKCl7dmFyIHMscixxLHAsbyxuPXRoaXMK
-aWYobi5iPT1udWxsKXJldHVybiBuLmMKcz1QLkZsKHQuTix0LnopCnI9bi5DZigpCmZvcihxPTA7cD1y
-Lmxlbmd0aCxxPHA7KytxKXtvPXJbcV0Kcy5ZNSgwLG8sbi5xKDAsbykpfWlmKHA9PT0wKUMuTm0uaShy
-LCIiKQplbHNlIEMuTm0uc0EociwwKQpuLmE9bi5iPW51bGwKcmV0dXJuIG4uYz1zfSwKZmIoYSl7dmFy
-IHMKaWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmEsYSkpcmV0dXJu
-IG51bGwKcz1QLlFlKHRoaXMuYVthXSkKcmV0dXJuIHRoaXMuYlthXT1zfX0KUC5pOC5wcm90b3R5cGU9
-ewpnQShhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ0Eocyl9LApFKGEsYil7dmFyIHM9dGhpcy5hCmlm
-KHMuYj09bnVsbClzPXMuZ3ZjKCkuRSgwLGIpCmVsc2V7cz1zLkNmKCkKaWYoYjwwfHxiPj1zLmxlbmd0
-aClyZXR1cm4gSC5PSChzLGIpCnM9c1tiXX1yZXR1cm4gc30sCmdtKGEpe3ZhciBzPXRoaXMuYQppZihz
-LmI9PW51bGwpe3M9cy5ndmMoKQpzPXMuZ20ocyl9ZWxzZXtzPXMuQ2YoKQpzPW5ldyBKLm0xKHMscy5s
-ZW5ndGgsSC50NihzKS5DKCJtMTwxPiIpKX1yZXR1cm4gc30sCnRnKGEsYil7cmV0dXJuIHRoaXMuYS54
-NChiKX19ClAueHIucHJvdG90eXBlPXsKJDAoKXt2YXIgcyxyCnRyeXtzPW5ldyBUZXh0RGVjb2Rlcigi
-dXRmLTgiLHtmYXRhbDp0cnVlfSkKcmV0dXJuIHN9Y2F0Y2gocil7SC5SdShyKX1yZXR1cm4gbnVsbH0s
-CiRTOjEwfQpQLk56LnByb3RvdHlwZT17CiQwKCl7dmFyIHMscgp0cnl7cz1uZXcgVGV4dERlY29kZXIo
-InV0Zi04Iix7ZmF0YWw6ZmFsc2V9KQpyZXR1cm4gc31jYXRjaChyKXtILlJ1KHIpfXJldHVybiBudWxs
-fSwKJFM6MTB9ClAuQ1YucHJvdG90eXBlPXsKeXIoYTEsYTIsYTMpe3ZhciBzLHIscSxwLG8sbixtLGws
-ayxqLGksaCxnLGYsZSxkLGMsYixhLGEwPSJJbnZhbGlkIGJhc2U2NCBlbmNvZGluZyBsZW5ndGggIgph
-Mz1QLmpCKGEyLGEzLGExLmxlbmd0aCkKcz0kLlY3KCkKZm9yKHI9cy5sZW5ndGgscT1hMixwPXEsbz1u
-dWxsLG49LTEsbT0tMSxsPTA7cTxhMztxPWspe2s9cSsxCmo9Qy54Qi5XKGExLHEpCmlmKGo9PT0zNyl7
-aT1rKzIKaWYoaTw9YTMpe2g9SC5vbyhDLnhCLlcoYTEsaykpCmc9SC5vbyhDLnhCLlcoYTEsaysxKSkK
-Zj1oKjE2K2ctKGcmMjU2KQppZihmPT09MzcpZj0tMQprPWl9ZWxzZSBmPS0xfWVsc2UgZj1qCmlmKDA8
-PWYmJmY8PTEyNyl7aWYoZjwwfHxmPj1yKXJldHVybiBILk9IKHMsZikKZT1zW2ZdCmlmKGU+PTApe2Y9
-Qy54Qi5PKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6
-MDEyMzQ1Njc4OSsvIixlKQppZihmPT09ailjb250aW51ZQpqPWZ9ZWxzZXtpZihlPT09LTEpe2lmKG48
-MCl7ZD1vPT1udWxsP251bGw6by5hLmxlbmd0aAppZihkPT1udWxsKWQ9MApuPWQrKHEtcCkKbT1xfSsr
-bAppZihqPT09NjEpY29udGludWV9aj1mfWlmKGUhPT0tMil7aWYobz09bnVsbCl7bz1uZXcgUC5NKCIi
-KQpkPW99ZWxzZSBkPW8KYz1kLmErPUMueEIuTmooYTEscCxxKQpkLmE9YytILkx3KGopCnA9awpjb250
-aW51ZX19dGhyb3cgSC5iKFAucnIoIkludmFsaWQgYmFzZTY0IGRhdGEiLGExLHEpKX1pZihvIT1udWxs
-KXtyPW8uYSs9Qy54Qi5OaihhMSxwLGEzKQpkPXIubGVuZ3RoCmlmKG4+PTApUC54TShhMSxtLGEzLG4s
-bCxkKQplbHNle2I9Qy5qbi56WShkLTEsNCkrMQppZihiPT09MSl0aHJvdyBILmIoUC5ycihhMCxhMSxh
-MykpCmZvcig7Yjw0Oyl7cis9Ij0iCm8uYT1yOysrYn19cj1vLmEKcmV0dXJuIEMueEIuaTcoYTEsYTIs
-YTMsci5jaGFyQ29kZUF0KDApPT0wP3I6cil9YT1hMy1hMgppZihuPj0wKVAueE0oYTEsbSxhMyxuLGws
-YSkKZWxzZXtiPUMuam4uelkoYSw0KQppZihiPT09MSl0aHJvdyBILmIoUC5ycihhMCxhMSxhMykpCmlm
-KGI+MSlhMT1DLnhCLmk3KGExLGEzLGEzLGI9PT0yPyI9PSI6Ij0iKX1yZXR1cm4gYTF9fQpQLlU4LnBy
-b3RvdHlwZT17fQpQLlVrLnByb3RvdHlwZT17fQpQLndJLnByb3RvdHlwZT17fQpQLlppLnByb3RvdHlw
-ZT17fQpQLlVkLnByb3RvdHlwZT17CncoYSl7dmFyIHM9UC5obCh0aGlzLmEpCnJldHVybih0aGlzLmIh
-PW51bGw/IkNvbnZlcnRpbmcgb2JqZWN0IHRvIGFuIGVuY29kYWJsZSBvYmplY3QgZmFpbGVkOiI6IkNv
-bnZlcnRpbmcgb2JqZWN0IGRpZCBub3QgcmV0dXJuIGFuIGVuY29kYWJsZSBvYmplY3Q6IikrIiAiK3N9
-fQpQLks4LnByb3RvdHlwZT17CncoYSl7cmV0dXJuIkN5Y2xpYyBlcnJvciBpbiBKU09OIHN0cmluZ2lm
-eSJ9fQpQLmJ5LnByb3RvdHlwZT17CnBXKGEsYixjKXt2YXIgcwp0LmZWLmEoYykKcz1QLkJTKGIsdGhp
-cy5nSGUoKS5hKQpyZXR1cm4gc30sCk9CKGEsYil7dmFyIHMKdC5kQS5hKGIpCnM9UC51WChhLHRoaXMu
-Z1pFKCkuYixudWxsKQpyZXR1cm4gc30sCmdaRSgpe3JldHVybiBDLm5YfSwKZ0hlKCl7cmV0dXJuIEMu
-QTN9fQpQLm9qLnByb3RvdHlwZT17fQpQLk14LnByb3RvdHlwZT17fQpQLlNoLnByb3RvdHlwZT17ClJU
-KGEpe3ZhciBzLHIscSxwLG8sbixtPWEubGVuZ3RoCmZvcihzPXRoaXMuYyxyPTAscT0wO3E8bTsrK3Ep
-e3A9Qy54Qi5XKGEscSkKaWYocD45Mil7aWYocD49NTUyOTYpe289cCY2NDUxMgppZihvPT09NTUyOTYp
-e249cSsxCm49IShuPG0mJihDLnhCLlcoYSxuKSY2NDUxMik9PT01NjMyMCl9ZWxzZSBuPSExCmlmKCFu
-KWlmKG89PT01NjMyMCl7bz1xLTEKbz0hKG8+PTAmJihDLnhCLk8oYSxvKSY2NDUxMik9PT01NTI5Nil9
-ZWxzZSBvPSExCmVsc2Ugbz0hMAppZihvKXtpZihxPnIpcy5hKz1DLnhCLk5qKGEscixxKQpyPXErMQpv
-PXMuYSs9SC5Mdyg5MikKbys9SC5MdygxMTcpCnMuYT1vCm8rPUguTHcoMTAwKQpzLmE9bwpuPXA+Pj44
-JjE1Cm8rPUguTHcobjwxMD80OCtuOjg3K24pCnMuYT1vCm49cD4+PjQmMTUKbys9SC5MdyhuPDEwPzQ4
-K246ODcrbikKcy5hPW8Kbj1wJjE1CnMuYT1vK0guTHcobjwxMD80OCtuOjg3K24pfX1jb250aW51ZX1p
-ZihwPDMyKXtpZihxPnIpcy5hKz1DLnhCLk5qKGEscixxKQpyPXErMQpvPXMuYSs9SC5Mdyg5MikKc3dp
-dGNoKHApe2Nhc2UgODpzLmE9bytILkx3KDk4KQpicmVhawpjYXNlIDk6cy5hPW8rSC5MdygxMTYpCmJy
-ZWFrCmNhc2UgMTA6cy5hPW8rSC5MdygxMTApCmJyZWFrCmNhc2UgMTI6cy5hPW8rSC5MdygxMDIpCmJy
-ZWFrCmNhc2UgMTM6cy5hPW8rSC5MdygxMTQpCmJyZWFrCmRlZmF1bHQ6bys9SC5MdygxMTcpCnMuYT1v
-Cm8rPUguTHcoNDgpCnMuYT1vCm8rPUguTHcoNDgpCnMuYT1vCm49cD4+PjQmMTUKbys9SC5MdyhuPDEw
-PzQ4K246ODcrbikKcy5hPW8Kbj1wJjE1CnMuYT1vK0guTHcobjwxMD80OCtuOjg3K24pCmJyZWFrfX1l
-bHNlIGlmKHA9PT0zNHx8cD09PTkyKXtpZihxPnIpcy5hKz1DLnhCLk5qKGEscixxKQpyPXErMQpvPXMu
-YSs9SC5Mdyg5MikKcy5hPW8rSC5MdyhwKX19aWYocj09PTApcy5hKz1hCmVsc2UgaWYocjxtKXMuYSs9
-Qy54Qi5OaihhLHIsbSl9LApKbihhKXt2YXIgcyxyLHEscApmb3Iocz10aGlzLmEscj1zLmxlbmd0aCxx
-PTA7cTxyOysrcSl7cD1zW3FdCmlmKGE9PW51bGw/cD09bnVsbDphPT09cCl0aHJvdyBILmIobmV3IFAu
-SzgoYSxudWxsKSl9Qy5ObS5pKHMsYSl9LAppVShhKXt2YXIgcyxyLHEscCxvPXRoaXMKaWYoby50TShh
-KSlyZXR1cm4Kby5KbihhKQp0cnl7cz1vLmIuJDEoYSkKaWYoIW8udE0ocykpe3E9UC5HeShhLG51bGws
-by5nVksoKSkKdGhyb3cgSC5iKHEpfXE9by5hCmlmKDA+PXEubGVuZ3RoKXJldHVybiBILk9IKHEsLTEp
-CnEucG9wKCl9Y2F0Y2gocCl7cj1ILlJ1KHApCnE9UC5HeShhLHIsby5nVksoKSkKdGhyb3cgSC5iKHEp
-fX0sCnRNKGEpe3ZhciBzLHIscT10aGlzCmlmKHR5cGVvZiBhPT0ibnVtYmVyIil7aWYoIWlzRmluaXRl
-KGEpKXJldHVybiExCnEuYy5hKz1DLkNELncoYSkKcmV0dXJuITB9ZWxzZSBpZihhPT09ITApe3EuYy5h
-Kz0idHJ1ZSIKcmV0dXJuITB9ZWxzZSBpZihhPT09ITEpe3EuYy5hKz0iZmFsc2UiCnJldHVybiEwfWVs
-c2UgaWYoYT09bnVsbCl7cS5jLmErPSJudWxsIgpyZXR1cm4hMH1lbHNlIGlmKHR5cGVvZiBhPT0ic3Ry
-aW5nIil7cz1xLmMKcy5hKz0nIicKcS5SVChhKQpzLmErPSciJwpyZXR1cm4hMH1lbHNlIGlmKHQuai5i
-KGEpKXtxLkpuKGEpCnEubEsoYSkKcz1xLmEKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkK
-cy5wb3AoKQpyZXR1cm4hMH1lbHNlIGlmKHQuZi5iKGEpKXtxLkpuKGEpCnI9cS5qdyhhKQpzPXEuYQpp
-ZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnJldHVybiByfWVsc2UgcmV0dXJu
-ITF9LApsSyhhKXt2YXIgcyxyLHE9dGhpcy5jCnEuYSs9IlsiCnM9Si5VNihhKQppZihzLmdvcihhKSl7
-dGhpcy5pVShzLnEoYSwwKSkKZm9yKHI9MTtyPHMuZ0EoYSk7KytyKXtxLmErPSIsIgp0aGlzLmlVKHMu
-cShhLHIpKX19cS5hKz0iXSJ9LApqdyhhKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9e30KaWYoYS5n
-bDAoYSkpe20uYy5hKz0ie30iCnJldHVybiEwfXM9YS5nQShhKSoyCnI9UC5POChzLG51bGwsITEsdC5Y
-KQpxPWwuYT0wCmwuYj0hMAphLksoMCxuZXcgUC50aShsLHIpKQppZighbC5iKXJldHVybiExCnA9bS5j
-CnAuYSs9InsiCmZvcihvPSciJztxPHM7cSs9MixvPScsIicpe3AuYSs9bwptLlJUKEgubihyW3FdKSkK
-cC5hKz0nIjonCm49cSsxCmlmKG4+PXMpcmV0dXJuIEguT0gocixuKQptLmlVKHJbbl0pfXAuYSs9In0i
-CnJldHVybiEwfX0KUC50aS5wcm90b3R5cGU9ewokMihhLGIpe3ZhciBzLHIKaWYodHlwZW9mIGEhPSJz
-dHJpbmciKXRoaXMuYS5iPSExCnM9dGhpcy5iCnI9dGhpcy5hCkMuTm0uWTUocyxyLmErKyxhKQpDLk5t
-Llk1KHMsci5hKyssYil9LAokUzo5fQpQLnR1LnByb3RvdHlwZT17CmdWSygpe3ZhciBzPXRoaXMuYy5h
-CnJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfX0KUC51NS5wcm90b3R5cGU9ewpnWkUoKXtyZXR1
-cm4gQy5Ra319ClAuRTMucHJvdG90eXBlPXsKV0ooYSl7dmFyIHMscixxLHA9UC5qQigwLG51bGwsYS5s
-ZW5ndGgpLG89cC0wCmlmKG89PT0wKXJldHVybiBuZXcgVWludDhBcnJheSgwKQpzPW8qMwpyPW5ldyBV
-aW50OEFycmF5KHMpCnE9bmV3IFAuUncocikKaWYocS5HeChhLDAscCkhPT1wKXtDLnhCLk8oYSxwLTEp
-CnEuUk8oKX1yZXR1cm4gbmV3IFVpbnQ4QXJyYXkoci5zdWJhcnJheSgwLEguck0oMCxxLmIscykpKX19
-ClAuUncucHJvdG90eXBlPXsKUk8oKXt2YXIgcz10aGlzLHI9cy5jLHE9cy5iLHA9cy5iPXErMSxvPXIu
-bGVuZ3RoCmlmKHE+PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPTIzOQpxPXMuYj1wKzEKaWYocD49byly
-ZXR1cm4gSC5PSChyLHApCnJbcF09MTkxCnMuYj1xKzEKaWYocT49bylyZXR1cm4gSC5PSChyLHEpCnJb
-cV09MTg5fSwKTzYoYSxiKXt2YXIgcyxyLHEscCxvLG49dGhpcwppZigoYiY2NDUxMik9PT01NjMyMCl7
-cz02NTUzNisoKGEmMTAyMyk8PDEwKXxiJjEwMjMKcj1uLmMKcT1uLmIKcD1uLmI9cSsxCm89ci5sZW5n
-dGgKaWYocT49bylyZXR1cm4gSC5PSChyLHEpCnJbcV09cz4+PjE4fDI0MApxPW4uYj1wKzEKaWYocD49
-bylyZXR1cm4gSC5PSChyLHApCnJbcF09cz4+PjEyJjYzfDEyOApwPW4uYj1xKzEKaWYocT49bylyZXR1
-cm4gSC5PSChyLHEpCnJbcV09cz4+PjYmNjN8MTI4Cm4uYj1wKzEKaWYocD49bylyZXR1cm4gSC5PSChy
-LHApCnJbcF09cyY2M3wxMjgKcmV0dXJuITB9ZWxzZXtuLlJPKCkKcmV0dXJuITF9fSwKR3goYSxiLGMp
-e3ZhciBzLHIscSxwLG8sbixtLGw9dGhpcwppZihiIT09YyYmKEMueEIuTyhhLGMtMSkmNjQ1MTIpPT09
-NTUyOTYpLS1jCmZvcihzPWwuYyxyPXMubGVuZ3RoLHE9YjtxPGM7KytxKXtwPUMueEIuVyhhLHEpCmlm
-KHA8PTEyNyl7bz1sLmIKaWYobz49cilicmVhawpsLmI9bysxCnNbb109cH1lbHNle289cCY2NDUxMgpp
-ZihvPT09NTUyOTYpe2lmKGwuYis0PnIpYnJlYWsKbj1xKzEKaWYobC5PNihwLEMueEIuVyhhLG4pKSlx
-PW59ZWxzZSBpZihvPT09NTYzMjApe2lmKGwuYiszPnIpYnJlYWsKbC5STygpfWVsc2UgaWYocDw9MjA0
-Nyl7bz1sLmIKbT1vKzEKaWYobT49cilicmVhawpsLmI9bQppZihvPj1yKXJldHVybiBILk9IKHMsbykK
-c1tvXT1wPj4+NnwxOTIKbC5iPW0rMQpzW21dPXAmNjN8MTI4fWVsc2V7bz1sLmIKaWYobysyPj1yKWJy
-ZWFrCm09bC5iPW8rMQppZihvPj1yKXJldHVybiBILk9IKHMsbykKc1tvXT1wPj4+MTJ8MjI0Cm89bC5i
-PW0rMQppZihtPj1yKXJldHVybiBILk9IKHMsbSkKc1ttXT1wPj4+NiY2M3wxMjgKbC5iPW8rMQppZihv
-Pj1yKXJldHVybiBILk9IKHMsbykKc1tvXT1wJjYzfDEyOH19fXJldHVybiBxfX0KUC5HWS5wcm90b3R5
-cGU9ewpXSihhKXt2YXIgcyxyCnQuTC5hKGEpCnM9dGhpcy5hCnI9UC5reShzLGEsMCxudWxsKQppZihy
-IT1udWxsKXJldHVybiByCnJldHVybiBuZXcgUC5ieihzKS5OZShhLDAsbnVsbCwhMCl9fQpQLmJ6LnBy
-b3RvdHlwZT17Ck5lKGEsYixjLGQpe3ZhciBzLHIscSxwLG8sbj10aGlzCnQuTC5hKGEpCnM9UC5qQihi
-LGMsSi5IbShhKSkKaWYoYj09PXMpcmV0dXJuIiIKcj1QLmp5KGEsYixzKQpxPW4uaE8ociwwLHMtYiwh
-MCkKcD1uLmIKaWYoKHAmMSkhPT0wKXtvPVAuajQocCkKbi5iPTAKdGhyb3cgSC5iKFAucnIobyxhLGIr
-bi5jKSl9cmV0dXJuIHF9LApoTyhhLGIsYyxkKXt2YXIgcyxyLHE9dGhpcwppZihjLWI+MTAwMCl7cz1D
-LmpuLkJVKGIrYywyKQpyPXEuaE8oYSxiLHMsITEpCmlmKChxLmImMSkhPT0wKXJldHVybiByCnJldHVy
-biByK3EuaE8oYSxzLGMsZCl9cmV0dXJuIHEuRWgoYSxiLGMsZCl9LApFaChhLGIsYyxkKXt2YXIgcyxy
-LHEscCxvLG4sbSxsLGs9dGhpcyxqPTY1NTMzLGk9ay5iLGg9ay5jLGc9bmV3IFAuTSgiIiksZj1iKzEs
-ZT1hLmxlbmd0aAppZihiPDB8fGI+PWUpcmV0dXJuIEguT0goYSxiKQpzPWFbYl0KJGxhYmVsMCQwOmZv
-cihyPWsuYTshMDspe2Zvcig7ITA7Zj1vKXtxPUMueEIuVygiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
+LHE9MSxwLG89W10sbixtLGwsayxqLGksaCxnLGYKdmFyICRhc3luYyRoWD1QLmx6KGZ1bmN0aW9uKGQs
+ZSl7aWYoZD09PTEpe3A9ZQpzPXF9d2hpbGUodHJ1ZSlzd2l0Y2gocyl7Y2FzZSAwOnE9MwpqPXQuTgpz
+PTYKcmV0dXJuIFAualEoTC5RNihhLFAuRUYoWyJyZWdpb24iLCJyZWdpb24iLCJvZmZzZXQiLEguRWoo
+YildLGosaiksdC5HKSwkYXN5bmMkaFgpCmNhc2UgNjpuPWUKaj1uCmk9Si5VNihqKQpoPXQuZ3EKbT1u
+ZXcgVS5kMihVLmpmKGguYShpLnEoaiwiZWRpdHMiKSkpLEguayhpLnEoaiwiZXhwbGFuYXRpb24iKSks
+SC5VYyhpLnEoaiwibGluZSIpKSxILmsoaS5xKGosImRpc3BsYXlQYXRoIikpLEguayhpLnEoaiwidXJp
+UGF0aCIpKSxVLk5kKGguYShpLnEoaiwidHJhY2VzIikpKSkKTC5UMShtKQpMLkZyKGEsYixjKQpMLnlY
+KCIuZWRpdC1wYW5lbCAucGFuZWwtY29udGVudCIsITEpCnE9MQpzPTUKYnJlYWsKY2FzZSAzOnE9Mgpm
+PXAKbD1ILlJ1KGYpCms9SC50cyhmKQpMLkMyKCJjb3VsZG4ndCBsb2FkIGVkaXQgZGV0YWlscyIsbCxr
+KQpzPTUKYnJlYWsKY2FzZSAyOnM9MQpicmVhawpjYXNlIDU6cmV0dXJuIFAueUMobnVsbCxyKQpjYXNl
+IDE6cmV0dXJuIFAuZjMocCxyKX19KQpyZXR1cm4gUC5ESSgkYXN5bmMkaFgscil9LApHNyhhLGIsYyxk
+LGUpe3JldHVybiBMLkw1KGEsYixjLGQsZSl9LApMNShhLGIsYyxkLGUpe3ZhciBzPTAscj1QLkZYKHQu
+SCkscSxwPTIsbyxuPVtdLG0sbCxrLGosaSxoLGcKdmFyICRhc3luYyRHNz1QLmx6KGZ1bmN0aW9uKGYs
+YTApe2lmKGY9PT0xKXtvPWEwCnM9cH13aGlsZSh0cnVlKXN3aXRjaChzKXtjYXNlIDA6aWYoIUMueEIu
+VGMoYSwiLmRhcnQiKSl7TC5CRShhLEIud1IoKSxkKQpMLkJYKGEsbnVsbCkKaWYoZSE9bnVsbCllLiQw
+KCkKcz0xCmJyZWFrfXA9NAppPXQuTgpzPTcKcmV0dXJuIFAualEoTC5RNihhLFAuRUYoWyJpbmxpbmUi
+LCJ0cnVlIl0saSxpKSx0LkcpLCRhc3luYyRHNykKY2FzZSA3Om09YTAKTC5CRShhLEIuWWYobSksZCkK
+TC5mRyhiLGMpCmw9TC5VcyhhKQpMLkJYKGwsYikKaWYoZSE9bnVsbCllLiQwKCkKcD0yCnM9NgpicmVh
+awpjYXNlIDQ6cD0zCmc9bwprPUguUnUoZykKaj1ILnRzKGcpCkwuQzIoImNvdWxkbid0IGxvYWQgZGFy
+dCBmaWxlICIrYSxrLGopCnM9NgpicmVhawpjYXNlIDM6cz0yCmJyZWFrCmNhc2UgNjpjYXNlIDE6cmV0
+dXJuIFAueUMocSxyKQpjYXNlIDI6cmV0dXJuIFAuZjMobyxyKX19KQpyZXR1cm4gUC5ESSgkYXN5bmMk
+Rzcscil9LApHZSgpe3ZhciBzPTAscj1QLkZYKHQueikscT0xLHAsbz1bXSxuLG0sbCxrLGosaSxoLGcK
+dmFyICRhc3luYyRHZT1QLmx6KGZ1bmN0aW9uKGEsYil7aWYoYT09PTEpe3A9YgpzPXF9d2hpbGUodHJ1
+ZSlzd2l0Y2gocyl7Y2FzZSAwOmg9Ii9fcHJldmlldy9uYXZpZ2F0aW9uVHJlZS5qc29uIgpxPTMKcz02
+CnJldHVybiBQLmpRKEwuUTYoaCxDLkNNLHQuVyksJGFzeW5jJEdlKQpjYXNlIDY6aj1iCmoudG9TdHJp
+bmcKbj1qCmo9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm5hdi10cmVlIikKai50b1N0cmluZwptPWoK
+Si5sNShtLCIiKQpqPUwubUsobikKJC5JUj1qCkwudFgobSxqLCEwKQpxPTEKcz01CmJyZWFrCmNhc2Ug
+MzpxPTIKZz1wCmw9SC5SdShnKQprPUgudHMoZykKTC5DMigiY291bGRuJ3QgbG9hZCBuYXZpZ2F0aW9u
+IHRyZWUiLGwsaykKcz01CmJyZWFrCmNhc2UgMjpzPTEKYnJlYWsKY2FzZSA1OnJldHVybiBQLnlDKG51
+bGwscikKY2FzZSAxOnJldHVybiBQLmYzKHAscil9fSkKcmV0dXJuIFAuREkoJGFzeW5jJEdlLHIpfSwK
+cU8oYSl7dmFyIHMscixxPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscD1DLkNELnpRKCQuZmkoKS5v
+ZmZzZXRIZWlnaHQpLG89d2luZG93LmlubmVySGVpZ2h0Cm8udG9TdHJpbmcKcz1DLkNELnpRKCQuRFco
+KS5vZmZzZXRIZWlnaHQpCnI9cS5ib3R0b20Kci50b1N0cmluZwppZihyPm8tKHMrMTQpKUouZGgoYSkK
+ZWxzZXtvPXEudG9wCm8udG9TdHJpbmcKaWYobzxwKzE0KUouZGgoYSl9fSwKZkcoYSxiKXt2YXIgcyxy
+LHEscCxvCmlmKGEhPW51bGwpe3M9ZG9jdW1lbnQKcj1zLmdldEVsZW1lbnRCeUlkKCJvIitILkVqKGEp
+KQpxPXMucXVlcnlTZWxlY3RvcigiLmxpbmUtIitILkVqKGIpKQppZihyIT1udWxsKXtMLnFPKHIpCkou
+ZFIocikuaSgwLCJ0YXJnZXQiKX1lbHNlIGlmKHEhPW51bGwpe3M9cS5wYXJlbnRFbGVtZW50CnMudG9T
+dHJpbmcKTC5xTyhzKX1pZihxIT1udWxsKUouZFIodC5oLmEocS5wYXJlbnROb2RlKSkuaSgwLCJoaWdo
+bGlnaHQiKX1lbHNle3M9ZG9jdW1lbnQKcD10LmgKSC5EaChwLHAsIlQiLCJxdWVyeVNlbGVjdG9yQWxs
+IikKcz1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi5saW5lLW5vIikKbz1uZXcgVy53eihzLHQuUikKaWYoby5n
+QShvKT09PTApcmV0dXJuCkwucU8ocC5hKEMudDUuZ3RIKHMpKSl9fSwKYWYoYSxiLGMsZCxlKXt2YXIg
+cyxyLHEscD10LkYsbz1MLkc2KHAuYSh3aW5kb3cubG9jYXRpb24pLmhyZWYpLG49TC5hSyhwLmEod2lu
+ZG93LmxvY2F0aW9uKS5ocmVmKQppZihvIT1udWxsKXtzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJv
+IitILkVqKG8pKQppZihzIT1udWxsKUouZFIocykuUigwLCJ0YXJnZXQiKX1pZihuIT1udWxsKXtyPWRv
+Y3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5saW5lLSIrSC5FaihuKSkKaWYociE9bnVsbCl7cT1yLnBhcmVu
+dEVsZW1lbnQKcS50b1N0cmluZwpKLmRSKHEpLlIoMCwiaGlnaGxpZ2h0Iil9fWlmKGE9PXAuYSh3aW5k
+b3cubG9jYXRpb24pLnBhdGhuYW1lKXtMLmZHKGIsYykKZS4kMCgpfWVsc2V7YS50b1N0cmluZwpMLkc3
+KGEsYixjLGQsZSl9fSwKUTQoYSxiKXt2YXIgcyxyLHE9UC5oSyhhKSxwPVAuRmwodC5OLHQuZGspCmZv
+cihzPXEuZ2hZKCkscz1zLmdQdShzKSxzPXMuZ20ocyk7cy5GKCk7KXtyPXMuZ2woKQpwLlk1KDAsci5h
+LHIuYil9Zm9yKHM9Yi5nUHUoYikscz1zLmdtKHMpO3MuRigpOyl7cj1zLmdsKCkKcC5ZNSgwLHIuYSxy
+LmIpfXAuWTUoMCwiYXV0aFRva2VuIiwkLlVFKCkpCnJldHVybiBxLm5tKDAscCkuZ25EKCl9LApUMShh
+KXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpPSQuaEwoKQppLnRvU3RyaW5nCkoubDUoaSwiIikKaWYo
+YT09bnVsbCl7cz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIikKQy5MdC5zYTQocywiU2VlIGRldGFp
+bHMgYWJvdXQgYSBwcm9wb3NlZCBlZGl0LiIpCkMuTHQuc1AocyxILlFJKFsicGxhY2Vob2xkZXIiXSx0
+LnMpKQppLmFwcGVuZENoaWxkKHMpCkMuTHQuRkYocykKcmV0dXJufXI9YS5kCnIudG9TdHJpbmcKcT0k
+Lm5VKCkKcD1xLnpmKHIpCm89YS5iCm49ZG9jdW1lbnQKbT1uLnF1ZXJ5U2VsZWN0b3IoIi5yb290Iiku
+dGV4dENvbnRlbnQKbS50b1N0cmluZwpsPXEuSFAocixDLnhCLmJTKG0pKQprPWEuYwpqPW4uY3JlYXRl
+RWxlbWVudCgicCIpCmkuYXBwZW5kQ2hpbGQoaikKai5hcHBlbmRDaGlsZChuLmNyZWF0ZVRleHROb2Rl
+KEguRWoobykrIiBhdCAiKSkKcj1hLmUKci50b1N0cmluZwpxPXQuTgpxPVcuSjYoTC5RNChyLFAuRUYo
+WyJsaW5lIixKLncoayldLHEscSkpKQpxLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUobCsiOiIr
+SC5FaihrKSsiLiIpKQpqLmFwcGVuZENoaWxkKHEpCkouZGgoaikKTC5DQyhhLGkscCkKTC5GeihhLGkp
+fSwKTEgoYSxiLGMpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkPSQueVAoKQpkLnRv
+U3RyaW5nCkoubDUoZCwiIikKaWYoYi5nQShiKT09PTApe3M9ZG9jdW1lbnQKcj1zLmNyZWF0ZUVsZW1l
+bnQoInAiKQpkLmFwcGVuZENoaWxkKHIpCnIuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgiTm8g
+cHJvcG9zZWQgZWRpdHMiKSl9ZWxzZSBmb3IoZD1iLmdQdShiKSxkPWQuZ20oZCkscz10LkYscT10Lk4s
+cD10LlEsbz1wLkMoIn4oMSk/Iiksbj10LloscD1wLmM7ZC5GKCk7KXttPWQuZ2woKQpsPWRvY3VtZW50
+CnI9bC5jcmVhdGVFbGVtZW50KCJwIikKaz0kLnlQKCkKay5hcHBlbmRDaGlsZChyKQpyLmFwcGVuZENo
+aWxkKGwuY3JlYXRlVGV4dE5vZGUoSC5FaihtLmEpKyI6IikpCmo9bC5jcmVhdGVFbGVtZW50KCJ1bCIp
+CmsuYXBwZW5kQ2hpbGQoaikKZm9yKG09Si5JVChtLmIpO20uRigpOyl7az1tLmdsKCkKaT1sLmNyZWF0
+ZUVsZW1lbnQoImxpIikKai5hcHBlbmRDaGlsZChpKQpKLmRSKGkpLmkoMCwiZWRpdCIpCmg9bC5jcmVh
+dGVFbGVtZW50KCJhIikKaS5hcHBlbmRDaGlsZChoKQpoLmNsYXNzTGlzdC5hZGQoImVkaXQtbGluayIp
+Cmc9ay5jCmY9SC5FaihnKQpoLnNldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KGgp
+KS5PVSgib2Zmc2V0IiksZikKZT1rLmEKZj1ILkVqKGUpCmguc2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3
+IFcuU3kobmV3IFcuaTcoaCkpLk9VKCJsaW5lIiksZikKaC5hcHBlbmRDaGlsZChsLmNyZWF0ZVRleHRO
+b2RlKCJsaW5lICIrSC5FaihlKSkpCmY9cy5hKHdpbmRvdy5sb2NhdGlvbikucGF0aG5hbWUKZi50b1N0
+cmluZwpoLnNldEF0dHJpYnV0ZSgiaHJlZiIsTC5RNChmLFAuRUYoWyJsaW5lIixILkVqKGUpLCJvZmZz
+ZXQiLEguRWooZyldLHEscSkpKQpmPW8uYShuZXcgTC5FRShnLGUsYSkpCm4uYShudWxsKQpXLkpFKGgs
+ImNsaWNrIixmLCExLHApCmkuYXBwZW5kQ2hpbGQobC5jcmVhdGVUZXh0Tm9kZSgiOiAiK0guRWooay5i
+KSkpfX1pZihjKUwuVDEobnVsbCl9LApGcihhLGIsYyl7dmFyIHMscixxPVAuaEsoQy5FeC5nRHIodC5G
+LmEod2luZG93LmxvY2F0aW9uKSkrSC5FaihhKSkscD1QLkZsKHQuTix0LmRrKQppZihiIT1udWxsKXAu
+WTUoMCwib2Zmc2V0IixILkVqKGIpKQppZihjIT1udWxsKXAuWTUoMCwibGluZSIsSC5FaihjKSkKcC5Z
+NSgwLCJhdXRoVG9rZW4iLCQuVUUoKSkKcT1xLm5tKDAscCkKcD13aW5kb3cuaGlzdG9yeQpzPXQuegpy
+PXEuZ25EKCkKcC5wdXNoU3RhdGUobmV3IFAuQmYoW10sW10pLlB2KFAuRmwocyxzKSksIiIscil9LApF
+bihhKXt2YXIgcyxyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4dENvbnRlbnQKci50
+b1N0cmluZwpzPXIrIi8iCmlmKEMueEIubihhLHMpKXJldHVybiBDLnhCLnluKGEscy5sZW5ndGgpCmVs
+c2UgcmV0dXJuIGF9LApPdChhKXtzd2l0Y2goYS5yKXtjYXNlIEMuY3c6YnJlYWsKY2FzZSBDLldEOmEu
+cj1DLlhqCmJyZWFrCmNhc2UgQy5YajphLnI9Qy5XRApicmVhawpjYXNlIEMuZGM6dGhyb3cgSC5iKFAu
+UFYoIkZpbGUgIitILkVqKGEuYykrIiBzaG91bGQgbm90IGhhdmUgaW5kZXRlcm1pbmF0ZSBtaWdyYXRp
+b24gc3RhdHVzIikpCmRlZmF1bHQ6YnJlYWt9fSwKdGEoYSxiKXt2YXIgcyxyPSJjaGVja19ib3giLHE9
+InRpdGxlIixwPSJvcHRlZC1vdXQiLG89Im1pZ3JhdGluZyIKc3dpdGNoKGIpe2Nhc2UgQy5jdzphLmlu
+bmVyVGV4dD1yCnM9Si5ZRShhKQpzLmdQKGEpLmkoMCwiYWxyZWFkeS1taWdyYXRlZCIpCnMuZ1AoYSku
+aSgwLCJkaXNhYmxlZCIpCmEuc2V0QXR0cmlidXRlKHEsIkFscmVhZHkgbWlncmF0ZWQiKQpicmVhawpj
+YXNlIEMuV0Q6YS5pbm5lclRleHQ9cgpzPUouWUUoYSkKcy5nUChhKS5SKDAscCkKcy5nUChhKS5pKDAs
+bykKYS5zZXRBdHRyaWJ1dGUocSwiTWlncmF0aW5nIHRvIG51bGwgc2FmZXR5IikKYnJlYWsKY2FzZSBD
+LlhqOmEuaW5uZXJUZXh0PSJjaGVja19ib3hfb3V0bGluZV9ibGFuayIKcz1KLllFKGEpCnMuZ1AoYSku
+UigwLG8pCnMuZ1AoYSkuaSgwLHApCmEuc2V0QXR0cmlidXRlKHEsIk9wdGluZyBvdXQgb2YgbnVsbCBz
+YWZldHkiKQpicmVhawpkZWZhdWx0OmEuaW5uZXJUZXh0PSJpbmRldGVybWluYXRlX2NoZWNrX2JveCIK
+cz1KLllFKGEpCnMuZ1AoYSkuUigwLG8pCnMuZ1AoYSkuaSgwLHApCmEuc2V0QXR0cmlidXRlKHEsIk1p
+eGVkIHN0YXR1c2VzIG9mICdtaWdyYXRpbmcnIGFuZCAnb3B0aW5nIG91dCciKQpicmVha319LAp4bihh
+LGIpe3ZhciBzLHI9ImRpc2FibGVkIixxPWIuZ0woKQpMLnRhKGEscSkKaWYoYi5jPT09JC5EOSgpLmlu
+bmVyVGV4dCl7aWYoYiBpbnN0YW5jZW9mIEwuY0Qpe3M9Yi54CnMudG9TdHJpbmcKcz0hc31lbHNlIHM9
+ITEKaWYocyl7YS50b1N0cmluZwpKLmRSKGEpLmkoMCxyKX1lbHNle2EudG9TdHJpbmcKSi5kUihhKS5S
+KDAscil9TC50YSgkLmMwKCkscSl9fSwKQlgoYSxiKXt2YXIgcyxyLHEscD17fQpwLmE9YQphPUwuRW4o
+YSkKcC5hPWEKcz0kLkQ5KCkKcy50b1N0cmluZwpKLmRyKHMsYSkKcz1kb2N1bWVudApyPXQuaApILkRo
+KHIsciwiVCIsInF1ZXJ5U2VsZWN0b3JBbGwiKQpzPW5ldyBXLnd6KHMucXVlcnlTZWxlY3RvckFsbCgi
+Lm5hdi1wYW5lbCAubmF2LWxpbmsiKSx0LlIpCnMuSyhzLG5ldyBMLlZTKHApKQpzPSQuSVIKcT1zPT1u
+dWxsP251bGw6TC55dyhzLHAuYSkKaWYocT09bnVsbCl7cD0kLmJOKCkKcC50b1N0cmluZwpKLmRSKHAp
+LlIoMCwidmlzaWJsZSIpfWVsc2V7cD0kLmJOKCkKcC50b1N0cmluZwpKLmRSKHApLmkoMCwidmlzaWJs
+ZSIpCkwudGEoJC5jMCgpLHEuZ0woKSl9fSwKQVIoYSxiKXt2YXIgcyxyLHE9Yi5iCmlmKHE9PT0kKXE9
+SC52KG5ldyBILmMoIkZpZWxkICdwYXJlbnQnIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4iKSkKcz10
+LmgKcj1zLmEocy5hKGEucGFyZW50Tm9kZSkucGFyZW50Tm9kZSkKTC54bihyLnF1ZXJ5U2VsZWN0b3Io
+IjpzY29wZSA+IC5zdGF0dXMtaWNvbiIpLHEpCkwuQVIocixxKX0sCmJMKGEsYil7dmFyIHMscixxLHAs
+byxuLG0sbD0iOnNjb3BlID4gLnN0YXR1cy1pY29uIgpmb3Iocz1iLmQscj1zLmxlbmd0aCxxPXQuaCxw
+PTA7cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrcCl7bz1zW3BdCmEudG9TdHJp
+bmcKbj1vLmMKbi50b1N0cmluZwptPWEucXVlcnlTZWxlY3RvcignW2RhdGEtbmFtZSo9IicrVy5Maihu
+KSsnIl0nKQppZihvIGluc3RhbmNlb2YgTC52dCl7TC5iTChtLG8pCkwueG4obS5xdWVyeVNlbGVjdG9y
+KGwpLGIpfWVsc2UgTC54bihxLmEobS5wYXJlbnROb2RlKS5xdWVyeVNlbGVjdG9yKGwpLG8pfX0sCkJF
+KGEsYixjKXt2YXIgcz0iLnJlZ2lvbnMiLHI9ZG9jdW1lbnQscT1yLnF1ZXJ5U2VsZWN0b3IocykKcS50
+b1N0cmluZwpyPXIucXVlcnlTZWxlY3RvcigiLmNvZGUiKQpyLnRvU3RyaW5nCkoudEgocSxiLmEsJC5L
+RygpKQpKLnRIKHIsYi5iLCQuS0coKSkKTC5MSChhLGIuZCxjKQppZihiLmMubGVuZ3RoPDJlNSlMLkdn
+KCkKTC55WCgiLmNvZGUiLCEwKQpMLnlYKHMsITApfSwKdFgoYTAsYTEsYTIpe3ZhciBzLHIscSxwLG8s
+bixtLGwsayxqLGksaCxnLGYsZSxkPSJtYXRlcmlhbC1pY29ucyIsYz0ic3RhdHVzLWljb24iLGI9ZG9j
+dW1lbnQsYT1iLmNyZWF0ZUVsZW1lbnQoInVsIikKYTAuYXBwZW5kQ2hpbGQoYSkKZm9yKHM9YTEubGVu
+Z3RoLHI9dC5OLHE9dC5aLHA9MDtwPGExLmxlbmd0aDthMS5sZW5ndGg9PT1zfHwoMCxILmxrKShhMSks
+KytwKXtvPWExW3BdCm49Yi5jcmVhdGVFbGVtZW50KCJsaSIpCmEuYXBwZW5kQ2hpbGQobikKaWYobyBp
+bnN0YW5jZW9mIEwudnQpe209Si5ZRShuKQptLmdQKG4pLmkoMCwiZGlyIikKbD1vLmMKbC50b1N0cmlu
+ZwpuLnNldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KG4pKS5PVSgibmFtZSIpLGwp
+Cms9Yi5jcmVhdGVFbGVtZW50KCJzcGFuIikKbi5hcHBlbmRDaGlsZChrKQpsPUouWUUoaykKbC5nUChr
+KS5pKDAsImFycm93IikKbC5zaGYoaywiJiN4MjVCQzsiKQpqPWIuY3JlYXRlRWxlbWVudCgic3BhbiIp
+CkouZFIoaikuaSgwLGQpCmouaW5uZXJUZXh0PSJmb2xkZXJfb3BlbiIKbi5hcHBlbmRDaGlsZChqKQps
+PW8uYQpsLnRvU3RyaW5nCm4uYXBwZW5kQ2hpbGQoYi5jcmVhdGVUZXh0Tm9kZShsKSkKbD1vLmQKbC50
+b1N0cmluZwpMLnRYKG4sbCwhMCkKaT1iLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpsPUouWUUoaSkKbC5n
+UChpKS5pKDAsZCkKaS5pbm5lclRleHQ9ImluZGV0ZXJtaW5hdGVfY2hlY2tfYm94IgpsLmdQKGkpLmko
+MCxjKQpMLnhuKGksbykKbD1sLmdWbChpKQpoPWwuJHRpCmc9aC5DKCJ+KDEpPyIpLmEobmV3IEwuVEQo
+byxuLGkpKQpxLmEobnVsbCkKVy5KRShsLmEsbC5iLGcsITEsaC5jKQptLm1LKG4saSxqKQpMLmt6KGsp
+fWVsc2UgaWYobyBpbnN0YW5jZW9mIEwuY0Qpe2k9Yi5jcmVhdGVFbGVtZW50KCJzcGFuIikKbT1KLllF
+KGkpCm0uZ1AoaSkuaSgwLGQpCmkuaW5uZXJUZXh0PSIiCm0uZ1AoaSkuaSgwLGMpCmw9by54CmwudG9T
+dHJpbmcKaWYoIWwpbS5nUChpKS5pKDAsImRpc2FibGVkIikKTC54bihpLG8pCmlmKGwpe209bS5nVmwo
+aSkKbD1tLiR0aQpoPWwuQygifigxKT8iKS5hKG5ldyBMLklmKG8saSxuKSkKcS5hKG51bGwpClcuSkUo
+bS5hLG0uYixoLCExLGwuYyl9bi5hcHBlbmRDaGlsZChpKQptPWIuY3JlYXRlRWxlbWVudCgic3BhbiIp
+CkouZFIobSkuaSgwLGQpCm0uaW5uZXJUZXh0PSJpbnNlcnRfZHJpdmVfZmlsZSIKbi5hcHBlbmRDaGls
+ZChtKQpmPWIuY3JlYXRlRWxlbWVudCgiYSIpCm4uYXBwZW5kQ2hpbGQoZikKbT1KLllFKGYpCm0uZ1Ao
+ZikuaSgwLCJuYXYtbGluayIpCmw9by5jCmwudG9TdHJpbmcKZi5zZXRBdHRyaWJ1dGUoImRhdGEtIitu
+ZXcgVy5TeShuZXcgVy5pNyhmKSkuT1UoIm5hbWUiKSxsKQpsPW8uZApsLnRvU3RyaW5nCmYuc2V0QXR0
+cmlidXRlKCJocmVmIixMLlE0KGwsUC5GbChyLHIpKSkKbD1vLmEKbC50b1N0cmluZwpmLmFwcGVuZENo
+aWxkKGIuY3JlYXRlVGV4dE5vZGUobCkpCm09bS5nVmwoZikKbD1tLiR0aQpoPWwuQygifigxKT8iKS5h
+KG5ldyBMLnRCKCkpCnEuYShudWxsKQpXLkpFKG0uYSxtLmIsaCwhMSxsLmMpCmw9by5lCmwudG9TdHJp
+bmcKaWYobD4wKXtlPWIuY3JlYXRlRWxlbWVudCgic3BhbiIpCm4uYXBwZW5kQ2hpbGQoZSkKSi5kUihl
+KS5pKDAsImVkaXQtY291bnQiKQptPSIiK2wrIiAiCmlmKGw9PT0xKWg9InByb3Bvc2VkIGVkaXQiCmVs
+c2UgaD0icHJvcG9zZWQgZWRpdHMiCmUuc2V0QXR0cmlidXRlKCJ0aXRsZSIsbStoKQplLmFwcGVuZENo
+aWxkKGIuY3JlYXRlVGV4dE5vZGUoQy5qbi53KGwpKSl9fX19LAp1eihhLGIsYyl7dmFyIHM9ZG9jdW1l
+bnQscj1zLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpLHE9dC5RLHA9cS5DKCJ+KDEpPyIpLmEobmV3IEwu
+bTIoYSxjKSkKdC5aLmEobnVsbCkKVy5KRShyLCJjbGljayIscCwhMSxxLmMpCnE9Ui5PWChhLmEpCnEu
+dG9TdHJpbmcKci5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKHEpKQpiLmFwcGVuZENoaWxkKHIp
+fSwKRnooYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGg9YS5hCmlmKGg9PW51bGwpcmV0dXJu
+CmIudG9TdHJpbmcKcz1kb2N1bWVudApyPXMuY3JlYXRlRWxlbWVudCgicCIpCnE9Yi5hcHBlbmRDaGls
+ZChyKQpyPXMuY3JlYXRlRWxlbWVudCgic3BhbiIpCnA9dC5zCkouTXUocixILlFJKFsidHlwZS1kZXNj
+cmlwdGlvbiJdLHApKQpyLmFwcGVuZENoaWxkKHMuY3JlYXRlVGV4dE5vZGUoIkFjdGlvbnMiKSkKcS5h
+cHBlbmRDaGlsZChyKQpxLmFwcGVuZENoaWxkKHMuY3JlYXRlVGV4dE5vZGUoIjoiKSkKbz1zLmNyZWF0
+ZUVsZW1lbnQoInAiKQpiLmFwcGVuZENoaWxkKG8pCmZvcihyPWgubGVuZ3RoLG49dC5PLG09MDttPGgu
+bGVuZ3RoO2gubGVuZ3RoPT09cnx8KDAsSC5saykoaCksKyttKXtsPWhbbV0Kaz1zLmNyZWF0ZUVsZW1l
+bnQoImEiKQpvLmFwcGVuZENoaWxkKGspCmo9bC5hCmoudG9TdHJpbmcKay5hcHBlbmRDaGlsZChzLmNy
+ZWF0ZVRleHROb2RlKGopKQpqPWwuYgpqLnRvU3RyaW5nCmsuc2V0QXR0cmlidXRlKCJocmVmIixqKQpq
+PW4uYShILlFJKFsiYWRkLWhpbnQtbGluayIsImJlZm9yZS1hcHBseSIsImJ1dHRvbiJdLHApKQppPUou
+ZFIoaykKaS5WMSgwKQppLkZWKDAsail9fSwKQ0MoYTQsYTUsYTYpe3ZhciBzLHIscSxwLG8sbixtLGws
+ayxqLGksaCxnLGYsZSxkLGMsYixhLGEwLGExLGEyLGEzCmZvcihzPWE0LmYscj1zLmxlbmd0aCxxPXQu
+cyxwPXQuTyxvPTA7bzxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrbyl7bj1zW29d
+CmE1LnRvU3RyaW5nCm09ZG9jdW1lbnQKbD1tLmNyZWF0ZUVsZW1lbnQoInAiKQprPXAuYShILlFJKFsi
+dHJhY2UiXSxxKSkKaj1KLmRSKGwpCmouVjEoMCkKai5GVigwLGspCmk9YTUuYXBwZW5kQ2hpbGQobCkK
+bD1tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQprPXAuYShILlFJKFsidHlwZS1kZXNjcmlwdGlvbiJdLHEp
+KQpqPUouZFIobCkKai5WMSgwKQpqLkZWKDAsaykKaz1uLmEKay50b1N0cmluZwpsLmFwcGVuZENoaWxk
+KG0uY3JlYXRlVGV4dE5vZGUoaykpCmkuYXBwZW5kQ2hpbGQobCkKaS5hcHBlbmRDaGlsZChtLmNyZWF0
+ZVRleHROb2RlKCI6IikpCmw9bS5jcmVhdGVFbGVtZW50KCJ1bCIpCms9cC5hKEguUUkoWyJ0cmFjZSJd
+LHEpKQpqPUouZFIobCkKai5WMSgwKQpqLkZWKDAsaykKaD1pLmFwcGVuZENoaWxkKGwpCmZvcihsPW4u
+YixrPWwubGVuZ3RoLGc9MDtnPGwubGVuZ3RoO2wubGVuZ3RoPT09a3x8KDAsSC5saykobCksKytnKXtm
+PWxbZ10KZT1tLmNyZWF0ZUVsZW1lbnQoImxpIikKaC5hcHBlbmRDaGlsZChlKQpkPW0uY3JlYXRlRWxl
+bWVudCgic3BhbiIpCmM9cC5hKEguUUkoWyJmdW5jdGlvbiJdLHEpKQpqPUouZFIoZCkKai5WMSgwKQpq
+LkZWKDAsYykKYz1mLmIKTC5XaihkLGM9PW51bGw/InVua25vd24iOmMpCmUuYXBwZW5kQ2hpbGQoZCkK
+Yj1mLmMKaWYoYiE9bnVsbCl7ZS5hcHBlbmRDaGlsZChtLmNyZWF0ZVRleHROb2RlKCIgKCIpKQphPWIu
+YgphMD1tLmNyZWF0ZUVsZW1lbnQoImEiKQphMC5hcHBlbmRDaGlsZChtLmNyZWF0ZVRleHROb2RlKEgu
+RWooYi5jKSsiOiIrSC5FaihhKSkpCmQ9Yi5hCmQudG9TdHJpbmcKYTAuc2V0QXR0cmlidXRlKCJocmVm
+IixkKQphMC5jbGFzc0xpc3QuYWRkKCJuYXYtbGluayIpCmUuYXBwZW5kQ2hpbGQoYTApCmUuYXBwZW5k
+Q2hpbGQobS5jcmVhdGVUZXh0Tm9kZSgiKSIpKX1lLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUo
+IjogIikpCmQ9Zi5hCkwuV2ooZSxkPT1udWxsPyJ1bmtub3duIjpkKQpkPWYuZAppZihkLmxlbmd0aCE9
+PTApe2M9bS5jcmVhdGVFbGVtZW50KCJwIikKYTE9cC5hKEguUUkoWyJkcmF3ZXIiLCJiZWZvcmUtYXBw
+bHkiXSxxKSkKaj1KLmRSKGMpCmouVjEoMCkKai5GVigwLGExKQphMj1lLmFwcGVuZENoaWxkKGMpCmZv
+cihjPWQubGVuZ3RoLGEzPTA7YTM8ZC5sZW5ndGg7ZC5sZW5ndGg9PT1jfHwoMCxILmxrKShkKSwrK2Ez
+KUwudXooZFthM10sYTIsYil9fX19LApVcyhhKXtyZXR1cm4gQy54Qi50ZyhhLCI/Iik/Qy54Qi5Oaihh
+LDAsQy54Qi5PWShhLCI/IikpOmF9LApURyhhLGIpe3JldHVybiBuZXcgTC5RVyhhLGIpfSwKeXcoYSxi
+KXt2YXIgcyxyLHEscCxvCmZvcihzPWEubGVuZ3RoLHI9MDtyPGEubGVuZ3RoO2EubGVuZ3RoPT09c3x8
+KDAsSC5saykoYSksKytyKXtxPWFbcl0KaWYocSBpbnN0YW5jZW9mIEwudnQpe3A9cS5kCnAudG9TdHJp
+bmcKbz1MLnl3KHAsYikKaWYobyE9bnVsbClyZXR1cm4gb31lbHNlIGlmKHEuYz09PWIpcmV0dXJuIHF9
+cmV0dXJuIG51bGx9LApXaihhLGIpe3ZhciBzLHIscSxwPUguUUkoYi5zcGxpdCgiLiIpLHQucyksbz1D
+Lk5tLmd0SChwKSxuPWRvY3VtZW50CmEuYXBwZW5kQ2hpbGQobi5jcmVhdGVUZXh0Tm9kZShvKSkKZm9y
+KG89SC5xQyhwLDEsbnVsbCx0Lk4pLHM9by4kdGksbz1uZXcgSC5hNyhvLG8uZ0Eobykscy5DKCJhNzxh
+TC5FPiIpKSxzPXMuQygiYUwuRSIpLHI9Si5ZRShhKTtvLkYoKTspe3E9cy5hKG8uZCkKci5ueihhLCJi
+ZWZvcmVlbmQiLCImIzgyMDM7LiIsbnVsbCxudWxsKQphLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5v
+ZGUocSkpfX0sCmU6ZnVuY3Rpb24gZSgpe30sClZXOmZ1bmN0aW9uIFZXKGEsYixjKXt0aGlzLmE9YQp0
+aGlzLmI9Ygp0aGlzLmM9Y30sCm9aOmZ1bmN0aW9uIG9aKCl7fSwKanI6ZnVuY3Rpb24ganIoKXt9LApx
+bDpmdW5jdGlvbiBxbCgpe30sCnk4OmZ1bmN0aW9uIHk4KCl7fSwKSGk6ZnVuY3Rpb24gSGkoKXt9LApC
+VDpmdW5jdGlvbiBCVCgpe30sClBZOmZ1bmN0aW9uIFBZKCl7fSwKTDpmdW5jdGlvbiBMKCl7fSwKV3g6
+ZnVuY3Rpb24gV3goYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkhvOmZ1bmN0aW9uIEhvKGEpe3RoaXMu
+YT1hfSwKZE46ZnVuY3Rpb24gZE4oYSl7dGhpcy5hPWF9LApJQzpmdW5jdGlvbiBJQyhhKXt0aGlzLmE9
+YX0sCnh6OmZ1bmN0aW9uIHh6KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApCTjpmdW5jdGlvbiBCTigp
+e30sCmZDOmZ1bmN0aW9uIGZDKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApUbTpmdW5jdGlvbiBUbSgp
+e30sCm5UOmZ1bmN0aW9uIG5UKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCk5ZOmZ1
+bmN0aW9uIE5ZKGEpe3RoaXMuYT1hfSwKdWU6ZnVuY3Rpb24gdWUoKXt9LApHSDpmdW5jdGlvbiBHSCgp
+e30sCkVFOmZ1bmN0aW9uIEVFKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClFMOmZ1
+bmN0aW9uIFFMKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApWUzpmdW5jdGlvbiBWUyhhKXt0aGlzLmE9
+YX0sClREOmZ1bmN0aW9uIFREKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCklmOmZ1
+bmN0aW9uIElmKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCnRCOmZ1bmN0aW9uIHRC
+KCl7fSwKbTI6ZnVuY3Rpb24gbTIoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClFXOmZ1bmN0aW9uIFFX
+KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApYQTpmdW5jdGlvbiBYQSgpe30sClpzKGEpe3ZhciBzLHIs
+cT1KLlU2KGEpCmlmKEwucDIoSC5rKHEucShhLCJ0eXBlIikpKT09PUMuWTIpe3M9SC5rKHEucShhLCJu
+YW1lIikpCnI9SC5rKHEucShhLCJwYXRoIikpCnE9cS5xKGEsInN1YnRyZWUiKQpxPW5ldyBMLnZ0KHE9
+PW51bGw/bnVsbDpMLm1LKHQuVy5hKHEpKSxzLHIpCnEuTFYoKQpyZXR1cm4gcX1lbHNle3M9SC5rKHEu
+cShhLCJuYW1lIikpCnI9SC5rKHEucShhLCJwYXRoIikpCnJldHVybiBuZXcgTC5jRChILmsocS5xKGEs
+ImhyZWYiKSksSC5VYyhxLnEoYSwiZWRpdENvdW50IikpLEguTTQocS5xKGEsIndhc0V4cGxpY2l0bHlP
+cHRlZE91dCIpKSxMLnZCKEguVWMocS5xKGEsIm1pZ3JhdGlvblN0YXR1cyIpKSksSC5NNChxLnEoYSwi
+bWlncmF0aW9uU3RhdHVzQ2FuQmVDaGFuZ2VkIikpLHMscil9fSwKbUsoYSl7dmFyIHMscj1ILlFJKFtd
+LHQuZmgpCmZvcihzPUouSVQoYSk7cy5GKCk7KXIucHVzaChMLlpzKHMuZ2woKSkpCnJldHVybiByfSwK
+VkQoYSl7dmFyIHMscixxPUguUUkoW10sdC5kKQpmb3Iocz1hLmxlbmd0aCxyPTA7cjxhLmxlbmd0aDth
+Lmxlbmd0aD09PXN8fCgwLEgubGspKGEpLCsrcilxLnB1c2goYVtyXS5MdCgpKQpyZXR1cm4gcX0sCnZC
+KGEpe2lmKGE9PW51bGwpcmV0dXJuIG51bGwKaWYoYT4+PjAhPT1hfHxhPj00KXJldHVybiBILk9IKEMu
+bDAsYSkKcmV0dXJuIEMubDBbYV19LApwMihhKXtzd2l0Y2goYSl7Y2FzZSJkaXJlY3RvcnkiOnJldHVy
+biBDLlkyCmNhc2UiZmlsZSI6cmV0dXJuIEMucmYKZGVmYXVsdDp0aHJvdyBILmIoUC5QVigiVW5yZWNv
+Z25pemVkIG5hdmlnYXRpb24gdHJlZSBub2RlIHR5cGU6ICIrSC5FaihhKSkpfX0sCnZ0OmZ1bmN0aW9u
+IHZ0KGEsYixjKXt2YXIgXz10aGlzCl8uZD1hCl8uYT1iCl8uYj0kCl8uYz1jfSwKY0Q6ZnVuY3Rpb24g
+Y0QoYSxiLGMsZCxlLGYsZyl7dmFyIF89dGhpcwpfLmQ9YQpfLmU9YgpfLmY9YwpfLnI9ZApfLng9ZQpf
+LmE9ZgpfLmI9JApfLmM9Z30sCkQ4OmZ1bmN0aW9uIEQ4KCl7fSwKTzk6ZnVuY3Rpb24gTzkoYSl7dGhp
+cy5iPWF9LApHYjpmdW5jdGlvbiBHYihhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKSVY6ZnVuY3Rpb24g
+SVYoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmQ9YQpfLmU9YgpfLmY9YwpfLnI9ZH19LE09ewpZRihhLGIp
+e3ZhciBzLHIscSxwLG8sbixtLGwKZm9yKHM9Yi5sZW5ndGgscj0xO3I8czsrK3Ipe2lmKGJbcl09PW51
+bGx8fGJbci0xXSE9bnVsbCljb250aW51ZQpmb3IoO3M+PTE7cz1xKXtxPXMtMQppZihiW3FdIT1udWxs
+KWJyZWFrfXA9bmV3IFAuTSgiIikKbz0iIisoYSsiKCIpCnAuYT1vCm49SC50NihiKQptPW4uQygibkg8
+MT4iKQpsPW5ldyBILm5IKGIsMCxzLG0pCmwuSGQoYiwwLHMsbi5jKQptPW8rbmV3IEgubEoobCxtLkMo
+InFVKGFMLkUpIikuYShuZXcgTS5ObygpKSxtLkMoImxKPGFMLkUscVU+IikpLmsoMCwiLCAiKQpwLmE9
+bQpwLmE9bSsoIik6IHBhcnQgIisoci0xKSsiIHdhcyBudWxsLCBidXQgcGFydCAiK3IrIiB3YXMgbm90
+LiIpCnRocm93IEguYihQLnhZKHAudygwKSxudWxsKSl9fSwKbEk6ZnVuY3Rpb24gbEkoYSl7dGhpcy5h
+PWF9LApxNzpmdW5jdGlvbiBxNygpe30sCk5vOmZ1bmN0aW9uIE5vKCl7fX0sTz17ClJoKCl7dmFyIHMs
+cj1udWxsCmlmKFAudW8oKS5nRmkoKSE9PSJmaWxlIilyZXR1cm4gJC5FYigpCnM9UC51bygpCmlmKCFD
+LnhCLlRjKHMuZ0lpKHMpLCIvIikpcmV0dXJuICQuRWIoKQppZihQLktMKHIsImEvYiIscixyLHIscixy
+KS50NCgpPT09ImFcXGIiKXJldHVybiAkLktrKCkKcmV0dXJuICQuYkQoKX0sCnpMOmZ1bmN0aW9uIHpM
+KCl7fX0sUD17Ck9qKCl7dmFyIHMscixxPXt9CmlmKHNlbGYuc2NoZWR1bGVJbW1lZGlhdGUhPW51bGwp
+cmV0dXJuIFAuRVgoKQppZihzZWxmLk11dGF0aW9uT2JzZXJ2ZXIhPW51bGwmJnNlbGYuZG9jdW1lbnQh
+PW51bGwpe3M9c2VsZi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQpyPXNlbGYuZG9jdW1lbnQu
+Y3JlYXRlRWxlbWVudCgic3BhbiIpCnEuYT1udWxsCm5ldyBzZWxmLk11dGF0aW9uT2JzZXJ2ZXIoSC50
+UihuZXcgUC50aChxKSwxKSkub2JzZXJ2ZShzLHtjaGlsZExpc3Q6dHJ1ZX0pCnJldHVybiBuZXcgUC5o
+YShxLHMscil9ZWxzZSBpZihzZWxmLnNldEltbWVkaWF0ZSE9bnVsbClyZXR1cm4gUC55dCgpCnJldHVy
+biBQLnFXKCl9LApaVihhKXtzZWxmLnNjaGVkdWxlSW1tZWRpYXRlKEgudFIobmV3IFAuVnModC5NLmEo
+YSkpLDApKX0sCm9BKGEpe3NlbGYuc2V0SW1tZWRpYXRlKEgudFIobmV3IFAuRnQodC5NLmEoYSkpLDAp
+KX0sCkJ6KGEpe3QuTS5hKGEpClAuUU4oMCxhKX0sClFOKGEsYil7dmFyIHM9bmV3IFAuVzMoKQpzLkNZ
+KGEsYikKcmV0dXJuIHN9LApGWChhKXtyZXR1cm4gbmV3IFAuaWgobmV3IFAudnMoJC5YMyxhLkMoInZz
+PDA+IikpLGEuQygiaWg8MD4iKSl9LApESShhLGIpe2EuJDIoMCxudWxsKQpiLmI9ITAKcmV0dXJuIGIu
+YX0sCmpRKGEsYil7UC5KZShhLGIpfSwKeUMoYSxiKXtiLmFNKDAsYSl9LApmMyhhLGIpe2IudzAoSC5S
+dShhKSxILnRzKGEpKX0sCkplKGEsYil7dmFyIHMscixxPW5ldyBQLldNKGIpLHA9bmV3IFAuU1goYikK
+aWYoYSBpbnN0YW5jZW9mIFAudnMpYS5RZChxLHAsdC56KQplbHNle3M9dC56CmlmKHQuaS5iKGEpKWEu
+U3EocSxwLHMpCmVsc2V7cj1uZXcgUC52cygkLlgzLHQuYykKci5hPTgKci5jPWEKci5RZChxLHAscyl9
+fX0sCmx6KGEpe3ZhciBzPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQsZSl7d2hpbGUodHJ1
+ZSl0cnl7YihkLGUpCmJyZWFrfWNhdGNoKHIpe2U9cgpkPWN9fX0oYSwxKQpyZXR1cm4gJC5YMy5Maihu
+ZXcgUC5HcyhzKSx0LkgsdC5TLHQueil9LApHUShhKXtyZXR1cm4gbmV3IFAuRnkoYSwxKX0sClRoKCl7
+cmV0dXJuIEMud1F9LApZbShhKXtyZXR1cm4gbmV3IFAuRnkoYSwzKX0sCmwwKGEsYil7cmV0dXJuIG5l
+dyBQLnE0KGEsYi5DKCJxNDwwPiIpKX0sClRsKGEsYil7dmFyIHM9SC5jYihhLCJlcnJvciIsdC5LKQpy
+ZXR1cm4gbmV3IFAuQ3cocyxiPT1udWxsP1AudjAoYSk6Yil9LAp2MChhKXt2YXIgcwppZih0LnIuYihh
+KSl7cz1hLmdJSSgpCmlmKHMhPW51bGwpcmV0dXJuIHN9cmV0dXJuIEMucGR9LApBOShhLGIpe3ZhciBz
+LHIscQpmb3Iocz10LmM7cj1hLmEsKHImNCkhPT0wOylhPXMuYShhLmMpCmlmKChyJjI0KSE9PTApe3E9
+Yi5haCgpCmIudWcoYSkKUC5IWihiLHEpfWVsc2V7cT10LmUuYShiLmMpCmIuYT1iLmEmMXw0CmIuYz1h
+CmEualEocSl9fSwKSFooYSxhMCl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQsYz17
+fSxiPWMuYT1hCmZvcihzPXQubixyPXQuZSxxPXQuaTshMDspe3A9e30Kbz1iLmEKbj0obyYxNik9PT0w
+Cm09IW4KaWYoYTA9PW51bGwpe2lmKG0mJihvJjEpPT09MCl7bD1zLmEoYi5jKQpQLlNpKGwuYSxsLmIp
+fXJldHVybn1wLmE9YTAKaz1hMC5hCmZvcihiPWEwO2shPW51bGw7Yj1rLGs9ail7Yi5hPW51bGwKUC5I
+WihjLmEsYikKcC5hPWsKaj1rLmF9bz1jLmEKaT1vLmMKcC5iPW0KcC5jPWkKaWYobil7aD1iLmMKaD0o
+aCYxKSE9PTB8fChoJjE1KT09PTh9ZWxzZSBoPSEwCmlmKGgpe2c9Yi5iLmIKaWYobSl7bz1vLmI9PT1n
+Cm89IShvfHxvKX1lbHNlIG89ITEKaWYobyl7cy5hKGkpClAuU2koaS5hLGkuYikKcmV0dXJufWY9JC5Y
+MwppZihmIT09ZykkLlgzPWcKZWxzZSBmPW51bGwKYj1iLmMKaWYoKGImMTUpPT09OCluZXcgUC5SVChw
+LGMsbSkuJDAoKQplbHNlIGlmKG4pe2lmKChiJjEpIT09MCluZXcgUC5ycShwLGkpLiQwKCl9ZWxzZSBp
+ZigoYiYyKSE9PTApbmV3IFAuUlcoYyxwKS4kMCgpCmlmKGYhPW51bGwpJC5YMz1mCmI9cC5jCmlmKHEu
+YihiKSl7bz1wLmEuJHRpCm89by5DKCJiODwyPiIpLmIoYil8fCFvLlFbMV0uYihiKX1lbHNlIG89ITEK
+aWYobyl7cS5hKGIpCmU9cC5hLmIKaWYoKGIuYSYyNCkhPT0wKXtkPXIuYShlLmMpCmUuYz1udWxsCmEw
+PWUuTjgoZCkKZS5hPWIuYSYzMHxlLmEmMQplLmM9Yi5jCmMuYT1iCmNvbnRpbnVlfWVsc2UgUC5BOShi
+LGUpCnJldHVybn19ZT1wLmEuYgpkPXIuYShlLmMpCmUuYz1udWxsCmEwPWUuTjgoZCkKYj1wLmIKbz1w
+LmMKaWYoIWIpe2UuJHRpLmMuYShvKQplLmE9OAplLmM9b31lbHNle3MuYShvKQplLmE9ZS5hJjF8MTYK
+ZS5jPW99Yy5hPWUKYj1lfX0sClZIKGEsYil7dmFyIHMKaWYodC5rLmIoYSkpcmV0dXJuIGIuTGooYSx0
+LnosdC5LLHQubCkKcz10LnYKaWYocy5iKGEpKXJldHVybiBzLmEoYSkKdGhyb3cgSC5iKFAuTDMoYSwi
+b25FcnJvciIsdS5jKSl9LApwdSgpe3ZhciBzLHIKZm9yKHM9JC5TNjtzIT1udWxsO3M9JC5TNil7JC5t
+Zz1udWxsCnI9cy5iCiQuUzY9cgppZihyPT1udWxsKSQuazg9bnVsbApzLmEuJDAoKX19LAplTigpeyQu
+VUQ9ITAKdHJ5e1AucHUoKX1maW5hbGx5eyQubWc9bnVsbAokLlVEPSExCmlmKCQuUzYhPW51bGwpJC51
+dCgpLiQxKFAuVUkoKSl9fSwKZVcoYSl7dmFyIHM9bmV3IFAuT00oYSkscj0kLms4CmlmKHI9PW51bGwp
+eyQuUzY9JC5rOD1zCmlmKCEkLlVEKSQudXQoKS4kMShQLlVJKCkpfWVsc2UgJC5rOD1yLmI9c30sCnJS
+KGEpe3ZhciBzLHIscSxwPSQuUzYKaWYocD09bnVsbCl7UC5lVyhhKQokLm1nPSQuazgKcmV0dXJufXM9
+bmV3IFAuT00oYSkKcj0kLm1nCmlmKHI9PW51bGwpe3MuYj1wCiQuUzY9JC5tZz1zfWVsc2V7cT1yLmIK
+cy5iPXEKJC5tZz1yLmI9cwppZihxPT1udWxsKSQuazg9c319LApyYihhKXt2YXIgcz1udWxsLHI9JC5Y
+MwppZihDLk5VPT09cil7UC5UayhzLHMsQy5OVSxhKQpyZXR1cm59UC5UayhzLHMscix0Lk0uYShyLkdZ
+KGEpKSl9LApRdyhhLGIpe0guY2IoYSwic3RyZWFtIix0LkspCnJldHVybiBuZXcgUC54SShiLkMoInhJ
+PDA+IikpfSwKU2koYSxiKXtQLnJSKG5ldyBQLkV2KGEsYikpfSwKVDgoYSxiLGMsZCxlKXt2YXIgcyxy
+PSQuWDMKaWYocj09PWMpcmV0dXJuIGQuJDAoKQokLlgzPWMKcz1yCnRyeXtyPWQuJDAoKQpyZXR1cm4g
+cn1maW5hbGx5eyQuWDM9c319LAp5dihhLGIsYyxkLGUsZixnKXt2YXIgcyxyPSQuWDMKaWYocj09PWMp
+cmV0dXJuIGQuJDEoZSkKJC5YMz1jCnM9cgp0cnl7cj1kLiQxKGUpCnJldHVybiByfWZpbmFsbHl7JC5Y
+Mz1zfX0sClF4KGEsYixjLGQsZSxmLGcsaCxpKXt2YXIgcyxyPSQuWDMKaWYocj09PWMpcmV0dXJuIGQu
+JDIoZSxmKQokLlgzPWMKcz1yCnRyeXtyPWQuJDIoZSxmKQpyZXR1cm4gcn1maW5hbGx5eyQuWDM9c319
+LApUayhhLGIsYyxkKXt0Lk0uYShkKQppZihDLk5VIT09YylkPWMuR1koZCkKUC5lVyhkKX0sCnRoOmZ1
+bmN0aW9uIHRoKGEpe3RoaXMuYT1hfSwKaGE6ZnVuY3Rpb24gaGEoYSxiLGMpe3RoaXMuYT1hCnRoaXMu
+Yj1iCnRoaXMuYz1jfSwKVnM6ZnVuY3Rpb24gVnMoYSl7dGhpcy5hPWF9LApGdDpmdW5jdGlvbiBGdChh
+KXt0aGlzLmE9YX0sClczOmZ1bmN0aW9uIFczKCl7fSwKeUg6ZnVuY3Rpb24geUgoYSxiKXt0aGlzLmE9
+YQp0aGlzLmI9Yn0sCmloOmZ1bmN0aW9uIGloKGEsYil7dGhpcy5hPWEKdGhpcy5iPSExCnRoaXMuJHRp
+PWJ9LApXTTpmdW5jdGlvbiBXTShhKXt0aGlzLmE9YX0sClNYOmZ1bmN0aW9uIFNYKGEpe3RoaXMuYT1h
+fSwKR3M6ZnVuY3Rpb24gR3MoYSl7dGhpcy5hPWF9LApGeTpmdW5jdGlvbiBGeShhLGIpe3RoaXMuYT1h
+CnRoaXMuYj1ifSwKR1Y6ZnVuY3Rpb24gR1YoYSxiKXt2YXIgXz10aGlzCl8uYT1hCl8uZD1fLmM9Xy5i
+PW51bGwKXy4kdGk9Yn0sCnE0OmZ1bmN0aW9uIHE0KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCkN3
+OmZ1bmN0aW9uIEN3KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApQZjpmdW5jdGlvbiBQZigpe30sClpm
+OmZ1bmN0aW9uIFpmKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCkZlOmZ1bmN0aW9uIEZlKGEsYixj
+LGQsZSl7dmFyIF89dGhpcwpfLmE9bnVsbApfLmI9YQpfLmM9YgpfLmQ9YwpfLmU9ZApfLiR0aT1lfSwK
+dnM6ZnVuY3Rpb24gdnMoYSxiKXt2YXIgXz10aGlzCl8uYT0wCl8uYj1hCl8uYz1udWxsCl8uJHRpPWJ9
+LApkYTpmdW5jdGlvbiBkYShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKb1E6ZnVuY3Rpb24gb1EoYSxi
+KXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnBWOmZ1bmN0aW9uIHBWKGEpe3RoaXMuYT1hfSwKVTc6ZnVuY3Rp
+b24gVTcoYSl7dGhpcy5hPWF9LAp2cjpmdW5jdGlvbiB2cihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIK
+dGhpcy5jPWN9LApydDpmdW5jdGlvbiBydChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKS0Y6ZnVuY3Rp
+b24gS0YoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClpMOmZ1bmN0aW9uIFpMKGEsYixjKXt0aGlzLmE9
+YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClJUOmZ1bmN0aW9uIFJUKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9
+Ygp0aGlzLmM9Y30sCmpaOmZ1bmN0aW9uIGpaKGEpe3RoaXMuYT1hfSwKcnE6ZnVuY3Rpb24gcnEoYSxi
+KXt0aGlzLmE9YQp0aGlzLmI9Yn0sClJXOmZ1bmN0aW9uIFJXKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9
+LApPTTpmdW5jdGlvbiBPTShhKXt0aGlzLmE9YQp0aGlzLmI9bnVsbH0sCnFoOmZ1bmN0aW9uIHFoKCl7
+fSwKQjU6ZnVuY3Rpb24gQjUoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnVPOmZ1bmN0aW9uIHVPKGEs
+Yil7dGhpcy5hPWEKdGhpcy5iPWJ9LApNTzpmdW5jdGlvbiBNTygpe30sCmtUOmZ1bmN0aW9uIGtUKCl7
+fSwKeEk6ZnVuY3Rpb24geEkoYSl7dGhpcy4kdGk9YX0sCm0wOmZ1bmN0aW9uIG0wKCl7fSwKRXY6ZnVu
+Y3Rpb24gRXYoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkppOmZ1bmN0aW9uIEppKCl7fSwKVnA6ZnVu
+Y3Rpb24gVnAoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCk9SOmZ1bmN0aW9uIE9SKGEsYixjKXt0aGlz
+LmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCkVGKGEsYixjKXtyZXR1cm4gYi5DKCJAPDA+IikuS3EoYyku
+QygiRm88MSwyPiIpLmEoSC5CNyhhLG5ldyBILk41KGIuQygiQDwwPiIpLktxKGMpLkMoIk41PDEsMj4i
+KSkpKX0sCkZsKGEsYil7cmV0dXJuIG5ldyBILk41KGEuQygiQDwwPiIpLktxKGIpLkMoIk41PDEsMj4i
+KSl9LApMcyhhKXtyZXR1cm4gbmV3IFAuYjYoYS5DKCJiNjwwPiIpKX0sClQyKCl7dmFyIHM9T2JqZWN0
+LmNyZWF0ZShudWxsKQpzWyI8bm9uLWlkZW50aWZpZXIta2V5PiJdPXMKZGVsZXRlIHNbIjxub24taWRl
+bnRpZmllci1rZXk+Il0KcmV0dXJuIHN9LApyaihhLGIsYyl7dmFyIHM9bmV3IFAubG0oYSxiLGMuQygi
+bG08MD4iKSkKcy5jPWEuZQpyZXR1cm4gc30sCkVQKGEsYixjKXt2YXIgcyxyCmlmKFAuaEIoYSkpe2lm
+KGI9PT0iKCImJmM9PT0iKSIpcmV0dXJuIiguLi4pIgpyZXR1cm4gYisiLi4uIitjfXM9SC5RSShbXSx0
+LnMpCkMuTm0uaSgkLnhnLGEpCnRyeXtQLlZyKGEscyl9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aCly
+ZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXI9UC5sKGIsdC5hLmEocyksIiwgIikrYwpyZXR1
+cm4gci5jaGFyQ29kZUF0KDApPT0wP3I6cn0sCngoYSxiLGMpe3ZhciBzLHIKaWYoUC5oQihhKSlyZXR1
+cm4gYisiLi4uIitjCnM9bmV3IFAuTShiKQpDLk5tLmkoJC54ZyxhKQp0cnl7cj1zCnIuYT1QLmwoci5h
+LGEsIiwgIil9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhn
+LnBvcCgpfXMuYSs9YwpyPXMuYQpyZXR1cm4gci5jaGFyQ29kZUF0KDApPT0wP3I6cn0sCmhCKGEpe3Zh
+ciBzLHIKZm9yKHM9JC54Zy5sZW5ndGgscj0wO3I8czsrK3IpaWYoYT09PSQueGdbcl0pcmV0dXJuITAK
+cmV0dXJuITF9LApWcihhLGIpe3ZhciBzLHIscSxwLG8sbixtLGw9YS5nbShhKSxrPTAsaj0wCndoaWxl
+KCEwKXtpZighKGs8ODB8fGo8MykpYnJlYWsKaWYoIWwuRigpKXJldHVybgpzPUguRWoobC5nbCgpKQpD
+Lk5tLmkoYixzKQprKz1zLmxlbmd0aCsyOysran1pZighbC5GKCkpe2lmKGo8PTUpcmV0dXJuCmlmKDA+
+PWIubGVuZ3RoKXJldHVybiBILk9IKGIsLTEpCnI9Yi5wb3AoKQppZigwPj1iLmxlbmd0aClyZXR1cm4g
+SC5PSChiLC0xKQpxPWIucG9wKCl9ZWxzZXtwPWwuZ2woKTsrK2oKaWYoIWwuRigpKXtpZihqPD00KXtD
+Lk5tLmkoYixILkVqKHApKQpyZXR1cm59cj1ILkVqKHApCmlmKDA+PWIubGVuZ3RoKXJldHVybiBILk9I
+KGIsLTEpCnE9Yi5wb3AoKQprKz1yLmxlbmd0aCsyfWVsc2V7bz1sLmdsKCk7KytqCmZvcig7bC5GKCk7
+cD1vLG89bil7bj1sLmdsKCk7KytqCmlmKGo+MTAwKXt3aGlsZSghMCl7aWYoIShrPjc1JiZqPjMpKWJy
+ZWFrCmlmKDA+PWIubGVuZ3RoKXJldHVybiBILk9IKGIsLTEpCmstPWIucG9wKCkubGVuZ3RoKzI7LS1q
+fUMuTm0uaShiLCIuLi4iKQpyZXR1cm59fXE9SC5FaihwKQpyPUguRWoobykKays9ci5sZW5ndGgrcS5s
+ZW5ndGgrNH19aWYoaj5iLmxlbmd0aCsyKXtrKz01Cm09Ii4uLiJ9ZWxzZSBtPW51bGwKd2hpbGUoITAp
+e2lmKCEoaz44MCYmYi5sZW5ndGg+MykpYnJlYWsKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwt
+MSkKay09Yi5wb3AoKS5sZW5ndGgrMgppZihtPT1udWxsKXtrKz01Cm09Ii4uLiJ9fWlmKG0hPW51bGwp
+Qy5ObS5pKGIsbSkKQy5ObS5pKGIscSkKQy5ObS5pKGIscil9LAp0TShhLGIpe3ZhciBzLHIscT1QLkxz
+KGIpCmZvcihzPWEubGVuZ3RoLHI9MDtyPGEubGVuZ3RoO2EubGVuZ3RoPT09c3x8KDAsSC5saykoYSks
+KytyKXEuaSgwLGIuYShhW3JdKSkKcmV0dXJuIHF9LApuTyhhKXt2YXIgcyxyPXt9CmlmKFAuaEIoYSkp
+cmV0dXJuInsuLi59IgpzPW5ldyBQLk0oIiIpCnRyeXtDLk5tLmkoJC54ZyxhKQpzLmErPSJ7IgpyLmE9
+ITAKYS5LKDAsbmV3IFAucmEocixzKSkKcy5hKz0ifSJ9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aCly
+ZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXI9cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9
+PTA/cjpyfSwKYjY6ZnVuY3Rpb24gYjYoYSl7dmFyIF89dGhpcwpfLmE9MApfLmY9Xy5lPV8uZD1fLmM9
+Xy5iPW51bGwKXy5yPTAKXy4kdGk9YX0sCmJuOmZ1bmN0aW9uIGJuKGEpe3RoaXMuYT1hCnRoaXMuYz10
+aGlzLmI9bnVsbH0sCmxtOmZ1bmN0aW9uIGxtKGEsYixjKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8u
+ZD1fLmM9bnVsbApfLiR0aT1jfSwKbVc6ZnVuY3Rpb24gbVcoKXt9LAp1eTpmdW5jdGlvbiB1eSgpe30s
+CmxEOmZ1bmN0aW9uIGxEKCl7fSwKaWw6ZnVuY3Rpb24gaWwoKXt9LApyYTpmdW5jdGlvbiByYShhLGIp
+e3RoaXMuYT1hCnRoaXMuYj1ifSwKWWs6ZnVuY3Rpb24gWWsoKXt9LAp5UTpmdW5jdGlvbiB5UShhKXt0
+aGlzLmE9YX0sCktQOmZ1bmN0aW9uIEtQKCl7fSwKUG46ZnVuY3Rpb24gUG4oKXt9LApHajpmdW5jdGlv
+biBHaihhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApsZjpmdW5jdGlvbiBsZigpe30sClZqOmZ1bmN0
+aW9uIFZqKCl7fSwKWHY6ZnVuY3Rpb24gWHYoKXt9LApuWTpmdW5jdGlvbiBuWSgpe30sCldZOmZ1bmN0
+aW9uIFdZKCl7fSwKUlU6ZnVuY3Rpb24gUlUoKXt9LApwUjpmdW5jdGlvbiBwUigpe30sCkJTKGEsYil7
+dmFyIHMscixxLHA9bnVsbAp0cnl7cD1KU09OLnBhcnNlKGEpfWNhdGNoKHIpe3M9SC5SdShyKQpxPVAu
+cnIoU3RyaW5nKHMpLG51bGwsbnVsbCkKdGhyb3cgSC5iKHEpfXE9UC5RZShwKQpyZXR1cm4gcX0sClFl
+KGEpe3ZhciBzCmlmKGE9PW51bGwpcmV0dXJuIG51bGwKaWYodHlwZW9mIGEhPSJvYmplY3QiKXJldHVy
+biBhCmlmKE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSE9PUFycmF5LnByb3RvdHlwZSlyZXR1cm4gbmV3
+IFAudXcoYSxPYmplY3QuY3JlYXRlKG51bGwpKQpmb3Iocz0wO3M8YS5sZW5ndGg7KytzKWFbc109UC5R
+ZShhW3NdKQpyZXR1cm4gYX0sCmt5KGEsYixjLGQpe3ZhciBzLHIKaWYoYiBpbnN0YW5jZW9mIFVpbnQ4
+QXJyYXkpe3M9YgpkPXMubGVuZ3RoCmlmKGQtYzwxNSlyZXR1cm4gbnVsbApyPVAuUlAoYSxzLGMsZCkK
+aWYociE9bnVsbCYmYSlpZihyLmluZGV4T2YoIlx1ZmZmZCIpPj0wKXJldHVybiBudWxsCnJldHVybiBy
+fXJldHVybiBudWxsfSwKUlAoYSxiLGMsZCl7dmFyIHM9YT8kLkhHKCk6JC5yZigpCmlmKHM9PW51bGwp
+cmV0dXJuIG51bGwKaWYoMD09PWMmJmQ9PT1iLmxlbmd0aClyZXR1cm4gUC5SYihzLGIpCnJldHVybiBQ
+LlJiKHMsYi5zdWJhcnJheShjLFAuakIoYyxkLGIubGVuZ3RoKSkpfSwKUmIoYSxiKXt2YXIgcyxyCnRy
+eXtzPWEuZGVjb2RlKGIpCnJldHVybiBzfWNhdGNoKHIpe0guUnUocil9cmV0dXJuIG51bGx9LAp4TShh
+LGIsYyxkLGUsZil7aWYoQy5qbi56WShmLDQpIT09MCl0aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNl
+NjQgcGFkZGluZywgcGFkZGVkIGxlbmd0aCBtdXN0IGJlIG11bHRpcGxlIG9mIGZvdXIsIGlzICIrZixh
+LGMpKQppZihkK2UhPT1mKXRocm93IEguYihQLnJyKCJJbnZhbGlkIGJhc2U2NCBwYWRkaW5nLCAnPScg
+bm90IGF0IHRoZSBlbmQiLGEsYikpCmlmKGU+Mil0aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNlNjQg
+cGFkZGluZywgbW9yZSB0aGFuIHR3byAnPScgY2hhcmFjdGVycyIsYSxiKSl9LApHeShhLGIsYyl7cmV0
+dXJuIG5ldyBQLlVkKGEsYil9LApOQyhhKXtyZXR1cm4gYS5MdCgpfSwKVWcoYSxiKXtyZXR1cm4gbmV3
+IFAudHUoYSxbXSxQLkN5KCkpfSwKdVgoYSxiLGMpe3ZhciBzLHI9bmV3IFAuTSgiIikscT1QLlVnKHIs
+YikKcS5pVShhKQpzPXIuYQpyZXR1cm4gcy5jaGFyQ29kZUF0KDApPT0wP3M6c30sCmo0KGEpe3N3aXRj
+aChhKXtjYXNlIDY1OnJldHVybiJNaXNzaW5nIGV4dGVuc2lvbiBieXRlIgpjYXNlIDY3OnJldHVybiJV
+bmV4cGVjdGVkIGV4dGVuc2lvbiBieXRlIgpjYXNlIDY5OnJldHVybiJJbnZhbGlkIFVURi04IGJ5dGUi
+CmNhc2UgNzE6cmV0dXJuIk92ZXJsb25nIGVuY29kaW5nIgpjYXNlIDczOnJldHVybiJPdXQgb2YgdW5p
+Y29kZSByYW5nZSIKY2FzZSA3NTpyZXR1cm4iRW5jb2RlZCBzdXJyb2dhdGUiCmNhc2UgNzc6cmV0dXJu
+IlVuZmluaXNoZWQgVVRGLTggb2N0ZXQgc2VxdWVuY2UiCmRlZmF1bHQ6cmV0dXJuIiJ9fSwKankoYSxi
+LGMpe3ZhciBzLHIscSxwPWMtYixvPW5ldyBVaW50OEFycmF5KHApCmZvcihzPUouVTYoYSkscj0wO3I8
+cDsrK3Ipe3E9cy5xKGEsYityKQppZigocSY0Mjk0OTY3MDQwKT4+PjAhPT0wKXE9MjU1CmlmKHI+PXAp
+cmV0dXJuIEguT0gobyxyKQpvW3JdPXF9cmV0dXJuIG99LAp1dzpmdW5jdGlvbiB1dyhhLGIpe3RoaXMu
+YT1hCnRoaXMuYj1iCnRoaXMuYz1udWxsfSwKaTg6ZnVuY3Rpb24gaTgoYSl7dGhpcy5hPWF9LAp4cjpm
+dW5jdGlvbiB4cigpe30sCk56OmZ1bmN0aW9uIE56KCl7fSwKQ1Y6ZnVuY3Rpb24gQ1YoKXt9LApVODpm
+dW5jdGlvbiBVOCgpe30sClVrOmZ1bmN0aW9uIFVrKCl7fSwKd0k6ZnVuY3Rpb24gd0koKXt9LApaaTpm
+dW5jdGlvbiBaaSgpe30sClVkOmZ1bmN0aW9uIFVkKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApLODpm
+dW5jdGlvbiBLOChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKYnk6ZnVuY3Rpb24gYnkoKXt9LApvajpm
+dW5jdGlvbiBvaihhKXt0aGlzLmI9YX0sCk14OmZ1bmN0aW9uIE14KGEpe3RoaXMuYT1hfSwKU2g6ZnVu
+Y3Rpb24gU2goKXt9LAp0aTpmdW5jdGlvbiB0aShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKdHU6ZnVu
+Y3Rpb24gdHUoYSxiLGMpe3RoaXMuYz1hCnRoaXMuYT1iCnRoaXMuYj1jfSwKdTU6ZnVuY3Rpb24gdTUo
+KXt9LApFMzpmdW5jdGlvbiBFMygpe30sClJ3OmZ1bmN0aW9uIFJ3KGEpe3RoaXMuYj0wCnRoaXMuYz1h
+fSwKR1k6ZnVuY3Rpb24gR1koYSl7dGhpcy5hPWF9LApiejpmdW5jdGlvbiBieihhKXt0aGlzLmE9YQp0
+aGlzLmI9MTYKdGhpcy5jPTB9LApRQShhLGIpe3ZhciBzPUguSHAoYSxiKQppZihzIT1udWxsKXJldHVy
+biBzCnRocm93IEguYihQLnJyKGEsbnVsbCxudWxsKSl9LApvcyhhKXtpZihhIGluc3RhbmNlb2YgSC5U
+cClyZXR1cm4gYS53KDApCnJldHVybiJJbnN0YW5jZSBvZiAnIitILmxoKGEpKyInIn0sCk84KGEsYixj
+LGQpe3ZhciBzLHI9Yz9KLktoKGEsZCk6Si5RaShhLGQpCmlmKGEhPT0wJiZiIT1udWxsKWZvcihzPTA7
+czxyLmxlbmd0aDsrK3MpcltzXT1iCnJldHVybiByfSwKUFcoYSxiLGMpe3ZhciBzLHI9SC5RSShbXSxj
+LkMoImpkPDA+IikpCmZvcihzPUouSVQoYSk7cy5GKCk7KUMuTm0uaShyLGMuYShzLmdsKCkpKQppZihi
+KXJldHVybiByCnJldHVybiBKLkVwKHIsYyl9LApZMShhLGIsYyl7dmFyIHMKaWYoYilyZXR1cm4gUC5l
+dihhLGMpCnM9Si5FcChQLmV2KGEsYyksYykKcmV0dXJuIHN9LApldihhLGIpe3ZhciBzLHIKaWYoQXJy
+YXkuaXNBcnJheShhKSlyZXR1cm4gSC5RSShhLnNsaWNlKDApLGIuQygiamQ8MD4iKSkKcz1ILlFJKFtd
+LGIuQygiamQ8MD4iKSkKZm9yKHI9Si5JVChhKTtyLkYoKTspQy5ObS5pKHMsci5nbCgpKQpyZXR1cm4g
+c30sCkFGKGEsYil7cmV0dXJuIEouekMoUC5QVyhhLCExLGIpKX0sCkhNKGEsYixjKXt2YXIgcz1ILmZ3
+KGEsYixQLmpCKGIsYyxhLmxlbmd0aCkpCnJldHVybiBzfSwKT28oYSl7cmV0dXJuIEguTHcoYSl9LApu
+dShhKXtyZXR1cm4gbmV3IEguVlIoYSxILnY0KGEsITEsITAsITEsITEsITEpKX0sCmwoYSxiLGMpe3Zh
+ciBzPUouSVQoYikKaWYoIXMuRigpKXJldHVybiBhCmlmKGMubGVuZ3RoPT09MCl7ZG8gYSs9SC5Faihz
+LmdsKCkpCndoaWxlKHMuRigpKX1lbHNle2ErPUguRWoocy5nbCgpKQpmb3IoO3MuRigpOylhPWErYytI
+LkVqKHMuZ2woKSl9cmV0dXJuIGF9LApscihhLGIsYyxkKXtyZXR1cm4gbmV3IFAubXAoYSxiLGMsZCl9
+LAp1bygpe3ZhciBzPUguTTAoKQppZihzIT1udWxsKXJldHVybiBQLmhLKHMpCnRocm93IEguYihQLkw0
+KCInVXJpLmJhc2UnIGlzIG5vdCBzdXBwb3J0ZWQiKSl9LAplUChhLGIsYyxkKXt2YXIgcyxyLHEscCxv
+LG4sbT0iMDEyMzQ1Njc4OUFCQ0RFRiIKaWYoYz09PUMueE0pe3M9JC56NCgpLmIKcz1zLnRlc3QoYil9
+ZWxzZSBzPSExCmlmKHMpcmV0dXJuIGIKSC5MaChjKS5DKCJVay5TIikuYShiKQpyPWMuZ1pFKCkuV0oo
+YikKZm9yKHM9ci5sZW5ndGgscT0wLHA9IiI7cTxzOysrcSl7bz1yW3FdCmlmKG88MTI4KXtuPW8+Pj40
+CmlmKG4+PTgpcmV0dXJuIEguT0goYSxuKQpuPShhW25dJjE8PChvJjE1KSkhPT0wfWVsc2Ugbj0hMQpp
+ZihuKXArPUguTHcobykKZWxzZSBwPWQmJm89PT0zMj9wKyIrIjpwKyIlIittW28+Pj40JjE1XSttW28m
+MTVdfXJldHVybiBwLmNoYXJDb2RlQXQoMCk9PTA/cDpwfSwKR3EoYSl7dmFyIHM9TWF0aC5hYnMoYSks
+cj1hPDA/Ii0iOiIiCmlmKHM+PTEwMDApcmV0dXJuIiIrYQppZihzPj0xMDApcmV0dXJuIHIrIjAiK3MK
+aWYocz49MTApcmV0dXJuIHIrIjAwIitzCnJldHVybiByKyIwMDAiK3N9LApWeChhKXtpZihhPj0xMDAp
+cmV0dXJuIiIrYQppZihhPj0xMClyZXR1cm4iMCIrYQpyZXR1cm4iMDAiK2F9LApoMChhKXtpZihhPj0x
+MClyZXR1cm4iIithCnJldHVybiIwIithfSwKaGwoYSl7aWYodHlwZW9mIGE9PSJudW1iZXIifHxILnJR
+KGEpfHxhPT1udWxsKXJldHVybiBKLncoYSkKaWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKU09O
+LnN0cmluZ2lmeShhKQpyZXR1cm4gUC5vcyhhKX0sCmhWKGEpe3JldHVybiBuZXcgUC5DNihhKX0sCnhZ
+KGEsYil7cmV0dXJuIG5ldyBQLkFUKCExLG51bGwsYixhKX0sCkwzKGEsYixjKXtyZXR1cm4gbmV3IFAu
+QVQoITAsYSxiLGMpfSwKTzcoYSxiKXtyZXR1cm4gbmV3IFAuYkoobnVsbCxudWxsLCEwLGEsYiwiVmFs
+dWUgbm90IGluIHJhbmdlIil9LApURShhLGIsYyxkLGUpe3JldHVybiBuZXcgUC5iSihiLGMsITAsYSxk
+LCJJbnZhbGlkIHZhbHVlIil9LAp3QShhLGIsYyxkKXtpZihhPGJ8fGE+Yyl0aHJvdyBILmIoUC5URShh
+LGIsYyxkLG51bGwpKQpyZXR1cm4gYX0sCmpCKGEsYixjKXtpZigwPmF8fGE+Yyl0aHJvdyBILmIoUC5U
+RShhLDAsYywic3RhcnQiLG51bGwpKQppZihiIT1udWxsKXtpZihhPmJ8fGI+Yyl0aHJvdyBILmIoUC5U
+RShiLGEsYywiZW5kIixudWxsKSkKcmV0dXJuIGJ9cmV0dXJuIGN9LAprMShhLGIpe2lmKGE8MCl0aHJv
+dyBILmIoUC5URShhLDAsbnVsbCxiLG51bGwpKQpyZXR1cm4gYX0sCkNmKGEsYixjLGQsZSl7dmFyIHM9
+SC5JWihlPT1udWxsP0ouSG0oYik6ZSkKcmV0dXJuIG5ldyBQLmVZKHMsITAsYSxjLCJJbmRleCBvdXQg
+b2YgcmFuZ2UiKX0sCkw0KGEpe3JldHVybiBuZXcgUC51YihhKX0sClNZKGEpe3JldHVybiBuZXcgUC5k
+cyhhKX0sClBWKGEpe3JldHVybiBuZXcgUC5saihhKX0sCmE0KGEpe3JldHVybiBuZXcgUC5VVihhKX0s
+CnJyKGEsYixjKXtyZXR1cm4gbmV3IFAuYUUoYSxiLGMpfSwKaEsoYTUpe3ZhciBzLHIscSxwLG8sbixt
+LGwsayxqLGksaCxnLGYsZSxkLGMsYixhLGEwLGExLGEyLGEzPW51bGwsYTQ9YTUubGVuZ3RoCmlmKGE0
+Pj01KXtzPSgoQy54Qi5XKGE1LDQpXjU4KSozfEMueEIuVyhhNSwwKV4xMDB8Qy54Qi5XKGE1LDEpXjk3
+fEMueEIuVyhhNSwyKV4xMTZ8Qy54Qi5XKGE1LDMpXjk3KT4+PjAKaWYocz09PTApcmV0dXJuIFAuS0Qo
+YTQ8YTQ/Qy54Qi5OaihhNSwwLGE0KTphNSw1LGEzKS5nbFIoKQplbHNlIGlmKHM9PT0zMilyZXR1cm4g
+UC5LRChDLnhCLk5qKGE1LDUsYTQpLDAsYTMpLmdsUigpfXI9UC5POCg4LDAsITEsdC5TKQpDLk5tLlk1
+KHIsMCwwKQpDLk5tLlk1KHIsMSwtMSkKQy5ObS5ZNShyLDIsLTEpCkMuTm0uWTUociw3LC0xKQpDLk5t
+Llk1KHIsMywwKQpDLk5tLlk1KHIsNCwwKQpDLk5tLlk1KHIsNSxhNCkKQy5ObS5ZNShyLDYsYTQpCmlm
+KFAuVUIoYTUsMCxhNCwwLHIpPj0xNClDLk5tLlk1KHIsNyxhNCkKcT1yWzFdCmlmKHE+PTApaWYoUC5V
+QihhNSwwLHEsMjAscik9PT0yMClyWzddPXEKcD1yWzJdKzEKbz1yWzNdCm49cls0XQptPXJbNV0KbD1y
+WzZdCmlmKGw8bSltPWwKaWYobjxwKW49bQplbHNlIGlmKG48PXEpbj1xKzEKaWYobzxwKW89bgprPXJb
+N108MAppZihrKWlmKHA+cSszKXtqPWEzCms9ITF9ZWxzZXtpPW8+MAppZihpJiZvKzE9PT1uKXtqPWEz
+Cms9ITF9ZWxzZXtpZighKG08YTQmJm09PT1uKzImJkMueEIuUWkoYTUsIi4uIixuKSkpaD1tPm4rMiYm
+Qy54Qi5RaShhNSwiLy4uIixtLTMpCmVsc2UgaD0hMAppZihoKXtqPWEzCms9ITF9ZWxzZXtpZihxPT09
+NClpZihDLnhCLlFpKGE1LCJmaWxlIiwwKSl7aWYocDw9MCl7aWYoIUMueEIuUWkoYTUsIi8iLG4pKXtn
+PSJmaWxlOi8vLyIKcz0zfWVsc2V7Zz0iZmlsZTovLyIKcz0yfWE1PWcrQy54Qi5OaihhNSxuLGE0KQpx
+LT0wCmk9cy0wCm0rPWkKbCs9aQphND1hNS5sZW5ndGgKcD03Cm89NwpuPTd9ZWxzZSBpZihuPT09bSl7
+KytsCmY9bSsxCmE1PUMueEIuaTcoYTUsbixtLCIvIik7KythNAptPWZ9aj0iZmlsZSJ9ZWxzZSBpZihD
+LnhCLlFpKGE1LCJodHRwIiwwKSl7aWYoaSYmbyszPT09biYmQy54Qi5RaShhNSwiODAiLG8rMSkpe2wt
+PTMKZT1uLTMKbS09MwphNT1DLnhCLmk3KGE1LG8sbiwiIikKYTQtPTMKbj1lfWo9Imh0dHAifWVsc2Ug
+aj1hMwplbHNlIGlmKHE9PT01JiZDLnhCLlFpKGE1LCJodHRwcyIsMCkpe2lmKGkmJm8rND09PW4mJkMu
+eEIuUWkoYTUsIjQ0MyIsbysxKSl7bC09NAplPW4tNAptLT00CmE1PUMueEIuaTcoYTUsbyxuLCIiKQph
+NC09MwpuPWV9aj0iaHR0cHMifWVsc2Ugaj1hMwprPSEwfX19ZWxzZSBqPWEzCmlmKGspe2lmKGE0PGE1
+Lmxlbmd0aCl7YTU9Qy54Qi5OaihhNSwwLGE0KQpxLT0wCnAtPTAKby09MApuLT0wCm0tPTAKbC09MH1y
+ZXR1cm4gbmV3IFAuVWYoYTUscSxwLG8sbixtLGwsail9aWYoaj09bnVsbClpZihxPjApaj1QLlBpKGE1
+LDAscSkKZWxzZXtpZihxPT09MClQLlIzKGE1LDAsIkludmFsaWQgZW1wdHkgc2NoZW1lIikKaj0iIn1p
+ZihwPjApe2Q9cSszCmM9ZDxwP1AuelIoYTUsZCxwLTEpOiIiCmI9UC5PZShhNSxwLG8sITEpCmk9bysx
+CmlmKGk8bil7YT1ILkhwKEMueEIuTmooYTUsaSxuKSxhMykKYTA9UC53QihhPT1udWxsP0gudihQLnJy
+KCJJbnZhbGlkIHBvcnQiLGE1LGkpKTphLGopfWVsc2UgYTA9YTN9ZWxzZXthMD1hMwpiPWEwCmM9IiJ9
+YTE9UC5rYShhNSxuLG0sYTMsaixiIT1udWxsKQphMj1tPGw/UC5sZShhNSxtKzEsbCxhMyk6YTMKcmV0
+dXJuIG5ldyBQLkRuKGosYyxiLGEwLGExLGEyLGw8YTQ/UC50RyhhNSxsKzEsYTQpOmEzKX0sCk10KGEp
+e0gubihhKQpyZXR1cm4gUC5rdShhLDAsYS5sZW5ndGgsQy54TSwhMSl9LApXWChhKXt2YXIgcz10Lk4K
+cmV0dXJuIEMuTm0uTjAoSC5RSShhLnNwbGl0KCImIiksdC5zKSxQLkZsKHMscyksbmV3IFAubjEoQy54
+TSksdC5jayl9LApIaChhLGIsYyl7dmFyIHMscixxLHAsbyxuLG09IklQdjQgYWRkcmVzcyBzaG91bGQg
+Y29udGFpbiBleGFjdGx5IDQgcGFydHMiLGw9ImVhY2ggcGFydCBtdXN0IGJlIGluIHRoZSByYW5nZSAw
+Li4yNTUiLGs9bmV3IFAuY1MoYSksaj1uZXcgVWludDhBcnJheSg0KQpmb3Iocz1iLHI9cyxxPTA7czxj
+Oysrcyl7cD1DLnhCLk8oYSxzKQppZihwIT09NDYpe2lmKChwXjQ4KT45KWsuJDIoImludmFsaWQgY2hh
+cmFjdGVyIixzKX1lbHNle2lmKHE9PT0zKWsuJDIobSxzKQpvPVAuUUEoQy54Qi5OaihhLHIscyksbnVs
+bCkKaWYobz4yNTUpay4kMihsLHIpCm49cSsxCmlmKHE+PTQpcmV0dXJuIEguT0goaixxKQpqW3FdPW8K
+cj1zKzEKcT1ufX1pZihxIT09MylrLiQyKG0sYykKbz1QLlFBKEMueEIuTmooYSxyLGMpLG51bGwpCmlm
+KG8+MjU1KWsuJDIobCxyKQppZihxPj00KXJldHVybiBILk9IKGoscSkKaltxXT1vCnJldHVybiBqfSwK
+ZWcoYSxiLGEwKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZD1uZXcgUC5WQyhhKSxj
+PW5ldyBQLkpUKGQsYSkKaWYoYS5sZW5ndGg8MilkLiQxKCJhZGRyZXNzIGlzIHRvbyBzaG9ydCIpCnM9
+SC5RSShbXSx0LnQpCmZvcihyPWIscT1yLHA9ITEsbz0hMTtyPGEwOysrcil7bj1DLnhCLk8oYSxyKQpp
+ZihuPT09NTgpe2lmKHI9PT1iKXsrK3IKaWYoQy54Qi5PKGEscikhPT01OClkLiQyKCJpbnZhbGlkIHN0
+YXJ0IGNvbG9uLiIscikKcT1yfWlmKHI9PT1xKXtpZihwKWQuJDIoIm9ubHkgb25lIHdpbGRjYXJkIGA6
+OmAgaXMgYWxsb3dlZCIscikKQy5ObS5pKHMsLTEpCnA9ITB9ZWxzZSBDLk5tLmkocyxjLiQyKHEscikp
+CnE9cisxfWVsc2UgaWYobj09PTQ2KW89ITB9aWYocy5sZW5ndGg9PT0wKWQuJDEoInRvbyBmZXcgcGFy
+dHMiKQptPXE9PT1hMApsPUMuTm0uZ3JaKHMpCmlmKG0mJmwhPT0tMSlkLiQyKCJleHBlY3RlZCBhIHBh
+cnQgYWZ0ZXIgbGFzdCBgOmAiLGEwKQppZighbSlpZighbylDLk5tLmkocyxjLiQyKHEsYTApKQplbHNl
+e2s9UC5IaChhLHEsYTApCkMuTm0uaShzLChrWzBdPDw4fGtbMV0pPj4+MCkKQy5ObS5pKHMsKGtbMl08
+PDh8a1szXSk+Pj4wKX1pZihwKXtpZihzLmxlbmd0aD43KWQuJDEoImFuIGFkZHJlc3Mgd2l0aCBhIHdp
+bGRjYXJkIG11c3QgaGF2ZSBsZXNzIHRoYW4gNyBwYXJ0cyIpfWVsc2UgaWYocy5sZW5ndGghPT04KWQu
+JDEoImFuIGFkZHJlc3Mgd2l0aG91dCBhIHdpbGRjYXJkIG11c3QgY29udGFpbiBleGFjdGx5IDggcGFy
+dHMiKQpqPW5ldyBVaW50OEFycmF5KDE2KQpmb3IobD1zLmxlbmd0aCxpPTktbCxyPTAsaD0wO3I8bDsr
+K3Ipe2c9c1tyXQppZihnPT09LTEpZm9yKGY9MDtmPGk7KytmKXtpZihoPDB8fGg+PTE2KXJldHVybiBI
+Lk9IKGosaCkKaltoXT0wCmU9aCsxCmlmKGU+PTE2KXJldHVybiBILk9IKGosZSkKaltlXT0wCmgrPTJ9
+ZWxzZXtlPUMuam4ud0coZyw4KQppZihoPDB8fGg+PTE2KXJldHVybiBILk9IKGosaCkKaltoXT1lCmU9
+aCsxCmlmKGU+PTE2KXJldHVybiBILk9IKGosZSkKaltlXT1nJjI1NQpoKz0yfX1yZXR1cm4gan0sCktM
+KGEsYixjLGQsZSxmLGcpe3ZhciBzLHIscSxwLG8sbgpmPWY9PW51bGw/IiI6UC5QaShmLDAsZi5sZW5n
+dGgpCmc9UC56UihnLDAsZz09bnVsbD8wOmcubGVuZ3RoKQphPVAuT2UoYSwwLGE9PW51bGw/MDphLmxl
+bmd0aCwhMSkKcz1QLmxlKG51bGwsMCwwLGUpCnI9UC50RyhudWxsLDAsMCkKZD1QLndCKGQsZikKcT1m
+PT09ImZpbGUiCmlmKGE9PW51bGwpcD1nLmxlbmd0aCE9PTB8fGQhPW51bGx8fHEKZWxzZSBwPSExCmlm
+KHApYT0iIgpwPWE9PW51bGwKbz0hcApiPVAua2EoYiwwLGI9PW51bGw/MDpiLmxlbmd0aCxjLGYsbykK
+bj1mLmxlbmd0aD09PTAKaWYobiYmcCYmIUMueEIubihiLCIvIikpYj1QLndGKGIsIW58fG8pCmVsc2Ug
+Yj1QLnhlKGIpCnJldHVybiBuZXcgUC5EbihmLGcscCYmQy54Qi5uKGIsIi8vIik/IiI6YSxkLGIscyxy
+KX0sCndLKGEpe2lmKGE9PT0iaHR0cCIpcmV0dXJuIDgwCmlmKGE9PT0iaHR0cHMiKXJldHVybiA0NDMK
+cmV0dXJuIDB9LApOUihhLGIpe3ZhciBzLHIscSxwLG8sbgpmb3Iocz1hLmxlbmd0aCxyPTA7cjxzOysr
+cil7cT1DLnhCLlcoYSxyKQpwPUMueEIuVyhiLHIpCm89cV5wCmlmKG8hPT0wKXtpZihvPT09MzIpe249
+cHxvCmlmKDk3PD1uJiZuPD0xMjIpY29udGludWV9cmV0dXJuITF9fXJldHVybiEwfSwKUjMoYSxiLGMp
+e3Rocm93IEguYihQLnJyKGMsYSxiKSl9LApYZChhLGIsYyxkKXt2YXIgcyxyLHEscCxvLG4sbSxsLGss
+aixpLGg9bnVsbCxnPWIubGVuZ3RoCmlmKGchPT0wKXtxPTAKd2hpbGUoITApe2lmKCEocTxnKSl7cz0i
+IgpyPTAKYnJlYWt9aWYoQy54Qi5XKGIscSk9PT02NCl7cz1DLnhCLk5qKGIsMCxxKQpyPXErMQpicmVh
+a30rK3F9aWYocjxnJiZDLnhCLlcoYixyKT09PTkxKXtmb3IocD1yLG89LTE7cDxnOysrcCl7bj1DLnhC
+LlcoYixwKQppZihuPT09MzcmJm88MCl7bT1DLnhCLlFpKGIsIjI1IixwKzEpP3ArMjpwCm89cApwPW19
+ZWxzZSBpZihuPT09OTMpYnJlYWt9aWYocD09PWcpdGhyb3cgSC5iKFAucnIoIkludmFsaWQgSVB2NiBo
+b3N0IGVudHJ5LiIsYixyKSkKbD1vPDA/cDpvClAuZWcoYixyKzEsbCk7KytwCmlmKHAhPT1nJiZDLnhC
+LlcoYixwKSE9PTU4KXRocm93IEguYihQLnJyKCJJbnZhbGlkIGVuZCBvZiBhdXRob3JpdHkiLGIscCkp
+fWVsc2UgcD1yCndoaWxlKCEwKXtpZighKHA8Zykpe2s9aApicmVha31pZihDLnhCLlcoYixwKT09PTU4
+KXtqPUMueEIueW4oYixwKzEpCms9ai5sZW5ndGghPT0wP1AuUUEoaixoKTpoCmJyZWFrfSsrcH1pPUMu
+eEIuTmooYixyLHApfWVsc2V7az1oCmk9awpzPSIifXJldHVybiBQLktMKGksaCxILlFJKGMuc3BsaXQo
+Ii8iKSx0LnMpLGssZCxhLHMpfSwKa0UoYSxiKXt2YXIgcyxyLHEscCxvCmZvcihzPWEubGVuZ3RoLHI9
+MDtyPHM7KytyKXtxPWFbcl0KcD1KLlU2KHEpCm89cC5nQShxKQppZigwPm8pSC52KFAuVEUoMCwwLHAu
+Z0EocSksbnVsbCxudWxsKSkKaWYoSC5TUShxLCIvIiwwKSl7cz1QLkw0KCJJbGxlZ2FsIHBhdGggY2hh
+cmFjdGVyICIrSC5FaihxKSkKdGhyb3cgSC5iKHMpfX19LApITihhLGIsYyl7dmFyIHMscixxLHAKZm9y
+KHM9SC5xQyhhLGMsbnVsbCxILnQ2KGEpLmMpLHI9cy4kdGkscz1uZXcgSC5hNyhzLHMuZ0Eocyksci5D
+KCJhNzxhTC5FPiIpKSxyPXIuQygiYUwuRSIpO3MuRigpOyl7cT1yLmEocy5kKQpwPVAubnUoJ1siKi86
+PD4/XFxcXHxdJykKaWYoSC5TUShxLHAsMCkpe3M9UC5MNCgiSWxsZWdhbCBjaGFyYWN0ZXIgaW4gcGF0
+aDogIitxKQp0aHJvdyBILmIocyl9fX0sCnJnKGEsYil7dmFyIHMKaWYoISg2NTw9YSYmYTw9OTApKXM9
+OTc8PWEmJmE8PTEyMgplbHNlIHM9ITAKaWYocylyZXR1cm4Kcz1QLkw0KCJJbGxlZ2FsIGRyaXZlIGxl
+dHRlciAiK1AuT28oYSkpCnRocm93IEguYihzKX0sCndCKGEsYil7aWYoYSE9bnVsbCYmYT09PVAud0so
+YikpcmV0dXJuIG51bGwKcmV0dXJuIGF9LApPZShhLGIsYyxkKXt2YXIgcyxyLHEscCxvLG4KaWYoYT09
+bnVsbClyZXR1cm4gbnVsbAppZihiPT09YylyZXR1cm4iIgppZihDLnhCLk8oYSxiKT09PTkxKXtzPWMt
+MQppZihDLnhCLk8oYSxzKSE9PTkzKVAuUjMoYSxiLCJNaXNzaW5nIGVuZCBgXWAgdG8gbWF0Y2ggYFtg
+IGluIGhvc3QiKQpyPWIrMQpxPVAudG8oYSxyLHMpCmlmKHE8cyl7cD1xKzEKbz1QLk9BKGEsQy54Qi5R
+aShhLCIyNSIscCk/cSszOnAscywiJTI1Iil9ZWxzZSBvPSIiClAuZWcoYSxyLHEpCnJldHVybiBDLnhC
+Lk5qKGEsYixxKS50b0xvd2VyQ2FzZSgpK28rIl0ifWZvcihuPWI7bjxjOysrbilpZihDLnhCLk8oYSxu
+KT09PTU4KXtxPUMueEIuWFUoYSwiJSIsYikKcT1xPj1iJiZxPGM/cTpjCmlmKHE8Yyl7cD1xKzEKbz1Q
+Lk9BKGEsQy54Qi5RaShhLCIyNSIscCk/cSszOnAsYywiJTI1Iil9ZWxzZSBvPSIiClAuZWcoYSxiLHEp
+CnJldHVybiJbIitDLnhCLk5qKGEsYixxKStvKyJdIn1yZXR1cm4gUC5PTChhLGIsYyl9LAp0byhhLGIs
+Yyl7dmFyIHM9Qy54Qi5YVShhLCIlIixiKQpyZXR1cm4gcz49YiYmczxjP3M6Y30sCk9BKGEsYixjLGQp
+e3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGk9ZCE9PSIiP25ldyBQLk0oZCk6bnVsbApmb3Iocz1iLHI9
+cyxxPSEwO3M8Yzspe3A9Qy54Qi5PKGEscykKaWYocD09PTM3KXtvPVAucnYoYSxzLCEwKQpuPW89PW51
+bGwKaWYobiYmcSl7cys9Mwpjb250aW51ZX1pZihpPT1udWxsKWk9bmV3IFAuTSgiIikKbT1pLmErPUMu
+eEIuTmooYSxyLHMpCmlmKG4pbz1DLnhCLk5qKGEscyxzKzMpCmVsc2UgaWYobz09PSIlIilQLlIzKGEs
+cywiWm9uZUlEIHNob3VsZCBub3QgY29udGFpbiAlIGFueW1vcmUiKQppLmE9bStvCnMrPTMKcj1zCnE9
+ITB9ZWxzZXtpZihwPDEyNyl7bj1wPj4+NAppZihuPj04KXJldHVybiBILk9IKEMuRjMsbikKbj0oQy5G
+M1tuXSYxPDwocCYxNSkpIT09MH1lbHNlIG49ITEKaWYobil7aWYocSYmNjU8PXAmJjkwPj1wKXtpZihp
+PT1udWxsKWk9bmV3IFAuTSgiIikKaWYocjxzKXtpLmErPUMueEIuTmooYSxyLHMpCnI9c31xPSExfSsr
+c31lbHNle2lmKChwJjY0NTEyKT09PTU1Mjk2JiZzKzE8Yyl7bD1DLnhCLk8oYSxzKzEpCmlmKChsJjY0
+NTEyKT09PTU2MzIwKXtwPShwJjEwMjMpPDwxMHxsJjEwMjN8NjU1MzYKaz0yfWVsc2Ugaz0xfWVsc2Ug
+az0xCmo9Qy54Qi5OaihhLHIscykKaWYoaT09bnVsbCl7aT1uZXcgUC5NKCIiKQpuPWl9ZWxzZSBuPWkK
+bi5hKz1qCm4uYSs9UC56WChwKQpzKz1rCnI9c319fWlmKGk9PW51bGwpcmV0dXJuIEMueEIuTmooYSxi
+LGMpCmlmKHI8YylpLmErPUMueEIuTmooYSxyLGMpCm49aS5hCnJldHVybiBuLmNoYXJDb2RlQXQoMCk9
+PTA/bjpufSwKT0woYSxiLGMpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGkKZm9yKHM9YixyPXMscT1u
+dWxsLHA9ITA7czxjOyl7bz1DLnhCLk8oYSxzKQppZihvPT09Mzcpe249UC5ydihhLHMsITApCm09bj09
+bnVsbAppZihtJiZwKXtzKz0zCmNvbnRpbnVlfWlmKHE9PW51bGwpcT1uZXcgUC5NKCIiKQpsPUMueEIu
+TmooYSxyLHMpCms9cS5hKz0hcD9sLnRvTG93ZXJDYXNlKCk6bAppZihtKXtuPUMueEIuTmooYSxzLHMr
+MykKaj0zfWVsc2UgaWYobj09PSIlIil7bj0iJTI1IgpqPTF9ZWxzZSBqPTMKcS5hPWsrbgpzKz1qCnI9
+cwpwPSEwfWVsc2V7aWYobzwxMjcpe209bz4+PjQKaWYobT49OClyZXR1cm4gSC5PSChDLmVhLG0pCm09
+KEMuZWFbbV0mMTw8KG8mMTUpKSE9PTB9ZWxzZSBtPSExCmlmKG0pe2lmKHAmJjY1PD1vJiY5MD49byl7
+aWYocT09bnVsbClxPW5ldyBQLk0oIiIpCmlmKHI8cyl7cS5hKz1DLnhCLk5qKGEscixzKQpyPXN9cD0h
+MX0rK3N9ZWxzZXtpZihvPD05Myl7bT1vPj4+NAppZihtPj04KXJldHVybiBILk9IKEMuYWssbSkKbT0o
+Qy5ha1ttXSYxPDwobyYxNSkpIT09MH1lbHNlIG09ITEKaWYobSlQLlIzKGEscywiSW52YWxpZCBjaGFy
+YWN0ZXIiKQplbHNle2lmKChvJjY0NTEyKT09PTU1Mjk2JiZzKzE8Yyl7aT1DLnhCLk8oYSxzKzEpCmlm
+KChpJjY0NTEyKT09PTU2MzIwKXtvPShvJjEwMjMpPDwxMHxpJjEwMjN8NjU1MzYKaj0yfWVsc2Ugaj0x
+fWVsc2Ugaj0xCmw9Qy54Qi5OaihhLHIscykKaWYoIXApbD1sLnRvTG93ZXJDYXNlKCkKaWYocT09bnVs
+bCl7cT1uZXcgUC5NKCIiKQptPXF9ZWxzZSBtPXEKbS5hKz1sCm0uYSs9UC56WChvKQpzKz1qCnI9c319
+fX1pZihxPT1udWxsKXJldHVybiBDLnhCLk5qKGEsYixjKQppZihyPGMpe2w9Qy54Qi5OaihhLHIsYykK
+cS5hKz0hcD9sLnRvTG93ZXJDYXNlKCk6bH1tPXEuYQpyZXR1cm4gbS5jaGFyQ29kZUF0KDApPT0wP206
+bX0sClBpKGEsYixjKXt2YXIgcyxyLHEscAppZihiPT09YylyZXR1cm4iIgppZighUC5FdChDLnhCLlco
+YSxiKSkpUC5SMyhhLGIsIlNjaGVtZSBub3Qgc3RhcnRpbmcgd2l0aCBhbHBoYWJldGljIGNoYXJhY3Rl
+ciIpCmZvcihzPWIscj0hMTtzPGM7KytzKXtxPUMueEIuVyhhLHMpCmlmKHE8MTI4KXtwPXE+Pj40Cmlm
+KHA+PTgpcmV0dXJuIEguT0goQy5tSyxwKQpwPShDLm1LW3BdJjE8PChxJjE1KSkhPT0wfWVsc2UgcD0h
+MQppZighcClQLlIzKGEscywiSWxsZWdhbCBzY2hlbWUgY2hhcmFjdGVyIikKaWYoNjU8PXEmJnE8PTkw
+KXI9ITB9YT1DLnhCLk5qKGEsYixjKQpyZXR1cm4gUC5ZYShyP2EudG9Mb3dlckNhc2UoKTphKX0sCllh
+KGEpe2lmKGE9PT0iaHR0cCIpcmV0dXJuImh0dHAiCmlmKGE9PT0iZmlsZSIpcmV0dXJuImZpbGUiCmlm
+KGE9PT0iaHR0cHMiKXJldHVybiJodHRwcyIKaWYoYT09PSJwYWNrYWdlIilyZXR1cm4icGFja2FnZSIK
+cmV0dXJuIGF9LAp6UihhLGIsYyl7aWYoYT09bnVsbClyZXR1cm4iIgpyZXR1cm4gUC5QSShhLGIsYyxD
+LnRvLCExKX0sCmthKGEsYixjLGQsZSxmKXt2YXIgcyxyLHE9ZT09PSJmaWxlIixwPXF8fGYKaWYoYT09
+bnVsbCl7aWYoZD09bnVsbClyZXR1cm4gcT8iLyI6IiIKcz1ILnQ2KGQpCnI9bmV3IEgubEooZCxzLkMo
+InFVKDEpIikuYShuZXcgUC5SWigpKSxzLkMoImxKPDEscVU+IikpLmsoMCwiLyIpfWVsc2UgaWYoZCE9
+bnVsbCl0aHJvdyBILmIoUC54WSgiQm90aCBwYXRoIGFuZCBwYXRoU2VnbWVudHMgc3BlY2lmaWVkIixu
+dWxsKSkKZWxzZSByPVAuUEkoYSxiLGMsQy5XZCwhMCkKaWYoci5sZW5ndGg9PT0wKXtpZihxKXJldHVy
+biIvIn1lbHNlIGlmKHAmJiFDLnhCLm4ociwiLyIpKXI9Ii8iK3IKcmV0dXJuIFAuSnIocixlLGYpfSwK
+SnIoYSxiLGMpe3ZhciBzPWIubGVuZ3RoPT09MAppZihzJiYhYyYmIUMueEIubihhLCIvIikpcmV0dXJu
+IFAud0YoYSwhc3x8YykKcmV0dXJuIFAueGUoYSl9LApsZShhLGIsYyxkKXt2YXIgcyxyPXt9CmlmKGEh
+PW51bGwpe2lmKGQhPW51bGwpdGhyb3cgSC5iKFAueFkoIkJvdGggcXVlcnkgYW5kIHF1ZXJ5UGFyYW1l
+dGVycyBzcGVjaWZpZWQiLG51bGwpKQpyZXR1cm4gUC5QSShhLGIsYyxDLlZDLCEwKX1pZihkPT1udWxs
+KXJldHVybiBudWxsCnM9bmV3IFAuTSgiIikKci5hPSIiCmQuSygwLG5ldyBQLnk1KG5ldyBQLk1FKHIs
+cykpKQpyPXMuYQpyZXR1cm4gci5jaGFyQ29kZUF0KDApPT0wP3I6cn0sCnRHKGEsYixjKXtpZihhPT1u
+dWxsKXJldHVybiBudWxsCnJldHVybiBQLlBJKGEsYixjLEMuVkMsITApfSwKcnYoYSxiLGMpe3ZhciBz
+LHIscSxwLG8sbj1iKzIKaWYobj49YS5sZW5ndGgpcmV0dXJuIiUiCnM9Qy54Qi5PKGEsYisxKQpyPUMu
+eEIuTyhhLG4pCnE9SC5vbyhzKQpwPUgub28ocikKaWYocTwwfHxwPDApcmV0dXJuIiUiCm89cSoxNitw
+CmlmKG88MTI3KXtuPUMuam4ud0cobyw0KQppZihuPj04KXJldHVybiBILk9IKEMuRjMsbikKbj0oQy5G
+M1tuXSYxPDwobyYxNSkpIT09MH1lbHNlIG49ITEKaWYobilyZXR1cm4gSC5MdyhjJiY2NTw9byYmOTA+
+PW8/KG98MzIpPj4+MDpvKQppZihzPj05N3x8cj49OTcpcmV0dXJuIEMueEIuTmooYSxiLGIrMykudG9V
+cHBlckNhc2UoKQpyZXR1cm4gbnVsbH0sCnpYKGEpe3ZhciBzLHIscSxwLG8sbixtLGwsaz0iMDEyMzQ1
+Njc4OUFCQ0RFRiIKaWYoYTwxMjgpe3M9bmV3IFVpbnQ4QXJyYXkoMykKc1swXT0zNwpzWzFdPUMueEIu
+VyhrLGE+Pj40KQpzWzJdPUMueEIuVyhrLGEmMTUpfWVsc2V7aWYoYT4yMDQ3KWlmKGE+NjU1MzUpe3I9
+MjQwCnE9NH1lbHNle3I9MjI0CnE9M31lbHNle3I9MTkyCnE9Mn1wPTMqcQpzPW5ldyBVaW50OEFycmF5
+KHApCmZvcihvPTA7LS1xLHE+PTA7cj0xMjgpe249Qy5qbi5iZihhLDYqcSkmNjN8cgppZihvPj1wKXJl
+dHVybiBILk9IKHMsbykKc1tvXT0zNwptPW8rMQpsPUMueEIuVyhrLG4+Pj40KQppZihtPj1wKXJldHVy
+biBILk9IKHMsbSkKc1ttXT1sCmw9bysyCm09Qy54Qi5XKGssbiYxNSkKaWYobD49cClyZXR1cm4gSC5P
+SChzLGwpCnNbbF09bQpvKz0zfX1yZXR1cm4gUC5ITShzLDAsbnVsbCl9LApQSShhLGIsYyxkLGUpe3Zh
+ciBzPVAuVWwoYSxiLGMsZCxlKQpyZXR1cm4gcz09bnVsbD9DLnhCLk5qKGEsYixjKTpzfSwKVWwoYSxi
+LGMsZCxlKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaj1udWxsCmZvcihzPSFlLHI9YixxPXIscD1qO3I8
+Yzspe289Qy54Qi5PKGEscikKaWYobzwxMjcpe249bz4+PjQKaWYobj49OClyZXR1cm4gSC5PSChkLG4p
+Cm49KGRbbl0mMTw8KG8mMTUpKSE9PTB9ZWxzZSBuPSExCmlmKG4pKytyCmVsc2V7aWYobz09PTM3KXtt
+PVAucnYoYSxyLCExKQppZihtPT1udWxsKXtyKz0zCmNvbnRpbnVlfWlmKCIlIj09PW0pe209IiUyNSIK
+bD0xfWVsc2UgbD0zfWVsc2V7aWYocylpZihvPD05Myl7bj1vPj4+NAppZihuPj04KXJldHVybiBILk9I
+KEMuYWssbikKbj0oQy5ha1tuXSYxPDwobyYxNSkpIT09MH1lbHNlIG49ITEKZWxzZSBuPSExCmlmKG4p
+e1AuUjMoYSxyLCJJbnZhbGlkIGNoYXJhY3RlciIpCmw9agptPWx9ZWxzZXtpZigobyY2NDUxMik9PT01
+NTI5Nil7bj1yKzEKaWYobjxjKXtrPUMueEIuTyhhLG4pCmlmKChrJjY0NTEyKT09PTU2MzIwKXtvPShv
+JjEwMjMpPDwxMHxrJjEwMjN8NjU1MzYKbD0yfWVsc2UgbD0xfWVsc2UgbD0xfWVsc2UgbD0xCm09UC56
+WChvKX19aWYocD09bnVsbCl7cD1uZXcgUC5NKCIiKQpuPXB9ZWxzZSBuPXAKbi5hKz1DLnhCLk5qKGEs
+cSxyKQpuLmErPUguRWoobSkKaWYodHlwZW9mIGwhPT0ibnVtYmVyIilyZXR1cm4gSC5wWShsKQpyKz1s
+CnE9cn19aWYocD09bnVsbClyZXR1cm4gagppZihxPGMpcC5hKz1DLnhCLk5qKGEscSxjKQpzPXAuYQpy
+ZXR1cm4gcy5jaGFyQ29kZUF0KDApPT0wP3M6c30sCnlCKGEpe2lmKEMueEIubihhLCIuIikpcmV0dXJu
+ITAKcmV0dXJuIEMueEIuT1koYSwiLy4iKSE9PS0xfSwKeGUoYSl7dmFyIHMscixxLHAsbyxuLG0KaWYo
+IVAueUIoYSkpcmV0dXJuIGEKcz1ILlFJKFtdLHQucykKZm9yKHI9YS5zcGxpdCgiLyIpLHE9ci5sZW5n
+dGgscD0hMSxvPTA7bzxxOysrbyl7bj1yW29dCmlmKEouUk0obiwiLi4iKSl7bT1zLmxlbmd0aAppZiht
+IT09MCl7aWYoMD49bSlyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCmlmKHMubGVuZ3RoPT09MClDLk5t
+LmkocywiIil9cD0hMH1lbHNlIGlmKCIuIj09PW4pcD0hMAplbHNle0MuTm0uaShzLG4pCnA9ITF9fWlm
+KHApQy5ObS5pKHMsIiIpCnJldHVybiBDLk5tLmsocywiLyIpfSwKd0YoYSxiKXt2YXIgcyxyLHEscCxv
+LG4KaWYoIVAueUIoYSkpcmV0dXJuIWI/UC5DMShhKTphCnM9SC5RSShbXSx0LnMpCmZvcihyPWEuc3Bs
+aXQoIi8iKSxxPXIubGVuZ3RoLHA9ITEsbz0wO288cTsrK28pe249cltvXQppZigiLi4iPT09bilpZihz
+Lmxlbmd0aCE9PTAmJkMuTm0uZ3JaKHMpIT09Ii4uIil7aWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0go
+cywtMSkKcy5wb3AoKQpwPSEwfWVsc2V7Qy5ObS5pKHMsIi4uIikKcD0hMX1lbHNlIGlmKCIuIj09PW4p
+cD0hMAplbHNle0MuTm0uaShzLG4pCnA9ITF9fXI9cy5sZW5ndGgKaWYociE9PTApaWYocj09PTEpe2lm
+KDA+PXIpcmV0dXJuIEguT0gocywwKQpyPXNbMF0ubGVuZ3RoPT09MH1lbHNlIHI9ITEKZWxzZSByPSEw
+CmlmKHIpcmV0dXJuIi4vIgppZihwfHxDLk5tLmdyWihzKT09PSIuLiIpQy5ObS5pKHMsIiIpCmlmKCFi
+KXtpZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLDApCkMuTm0uWTUocywwLFAuQzEoc1swXSkpfXJl
+dHVybiBDLk5tLmsocywiLyIpfSwKQzEoYSl7dmFyIHMscixxLHA9YS5sZW5ndGgKaWYocD49MiYmUC5F
+dChDLnhCLlcoYSwwKSkpZm9yKHM9MTtzPHA7KytzKXtyPUMueEIuVyhhLHMpCmlmKHI9PT01OClyZXR1
+cm4gQy54Qi5OaihhLDAscykrIiUzQSIrQy54Qi55bihhLHMrMSkKaWYocjw9MTI3KXtxPXI+Pj40Cmlm
+KHE+PTgpcmV0dXJuIEguT0goQy5tSyxxKQpxPShDLm1LW3FdJjE8PChyJjE1KSk9PT0wfWVsc2UgcT0h
+MAppZihxKWJyZWFrfXJldHVybiBhfSwKdWooYSxiKXtpZihhLmhCKCJwYWNrYWdlIikmJmEuYz09bnVs
+bClyZXR1cm4gUC5mRihiLDAsYi5sZW5ndGgpCnJldHVybi0xfSwKbW4oYSl7dmFyIHMscixxLHA9YS5n
+RmooKSxvPXAubGVuZ3RoCmlmKG8+MCYmSi5IbShwWzBdKT09PTImJkouYTYocFswXSwxKT09PTU4KXtp
+ZigwPj1vKXJldHVybiBILk9IKHAsMCkKUC5yZyhKLmE2KHBbMF0sMCksITEpClAuSE4ocCwhMSwxKQpz
+PSEwfWVsc2V7UC5ITihwLCExLDApCnM9ITF9cj1hLmd0VCgpJiYhcz8iIisiXFwiOiIiCmlmKGEuZ2Nq
+KCkpe3E9YS5nSmYoYSkKaWYocS5sZW5ndGghPT0wKXI9cisiXFwiK3ErIlxcIn1yPVAubChyLHAsIlxc
+IikKbz1zJiZvPT09MT9yKyJcXCI6cgpyZXR1cm4gby5jaGFyQ29kZUF0KDApPT0wP286b30sCkloKGEs
+Yil7dmFyIHMscixxCmZvcihzPTAscj0wO3I8MjsrK3Ipe3E9Qy54Qi5XKGEsYityKQppZig0ODw9cSYm
+cTw9NTcpcz1zKjE2K3EtNDgKZWxzZXtxfD0zMgppZig5Nzw9cSYmcTw9MTAyKXM9cyoxNitxLTg3CmVs
+c2UgdGhyb3cgSC5iKFAueFkoIkludmFsaWQgVVJMIGVuY29kaW5nIixudWxsKSl9fXJldHVybiBzfSwK
+a3UoYSxiLGMsZCxlKXt2YXIgcyxyLHEscCxvPWIKd2hpbGUoITApe2lmKCEobzxjKSl7cz0hMApicmVh
+a31yPUMueEIuVyhhLG8pCmlmKHI8PTEyNylpZihyIT09MzcpcT1lJiZyPT09NDMKZWxzZSBxPSEwCmVs
+c2UgcT0hMAppZihxKXtzPSExCmJyZWFrfSsrb31pZihzKXtpZihDLnhNIT09ZClxPSExCmVsc2UgcT0h
+MAppZihxKXJldHVybiBDLnhCLk5qKGEsYixjKQplbHNlIHA9bmV3IEgucWooQy54Qi5OaihhLGIsYykp
+fWVsc2V7cD1ILlFJKFtdLHQudCkKZm9yKHE9YS5sZW5ndGgsbz1iO288YzsrK28pe3I9Qy54Qi5XKGEs
+bykKaWYocj4xMjcpdGhyb3cgSC5iKFAueFkoIklsbGVnYWwgcGVyY2VudCBlbmNvZGluZyBpbiBVUkki
+LG51bGwpKQppZihyPT09Mzcpe2lmKG8rMz5xKXRocm93IEguYihQLnhZKCJUcnVuY2F0ZWQgVVJJIixu
+dWxsKSkKQy5ObS5pKHAsUC5JaChhLG8rMSkpCm8rPTJ9ZWxzZSBpZihlJiZyPT09NDMpQy5ObS5pKHAs
+MzIpCmVsc2UgQy5ObS5pKHAscil9fXQuTC5hKHApCnJldHVybiBDLm9FLldKKHApfSwKRXQoYSl7dmFy
+IHM9YXwzMgpyZXR1cm4gOTc8PXMmJnM8PTEyMn0sCktEKGEsYixjKXt2YXIgcyxyLHEscCxvLG4sbSxs
+LGs9IkludmFsaWQgTUlNRSB0eXBlIixqPUguUUkoW2ItMV0sdC50KQpmb3Iocz1hLmxlbmd0aCxyPWIs
+cT0tMSxwPW51bGw7cjxzOysrcil7cD1DLnhCLlcoYSxyKQppZihwPT09NDR8fHA9PT01OSlicmVhawpp
+ZihwPT09NDcpe2lmKHE8MCl7cT1yCmNvbnRpbnVlfXRocm93IEguYihQLnJyKGssYSxyKSl9fWlmKHE8
+MCYmcj5iKXRocm93IEguYihQLnJyKGssYSxyKSkKZm9yKDtwIT09NDQ7KXtDLk5tLmkoaixyKTsrK3IK
+Zm9yKG89LTE7cjxzOysrcil7cD1DLnhCLlcoYSxyKQppZihwPT09NjEpe2lmKG88MClvPXJ9ZWxzZSBp
+ZihwPT09NTl8fHA9PT00NClicmVha31pZihvPj0wKUMuTm0uaShqLG8pCmVsc2V7bj1DLk5tLmdyWihq
+KQppZihwIT09NDR8fHIhPT1uKzd8fCFDLnhCLlFpKGEsImJhc2U2NCIsbisxKSl0aHJvdyBILmIoUC5y
+cigiRXhwZWN0aW5nICc9JyIsYSxyKSkKYnJlYWt9fUMuTm0uaShqLHIpCm09cisxCmlmKChqLmxlbmd0
+aCYxKT09PTEpYT1DLmg5LnlyKGEsbSxzKQplbHNle2w9UC5VbChhLG0scyxDLlZDLCEwKQppZihsIT1u
+dWxsKWE9Qy54Qi5pNyhhLG0scyxsKX1yZXR1cm4gbmV3IFAuUEUoYSxqLGMpfSwKS04oKXt2YXIgcyxy
+LHEscCxvLG4sbT0iMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamts
+bW5vcHFyc3R1dnd4eXotLl9+ISQmJygpKissOz0iLGw9Ii4iLGs9IjoiLGo9Ii8iLGk9Ij8iLGg9IiMi
+LGc9SC5RSShuZXcgQXJyYXkoMjIpLHQuZ04pCmZvcihzPTA7czwyMjsrK3MpZ1tzXT1uZXcgVWludDhB
+cnJheSg5NikKcj1uZXcgUC55SShnKQpxPW5ldyBQLmM2KCkKcD1uZXcgUC5xZCgpCm89dC5nYwpuPW8u
+YShyLiQyKDAsMjI1KSkKcS4kMyhuLG0sMSkKcS4kMyhuLGwsMTQpCnEuJDMobixrLDM0KQpxLiQzKG4s
+aiwzKQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxNCwyMjUpKQpxLiQzKG4s
+bSwxKQpxLiQzKG4sbCwxNSkKcS4kMyhuLGssMzQpCnEuJDMobixqLDIzNCkKcS4kMyhuLGksMTcyKQpx
+LiQzKG4saCwyMDUpCm49by5hKHIuJDIoMTUsMjI1KSkKcS4kMyhuLG0sMSkKcS4kMyhuLCIlIiwyMjUp
+CnEuJDMobixrLDM0KQpxLiQzKG4saiw5KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEo
+ci4kMigxLDIyNSkpCnEuJDMobixtLDEpCnEuJDMobixrLDM0KQpxLiQzKG4saiwxMCkKcS4kMyhuLGks
+MTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoMiwyMzUpKQpxLiQzKG4sbSwxMzkpCnEuJDMobixq
+LDEzMSkKcS4kMyhuLGwsMTQ2KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigz
+LDIzNSkpCnEuJDMobixtLDExKQpxLiQzKG4saiw2OCkKcS4kMyhuLGwsMTgpCnEuJDMobixpLDE3MikK
+cS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDQsMjI5KSkKcS4kMyhuLG0sNSkKcC4kMyhuLCJBWiIsMjI5
+KQpxLiQzKG4saywxMDIpCnEuJDMobiwiQCIsNjgpCnEuJDMobiwiWyIsMjMyKQpxLiQzKG4saiwxMzgp
+CnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDUsMjI5KSkKcS4kMyhuLG0sNSkK
+cC4kMyhuLCJBWiIsMjI5KQpxLiQzKG4saywxMDIpCnEuJDMobiwiQCIsNjgpCnEuJDMobixqLDEzOCkK
+cS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoNiwyMzEpKQpwLiQzKG4sIjE5Iiw3
+KQpxLiQzKG4sIkAiLDY4KQpxLiQzKG4saiwxMzgpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpu
+PW8uYShyLiQyKDcsMjMxKSkKcC4kMyhuLCIwOSIsNykKcS4kMyhuLCJAIiw2OCkKcS4kMyhuLGosMTM4
+KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKcS4kMyhvLmEoci4kMig4LDgpKSwiXSIsNSkKbj1v
+LmEoci4kMig5LDIzNSkpCnEuJDMobixtLDExKQpxLiQzKG4sbCwxNikKcS4kMyhuLGosMjM0KQpxLiQz
+KG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxNiwyMzUpKQpxLiQzKG4sbSwxMSkKcS4k
+MyhuLGwsMTcpCnEuJDMobixqLDIzNCkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIu
+JDIoMTcsMjM1KSkKcS4kMyhuLG0sMTEpCnEuJDMobixqLDkpCnEuJDMobixpLDE3MikKcS4kMyhuLGgs
+MjA1KQpuPW8uYShyLiQyKDEwLDIzNSkpCnEuJDMobixtLDExKQpxLiQzKG4sbCwxOCkKcS4kMyhuLGos
+MjM0KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxOCwyMzUpKQpxLiQzKG4s
+bSwxMSkKcS4kMyhuLGwsMTkpCnEuJDMobixqLDIzNCkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUp
+Cm49by5hKHIuJDIoMTksMjM1KSkKcS4kMyhuLG0sMTEpCnEuJDMobixqLDIzNCkKcS4kMyhuLGksMTcy
+KQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoMTEsMjM1KSkKcS4kMyhuLG0sMTEpCnEuJDMobixqLDEw
+KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxMiwyMzYpKQpxLiQzKG4sbSwx
+MikKcS4kMyhuLGksMTIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxMywyMzcpKQpxLiQzKG4sbSwx
+MykKcS4kMyhuLGksMTMpCnAuJDMoby5hKHIuJDIoMjAsMjQ1KSksImF6IiwyMSkKcj1vLmEoci4kMigy
+MSwyNDUpKQpwLiQzKHIsImF6IiwyMSkKcC4kMyhyLCIwOSIsMjEpCnEuJDMociwiKy0uIiwyMSkKcmV0
+dXJuIGd9LApVQihhLGIsYyxkLGUpe3ZhciBzLHIscSxwLG89JC52WigpCmZvcihzPWI7czxjOysrcyl7
+aWYoZDwwfHxkPj1vLmxlbmd0aClyZXR1cm4gSC5PSChvLGQpCnI9b1tkXQpxPUMueEIuVyhhLHMpXjk2
+CnA9cltxPjk1PzMxOnFdCmQ9cCYzMQpDLk5tLlk1KGUscD4+PjUscyl9cmV0dXJuIGR9LApSeChhKXtp
+ZihhLmI9PT03JiZDLnhCLm4oYS5hLCJwYWNrYWdlIikmJmEuYzw9MClyZXR1cm4gUC5mRihhLmEsYS5l
+LGEuZikKcmV0dXJuLTF9LApmRihhLGIsYyl7dmFyIHMscixxCmZvcihzPWIscj0wO3M8YzsrK3Mpe3E9
+Qy54Qi5PKGEscykKaWYocT09PTQ3KXJldHVybiByIT09MD9zOi0xCmlmKHE9PT0zN3x8cT09PTU4KXJl
+dHVybi0xCnJ8PXFeNDZ9cmV0dXJuLTF9LApXRjpmdW5jdGlvbiBXRihhLGIpe3RoaXMuYT1hCnRoaXMu
+Yj1ifSwKaVA6ZnVuY3Rpb24gaVAoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClhTOmZ1bmN0aW9uIFhT
+KCl7fSwKQzY6ZnVuY3Rpb24gQzYoYSl7dGhpcy5hPWF9LApFejpmdW5jdGlvbiBFeigpe30sCkY6ZnVu
+Y3Rpb24gRigpe30sCkFUOmZ1bmN0aW9uIEFUKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIK
+Xy5jPWMKXy5kPWR9LApiSjpmdW5jdGlvbiBiSihhLGIsYyxkLGUsZil7dmFyIF89dGhpcwpfLmU9YQpf
+LmY9YgpfLmE9YwpfLmI9ZApfLmM9ZQpfLmQ9Zn0sCmVZOmZ1bmN0aW9uIGVZKGEsYixjLGQsZSl7dmFy
+IF89dGhpcwpfLmY9YQpfLmE9YgpfLmI9YwpfLmM9ZApfLmQ9ZX0sCm1wOmZ1bmN0aW9uIG1wKGEsYixj
+LGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LAp1YjpmdW5jdGlvbiB1YihhKXt0
+aGlzLmE9YX0sCmRzOmZ1bmN0aW9uIGRzKGEpe3RoaXMuYT1hfSwKbGo6ZnVuY3Rpb24gbGooYSl7dGhp
+cy5hPWF9LApVVjpmdW5jdGlvbiBVVihhKXt0aGlzLmE9YX0sCms1OmZ1bmN0aW9uIGs1KCl7fSwKS1k6
+ZnVuY3Rpb24gS1koKXt9LApwOmZ1bmN0aW9uIHAoYSl7dGhpcy5hPWF9LApDRDpmdW5jdGlvbiBDRChh
+KXt0aGlzLmE9YX0sCmFFOmZ1bmN0aW9uIGFFKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9
+Y30sCmNYOmZ1bmN0aW9uIGNYKCl7fSwKQW46ZnVuY3Rpb24gQW4oKXt9LApOMzpmdW5jdGlvbiBOMyhh
+LGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy4kdGk9Y30sCmM4OmZ1bmN0aW9uIGM4KCl7fSwKTWg6
+ZnVuY3Rpb24gTWgoKXt9LApaZDpmdW5jdGlvbiBaZCgpe30sCk06ZnVuY3Rpb24gTShhKXt0aGlzLmE9
+YX0sCm4xOmZ1bmN0aW9uIG4xKGEpe3RoaXMuYT1hfSwKY1M6ZnVuY3Rpb24gY1MoYSl7dGhpcy5hPWF9
+LApWQzpmdW5jdGlvbiBWQyhhKXt0aGlzLmE9YX0sCkpUOmZ1bmN0aW9uIEpUKGEsYil7dGhpcy5hPWEK
+dGhpcy5iPWJ9LApEbjpmdW5jdGlvbiBEbihhLGIsYyxkLGUsZixnKXt2YXIgXz10aGlzCl8uYT1hCl8u
+Yj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mCl8ucj1nCl8uUT1fLno9Xy55PV8ueD1udWxsfSwKUlo6
+ZnVuY3Rpb24gUlooKXt9LApNRTpmdW5jdGlvbiBNRShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKeTU6
+ZnVuY3Rpb24geTUoYSl7dGhpcy5hPWF9LApQRTpmdW5jdGlvbiBQRShhLGIsYyl7dGhpcy5hPWEKdGhp
+cy5iPWIKdGhpcy5jPWN9LAp5STpmdW5jdGlvbiB5SShhKXt0aGlzLmE9YX0sCmM2OmZ1bmN0aW9uIGM2
+KCl7fSwKcWQ6ZnVuY3Rpb24gcWQoKXt9LApVZjpmdW5jdGlvbiBVZihhLGIsYyxkLGUsZixnLGgpe3Zh
+ciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcKXy54PWgKXy55
+PW51bGx9LApxZTpmdW5jdGlvbiBxZShhLGIsYyxkLGUsZixnKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1i
+Cl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mCl8ucj1nCl8uUT1fLno9Xy55PV8ueD1udWxsfSwKaUo6ZnVu
+Y3Rpb24gaUooKXt9LApFMjpmdW5jdGlvbiBFMihhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKamc6ZnVu
+Y3Rpb24gamcoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkJmOmZ1bmN0aW9uIEJmKGEsYil7dGhpcy5h
+PWEKdGhpcy5iPWJ9LApBczpmdW5jdGlvbiBBcygpe30sCkdFOmZ1bmN0aW9uIEdFKGEpe3RoaXMuYT1h
+fSwKTjc6ZnVuY3Rpb24gTjcoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnVROmZ1bmN0aW9uIHVRKCl7
+fSwKaEY6ZnVuY3Rpb24gaEYoKXt9LApSNChhLGIsYyxkKXt2YXIgcyxyLHEKSC5wOChiKQp0LmouYShk
+KQppZihiKXtzPVtjXQpDLk5tLkZWKHMsZCkKZD1zfXI9dC56CnE9UC5QVyhKLk0xKGQsUC53MCgpLHIp
+LCEwLHIpCnQuWS5hKGEpCnJldHVybiBQLndZKEguRWsoYSxxLG51bGwpKX0sCkRtKGEsYixjKXt2YXIg
+cwp0cnl7aWYoT2JqZWN0LmlzRXh0ZW5zaWJsZShhKSYmIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJv
+cGVydHkuY2FsbChhLGIpKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHt2YWx1ZTpjfSkKcmV0dXJu
+ITB9fWNhdGNoKHMpe0guUnUocyl9cmV0dXJuITF9LApPbShhLGIpe2lmKE9iamVjdC5wcm90b3R5cGUu
+aGFzT3duUHJvcGVydHkuY2FsbChhLGIpKXJldHVybiBhW2JdCnJldHVybiBudWxsfSwKd1koYSl7aWYo
+YT09bnVsbHx8dHlwZW9mIGE9PSJzdHJpbmcifHx0eXBlb2YgYT09Im51bWJlciJ8fEguclEoYSkpcmV0
+dXJuIGEKaWYoYSBpbnN0YW5jZW9mIFAuRTQpcmV0dXJuIGEuYQppZihILlI5KGEpKXJldHVybiBhCmlm
+KHQuYWsuYihhKSlyZXR1cm4gYQppZihhIGluc3RhbmNlb2YgUC5pUClyZXR1cm4gSC5vMihhKQppZih0
+LlkuYihhKSlyZXR1cm4gUC5oRShhLCIkZGFydF9qc0Z1bmN0aW9uIixuZXcgUC5EVigpKQpyZXR1cm4g
+UC5oRShhLCJfJGRhcnRfanNPYmplY3QiLG5ldyBQLlBDKCQua0koKSkpfSwKaEUoYSxiLGMpe3ZhciBz
+PVAuT20oYSxiKQppZihzPT1udWxsKXtzPWMuJDEoYSkKUC5EbShhLGIscyl9cmV0dXJuIHN9LApkVShh
+KXt2YXIgcyxyCmlmKGE9PW51bGx8fHR5cGVvZiBhPT0ic3RyaW5nInx8dHlwZW9mIGE9PSJudW1iZXIi
+fHx0eXBlb2YgYT09ImJvb2xlYW4iKXJldHVybiBhCmVsc2UgaWYoYSBpbnN0YW5jZW9mIE9iamVjdCYm
+SC5SOShhKSlyZXR1cm4gYQplbHNlIGlmKGEgaW5zdGFuY2VvZiBPYmplY3QmJnQuYWsuYihhKSlyZXR1
+cm4gYQplbHNlIGlmKGEgaW5zdGFuY2VvZiBEYXRlKXtzPUguSVooYS5nZXRUaW1lKCkpCmlmKE1hdGgu
+YWJzKHMpPD04NjRlMTMpcj0hMQplbHNlIHI9ITAKaWYocilILnYoUC54WSgiRGF0ZVRpbWUgaXMgb3V0
+c2lkZSB2YWxpZCByYW5nZTogIitzLG51bGwpKQpILmNiKCExLCJpc1V0YyIsdC55KQpyZXR1cm4gbmV3
+IFAuaVAocywhMSl9ZWxzZSBpZihhLmNvbnN0cnVjdG9yPT09JC5rSSgpKXJldHVybiBhLm8KZWxzZSBy
+ZXR1cm4gUC5ORChhKX0sCk5EKGEpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBQLmlRKGEs
+JC56KCksbmV3IFAuUVMoKSkKaWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBQLmlRKGEsJC5SOCgp
+LG5ldyBQLm5wKCkpCnJldHVybiBQLmlRKGEsJC5SOCgpLG5ldyBQLlV0KCkpfSwKaVEoYSxiLGMpe3Zh
+ciBzPVAuT20oYSxiKQppZihzPT1udWxsfHwhKGEgaW5zdGFuY2VvZiBPYmplY3QpKXtzPWMuJDEoYSkK
+UC5EbShhLGIscyl9cmV0dXJuIHN9LApEVjpmdW5jdGlvbiBEVigpe30sClBDOmZ1bmN0aW9uIFBDKGEp
+e3RoaXMuYT1hfSwKUVM6ZnVuY3Rpb24gUVMoKXt9LApucDpmdW5jdGlvbiBucCgpe30sClV0OmZ1bmN0
+aW9uIFV0KCl7fSwKRTQ6ZnVuY3Rpb24gRTQoYSl7dGhpcy5hPWF9LApyNzpmdW5jdGlvbiByNyhhKXt0
+aGlzLmE9YX0sClR6OmZ1bmN0aW9uIFR6KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCnZnOmZ1bmN0
+aW9uIHZnKCl7fSwKbmQ6ZnVuY3Rpb24gbmQoKXt9LApLZTpmdW5jdGlvbiBLZShhKXt0aGlzLmE9YX0s
+CmhpOmZ1bmN0aW9uIGhpKCl7fX0sUj17Cm56KGEpe3ZhciBzPUguVWMoYS5xKDAsIm5vZGVJZCIpKQpy
+ZXR1cm4gbmV3IFIuTEwoQy5ObS5IdChDLnJrLG5ldyBSLk1EKGEpKSxzKX0sCk9YKGEpe3N3aXRjaChh
+KXtjYXNlIEMuQWQ6cmV0dXJuIkFkZCAvKj8qLyBoaW50IgpjYXNlIEMubmU6cmV0dXJuIkFkZCAvKiEq
+LyBoaW50IgpjYXNlIEMud1Y6cmV0dXJuIlJlbW92ZSAvKj8qLyBoaW50IgpjYXNlIEMuZlI6cmV0dXJu
+IlJlbW92ZSAvKiEqLyBoaW50IgpjYXNlIEMubXk6cmV0dXJuIkNoYW5nZSB0byAvKj8qLyBoaW50Igpj
+YXNlIEMucng6cmV0dXJuIkNoYW5nZSB0byAvKiEqLyBoaW50In19LApMTDpmdW5jdGlvbiBMTChhLGIp
+e3RoaXMuYT1hCnRoaXMuYj1ifSwKTUQ6ZnVuY3Rpb24gTUQoYSl7dGhpcy5hPWF9LApINzpmdW5jdGlv
+biBINyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifX0sVD17bVE6ZnVuY3Rpb24gbVEoKXt9fSxVPXsKamYo
+YSl7dmFyIHMscixxLHAKaWYoYT09bnVsbClzPW51bGwKZWxzZXtzPUguUUkoW10sdC5mQSkKZm9yKHI9
+Si5JVChhKTtyLkYoKTspe3E9ci5nbCgpCnA9Si5VNihxKQpzLnB1c2gobmV3IFUuU2UoSC5rKHAucShx
+LCJkZXNjcmlwdGlvbiIpKSxILmsocC5xKHEsImhyZWYiKSkpKX19cmV0dXJuIHN9LApOZChhKXt2YXIg
+cyxyCmlmKGE9PW51bGwpcz1udWxsCmVsc2V7cz1ILlFJKFtdLHQuaGgpCmZvcihyPUouSVQoYSk7ci5G
+KCk7KXMucHVzaChVLk5mKHIuZ2woKSkpfXJldHVybiBzfSwKTmYoYSl7dmFyIHM9Si5VNihhKSxyPUgu
+ayhzLnEoYSwiZGVzY3JpcHRpb24iKSkscT1ILlFJKFtdLHQuYUopCmZvcihzPUouSVQodC5XLmEocy5x
+KGEsImVudHJpZXMiKSkpO3MuRigpOylxLnB1c2goVS5SaihzLmdsKCkpKQpyZXR1cm4gbmV3IFUueUQo
+cixxKX0sClJqKGEpe3ZhciBzLHI9Si5VNihhKSxxPUguayhyLnEoYSwiZGVzY3JpcHRpb24iKSkscD1I
+Lmsoci5xKGEsImZ1bmN0aW9uIikpLG89ci5xKGEsImxpbmsiKQppZihvPT1udWxsKW89bnVsbAplbHNl
+e3M9Si5VNihvKQpvPW5ldyBVLk1sKEguayhzLnEobywiaHJlZiIpKSxILlVjKHMucShvLCJsaW5lIikp
+LEguayhzLnEobywicGF0aCIpKSl9cj10LmJNLmEoci5xKGEsImhpbnRBY3Rpb25zIikpCnI9cj09bnVs
+bD9udWxsOkouTTEocixuZXcgVS5hTigpLHQuSikuYnIoMCkKcmV0dXJuIG5ldyBVLndiKHEscCxvLHI9
+PW51bGw/Qy5kbjpyKX0sCmQyOmZ1bmN0aW9uIGQyKGEsYixjLGQsZSxmKXt2YXIgXz10aGlzCl8uYT1h
+Cl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mfSwKU2U6ZnVuY3Rpb24gU2UoYSxiKXt0aGlzLmE9
+YQp0aGlzLmI9Yn0sCk1sOmZ1bmN0aW9uIE1sKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9
+Y30sCnlEOmZ1bmN0aW9uIHlEKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAp3YjpmdW5jdGlvbiB3Yihh
+LGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kfSwKYU46ZnVuY3Rpb24gYU4o
+KXt9LApiMDpmdW5jdGlvbiBiMCgpe319LFc9ewp4Mygpe3JldHVybiB3aW5kb3d9LApacigpe3JldHVy
+biBkb2N1bWVudH0sCko2KGEpe3ZhciBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQppZihhIT1u
+dWxsKUMueG4uc0xVKHMsYSkKcmV0dXJuIHN9LApMaihhKXtyZXR1cm4gQ1NTLmVzY2FwZShhKX0sClU5
+KGEsYixjKXt2YXIgcyxyPWRvY3VtZW50LmJvZHkKci50b1N0cmluZwpzPXQuYWMKcz1uZXcgSC5VNShu
+ZXcgVy5lNyhDLlJZLnI2KHIsYSxiLGMpKSxzLkMoImEyKGxELkUpIikuYShuZXcgVy5DdigpKSxzLkMo
+IlU1PGxELkU+IikpCnJldHVybiB0LmguYShzLmdyOChzKSl9LApyUyhhKXt2YXIgcyxyLHE9ImVsZW1l
+bnQgdGFnIHVuYXZhaWxhYmxlIgp0cnl7cz1KLllFKGEpCnMuZ25zKGEpCnE9cy5nbnMoYSl9Y2F0Y2go
+cil7SC5SdShyKX1yZXR1cm4gcX0sCkMwKGEsYil7YT1hK2ImNTM2ODcwOTExCmE9YSsoKGEmNTI0Mjg3
+KTw8MTApJjUzNjg3MDkxMQpyZXR1cm4gYV5hPj4+Nn0sCnJFKGEsYixjLGQpe3ZhciBzPVcuQzAoVy5D
+MChXLkMwKFcuQzAoMCxhKSxiKSxjKSxkKSxyPXMrKChzJjY3MTA4ODYzKTw8MykmNTM2ODcwOTExCnJe
+PXI+Pj4xMQpyZXR1cm4gcisoKHImMTYzODMpPDwxNSkmNTM2ODcwOTExfSwKVE4oYSxiKXt2YXIgcyxy
+LHE9YS5jbGFzc0xpc3QKZm9yKHM9Yi5sZW5ndGgscj0wO3I8Yi5sZW5ndGg7Yi5sZW5ndGg9PT1zfHwo
+MCxILmxrKShiKSwrK3IpcS5hZGQoYltyXSl9LApKRShhLGIsYyxkLGUpe3ZhciBzPVcuYUYobmV3IFcu
+dk4oYyksdC5CKQppZihzIT1udWxsJiYhMClKLmRaKGEsYixzLCExKQpyZXR1cm4gbmV3IFcueEMoYSxi
+LHMsITEsZS5DKCJ4QzwwPiIpKX0sClR3KGEpe3ZhciBzPVcuSjYobnVsbCkscj10LkYuYSh3aW5kb3cu
+bG9jYXRpb24pCnM9bmV3IFcuSlEobmV3IFcubWsocyxyKSkKcy5DWShhKQpyZXR1cm4gc30sCnFEKGEs
+YixjLGQpe3QuaC5hKGEpCkgubihiKQpILm4oYykKdC5jci5hKGQpCnJldHVybiEwfSwKblooYSxiLGMs
+ZCl7dmFyIHMscixxCnQuaC5hKGEpCkgubihiKQpILm4oYykKcz10LmNyLmEoZCkuYQpyPXMuYQpDLnhu
+LnNMVShyLGMpCnE9ci5ob3N0bmFtZQpzPXMuYgppZighKHE9PXMuaG9zdG5hbWUmJnIucG9ydD09PXMu
+cG9ydCYmci5wcm90b2NvbD09PXMucHJvdG9jb2wpKWlmKHE9PT0iIilpZihyLnBvcnQ9PT0iIil7cz1y
+LnByb3RvY29sCnM9cz09PSI6Inx8cz09PSIifWVsc2Ugcz0hMQplbHNlIHM9ITEKZWxzZSBzPSEwCnJl
+dHVybiBzfSwKQmwoKXt2YXIgcz10Lk4scj1QLnRNKEMuUXgscykscT10LmRHLmEobmV3IFcuSUEoKSks
+cD1ILlFJKFsiVEVNUExBVEUiXSx0LnMpCnM9bmV3IFcuY3QocixQLkxzKHMpLFAuTHMocyksUC5Mcyhz
+KSxudWxsKQpzLkNZKG51bGwsbmV3IEgubEooQy5ReCxxLHQuZHYpLHAsbnVsbCkKcmV0dXJuIHN9LApx
+YyhhKXt2YXIgcwppZihhPT1udWxsKXJldHVybiBudWxsCmlmKCJwb3N0TWVzc2FnZSIgaW4gYSl7cz1X
+LlAxKGEpCnJldHVybiBzfWVsc2UgcmV0dXJuIHQuY2guYShhKX0sClAxKGEpe2lmKGE9PT13aW5kb3cp
+cmV0dXJuIHQuY2kuYShhKQplbHNlIHJldHVybiBuZXcgVy5kVygpfSwKYUYoYSxiKXt2YXIgcz0kLlgz
+CmlmKHM9PT1DLk5VKXJldHVybiBhCnJldHVybiBzLlB5KGEsYil9LApxRTpmdW5jdGlvbiBxRSgpe30s
+CkdoOmZ1bmN0aW9uIEdoKCl7fSwKZlk6ZnVuY3Rpb24gZlkoKXt9LApyWjpmdW5jdGlvbiByWigpe30s
+CkF6OmZ1bmN0aW9uIEF6KCl7fSwKUVA6ZnVuY3Rpb24gUVAoKXt9LApueDpmdW5jdGlvbiBueCgpe30s
+Cm9KOmZ1bmN0aW9uIG9KKCl7fSwKaWQ6ZnVuY3Rpb24gaWQoKXt9LApRRjpmdW5jdGlvbiBRRigpe30s
+Ck5oOmZ1bmN0aW9uIE5oKCl7fSwKYWU6ZnVuY3Rpb24gYWUoKXt9LApJQjpmdW5jdGlvbiBJQigpe30s
+Cm43OmZ1bmN0aW9uIG43KCl7fSwKd3o6ZnVuY3Rpb24gd3ooYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1i
+fSwKY3Y6ZnVuY3Rpb24gY3YoKXt9LApDdjpmdW5jdGlvbiBDdigpe30sCmVhOmZ1bmN0aW9uIGVhKCl7
+fSwKRDA6ZnVuY3Rpb24gRDAoKXt9LApoSDpmdW5jdGlvbiBoSCgpe30sCmg0OmZ1bmN0aW9uIGg0KCl7
+fSwKYnI6ZnVuY3Rpb24gYnIoKXt9LApWYjpmdW5jdGlvbiBWYigpe30sCmZKOmZ1bmN0aW9uIGZKKCl7
+fSwKd2E6ZnVuY3Rpb24gd2EoKXt9LApTZzpmdW5jdGlvbiBTZygpe30sCnU4OmZ1bmN0aW9uIHU4KCl7
+fSwKQWo6ZnVuY3Rpb24gQWooKXt9LAplNzpmdW5jdGlvbiBlNyhhKXt0aGlzLmE9YX0sCktWOmZ1bmN0
+aW9uIEtWKCl7fSwKQkg6ZnVuY3Rpb24gQkgoKXt9LApTTjpmdW5jdGlvbiBTTigpe30sCmV3OmZ1bmN0
+aW9uIGV3KCl7fSwKbHA6ZnVuY3Rpb24gbHAoKXt9LApUYjpmdW5jdGlvbiBUYigpe30sCkl2OmZ1bmN0
+aW9uIEl2KCl7fSwKV1A6ZnVuY3Rpb24gV1AoKXt9LAp5WTpmdW5jdGlvbiB5WSgpe30sCnc2OmZ1bmN0
+aW9uIHc2KCl7fSwKSzU6ZnVuY3Rpb24gSzUoKXt9LApDbTpmdW5jdGlvbiBDbSgpe30sCkNROmZ1bmN0
+aW9uIENRKCl7fSwKdzQ6ZnVuY3Rpb24gdzQoKXt9LApyaDpmdW5jdGlvbiByaCgpe30sCmNmOmZ1bmN0
+aW9uIGNmKCl7fSwKaTc6ZnVuY3Rpb24gaTcoYSl7dGhpcy5hPWF9LApTeTpmdW5jdGlvbiBTeShhKXt0
+aGlzLmE9YX0sCktTOmZ1bmN0aW9uIEtTKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApBMzpmdW5jdGlv
+biBBMyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKSTQ6ZnVuY3Rpb24gSTQoYSl7dGhpcy5hPWF9LApG
+azpmdW5jdGlvbiBGayhhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApSTzpmdW5jdGlvbiBSTyhhLGIs
+YyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uJHRpPWR9LApDcTpmdW5jdGlvbiBDcShh
+LGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uJHRpPWR9LAp4QzpmdW5jdGlvbiB4
+QyhhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5iPWEKXy5jPWIKXy5kPWMKXy5lPWQKXy4kdGk9ZX0sCnZO
+OmZ1bmN0aW9uIHZOKGEpe3RoaXMuYT1hfSwKSlE6ZnVuY3Rpb24gSlEoYSl7dGhpcy5hPWF9LApHbTpm
+dW5jdGlvbiBHbSgpe30sCnZEOmZ1bmN0aW9uIHZEKGEpe3RoaXMuYT1hfSwKVXY6ZnVuY3Rpb24gVXYo
+YSl7dGhpcy5hPWF9LApFZzpmdW5jdGlvbiBFZyhhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5j
+PWN9LAptNjpmdW5jdGlvbiBtNigpe30sCkVvOmZ1bmN0aW9uIEVvKCl7fSwKV2s6ZnVuY3Rpb24gV2so
+KXt9LApjdDpmdW5jdGlvbiBjdChhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5lPWEKXy5hPWIKXy5iPWMK
+Xy5jPWQKXy5kPWV9LApJQTpmdW5jdGlvbiBJQSgpe30sCk93OmZ1bmN0aW9uIE93KCl7fSwKVzk6ZnVu
+Y3Rpb24gVzkoYSxiLGMpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPS0xCl8uZD1udWxsCl8uJHRp
+PWN9LApkVzpmdW5jdGlvbiBkVygpe30sCm1rOmZ1bmN0aW9uIG1rKGEsYil7dGhpcy5hPWEKdGhpcy5i
+PWJ9LApLbzpmdW5jdGlvbiBLbyhhKXt0aGlzLmE9YQp0aGlzLmI9MH0sCmZtOmZ1bmN0aW9uIGZtKGEp
+e3RoaXMuYT1hfSwKTGU6ZnVuY3Rpb24gTGUoKXt9LApLNzpmdW5jdGlvbiBLNygpe30sCnJCOmZ1bmN0
+aW9uIHJCKCl7fSwKWFc6ZnVuY3Rpb24gWFcoKXt9LApvYTpmdW5jdGlvbiBvYSgpe319LFg9ewpDTChh
+LGIpe3ZhciBzLHIscSxwLG8sbj1iLnhaKGEpCmIuaEsoYSkKaWYobiE9bnVsbClhPUMueEIueW4oYSxu
+Lmxlbmd0aCkKcz10LnMKcj1ILlFJKFtdLHMpCnE9SC5RSShbXSxzKQpzPWEubGVuZ3RoCmlmKHMhPT0w
+JiZiLnI0KEMueEIuVyhhLDApKSl7aWYoMD49cylyZXR1cm4gSC5PSChhLDApCkMuTm0uaShxLGFbMF0p
+CnA9MX1lbHNle0MuTm0uaShxLCIiKQpwPTB9Zm9yKG89cDtvPHM7KytvKWlmKGIucjQoQy54Qi5XKGEs
+bykpKXtDLk5tLmkocixDLnhCLk5qKGEscCxvKSkKQy5ObS5pKHEsYVtvXSkKcD1vKzF9aWYocDxzKXtD
+Lk5tLmkocixDLnhCLnluKGEscCkpCkMuTm0uaShxLCIiKX1yZXR1cm4gbmV3IFguV0QoYixuLHIscSl9
+LApXRDpmdW5jdGlvbiBXRChhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uZD1jCl8uZT1k
+fSwKSTcoYSl7cmV0dXJuIG5ldyBYLmR2KGEpfSwKZHY6ZnVuY3Rpb24gZHYoYSl7dGhpcy5hPWF9fQp2
+YXIgdz1bQixDLEQsRSxGLEgsSixMLE0sTyxQLFIsVCxVLFcsWF0KaHVua0hlbHBlcnMuc2V0RnVuY3Rp
+b25OYW1lc0lmTmVjZXNzYXJ5KHcpCnZhciAkPXt9CkguRksucHJvdG90eXBlPXt9CkouR3YucHJvdG90
+eXBlPXsKRE4oYSxiKXtyZXR1cm4gYT09PWJ9LApnaU8oYSl7cmV0dXJuIEguZVEoYSl9LAp3KGEpe3Jl
+dHVybiJJbnN0YW5jZSBvZiAnIitILmxoKGEpKyInIn0sCmU3KGEsYil7dC5vLmEoYikKdGhyb3cgSC5i
+KFAubHIoYSxiLmdXYSgpLGIuZ25kKCksYi5nVm0oKSkpfX0KSi55RS5wcm90b3R5cGU9ewp3KGEpe3Jl
+dHVybiBTdHJpbmcoYSl9LApnaU8oYSl7cmV0dXJuIGE/NTE5MDE4OjIxODE1OX0sCiRpYTI6MX0KSi53
+ZS5wcm90b3R5cGU9ewpETihhLGIpe3JldHVybiBudWxsPT1ifSwKdyhhKXtyZXR1cm4ibnVsbCJ9LApn
+aU8oYSl7cmV0dXJuIDB9LAokaWM4OjF9CkouTUYucHJvdG90eXBlPXsKZ2lPKGEpe3JldHVybiAwfSwK
+dyhhKXtyZXR1cm4gU3RyaW5nKGEpfSwKJGl2bToxfQpKLmlDLnByb3RvdHlwZT17fQpKLmtkLnByb3Rv
+dHlwZT17fQpKLmM1LnByb3RvdHlwZT17CncoYSl7dmFyIHM9YVskLnooKV0KaWYocz09bnVsbClyZXR1
+cm4gdGhpcy50KGEpCnJldHVybiJKYXZhU2NyaXB0IGZ1bmN0aW9uIGZvciAiK0guRWooSi53KHMpKX0s
+CiRpRUg6MX0KSi5qZC5wcm90b3R5cGU9ewpkcihhLGIpe3JldHVybiBuZXcgSC5qVihhLEgudDYoYSku
+QygiQDwxPiIpLktxKGIpLkMoImpWPDEsMj4iKSl9LAppKGEsYil7SC50NihhKS5jLmEoYikKaWYoISFh
+LmZpeGVkJGxlbmd0aClILnYoUC5MNCgiYWRkIikpCmEucHVzaChiKX0sClc0KGEsYil7dmFyIHMKaWYo
+ISFhLmZpeGVkJGxlbmd0aClILnYoUC5MNCgicmVtb3ZlQXQiKSkKcz1hLmxlbmd0aAppZihiPj1zKXRo
+cm93IEguYihQLk83KGIsbnVsbCkpCnJldHVybiBhLnNwbGljZShiLDEpWzBdfSwKVUcoYSxiLGMpe3Zh
+ciBzLHIKSC50NihhKS5DKCJjWDwxPiIpLmEoYykKaWYoISFhLmZpeGVkJGxlbmd0aClILnYoUC5MNCgi
+aW5zZXJ0QWxsIikpClAud0EoYiwwLGEubGVuZ3RoLCJpbmRleCIpCmlmKCF0LlUuYihjKSljPUouUlgo
+YykKcz1KLkhtKGMpCmEubGVuZ3RoPWEubGVuZ3RoK3MKcj1iK3MKdGhpcy5ZVyhhLHIsYS5sZW5ndGgs
+YSxiKQp0aGlzLnZnKGEsYixyLGMpfSwKRlYoYSxiKXt2YXIgcwpILnQ2KGEpLkMoImNYPDE+IikuYShi
+KQppZighIWEuZml4ZWQkbGVuZ3RoKUgudihQLkw0KCJhZGRBbGwiKSkKaWYoQXJyYXkuaXNBcnJheShi
+KSl7dGhpcy5LaChhLGIpCnJldHVybn1mb3Iocz1KLklUKGIpO3MuRigpOylhLnB1c2gocy5nbCgpKX0s
+CktoKGEsYil7dmFyIHMscgp0LmIuYShiKQpzPWIubGVuZ3RoCmlmKHM9PT0wKXJldHVybgppZihhPT09
+Yil0aHJvdyBILmIoUC5hNChhKSkKZm9yKHI9MDtyPHM7KytyKWEucHVzaChiW3JdKX0sCkUyKGEsYixj
+KXt2YXIgcz1ILnQ2KGEpCnJldHVybiBuZXcgSC5sSihhLHMuS3EoYykuQygiMSgyKSIpLmEoYikscy5D
+KCJAPDE+IikuS3EoYykuQygibEo8MSwyPiIpKX0sCmsoYSxiKXt2YXIgcyxyPVAuTzgoYS5sZW5ndGgs
+IiIsITEsdC5OKQpmb3Iocz0wO3M8YS5sZW5ndGg7KytzKXRoaXMuWTUocixzLEguRWooYVtzXSkpCnJl
+dHVybiByLmpvaW4oYil9LAplUihhLGIpe3JldHVybiBILnFDKGEsYixudWxsLEgudDYoYSkuYyl9LApO
+MChhLGIsYyxkKXt2YXIgcyxyLHEKZC5hKGIpCkgudDYoYSkuS3EoZCkuQygiMSgxLDIpIikuYShjKQpz
+PWEubGVuZ3RoCmZvcihyPWIscT0wO3E8czsrK3Epe3I9Yy4kMihyLGFbcV0pCmlmKGEubGVuZ3RoIT09
+cyl0aHJvdyBILmIoUC5hNChhKSl9cmV0dXJuIHJ9LApIdChhLGIpe3ZhciBzLHIscSxwLG8sbj1ILnQ2
+KGEpCm4uQygiYTIoMSkiKS5hKGIpCnM9YS5sZW5ndGgKZm9yKHI9bnVsbCxxPSExLHA9MDtwPHM7Kytw
+KXtvPWFbcF0KaWYoSC5vVChiLiQxKG8pKSl7aWYocSl0aHJvdyBILmIoSC5BbSgpKQpyPW8KcT0hMH1p
+ZihzIT09YS5sZW5ndGgpdGhyb3cgSC5iKFAuYTQoYSkpfWlmKHEpcmV0dXJuIG4uYy5hKHIpCnRocm93
+IEguYihILldwKCkpfSwKRShhLGIpe2lmKGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJuIEguT0goYSxiKQpy
+ZXR1cm4gYVtiXX0sCmd0SChhKXtpZihhLmxlbmd0aD4wKXJldHVybiBhWzBdCnRocm93IEguYihILldw
+KCkpfSwKZ3JaKGEpe3ZhciBzPWEubGVuZ3RoCmlmKHM+MClyZXR1cm4gYVtzLTFdCnRocm93IEguYihI
+LldwKCkpfSwKWVcoYSxiLGMsZCxlKXt2YXIgcyxyLHEscCxvCkgudDYoYSkuQygiY1g8MT4iKS5hKGQp
+CmlmKCEhYS5pbW11dGFibGUkbGlzdClILnYoUC5MNCgic2V0UmFuZ2UiKSkKUC5qQihiLGMsYS5sZW5n
+dGgpCnM9Yy1iCmlmKHM9PT0wKXJldHVybgpQLmsxKGUsInNraXBDb3VudCIpCmlmKHQuai5iKGQpKXty
+PWQKcT1lfWVsc2V7cj1KLkE1KGQsZSkudHQoMCwhMSkKcT0wfXA9Si5VNihyKQppZihxK3M+cC5nQShy
+KSl0aHJvdyBILmIoSC5hcigpKQppZihxPGIpZm9yKG89cy0xO28+PTA7LS1vKWFbYitvXT1wLnEocixx
+K28pCmVsc2UgZm9yKG89MDtvPHM7KytvKWFbYitvXT1wLnEocixxK28pfSwKdmcoYSxiLGMsZCl7cmV0
+dXJuIHRoaXMuWVcoYSxiLGMsZCwwKX0sClZyKGEsYil7dmFyIHMscgpILnQ2KGEpLkMoImEyKDEpIiku
+YShiKQpzPWEubGVuZ3RoCmZvcihyPTA7cjxzOysrcil7aWYoSC5vVChiLiQxKGFbcl0pKSlyZXR1cm4h
+MAppZihhLmxlbmd0aCE9PXMpdGhyb3cgSC5iKFAuYTQoYSkpfXJldHVybiExfSwKdGcoYSxiKXt2YXIg
+cwpmb3Iocz0wO3M8YS5sZW5ndGg7KytzKWlmKEouUk0oYVtzXSxiKSlyZXR1cm4hMApyZXR1cm4hMX0s
+CmdsMChhKXtyZXR1cm4gYS5sZW5ndGg9PT0wfSwKZ29yKGEpe3JldHVybiBhLmxlbmd0aCE9PTB9LAp3
+KGEpe3JldHVybiBQLngoYSwiWyIsIl0iKX0sCnR0KGEsYil7dmFyIHM9SC5RSShhLnNsaWNlKDApLEgu
+dDYoYSkpCnJldHVybiBzfSwKYnIoYSl7cmV0dXJuIHRoaXMudHQoYSwhMCl9LApnbShhKXtyZXR1cm4g
+bmV3IEoubTEoYSxhLmxlbmd0aCxILnQ2KGEpLkMoIm0xPDE+IikpfSwKZ2lPKGEpe3JldHVybiBILmVR
+KGEpfSwKZ0EoYSl7cmV0dXJuIGEubGVuZ3RofSwKc0EoYSxiKXtpZighIWEuZml4ZWQkbGVuZ3RoKUgu
+dihQLkw0KCJzZXQgbGVuZ3RoIikpCmlmKGI8MCl0aHJvdyBILmIoUC5URShiLDAsbnVsbCwibmV3TGVu
+Z3RoIixudWxsKSkKaWYoYj5hLmxlbmd0aClILnQ2KGEpLmMuYShudWxsKQphLmxlbmd0aD1ifSwKcShh
+LGIpe0guSVooYikKaWYoYj49YS5sZW5ndGh8fGI8MCl0aHJvdyBILmIoSC51KGEsYikpCnJldHVybiBh
+W2JdfSwKWTUoYSxiLGMpe0gudDYoYSkuYy5hKGMpCmlmKCEhYS5pbW11dGFibGUkbGlzdClILnYoUC5M
+NCgiaW5kZXhlZCBzZXQiKSkKaWYoYj49YS5sZW5ndGh8fGI8MCl0aHJvdyBILmIoSC51KGEsYikpCmFb
+Yl09Y30sCiRpYlE6MSwKJGljWDoxLAokaXpNOjF9CkouUG8ucHJvdG90eXBlPXt9CkoubTEucHJvdG90
+eXBlPXsKZ2woKXtyZXR1cm4gdGhpcy4kdGkuYy5hKHRoaXMuZCl9LApGKCl7dmFyIHMscj10aGlzLHE9
+ci5hLHA9cS5sZW5ndGgKaWYoci5iIT09cCl0aHJvdyBILmIoSC5sayhxKSkKcz1yLmMKaWYocz49cCl7
+ci5zTShudWxsKQpyZXR1cm4hMX1yLnNNKHFbc10pOysrci5jCnJldHVybiEwfSwKc00oYSl7dGhpcy5k
+PXRoaXMuJHRpLkMoIjE/IikuYShhKX0sCiRpQW46MX0KSi5xSS5wcm90b3R5cGU9ewp6UShhKXtpZihh
+PjApe2lmKGEhPT0xLzApcmV0dXJuIE1hdGgucm91bmQoYSl9ZWxzZSBpZihhPi0xLzApcmV0dXJuIDAt
+TWF0aC5yb3VuZCgwLWEpCnRocm93IEguYihQLkw0KCIiK2ErIi5yb3VuZCgpIikpfSwKdyhhKXtpZihh
+PT09MCYmMS9hPDApcmV0dXJuIi0wLjAiCmVsc2UgcmV0dXJuIiIrYX0sCmdpTyhhKXt2YXIgcyxyLHEs
+cCxvPWF8MAppZihhPT09bylyZXR1cm4gbyY1MzY4NzA5MTEKcz1NYXRoLmFicyhhKQpyPU1hdGgubG9n
+KHMpLzAuNjkzMTQ3MTgwNTU5OTQ1M3wwCnE9TWF0aC5wb3coMixyKQpwPXM8MT9zL3E6cS9zCnJldHVy
+bigocCo5MDA3MTk5MjU0NzQwOTkyfDApKyhwKjM1NDIyNDMxODExNzY1MjF8MCkpKjU5OTE5NytyKjEy
+NTkmNTM2ODcwOTExfSwKelkoYSxiKXt2YXIgcz1hJWIKaWYocz09PTApcmV0dXJuIDAKaWYocz4wKXJl
+dHVybiBzCnJldHVybiBzK2J9LApCVShhLGIpe3JldHVybihhfDApPT09YT9hL2J8MDp0aGlzLkRKKGEs
+Yil9LApESihhLGIpe3ZhciBzPWEvYgppZihzPj0tMjE0NzQ4MzY0OCYmczw9MjE0NzQ4MzY0NylyZXR1
+cm4gc3wwCmlmKHM+MCl7aWYocyE9PTEvMClyZXR1cm4gTWF0aC5mbG9vcihzKX1lbHNlIGlmKHM+LTEv
+MClyZXR1cm4gTWF0aC5jZWlsKHMpCnRocm93IEguYihQLkw0KCJSZXN1bHQgb2YgdHJ1bmNhdGluZyBk
+aXZpc2lvbiBpcyAiK0guRWoocykrIjogIitILkVqKGEpKyIgfi8gIitiKSl9LAp3RyhhLGIpe3ZhciBz
+CmlmKGE+MClzPXRoaXMucDMoYSxiKQplbHNle3M9Yj4zMT8zMTpiCnM9YT4+cz4+PjB9cmV0dXJuIHN9
+LApiZihhLGIpe2lmKDA+Yil0aHJvdyBILmIoSC50TChiKSkKcmV0dXJuIHRoaXMucDMoYSxiKX0sCnAz
+KGEsYil7cmV0dXJuIGI+MzE/MDphPj4+Yn0sCiRpQ1A6MSwKJGlaWjoxfQpKLmJVLnByb3RvdHlwZT17
+JGlJajoxfQpKLmtELnByb3RvdHlwZT17fQpKLkRyLnByb3RvdHlwZT17Ck8oYSxiKXtpZihiPDApdGhy
+b3cgSC5iKEgudShhLGIpKQppZihiPj1hLmxlbmd0aClILnYoSC51KGEsYikpCnJldHVybiBhLmNoYXJD
+b2RlQXQoYil9LApXKGEsYil7aWYoYj49YS5sZW5ndGgpdGhyb3cgSC5iKEgudShhLGIpKQpyZXR1cm4g
+YS5jaGFyQ29kZUF0KGIpfSwKZGQoYSxiKXtyZXR1cm4gbmV3IEgudW4oYixhLDApfSwKaChhLGIpe3Jl
+dHVybiBhK2J9LApUYyhhLGIpe3ZhciBzPWIubGVuZ3RoLHI9YS5sZW5ndGgKaWYocz5yKXJldHVybiEx
+CnJldHVybiBiPT09dGhpcy55bihhLHItcyl9LAppNyhhLGIsYyxkKXt2YXIgcz1QLmpCKGIsYyxhLmxl
+bmd0aCkscj1hLnN1YnN0cmluZygwLGIpLHE9YS5zdWJzdHJpbmcocykKcmV0dXJuIHIrZCtxfSwKUWko
+YSxiLGMpe3ZhciBzCmlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5ndGgs
+bnVsbCxudWxsKSkKcz1jK2IubGVuZ3RoCmlmKHM+YS5sZW5ndGgpcmV0dXJuITEKcmV0dXJuIGI9PT1h
+LnN1YnN0cmluZyhjLHMpfSwKbihhLGIpe3JldHVybiB0aGlzLlFpKGEsYiwwKX0sCk5qKGEsYixjKXty
+ZXR1cm4gYS5zdWJzdHJpbmcoYixQLmpCKGIsYyxhLmxlbmd0aCkpfSwKeW4oYSxiKXtyZXR1cm4gdGhp
+cy5OaihhLGIsbnVsbCl9LApoYyhhKXtyZXR1cm4gYS50b0xvd2VyQ2FzZSgpfSwKYlMoYSl7dmFyIHMs
+cixxLHA9YS50cmltKCksbz1wLmxlbmd0aAppZihvPT09MClyZXR1cm4gcAppZih0aGlzLlcocCwwKT09
+PTEzMyl7cz1KLm1tKHAsMSkKaWYocz09PW8pcmV0dXJuIiJ9ZWxzZSBzPTAKcj1vLTEKcT10aGlzLk8o
+cCxyKT09PTEzMz9KLmMxKHAscik6bwppZihzPT09MCYmcT09PW8pcmV0dXJuIHAKcmV0dXJuIHAuc3Vi
+c3RyaW5nKHMscSl9LApUKGEsYil7dmFyIHMscgppZigwPj1iKXJldHVybiIiCmlmKGI9PT0xfHxhLmxl
+bmd0aD09PTApcmV0dXJuIGEKaWYoYiE9PWI+Pj4wKXRocm93IEguYihDLkVxKQpmb3Iocz1hLHI9IiI7
+ITA7KXtpZigoYiYxKT09PTEpcj1zK3IKYj1iPj4+MQppZihiPT09MClicmVhawpzKz1zfXJldHVybiBy
+fSwKWFUoYSxiLGMpe3ZhciBzCmlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShjLDAsYS5s
+ZW5ndGgsbnVsbCxudWxsKSkKcz1hLmluZGV4T2YoYixjKQpyZXR1cm4gc30sCk9ZKGEsYil7cmV0dXJu
+IHRoaXMuWFUoYSxiLDApfSwKUGsoYSxiLGMpe3ZhciBzLHIKaWYoYz09bnVsbCljPWEubGVuZ3RoCmVs
+c2UgaWYoYzwwfHxjPmEubGVuZ3RoKXRocm93IEguYihQLlRFKGMsMCxhLmxlbmd0aCxudWxsLG51bGwp
+KQpzPWIubGVuZ3RoCnI9YS5sZW5ndGgKaWYoYytzPnIpYz1yLXMKcmV0dXJuIGEubGFzdEluZGV4T2Yo
+YixjKX0sCmNuKGEsYil7cmV0dXJuIHRoaXMuUGsoYSxiLG51bGwpfSwKSXMoYSxiLGMpe3ZhciBzPWEu
+bGVuZ3RoCmlmKGM+cyl0aHJvdyBILmIoUC5URShjLDAscyxudWxsLG51bGwpKQpyZXR1cm4gSC5TUShh
+LGIsYyl9LAp0ZyhhLGIpe3JldHVybiB0aGlzLklzKGEsYiwwKX0sCncoYSl7cmV0dXJuIGF9LApnaU8o
+YSl7dmFyIHMscixxCmZvcihzPWEubGVuZ3RoLHI9MCxxPTA7cTxzOysrcSl7cj1yK2EuY2hhckNvZGVB
+dChxKSY1MzY4NzA5MTEKcj1yKygociY1MjQyODcpPDwxMCkmNTM2ODcwOTExCnJePXI+PjZ9cj1yKygo
+ciY2NzEwODg2Myk8PDMpJjUzNjg3MDkxMQpyXj1yPj4xMQpyZXR1cm4gcisoKHImMTYzODMpPDwxNSkm
+NTM2ODcwOTExfSwKZ0EoYSl7cmV0dXJuIGEubGVuZ3RofSwKcShhLGIpe0guSVooYikKaWYoYj49YS5s
+ZW5ndGh8fCExKXRocm93IEguYihILnUoYSxiKSkKcmV0dXJuIGFbYl19LAokaXZYOjEsCiRpcVU6MX0K
+SC5CUi5wcm90b3R5cGU9ewpnbShhKXt2YXIgcz1ILkxoKHRoaXMpCnJldHVybiBuZXcgSC5lVChKLklU
+KHRoaXMuZ09OKCkpLHMuQygiQDwxPiIpLktxKHMuUVsxXSkuQygiZVQ8MSwyPiIpKX0sCmdBKGEpe3Jl
+dHVybiBKLkhtKHRoaXMuZ09OKCkpfSwKZ2wwKGEpe3JldHVybiBKLnVVKHRoaXMuZ09OKCkpfSwKZ29y
+KGEpe3JldHVybiBKLkY3KHRoaXMuZ09OKCkpfSwKZVIoYSxiKXt2YXIgcz1ILkxoKHRoaXMpCnJldHVy
+biBILkdKKEouQTUodGhpcy5nT04oKSxiKSxzLmMscy5RWzFdKX0sCkUoYSxiKXtyZXR1cm4gSC5MaCh0
+aGlzKS5RWzFdLmEoSi5HQSh0aGlzLmdPTigpLGIpKX0sCncoYSl7cmV0dXJuIEoudyh0aGlzLmdPTigp
+KX19CkguZVQucHJvdG90eXBlPXsKRigpe3JldHVybiB0aGlzLmEuRigpfSwKZ2woKXtyZXR1cm4gdGhp
+cy4kdGkuUVsxXS5hKHRoaXMuYS5nbCgpKX0sCiRpQW46MX0KSC5aeS5wcm90b3R5cGU9ewpnT04oKXty
+ZXR1cm4gdGhpcy5hfX0KSC5vbC5wcm90b3R5cGU9eyRpYlE6MX0KSC5VcS5wcm90b3R5cGU9ewpxKGEs
+Yil7cmV0dXJuIHRoaXMuJHRpLlFbMV0uYShKLng5KHRoaXMuYSxILklaKGIpKSl9LApZNShhLGIsYyl7
+dmFyIHM9dGhpcy4kdGkKSi51OSh0aGlzLmEsYixzLmMuYShzLlFbMV0uYShjKSkpfSwKJGliUToxLAok
+aXpNOjF9CkgualYucHJvdG90eXBlPXsKZHIoYSxiKXtyZXR1cm4gbmV3IEgualYodGhpcy5hLHRoaXMu
+JHRpLkMoIkA8MT4iKS5LcShiKS5DKCJqVjwxLDI+IikpfSwKZ09OKCl7cmV0dXJuIHRoaXMuYX19Ckgu
+Yy5wcm90b3R5cGU9ewp3KGEpe3ZhciBzPSJMYXRlSW5pdGlhbGl6YXRpb25FcnJvcjogIit0aGlzLmEK
+cmV0dXJuIHN9fQpILnFqLnByb3RvdHlwZT17CmdBKGEpe3JldHVybiB0aGlzLmEubGVuZ3RofSwKcShh
+LGIpe3JldHVybiBDLnhCLk8odGhpcy5hLEguSVooYikpfX0KSC5iUS5wcm90b3R5cGU9e30KSC5hTC5w
+cm90b3R5cGU9ewpnbShhKXt2YXIgcz10aGlzCnJldHVybiBuZXcgSC5hNyhzLHMuZ0EocyksSC5MaChz
+KS5DKCJhNzxhTC5FPiIpKX0sCmdsMChhKXtyZXR1cm4gdGhpcy5nQSh0aGlzKT09PTB9LAprKGEsYil7
+dmFyIHMscixxLHA9dGhpcyxvPXAuZ0EocCkKaWYoYi5sZW5ndGghPT0wKXtpZihvPT09MClyZXR1cm4i
+IgpzPUguRWoocC5FKDAsMCkpCmlmKG8hPT1wLmdBKHApKXRocm93IEguYihQLmE0KHApKQpmb3Iocj1z
+LHE9MTtxPG87KytxKXtyPXIrYitILkVqKHAuRSgwLHEpKQppZihvIT09cC5nQShwKSl0aHJvdyBILmIo
+UC5hNChwKSl9cmV0dXJuIHIuY2hhckNvZGVBdCgwKT09MD9yOnJ9ZWxzZXtmb3IocT0wLHI9IiI7cTxv
+OysrcSl7cis9SC5FaihwLkUoMCxxKSkKaWYobyE9PXAuZ0EocCkpdGhyb3cgSC5iKFAuYTQocCkpfXJl
+dHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfX0sCmV2KGEsYil7cmV0dXJuIHRoaXMuR0coMCxILkxo
+KHRoaXMpLkMoImEyKGFMLkUpIikuYShiKSl9LApFMihhLGIsYyl7dmFyIHM9SC5MaCh0aGlzKQpyZXR1
+cm4gbmV3IEgubEoodGhpcyxzLktxKGMpLkMoIjEoYUwuRSkiKS5hKGIpLHMuQygiQDxhTC5FPiIpLktx
+KGMpLkMoImxKPDEsMj4iKSl9LAplUihhLGIpe3JldHVybiBILnFDKHRoaXMsYixudWxsLEguTGgodGhp
+cykuQygiYUwuRSIpKX0sCnR0KGEsYil7cmV0dXJuIFAuWTEodGhpcywhMCxILkxoKHRoaXMpLkMoImFM
+LkUiKSl9LApicihhKXtyZXR1cm4gdGhpcy50dChhLCEwKX19CkgubkgucHJvdG90eXBlPXsKSGQoYSxi
+LGMsZCl7dmFyIHMscj10aGlzLmIKUC5rMShyLCJzdGFydCIpCnM9dGhpcy5jCmlmKHMhPW51bGwpe1Au
+azEocywiZW5kIikKaWYocj5zKXRocm93IEguYihQLlRFKHIsMCxzLCJzdGFydCIsbnVsbCkpfX0sCmdV
+RCgpe3ZhciBzPUouSG0odGhpcy5hKSxyPXRoaXMuYwppZihyPT1udWxsfHxyPnMpcmV0dXJuIHMKcmV0
+dXJuIHJ9LApnQXMoKXt2YXIgcz1KLkhtKHRoaXMuYSkscj10aGlzLmIKaWYocj5zKXJldHVybiBzCnJl
+dHVybiByfSwKZ0EoYSl7dmFyIHMscj1KLkhtKHRoaXMuYSkscT10aGlzLmIKaWYocT49cilyZXR1cm4g
+MApzPXRoaXMuYwppZihzPT1udWxsfHxzPj1yKXJldHVybiByLXEKaWYodHlwZW9mIHMhPT0ibnVtYmVy
+IilyZXR1cm4gcy5ITigpCnJldHVybiBzLXF9LApFKGEsYil7dmFyIHM9dGhpcyxyPXMuZ0FzKCkrYgpp
+ZihiPDB8fHI+PXMuZ1VEKCkpdGhyb3cgSC5iKFAuQ2YoYixzLCJpbmRleCIsbnVsbCxudWxsKSkKcmV0
+dXJuIEouR0Eocy5hLHIpfSwKZVIoYSxiKXt2YXIgcyxyLHE9dGhpcwpQLmsxKGIsImNvdW50IikKcz1x
+LmIrYgpyPXEuYwppZihyIT1udWxsJiZzPj1yKXJldHVybiBuZXcgSC5NQihxLiR0aS5DKCJNQjwxPiIp
+KQpyZXR1cm4gSC5xQyhxLmEscyxyLHEuJHRpLmMpfSwKdHQoYSxiKXt2YXIgcyxyLHEscD10aGlzLG89
+cC5iLG49cC5hLG09Si5VNihuKSxsPW0uZ0Eobiksaz1wLmMKaWYoayE9bnVsbCYmazxsKWw9awpzPWwt
+bwppZihzPD0wKXtuPUouUWkoMCxwLiR0aS5jKQpyZXR1cm4gbn1yPVAuTzgocyxtLkUobixvKSwhMSxw
+LiR0aS5jKQpmb3IocT0xO3E8czsrK3Epe0MuTm0uWTUocixxLG0uRShuLG8rcSkpCmlmKG0uZ0Eobik8
+bCl0aHJvdyBILmIoUC5hNChwKSl9cmV0dXJuIHJ9fQpILmE3LnByb3RvdHlwZT17CmdsKCl7cmV0dXJu
+IHRoaXMuJHRpLmMuYSh0aGlzLmQpfSwKRigpe3ZhciBzLHI9dGhpcyxxPXIuYSxwPUouVTYocSksbz1w
+LmdBKHEpCmlmKHIuYiE9PW8pdGhyb3cgSC5iKFAuYTQocSkpCnM9ci5jCmlmKHM+PW8pe3Iuc0kobnVs
+bCkKcmV0dXJuITF9ci5zSShwLkUocSxzKSk7KytyLmMKcmV0dXJuITB9LApzSShhKXt0aGlzLmQ9dGhp
+cy4kdGkuQygiMT8iKS5hKGEpfSwKJGlBbjoxfQpILmkxLnByb3RvdHlwZT17CmdtKGEpe3ZhciBzPUgu
+TGgodGhpcykKcmV0dXJuIG5ldyBILk1IKEouSVQodGhpcy5hKSx0aGlzLmIscy5DKCJAPDE+IikuS3Eo
+cy5RWzFdKS5DKCJNSDwxLDI+IikpfSwKZ0EoYSl7cmV0dXJuIEouSG0odGhpcy5hKX0sCmdsMChhKXty
+ZXR1cm4gSi51VSh0aGlzLmEpfSwKRShhLGIpe3JldHVybiB0aGlzLmIuJDEoSi5HQSh0aGlzLmEsYikp
+fX0KSC54eS5wcm90b3R5cGU9eyRpYlE6MX0KSC5NSC5wcm90b3R5cGU9ewpGKCl7dmFyIHM9dGhpcyxy
+PXMuYgppZihyLkYoKSl7cy5zSShzLmMuJDEoci5nbCgpKSkKcmV0dXJuITB9cy5zSShudWxsKQpyZXR1
+cm4hMX0sCmdsKCl7cmV0dXJuIHRoaXMuJHRpLlFbMV0uYSh0aGlzLmEpfSwKc0koYSl7dGhpcy5hPXRo
+aXMuJHRpLkMoIjI/IikuYShhKX19CkgubEoucHJvdG90eXBlPXsKZ0EoYSl7cmV0dXJuIEouSG0odGhp
+cy5hKX0sCkUoYSxiKXtyZXR1cm4gdGhpcy5iLiQxKEouR0EodGhpcy5hLGIpKX19CkguVTUucHJvdG90
+eXBlPXsKZ20oYSl7cmV0dXJuIG5ldyBILlNPKEouSVQodGhpcy5hKSx0aGlzLmIsdGhpcy4kdGkuQygi
+U088MT4iKSl9fQpILlNPLnByb3RvdHlwZT17CkYoKXt2YXIgcyxyCmZvcihzPXRoaXMuYSxyPXRoaXMu
+YjtzLkYoKTspaWYoSC5vVChyLiQxKHMuZ2woKSkpKXJldHVybiEwCnJldHVybiExfSwKZ2woKXtyZXR1
+cm4gdGhpcy5hLmdsKCl9fQpILkFNLnByb3RvdHlwZT17CmVSKGEsYil7UC5rMShiLCJjb3VudCIpCnJl
+dHVybiBuZXcgSC5BTSh0aGlzLmEsdGhpcy5iK2IsSC5MaCh0aGlzKS5DKCJBTTwxPiIpKX0sCmdtKGEp
+e3JldHVybiBuZXcgSC5VMShKLklUKHRoaXMuYSksdGhpcy5iLEguTGgodGhpcykuQygiVTE8MT4iKSl9
+fQpILmQ1LnByb3RvdHlwZT17CmdBKGEpe3ZhciBzPUouSG0odGhpcy5hKS10aGlzLmIKaWYocz49MCly
+ZXR1cm4gcwpyZXR1cm4gMH0sCmVSKGEsYil7UC5rMShiLCJjb3VudCIpCnJldHVybiBuZXcgSC5kNSh0
+aGlzLmEsdGhpcy5iK2IsdGhpcy4kdGkpfSwKJGliUToxfQpILlUxLnByb3RvdHlwZT17CkYoKXt2YXIg
+cyxyCmZvcihzPXRoaXMuYSxyPTA7cjx0aGlzLmI7KytyKXMuRigpCnRoaXMuYj0wCnJldHVybiBzLkYo
+KX0sCmdsKCl7cmV0dXJuIHRoaXMuYS5nbCgpfX0KSC5NQi5wcm90b3R5cGU9ewpnbShhKXtyZXR1cm4g
+Qy5Hd30sCmdsMChhKXtyZXR1cm4hMH0sCmdBKGEpe3JldHVybiAwfSwKRShhLGIpe3Rocm93IEguYihQ
+LlRFKGIsMCwwLCJpbmRleCIsbnVsbCkpfSwKZVIoYSxiKXtQLmsxKGIsImNvdW50IikKcmV0dXJuIHRo
+aXN9fQpILkZ1LnByb3RvdHlwZT17CkYoKXtyZXR1cm4hMX0sCmdsKCl7dGhyb3cgSC5iKEguV3AoKSl9
+LAokaUFuOjF9CkgudTYucHJvdG90eXBlPXsKZ20oYSl7cmV0dXJuIG5ldyBILkpCKEouSVQodGhpcy5h
+KSx0aGlzLiR0aS5DKCJKQjwxPiIpKX19CkguSkIucHJvdG90eXBlPXsKRigpe3ZhciBzLHIKZm9yKHM9
+dGhpcy5hLHI9dGhpcy4kdGkuYztzLkYoKTspaWYoci5iKHMuZ2woKSkpcmV0dXJuITAKcmV0dXJuITF9
+LApnbCgpe3JldHVybiB0aGlzLiR0aS5jLmEodGhpcy5hLmdsKCkpfSwKJGlBbjoxfQpILlNVLnByb3Rv
+dHlwZT17fQpILlJlLnByb3RvdHlwZT17Clk1KGEsYixjKXtILkxoKHRoaXMpLkMoIlJlLkUiKS5hKGMp
+CnRocm93IEguYihQLkw0KCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBsaXN0IikpfX0KSC53
+Mi5wcm90b3R5cGU9e30KSC53di5wcm90b3R5cGU9ewpnaU8oYSl7dmFyIHM9dGhpcy5faGFzaENvZGUK
+aWYocyE9bnVsbClyZXR1cm4gcwpzPTY2NDU5NypKLmhmKHRoaXMuYSkmNTM2ODcwOTExCnRoaXMuX2hh
+c2hDb2RlPXMKcmV0dXJuIHN9LAp3KGEpe3JldHVybidTeW1ib2woIicrSC5Faih0aGlzLmEpKyciKSd9
+LApETihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKcmV0dXJuIGIgaW5zdGFuY2VvZiBILnd2JiZ0aGlz
+LmE9PWIuYX0sCiRpR0Q6MX0KSC5RQy5wcm90b3R5cGU9e30KSC5QRC5wcm90b3R5cGU9e30KSC5XVS5w
+cm90b3R5cGU9ewpnbDAoYSl7cmV0dXJuIHRoaXMuZ0EodGhpcyk9PT0wfSwKdyhhKXtyZXR1cm4gUC5u
+Tyh0aGlzKX0sClk1KGEsYixjKXt2YXIgcz1ILkxoKHRoaXMpCnMuYy5hKGIpCnMuUVsxXS5hKGMpCkgu
+ZGMoKX0sCmdQdShhKXtyZXR1cm4gdGhpcy5xNCgwLEguTGgodGhpcykuQygiTjM8MSwyPiIpKX0sCnE0
+KGEsYil7dmFyIHM9dGhpcwpyZXR1cm4gUC5sMChmdW5jdGlvbigpe3ZhciByPWEKdmFyIHE9MCxwPTEs
+byxuLG0sbCxrCnJldHVybiBmdW5jdGlvbiAkYXN5bmMkZ1B1KGMsZCl7aWYoYz09PTEpe289ZApxPXB9
+d2hpbGUodHJ1ZSlzd2l0Y2gocSl7Y2FzZSAwOm49cy5ndmMoKSxuPW4uZ20obiksbT1ILkxoKHMpLGw9
+bS5RWzFdLG09bS5DKCJAPDE+IikuS3EobCkuQygiTjM8MSwyPiIpCmNhc2UgMjppZighbi5GKCkpe3E9
+MwpicmVha31rPW4uZ2woKQpxPTQKcmV0dXJuIG5ldyBQLk4zKGssbC5hKHMucSgwLGspKSxtKQpjYXNl
+IDQ6cT0yCmJyZWFrCmNhc2UgMzpyZXR1cm4gUC5UaCgpCmNhc2UgMTpyZXR1cm4gUC5ZbShvKX19fSxi
+KX0sCiRpWjA6MX0KSC5MUC5wcm90b3R5cGU9ewpnQShhKXtyZXR1cm4gdGhpcy5hfSwKeDQoYSl7aWYo
+dHlwZW9mIGEhPSJzdHJpbmciKXJldHVybiExCmlmKCJfX3Byb3RvX18iPT09YSlyZXR1cm4hMQpyZXR1
+cm4gdGhpcy5iLmhhc093blByb3BlcnR5KGEpfSwKcShhLGIpe2lmKCF0aGlzLng0KGIpKXJldHVybiBu
+dWxsCnJldHVybiB0aGlzLmJbSC5uKGIpXX0sCksoYSxiKXt2YXIgcyxyLHEscCxvLG49dGhpcy4kdGkK
+bi5DKCJ+KDEsMikiKS5hKGIpCnM9dGhpcy5jCmZvcihyPXMubGVuZ3RoLHE9dGhpcy5iLG49bi5RWzFd
+LHA9MDtwPHI7KytwKXtvPUgubihzW3BdKQpiLiQyKG8sbi5hKHFbb10pKX19LApndmMoKXtyZXR1cm4g
+bmV3IEguWFIodGhpcyx0aGlzLiR0aS5DKCJYUjwxPiIpKX19CkguWFIucHJvdG90eXBlPXsKZ20oYSl7
+dmFyIHM9dGhpcy5hLmMKcmV0dXJuIG5ldyBKLm0xKHMscy5sZW5ndGgsSC50NihzKS5DKCJtMTwxPiIp
+KX0sCmdBKGEpe3JldHVybiB0aGlzLmEuYy5sZW5ndGh9fQpILkxJLnByb3RvdHlwZT17CmdXYSgpe3Zh
+ciBzPXRoaXMuYQpyZXR1cm4gc30sCmduZCgpe3ZhciBzLHIscSxwLG89dGhpcwppZihvLmM9PT0xKXJl
+dHVybiBDLmhVCnM9by5kCnI9cy5sZW5ndGgtby5lLmxlbmd0aC1vLmYKaWYocj09PTApcmV0dXJuIEMu
+aFUKcT1bXQpmb3IocD0wO3A8cjsrK3Ape2lmKHA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMscCkKcS5w
+dXNoKHNbcF0pfXJldHVybiBKLnpDKHEpfSwKZ1ZtKCl7dmFyIHMscixxLHAsbyxuLG0sbCxrPXRoaXMK
+aWYoay5jIT09MClyZXR1cm4gQy5XTwpzPWsuZQpyPXMubGVuZ3RoCnE9ay5kCnA9cS5sZW5ndGgtci1r
+LmYKaWYocj09PTApcmV0dXJuIEMuV08Kbz1uZXcgSC5ONSh0LmVvKQpmb3Iobj0wO248cjsrK24pe2lm
+KG4+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsbikKbT1zW25dCmw9cCtuCmlmKGw8MHx8bD49cS5sZW5n
+dGgpcmV0dXJuIEguT0gocSxsKQpvLlk1KDAsbmV3IEgud3YobSkscVtsXSl9cmV0dXJuIG5ldyBILlBE
+KG8sdC5nRil9LAokaXZROjF9CkguQ2oucHJvdG90eXBlPXsKJDIoYSxiKXt2YXIgcwpILm4oYSkKcz10
+aGlzLmEKcy5iPXMuYisiJCIrYQpDLk5tLmkodGhpcy5iLGEpCkMuTm0uaSh0aGlzLmMsYik7KytzLmF9
+LAokUzoxMX0KSC5mOS5wcm90b3R5cGU9ewpxUyhhKXt2YXIgcyxyLHE9dGhpcyxwPW5ldyBSZWdFeHAo
+cS5hKS5leGVjKGEpCmlmKHA9PW51bGwpcmV0dXJuIG51bGwKcz1PYmplY3QuY3JlYXRlKG51bGwpCnI9
+cS5iCmlmKHIhPT0tMSlzLmFyZ3VtZW50cz1wW3IrMV0Kcj1xLmMKaWYociE9PS0xKXMuYXJndW1lbnRz
+RXhwcj1wW3IrMV0Kcj1xLmQKaWYociE9PS0xKXMuZXhwcj1wW3IrMV0Kcj1xLmUKaWYociE9PS0xKXMu
+bWV0aG9kPXBbcisxXQpyPXEuZgppZihyIT09LTEpcy5yZWNlaXZlcj1wW3IrMV0KcmV0dXJuIHN9fQpI
+LlcwLnByb3RvdHlwZT17CncoYSl7dmFyIHM9dGhpcy5iCmlmKHM9PW51bGwpcmV0dXJuIk5vU3VjaE1l
+dGhvZEVycm9yOiAiK3RoaXMuYQpyZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3I6IG1ldGhvZCBub3QgZm91
+bmQ6ICciK3MrIicgb24gbnVsbCJ9fQpILmF6LnByb3RvdHlwZT17CncoYSl7dmFyIHMscj10aGlzLHE9
+Ik5vU3VjaE1ldGhvZEVycm9yOiBtZXRob2Qgbm90IGZvdW5kOiAnIixwPXIuYgppZihwPT1udWxsKXJl
+dHVybiJOb1N1Y2hNZXRob2RFcnJvcjogIityLmEKcz1yLmMKaWYocz09bnVsbClyZXR1cm4gcStwKyIn
+ICgiK3IuYSsiKSIKcmV0dXJuIHErcCsiJyBvbiAnIitzKyInICgiK3IuYSsiKSJ9fQpILnZWLnByb3Rv
+dHlwZT17CncoYSl7dmFyIHM9dGhpcy5hCnJldHVybiBzLmxlbmd0aD09PTA/IkVycm9yIjoiRXJyb3I6
+ICIrc319CkgudGUucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4iVGhyb3cgb2YgbnVsbCAoJyIrKHRoaXMu
+YT09PW51bGw/Im51bGwiOiJ1bmRlZmluZWQiKSsiJyBmcm9tIEphdmFTY3JpcHQpIn0sCiRpUno6MX0K
+SC5icS5wcm90b3R5cGU9e30KSC5YTy5wcm90b3R5cGU9ewp3KGEpe3ZhciBzLHI9dGhpcy5iCmlmKHIh
+PW51bGwpcmV0dXJuIHIKcj10aGlzLmEKcz1yIT09bnVsbCYmdHlwZW9mIHI9PT0ib2JqZWN0Ij9yLnN0
+YWNrOm51bGwKcmV0dXJuIHRoaXMuYj1zPT1udWxsPyIiOnN9LAokaUd6OjF9CkguVHAucHJvdG90eXBl
+PXsKdyhhKXt2YXIgcz10aGlzLmNvbnN0cnVjdG9yLHI9cz09bnVsbD9udWxsOnMubmFtZQpyZXR1cm4i
+Q2xvc3VyZSAnIitILk5RKHI9PW51bGw/InVua25vd24iOnIpKyInIn0sCiRpRUg6MSwKZ0t1KCl7cmV0
+dXJuIHRoaXN9LAokQzoiJDEiLAokUjoxLAokRDpudWxsfQpILkF5LnByb3RvdHlwZT17JEM6IiQwIiwk
+UjowfQpILkUxLnByb3RvdHlwZT17JEM6IiQyIiwkUjoyfQpILmxjLnByb3RvdHlwZT17fQpILnp4LnBy
+b3RvdHlwZT17CncoYSl7dmFyIHM9dGhpcy4kc3RhdGljX25hbWUKaWYocz09bnVsbClyZXR1cm4iQ2xv
+c3VyZSBvZiB1bmtub3duIHN0YXRpYyBtZXRob2QiCnJldHVybiJDbG9zdXJlICciK0guTlEocykrIici
+fX0KSC5yVC5wcm90b3R5cGU9ewpETihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKaWYodGhpcz09PWIp
+cmV0dXJuITAKaWYoIShiIGluc3RhbmNlb2YgSC5yVCkpcmV0dXJuITEKcmV0dXJuIHRoaXMuJF90YXJn
+ZXQ9PT1iLiRfdGFyZ2V0JiZ0aGlzLmE9PT1iLmF9LApnaU8oYSl7cmV0dXJuKEguQ1UodGhpcy5hKV5I
+LmVRKHRoaXMuJF90YXJnZXQpKT4+PjB9LAp3KGEpe3JldHVybiJDbG9zdXJlICciK3RoaXMuJF9uYW1l
+KyInIG9mICIrKCJJbnN0YW5jZSBvZiAnIitILmxoKHQuSy5hKHRoaXMuYSkpKyInIil9fQpILkVxLnBy
+b3RvdHlwZT17CncoYSl7cmV0dXJuIlJ1bnRpbWVFcnJvcjogIit0aGlzLmF9fQpILmtZLnByb3RvdHlw
+ZT17CncoYSl7cmV0dXJuIkFzc2VydGlvbiBmYWlsZWQ6ICIrUC5obCh0aGlzLmEpfX0KSC5rci5wcm90
+b3R5cGU9e30KSC5ONS5wcm90b3R5cGU9ewpnQShhKXtyZXR1cm4gdGhpcy5hfSwKZ2wwKGEpe3JldHVy
+biB0aGlzLmE9PT0wfSwKZ29yKGEpe3JldHVybiF0aGlzLmdsMCh0aGlzKX0sCmd2Yygpe3JldHVybiBu
+ZXcgSC5pNSh0aGlzLEguTGgodGhpcykuQygiaTU8MT4iKSl9LAp4NChhKXt2YXIgcz10aGlzLmIKaWYo
+cz09bnVsbClyZXR1cm4hMQpyZXR1cm4gdGhpcy5YdShzLGEpfSwKcShhLGIpe3ZhciBzLHIscSxwLG89
+dGhpcyxuPW51bGwKaWYodHlwZW9mIGI9PSJzdHJpbmciKXtzPW8uYgppZihzPT1udWxsKXJldHVybiBu
+CnI9by5qMihzLGIpCnE9cj09bnVsbD9uOnIuYgpyZXR1cm4gcX1lbHNlIGlmKHR5cGVvZiBiPT0ibnVt
+YmVyIiYmKGImMHgzZmZmZmZmKT09PWIpe3A9by5jCmlmKHA9PW51bGwpcmV0dXJuIG4Kcj1vLmoyKHAs
+YikKcT1yPT1udWxsP246ci5iCnJldHVybiBxfWVsc2UgcmV0dXJuIG8uYWEoYil9LAphYShhKXt2YXIg
+cyxyLHE9dGhpcyxwPXEuZAppZihwPT1udWxsKXJldHVybiBudWxsCnM9cS5CdChwLHEueGkoYSkpCnI9
+cS5GaChzLGEpCmlmKHI8MClyZXR1cm4gbnVsbApyZXR1cm4gc1tyXS5ifSwKWTUoYSxiLGMpe3ZhciBz
+LHIscT10aGlzLHA9SC5MaChxKQpwLmMuYShiKQpwLlFbMV0uYShjKQppZih0eXBlb2YgYj09InN0cmlu
+ZyIpe3M9cS5iCnEuRUgocz09bnVsbD9xLmI9cS56SygpOnMsYixjKX1lbHNlIGlmKHR5cGVvZiBiPT0i
+bnVtYmVyIiYmKGImMHgzZmZmZmZmKT09PWIpe3I9cS5jCnEuRUgocj09bnVsbD9xLmM9cS56SygpOnIs
+YixjKX1lbHNlIHEueHcoYixjKX0sCnh3KGEsYil7dmFyIHMscixxLHAsbz10aGlzLG49SC5MaChvKQpu
+LmMuYShhKQpuLlFbMV0uYShiKQpzPW8uZAppZihzPT1udWxsKXM9by5kPW8ueksoKQpyPW8ueGkoYSkK
+cT1vLkJ0KHMscikKaWYocT09bnVsbClvLkVJKHMscixbby5IbihhLGIpXSkKZWxzZXtwPW8uRmgocSxh
+KQppZihwPj0wKXFbcF0uYj1iCmVsc2UgcS5wdXNoKG8uSG4oYSxiKSl9fSwKSyhhLGIpe3ZhciBzLHIs
+cT10aGlzCkguTGgocSkuQygifigxLDIpIikuYShiKQpzPXEuZQpyPXEucgpmb3IoO3MhPW51bGw7KXti
+LiQyKHMuYSxzLmIpCmlmKHIhPT1xLnIpdGhyb3cgSC5iKFAuYTQocSkpCnM9cy5jfX0sCkVIKGEsYixj
+KXt2YXIgcyxyPXRoaXMscT1ILkxoKHIpCnEuYy5hKGIpCnEuUVsxXS5hKGMpCnM9ci5qMihhLGIpCmlm
+KHM9PW51bGwpci5FSShhLGIsci5IbihiLGMpKQplbHNlIHMuYj1jfSwKa3MoKXt0aGlzLnI9dGhpcy5y
+KzEmNjcxMDg4NjN9LApIbihhLGIpe3ZhciBzPXRoaXMscj1ILkxoKHMpLHE9bmV3IEgudmgoci5jLmEo
+YSksci5RWzFdLmEoYikpCmlmKHMuZT09bnVsbClzLmU9cy5mPXEKZWxzZXtyPXMuZgpyLnRvU3RyaW5n
+CnEuZD1yCnMuZj1yLmM9cX0rK3MuYQpzLmtzKCkKcmV0dXJuIHF9LAp4aShhKXtyZXR1cm4gSi5oZihh
+KSYweDNmZmZmZmZ9LApGaChhLGIpe3ZhciBzLHIKaWYoYT09bnVsbClyZXR1cm4tMQpzPWEubGVuZ3Ro
+CmZvcihyPTA7cjxzOysrcilpZihKLlJNKGFbcl0uYSxiKSlyZXR1cm4gcgpyZXR1cm4tMX0sCncoYSl7
+cmV0dXJuIFAubk8odGhpcyl9LApqMihhLGIpe3JldHVybiBhW2JdfSwKQnQoYSxiKXtyZXR1cm4gYVti
+XX0sCkVJKGEsYixjKXthW2JdPWN9LApybihhLGIpe2RlbGV0ZSBhW2JdfSwKWHUoYSxiKXtyZXR1cm4g
+dGhpcy5qMihhLGIpIT1udWxsfSwKeksoKXt2YXIgcz0iPG5vbi1pZGVudGlmaWVyLWtleT4iLHI9T2Jq
+ZWN0LmNyZWF0ZShudWxsKQp0aGlzLkVJKHIscyxyKQp0aGlzLnJuKHIscykKcmV0dXJuIHJ9LAokaUZv
+OjF9CkgudmgucHJvdG90eXBlPXt9CkguaTUucHJvdG90eXBlPXsKZ0EoYSl7cmV0dXJuIHRoaXMuYS5h
+fSwKZ2wwKGEpe3JldHVybiB0aGlzLmEuYT09PTB9LApnbShhKXt2YXIgcz10aGlzLmEscj1uZXcgSC5O
+NihzLHMucix0aGlzLiR0aS5DKCJONjwxPiIpKQpyLmM9cy5lCnJldHVybiByfSwKdGcoYSxiKXtyZXR1
+cm4gdGhpcy5hLng0KGIpfX0KSC5ONi5wcm90b3R5cGU9ewpnbCgpe3JldHVybiB0aGlzLmR9LApGKCl7
+dmFyIHMscj10aGlzLHE9ci5hCmlmKHIuYiE9PXEucil0aHJvdyBILmIoUC5hNChxKSkKcz1yLmMKaWYo
+cz09bnVsbCl7ci5zcVkobnVsbCkKcmV0dXJuITF9ZWxzZXtyLnNxWShzLmEpCnIuYz1zLmMKcmV0dXJu
+ITB9fSwKc3FZKGEpe3RoaXMuZD10aGlzLiR0aS5DKCIxPyIpLmEoYSl9LAokaUFuOjF9CkguZEMucHJv
+dG90eXBlPXsKJDEoYSl7cmV0dXJuIHRoaXMuYShhKX0sCiRTOjR9Ckgud04ucHJvdG90eXBlPXsKJDIo
+YSxiKXtyZXR1cm4gdGhpcy5hKGEsYil9LAokUzo1MH0KSC5WWC5wcm90b3R5cGU9ewokMShhKXtyZXR1
+cm4gdGhpcy5hKEgubihhKSl9LAokUzoyMX0KSC5WUi5wcm90b3R5cGU9ewp3KGEpe3JldHVybiJSZWdF
+eHAvIit0aGlzLmErIi8iK3RoaXMuYi5mbGFnc30sCmdIYygpe3ZhciBzPXRoaXMscj1zLmMKaWYociE9
+bnVsbClyZXR1cm4gcgpyPXMuYgpyZXR1cm4gcy5jPUgudjQocy5hLHIubXVsdGlsaW5lLCFyLmlnbm9y
+ZUNhc2Usci51bmljb2RlLHIuZG90QWxsLCEwKX0sCmRkKGEsYil7cmV0dXJuIG5ldyBILktXKHRoaXMs
+YiwwKX0sClVaKGEsYil7dmFyIHMscj10LksuYSh0aGlzLmdIYygpKQpyLmxhc3RJbmRleD1iCnM9ci5l
+eGVjKGEpCmlmKHM9PW51bGwpcmV0dXJuIG51bGwKcmV0dXJuIG5ldyBILkVLKHMpfSwKJGl2WDoxLAok
+aXdMOjF9CkguRUsucHJvdG90eXBlPXsKcShhLGIpe3ZhciBzCkguSVooYikKcz10aGlzLmIKaWYoYj49
+cy5sZW5ndGgpcmV0dXJuIEguT0gocyxiKQpyZXR1cm4gc1tiXX0sCiRpT2Q6MSwKJGlpYjoxfQpILktX
+LnByb3RvdHlwZT17CmdtKGEpe3JldHVybiBuZXcgSC5QYih0aGlzLmEsdGhpcy5iLHRoaXMuYyl9fQpI
+LlBiLnByb3RvdHlwZT17CmdsKCl7cmV0dXJuIHQuY3ouYSh0aGlzLmQpfSwKRigpe3ZhciBzLHIscSxw
+LG8sbixtPXRoaXMsbD1tLmIKaWYobD09bnVsbClyZXR1cm4hMQpzPW0uYwpyPWwubGVuZ3RoCmlmKHM8
+PXIpe3E9bS5hCnA9cS5VWihsLHMpCmlmKHAhPW51bGwpe20uZD1wCnM9cC5iCm89cy5pbmRleApuPW8r
+c1swXS5sZW5ndGgKaWYobz09PW4pe2lmKHEuYi51bmljb2RlKXtzPW0uYwpxPXMrMQppZihxPHIpe3M9
+Qy54Qi5PKGwscykKaWYocz49NTUyOTYmJnM8PTU2MzE5KXtzPUMueEIuTyhsLHEpCnM9cz49NTYzMjAm
+JnM8PTU3MzQzfWVsc2Ugcz0hMX1lbHNlIHM9ITF9ZWxzZSBzPSExCm49KHM/bisxOm4pKzF9bS5jPW4K
+cmV0dXJuITB9fW0uYj1tLmQ9bnVsbApyZXR1cm4hMX0sCiRpQW46MX0KSC50US5wcm90b3R5cGU9ewpx
+KGEsYil7SC5JWihiKQppZihiIT09MClILnYoUC5PNyhiLG51bGwpKQpyZXR1cm4gdGhpcy5jfSwKJGlP
+ZDoxfQpILnVuLnByb3RvdHlwZT17CmdtKGEpe3JldHVybiBuZXcgSC5TZCh0aGlzLmEsdGhpcy5iLHRo
+aXMuYyl9fQpILlNkLnByb3RvdHlwZT17CkYoKXt2YXIgcyxyLHE9dGhpcyxwPXEuYyxvPXEuYixuPW8u
+bGVuZ3RoLG09cS5hLGw9bS5sZW5ndGgKaWYocCtuPmwpe3EuZD1udWxsCnJldHVybiExfXM9bS5pbmRl
+eE9mKG8scCkKaWYoczwwKXtxLmM9bCsxCnEuZD1udWxsCnJldHVybiExfXI9cytuCnEuZD1uZXcgSC50
+UShzLG8pCnEuYz1yPT09cS5jP3IrMTpyCnJldHVybiEwfSwKZ2woKXt2YXIgcz10aGlzLmQKcy50b1N0
+cmluZwpyZXR1cm4gc30sCiRpQW46MX0KSC5FVC5wcm90b3R5cGU9eyRpRVQ6MSwkaUFTOjF9CkguTFou
+cHJvdG90eXBlPXsKZ0EoYSl7cmV0dXJuIGEubGVuZ3RofSwKJGlYajoxfQpILkRnLnByb3RvdHlwZT17
+CnEoYSxiKXtILklaKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX0sClk1KGEsYixjKXtI
+LnJWKGMpCkgub2QoYixhLGEubGVuZ3RoKQphW2JdPWN9LAokaWJROjEsCiRpY1g6MSwKJGl6TToxfQpI
+LlBnLnByb3RvdHlwZT17Clk1KGEsYixjKXtILklaKGMpCkgub2QoYixhLGEubGVuZ3RoKQphW2JdPWN9
+LAokaWJROjEsCiRpY1g6MSwKJGl6TToxfQpILnhqLnByb3RvdHlwZT17CnEoYSxiKXtILklaKGIpCkgu
+b2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguZEUucHJvdG90eXBlPXsKcShhLGIpe0guSVoo
+YikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5aQS5wcm90b3R5cGU9ewpxKGEsYil7
+SC5JWihiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILmRULnByb3RvdHlwZT17CnEo
+YSxiKXtILklaKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguUHEucHJvdG90eXBl
+PXsKcShhLGIpe0guSVooYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5lRS5wcm90
+b3R5cGU9ewpnQShhKXtyZXR1cm4gYS5sZW5ndGh9LApxKGEsYil7SC5JWihiKQpILm9kKGIsYSxhLmxl
+bmd0aCkKcmV0dXJuIGFbYl19fQpILlY2LnByb3RvdHlwZT17CmdBKGEpe3JldHVybiBhLmxlbmd0aH0s
+CnEoYSxiKXtILklaKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX0sCiRpbjY6MX0KSC5S
+Ry5wcm90b3R5cGU9e30KSC5WUC5wcm90b3R5cGU9e30KSC5XQi5wcm90b3R5cGU9e30KSC5aRy5wcm90
+b3R5cGU9e30KSC5KYy5wcm90b3R5cGU9ewpDKGEpe3JldHVybiBILmNFKHYudHlwZVVuaXZlcnNlLHRo
+aXMsYSl9LApLcShhKXtyZXR1cm4gSC52NSh2LnR5cGVVbml2ZXJzZSx0aGlzLGEpfX0KSC5HLnByb3Rv
+dHlwZT17fQpILmtTLnByb3RvdHlwZT17CncoYSl7cmV0dXJuIHRoaXMuYX19CkguaU0ucHJvdG90eXBl
+PXskaUV6OjF9ClAudGgucHJvdG90eXBlPXsKJDEoYSl7dmFyIHM9dGhpcy5hLHI9cy5hCnMuYT1udWxs
+CnIuJDAoKX0sCiRTOjEzfQpQLmhhLnByb3RvdHlwZT17CiQxKGEpe3ZhciBzLHIKdGhpcy5hLmE9dC5N
+LmEoYSkKcz10aGlzLmIKcj10aGlzLmMKcy5maXJzdENoaWxkP3MucmVtb3ZlQ2hpbGQocik6cy5hcHBl
+bmRDaGlsZChyKX0sCiRTOjQxfQpQLlZzLnByb3RvdHlwZT17CiQwKCl7dGhpcy5hLiQwKCl9LAokUzox
+NX0KUC5GdC5wcm90b3R5cGU9ewokMCgpe3RoaXMuYS4kMCgpfSwKJFM6MTV9ClAuVzMucHJvdG90eXBl
+PXsKQ1koYSxiKXtpZihzZWxmLnNldFRpbWVvdXQhPW51bGwpc2VsZi5zZXRUaW1lb3V0KEgudFIobmV3
+IFAueUgodGhpcyxiKSwwKSxhKQplbHNlIHRocm93IEguYihQLkw0KCJgc2V0VGltZW91dCgpYCBub3Qg
+Zm91bmQuIikpfX0KUC55SC5wcm90b3R5cGU9ewokMCgpe3RoaXMuYi4kMCgpfSwKJFM6MH0KUC5paC5w
+cm90b3R5cGU9ewphTShhLGIpe3ZhciBzLHI9dGhpcyxxPXIuJHRpCnEuQygiMS8/IikuYShiKQppZihi
+PT1udWxsKWI9cS5jLmEoYikKaWYoIXIuYilyLmEuWGYoYikKZWxzZXtzPXIuYQppZihxLkMoImI4PDE+
+IikuYihiKSlzLmNVKGIpCmVsc2Ugcy5YMihxLmMuYShiKSl9fSwKdzAoYSxiKXt2YXIgcz10aGlzLmEK
+aWYodGhpcy5iKXMuWkwoYSxiKQplbHNlIHMuTmsoYSxiKX19ClAuV00ucHJvdG90eXBlPXsKJDEoYSl7
+cmV0dXJuIHRoaXMuYS4kMigwLGEpfSwKJFM6NTF9ClAuU1gucHJvdG90eXBlPXsKJDIoYSxiKXt0aGlz
+LmEuJDIoMSxuZXcgSC5icShhLHQubC5hKGIpKSl9LAokUzo1M30KUC5Hcy5wcm90b3R5cGU9ewokMihh
+LGIpe3RoaXMuYShILklaKGEpLGIpfSwKJFM6NDV9ClAuRnkucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4i
+SXRlcmF0aW9uTWFya2VyKCIrdGhpcy5iKyIsICIrSC5Faih0aGlzLmEpKyIpIn19ClAuR1YucHJvdG90
+eXBlPXsKZ2woKXt2YXIgcz10aGlzLmMKaWYocz09bnVsbClyZXR1cm4gdGhpcy4kdGkuYy5hKHRoaXMu
+YikKcmV0dXJuIHMuZ2woKX0sCkYoKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzCmZvcihzPW0uJHRpLkMo
+IkFuPDE+Iik7ITA7KXtyPW0uYwppZihyIT1udWxsKWlmKHIuRigpKXJldHVybiEwCmVsc2UgbS5zWDko
+bnVsbCkKcT1mdW5jdGlvbihhLGIsYyl7dmFyIGwsaz1iCndoaWxlKHRydWUpdHJ5e3JldHVybiBhKGss
+bCl9Y2F0Y2goail7bD1qCms9Y319KG0uYSwwLDEpCmlmKHEgaW5zdGFuY2VvZiBQLkZ5KXtwPXEuYgpp
+ZihwPT09Mil7bz1tLmQKaWYobz09bnVsbHx8by5sZW5ndGg9PT0wKXttLnNFQyhudWxsKQpyZXR1cm4h
+MX1pZigwPj1vLmxlbmd0aClyZXR1cm4gSC5PSChvLC0xKQptLmE9by5wb3AoKQpjb250aW51ZX1lbHNl
+e3I9cS5hCmlmKHA9PT0zKXRocm93IHIKZWxzZXtuPXMuYShKLklUKHIpKQppZihuIGluc3RhbmNlb2Yg
+UC5HVil7cj1tLmQKaWYocj09bnVsbClyPW0uZD1bXQpDLk5tLmkocixtLmEpCm0uYT1uLmEKY29udGlu
+dWV9ZWxzZXttLnNYOShuKQpjb250aW51ZX19fX1lbHNle20uc0VDKHEpCnJldHVybiEwfX1yZXR1cm4h
+MX0sCnNFQyhhKXt0aGlzLmI9dGhpcy4kdGkuQygiMT8iKS5hKGEpfSwKc1g5KGEpe3RoaXMuYz10aGlz
+LiR0aS5DKCJBbjwxPj8iKS5hKGEpfSwKJGlBbjoxfQpQLnE0LnByb3RvdHlwZT17CmdtKGEpe3JldHVy
+biBuZXcgUC5HVih0aGlzLmEoKSx0aGlzLiR0aS5DKCJHVjwxPiIpKX19ClAuQ3cucHJvdG90eXBlPXsK
+dyhhKXtyZXR1cm4gSC5Faih0aGlzLmEpfSwKJGlYUzoxLApnSUkoKXtyZXR1cm4gdGhpcy5ifX0KUC5Q
+Zi5wcm90b3R5cGU9ewp3MChhLGIpe3ZhciBzCkguY2IoYSwiZXJyb3IiLHQuSykKcz10aGlzLmEKaWYo
+KHMuYSYzMCkhPT0wKXRocm93IEguYihQLlBWKCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKaWYo
+Yj09bnVsbCliPVAudjAoYSkKcy5OayhhLGIpfSwKcG0oYSl7cmV0dXJuIHRoaXMudzAoYSxudWxsKX19
+ClAuWmYucHJvdG90eXBlPXsKYU0oYSxiKXt2YXIgcyxyPXRoaXMuJHRpCnIuQygiMS8/IikuYShiKQpz
+PXRoaXMuYQppZigocy5hJjMwKSE9PTApdGhyb3cgSC5iKFAuUFYoIkZ1dHVyZSBhbHJlYWR5IGNvbXBs
+ZXRlZCIpKQpzLlhmKHIuQygiMS8iKS5hKGIpKX19ClAuRmUucHJvdG90eXBlPXsKSFIoYSl7aWYoKHRo
+aXMuYyYxNSkhPT02KXJldHVybiEwCnJldHVybiB0aGlzLmIuYi5idih0LmFsLmEodGhpcy5kKSxhLmEs
+dC55LHQuSyl9LApLdyhhKXt2YXIgcyxyPXRoaXMscT1yLmUscD1udWxsLG89dC56LG49dC5LLG09YS5h
+LGw9ci5iLmIKaWYodC5rLmIocSkpcD1sLnJwKHEsbSxhLmIsbyxuLHQubCkKZWxzZSBwPWwuYnYodC52
+LmEocSksbSxvLG4pCnRyeXtvPXIuJHRpLkMoIjIvIikuYShwKQpyZXR1cm4gb31jYXRjaChzKXtpZih0
+LmVLLmIoSC5SdShzKSkpe2lmKChyLmMmMSkhPT0wKXRocm93IEguYihQLnhZKCJUaGUgZXJyb3IgaGFu
+ZGxlciBvZiBGdXR1cmUudGhlbiBtdXN0IHJldHVybiBhIHZhbHVlIG9mIHRoZSByZXR1cm5lZCBmdXR1
+cmUncyB0eXBlIiwib25FcnJvciIpKQp0aHJvdyBILmIoUC54WSgiVGhlIGVycm9yIGhhbmRsZXIgb2Yg
+RnV0dXJlLmNhdGNoRXJyb3IgbXVzdCByZXR1cm4gYSB2YWx1ZSBvZiB0aGUgZnV0dXJlJ3MgdHlwZSIs
+Im9uRXJyb3IiKSl9ZWxzZSB0aHJvdyBzfX19ClAudnMucHJvdG90eXBlPXsKU3EoYSxiLGMpe3ZhciBz
+LHIscSxwPXRoaXMuJHRpCnAuS3EoYykuQygiMS8oMikiKS5hKGEpCnM9JC5YMwppZihzPT09Qy5OVSl7
+aWYoYiE9bnVsbCYmIXQuay5iKGIpJiYhdC52LmIoYikpdGhyb3cgSC5iKFAuTDMoYiwib25FcnJvciIs
+dS5jKSl9ZWxzZXtjLkMoIkA8MC8+IikuS3EocC5jKS5DKCIxKDIpIikuYShhKQppZihiIT1udWxsKWI9
+UC5WSChiLHMpfXI9bmV3IFAudnMocyxjLkMoInZzPDA+IikpCnE9Yj09bnVsbD8xOjMKdGhpcy54Zihu
+ZXcgUC5GZShyLHEsYSxiLHAuQygiQDwxPiIpLktxKGMpLkMoIkZlPDEsMj4iKSkpCnJldHVybiByfSwK
+VzcoYSxiKXtyZXR1cm4gdGhpcy5TcShhLG51bGwsYil9LApRZChhLGIsYyl7dmFyIHMscj10aGlzLiR0
+aQpyLktxKGMpLkMoIjEvKDIpIikuYShhKQpzPW5ldyBQLnZzKCQuWDMsYy5DKCJ2czwwPiIpKQp0aGlz
+LnhmKG5ldyBQLkZlKHMsMTksYSxiLHIuQygiQDwxPiIpLktxKGMpLkMoIkZlPDEsMj4iKSkpCnJldHVy
+biBzfSwKUDkoYSl7dGhpcy5hPXRoaXMuYSYxfDE2CnRoaXMuYz1hfSwKdWcoYSl7dGhpcy5hPWEuYSYz
+MHx0aGlzLmEmMQp0aGlzLmM9YS5jfSwKeGYoYSl7dmFyIHMscj10aGlzLHE9ci5hCmlmKHE8PTMpe2Eu
+YT10LmUuYShyLmMpCnIuYz1hfWVsc2V7aWYoKHEmNCkhPT0wKXtzPXQuYy5hKHIuYykKaWYoKHMuYSYy
+NCk9PT0wKXtzLnhmKGEpCnJldHVybn1yLnVnKHMpfVAuVGsobnVsbCxudWxsLHIuYix0Lk0uYShuZXcg
+UC5kYShyLGEpKSl9fSwKalEoYSl7dmFyIHMscixxLHAsbyxuLG09dGhpcyxsPXt9CmwuYT1hCmlmKGE9
+PW51bGwpcmV0dXJuCnM9bS5hCmlmKHM8PTMpe3I9dC5lLmEobS5jKQptLmM9YQppZihyIT1udWxsKXtx
+PWEuYQpmb3IocD1hO3EhPW51bGw7cD1xLHE9bylvPXEuYQpwLmE9cn19ZWxzZXtpZigocyY0KSE9PTAp
+e249dC5jLmEobS5jKQppZigobi5hJjI0KT09PTApe24ualEoYSkKcmV0dXJufW0udWcobil9bC5hPW0u
+TjgoYSkKUC5UayhudWxsLG51bGwsbS5iLHQuTS5hKG5ldyBQLm9RKGwsbSkpKX19LAphaCgpe3ZhciBz
+PXQuZS5hKHRoaXMuYykKdGhpcy5jPW51bGwKcmV0dXJuIHRoaXMuTjgocyl9LApOOChhKXt2YXIgcyxy
+LHEKZm9yKHM9YSxyPW51bGw7cyE9bnVsbDtyPXMscz1xKXtxPXMuYQpzLmE9cn1yZXR1cm4gcn0sCmVj
+KGEpe3ZhciBzLHIscSxwPXRoaXMKcC5hXj0yCnRyeXthLlNxKG5ldyBQLnBWKHApLG5ldyBQLlU3KHAp
+LHQuUCl9Y2F0Y2gocSl7cz1ILlJ1KHEpCnI9SC50cyhxKQpQLnJiKG5ldyBQLnZyKHAscyxyKSl9fSwK
+WDIoYSl7dmFyIHMscj10aGlzCnIuJHRpLmMuYShhKQpzPXIuYWgoKQpyLmE9OApyLmM9YQpQLkhaKHIs
+cyl9LApaTChhLGIpe3ZhciBzCnQubC5hKGIpCnM9dGhpcy5haCgpCnRoaXMuUDkoUC5UbChhLGIpKQpQ
+LkhaKHRoaXMscyl9LApYZihhKXt2YXIgcz10aGlzLiR0aQpzLkMoIjEvIikuYShhKQppZihzLkMoImI4
+PDE+IikuYihhKSl7dGhpcy5jVShhKQpyZXR1cm59dGhpcy53VShzLmMuYShhKSl9LAp3VShhKXt2YXIg
+cz10aGlzCnMuJHRpLmMuYShhKQpzLmFePTIKUC5UayhudWxsLG51bGwscy5iLHQuTS5hKG5ldyBQLnJ0
+KHMsYSkpKX0sCmNVKGEpe3ZhciBzPXRoaXMscj1zLiR0aQpyLkMoImI4PDE+IikuYShhKQppZihyLmIo
+YSkpe2lmKChhLmEmMTYpIT09MCl7cy5hXj0yClAuVGsobnVsbCxudWxsLHMuYix0Lk0uYShuZXcgUC5L
+RihzLGEpKSl9ZWxzZSBQLkE5KGEscykKcmV0dXJufXMuZWMoYSl9LApOayhhLGIpe3RoaXMuYV49MgpQ
+LlRrKG51bGwsbnVsbCx0aGlzLmIsdC5NLmEobmV3IFAuWkwodGhpcyxhLGIpKSl9LAokaWI4OjF9ClAu
+ZGEucHJvdG90eXBlPXsKJDAoKXtQLkhaKHRoaXMuYSx0aGlzLmIpfSwKJFM6MH0KUC5vUS5wcm90b3R5
+cGU9ewokMCgpe1AuSFoodGhpcy5iLHRoaXMuYS5hKX0sCiRTOjB9ClAucFYucHJvdG90eXBlPXsKJDEo
+YSl7dmFyIHMscixxLHA9dGhpcy5hCnAuYV49Mgp0cnl7cC5YMihwLiR0aS5jLmEoYSkpfWNhdGNoKHEp
+e3M9SC5SdShxKQpyPUgudHMocSkKcC5aTChzLHIpfX0sCiRTOjEzfQpQLlU3LnByb3RvdHlwZT17CiQy
+KGEsYil7dGhpcy5hLlpMKHQuSy5hKGEpLHQubC5hKGIpKX0sCiRTOjM0fQpQLnZyLnByb3RvdHlwZT17
+CiQwKCl7dGhpcy5hLlpMKHRoaXMuYix0aGlzLmMpfSwKJFM6MH0KUC5ydC5wcm90b3R5cGU9ewokMCgp
+e3RoaXMuYS5YMih0aGlzLmIpfSwKJFM6MH0KUC5LRi5wcm90b3R5cGU9ewokMCgpe1AuQTkodGhpcy5i
+LHRoaXMuYSl9LAokUzowfQpQLlpMLnByb3RvdHlwZT17CiQwKCl7dGhpcy5hLlpMKHRoaXMuYix0aGlz
+LmMpfSwKJFM6MH0KUC5SVC5wcm90b3R5cGU9ewokMCgpe3ZhciBzLHIscSxwLG8sbixtPXRoaXMsbD1u
+dWxsCnRyeXtxPW0uYS5hCmw9cS5iLmIuenoodC5mTy5hKHEuZCksdC56KX1jYXRjaChwKXtzPUguUnUo
+cCkKcj1ILnRzKHApCnE9bS5jJiZ0Lm4uYShtLmIuYS5jKS5hPT09cwpvPW0uYQppZihxKW8uYz10Lm4u
+YShtLmIuYS5jKQplbHNlIG8uYz1QLlRsKHMscikKby5iPSEwCnJldHVybn1pZihsIGluc3RhbmNlb2Yg
+UC52cyYmKGwuYSYyNCkhPT0wKXtpZigobC5hJjE2KSE9PTApe3E9bS5hCnEuYz10Lm4uYShsLmMpCnEu
+Yj0hMH1yZXR1cm59aWYodC5pLmIobCkpe249bS5iLmEKcT1tLmEKcS5jPWwuVzcobmV3IFAualoobiks
+dC56KQpxLmI9ITF9fSwKJFM6MH0KUC5qWi5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdGhpcy5hfSwK
+JFM6Mjl9ClAucnEucHJvdG90eXBlPXsKJDAoKXt2YXIgcyxyLHEscCxvLG4sbSxsCnRyeXtxPXRoaXMu
+YQpwPXEuYQpvPXAuJHRpCm49by5jCm09bi5hKHRoaXMuYikKcS5jPXAuYi5iLmJ2KG8uQygiMi8oMSki
+KS5hKHAuZCksbSxvLkMoIjIvIiksbil9Y2F0Y2gobCl7cz1ILlJ1KGwpCnI9SC50cyhsKQpxPXRoaXMu
+YQpxLmM9UC5UbChzLHIpCnEuYj0hMH19LAokUzowfQpQLlJXLnByb3RvdHlwZT17CiQwKCl7dmFyIHMs
+cixxLHAsbyxuLG09dGhpcwp0cnl7cz10Lm4uYShtLmEuYS5jKQpwPW0uYgppZihwLmEuSFIocykmJnAu
+YS5lIT1udWxsKXtwLmM9cC5hLkt3KHMpCnAuYj0hMX19Y2F0Y2gobyl7cj1ILlJ1KG8pCnE9SC50cyhv
+KQpwPXQubi5hKG0uYS5hLmMpCm49bS5iCmlmKHAuYT09PXIpbi5jPXAKZWxzZSBuLmM9UC5UbChyLHEp
+Cm4uYj0hMH19LAokUzowfQpQLk9NLnByb3RvdHlwZT17fQpQLnFoLnByb3RvdHlwZT17CmdBKGEpe3Zh
+ciBzLHIscT10aGlzLHA9e30sbz1uZXcgUC52cygkLlgzLHQuZkopCnAuYT0wCnM9SC5MaChxKQpyPXMu
+QygifigxKT8iKS5hKG5ldyBQLkI1KHAscSkpCnQuWi5hKG5ldyBQLnVPKHAsbykpClcuSkUocS5hLHEu
+YixyLCExLHMuYykKcmV0dXJuIG99fQpQLkI1LnByb3RvdHlwZT17CiQxKGEpe0guTGgodGhpcy5iKS5j
+LmEoYSk7Kyt0aGlzLmEuYX0sCiRTKCl7cmV0dXJuIEguTGgodGhpcy5iKS5DKCJ+KDEpIil9fQpQLnVP
+LnByb3RvdHlwZT17CiQwKCl7dmFyIHM9dGhpcy5iLHI9cy4kdGkscT1yLkMoIjEvIikuYSh0aGlzLmEu
+YSkscD1zLmFoKCkKci5jLmEocSkKcy5hPTgKcy5jPXEKUC5IWihzLHApfSwKJFM6MH0KUC5NTy5wcm90
+b3R5cGU9e30KUC5rVC5wcm90b3R5cGU9e30KUC54SS5wcm90b3R5cGU9e30KUC5tMC5wcm90b3R5cGU9
+eyRpUW06MX0KUC5Fdi5wcm90b3R5cGU9ewokMCgpe3ZhciBzPXQuSy5hKEguYih0aGlzLmEpKQpzLnN0
+YWNrPXRoaXMuYi53KDApCnRocm93IHN9LAokUzowfQpQLkppLnByb3RvdHlwZT17CmJIKGEpe3ZhciBz
+LHIscSxwLG8KdC5NLmEoYSkKdHJ5e2lmKEMuTlU9PT0kLlgzKXthLiQwKCkKcmV0dXJufVAuVDgobnVs
+bCxudWxsLHRoaXMsYSx0LkgpfWNhdGNoKHEpe3M9SC5SdShxKQpyPUgudHMocSkKcD10LksuYShzKQpv
+PXQubC5hKHIpClAuU2kocCxvKX19LApEbChhLGIsYyl7dmFyIHMscixxLHAsbwpjLkMoIn4oMCkiKS5h
+KGEpCmMuYShiKQp0cnl7aWYoQy5OVT09PSQuWDMpe2EuJDEoYikKcmV0dXJufVAueXYobnVsbCxudWxs
+LHRoaXMsYSxiLHQuSCxjKX1jYXRjaChxKXtzPUguUnUocSkKcj1ILnRzKHEpCnA9dC5LLmEocykKbz10
+LmwuYShyKQpQLlNpKHAsbyl9fSwKR1koYSl7cmV0dXJuIG5ldyBQLlZwKHRoaXMsdC5NLmEoYSkpfSwK
+UHkoYSxiKXtyZXR1cm4gbmV3IFAuT1IodGhpcyxiLkMoIn4oMCkiKS5hKGEpLGIpfSwKcShhLGIpe3Jl
+dHVybiBudWxsfSwKenooYSxiKXtiLkMoIjAoKSIpLmEoYSkKaWYoJC5YMz09PUMuTlUpcmV0dXJuIGEu
+JDAoKQpyZXR1cm4gUC5UOChudWxsLG51bGwsdGhpcyxhLGIpfSwKYnYoYSxiLGMsZCl7Yy5DKCJAPDA+
+IikuS3EoZCkuQygiMSgyKSIpLmEoYSkKZC5hKGIpCmlmKCQuWDM9PT1DLk5VKXJldHVybiBhLiQxKGIp
+CnJldHVybiBQLnl2KG51bGwsbnVsbCx0aGlzLGEsYixjLGQpfSwKcnAoYSxiLGMsZCxlLGYpe2QuQygi
+QDwwPiIpLktxKGUpLktxKGYpLkMoIjEoMiwzKSIpLmEoYSkKZS5hKGIpCmYuYShjKQppZigkLlgzPT09
+Qy5OVSlyZXR1cm4gYS4kMihiLGMpCnJldHVybiBQLlF4KG51bGwsbnVsbCx0aGlzLGEsYixjLGQsZSxm
+KX0sCkxqKGEsYixjLGQpe3JldHVybiBiLkMoIkA8MD4iKS5LcShjKS5LcShkKS5DKCIxKDIsMykiKS5h
+KGEpfX0KUC5WcC5wcm90b3R5cGU9ewokMCgpe3JldHVybiB0aGlzLmEuYkgodGhpcy5iKX0sCiRTOjB9
+ClAuT1IucHJvdG90eXBlPXsKJDEoYSl7dmFyIHM9dGhpcy5jCnJldHVybiB0aGlzLmEuRGwodGhpcy5i
+LHMuYShhKSxzKX0sCiRTKCl7cmV0dXJuIHRoaXMuYy5DKCJ+KDApIil9fQpQLmI2LnByb3RvdHlwZT17
+CmdtKGEpe3ZhciBzPXRoaXMscj1uZXcgUC5sbShzLHMucixILkxoKHMpLkMoImxtPDE+IikpCnIuYz1z
+LmUKcmV0dXJuIHJ9LApnQShhKXtyZXR1cm4gdGhpcy5hfSwKZ2wwKGEpe3JldHVybiB0aGlzLmE9PT0w
+fSwKZ29yKGEpe3JldHVybiB0aGlzLmEhPT0wfSwKdGcoYSxiKXt2YXIgcyxyCmlmKGIhPT0iX19wcm90
+b19fIil7cz10aGlzLmIKaWYocz09bnVsbClyZXR1cm4hMQpyZXR1cm4gdC5nLmEoc1tiXSkhPW51bGx9
+ZWxzZXtyPXRoaXMuUFIoYikKcmV0dXJuIHJ9fSwKUFIoYSl7dmFyIHM9dGhpcy5kCmlmKHM9PW51bGwp
+cmV0dXJuITEKcmV0dXJuIHRoaXMuREYoc1t0aGlzLk4oYSldLGEpPj0wfSwKaShhLGIpe3ZhciBzLHIs
+cT10aGlzCkguTGgocSkuYy5hKGIpCmlmKHR5cGVvZiBiPT0ic3RyaW5nIiYmYiE9PSJfX3Byb3RvX18i
+KXtzPXEuYgpyZXR1cm4gcS5KKHM9PW51bGw/cS5iPVAuVDIoKTpzLGIpfWVsc2UgaWYodHlwZW9mIGI9
+PSJudW1iZXIiJiYoYiYxMDczNzQxODIzKT09PWIpe3I9cS5jCnJldHVybiBxLkoocj09bnVsbD9xLmM9
+UC5UMigpOnIsYil9ZWxzZSByZXR1cm4gcS5ZKGIpfSwKWShhKXt2YXIgcyxyLHEscD10aGlzCkguTGgo
+cCkuYy5hKGEpCnM9cC5kCmlmKHM9PW51bGwpcz1wLmQ9UC5UMigpCnI9cC5OKGEpCnE9c1tyXQppZihx
+PT1udWxsKXNbcl09W3AueW8oYSldCmVsc2V7aWYocC5ERihxLGEpPj0wKXJldHVybiExCnEucHVzaChw
+LnlvKGEpKX1yZXR1cm4hMH0sClIoYSxiKXt2YXIgcz10aGlzCmlmKHR5cGVvZiBiPT0ic3RyaW5nIiYm
+YiE9PSJfX3Byb3RvX18iKXJldHVybiBzLkgocy5iLGIpCmVsc2UgaWYodHlwZW9mIGI9PSJudW1iZXIi
+JiYoYiYxMDczNzQxODIzKT09PWIpcmV0dXJuIHMuSChzLmMsYikKZWxzZSByZXR1cm4gcy5xZyhiKX0s
+CnFnKGEpe3ZhciBzLHIscSxwLG89dGhpcyxuPW8uZAppZihuPT1udWxsKXJldHVybiExCnM9by5OKGEp
+CnI9bltzXQpxPW8uREYocixhKQppZihxPDApcmV0dXJuITEKcD1yLnNwbGljZShxLDEpWzBdCmlmKDA9
+PT1yLmxlbmd0aClkZWxldGUgbltzXQpvLkcocCkKcmV0dXJuITB9LApKKGEsYil7SC5MaCh0aGlzKS5j
+LmEoYikKaWYodC5nLmEoYVtiXSkhPW51bGwpcmV0dXJuITEKYVtiXT10aGlzLnlvKGIpCnJldHVybiEw
+fSwKSChhLGIpe3ZhciBzCmlmKGE9PW51bGwpcmV0dXJuITEKcz10LmcuYShhW2JdKQppZihzPT1udWxs
+KXJldHVybiExCnRoaXMuRyhzKQpkZWxldGUgYVtiXQpyZXR1cm4hMH0sClMoKXt0aGlzLnI9dGhpcy5y
+KzEmMTA3Mzc0MTgyM30sCnlvKGEpe3ZhciBzLHI9dGhpcyxxPW5ldyBQLmJuKEguTGgocikuYy5hKGEp
+KQppZihyLmU9PW51bGwpci5lPXIuZj1xCmVsc2V7cz1yLmYKcy50b1N0cmluZwpxLmM9cwpyLmY9cy5i
+PXF9KytyLmEKci5TKCkKcmV0dXJuIHF9LApHKGEpe3ZhciBzPXRoaXMscj1hLmMscT1hLmIKaWYocj09
+bnVsbClzLmU9cQplbHNlIHIuYj1xCmlmKHE9PW51bGwpcy5mPXIKZWxzZSBxLmM9cjstLXMuYQpzLlMo
+KX0sCk4oYSl7cmV0dXJuIEouaGYoYSkmMTA3Mzc0MTgyM30sCkRGKGEsYil7dmFyIHMscgppZihhPT1u
+dWxsKXJldHVybi0xCnM9YS5sZW5ndGgKZm9yKHI9MDtyPHM7KytyKWlmKEouUk0oYVtyXS5hLGIpKXJl
+dHVybiByCnJldHVybi0xfX0KUC5ibi5wcm90b3R5cGU9e30KUC5sbS5wcm90b3R5cGU9ewpnbCgpe3Jl
+dHVybiB0aGlzLiR0aS5jLmEodGhpcy5kKX0sCkYoKXt2YXIgcz10aGlzLHI9cy5jLHE9cy5hCmlmKHMu
+YiE9PXEucil0aHJvdyBILmIoUC5hNChxKSkKZWxzZSBpZihyPT1udWxsKXtzLnNqKG51bGwpCnJldHVy
+biExfWVsc2V7cy5zaihzLiR0aS5DKCIxPyIpLmEoci5hKSkKcy5jPXIuYgpyZXR1cm4hMH19LApzaihh
+KXt0aGlzLmQ9dGhpcy4kdGkuQygiMT8iKS5hKGEpfSwKJGlBbjoxfQpQLm1XLnByb3RvdHlwZT17fQpQ
+LnV5LnByb3RvdHlwZT17JGliUToxLCRpY1g6MSwkaXpNOjF9ClAubEQucHJvdG90eXBlPXsKZ20oYSl7
+cmV0dXJuIG5ldyBILmE3KGEsdGhpcy5nQShhKSxILnpLKGEpLkMoImE3PGxELkU+IikpfSwKRShhLGIp
+e3JldHVybiB0aGlzLnEoYSxiKX0sCksoYSxiKXt2YXIgcyxyCkgueksoYSkuQygifihsRC5FKSIpLmEo
+YikKcz10aGlzLmdBKGEpCmZvcihyPTA7cjxzOysrcil7Yi4kMSh0aGlzLnEoYSxyKSkKaWYocyE9PXRo
+aXMuZ0EoYSkpdGhyb3cgSC5iKFAuYTQoYSkpfX0sCmdsMChhKXtyZXR1cm4gdGhpcy5nQShhKT09PTB9
+LApnb3IoYSl7cmV0dXJuIXRoaXMuZ2wwKGEpfSwKRTIoYSxiLGMpe3ZhciBzPUgueksoYSkKcmV0dXJu
+IG5ldyBILmxKKGEscy5LcShjKS5DKCIxKGxELkUpIikuYShiKSxzLkMoIkA8bEQuRT4iKS5LcShjKS5D
+KCJsSjwxLDI+IikpfSwKZVIoYSxiKXtyZXR1cm4gSC5xQyhhLGIsbnVsbCxILnpLKGEpLkMoImxELkUi
+KSl9LApkcihhLGIpe3JldHVybiBuZXcgSC5qVihhLEgueksoYSkuQygiQDxsRC5FPiIpLktxKGIpLkMo
+ImpWPDEsMj4iKSl9LApkdShhLGIsYyxkKXt2YXIgcyxyPUgueksoYSkKZD1yLkMoImxELkUiKS5hKHIu
+QygibEQuRT8iKS5hKGQpKQpQLmpCKGIsYyx0aGlzLmdBKGEpKQpmb3Iocz1iO3M8YzsrK3MpdGhpcy5Z
+NShhLHMsZCl9LAp3KGEpe3JldHVybiBQLngoYSwiWyIsIl0iKX19ClAuaWwucHJvdG90eXBlPXt9ClAu
+cmEucHJvdG90eXBlPXsKJDIoYSxiKXt2YXIgcyxyPXRoaXMuYQppZighci5hKXRoaXMuYi5hKz0iLCAi
+CnIuYT0hMQpyPXRoaXMuYgpzPXIuYSs9SC5FaihhKQpyLmE9cysiOiAiCnIuYSs9SC5FaihiKX0sCiRT
+Ojl9ClAuWWsucHJvdG90eXBlPXsKSyhhLGIpe3ZhciBzLHIscT1ILkxoKHRoaXMpCnEuQygifihZay5L
+LFlrLlYpIikuYShiKQpmb3Iocz1KLklUKHRoaXMuZ3ZjKCkpLHE9cS5DKCJZay5WIik7cy5GKCk7KXty
+PXMuZ2woKQpiLiQyKHIscS5hKHRoaXMucSgwLHIpKSl9fSwKZ1B1KGEpe3JldHVybiBKLk0xKHRoaXMu
+Z3ZjKCksbmV3IFAueVEodGhpcyksSC5MaCh0aGlzKS5DKCJOMzxZay5LLFlrLlY+IikpfSwKeDQoYSl7
+cmV0dXJuIEouemwodGhpcy5ndmMoKSxhKX0sCmdBKGEpe3JldHVybiBKLkhtKHRoaXMuZ3ZjKCkpfSwK
+Z2wwKGEpe3JldHVybiBKLnVVKHRoaXMuZ3ZjKCkpfSwKdyhhKXtyZXR1cm4gUC5uTyh0aGlzKX0sCiRp
+WjA6MX0KUC55US5wcm90b3R5cGU9ewokMShhKXt2YXIgcyxyPXRoaXMuYSxxPUguTGgocikKcS5DKCJZ
+ay5LIikuYShhKQpzPXEuQygiWWsuViIpCnJldHVybiBuZXcgUC5OMyhhLHMuYShyLnEoMCxhKSkscS5D
+KCJAPFlrLks+IikuS3EocykuQygiTjM8MSwyPiIpKX0sCiRTKCl7cmV0dXJuIEguTGgodGhpcy5hKS5D
+KCJOMzxZay5LLFlrLlY+KFlrLkspIil9fQpQLktQLnByb3RvdHlwZT17Clk1KGEsYixjKXt2YXIgcz1I
+LkxoKHRoaXMpCnMuYy5hKGIpCnMuUVsxXS5hKGMpCnRocm93IEguYihQLkw0KCJDYW5ub3QgbW9kaWZ5
+IHVubW9kaWZpYWJsZSBtYXAiKSl9fQpQLlBuLnByb3RvdHlwZT17CnEoYSxiKXtyZXR1cm4gdGhpcy5h
+LnEoMCxiKX0sClk1KGEsYixjKXt2YXIgcz1ILkxoKHRoaXMpCnRoaXMuYS5ZNSgwLHMuYy5hKGIpLHMu
+UVsxXS5hKGMpKX0sCng0KGEpe3JldHVybiB0aGlzLmEueDQoYSl9LApLKGEsYil7dGhpcy5hLksoMCxI
+LkxoKHRoaXMpLkMoIn4oMSwyKSIpLmEoYikpfSwKZ2wwKGEpe3ZhciBzPXRoaXMuYQpyZXR1cm4gcy5n
+bDAocyl9LApnQShhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ0Eocyl9LAp3KGEpe3JldHVybiB0aGlz
+LmEudygwKX0sCmdQdShhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ1B1KHMpfSwKJGlaMDoxfQpQLkdq
+LnByb3RvdHlwZT17fQpQLmxmLnByb3RvdHlwZT17CmdsMChhKXtyZXR1cm4gdGhpcy5nQSh0aGlzKT09
+PTB9LApnb3IoYSl7cmV0dXJuIHRoaXMuZ0EodGhpcykhPT0wfSwKRlYoYSxiKXt2YXIgcwpmb3Iocz1K
+LklUKEguTGgodGhpcykuQygiY1g8bGYuRT4iKS5hKGIpKTtzLkYoKTspdGhpcy5pKDAscy5nbCgpKX0s
+CncoYSl7cmV0dXJuIFAueCh0aGlzLCJ7IiwifSIpfSwKayhhLGIpe3ZhciBzLHIscT10aGlzLmdtKHRo
+aXMpCmlmKCFxLkYoKSlyZXR1cm4iIgpzPXEuJHRpLmMKaWYoYj09PSIiKXtyPSIiCmRvIHIrPUguRWoo
+cy5hKHEuZCkpCndoaWxlKHEuRigpKQpzPXJ9ZWxzZXtyPSIiK0guRWoocy5hKHEuZCkpCmZvcig7cS5G
+KCk7KXI9citiK0guRWoocy5hKHEuZCkpCnM9cn1yZXR1cm4gcy5jaGFyQ29kZUF0KDApPT0wP3M6c30s
+CmVSKGEsYil7cmV0dXJuIEguYksodGhpcyxiLEguTGgodGhpcykuQygibGYuRSIpKX0sCkUoYSxiKXt2
+YXIgcyxyLHEscCxvPSJpbmRleCIKSC5jYihiLG8sdC5TKQpQLmsxKGIsbykKZm9yKHM9dGhpcy5nbSh0
+aGlzKSxyPXMuJHRpLmMscT0wO3MuRigpOyl7cD1yLmEocy5kKQppZihiPT09cSlyZXR1cm4gcDsrK3F9
+dGhyb3cgSC5iKFAuQ2YoYix0aGlzLG8sbnVsbCxxKSl9fQpQLlZqLnByb3RvdHlwZT17JGliUToxLCRp
+Y1g6MSwkaXh1OjF9ClAuWHYucHJvdG90eXBlPXskaWJROjEsJGljWDoxLCRpeHU6MX0KUC5uWS5wcm90
+b3R5cGU9e30KUC5XWS5wcm90b3R5cGU9e30KUC5SVS5wcm90b3R5cGU9e30KUC5wUi5wcm90b3R5cGU9
+e30KUC51dy5wcm90b3R5cGU9ewpxKGEsYil7dmFyIHMscj10aGlzLmIKaWYocj09bnVsbClyZXR1cm4g
+dGhpcy5jLnEoMCxiKQplbHNlIGlmKHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gbnVsbAplbHNle3M9
+cltiXQpyZXR1cm4gdHlwZW9mIHM9PSJ1bmRlZmluZWQiP3RoaXMuZmIoYik6c319LApnQShhKXt2YXIg
+cwppZih0aGlzLmI9PW51bGwpe3M9dGhpcy5jCnM9cy5nQShzKX1lbHNlIHM9dGhpcy5DZigpLmxlbmd0
+aApyZXR1cm4gc30sCmdsMChhKXtyZXR1cm4gdGhpcy5nQSh0aGlzKT09PTB9LApndmMoKXtpZih0aGlz
+LmI9PW51bGwpcmV0dXJuIHRoaXMuYy5ndmMoKQpyZXR1cm4gbmV3IFAuaTgodGhpcyl9LApZNShhLGIs
+Yyl7dmFyIHMscixxPXRoaXMKaWYocS5iPT1udWxsKXEuYy5ZNSgwLGIsYykKZWxzZSBpZihxLng0KGIp
+KXtzPXEuYgpzW2JdPWMKcj1xLmEKaWYocj09bnVsbD9zIT1udWxsOnIhPT1zKXJbYl09bnVsbH1lbHNl
+IHEuWEsoKS5ZNSgwLGIsYyl9LAp4NChhKXtpZih0aGlzLmI9PW51bGwpcmV0dXJuIHRoaXMuYy54NChh
+KQpyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuYSxhKX0sCkso
+YSxiKXt2YXIgcyxyLHEscCxvPXRoaXMKdC5jQS5hKGIpCmlmKG8uYj09bnVsbClyZXR1cm4gby5jLkso
+MCxiKQpzPW8uQ2YoKQpmb3Iocj0wO3I8cy5sZW5ndGg7KytyKXtxPXNbcl0KcD1vLmJbcV0KaWYodHlw
+ZW9mIHA9PSJ1bmRlZmluZWQiKXtwPVAuUWUoby5hW3FdKQpvLmJbcV09cH1iLiQyKHEscCkKaWYocyE9
+PW8uYyl0aHJvdyBILmIoUC5hNChvKSl9fSwKQ2YoKXt2YXIgcz10LmJNLmEodGhpcy5jKQppZihzPT1u
+dWxsKXM9dGhpcy5jPUguUUkoT2JqZWN0LmtleXModGhpcy5hKSx0LnMpCnJldHVybiBzfSwKWEsoKXt2
+YXIgcyxyLHEscCxvLG49dGhpcwppZihuLmI9PW51bGwpcmV0dXJuIG4uYwpzPVAuRmwodC5OLHQueikK
+cj1uLkNmKCkKZm9yKHE9MDtwPXIubGVuZ3RoLHE8cDsrK3Epe289cltxXQpzLlk1KDAsbyxuLnEoMCxv
+KSl9aWYocD09PTApQy5ObS5pKHIsIiIpCmVsc2UgQy5ObS5zQShyLDApCm4uYT1uLmI9bnVsbApyZXR1
+cm4gbi5jPXN9LApmYihhKXt2YXIgcwppZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5j
+YWxsKHRoaXMuYSxhKSlyZXR1cm4gbnVsbApzPVAuUWUodGhpcy5hW2FdKQpyZXR1cm4gdGhpcy5iW2Fd
+PXN9fQpQLmk4LnByb3RvdHlwZT17CmdBKGEpe3ZhciBzPXRoaXMuYQpyZXR1cm4gcy5nQShzKX0sCkUo
+YSxiKXt2YXIgcz10aGlzLmEKaWYocy5iPT1udWxsKXM9cy5ndmMoKS5FKDAsYikKZWxzZXtzPXMuQ2Yo
+KQppZihiPDB8fGI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsYikKcz1zW2JdfXJldHVybiBzfSwKZ20o
+YSl7dmFyIHM9dGhpcy5hCmlmKHMuYj09bnVsbCl7cz1zLmd2YygpCnM9cy5nbShzKX1lbHNle3M9cy5D
+ZigpCnM9bmV3IEoubTEocyxzLmxlbmd0aCxILnQ2KHMpLkMoIm0xPDE+IikpfXJldHVybiBzfSwKdGco
+YSxiKXtyZXR1cm4gdGhpcy5hLng0KGIpfX0KUC54ci5wcm90b3R5cGU9ewokMCgpe3ZhciBzLHIKdHJ5
+e3M9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIse2ZhdGFsOnRydWV9KQpyZXR1cm4gc31jYXRjaChyKXtI
+LlJ1KHIpfXJldHVybiBudWxsfSwKJFM6MTB9ClAuTnoucHJvdG90eXBlPXsKJDAoKXt2YXIgcyxyCnRy
+eXtzPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtmYXRhbDpmYWxzZX0pCnJldHVybiBzfWNhdGNoKHIp
+e0guUnUocil9cmV0dXJuIG51bGx9LAokUzoxMH0KUC5DVi5wcm90b3R5cGU9ewp5cihhMSxhMixhMyl7
+dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQsYyxiLGEsYTA9IkludmFsaWQgYmFzZTY0
+IGVuY29kaW5nIGxlbmd0aCAiCmEzPVAuakIoYTIsYTMsYTEubGVuZ3RoKQpzPSQuVjcoKQpmb3Iocj1z
+Lmxlbmd0aCxxPWEyLHA9cSxvPW51bGwsbj0tMSxtPS0xLGw9MDtxPGEzO3E9ayl7az1xKzEKaj1DLnhC
+LlcoYTEscSkKaWYoaj09PTM3KXtpPWsrMgppZihpPD1hMyl7aD1ILm9vKEMueEIuVyhhMSxrKSkKZz1I
+Lm9vKEMueEIuVyhhMSxrKzEpKQpmPWgqMTYrZy0oZyYyNTYpCmlmKGY9PT0zNylmPS0xCms9aX1lbHNl
+IGY9LTF9ZWxzZSBmPWoKaWYoMDw9ZiYmZjw9MTI3KXtpZihmPDB8fGY+PXIpcmV0dXJuIEguT0gocyxm
+KQplPXNbZl0KaWYoZT49MCl7Zj1DLnhCLk8oIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVm
+Z2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGUpCmlmKGY9PT1qKWNvbnRpbnVlCmo9Zn1l
+bHNle2lmKGU9PT0tMSl7aWYobjwwKXtkPW89PW51bGw/bnVsbDpvLmEubGVuZ3RoCmlmKGQ9PW51bGwp
+ZD0wCm49ZCsocS1wKQptPXF9KytsCmlmKGo9PT02MSljb250aW51ZX1qPWZ9aWYoZSE9PS0yKXtpZihv
+PT1udWxsKXtvPW5ldyBQLk0oIiIpCmQ9b31lbHNlIGQ9bwpjPWQuYSs9Qy54Qi5OaihhMSxwLHEpCmQu
+YT1jK0guTHcoaikKcD1rCmNvbnRpbnVlfX10aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNlNjQgZGF0
+YSIsYTEscSkpfWlmKG8hPW51bGwpe3I9by5hKz1DLnhCLk5qKGExLHAsYTMpCmQ9ci5sZW5ndGgKaWYo
+bj49MClQLnhNKGExLG0sYTMsbixsLGQpCmVsc2V7Yj1DLmpuLnpZKGQtMSw0KSsxCmlmKGI9PT0xKXRo
+cm93IEguYihQLnJyKGEwLGExLGEzKSkKZm9yKDtiPDQ7KXtyKz0iPSIKby5hPXI7KytifX1yPW8uYQpy
+ZXR1cm4gQy54Qi5pNyhhMSxhMixhMyxyLmNoYXJDb2RlQXQoMCk9PTA/cjpyKX1hPWEzLWEyCmlmKG4+
+PTApUC54TShhMSxtLGEzLG4sbCxhKQplbHNle2I9Qy5qbi56WShhLDQpCmlmKGI9PT0xKXRocm93IEgu
+YihQLnJyKGEwLGExLGEzKSkKaWYoYj4xKWExPUMueEIuaTcoYTEsYTMsYTMsYj09PTI/Ij09IjoiPSIp
+fXJldHVybiBhMX19ClAuVTgucHJvdG90eXBlPXt9ClAuVWsucHJvdG90eXBlPXt9ClAud0kucHJvdG90
+eXBlPXt9ClAuWmkucHJvdG90eXBlPXt9ClAuVWQucHJvdG90eXBlPXsKdyhhKXt2YXIgcz1QLmhsKHRo
+aXMuYSkKcmV0dXJuKHRoaXMuYiE9bnVsbD8iQ29udmVydGluZyBvYmplY3QgdG8gYW4gZW5jb2RhYmxl
+IG9iamVjdCBmYWlsZWQ6IjoiQ29udmVydGluZyBvYmplY3QgZGlkIG5vdCByZXR1cm4gYW4gZW5jb2Rh
+YmxlIG9iamVjdDoiKSsiICIrc319ClAuSzgucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4iQ3ljbGljIGVy
+cm9yIGluIEpTT04gc3RyaW5naWZ5In19ClAuYnkucHJvdG90eXBlPXsKcFcoYSxiLGMpe3ZhciBzCnQu
+ZlYuYShjKQpzPVAuQlMoYix0aGlzLmdIZSgpLmEpCnJldHVybiBzfSwKT0IoYSxiKXt2YXIgcwp0LmRB
+LmEoYikKcz1QLnVYKGEsdGhpcy5nWkUoKS5iLG51bGwpCnJldHVybiBzfSwKZ1pFKCl7cmV0dXJuIEMu
+blh9LApnSGUoKXtyZXR1cm4gQy5BM319ClAub2oucHJvdG90eXBlPXt9ClAuTXgucHJvdG90eXBlPXt9
+ClAuU2gucHJvdG90eXBlPXsKUlQoYSl7dmFyIHMscixxLHAsbyxuLG09YS5sZW5ndGgKZm9yKHM9dGhp
+cy5jLHI9MCxxPTA7cTxtOysrcSl7cD1DLnhCLlcoYSxxKQppZihwPjkyKXtpZihwPj01NTI5Nil7bz1w
+JjY0NTEyCmlmKG89PT01NTI5Nil7bj1xKzEKbj0hKG48bSYmKEMueEIuVyhhLG4pJjY0NTEyKT09PTU2
+MzIwKX1lbHNlIG49ITEKaWYoIW4paWYobz09PTU2MzIwKXtvPXEtMQpvPSEobz49MCYmKEMueEIuTyhh
+LG8pJjY0NTEyKT09PTU1Mjk2KX1lbHNlIG89ITEKZWxzZSBvPSEwCmlmKG8pe2lmKHE+cilzLmErPUMu
+eEIuTmooYSxyLHEpCnI9cSsxCm89cy5hKz1ILkx3KDkyKQpvKz1ILkx3KDExNykKcy5hPW8Kbys9SC5M
+dygxMDApCnMuYT1vCm49cD4+PjgmMTUKbys9SC5MdyhuPDEwPzQ4K246ODcrbikKcy5hPW8Kbj1wPj4+
+NCYxNQpvKz1ILkx3KG48MTA/NDgrbjo4NytuKQpzLmE9bwpuPXAmMTUKcy5hPW8rSC5MdyhuPDEwPzQ4
+K246ODcrbil9fWNvbnRpbnVlfWlmKHA8MzIpe2lmKHE+cilzLmErPUMueEIuTmooYSxyLHEpCnI9cSsx
+Cm89cy5hKz1ILkx3KDkyKQpzd2l0Y2gocCl7Y2FzZSA4OnMuYT1vK0guTHcoOTgpCmJyZWFrCmNhc2Ug
+OTpzLmE9bytILkx3KDExNikKYnJlYWsKY2FzZSAxMDpzLmE9bytILkx3KDExMCkKYnJlYWsKY2FzZSAx
+MjpzLmE9bytILkx3KDEwMikKYnJlYWsKY2FzZSAxMzpzLmE9bytILkx3KDExNCkKYnJlYWsKZGVmYXVs
+dDpvKz1ILkx3KDExNykKcy5hPW8Kbys9SC5Mdyg0OCkKcy5hPW8Kbys9SC5Mdyg0OCkKcy5hPW8Kbj1w
+Pj4+NCYxNQpvKz1ILkx3KG48MTA/NDgrbjo4NytuKQpzLmE9bwpuPXAmMTUKcy5hPW8rSC5MdyhuPDEw
+PzQ4K246ODcrbikKYnJlYWt9fWVsc2UgaWYocD09PTM0fHxwPT09OTIpe2lmKHE+cilzLmErPUMueEIu
+TmooYSxyLHEpCnI9cSsxCm89cy5hKz1ILkx3KDkyKQpzLmE9bytILkx3KHApfX1pZihyPT09MClzLmEr
+PWEKZWxzZSBpZihyPG0pcy5hKz1DLnhCLk5qKGEscixtKX0sCkpuKGEpe3ZhciBzLHIscSxwCmZvcihz
+PXRoaXMuYSxyPXMubGVuZ3RoLHE9MDtxPHI7KytxKXtwPXNbcV0KaWYoYT09bnVsbD9wPT1udWxsOmE9
+PT1wKXRocm93IEguYihuZXcgUC5LOChhLG51bGwpKX1DLk5tLmkocyxhKX0sCmlVKGEpe3ZhciBzLHIs
+cSxwLG89dGhpcwppZihvLnRNKGEpKXJldHVybgpvLkpuKGEpCnRyeXtzPW8uYi4kMShhKQppZighby50
+TShzKSl7cT1QLkd5KGEsbnVsbCxvLmdWSygpKQp0aHJvdyBILmIocSl9cT1vLmEKaWYoMD49cS5sZW5n
+dGgpcmV0dXJuIEguT0gocSwtMSkKcS5wb3AoKX1jYXRjaChwKXtyPUguUnUocCkKcT1QLkd5KGEscixv
+LmdWSygpKQp0aHJvdyBILmIocSl9fSwKdE0oYSl7dmFyIHMscixxPXRoaXMKaWYodHlwZW9mIGE9PSJu
+dW1iZXIiKXtpZighaXNGaW5pdGUoYSkpcmV0dXJuITEKcS5jLmErPUMuQ0QudyhhKQpyZXR1cm4hMH1l
+bHNlIGlmKGE9PT0hMCl7cS5jLmErPSJ0cnVlIgpyZXR1cm4hMH1lbHNlIGlmKGE9PT0hMSl7cS5jLmEr
+PSJmYWxzZSIKcmV0dXJuITB9ZWxzZSBpZihhPT1udWxsKXtxLmMuYSs9Im51bGwiCnJldHVybiEwfWVs
+c2UgaWYodHlwZW9mIGE9PSJzdHJpbmciKXtzPXEuYwpzLmErPSciJwpxLlJUKGEpCnMuYSs9JyInCnJl
+dHVybiEwfWVsc2UgaWYodC5qLmIoYSkpe3EuSm4oYSkKcS5sSyhhKQpzPXEuYQppZigwPj1zLmxlbmd0
+aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnJldHVybiEwfWVsc2UgaWYodC5mLmIoYSkpe3EuSm4o
+YSkKcj1xLmp3KGEpCnM9cS5hCmlmKDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkK
+cmV0dXJuIHJ9ZWxzZSByZXR1cm4hMX0sCmxLKGEpe3ZhciBzLHIscT10aGlzLmMKcS5hKz0iWyIKcz1K
+LlU2KGEpCmlmKHMuZ29yKGEpKXt0aGlzLmlVKHMucShhLDApKQpmb3Iocj0xO3I8cy5nQShhKTsrK3Ip
+e3EuYSs9IiwiCnRoaXMuaVUocy5xKGEscikpfX1xLmErPSJdIn0sCmp3KGEpe3ZhciBzLHIscSxwLG8s
+bixtPXRoaXMsbD17fQppZihhLmdsMChhKSl7bS5jLmErPSJ7fSIKcmV0dXJuITB9cz1hLmdBKGEpKjIK
+cj1QLk84KHMsbnVsbCwhMSx0LlgpCnE9bC5hPTAKbC5iPSEwCmEuSygwLG5ldyBQLnRpKGwscikpCmlm
+KCFsLmIpcmV0dXJuITEKcD1tLmMKcC5hKz0ieyIKZm9yKG89JyInO3E8cztxKz0yLG89JywiJyl7cC5h
+Kz1vCm0uUlQoSC5uKHJbcV0pKQpwLmErPSciOicKbj1xKzEKaWYobj49cylyZXR1cm4gSC5PSChyLG4p
+Cm0uaVUocltuXSl9cC5hKz0ifSIKcmV0dXJuITB9fQpQLnRpLnByb3RvdHlwZT17CiQyKGEsYil7dmFy
+IHMscgppZih0eXBlb2YgYSE9InN0cmluZyIpdGhpcy5hLmI9ITEKcz10aGlzLmIKcj10aGlzLmEKQy5O
+bS5ZNShzLHIuYSsrLGEpCkMuTm0uWTUocyxyLmErKyxiKX0sCiRTOjl9ClAudHUucHJvdG90eXBlPXsK
+Z1ZLKCl7dmFyIHM9dGhpcy5jLmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9fQpQLnU1LnBy
+b3RvdHlwZT17CmdaRSgpe3JldHVybiBDLlFrfX0KUC5FMy5wcm90b3R5cGU9ewpXSihhKXt2YXIgcyxy
+LHEscD1QLmpCKDAsbnVsbCxhLmxlbmd0aCksbz1wLTAKaWYobz09PTApcmV0dXJuIG5ldyBVaW50OEFy
+cmF5KDApCnM9byozCnI9bmV3IFVpbnQ4QXJyYXkocykKcT1uZXcgUC5SdyhyKQppZihxLkd4KGEsMCxw
+KSE9PXApe0MueEIuTyhhLHAtMSkKcS5STygpfXJldHVybiBuZXcgVWludDhBcnJheShyLnN1YmFycmF5
+KDAsSC5yTSgwLHEuYixzKSkpfX0KUC5Sdy5wcm90b3R5cGU9ewpSTygpe3ZhciBzPXRoaXMscj1zLmMs
+cT1zLmIscD1zLmI9cSsxLG89ci5sZW5ndGgKaWYocT49bylyZXR1cm4gSC5PSChyLHEpCnJbcV09MjM5
+CnE9cy5iPXArMQppZihwPj1vKXJldHVybiBILk9IKHIscCkKcltwXT0xOTEKcy5iPXErMQppZihxPj1v
+KXJldHVybiBILk9IKHIscSkKcltxXT0xODl9LApPNihhLGIpe3ZhciBzLHIscSxwLG8sbj10aGlzCmlm
+KChiJjY0NTEyKT09PTU2MzIwKXtzPTY1NTM2KygoYSYxMDIzKTw8MTApfGImMTAyMwpyPW4uYwpxPW4u
+YgpwPW4uYj1xKzEKbz1yLmxlbmd0aAppZihxPj1vKXJldHVybiBILk9IKHIscSkKcltxXT1zPj4+MTh8
+MjQwCnE9bi5iPXArMQppZihwPj1vKXJldHVybiBILk9IKHIscCkKcltwXT1zPj4+MTImNjN8MTI4CnA9
+bi5iPXErMQppZihxPj1vKXJldHVybiBILk9IKHIscSkKcltxXT1zPj4+NiY2M3wxMjgKbi5iPXArMQpp
+ZihwPj1vKXJldHVybiBILk9IKHIscCkKcltwXT1zJjYzfDEyOApyZXR1cm4hMH1lbHNle24uUk8oKQpy
+ZXR1cm4hMX19LApHeChhLGIsYyl7dmFyIHMscixxLHAsbyxuLG0sbD10aGlzCmlmKGIhPT1jJiYoQy54
+Qi5PKGEsYy0xKSY2NDUxMik9PT01NTI5NiktLWMKZm9yKHM9bC5jLHI9cy5sZW5ndGgscT1iO3E8Yzsr
+K3Epe3A9Qy54Qi5XKGEscSkKaWYocDw9MTI3KXtvPWwuYgppZihvPj1yKWJyZWFrCmwuYj1vKzEKc1tv
+XT1wfWVsc2V7bz1wJjY0NTEyCmlmKG89PT01NTI5Nil7aWYobC5iKzQ+cilicmVhawpuPXErMQppZihs
+Lk82KHAsQy54Qi5XKGEsbikpKXE9bn1lbHNlIGlmKG89PT01NjMyMCl7aWYobC5iKzM+cilicmVhawps
+LlJPKCl9ZWxzZSBpZihwPD0yMDQ3KXtvPWwuYgptPW8rMQppZihtPj1yKWJyZWFrCmwuYj1tCmlmKG8+
+PXIpcmV0dXJuIEguT0gocyxvKQpzW29dPXA+Pj42fDE5MgpsLmI9bSsxCnNbbV09cCY2M3wxMjh9ZWxz
+ZXtvPWwuYgppZihvKzI+PXIpYnJlYWsKbT1sLmI9bysxCmlmKG8+PXIpcmV0dXJuIEguT0gocyxvKQpz
+W29dPXA+Pj4xMnwyMjQKbz1sLmI9bSsxCmlmKG0+PXIpcmV0dXJuIEguT0gocyxtKQpzW21dPXA+Pj42
+JjYzfDEyOApsLmI9bysxCmlmKG8+PXIpcmV0dXJuIEguT0gocyxvKQpzW29dPXAmNjN8MTI4fX19cmV0
+dXJuIHF9fQpQLkdZLnByb3RvdHlwZT17CldKKGEpe3ZhciBzLHIKdC5MLmEoYSkKcz10aGlzLmEKcj1Q
+Lmt5KHMsYSwwLG51bGwpCmlmKHIhPW51bGwpcmV0dXJuIHIKcmV0dXJuIG5ldyBQLmJ6KHMpLk5lKGEs
+MCxudWxsLCEwKX19ClAuYnoucHJvdG90eXBlPXsKTmUoYSxiLGMsZCl7dmFyIHMscixxLHAsbyxuPXRo
+aXMKdC5MLmEoYSkKcz1QLmpCKGIsYyxKLkhtKGEpKQppZihiPT09cylyZXR1cm4iIgpyPVAuankoYSxi
+LHMpCnE9bi5oTyhyLDAscy1iLCEwKQpwPW4uYgppZigocCYxKSE9PTApe289UC5qNChwKQpuLmI9MAp0
+aHJvdyBILmIoUC5ycihvLGEsYituLmMpKX1yZXR1cm4gcX0sCmhPKGEsYixjLGQpe3ZhciBzLHIscT10
+aGlzCmlmKGMtYj4xMDAwKXtzPUMuam4uQlUoYitjLDIpCnI9cS5oTyhhLGIscywhMSkKaWYoKHEuYiYx
+KSE9PTApcmV0dXJuIHIKcmV0dXJuIHIrcS5oTyhhLHMsYyxkKX1yZXR1cm4gcS5FaChhLGIsYyxkKX0s
+CkVoKGEsYixjLGQpe3ZhciBzLHIscSxwLG8sbixtLGwsaz10aGlzLGo9NjU1MzMsaT1rLmIsaD1rLmMs
+Zz1uZXcgUC5NKCIiKSxmPWIrMSxlPWEubGVuZ3RoCmlmKGI8MHx8Yj49ZSlyZXR1cm4gSC5PSChhLGIp
+CnM9YVtiXQokbGFiZWwwJDA6Zm9yKHI9ay5hOyEwOyl7Zm9yKDshMDtmPW8pe3E9Qy54Qi5XKCJBQUFB
 QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
-QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFGRkZGRkZGRkZGRkZGRkZG
-R0dHR0dHR0dHR0dHR0dHR0hISEhISEhISEhISEhISEhISEhISEhISEhISElISEhKRUVCQkJCQkJCQkJC
-QkJCQkJCQkJCQkJCQkJCQkJCQkJLQ0NDQ0NDQ0NDQ0NDRENMT05OTk1FRUVFRUVFRUVFRSIscykmMzEK
-aD1pPD0zMj9zJjYxNjk0Pj4+cToocyY2M3xoPDw2KT4+PjAKaT1DLnhCLlcoIiBceDAwMDpYRUNDQ0ND
-TjpsRGIgXHgwMDA6WEVDQ0NDQ052bERiIFx4MDAwOlhFQ0NDQ0NOOmxEYiBBQUFBQVx4MDBceDAwXHgw
-MFx4MDBceDAwQUFBQUEwMDAwMEFBQUFBOjo6OjpBQUFBQUdHMDAwQUFBQUEwMEtLS0FBQUFBRzo6OjpB
-QUFBQTpJSUlJQUFBQUEwMDBceDgwMEFBQUFBXHgwMFx4MDBceDAwXHgwMCBBQUFBQSIsaStxKQppZihp
-PT09MCl7Zy5hKz1ILkx3KGgpCmlmKGY9PT1jKWJyZWFrICRsYWJlbDAkMApicmVha31lbHNlIGlmKChp
-JjEpIT09MCl7aWYocilzd2l0Y2goaSl7Y2FzZSA2OTpjYXNlIDY3OmcuYSs9SC5MdyhqKQpicmVhawpj
-YXNlIDY1OmcuYSs9SC5MdyhqKTstLWYKYnJlYWsKZGVmYXVsdDpwPWcuYSs9SC5MdyhqKQpnLmE9cCtI
-Lkx3KGopCmJyZWFrfWVsc2V7ay5iPWkKay5jPWYtMQpyZXR1cm4iIn1pPTB9aWYoZj09PWMpYnJlYWsg
-JGxhYmVsMCQwCm89ZisxCmlmKGY8MHx8Zj49ZSlyZXR1cm4gSC5PSChhLGYpCnM9YVtmXX1vPWYrMQpp
-ZihmPDB8fGY+PWUpcmV0dXJuIEguT0goYSxmKQpzPWFbZl0KaWYoczwxMjgpe3doaWxlKCEwKXtpZigh
-KG88Yykpe249YwpicmVha31tPW8rMQppZihvPDB8fG8+PWUpcmV0dXJuIEguT0goYSxvKQpzPWFbb10K
-aWYocz49MTI4KXtuPW0tMQpvPW0KYnJlYWt9bz1tfWlmKG4tZjwyMClmb3IobD1mO2w8bjsrK2wpe2lm
-KGw+PWUpcmV0dXJuIEguT0goYSxsKQpnLmErPUguTHcoYVtsXSl9ZWxzZSBnLmErPVAuSE0oYSxmLG4p
-CmlmKG49PT1jKWJyZWFrICRsYWJlbDAkMApmPW99ZWxzZSBmPW99aWYoZCYmaT4zMilpZihyKWcuYSs9
-SC5MdyhqKQplbHNle2suYj03NwprLmM9YwpyZXR1cm4iIn1rLmI9aQprLmM9aAplPWcuYQpyZXR1cm4g
-ZS5jaGFyQ29kZUF0KDApPT0wP2U6ZX19ClAuV0YucHJvdG90eXBlPXsKJDIoYSxiKXt2YXIgcyxyLHEK
-dC5mby5hKGEpCnM9dGhpcy5iCnI9dGhpcy5hCnE9cy5hKz1yLmEKcSs9YS5hCnMuYT1xCnMuYT1xKyI6
-ICIKcy5hKz1QLmhsKGIpCnIuYT0iLCAifSwKJFM6Mjh9ClAuaVAucHJvdG90eXBlPXsKRE4oYSxiKXtp
-ZihiPT1udWxsKXJldHVybiExCnJldHVybiBiIGluc3RhbmNlb2YgUC5pUCYmdGhpcy5hPT09Yi5hJiYh
-MH0sCmdpTyhhKXt2YXIgcz10aGlzLmEKcmV0dXJuKHNeQy5qbi53RyhzLDMwKSkmMTA3Mzc0MTgyM30s
-CncoYSl7dmFyIHM9dGhpcyxyPVAuR3EoSC50SihzKSkscT1QLmgwKEguTlMocykpLHA9UC5oMChILmpB
-KHMpKSxvPVAuaDAoSC5JWChzKSksbj1QLmgwKEguY2gocykpLG09UC5oMChILkpkKHMpKSxsPVAuVngo
-SC5vMShzKSksaz1yKyItIitxKyItIitwKyIgIitvKyI6IituKyI6IittKyIuIitsCnJldHVybiBrfX0K
-UC5YUy5wcm90b3R5cGU9ewpnSUkoKXtyZXR1cm4gSC50cyh0aGlzLiR0aHJvd25Kc0Vycm9yKX19ClAu
-QzYucHJvdG90eXBlPXsKdyhhKXt2YXIgcz10aGlzLmEKaWYocyE9bnVsbClyZXR1cm4iQXNzZXJ0aW9u
-IGZhaWxlZDogIitQLmhsKHMpCnJldHVybiJBc3NlcnRpb24gZmFpbGVkIn19ClAuRXoucHJvdG90eXBl
-PXt9ClAuRi5wcm90b3R5cGU9ewp3KGEpe3JldHVybiJUaHJvdyBvZiBudWxsLiJ9fQpQLkFULnByb3Rv
-dHlwZT17CmdaKCl7cmV0dXJuIkludmFsaWQgYXJndW1lbnQiKyghdGhpcy5hPyIocykiOiIiKX0sCmd1
-KCl7cmV0dXJuIiJ9LAp3KGEpe3ZhciBzLHIscT10aGlzLHA9cS5jLG89cD09bnVsbD8iIjoiICgiK3Ar
-IikiLG49cS5kLG09bj09bnVsbD8iIjoiOiAiK0guRWoobiksbD1xLmdaKCkrbyttCmlmKCFxLmEpcmV0
-dXJuIGwKcz1xLmd1KCkKcj1QLmhsKHEuYikKcmV0dXJuIGwrcysiOiAiK3J9fQpQLmJKLnByb3RvdHlw
-ZT17CmdaKCl7cmV0dXJuIlJhbmdlRXJyb3IifSwKZ3UoKXt2YXIgcyxyPXRoaXMuZSxxPXRoaXMuZgpp
-ZihyPT1udWxsKXM9cSE9bnVsbD8iOiBOb3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIrSC5FaihxKToi
-IgplbHNlIGlmKHE9PW51bGwpcz0iOiBOb3QgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICIrSC5Faihy
-KQplbHNlIGlmKHE+cilzPSI6IE5vdCBpbiBpbmNsdXNpdmUgcmFuZ2UgIitILkVqKHIpKyIuLiIrSC5F
-aihxKQplbHNlIHM9cTxyPyI6IFZhbGlkIHZhbHVlIHJhbmdlIGlzIGVtcHR5IjoiOiBPbmx5IHZhbGlk
-IHZhbHVlIGlzICIrSC5FaihyKQpyZXR1cm4gc319ClAuZVkucHJvdG90eXBlPXsKZ1ooKXtyZXR1cm4i
-UmFuZ2VFcnJvciJ9LApndSgpe2lmKEguSVoodGhpcy5iKTwwKXJldHVybiI6IGluZGV4IG11c3Qgbm90
-IGJlIG5lZ2F0aXZlIgp2YXIgcz10aGlzLmYKaWYocz09PTApcmV0dXJuIjogbm8gaW5kaWNlcyBhcmUg
-dmFsaWQiCnJldHVybiI6IGluZGV4IHNob3VsZCBiZSBsZXNzIHRoYW4gIitzfSwKZ0EoYSl7cmV0dXJu
-IHRoaXMuZn19ClAubXAucHJvdG90eXBlPXsKdyhhKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9dGhpcyxq
-PXt9LGk9bmV3IFAuTSgiIikKai5hPSIiCnM9ay5jCmZvcihyPXMubGVuZ3RoLHE9MCxwPSIiLG89IiI7
-cTxyOysrcSxvPSIsICIpe249c1txXQppLmE9cCtvCnA9aS5hKz1QLmhsKG4pCmouYT0iLCAifWsuZC5L
-KDAsbmV3IFAuV0YoaixpKSkKbT1QLmhsKGsuYSkKbD1pLncoMCkKcj0iTm9TdWNoTWV0aG9kRXJyb3I6
-IG1ldGhvZCBub3QgZm91bmQ6ICciK2suYi5hKyInXG5SZWNlaXZlcjogIittKyJcbkFyZ3VtZW50czog
-WyIrbCsiXSIKcmV0dXJuIHJ9fQpQLnViLnByb3RvdHlwZT17CncoYSl7cmV0dXJuIlVuc3VwcG9ydGVk
-IG9wZXJhdGlvbjogIit0aGlzLmF9fQpQLmRzLnByb3RvdHlwZT17CncoYSl7dmFyIHM9IlVuaW1wbGVt
-ZW50ZWRFcnJvcjogIit0aGlzLmEKcmV0dXJuIHN9fQpQLmxqLnByb3RvdHlwZT17CncoYSl7cmV0dXJu
-IkJhZCBzdGF0ZTogIit0aGlzLmF9fQpQLlVWLnByb3RvdHlwZT17CncoYSl7dmFyIHM9dGhpcy5hCmlm
-KHM9PW51bGwpcmV0dXJuIkNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRpb24uIgpy
-ZXR1cm4iQ29uY3VycmVudCBtb2RpZmljYXRpb24gZHVyaW5nIGl0ZXJhdGlvbjogIitQLmhsKHMpKyIu
-In19ClAuazUucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4iT3V0IG9mIE1lbW9yeSJ9LApnSUkoKXtyZXR1
-cm4gbnVsbH0sCiRpWFM6MX0KUC5LWS5wcm90b3R5cGU9ewp3KGEpe3JldHVybiJTdGFjayBPdmVyZmxv
-dyJ9LApnSUkoKXtyZXR1cm4gbnVsbH0sCiRpWFM6MX0KUC5wLnByb3RvdHlwZT17CncoYSl7dmFyIHM9
-IlJlYWRpbmcgc3RhdGljIHZhcmlhYmxlICciK3RoaXMuYSsiJyBkdXJpbmcgaXRzIGluaXRpYWxpemF0
-aW9uIgpyZXR1cm4gc319ClAuQ0QucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4iRXhjZXB0aW9uOiAiK3Ro
-aXMuYX0sCiRpUno6MX0KUC5hRS5wcm90b3R5cGU9ewp3KGEpe3ZhciBzLHIscSxwLG8sbixtLGwsayxq
-LGksaCxnPXRoaXMuYSxmPSIiIT09Zz8iRm9ybWF0RXhjZXB0aW9uOiAiK2c6IkZvcm1hdEV4Y2VwdGlv
-biIsZT10aGlzLmMsZD10aGlzLmIKaWYodHlwZW9mIGQ9PSJzdHJpbmciKXtpZihlIT1udWxsKXM9ZTww
-fHxlPmQubGVuZ3RoCmVsc2Ugcz0hMQppZihzKWU9bnVsbAppZihlPT1udWxsKXtpZihkLmxlbmd0aD43
-OClkPUMueEIuTmooZCwwLDc1KSsiLi4uIgpyZXR1cm4gZisiXG4iK2R9Zm9yKHI9MSxxPTAscD0hMSxv
-PTA7bzxlOysrbyl7bj1DLnhCLlcoZCxvKQppZihuPT09MTApe2lmKHEhPT1vfHwhcCkrK3IKcT1vKzEK
-cD0hMX1lbHNlIGlmKG49PT0xMyl7KytyCnE9bysxCnA9ITB9fWY9cj4xP2YrKCIgKGF0IGxpbmUgIity
-KyIsIGNoYXJhY3RlciAiKyhlLXErMSkrIilcbiIpOmYrKCIgKGF0IGNoYXJhY3RlciAiKyhlKzEpKyIp
-XG4iKQptPWQubGVuZ3RoCmZvcihvPWU7bzxtOysrbyl7bj1DLnhCLk8oZCxvKQppZihuPT09MTB8fG49
-PT0xMyl7bT1vCmJyZWFrfX1pZihtLXE+NzgpaWYoZS1xPDc1KXtsPXErNzUKaz1xCmo9IiIKaT0iLi4u
-In1lbHNle2lmKG0tZTw3NSl7az1tLTc1Cmw9bQppPSIifWVsc2V7az1lLTM2Cmw9ZSszNgppPSIuLi4i
-fWo9Ii4uLiJ9ZWxzZXtsPW0Kaz1xCmo9IiIKaT0iIn1oPUMueEIuTmooZCxrLGwpCnJldHVybiBmK2or
-aCtpKyJcbiIrQy54Qi5UKCIgIixlLWsrai5sZW5ndGgpKyJeXG4ifWVsc2UgcmV0dXJuIGUhPW51bGw/
-ZisoIiAoYXQgb2Zmc2V0ICIrSC5FaihlKSsiKSIpOmZ9LAokaVJ6OjF9ClAuY1gucHJvdG90eXBlPXsK
-ZHIoYSxiKXtyZXR1cm4gSC5HSih0aGlzLEguTGgodGhpcykuQygiY1guRSIpLGIpfSwKRTIoYSxiLGMp
-e3ZhciBzPUguTGgodGhpcykKcmV0dXJuIEguSzEodGhpcyxzLktxKGMpLkMoIjEoY1guRSkiKS5hKGIp
-LHMuQygiY1guRSIpLGMpfSwKZXYoYSxiKXt2YXIgcz1ILkxoKHRoaXMpCnJldHVybiBuZXcgSC5VNSh0
-aGlzLHMuQygiYTIoY1guRSkiKS5hKGIpLHMuQygiVTU8Y1guRT4iKSl9LAp0dChhLGIpe3JldHVybiBQ
-LlkxKHRoaXMsYixILkxoKHRoaXMpLkMoImNYLkUiKSl9LApicihhKXtyZXR1cm4gdGhpcy50dChhLCEw
-KX0sCmdBKGEpe3ZhciBzLHI9dGhpcy5nbSh0aGlzKQpmb3Iocz0wO3IuRigpOykrK3MKcmV0dXJuIHN9
-LApnbDAoYSl7cmV0dXJuIXRoaXMuZ20odGhpcykuRigpfSwKZ29yKGEpe3JldHVybiF0aGlzLmdsMCh0
-aGlzKX0sCmVSKGEsYil7cmV0dXJuIEguYksodGhpcyxiLEguTGgodGhpcykuQygiY1guRSIpKX0sCmdy
-OChhKXt2YXIgcyxyPXRoaXMuZ20odGhpcykKaWYoIXIuRigpKXRocm93IEguYihILldwKCkpCnM9ci5n
-bCgpCmlmKHIuRigpKXRocm93IEguYihILkFtKCkpCnJldHVybiBzfSwKRShhLGIpe3ZhciBzLHIscQpQ
-LmsxKGIsImluZGV4IikKZm9yKHM9dGhpcy5nbSh0aGlzKSxyPTA7cy5GKCk7KXtxPXMuZ2woKQppZihi
-PT09cilyZXR1cm4gcTsrK3J9dGhyb3cgSC5iKFAuQ2YoYix0aGlzLCJpbmRleCIsbnVsbCxyKSl9LAp3
-KGEpe3JldHVybiBQLkVQKHRoaXMsIigiLCIpIil9fQpQLkFuLnByb3RvdHlwZT17fQpQLk4zLnByb3Rv
-dHlwZT17CncoYSl7cmV0dXJuIk1hcEVudHJ5KCIrSC5Faih0aGlzLmEpKyI6ICIrSC5Faih0aGlzLmIp
-KyIpIn19ClAuYzgucHJvdG90eXBlPXsKZ2lPKGEpe3JldHVybiBQLk1oLnByb3RvdHlwZS5naU8uY2Fs
-bCh0aGlzLHRoaXMpfSwKdyhhKXtyZXR1cm4ibnVsbCJ9fQpQLk1oLnByb3RvdHlwZT17JGlNaDoxLApE
-TihhLGIpe3JldHVybiB0aGlzPT09Yn0sCmdpTyhhKXtyZXR1cm4gSC5lUSh0aGlzKX0sCncoYSl7cmV0
-dXJuIkluc3RhbmNlIG9mICciK0gubGgodGhpcykrIicifSwKZTcoYSxiKXt0Lm8uYShiKQp0aHJvdyBI
-LmIoUC5scih0aGlzLGIuZ1dhKCksYi5nbmQoKSxiLmdWbSgpKSl9LAp0b1N0cmluZygpe3JldHVybiB0
-aGlzLncodGhpcyl9fQpQLlpkLnByb3RvdHlwZT17CncoYSl7cmV0dXJuIiJ9LAokaUd6OjF9ClAuTS5w
-cm90b3R5cGU9ewpnQShhKXtyZXR1cm4gdGhpcy5hLmxlbmd0aH0sCncoYSl7dmFyIHM9dGhpcy5hCnJl
-dHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKJGlCTDoxfQpQLm4xLnByb3RvdHlwZT17CiQyKGEs
-Yil7dmFyIHMscixxLHAKdC5FLmEoYSkKSC5uKGIpCnM9Qy54Qi5PWShiLCI9IikKaWYocz09PS0xKXtp
-ZihiIT09IiIpYS5ZNSgwLFAua3UoYiwwLGIubGVuZ3RoLHRoaXMuYSwhMCksIiIpfWVsc2UgaWYocyE9
-PTApe3I9Qy54Qi5OaihiLDAscykKcT1DLnhCLnluKGIscysxKQpwPXRoaXMuYQphLlk1KDAsUC5rdShy
-LDAsci5sZW5ndGgscCwhMCksUC5rdShxLDAscS5sZW5ndGgscCwhMCkpfXJldHVybiBhfSwKJFM6MjZ9
-ClAuY1MucHJvdG90eXBlPXsKJDIoYSxiKXt0aHJvdyBILmIoUC5ycigiSWxsZWdhbCBJUHY0IGFkZHJl
-c3MsICIrYSx0aGlzLmEsYikpfSwKJFM6MjR9ClAuVkMucHJvdG90eXBlPXsKJDIoYSxiKXt0aHJvdyBI
-LmIoUC5ycigiSWxsZWdhbCBJUHY2IGFkZHJlc3MsICIrYSx0aGlzLmEsYikpfSwKJDEoYSl7cmV0dXJu
-IHRoaXMuJDIoYSxudWxsKX0sCiRTOjE5fQpQLkpULnByb3RvdHlwZT17CiQyKGEsYil7dmFyIHMKaWYo
-Yi1hPjQpdGhpcy5hLiQyKCJhbiBJUHY2IHBhcnQgY2FuIG9ubHkgY29udGFpbiBhIG1heGltdW0gb2Yg
-NCBoZXggZGlnaXRzIixhKQpzPVAuUUEoQy54Qi5Oaih0aGlzLmIsYSxiKSwxNikKaWYoczwwfHxzPjY1
-NTM1KXRoaXMuYS4kMigiZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIGAweDAuLjB4RkZG
-RmAiLGEpCnJldHVybiBzfSwKJFM6MjB9ClAuRG4ucHJvdG90eXBlPXsKZ25EKCl7dmFyIHMscixxLHA9
-dGhpcyxvPXAueAppZihvPT1udWxsKXtvPXAuYQpzPW8ubGVuZ3RoIT09MD8iIitvKyI6IjoiIgpyPXAu
-YwpxPXI9PW51bGwKaWYoIXF8fG89PT0iZmlsZSIpe289cysiLy8iCnM9cC5iCmlmKHMubGVuZ3RoIT09
-MClvPW8rcysiQCIKaWYoIXEpbys9cgpzPXAuZAppZihzIT1udWxsKW89bysiOiIrSC5FaihzKX1lbHNl
-IG89cwpvKz1wLmUKcz1wLmYKaWYocyE9bnVsbClvPW8rIj8iK3MKcz1wLnIKaWYocyE9bnVsbClvPW8r
-IiMiK3MKbz1vLmNoYXJDb2RlQXQoMCk9PTA/bzpvCmlmKHAueD09bnVsbClwLng9bwplbHNlIG89SC52
-KEguaigiX3RleHQiKSl9cmV0dXJuIG99LApnRmooKXt2YXIgcyxyPXRoaXMscT1yLnkKaWYocT09bnVs
-bCl7cz1yLmUKaWYocy5sZW5ndGghPT0wJiZDLnhCLlcocywwKT09PTQ3KXM9Qy54Qi55bihzLDEpCnE9
-cy5sZW5ndGg9PT0wP0MueEQ6UC5BRihuZXcgSC5sSihILlFJKHMuc3BsaXQoIi8iKSx0LnMpLHQuZE8u
-YShQLlBIKCkpLHQuZG8pLHQuTikKaWYoci55PT1udWxsKXIuc0twKHEpCmVsc2UgcT1ILnYoSC5qKCJw
-YXRoU2VnbWVudHMiKSl9cmV0dXJuIHF9LApnaU8oYSl7dmFyIHM9dGhpcyxyPXMuegppZihyPT1udWxs
-KXtyPUMueEIuZ2lPKHMuZ25EKCkpCmlmKHMuej09bnVsbClzLno9cgplbHNlIHI9SC52KEguaigiaGFz
-aENvZGUiKSl9cmV0dXJuIHJ9LApnaFkoKXt2YXIgcz10aGlzLHI9cy5RCmlmKHI9PW51bGwpe3I9cy5m
-CnI9bmV3IFAuR2ooUC5XWChyPT1udWxsPyIiOnIpLHQuZHcpCmlmKHMuUT09bnVsbClzLnNOTShyKQpl
-bHNlIHI9SC52KEguaigicXVlcnlQYXJhbWV0ZXJzIikpfXJldHVybiByfSwKZ2t1KCl7cmV0dXJuIHRo
-aXMuYn0sCmdKZihhKXt2YXIgcz10aGlzLmMKaWYocz09bnVsbClyZXR1cm4iIgppZihDLnhCLm4ocywi
-WyIpKXJldHVybiBDLnhCLk5qKHMsMSxzLmxlbmd0aC0xKQpyZXR1cm4gc30sCmd0cChhKXt2YXIgcz10
-aGlzLmQKcmV0dXJuIHM9PW51bGw/UC53Syh0aGlzLmEpOnN9LApndFAoKXt2YXIgcz10aGlzLmYKcmV0
-dXJuIHM9PW51bGw/IiI6c30sCmdLYSgpe3ZhciBzPXRoaXMucgpyZXR1cm4gcz09bnVsbD8iIjpzfSwK
-aEIoYSl7dmFyIHM9dGhpcy5hCmlmKGEubGVuZ3RoIT09cy5sZW5ndGgpcmV0dXJuITEKcmV0dXJuIFAu
-TlIoYSxzKX0sCm5tKGEsYil7dmFyIHMscixxLHAsbyxuLG0sbCxrLGo9dGhpcwp0LmM5LmEoYikKcz1q
-LmEKcj1zPT09ImZpbGUiCnE9ai5iCnA9ai5kCm89ai5jCmlmKCEobyE9bnVsbCkpbz1xLmxlbmd0aCE9
-PTB8fHAhPW51bGx8fHI/IiI6bnVsbApuPWouZQppZighciltPW8hPW51bGwmJm4ubGVuZ3RoIT09MApl
-bHNlIG09ITAKaWYobSYmIUMueEIubihuLCIvIikpbj0iLyIrbgpsPW4Kaz1QLmxlKG51bGwsMCwwLGIp
-CnJldHVybiBuZXcgUC5EbihzLHEsbyxwLGwsayxqLnIpfSwKSmgoYSxiKXt2YXIgcyxyLHEscCxvLG4K
-Zm9yKHM9MCxyPTA7Qy54Qi5RaShiLCIuLi8iLHIpOyl7cis9MzsrK3N9cT1DLnhCLmNuKGEsIi8iKQp3
-aGlsZSghMCl7aWYoIShxPjAmJnM+MCkpYnJlYWsKcD1DLnhCLlBrKGEsIi8iLHEtMSkKaWYocDwwKWJy
-ZWFrCm89cS1wCm49byE9PTIKaWYoIW58fG89PT0zKWlmKEMueEIuTyhhLHArMSk9PT00NiluPSFufHxD
-LnhCLk8oYSxwKzIpPT09NDYKZWxzZSBuPSExCmVsc2Ugbj0hMQppZihuKWJyZWFrOy0tcwpxPXB9cmV0
-dXJuIEMueEIuaTcoYSxxKzEsbnVsbCxDLnhCLnluKGIsci0zKnMpKX0sClpJKGEpe3JldHVybiB0aGlz
-Lm1TKFAuaEsoYSkpfSwKbVMoYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaT10aGlzLGg9bnVsbApp
-ZihhLmdGaSgpLmxlbmd0aCE9PTApe3M9YS5nRmkoKQppZihhLmdjaigpKXtyPWEuZ2t1KCkKcT1hLmdK
-ZihhKQpwPWEuZ3hBKCk/YS5ndHAoYSk6aH1lbHNle3A9aApxPXAKcj0iIn1vPVAueGUoYS5nSWkoYSkp
-Cm49YS5nUUQoKT9hLmd0UCgpOmh9ZWxzZXtzPWkuYQppZihhLmdjaigpKXtyPWEuZ2t1KCkKcT1hLmdK
-ZihhKQpwPVAud0IoYS5neEEoKT9hLmd0cChhKTpoLHMpCm89UC54ZShhLmdJaShhKSkKbj1hLmdRRCgp
-P2EuZ3RQKCk6aH1lbHNle3I9aS5iCnE9aS5jCnA9aS5kCm89aS5lCmlmKGEuZ0lpKGEpPT09IiIpbj1h
-LmdRRCgpP2EuZ3RQKCk6aS5mCmVsc2V7bT1QLnVqKGksbykKaWYobT4wKXtsPUMueEIuTmoobywwLG0p
-Cm89YS5ndFQoKT9sK1AueGUoYS5nSWkoYSkpOmwrUC54ZShpLkpoKEMueEIueW4obyxsLmxlbmd0aCks
-YS5nSWkoYSkpKX1lbHNlIGlmKGEuZ3RUKCkpbz1QLnhlKGEuZ0lpKGEpKQplbHNlIGlmKG8ubGVuZ3Ro
-PT09MClpZihxPT1udWxsKW89cy5sZW5ndGg9PT0wP2EuZ0lpKGEpOlAueGUoYS5nSWkoYSkpCmVsc2Ug
-bz1QLnhlKCIvIithLmdJaShhKSkKZWxzZXtrPWkuSmgobyxhLmdJaShhKSkKaj1zLmxlbmd0aD09PTAK
-aWYoIWp8fHEhPW51bGx8fEMueEIubihvLCIvIikpbz1QLnhlKGspCmVsc2Ugbz1QLndGKGssIWp8fHEh
-PW51bGwpfW49YS5nUUQoKT9hLmd0UCgpOmh9fX1yZXR1cm4gbmV3IFAuRG4ocyxyLHEscCxvLG4sYS5n
-WjgoKT9hLmdLYSgpOmgpfSwKZ2NqKCl7cmV0dXJuIHRoaXMuYyE9bnVsbH0sCmd4QSgpe3JldHVybiB0
-aGlzLmQhPW51bGx9LApnUUQoKXtyZXR1cm4gdGhpcy5mIT1udWxsfSwKZ1o4KCl7cmV0dXJuIHRoaXMu
-ciE9bnVsbH0sCmd0VCgpe3JldHVybiBDLnhCLm4odGhpcy5lLCIvIil9LAp0NCgpe3ZhciBzLHI9dGhp
-cyxxPXIuYQppZihxIT09IiImJnEhPT0iZmlsZSIpdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0
-IGEgZmlsZSBwYXRoIGZyb20gYSAiK3ErIiBVUkkiKSkKcT1yLmYKaWYoKHE9PW51bGw/IiI6cSkhPT0i
-Iil0aHJvdyBILmIoUC5MNCh1LmkpKQpxPXIucgppZigocT09bnVsbD8iIjpxKSE9PSIiKXRocm93IEgu
-YihQLkw0KHUubCkpCnE9JC53USgpCmlmKHEpcT1QLm1uKHIpCmVsc2V7aWYoci5jIT1udWxsJiZyLmdK
-ZihyKSE9PSIiKUgudihQLkw0KHUuaikpCnM9ci5nRmooKQpQLmtFKHMsITEpCnE9UC5sKEMueEIubihy
-LmUsIi8iKT8iIisiLyI6IiIscywiLyIpCnE9cS5jaGFyQ29kZUF0KDApPT0wP3E6cX1yZXR1cm4gcX0s
-CncoYSl7cmV0dXJuIHRoaXMuZ25EKCl9LApETihhLGIpe3ZhciBzLHIscT10aGlzCmlmKGI9PW51bGwp
-cmV0dXJuITEKaWYocT09PWIpcmV0dXJuITAKaWYodC5kRC5iKGIpKWlmKHEuYT09PWIuZ0ZpKCkpaWYo
-cS5jIT1udWxsPT09Yi5nY2ooKSlpZihxLmI9PT1iLmdrdSgpKWlmKHEuZ0pmKHEpPT09Yi5nSmYoYikp
-aWYocS5ndHAocSk9PT1iLmd0cChiKSlpZihxLmU9PT1iLmdJaShiKSl7cz1xLmYKcj1zPT1udWxsCmlm
-KCFyPT09Yi5nUUQoKSl7aWYocilzPSIiCmlmKHM9PT1iLmd0UCgpKXtzPXEucgpyPXM9PW51bGwKaWYo
-IXI9PT1iLmdaOCgpKXtpZihyKXM9IiIKcz1zPT09Yi5nS2EoKX1lbHNlIHM9ITF9ZWxzZSBzPSExfWVs
-c2Ugcz0hMX1lbHNlIHM9ITEKZWxzZSBzPSExCmVsc2Ugcz0hMQplbHNlIHM9ITEKZWxzZSBzPSExCmVs
-c2Ugcz0hMQplbHNlIHM9ITEKcmV0dXJuIHN9LApzS3AoYSl7dGhpcy55PXQuYmsuYShhKX0sCnNOTShh
-KXt0aGlzLlE9dC5jWi5hKGEpfSwKJGlpRDoxLApnRmkoKXtyZXR1cm4gdGhpcy5hfSwKZ0lpKGEpe3Jl
-dHVybiB0aGlzLmV9fQpQLlJaLnByb3RvdHlwZT17CiQxKGEpe3JldHVybiBQLmVQKEMuWkosSC5uKGEp
-LEMueE0sITEpfSwKJFM6Mn0KUC5NRS5wcm90b3R5cGU9ewokMihhLGIpe3ZhciBzPXRoaXMuYixyPXRo
-aXMuYQpzLmErPXIuYQpyLmE9IiYiCnI9cy5hKz1QLmVQKEMuRjMsYSxDLnhNLCEwKQppZihiIT1udWxs
-JiZiLmxlbmd0aCE9PTApe3MuYT1yKyI9IgpzLmErPVAuZVAoQy5GMyxiLEMueE0sITApfX0sCiRTOjIy
-fQpQLnk1LnByb3RvdHlwZT17CiQyKGEsYil7dmFyIHMscgpILm4oYSkKaWYoYj09bnVsbHx8dHlwZW9m
-IGI9PSJzdHJpbmciKXRoaXMuYS4kMihhLEguayhiKSkKZWxzZSBmb3Iocz1KLklUKHQuUi5hKGIpKSxy
-PXRoaXMuYTtzLkYoKTspci4kMihhLEgubihzLmdsKCkpKX0sCiRTOjExfQpQLlBFLnByb3RvdHlwZT17
-CmdsUigpe3ZhciBzLHIscSxwLG89dGhpcyxuPW51bGwsbT1vLmMKaWYobT09bnVsbCl7bT1vLmIKaWYo
-MD49bS5sZW5ndGgpcmV0dXJuIEguT0gobSwwKQpzPW8uYQptPW1bMF0rMQpyPUMueEIuWFUocywiPyIs
-bSkKcT1zLmxlbmd0aAppZihyPj0wKXtwPVAuUEkocyxyKzEscSxDLlZDLCExKQpxPXJ9ZWxzZSBwPW4K
-bT1vLmM9bmV3IFAucWUoImRhdGEiLCIiLG4sbixQLlBJKHMsbSxxLEMuV2QsITEpLHAsbil9cmV0dXJu
-IG19LAp3KGEpe3ZhciBzLHI9dGhpcy5iCmlmKDA+PXIubGVuZ3RoKXJldHVybiBILk9IKHIsMCkKcz10
-aGlzLmEKcmV0dXJuIHJbMF09PT0tMT8iZGF0YToiK3M6c319ClAueUkucHJvdG90eXBlPXsKJDIoYSxi
-KXt2YXIgcz10aGlzLmEKaWYoYT49cy5sZW5ndGgpcmV0dXJuIEguT0gocyxhKQpzPXNbYV0KQy5OQS5k
-dShzLDAsOTYsYikKcmV0dXJuIHN9LAokUzoyM30KUC5jNi5wcm90b3R5cGU9ewokMyhhLGIsYyl7dmFy
-IHMscixxCmZvcihzPWIubGVuZ3RoLHI9MDtyPHM7KytyKXtxPUMueEIuVyhiLHIpXjk2CmlmKHE+PTk2
-KXJldHVybiBILk9IKGEscSkKYVtxXT1jfX0sCiRTOjE4fQpQLnFkLnByb3RvdHlwZT17CiQzKGEsYixj
-KXt2YXIgcyxyLHEKZm9yKHM9Qy54Qi5XKGIsMCkscj1DLnhCLlcoYiwxKTtzPD1yOysrcyl7cT0oc145
-Nik+Pj4wCmlmKHE+PTk2KXJldHVybiBILk9IKGEscSkKYVtxXT1jfX0sCiRTOjE4fQpQLlVmLnByb3Rv
-dHlwZT17Cmdjaigpe3JldHVybiB0aGlzLmM+MH0sCmd4QSgpe3JldHVybiB0aGlzLmM+MCYmdGhpcy5k
-KzE8dGhpcy5lfSwKZ1FEKCl7cmV0dXJuIHRoaXMuZjx0aGlzLnJ9LApnWjgoKXtyZXR1cm4gdGhpcy5y
-PHRoaXMuYS5sZW5ndGh9LApndFQoKXtyZXR1cm4gQy54Qi5RaSh0aGlzLmEsIi8iLHRoaXMuZSl9LApn
-RmkoKXt2YXIgcz10aGlzLngKcmV0dXJuIHM9PW51bGw/dGhpcy54PXRoaXMuVTIoKTpzfSwKVTIoKXt2
-YXIgcyxyPXRoaXMscT1yLmIKaWYocTw9MClyZXR1cm4iIgpzPXE9PT00CmlmKHMmJkMueEIubihyLmEs
-Imh0dHAiKSlyZXR1cm4iaHR0cCIKaWYocT09PTUmJkMueEIubihyLmEsImh0dHBzIikpcmV0dXJuImh0
-dHBzIgppZihzJiZDLnhCLm4oci5hLCJmaWxlIikpcmV0dXJuImZpbGUiCmlmKHE9PT03JiZDLnhCLm4o
-ci5hLCJwYWNrYWdlIikpcmV0dXJuInBhY2thZ2UiCnJldHVybiBDLnhCLk5qKHIuYSwwLHEpfSwKZ2t1
-KCl7dmFyIHM9dGhpcy5jLHI9dGhpcy5iKzMKcmV0dXJuIHM+cj9DLnhCLk5qKHRoaXMuYSxyLHMtMSk6
-IiJ9LApnSmYoYSl7dmFyIHM9dGhpcy5jCnJldHVybiBzPjA/Qy54Qi5Oaih0aGlzLmEscyx0aGlzLmQp
-OiIifSwKZ3RwKGEpe3ZhciBzLHI9dGhpcwppZihyLmd4QSgpKXJldHVybiBQLlFBKEMueEIuTmooci5h
-LHIuZCsxLHIuZSksbnVsbCkKcz1yLmIKaWYocz09PTQmJkMueEIubihyLmEsImh0dHAiKSlyZXR1cm4g
-ODAKaWYocz09PTUmJkMueEIubihyLmEsImh0dHBzIikpcmV0dXJuIDQ0MwpyZXR1cm4gMH0sCmdJaShh
-KXtyZXR1cm4gQy54Qi5Oaih0aGlzLmEsdGhpcy5lLHRoaXMuZil9LApndFAoKXt2YXIgcz10aGlzLmYs
-cj10aGlzLnIKcmV0dXJuIHM8cj9DLnhCLk5qKHRoaXMuYSxzKzEscik6IiJ9LApnS2EoKXt2YXIgcz10
-aGlzLnIscj10aGlzLmEKcmV0dXJuIHM8ci5sZW5ndGg/Qy54Qi55bihyLHMrMSk6IiJ9LApnRmooKXt2
-YXIgcyxyLHE9dGhpcy5lLHA9dGhpcy5mLG89dGhpcy5hCmlmKEMueEIuUWkobywiLyIscSkpKytxCmlm
-KHE9PT1wKXJldHVybiBDLnhECnM9SC5RSShbXSx0LnMpCmZvcihyPXE7cjxwOysrcilpZihDLnhCLk8o
-byxyKT09PTQ3KXtDLk5tLmkocyxDLnhCLk5qKG8scSxyKSkKcT1yKzF9Qy5ObS5pKHMsQy54Qi5Oaihv
-LHEscCkpCnJldHVybiBQLkFGKHMsdC5OKX0sCmdoWSgpe2lmKHRoaXMuZj49dGhpcy5yKXJldHVybiBD
-LkNNCnJldHVybiBuZXcgUC5HaihQLldYKHRoaXMuZ3RQKCkpLHQuZHcpfSwKa1goYSl7dmFyIHM9dGhp
-cy5kKzEKcmV0dXJuIHMrYS5sZW5ndGg9PT10aGlzLmUmJkMueEIuUWkodGhpcy5hLGEscyl9LApOOSgp
-e3ZhciBzPXRoaXMscj1zLnIscT1zLmEKaWYocj49cS5sZW5ndGgpcmV0dXJuIHMKcmV0dXJuIG5ldyBQ
-LlVmKEMueEIuTmoocSwwLHIpLHMuYixzLmMscy5kLHMuZSxzLmYscixzLngpfSwKbm0oYSxiKXt2YXIg
-cyxyLHEscCxvLG4sbSxsLGssaixpPXRoaXMsaD1udWxsCnQuYzkuYShiKQpzPWkuZ0ZpKCkKcj1zPT09
-ImZpbGUiCnE9aS5jCnA9cT4wP0MueEIuTmooaS5hLGkuYiszLHEpOiIiCm89aS5neEEoKT9pLmd0cChp
-KTpoCnE9aS5jCmlmKHE+MCluPUMueEIuTmooaS5hLHEsaS5kKQplbHNlIG49cC5sZW5ndGghPT0wfHxv
-IT1udWxsfHxyPyIiOmgKcT1pLmEKbT1DLnhCLk5qKHEsaS5lLGkuZikKaWYoIXIpbD1uIT1udWxsJiZt
-Lmxlbmd0aCE9PTAKZWxzZSBsPSEwCmlmKGwmJiFDLnhCLm4obSwiLyIpKW09Ii8iK20Kaz1QLmxlKGgs
-MCwwLGIpCmw9aS5yCmo9bDxxLmxlbmd0aD9DLnhCLnluKHEsbCsxKTpoCnJldHVybiBuZXcgUC5Ebihz
-LHAsbixvLG0sayxqKX0sClpJKGEpe3JldHVybiB0aGlzLm1TKFAuaEsoYSkpfSwKbVMoYSl7aWYoYSBp
-bnN0YW5jZW9mIFAuVWYpcmV0dXJuIHRoaXMudTEodGhpcyxhKQpyZXR1cm4gdGhpcy5SZSgpLm1TKGEp
-fSwKdTEoYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjPWIuYgppZihjPjAp
-cmV0dXJuIGIKcz1iLmMKaWYocz4wKXtyPWEuYgppZihyPD0wKXJldHVybiBiCnE9cj09PTQKaWYocSYm
-Qy54Qi5uKGEuYSwiZmlsZSIpKXA9Yi5lIT09Yi5mCmVsc2UgaWYocSYmQy54Qi5uKGEuYSwiaHR0cCIp
-KXA9IWIua1goIjgwIikKZWxzZSBwPSEocj09PTUmJkMueEIubihhLmEsImh0dHBzIikpfHwhYi5rWCgi
-NDQzIikKaWYocCl7bz1yKzEKcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5hLDAsbykrQy54Qi55bihi
-LmEsYysxKSxyLHMrbyxiLmQrbyxiLmUrbyxiLmYrbyxiLnIrbyxhLngpfWVsc2UgcmV0dXJuIHRoaXMu
-UmUoKS5tUyhiKX1uPWIuZQpjPWIuZgppZihuPT09Yyl7cz1iLnIKaWYoYzxzKXtyPWEuZgpvPXItYwpy
-ZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxyKStDLnhCLnluKGIuYSxjKSxhLmIsYS5jLGEuZCxh
-LmUsYytvLHMrbyxhLngpfWM9Yi5hCmlmKHM8Yy5sZW5ndGgpe3I9YS5yCnJldHVybiBuZXcgUC5VZihD
-LnhCLk5qKGEuYSwwLHIpK0MueEIueW4oYyxzKSxhLmIsYS5jLGEuZCxhLmUsYS5mLHMrKHItcyksYS54
-KX1yZXR1cm4gYS5OOSgpfXM9Yi5hCmlmKEMueEIuUWkocywiLyIsbikpe209YS5lCmw9UC5SeCh0aGlz
-KQprPWw+MD9sOm0Kbz1rLW4KcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5hLDAsaykrQy54Qi55bihz
-LG4pLGEuYixhLmMsYS5kLG0sYytvLGIucitvLGEueCl9aj1hLmUKaT1hLmYKaWYoaj09PWkmJmEuYz4w
-KXtmb3IoO0MueEIuUWkocywiLi4vIixuKTspbis9MwpvPWotbisxCnJldHVybiBuZXcgUC5VZihDLnhC
-Lk5qKGEuYSwwLGopKyIvIitDLnhCLnluKHMsbiksYS5iLGEuYyxhLmQsaixjK28sYi5yK28sYS54KX1o
-PWEuYQpsPVAuUngodGhpcykKaWYobD49MClnPWwKZWxzZSBmb3IoZz1qO0MueEIuUWkoaCwiLi4vIixn
-KTspZys9MwpmPTAKd2hpbGUoITApe2U9biszCmlmKCEoZTw9YyYmQy54Qi5RaShzLCIuLi8iLG4pKSli
-cmVhazsrK2YKbj1lfWZvcihkPSIiO2k+Zzspey0taQppZihDLnhCLk8oaCxpKT09PTQ3KXtpZihmPT09
-MCl7ZD0iLyIKYnJlYWt9LS1mCmQ9Ii8ifX1pZihpPT09ZyYmYS5iPD0wJiYhQy54Qi5RaShoLCIvIixq
-KSl7bi09ZiozCmQ9IiJ9bz1pLW4rZC5sZW5ndGgKcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooaCwwLGkp
-K2QrQy54Qi55bihzLG4pLGEuYixhLmMsYS5kLGosYytvLGIucitvLGEueCl9LAp0NCgpe3ZhciBzLHIs
-cT10aGlzLHA9cS5iCmlmKHA+PTApe3M9IShwPT09NCYmQy54Qi5uKHEuYSwiZmlsZSIpKQpwPXN9ZWxz
-ZSBwPSExCmlmKHApdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20g
-YSAiK3EuZ0ZpKCkrIiBVUkkiKSkKcD1xLmYKcz1xLmEKaWYocDxzLmxlbmd0aCl7aWYocDxxLnIpdGhy
-b3cgSC5iKFAuTDQodS5pKSkKdGhyb3cgSC5iKFAuTDQodS5sKSl9cj0kLndRKCkKaWYocilwPVAubW4o
-cSkKZWxzZXtpZihxLmM8cS5kKUgudihQLkw0KHUuaikpCnA9Qy54Qi5OaihzLHEuZSxwKX1yZXR1cm4g
-cH0sCmdpTyhhKXt2YXIgcz10aGlzLnkKcmV0dXJuIHM9PW51bGw/dGhpcy55PUMueEIuZ2lPKHRoaXMu
-YSk6c30sCkROKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQppZih0aGlzPT09YilyZXR1cm4hMApyZXR1
-cm4gdC5kRC5iKGIpJiZ0aGlzLmE9PT1iLncoMCl9LApSZSgpe3ZhciBzPXRoaXMscj1udWxsLHE9cy5n
-RmkoKSxwPXMuZ2t1KCksbz1zLmM+MD9zLmdKZihzKTpyLG49cy5neEEoKT9zLmd0cChzKTpyLG09cy5h
-LGw9cy5mLGs9Qy54Qi5OaihtLHMuZSxsKSxqPXMucgpsPWw8aj9zLmd0UCgpOnIKcmV0dXJuIG5ldyBQ
-LkRuKHEscCxvLG4sayxsLGo8bS5sZW5ndGg/cy5nS2EoKTpyKX0sCncoYSl7cmV0dXJuIHRoaXMuYX0s
-CiRpaUQ6MX0KUC5xZS5wcm90b3R5cGU9e30KVy5xRS5wcm90b3R5cGU9e30KVy5HaC5wcm90b3R5cGU9
-ewpzTFUoYSxiKXthLmhyZWY9Yn0sCncoYSl7cmV0dXJuIFN0cmluZyhhKX0sCiRpR2g6MX0KVy5mWS5w
-cm90b3R5cGU9ewp3KGEpe3JldHVybiBTdHJpbmcoYSl9fQpXLnJaLnByb3RvdHlwZT17JGlyWjoxfQpX
-LkF6LnByb3RvdHlwZT17JGlBejoxfQpXLlFQLnByb3RvdHlwZT17JGlRUDoxfQpXLm54LnByb3RvdHlw
-ZT17CmdBKGEpe3JldHVybiBhLmxlbmd0aH19Clcub0oucHJvdG90eXBlPXsKZ0EoYSl7cmV0dXJuIGEu
-bGVuZ3RofX0KVy5pZC5wcm90b3R5cGU9e30KVy5RRi5wcm90b3R5cGU9e30KVy5OaC5wcm90b3R5cGU9
-ewp3KGEpe3JldHVybiBTdHJpbmcoYSl9fQpXLmFlLnByb3RvdHlwZT17CkRjKGEsYil7cmV0dXJuIGEu
-Y3JlYXRlSFRNTERvY3VtZW50KGIpfX0KVy5JQi5wcm90b3R5cGU9ewp3KGEpe3ZhciBzLHI9YS5sZWZ0
-CnIudG9TdHJpbmcKcj0iUmVjdGFuZ2xlICgiK0guRWoocikrIiwgIgpzPWEudG9wCnMudG9TdHJpbmcK
-cz1yK0guRWoocykrIikgIgpyPWEud2lkdGgKci50b1N0cmluZwpyPXMrSC5FaihyKSsiIHggIgpzPWEu
-aGVpZ2h0CnMudG9TdHJpbmcKcmV0dXJuIHIrSC5FaihzKX0sCkROKGEsYil7dmFyIHMscgppZihiPT1u
-dWxsKXJldHVybiExCmlmKHQucS5iKGIpKXtzPWEubGVmdApzLnRvU3RyaW5nCnI9Yi5sZWZ0CnIudG9T
-dHJpbmcKaWYocz09PXIpe3M9YS50b3AKcy50b1N0cmluZwpyPWIudG9wCnIudG9TdHJpbmcKaWYocz09
-PXIpe3M9YS53aWR0aApzLnRvU3RyaW5nCnI9Yi53aWR0aApyLnRvU3RyaW5nCmlmKHM9PT1yKXtzPWEu
-aGVpZ2h0CnMudG9TdHJpbmcKcj1iLmhlaWdodApyLnRvU3RyaW5nCnI9cz09PXIKcz1yfWVsc2Ugcz0h
-MX1lbHNlIHM9ITF9ZWxzZSBzPSExfWVsc2Ugcz0hMQpyZXR1cm4gc30sCmdpTyhhKXt2YXIgcyxyLHEs
-cD1hLmxlZnQKcC50b1N0cmluZwpwPUMuQ0QuZ2lPKHApCnM9YS50b3AKcy50b1N0cmluZwpzPUMuQ0Qu
-Z2lPKHMpCnI9YS53aWR0aApyLnRvU3RyaW5nCnI9Qy5DRC5naU8ocikKcT1hLmhlaWdodApxLnRvU3Ry
-aW5nCnJldHVybiBXLnJFKHAscyxyLEMuQ0QuZ2lPKHEpKX0sCiRpdG46MX0KVy5uNy5wcm90b3R5cGU9
-ewpnQShhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLnd6LnByb3RvdHlwZT17CmdBKGEpe3JldHVybiB0aGlz
-LmEubGVuZ3RofSwKcShhLGIpe3ZhciBzCkguSVooYikKcz10aGlzLmEKaWYoYjwwfHxiPj1zLmxlbmd0
-aClyZXR1cm4gSC5PSChzLGIpCnJldHVybiB0aGlzLiR0aS5jLmEoc1tiXSl9LApZNShhLGIsYyl7dGhp
-cy4kdGkuYy5hKGMpCnRocm93IEguYihQLkw0KCJDYW5ub3QgbW9kaWZ5IGxpc3QiKSl9fQpXLmN2LnBy
-b3RvdHlwZT17CmdRZyhhKXtyZXR1cm4gbmV3IFcuaTcoYSl9LApnUChhKXtyZXR1cm4gbmV3IFcuSTQo
-YSl9LApzUChhLGIpe3ZhciBzCnQuTy5hKGIpCnM9dGhpcy5nUChhKQpzLlYxKDApCnMuRlYoMCxiKX0s
-CncoYSl7cmV0dXJuIGEubG9jYWxOYW1lfSwKRkYoYSl7dmFyIHM9ISFhLnNjcm9sbEludG9WaWV3SWZO
-ZWVkZWQKaWYocylhLnNjcm9sbEludG9WaWV3SWZOZWVkZWQoKQplbHNlIGEuc2Nyb2xsSW50b1ZpZXco
-KX0sCm56KGEsYixjLGQsZSl7dmFyIHMscj10aGlzLnI2KGEsYyxkLGUpCnN3aXRjaChiLnRvTG93ZXJD
-YXNlKCkpe2Nhc2UiYmVmb3JlYmVnaW4iOnM9YS5wYXJlbnROb2RlCnMudG9TdHJpbmcKSi5FaChzLHIs
-YSkKYnJlYWsKY2FzZSJhZnRlcmJlZ2luIjpzPWEuY2hpbGROb2Rlcwp0aGlzLm1LKGEscixzLmxlbmd0
-aD4wP3NbMF06bnVsbCkKYnJlYWsKY2FzZSJiZWZvcmVlbmQiOmEuYXBwZW5kQ2hpbGQocikKYnJlYWsK
-Y2FzZSJhZnRlcmVuZCI6cz1hLnBhcmVudE5vZGUKcy50b1N0cmluZwpKLkVoKHMscixhLm5leHRTaWJs
-aW5nKQpicmVhawpkZWZhdWx0OkgudihQLnhZKCJJbnZhbGlkIHBvc2l0aW9uICIrYixudWxsKSl9fSwK
-cjYoYSxiLGMsZCl7dmFyIHMscixxLHAKaWYoYz09bnVsbCl7aWYoZD09bnVsbCl7cz0kLmx0CmlmKHM9
-PW51bGwpe3M9SC5RSShbXSx0LnIpCnI9bmV3IFcudkQocykKQy5ObS5pKHMsVy5UdyhudWxsKSkKQy5O
-bS5pKHMsVy5CbCgpKQokLmx0PXIKZD1yfWVsc2UgZD1zfXM9JC5FVQppZihzPT1udWxsKXtzPW5ldyBX
-LktvKGQpCiQuRVU9cwpjPXN9ZWxzZXtzLmE9ZApjPXN9fWVsc2UgaWYoZCE9bnVsbCl0aHJvdyBILmIo
-UC54WSgidmFsaWRhdG9yIGNhbiBvbmx5IGJlIHBhc3NlZCBpZiB0cmVlU2FuaXRpemVyIGlzIG51bGwi
-LG51bGwpKQppZigkLnhvPT1udWxsKXtzPWRvY3VtZW50CnI9cy5pbXBsZW1lbnRhdGlvbgpyLnRvU3Ry
-aW5nCnI9Qy5tSC5EYyhyLCIiKQokLnhvPXIKJC5CTz1yLmNyZWF0ZVJhbmdlKCkKcj0kLnhvLmNyZWF0
-ZUVsZW1lbnQoImJhc2UiKQp0LmNSLmEocikKcz1zLmJhc2VVUkkKcy50b1N0cmluZwpyLmhyZWY9cwok
-LnhvLmhlYWQuYXBwZW5kQ2hpbGQocil9cz0kLnhvCmlmKHMuYm9keT09bnVsbCl7cj1zLmNyZWF0ZUVs
-ZW1lbnQoImJvZHkiKQpDLkJaLnNHUyhzLHQuay5hKHIpKX1zPSQueG8KaWYodC5rLmIoYSkpe3M9cy5i
-b2R5CnMudG9TdHJpbmcKcT1zfWVsc2V7cy50b1N0cmluZwpxPXMuY3JlYXRlRWxlbWVudChhLnRhZ05h
-bWUpCiQueG8uYm9keS5hcHBlbmRDaGlsZChxKX1pZigiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiBp
-biB3aW5kb3cuUmFuZ2UucHJvdG90eXBlJiYhQy5ObS50ZyhDLlNxLGEudGFnTmFtZSkpeyQuQk8uc2Vs
-ZWN0Tm9kZUNvbnRlbnRzKHEpCnM9JC5CTwpzLnRvU3RyaW5nCnA9cy5jcmVhdGVDb250ZXh0dWFsRnJh
-Z21lbnQoYj09bnVsbD8ibnVsbCI6Yil9ZWxzZXtKLndmKHEsYikKcD0kLnhvLmNyZWF0ZURvY3VtZW50
-RnJhZ21lbnQoKQpmb3IoO3M9cS5maXJzdENoaWxkLHMhPW51bGw7KXAuYXBwZW5kQ2hpbGQocyl9aWYo
-cSE9PSQueG8uYm9keSlKLkx0KHEpCmMuUG4ocCkKZG9jdW1lbnQuYWRvcHROb2RlKHApCnJldHVybiBw
-fSwKQUgoYSxiLGMpe3JldHVybiB0aGlzLnI2KGEsYixjLG51bGwpfSwKc2hmKGEsYil7dGhpcy5ZQyhh
-LGIpfSwKcGsoYSxiLGMpe3RoaXMuc2E0KGEsbnVsbCkKYS5hcHBlbmRDaGlsZCh0aGlzLnI2KGEsYixu
-dWxsLGMpKX0sCllDKGEsYil7cmV0dXJuIHRoaXMucGsoYSxiLG51bGwpfSwKc1JOKGEsYil7YS5pbm5l
-ckhUTUw9Yn0sCmducyhhKXtyZXR1cm4gYS50YWdOYW1lfSwKZ1ZsKGEpe3JldHVybiBuZXcgVy5DcShh
-LCJjbGljayIsITEsdC5RKX0sCiRpY3Y6MX0KVy5Ddi5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdC5o
-LmIodC5BLmEoYSkpfSwKJFM6MjV9ClcuZWEucHJvdG90eXBlPXskaWVhOjF9ClcuRDAucHJvdG90eXBl
-PXsKT24oYSxiLGMsZCl7dC5idy5hKGMpCmlmKGMhPW51bGwpdGhpcy52KGEsYixjLGQpfSwKQihhLGIs
-Yyl7cmV0dXJuIHRoaXMuT24oYSxiLGMsbnVsbCl9LAp2KGEsYixjLGQpe3JldHVybiBhLmFkZEV2ZW50
-TGlzdGVuZXIoYixILnRSKHQuYncuYShjKSwxKSxkKX0sCiRpRDA6MX0KVy5oSC5wcm90b3R5cGU9eyRp
-aEg6MX0KVy5oNC5wcm90b3R5cGU9ewpnQShhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLmJyLnByb3RvdHlw
-ZT17CmdBKGEpe3JldHVybiBhLmxlbmd0aH19ClcuVmIucHJvdG90eXBlPXsKc0dTKGEsYil7YS5ib2R5
-PWJ9fQpXLmZKLnByb3RvdHlwZT17CmVvKGEsYixjLGQpe3JldHVybiBhLm9wZW4oYixjLCEwKX0sCiRp
-Zko6MX0KVy53YS5wcm90b3R5cGU9e30KVy5TZy5wcm90b3R5cGU9eyRpU2c6MX0KVy51OC5wcm90b3R5
-cGU9ewpnRHIoYSl7aWYoIm9yaWdpbiIgaW4gYSlyZXR1cm4gYS5vcmlnaW4KcmV0dXJuIGEucHJvdG9j
-b2wrIi8vIithLmhvc3R9LAp3KGEpe3JldHVybiBTdHJpbmcoYSl9LAokaXU4OjF9ClcuQWoucHJvdG90
-eXBlPXskaUFqOjF9ClcuZTcucHJvdG90eXBlPXsKZ3I4KGEpe3ZhciBzPXRoaXMuYSxyPXMuY2hpbGRO
-b2Rlcy5sZW5ndGgKaWYocj09PTApdGhyb3cgSC5iKFAuUFYoIk5vIGVsZW1lbnRzIikpCmlmKHI+MSl0
-aHJvdyBILmIoUC5QVigiTW9yZSB0aGFuIG9uZSBlbGVtZW50IikpCnM9cy5maXJzdENoaWxkCnMudG9T
-dHJpbmcKcmV0dXJuIHN9LApGVihhLGIpe3ZhciBzLHIscSxwLG8KdC5laC5hKGIpCmlmKGIgaW5zdGFu
-Y2VvZiBXLmU3KXtzPWIuYQpyPXRoaXMuYQppZihzIT09cilmb3IocT1zLmNoaWxkTm9kZXMubGVuZ3Ro
-LHA9MDtwPHE7KytwKXtvPXMuZmlyc3RDaGlsZApvLnRvU3RyaW5nCnIuYXBwZW5kQ2hpbGQobyl9cmV0
-dXJufWZvcihzPWIuZ20oYikscj10aGlzLmE7cy5GKCk7KXIuYXBwZW5kQ2hpbGQocy5nbCgpKX0sClk1
-KGEsYixjKXt2YXIgcyxyCnQuQS5hKGMpCnM9dGhpcy5hCnI9cy5jaGlsZE5vZGVzCmlmKGI8MHx8Yj49
-ci5sZW5ndGgpcmV0dXJuIEguT0gocixiKQpzLnJlcGxhY2VDaGlsZChjLHJbYl0pfSwKZ20oYSl7dmFy
-IHM9dGhpcy5hLmNoaWxkTm9kZXMKcmV0dXJuIG5ldyBXLlc5KHMscy5sZW5ndGgsSC56SyhzKS5DKCJX
-OTxHbS5FPiIpKX0sCmdBKGEpe3JldHVybiB0aGlzLmEuY2hpbGROb2Rlcy5sZW5ndGh9LApxKGEsYil7
-dmFyIHMKSC5JWihiKQpzPXRoaXMuYS5jaGlsZE5vZGVzCmlmKGI8MHx8Yj49cy5sZW5ndGgpcmV0dXJu
-IEguT0gocyxiKQpyZXR1cm4gc1tiXX19ClcuS1YucHJvdG90eXBlPXsKd2coYSl7dmFyIHM9YS5wYXJl
-bnROb2RlCmlmKHMhPW51bGwpcy5yZW1vdmVDaGlsZChhKX0sCkQ0KGEpe3ZhciBzCmZvcig7cz1hLmZp
-cnN0Q2hpbGQscyE9bnVsbDspYS5yZW1vdmVDaGlsZChzKX0sCncoYSl7dmFyIHM9YS5ub2RlVmFsdWUK
-cmV0dXJuIHM9PW51bGw/dGhpcy5VKGEpOnN9LApzYTQoYSxiKXthLnRleHRDb250ZW50PWJ9LAptSyhh
-LGIsYyl7cmV0dXJuIGEuaW5zZXJ0QmVmb3JlKGIsYyl9LAokaUtWOjF9ClcuQkgucHJvdG90eXBlPXsK
-Z0EoYSl7cmV0dXJuIGEubGVuZ3RofSwKcShhLGIpe0guSVooYikKaWYoYj4+PjAhPT1ifHxiPj1hLmxl
-bmd0aCl0aHJvdyBILmIoUC5DZihiLGEsbnVsbCxudWxsLG51bGwpKQpyZXR1cm4gYVtiXX0sClk1KGEs
-YixjKXt0LkEuYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGFzc2lnbiBlbGVtZW50IG9mIGltbXV0
-YWJsZSBMaXN0LiIpKX0sCmd0SChhKXtpZihhLmxlbmd0aD4wKXJldHVybiBhWzBdCnRocm93IEguYihQ
-LlBWKCJObyBlbGVtZW50cyIpKX0sCkUoYSxiKXtpZihiPDB8fGI+PWEubGVuZ3RoKXJldHVybiBILk9I
-KGEsYikKcmV0dXJuIGFbYl19LAokaWJROjEsCiRpWGo6MSwKJGljWDoxLAokaXpNOjF9ClcuU04ucHJv
-dG90eXBlPXt9ClcuZXcucHJvdG90eXBlPXskaWV3OjF9ClcubHAucHJvdG90eXBlPXsKZ0EoYSl7cmV0
-dXJuIGEubGVuZ3RofX0KVy5UYi5wcm90b3R5cGU9ewpyNihhLGIsYyxkKXt2YXIgcyxyCmlmKCJjcmVh
-dGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMu
-RFcoYSxiLGMsZCkKcz1XLlU5KCI8dGFibGU+IitILkVqKGIpKyI8L3RhYmxlPiIsYyxkKQpyPWRvY3Vt
-ZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpuZXcgVy5lNyhyKS5GVigwLG5ldyBXLmU3KHMpKQpy
-ZXR1cm4gcn19ClcuSXYucHJvdG90eXBlPXsKcjYoYSxiLGMsZCl7dmFyIHMscgppZigiY3JlYXRlQ29u
-dGV4dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cuUmFuZ2UucHJvdG90eXBlKXJldHVybiB0aGlzLkRXKGEs
-YixjLGQpCnM9ZG9jdW1lbnQKcj1zLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpzPW5ldyBXLmU3KEMu
-SWUucjYocy5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpLGIsYyxkKSkKcz1uZXcgVy5lNyhzLmdyOChzKSkK
-bmV3IFcuZTcocikuRlYoMCxuZXcgVy5lNyhzLmdyOChzKSkpCnJldHVybiByfX0KVy5XUC5wcm90b3R5
-cGU9ewpyNihhLGIsYyxkKXt2YXIgcyxyCmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdp
-bmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMsZCkKcz1kb2N1bWVudApyPXMu
-Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCnM9bmV3IFcuZTcoQy5JZS5yNihzLmNyZWF0ZUVsZW1lbnQo
-InRhYmxlIiksYixjLGQpKQpuZXcgVy5lNyhyKS5GVigwLG5ldyBXLmU3KHMuZ3I4KHMpKSkKcmV0dXJu
-IHJ9fQpXLnlZLnByb3RvdHlwZT17CnBrKGEsYixjKXt2YXIgcyxyCnRoaXMuc2E0KGEsbnVsbCkKcz1h
-LmNvbnRlbnQKcy50b1N0cmluZwpKLmJUKHMpCnI9dGhpcy5yNihhLGIsbnVsbCxjKQphLmNvbnRlbnQu
-YXBwZW5kQ2hpbGQocil9LApZQyhhLGIpe3JldHVybiB0aGlzLnBrKGEsYixudWxsKX0sCiRpeVk6MX0K
-Vy53Ni5wcm90b3R5cGU9e30KVy5LNS5wcm90b3R5cGU9ewpQbyhhLGIsYyl7dmFyIHM9Vy5QMShhLm9w
-ZW4oYixjKSkKcmV0dXJuIHN9LApnbVcoYSl7cmV0dXJuIHQuRi5hKGEubG9jYXRpb24pfSwKdXMoYSxi
-KXtyZXR1cm4gYS5jb25maXJtKGIpfSwKJGlLNToxLAokaXY2OjF9ClcuQ20ucHJvdG90eXBlPXskaUNt
-OjF9ClcuQ1EucHJvdG90eXBlPXskaUNROjF9ClcudzQucHJvdG90eXBlPXsKdyhhKXt2YXIgcyxyPWEu
-bGVmdApyLnRvU3RyaW5nCnI9IlJlY3RhbmdsZSAoIitILkVqKHIpKyIsICIKcz1hLnRvcApzLnRvU3Ry
-aW5nCnM9citILkVqKHMpKyIpICIKcj1hLndpZHRoCnIudG9TdHJpbmcKcj1zK0guRWoocikrIiB4ICIK
-cz1hLmhlaWdodApzLnRvU3RyaW5nCnJldHVybiByK0guRWoocyl9LApETihhLGIpe3ZhciBzLHIKaWYo
-Yj09bnVsbClyZXR1cm4hMQppZih0LnEuYihiKSl7cz1hLmxlZnQKcy50b1N0cmluZwpyPWIubGVmdApy
-LnRvU3RyaW5nCmlmKHM9PT1yKXtzPWEudG9wCnMudG9TdHJpbmcKcj1iLnRvcApyLnRvU3RyaW5nCmlm
-KHM9PT1yKXtzPWEud2lkdGgKcy50b1N0cmluZwpyPWIud2lkdGgKci50b1N0cmluZwppZihzPT09cil7
-cz1hLmhlaWdodApzLnRvU3RyaW5nCnI9Yi5oZWlnaHQKci50b1N0cmluZwpyPXM9PT1yCnM9cn1lbHNl
-IHM9ITF9ZWxzZSBzPSExfWVsc2Ugcz0hMX1lbHNlIHM9ITEKcmV0dXJuIHN9LApnaU8oYSl7dmFyIHMs
-cixxLHA9YS5sZWZ0CnAudG9TdHJpbmcKcD1DLkNELmdpTyhwKQpzPWEudG9wCnMudG9TdHJpbmcKcz1D
-LkNELmdpTyhzKQpyPWEud2lkdGgKci50b1N0cmluZwpyPUMuQ0QuZ2lPKHIpCnE9YS5oZWlnaHQKcS50
-b1N0cmluZwpyZXR1cm4gVy5yRShwLHMscixDLkNELmdpTyhxKSl9fQpXLnJoLnByb3RvdHlwZT17CmdB
-KGEpe3JldHVybiBhLmxlbmd0aH0sCnEoYSxiKXtILklaKGIpCmlmKGI+Pj4wIT09Ynx8Yj49YS5sZW5n
-dGgpdGhyb3cgSC5iKFAuQ2YoYixhLG51bGwsbnVsbCxudWxsKSkKcmV0dXJuIGFbYl19LApZNShhLGIs
-Yyl7dC5BLmEoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBhc3NpZ24gZWxlbWVudCBvZiBpbW11dGFi
-bGUgTGlzdC4iKSl9LApFKGEsYil7aWYoYjwwfHxiPj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLGIpCnJl
-dHVybiBhW2JdfSwKJGliUToxLAokaVhqOjEsCiRpY1g6MSwKJGl6TToxfQpXLmNmLnByb3RvdHlwZT17
-CksoYSxiKXt2YXIgcyxyLHEscCxvCnQuZUEuYShiKQpmb3Iocz10aGlzLmd2YygpLHI9cy5sZW5ndGgs
-cT10aGlzLmEscD0wO3A8cy5sZW5ndGg7cy5sZW5ndGg9PT1yfHwoMCxILmxrKShzKSwrK3Ape289c1tw
-XQpiLiQyKG8sSC5uKHEuZ2V0QXR0cmlidXRlKG8pKSl9fSwKZ3ZjKCl7dmFyIHMscixxLHAsbyxuLG09
-dGhpcy5hLmF0dHJpYnV0ZXMKbS50b1N0cmluZwpzPUguUUkoW10sdC5zKQpmb3Iocj1tLmxlbmd0aCxx
-PXQuaDkscD0wO3A8cjsrK3Ape2lmKHA+PW0ubGVuZ3RoKXJldHVybiBILk9IKG0scCkKbz1xLmEobVtw
-XSkKaWYoby5uYW1lc3BhY2VVUkk9PW51bGwpe249by5uYW1lCm4udG9TdHJpbmcKQy5ObS5pKHMsbil9
-fXJldHVybiBzfSwKZ2wwKGEpe3JldHVybiB0aGlzLmd2YygpLmxlbmd0aD09PTB9fQpXLmk3LnByb3Rv
-dHlwZT17Cng0KGEpe3ZhciBzPXRoaXMuYS5oYXNBdHRyaWJ1dGUoYSkKcmV0dXJuIHN9LApxKGEsYil7
-cmV0dXJuIHRoaXMuYS5nZXRBdHRyaWJ1dGUoSC5uKGIpKX0sClk1KGEsYixjKXt0aGlzLmEuc2V0QXR0
-cmlidXRlKGIsYyl9LApnQShhKXtyZXR1cm4gdGhpcy5ndmMoKS5sZW5ndGh9fQpXLlN5LnByb3RvdHlw
-ZT17Cng0KGEpe3ZhciBzPXRoaXMuYS5hLmhhc0F0dHJpYnV0ZSgiZGF0YS0iK3RoaXMuT1UoYSkpCnJl
-dHVybiBzfSwKcShhLGIpe3JldHVybiB0aGlzLmEuYS5nZXRBdHRyaWJ1dGUoImRhdGEtIit0aGlzLk9V
-KEgubihiKSkpfSwKWTUoYSxiLGMpe3RoaXMuYS5hLnNldEF0dHJpYnV0ZSgiZGF0YS0iK3RoaXMuT1Uo
-YiksYyl9LApLKGEsYil7dGhpcy5hLksoMCxuZXcgVy5LUyh0aGlzLHQuZUEuYShiKSkpfSwKZ3ZjKCl7
-dmFyIHM9SC5RSShbXSx0LnMpCnRoaXMuYS5LKDAsbmV3IFcuQTModGhpcyxzKSkKcmV0dXJuIHN9LApn
-QShhKXtyZXR1cm4gdGhpcy5ndmMoKS5sZW5ndGh9LApnbDAoYSl7cmV0dXJuIHRoaXMuZ3ZjKCkubGVu
-Z3RoPT09MH0sCnhxKGEpe3ZhciBzLHIscT1ILlFJKGEuc3BsaXQoIi0iKSx0LnMpCmZvcihzPTE7czxx
-Lmxlbmd0aDsrK3Mpe3I9cVtzXQppZihyLmxlbmd0aD4wKUMuTm0uWTUocSxzLHJbMF0udG9VcHBlckNh
-c2UoKStDLnhCLnluKHIsMSkpfXJldHVybiBDLk5tLmsocSwiIil9LApPVShhKXt2YXIgcyxyLHEscCxv
-CmZvcihzPWEubGVuZ3RoLHI9MCxxPSIiO3I8czsrK3Ipe3A9YVtyXQpvPXAudG9Mb3dlckNhc2UoKQpx
-PShwIT09byYmcj4wP3ErIi0iOnEpK299cmV0dXJuIHEuY2hhckNvZGVBdCgwKT09MD9xOnF9fQpXLktT
-LnByb3RvdHlwZT17CiQyKGEsYil7aWYoQy54Qi5uKGEsImRhdGEtIikpdGhpcy5iLiQyKHRoaXMuYS54
-cShDLnhCLnluKGEsNSkpLGIpfSwKJFM6OH0KVy5BMy5wcm90b3R5cGU9ewokMihhLGIpe2lmKEMueEIu
-bihhLCJkYXRhLSIpKUMuTm0uaSh0aGlzLmIsdGhpcy5hLnhxKEMueEIueW4oYSw1KSkpfSwKJFM6OH0K
-Vy5JNC5wcm90b3R5cGU9ewpEKCl7dmFyIHMscixxLHAsbz1QLkxzKHQuTikKZm9yKHM9dGhpcy5hLmNs
-YXNzTmFtZS5zcGxpdCgiICIpLHI9cy5sZW5ndGgscT0wO3E8cjsrK3Epe3A9Si5UMChzW3FdKQppZihw
-Lmxlbmd0aCE9PTApby5pKDAscCl9cmV0dXJuIG99LApYKGEpe3RoaXMuYS5jbGFzc05hbWU9dC5DLmEo
-YSkuaygwLCIgIil9LApnQShhKXtyZXR1cm4gdGhpcy5hLmNsYXNzTGlzdC5sZW5ndGh9LApnbDAoYSl7
-cmV0dXJuIHRoaXMuYS5jbGFzc0xpc3QubGVuZ3RoPT09MH0sCmdvcihhKXtyZXR1cm4gdGhpcy5hLmNs
-YXNzTGlzdC5sZW5ndGghPT0wfSwKVjEoYSl7dGhpcy5hLmNsYXNzTmFtZT0iIn0sCnRnKGEsYil7dmFy
-IHM9dGhpcy5hLmNsYXNzTGlzdC5jb250YWlucyhiKQpyZXR1cm4gc30sCmkoYSxiKXt2YXIgcyxyCkgu
-bihiKQpzPXRoaXMuYS5jbGFzc0xpc3QKcj1zLmNvbnRhaW5zKGIpCnMuYWRkKGIpCnJldHVybiFyfSwK
-UihhLGIpe3ZhciBzLHIscQppZih0eXBlb2YgYj09InN0cmluZyIpe3M9dGhpcy5hLmNsYXNzTGlzdApy
-PXMuY29udGFpbnMoYikKcy5yZW1vdmUoYikKcT1yfWVsc2UgcT0hMQpyZXR1cm4gcX0sCkZWKGEsYil7
-Vy5UTih0aGlzLmEsdC5PLmEoYikpfX0KVy5Gay5wcm90b3R5cGU9e30KVy5STy5wcm90b3R5cGU9e30K
-Vy5DcS5wcm90b3R5cGU9e30KVy54Qy5wcm90b3R5cGU9e30KVy52Ti5wcm90b3R5cGU9ewokMShhKXty
-ZXR1cm4gdGhpcy5hLiQxKHQuQi5hKGEpKX0sCiRTOjI3fQpXLkpRLnByb3RvdHlwZT17CkNZKGEpe3Zh
-ciBzCmlmKCQub3IuZ2wwKCQub3IpKXtmb3Iocz0wO3M8MjYyOysrcykkLm9yLlk1KDAsQy5jbVtzXSxX
-LnBTKCkpCmZvcihzPTA7czwxMjsrK3MpJC5vci5ZNSgwLEMuQklbc10sVy5WNCgpKX19LAppMChhKXty
-ZXR1cm4gJC5BTigpLnRnKDAsVy5yUyhhKSl9LApFYihhLGIsYyl7dmFyIHM9JC5vci5xKDAsVy5yUyhh
-KSsiOjoiK2IpCmlmKHM9PW51bGwpcz0kLm9yLnEoMCwiKjo6IitiKQppZihzPT1udWxsKXJldHVybiEx
-CnJldHVybiBILnA4KHMuJDQoYSxiLGMsdGhpcykpfSwKJGlrRjoxfQpXLkdtLnByb3RvdHlwZT17Cmdt
-KGEpe3JldHVybiBuZXcgVy5XOShhLHRoaXMuZ0EoYSksSC56SyhhKS5DKCJXOTxHbS5FPiIpKX19Clcu
-dkQucHJvdG90eXBlPXsKaTAoYSl7cmV0dXJuIEMuTm0uVnIodGhpcy5hLG5ldyBXLlV2KGEpKX0sCkVi
-KGEsYixjKXtyZXR1cm4gQy5ObS5Wcih0aGlzLmEsbmV3IFcuRWcoYSxiLGMpKX0sCiRpa0Y6MX0KVy5V
-di5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdC5mNi5hKGEpLmkwKHRoaXMuYSl9LAokUzoxNn0KVy5F
-Zy5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdC5mNi5hKGEpLkViKHRoaXMuYSx0aGlzLmIsdGhpcy5j
-KX0sCiRTOjE2fQpXLm02LnByb3RvdHlwZT17CkNZKGEsYixjLGQpe3ZhciBzLHIscQp0aGlzLmEuRlYo
-MCxjKQpzPWIuZXYoMCxuZXcgVy5FbygpKQpyPWIuZXYoMCxuZXcgVy5XaygpKQp0aGlzLmIuRlYoMCxz
-KQpxPXRoaXMuYwpxLkZWKDAsQy54RCkKcS5GVigwLHIpfSwKaTAoYSl7cmV0dXJuIHRoaXMuYS50Zygw
-LFcuclMoYSkpfSwKRWIoYSxiLGMpe3ZhciBzPXRoaXMscj1XLnJTKGEpLHE9cy5jCmlmKHEudGcoMCxy
-KyI6OiIrYikpcmV0dXJuIHMuZC5EdChjKQplbHNlIGlmKHEudGcoMCwiKjo6IitiKSlyZXR1cm4gcy5k
-LkR0KGMpCmVsc2V7cT1zLmIKaWYocS50ZygwLHIrIjo6IitiKSlyZXR1cm4hMAplbHNlIGlmKHEudGco
-MCwiKjo6IitiKSlyZXR1cm4hMAplbHNlIGlmKHEudGcoMCxyKyI6OioiKSlyZXR1cm4hMAplbHNlIGlm
-KHEudGcoMCwiKjo6KiIpKXJldHVybiEwfXJldHVybiExfSwKJGlrRjoxfQpXLkVvLnByb3RvdHlwZT17
-CiQxKGEpe3JldHVybiFDLk5tLnRnKEMuQkksSC5uKGEpKX0sCiRTOjZ9ClcuV2sucHJvdG90eXBlPXsK
-JDEoYSl7cmV0dXJuIEMuTm0udGcoQy5CSSxILm4oYSkpfSwKJFM6Nn0KVy5jdC5wcm90b3R5cGU9ewpF
-YihhLGIsYyl7aWYodGhpcy5qRihhLGIsYykpcmV0dXJuITAKaWYoYj09PSJ0ZW1wbGF0ZSImJmM9PT0i
-IilyZXR1cm4hMAppZihhLmdldEF0dHJpYnV0ZSgidGVtcGxhdGUiKT09PSIiKXJldHVybiB0aGlzLmUu
-dGcoMCxiKQpyZXR1cm4hMX19ClcuSUEucHJvdG90eXBlPXsKJDEoYSl7cmV0dXJuIlRFTVBMQVRFOjoi
-K0gubihhKX0sCiRTOjJ9ClcuT3cucHJvdG90eXBlPXsKaTAoYSl7dmFyIHMKaWYodC5hTy5iKGEpKXJl
-dHVybiExCnM9dC5nNy5iKGEpCmlmKHMmJlcuclMoYSk9PT0iZm9yZWlnbk9iamVjdCIpcmV0dXJuITEK
-aWYocylyZXR1cm4hMApyZXR1cm4hMX0sCkViKGEsYixjKXtpZihiPT09ImlzInx8Qy54Qi5uKGIsIm9u
-IikpcmV0dXJuITEKcmV0dXJuIHRoaXMuaTAoYSl9LAokaWtGOjF9ClcuVzkucHJvdG90eXBlPXsKRigp
-e3ZhciBzPXRoaXMscj1zLmMrMSxxPXMuYgppZihyPHEpe3Muc3AoSi54OShzLmEscikpCnMuYz1yCnJl
-dHVybiEwfXMuc3AobnVsbCkKcy5jPXEKcmV0dXJuITF9LApnbCgpe3JldHVybiB0aGlzLiR0aS5jLmEo
-dGhpcy5kKX0sCnNwKGEpe3RoaXMuZD10aGlzLiR0aS5DKCIxPyIpLmEoYSl9LAokaUFuOjF9ClcuZFcu
-cHJvdG90eXBlPXskaUQwOjEsJGl2NjoxfQpXLm1rLnByb3RvdHlwZT17JGl5MDoxfQpXLktvLnByb3Rv
-dHlwZT17ClBuKGEpe3ZhciBzLHI9bmV3IFcuZm0odGhpcykKZG97cz10aGlzLmIKci4kMihhLG51bGwp
-fXdoaWxlKHMhPT10aGlzLmIpfSwKRVAoYSxiKXsrK3RoaXMuYgppZihiPT1udWxsfHxiIT09YS5wYXJl
-bnROb2RlKUouTHQoYSkKZWxzZSBiLnJlbW92ZUNoaWxkKGEpfSwKSTQoYSxiKXt2YXIgcyxyLHEscCxv
-LG49ITAsbT1udWxsLGw9bnVsbAp0cnl7bT1KLmlnKGEpCmw9bS5hLmdldEF0dHJpYnV0ZSgiaXMiKQp0
-LmguYShhKQpzPWZ1bmN0aW9uKGMpe2lmKCEoYy5hdHRyaWJ1dGVzIGluc3RhbmNlb2YgTmFtZWROb2Rl
-TWFwKSlyZXR1cm4gdHJ1ZQppZihjLmlkPT0ibGFzdENoaWxkInx8Yy5uYW1lPT0ibGFzdENoaWxkInx8
-Yy5pZD09InByZXZpb3VzU2libGluZyJ8fGMubmFtZT09InByZXZpb3VzU2libGluZyJ8fGMuaWQ9PSJj
-aGlsZHJlbiJ8fGMubmFtZT09ImNoaWxkcmVuIilyZXR1cm4gdHJ1ZQp2YXIgaz1jLmNoaWxkTm9kZXMK
-aWYoYy5sYXN0Q2hpbGQmJmMubGFzdENoaWxkIT09a1trLmxlbmd0aC0xXSlyZXR1cm4gdHJ1ZQppZihj
-LmNoaWxkcmVuKWlmKCEoYy5jaGlsZHJlbiBpbnN0YW5jZW9mIEhUTUxDb2xsZWN0aW9ufHxjLmNoaWxk
-cmVuIGluc3RhbmNlb2YgTm9kZUxpc3QpKXJldHVybiB0cnVlCnZhciBqPTAKaWYoYy5jaGlsZHJlbilq
-PWMuY2hpbGRyZW4ubGVuZ3RoCmZvcih2YXIgaT0wO2k8ajtpKyspe3ZhciBoPWMuY2hpbGRyZW5baV0K
-aWYoaC5pZD09ImF0dHJpYnV0ZXMifHxoLm5hbWU9PSJhdHRyaWJ1dGVzInx8aC5pZD09Imxhc3RDaGls
-ZCJ8fGgubmFtZT09Imxhc3RDaGlsZCJ8fGguaWQ9PSJwcmV2aW91c1NpYmxpbmcifHxoLm5hbWU9PSJw
-cmV2aW91c1NpYmxpbmcifHxoLmlkPT0iY2hpbGRyZW4ifHxoLm5hbWU9PSJjaGlsZHJlbiIpcmV0dXJu
-IHRydWV9cmV0dXJuIGZhbHNlfShhKQpuPUgub1Qocyk/ITA6IShhLmF0dHJpYnV0ZXMgaW5zdGFuY2Vv
-ZiBOYW1lZE5vZGVNYXApfWNhdGNoKHApe0guUnUocCl9cj0iZWxlbWVudCB1bnByaW50YWJsZSIKdHJ5
-e3I9Si53KGEpfWNhdGNoKHApe0guUnUocCl9dHJ5e3E9Vy5yUyhhKQp0aGlzLmtSKHQuaC5hKGEpLGIs
-bixyLHEsdC5mLmEobSksSC5rKGwpKX1jYXRjaChwKXtpZihILlJ1KHApIGluc3RhbmNlb2YgUC5BVCl0
-aHJvdyBwCmVsc2V7dGhpcy5FUChhLGIpCndpbmRvdwpvPSJSZW1vdmluZyBjb3JydXB0ZWQgZWxlbWVu
-dCAiK0guRWoocikKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLndh
-cm4obyl9fX0sCmtSKGEsYixjLGQsZSxmLGcpe3ZhciBzLHIscSxwLG8sbixtPXRoaXMKaWYoYyl7bS5F
-UChhLGIpCndpbmRvdwpzPSJSZW1vdmluZyBlbGVtZW50IGR1ZSB0byBjb3JydXB0ZWQgYXR0cmlidXRl
-cyBvbiA8IitkKyI+IgppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUu
-d2FybihzKQpyZXR1cm59aWYoIW0uYS5pMChhKSl7bS5FUChhLGIpCndpbmRvdwpzPSJSZW1vdmluZyBk
-aXNhbGxvd2VkIGVsZW1lbnQgPCIrZSsiPiBmcm9tICIrSC5FaihiKQppZih0eXBlb2YgY29uc29sZSE9
-InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2FybihzKQpyZXR1cm59aWYoZyE9bnVsbClpZighbS5h
-LkViKGEsImlzIixnKSl7bS5FUChhLGIpCndpbmRvdwpzPSJSZW1vdmluZyBkaXNhbGxvd2VkIHR5cGUg
-ZXh0ZW5zaW9uIDwiK2UrJyBpcz0iJytnKyciPicKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQi
-KXdpbmRvdy5jb25zb2xlLndhcm4ocykKcmV0dXJufXM9Zi5ndmMoKQpyPUguUUkocy5zbGljZSgwKSxI
-LnQ2KHMpKQpmb3IocT1mLmd2YygpLmxlbmd0aC0xLHM9Zi5hO3E+PTA7LS1xKXtpZihxPj1yLmxlbmd0
-aClyZXR1cm4gSC5PSChyLHEpCnA9cltxXQpvPW0uYQpuPUouY0gocCkKSC5uKHApCmlmKCFvLkViKGEs
-bixILm4ocy5nZXRBdHRyaWJ1dGUocCkpKSl7d2luZG93Cm89IlJlbW92aW5nIGRpc2FsbG93ZWQgYXR0
-cmlidXRlIDwiK2UrIiAiK3ArJz0iJytILkVqKHMuZ2V0QXR0cmlidXRlKHApKSsnIj4nCmlmKHR5cGVv
-ZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53YXJuKG8pCnMucmVtb3ZlQXR0cmli
-dXRlKHApfX1pZih0LmFXLmIoYSkpe3M9YS5jb250ZW50CnMudG9TdHJpbmcKbS5QbihzKX19LAokaW9u
-OjF9ClcuZm0ucHJvdG90eXBlPXsKJDIoYSxiKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLmEKc3dpdGNo
-KGEubm9kZVR5cGUpe2Nhc2UgMTptLkk0KGEsYikKYnJlYWsKY2FzZSA4OmNhc2UgMTE6Y2FzZSAzOmNh
-c2UgNDpicmVhawpkZWZhdWx0Om0uRVAoYSxiKX1zPWEubGFzdENoaWxkCmZvcihxPXQuQTtzIT1udWxs
-Oyl7cj1udWxsCnRyeXtyPXMucHJldmlvdXNTaWJsaW5nCmlmKHIhPW51bGwpe3A9ci5uZXh0U2libGlu
-ZwpvPXMKbz1wPT1udWxsP28hPW51bGw6cCE9PW8KcD1vfWVsc2UgcD0hMQppZihwKXtwPVAuUFYoIkNv
-cnJ1cHQgSFRNTCIpCnRocm93IEguYihwKX19Y2F0Y2gobil7SC5SdShuKQpwPXEuYShzKTsrK20uYgpv
-PXAucGFyZW50Tm9kZQppZihhIT09byl7aWYobyE9bnVsbClvLnJlbW92ZUNoaWxkKHApfWVsc2UgYS5y
-ZW1vdmVDaGlsZChwKQpzPW51bGwKcj1hLmxhc3RDaGlsZH1pZihzIT1udWxsKXRoaXMuJDIocyxhKQpz
-PXJ9fSwKJFM6MzB9ClcuTGUucHJvdG90eXBlPXt9ClcuSzcucHJvdG90eXBlPXt9ClcuckIucHJvdG90
-eXBlPXt9ClcuWFcucHJvdG90eXBlPXt9Clcub2EucHJvdG90eXBlPXt9ClAuaUoucHJvdG90eXBlPXsK
-VkgoYSl7dmFyIHMscj10aGlzLmEscT1yLmxlbmd0aApmb3Iocz0wO3M8cTsrK3MpaWYocltzXT09PWEp
-cmV0dXJuIHMKQy5ObS5pKHIsYSkKQy5ObS5pKHRoaXMuYixudWxsKQpyZXR1cm4gcX0sClB2KGEpe3Zh
-ciBzLHIscSxwPXRoaXMsbz17fQppZihhPT1udWxsKXJldHVybiBhCmlmKEguclEoYSkpcmV0dXJuIGEK
-aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4g
-YQppZihhIGluc3RhbmNlb2YgUC5pUClyZXR1cm4gbmV3IERhdGUoYS5hKQppZih0LmZ2LmIoYSkpdGhy
-b3cgSC5iKFAuU1koInN0cnVjdHVyZWQgY2xvbmUgb2YgUmVnRXhwIikpCmlmKHQuYzguYihhKSlyZXR1
-cm4gYQppZih0LncuYihhKSlyZXR1cm4gYQppZih0LkkuYihhKSlyZXR1cm4gYQpzPXQuZEUuYihhKXx8
-ITEKaWYocylyZXR1cm4gYQppZih0LmYuYihhKSl7cj1wLlZIKGEpCnM9cC5iCmlmKHI+PXMubGVuZ3Ro
-KXJldHVybiBILk9IKHMscikKcT1vLmE9c1tyXQppZihxIT1udWxsKXJldHVybiBxCnE9e30Kby5hPXEK
-Qy5ObS5ZNShzLHIscSkKYS5LKDAsbmV3IFAuRTIobyxwKSkKcmV0dXJuIG8uYX1pZih0LmouYihhKSl7
-cj1wLlZIKGEpCm89cC5iCmlmKHI+PW8ubGVuZ3RoKXJldHVybiBILk9IKG8scikKcT1vW3JdCmlmKHEh
-PW51bGwpcmV0dXJuIHEKcmV0dXJuIHAuZWsoYSxyKX1pZih0LmVILmIoYSkpe3I9cC5WSChhKQpzPXAu
-YgppZihyPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLHIpCnE9by5iPXNbcl0KaWYocSE9bnVsbClyZXR1
-cm4gcQpxPXt9Cm8uYj1xCkMuTm0uWTUocyxyLHEpCnAuaW0oYSxuZXcgUC5qZyhvLHApKQpyZXR1cm4g
-by5ifXRocm93IEguYihQLlNZKCJzdHJ1Y3R1cmVkIGNsb25lIG9mIG90aGVyIHR5cGUiKSl9LAplayhh
-LGIpe3ZhciBzLHI9Si5VNihhKSxxPXIuZ0EoYSkscD1uZXcgQXJyYXkocSkKQy5ObS5ZNSh0aGlzLmIs
-YixwKQpmb3Iocz0wO3M8cTsrK3MpQy5ObS5ZNShwLHMsdGhpcy5QdihyLnEoYSxzKSkpCnJldHVybiBw
-fX0KUC5FMi5wcm90b3R5cGU9ewokMihhLGIpe3RoaXMuYS5hW2FdPXRoaXMuYi5QdihiKX0sCiRTOjMx
-fQpQLmpnLnByb3RvdHlwZT17CiQyKGEsYil7dGhpcy5hLmJbYV09dGhpcy5iLlB2KGIpfSwKJFM6MzJ9
-ClAuQmYucHJvdG90eXBlPXsKaW0oYSxiKXt2YXIgcyxyLHEscAp0LmI4LmEoYikKZm9yKHM9T2JqZWN0
-LmtleXMoYSkscj1zLmxlbmd0aCxxPTA7cTxyOysrcSl7cD1zW3FdCmIuJDIocCxhW3BdKX19fQpQLkFz
-LnByb3RvdHlwZT17ClYoYSl7dmFyIHMKSC5uKGEpCnM9JC5oRygpLmIKaWYocy50ZXN0KGEpKXJldHVy
-biBhCnRocm93IEguYihQLkwzKGEsInZhbHVlIiwiTm90IGEgdmFsaWQgY2xhc3MgdG9rZW4iKSl9LAp3
-KGEpe3JldHVybiB0aGlzLkQoKS5rKDAsIiAiKX0sCmdtKGEpe3ZhciBzPXRoaXMuRCgpCnJldHVybiBQ
-LnJqKHMscy5yLEguTGgocykuYyl9LApnbDAoYSl7cmV0dXJuIHRoaXMuRCgpLmE9PT0wfSwKZ29yKGEp
-e3JldHVybiB0aGlzLkQoKS5hIT09MH0sCmdBKGEpe3JldHVybiB0aGlzLkQoKS5hfSwKdGcoYSxiKXt0
-aGlzLlYoYikKcmV0dXJuIHRoaXMuRCgpLnRnKDAsYil9LAppKGEsYil7dmFyIHMKSC5uKGIpCnRoaXMu
-VihiKQpzPXRoaXMuT1MobmV3IFAuR0UoYikpCnJldHVybiBILnA4KHM9PW51bGw/ITE6cyl9LApSKGEs
-Yil7dmFyIHMscgppZih0eXBlb2YgYiE9InN0cmluZyIpcmV0dXJuITEKdGhpcy5WKGIpCnM9dGhpcy5E
-KCkKcj1zLlIoMCxiKQp0aGlzLlgocykKcmV0dXJuIHJ9LApGVihhLGIpe3RoaXMuT1MobmV3IFAuTjco
-dGhpcyx0Lk8uYShiKSkpfSwKZVIoYSxiKXt2YXIgcz10aGlzLkQoKQpyZXR1cm4gSC5iSyhzLGIsSC5M
-aChzKS5DKCJsZi5FIikpfSwKRShhLGIpe3JldHVybiB0aGlzLkQoKS5FKDAsYil9LApWMShhKXt0aGlz
-Lk9TKG5ldyBQLnVRKCkpfSwKT1MoYSl7dmFyIHMscgp0LmJVLmEoYSkKcz10aGlzLkQoKQpyPWEuJDEo
-cykKdGhpcy5YKHMpCnJldHVybiByfX0KUC5HRS5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdC5DLmEo
-YSkuaSgwLHRoaXMuYSl9LAokUzozM30KUC5ONy5wcm90b3R5cGU9ewokMShhKXt2YXIgcz10aGlzLmIs
-cj1ILnQ2KHMpCnJldHVybiB0LkMuYShhKS5GVigwLG5ldyBILmxKKHMsci5DKCJxVSgxKSIpLmEodGhp
-cy5hLmd1TSgpKSxyLkMoImxKPDEscVU+IikpKX0sCiRTOjEyfQpQLnVRLnByb3RvdHlwZT17CiQxKGEp
-e3QuQy5hKGEpCmlmKGEuYT4wKXthLmI9YS5jPWEuZD1hLmU9YS5mPW51bGwKYS5hPTAKYS5TKCl9cmV0
-dXJuIG51bGx9LAokUzoxMn0KUC5oRi5wcm90b3R5cGU9eyRpaEY6MX0KUC5EVi5wcm90b3R5cGU9ewok
-MShhKXt2YXIgcwp0LlkuYShhKQpzPWZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1
-cm4gYihjLGQsdGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSl9fShQLlI0
-LGEsITEpClAuRG0ocywkLnooKSxhKQpyZXR1cm4gc30sCiRTOjR9ClAuUEMucHJvdG90eXBlPXsKJDEo
-YSl7cmV0dXJuIG5ldyB0aGlzLmEoYSl9LAokUzo0fQpQLlFTLnByb3RvdHlwZT17CiQxKGEpe3JldHVy
-biBuZXcgUC5yNyh0LksuYShhKSl9LAokUzo0NH0KUC5ucC5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4g
-bmV3IFAuVHoodC5LLmEoYSksdC5hbSl9LAokUzozNn0KUC5VdC5wcm90b3R5cGU9ewokMShhKXtyZXR1
-cm4gbmV3IFAuRTQodC5LLmEoYSkpfSwKJFM6Mzd9ClAuRTQucHJvdG90eXBlPXsKcShhLGIpe2lmKHR5
-cGVvZiBiIT0ic3RyaW5nIiYmdHlwZW9mIGIhPSJudW1iZXIiKXRocm93IEguYihQLnhZKCJwcm9wZXJ0
-eSBpcyBub3QgYSBTdHJpbmcgb3IgbnVtIixudWxsKSkKcmV0dXJuIFAuZFUodGhpcy5hW2JdKX0sClk1
-KGEsYixjKXtpZih0eXBlb2YgYiE9InN0cmluZyImJnR5cGVvZiBiIT0ibnVtYmVyIil0aHJvdyBILmIo
-UC54WSgicHJvcGVydHkgaXMgbm90IGEgU3RyaW5nIG9yIG51bSIsbnVsbCkpCnRoaXMuYVtiXT1QLndZ
-KGMpfSwKRE4oYSxiKXtpZihiPT1udWxsKXJldHVybiExCnJldHVybiBiIGluc3RhbmNlb2YgUC5FNCYm
-dGhpcy5hPT09Yi5hfSwKdyhhKXt2YXIgcyxyCnRyeXtzPVN0cmluZyh0aGlzLmEpCnJldHVybiBzfWNh
-dGNoKHIpe0guUnUocikKcz10aGlzLnhiKDApCnJldHVybiBzfX0sClY3KGEsYil7dmFyIHMscj10aGlz
-LmEKaWYoYj09bnVsbClzPW51bGwKZWxzZXtzPUgudDYoYikKcz1QLlBXKG5ldyBILmxKKGIscy5DKCJA
-KDEpIikuYShQLmlHKCkpLHMuQygibEo8MSxAPiIpKSwhMCx0LnopfXJldHVybiBQLmRVKHJbYV0uYXBw
-bHkocixzKSl9LApnaU8oYSl7cmV0dXJuIDB9fQpQLnI3LnByb3RvdHlwZT17fQpQLlR6LnByb3RvdHlw
-ZT17CmNQKGEpe3ZhciBzPXRoaXMscj1hPDB8fGE+PXMuZ0EocykKaWYocil0aHJvdyBILmIoUC5URShh
-LDAscy5nQShzKSxudWxsLG51bGwpKX0sCnEoYSxiKXtpZihILm9rKGIpKXRoaXMuY1AoYikKcmV0dXJu
-IHRoaXMuJHRpLmMuYSh0aGlzLlVyKDAsYikpfSwKWTUoYSxiLGMpe3RoaXMuY1AoYikKdGhpcy5iaCgw
-LGIsYyl9LApnQShhKXt2YXIgcz10aGlzLmEubGVuZ3RoCmlmKHR5cGVvZiBzPT09Im51bWJlciImJnM+
-Pj4wPT09cylyZXR1cm4gcwp0aHJvdyBILmIoUC5QVigiQmFkIEpzQXJyYXkgbGVuZ3RoIikpfSwKJGli
-UToxLAokaWNYOjEsCiRpek06MX0KUC52Zy5wcm90b3R5cGU9ewpZNShhLGIsYyl7cmV0dXJuIHRoaXMu
-ZTQoMCxiLGMpfX0KUC5uZC5wcm90b3R5cGU9eyRpbmQ6MX0KUC5LZS5wcm90b3R5cGU9ewpEKCl7dmFy
-IHMscixxLHAsbz10aGlzLmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLG49UC5Mcyh0Lk4pCmlmKG89PW51
-bGwpcmV0dXJuIG4KZm9yKHM9by5zcGxpdCgiICIpLHI9cy5sZW5ndGgscT0wO3E8cjsrK3Epe3A9Si5U
-MChzW3FdKQppZihwLmxlbmd0aCE9PTApbi5pKDAscCl9cmV0dXJuIG59LApYKGEpe3RoaXMuYS5zZXRB
-dHRyaWJ1dGUoImNsYXNzIixhLmsoMCwiICIpKX19ClAuaGkucHJvdG90eXBlPXsKZ1AoYSl7cmV0dXJu
-IG5ldyBQLktlKGEpfSwKc2hmKGEsYil7dGhpcy5ZQyhhLGIpfSwKcjYoYSxiLGMsZCl7dmFyIHMscixx
-LHAsbyxuCmlmKGQ9PW51bGwpe3M9SC5RSShbXSx0LnIpCmQ9bmV3IFcudkQocykKQy5ObS5pKHMsVy5U
-dyhudWxsKSkKQy5ObS5pKHMsVy5CbCgpKQpDLk5tLmkocyxuZXcgVy5PdygpKX1jPW5ldyBXLktvKGQp
-CnI9JzxzdmcgdmVyc2lvbj0iMS4xIj4nK0guRWooYikrIjwvc3ZnPiIKcz1kb2N1bWVudApxPXMuYm9k
-eQpxLnRvU3RyaW5nCnA9Qy5SWS5BSChxLHIsYykKbz1zLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpz
-PW5ldyBXLmU3KHApCm49cy5ncjgocykKZm9yKDtzPW4uZmlyc3RDaGlsZCxzIT1udWxsOylvLmFwcGVu
-ZENoaWxkKHMpCnJldHVybiBvfSwKbnooYSxiLGMsZCxlKXt0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGlu
-dm9rZSBpbnNlcnRBZGphY2VudEh0bWwgb24gU1ZHLiIpKX0sCmdWbChhKXtyZXR1cm4gbmV3IFcuQ3Eo
-YSwiY2xpY2siLCExLHQuUSl9LAokaWhpOjF9ClUuZDIucHJvdG90eXBlPXsKTHQoKXt2YXIgcyxyLHEs
-cCxvPXRoaXMsbj10Lk4sbT10LlgsbD1QLkZsKG4sbSksaz1vLmEKaWYoayE9bnVsbCl7cz1ILlFJKFtd
-LHQuZCkKZm9yKHI9ay5sZW5ndGgscT0wO3E8ay5sZW5ndGg7ay5sZW5ndGg9PT1yfHwoMCxILmxrKShr
-KSwrK3Epe3A9a1txXQpzLnB1c2goUC5FRihbImRlc2NyaXB0aW9uIixwLmEsImhyZWYiLHAuYl0sbixt
-KSl9bC5ZNSgwLCJlZGl0cyIscyl9bC5ZNSgwLCJleHBsYW5hdGlvbiIsby5iKQpsLlk1KDAsImxpbmUi
-LG8uYykKbC5ZNSgwLCJkaXNwbGF5UGF0aCIsby5kKQpsLlk1KDAsInVyaVBhdGgiLG8uZSkKbj1vLmYK
-aWYobiE9bnVsbCl7bT1ILlFJKFtdLHQuZCkKZm9yKGs9bi5sZW5ndGgscT0wO3E8bi5sZW5ndGg7bi5s
-ZW5ndGg9PT1rfHwoMCxILmxrKShuKSwrK3EpbS5wdXNoKG5bcV0uTHQoKSkKbC5ZNSgwLCJ0cmFjZXMi
-LG0pfXJldHVybiBsfX0KVS5TZS5wcm90b3R5cGU9ewpMdCgpe3JldHVybiBQLkVGKFsiZGVzY3JpcHRp
-b24iLHRoaXMuYSwiaHJlZiIsdGhpcy5iXSx0Lk4sdC5YKX19ClUuTWwucHJvdG90eXBlPXsKTHQoKXty
-ZXR1cm4gUC5FRihbImhyZWYiLHRoaXMuYSwibGluZSIsdGhpcy5iLCJwYXRoIix0aGlzLmNdLHQuTix0
-LlgpfX0KVS55RC5wcm90b3R5cGU9ewpMdCgpe3ZhciBzLHIscSxwPUguUUkoW10sdC5kKQpmb3Iocz10
-aGlzLmIscj1zLmxlbmd0aCxxPTA7cTxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsr
-cSlwLnB1c2goc1txXS5MdCgpKQpyZXR1cm4gUC5FRihbImRlc2NyaXB0aW9uIix0aGlzLmEsImVudHJp
-ZXMiLHBdLHQuTix0LlgpfX0KVS53Yi5wcm90b3R5cGU9ewpMdCgpe3ZhciBzLHIscSxwPXRoaXMsbz1Q
-LkZsKHQuTix0LlgpCm8uWTUoMCwiZGVzY3JpcHRpb24iLHAuYSkKcz1wLmIKaWYocyE9bnVsbClvLlk1
-KDAsImZ1bmN0aW9uIixzKQpzPXAuYwppZihzIT1udWxsKW8uWTUoMCwibGluayIscy5MdCgpKQpzPXAu
-ZAppZihzLmxlbmd0aCE9PTApe3I9SC50NihzKQpxPXIuQygibEo8MSxaMDxxVSxNaD8+PiIpCm8uWTUo
-MCwiaGludEFjdGlvbnMiLFAuWTEobmV3IEgubEoocyxyLkMoIlowPHFVLE1oPz4oMSkiKS5hKG5ldyBV
-LmIwKCkpLHEpLCEwLHEuQygiYUwuRSIpKSl9cmV0dXJuIG99fQpVLmFOLnByb3RvdHlwZT17CiQxKGEp
-e3JldHVybiBSLm56KHQuRy5hKGEpKX0sCiRTOjM4fQpVLmIwLnByb3RvdHlwZT17CiQxKGEpe3JldHVy
-biB0LkouYShhKS5MdCgpfSwKJFM6Mzl9CkIuajgucHJvdG90eXBlPXsKTHQoKXtyZXR1cm4gUC5FRihb
-ImxpbmUiLHRoaXMuYSwiZXhwbGFuYXRpb24iLHRoaXMuYiwib2Zmc2V0Iix0aGlzLmNdLHQuTix0Llgp
-fX0KQi5xcC5wcm90b3R5cGU9ewpMdCgpe3ZhciBzLHIscSxwLG8sbixtLGw9dGhpcyxrPXQuTixqPVAu
-Rmwoayx0LngpCmZvcihzPWwuZCxzPXMuZ1B1KHMpLHM9cy5nbShzKSxyPXQuWCxxPXQuZDtzLkYoKTsp
-e3A9cy5nbCgpCm89cC5hCm49SC5RSShbXSxxKQpmb3IocD1KLklUKHAuYik7cC5GKCk7KXttPXAuZ2wo
-KQpuLnB1c2goUC5FRihbImxpbmUiLG0uYSwiZXhwbGFuYXRpb24iLG0uYiwib2Zmc2V0IixtLmNdLGss
-cikpfWouWTUoMCxvLG4pfXJldHVybiBQLkVGKFsicmVnaW9ucyIsbC5hLCJuYXZpZ2F0aW9uQ29udGVu
-dCIsbC5iLCJzb3VyY2VDb2RlIixsLmMsImVkaXRzIixqXSxrLHIpfX0KVC5tUS5wcm90b3R5cGU9e30K
-TC5lLnByb3RvdHlwZT17CiQxKGEpe3ZhciBzLHIscSxwLG8sbixtCnQuQi5hKGEpCnM9dC5GCnI9cy5h
-KHdpbmRvdy5sb2NhdGlvbikucGF0aG5hbWUKcT1MLkc2KHMuYSh3aW5kb3cubG9jYXRpb24pLmhyZWYp
-CnA9TC5hSyhzLmEod2luZG93LmxvY2F0aW9uKS5ocmVmKQpMLkdlKCkKaWYociE9PSIvIil7cz1kb2N1
-bWVudC5xdWVyeVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50CnMudG9TdHJpbmcKcz1yIT09Qy54
-Qi5iUyhzKX1lbHNlIHM9ITEKaWYocyl7ci50b1N0cmluZwpMLkc3KHIscSxwLCEwLG5ldyBMLlZXKHIs
-cSxwKSl9cz1kb2N1bWVudApvPXMucXVlcnlTZWxlY3RvcigiLmFwcGx5LW1pZ3JhdGlvbiIpCm8udG9T
-dHJpbmcKbz1KLnFGKG8pCm49by4kdGkKbT1uLkMoIn4oMSk/IikuYShuZXcgTC5vWigpKQp0LlouYShu
-dWxsKQpXLkpFKG8uYSxvLmIsbSwhMSxuLmMpCm49cy5xdWVyeVNlbGVjdG9yKCIucmVydW4tbWlncmF0
-aW9uIikKbi50b1N0cmluZwpuPUoucUYobikKbT1uLiR0aQpXLkpFKG4uYSxuLmIsbS5DKCJ+KDEpPyIp
-LmEobmV3IEwueTgoKSksITEsbS5jKQptPXMucXVlcnlTZWxlY3RvcigiLnJlcG9ydC1wcm9ibGVtIikK
-bS50b1N0cmluZwptPUoucUYobSkKbj1tLiR0aQpXLkpFKG0uYSxtLmIsbi5DKCJ+KDEpPyIpLmEobmV3
-IEwuSGkoKSksITEsbi5jKQpzPXMucXVlcnlTZWxlY3RvcigiLnBvcHVwLXBhbmUgLmNsb3NlIikKcy50
-b1N0cmluZwpzPUoucUYocykKbj1zLiR0aQpXLkpFKHMuYSxzLmIsbi5DKCJ+KDEpPyIpLmEobmV3IEwu
-QlQoKSksITEsbi5jKQpuPSQuYzAoKQpuLnRvU3RyaW5nCm49Si5xRihuKQpzPW4uJHRpClcuSkUobi5h
-LG4uYixzLkMoIn4oMSk/IikuYShuZXcgTC5QWSgpKSwhMSxzLmMpfSwKJFM6MTd9CkwuVlcucHJvdG90
-eXBlPXsKJDAoKXtMLkZyKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0sCiRTOjB9Ckwub1oucHJvdG90eXBl
-PXsKJDEoYSl7dmFyIHMscixxLHAsbwp0LlYuYShhKQppZihDLm9sLnVzKHdpbmRvdywiVGhpcyB3aWxs
-IGFwcGx5IHRoZSBjaGFuZ2VzIHlvdSd2ZSBwcmV2aWV3ZWQgdG8geW91ciB3b3JraW5nIGRpcmVjdG9y
-eS4gSXQgaXMgcmVjb21tZW5kZWQgeW91IGNvbW1pdCBhbnkgY2hhbmdlcyB5b3UgbWFkZSBiZWZvcmUg
-ZG9pbmcgdGhpcy4iKSl7cz1ILlFJKFtdLHQuZCkKZm9yKHI9JC5JUixxPXIubGVuZ3RoLHA9MDtwPHIu
-bGVuZ3RoO3IubGVuZ3RoPT09cXx8KDAsSC5saykociksKytwKXMucHVzaChyW3BdLkx0KCkpCnM9TC50
-eSgiL2FwcGx5LW1pZ3JhdGlvbiIsUC5FRihbIm5hdmlnYXRpb25UcmVlIixzXSx0Lk4sdC54KSkuVzco
-bmV3IEwuanIoKSx0LlApCm89bmV3IEwucWwoKQp0LmI3LmEobnVsbCkKcj1zLiR0aQpxPSQuWDMKaWYo
-cSE9PUMuTlUpbz1QLlZIKG8scSkKcy54ZihuZXcgUC5GZShuZXcgUC52cyhxLHIpLDIsbnVsbCxvLHIu
-QygiQDwxPiIpLktxKHIuYykuQygiRmU8MSwyPiIpKSl9fSwKJFM6MX0KTC5qci5wcm90b3R5cGU9ewok
-MShhKXt2YXIgcwp0LmZuLmEoYSkKcz1kb2N1bWVudC5ib2R5CnMuY2xhc3NMaXN0LnJlbW92ZSgicHJv
-cG9zZWQiKQpzLmNsYXNzTGlzdC5hZGQoImFwcGxpZWQiKX0sCiRTOjQyfQpMLnFsLnByb3RvdHlwZT17
-CiQyKGEsYil7TC5DMigiQ291bGRuJ3QgYXBwbHkgbWlncmF0aW9uIix0LksuYShhKSxiKX0sCiRTOjQz
-fQpMLnk4LnByb3RvdHlwZT17CiQxKGEpe3JldHVybiB0aGlzLnhuKHQuVi5hKGEpKX0sCnhuKGEpe3Zh
-ciBzPTAscj1QLkZYKHQuSCkscT0xLHAsbz1bXSxuLG0sbCxrLGosaQp2YXIgJGFzeW5jJCQxPVAubHoo
-ZnVuY3Rpb24oYixjKXtpZihiPT09MSl7cD1jCnM9cX13aGlsZSh0cnVlKXN3aXRjaChzKXtjYXNlIDA6
-cT0zCmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgicmVydW5uaW5nIikKcz02CnJldHVybiBQLmpR
-KEwudHkoIi9yZXJ1bi1taWdyYXRpb24iLG51bGwpLCRhc3luYyQkMSkKY2FzZSA2Om49YwprPW4Kay50
-b1N0cmluZwppZihILnA4KEoueDkoaywic3VjY2VzcyIpKSl0LkYuYSh3aW5kb3cubG9jYXRpb24pLnJl
-bG9hZCgpCmVsc2UgTC5LMCh0LmV3LmEoSi54OShuLCJlcnJvcnMiKSkpCm8ucHVzaCg1KQpzPTQKYnJl
-YWsKY2FzZSAzOnE9MgppPXAKbT1ILlJ1KGkpCmw9SC50cyhpKQpMLkMyKCJGYWlsZWQgdG8gcmVydW4g
-bWlncmF0aW9uIixtLGwpCm8ucHVzaCg1KQpzPTQKYnJlYWsKY2FzZSAyOm89WzFdCmNhc2UgNDpxPTEK
-ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJyZXJ1bm5pbmciKQpzPW8ucG9wKCkKYnJlYWsK
-Y2FzZSA1OnJldHVybiBQLnlDKG51bGwscikKY2FzZSAxOnJldHVybiBQLmYzKHAscil9fSkKcmV0dXJu
-IFAuREkoJGFzeW5jJCQxLHIpfSwKJFM6N30KTC5IaS5wcm90b3R5cGU9ewokMShhKXt0LlYuYShhKQpD
-Lm9sLlBvKHdpbmRvdyxQLlhkKCJodHRwcyIsImdpdGh1Yi5jb20iLCJkYXJ0LWxhbmcvc2RrL2lzc3Vl
-cy9uZXciLFAuRUYoWyJ0aXRsZSIsIkN1c3RvbWVyLXJlcG9ydGVkIGlzc3VlIHdpdGggTk5CRCBtaWdy
-YXRpb24gdG9vbCIsImxhYmVscyIsdS5kLCJib2R5IiwiIyMjIyBTdGVwcyB0byByZXByb2R1Y2Vcblxu
-IyMjIyBXaGF0IGRpZCB5b3UgZXhwZWN0IHRvIGhhcHBlbj9cblxuIyMjIyBXaGF0IGFjdHVhbGx5IGhh
-cHBlbmVkP1xuXG5fU2NyZWVuc2hvdHMgYXJlIGFwcHJlY2lhdGVkX1xuXG4qKkRhcnQgU0RLIHZlcnNp
-b24qKjogIitILkVqKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZGstdmVyc2lvbiIpLnRleHRDb250
-ZW50KSsiXG5cblRoYW5rcyBmb3IgZmlsaW5nIVxuIl0sdC5OLHQueikpLmduRCgpLCJyZXBvcnQtcHJv
-YmxlbSIpfSwKJFM6MX0KTC5CVC5wcm90b3R5cGU9ewokMShhKXt2YXIgcwp0LlYuYShhKQpzPWRvY3Vt
-ZW50LnF1ZXJ5U2VsZWN0b3IoIi5wb3B1cC1wYW5lIikuc3R5bGUKcy5kaXNwbGF5PSJub25lIgpyZXR1
-cm4ibm9uZSJ9LAokUzoxfQpMLlBZLnByb3RvdHlwZT17CiQxKGEpe3ZhciBzLHIscSxwLG8KdC5WLmEo
-YSkKcz0kLkQ5KCkuaW5uZXJUZXh0CnI9dC5oLmEoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5hdi1w
-YW5lbCBbZGF0YS1uYW1lKj0iJytXLkxqKHMpKyciXScpLnBhcmVudE5vZGUpCnE9ci5xdWVyeVNlbGVj
-dG9yKCIuc3RhdHVzLWljb24iKQpwPSQuSVIKcC50b1N0cmluZwpvPUwueXcocCxzKQppZihvIGluc3Rh
-bmNlb2YgTC5jRCl7cD1vLngKcC50b1N0cmluZ31lbHNlIHA9ITEKaWYocCl7TC5PdChvKQpMLnhuKHEs
-bykKTC5BUihyLG8pfX0sCiRTOjF9CkwuTC5wcm90b3R5cGU9ewokMShhKXt2YXIgcyxyLHEscAp0LkIu
-YShhKQpzPXQuRgpyPXMuYSh3aW5kb3cubG9jYXRpb24pLnBhdGhuYW1lCnIudG9TdHJpbmcKcT1MLkc2
-KHMuYSh3aW5kb3cubG9jYXRpb24pLmhyZWYpCnA9TC5hSyhzLmEod2luZG93LmxvY2F0aW9uKS5ocmVm
-KQppZihyLmxlbmd0aD4xKUwuRzcocixxLHAsITEsbnVsbCkKZWxzZXtMLkJFKHIsQi53UigpLCEwKQpM
-LkJYKCImbmJzcDsiLG51bGwpfX0sCiRTOjE3fQpMLld4LnByb3RvdHlwZT17CiQxKGEpe3ZhciBzLHIs
-cSxwLG89ImNvbGxhcHNlZCIKdC5WLmEoYSkKcz10aGlzLmEKcj1KLllFKHMpCnE9dGhpcy5iCnA9Si5Z
-RShxKQppZighci5nUChzKS50ZygwLG8pKXtyLmdQKHMpLmkoMCxvKQpwLmdQKHEpLmkoMCxvKX1lbHNl
-e3IuZ1AocykuUigwLG8pCnAuZ1AocSkuUigwLG8pfX0sCiRTOjF9CkwuSG8ucHJvdG90eXBlPXsKJDEo
-YSl7dmFyIHM9Si5xRih0LmguYShhKSkscj1zLiR0aSxxPXIuQygifigxKT8iKS5hKG5ldyBMLmROKHRo
-aXMuYSkpCnQuWi5hKG51bGwpClcuSkUocy5hLHMuYixxLCExLHIuYyl9LAokUzozfQpMLmROLnByb3Rv
-dHlwZT17CiQxKGEpe3JldHVybiBMLnQyKHQuVi5hKGEpLHRoaXMuYSl9LAokUzoxfQpMLklDLnByb3Rv
-dHlwZT17CiQxKGEpe3ZhciBzLHIscQp0LmguYShhKQpzPUoucUYoYSkKcj1zLiR0aQpxPXIuQygifigx
-KT8iKS5hKG5ldyBMLnh6KGEsdGhpcy5hKSkKdC5aLmEobnVsbCkKVy5KRShzLmEscy5iLHEsITEsci5j
-KX0sCiRTOjN9CkwueHoucHJvdG90eXBlPXsKJDEoYSl7dmFyIHMscixxLHAKdC5WLmEoYSkKcz10aGlz
-LmEKcj1zLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KHMpKS5PVSgib2Zmc2V0
-IikpCnIudG9TdHJpbmcKcT1QLlFBKHIsbnVsbCkKcz1zLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBX
-LlN5KG5ldyBXLmk3KHMpKS5PVSgibGluZSIpKQpzLnRvU3RyaW5nCnA9UC5RQShzLG51bGwpCnM9dGhp
-cy5iCnMudG9TdHJpbmcKTC5oWChzLHEscCl9LAokUzoxfQpMLkJOLnByb3RvdHlwZT17CiQxKGEpe3Zh
-ciBzPUoucUYodC5oLmEoYSkpLHI9cy4kdGkKci5DKCJ+KDEpPyIpLmEoTC5pUygpKQp0LlouYShudWxs
-KQpXLkpFKHMuYSxzLmIsTC5pUygpLCExLHIuYyl9LAokUzozfQpMLmZDLnByb3RvdHlwZT17CiQxKGEp
-e3QucC5hKGEpCnRoaXMuYS5hTSgwLHRoaXMuYil9LAokUzo0Nn0KTC5UbS5wcm90b3R5cGU9ewokMShh
-KXtILm4oYSkKcmV0dXJuIGEubGVuZ3RoPjQwP0MueEIuTmooYSwwLDQwKSsiLi4uIjphfSwKJFM6Mn0K
-TC5uVC5wcm90b3R5cGU9ewokMCgpe0wuRnIodGhpcy5hLHRoaXMuYix0aGlzLmMpfSwKJFM6MH0KTC5O
-WS5wcm90b3R5cGU9ewokMCgpe0wuRnIodGhpcy5hLG51bGwsbnVsbCl9LAokUzowfQpMLnVlLnByb3Rv
-dHlwZT17CiQxKGEpe3QuZi5hKGEpCnJldHVybiBILkVqKGEucSgwLCJzZXZlcml0eSIpKSsiIC0gIitI
-LkVqKGEucSgwLCJtZXNzYWdlIikpKyIgYXQgIitILkVqKGEucSgwLCJsb2NhdGlvbiIpKSsiIC0gKCIr
-SC5FaihhLnEoMCwiY29kZSIpKSsiKSJ9LAokUzo0N30KTC5HSC5wcm90b3R5cGU9ewokMShhKXt0Lmgu
-YShhKQokLnpCKCkKdC5lcy5hKCQub3coKS5xKDAsImhsanMiKSkuVjcoImhpZ2hsaWdodEJsb2NrIixb
-YV0pfSwKJFM6M30KTC5FRS5wcm90b3R5cGU9ewokMShhKXt2YXIgcyxyCnQuVi5hKGEpLnByZXZlbnRE
-ZWZhdWx0KCkKcz10aGlzLmEKcj10aGlzLmIKTC5hZih0LkYuYSh3aW5kb3cubG9jYXRpb24pLnBhdGhu
-YW1lLHMsciwhMCxuZXcgTC5RTChzLHIpKQpMLmhYKHRoaXMuYyxzLHIpfSwKJFM6MX0KTC5RTC5wcm90
-b3R5cGU9ewokMCgpe0wuRnIodC5GLmEod2luZG93LmxvY2F0aW9uKS5wYXRobmFtZSx0aGlzLmEsdGhp
-cy5iKX0sCiRTOjB9CkwuVlMucHJvdG90eXBlPXsKJDEoYSl7dmFyIHMscj0ic2VsZWN0ZWQtZmlsZSIK
-dC5oLmEoYSkKcz1KLllFKGEpCmlmKGEuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcu
-aTcoYSkpLk9VKCJuYW1lIikpPT09dGhpcy5hLmEpcy5nUChhKS5pKDAscikKZWxzZSBzLmdQKGEpLlIo
-MCxyKX0sCiRTOjN9CkwuVEQucHJvdG90eXBlPXsKJDEoYSl7dmFyIHMscgp0LlYuYShhKQpzPXRoaXMu
-YQpzd2l0Y2gocy5nTCgpKXtjYXNlIEMuY3c6YnJlYWsKY2FzZSBDLldEOnMubkcoKQpicmVhawpjYXNl
-IEMuWGo6cy5jMigpCmJyZWFrCmNhc2UgQy5kYzpzLmMyKCkKYnJlYWt9cj10aGlzLmIKTC5iTChyLHMp
-CkwueG4odGhpcy5jLHMpCkwuQVIocixzKX0sCiRTOjF9CkwuSWYucHJvdG90eXBlPXsKJDEoYSl7dmFy
-IHMKdC5WLmEoYSkKcz10aGlzLmEKTC5PdChzKQpMLnhuKHRoaXMuYixzKQpMLkFSKHRoaXMuYyxzKX0s
-CiRTOjF9CkwudEIucHJvdG90eXBlPXsKJDEoYSl7cmV0dXJuIEwudDIodC5WLmEoYSksITApfSwKJFM6
-MX0KTC5tMi5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdGhpcy5SSSh0LlYuYShhKSl9LApSSShhKXt2
-YXIgcz0wLHI9UC5GWCh0LkgpLHE9MSxwLG89W10sbj10aGlzLG0sbCxrLGosaSxoLGcsZixlCnZhciAk
-YXN5bmMkJDE9UC5seihmdW5jdGlvbihiLGMpe2lmKGI9PT0xKXtwPWMKcz1xfXdoaWxlKHRydWUpc3dp
-dGNoKHMpe2Nhc2UgMDpxPTMKaT1kb2N1bWVudAptPUMuQ0QuelEoaS5xdWVyeVNlbGVjdG9yKCIuY29u
-dGVudCIpLnNjcm9sbFRvcCkKaD10Lk4Kcz02CnJldHVybiBQLmpRKEwudHkoTC5RNCgiL2FwcGx5LWhp
-bnQiLFAuRmwoaCxoKSksbi5hLkx0KCkpLCRhc3luYyQkMSkKY2FzZSA2Omg9bi5iCmc9aC5hCmcudG9T
-dHJpbmcKbD1MLlVzKGcpCnM9NwpyZXR1cm4gUC5qUShMLkc3KGwsbnVsbCxoLmIsITEsbnVsbCksJGFz
-eW5jJCQxKQpjYXNlIDc6aS5ib2R5LmNsYXNzTGlzdC5hZGQoIm5lZWRzLXJlcnVuIikKaT1pLnF1ZXJ5
-U2VsZWN0b3IoIi5jb250ZW50IikKaS50b1N0cmluZwppLnNjcm9sbFRvcD1DLmpuLnpRKG0pCnE9MQpz
-PTUKYnJlYWsKY2FzZSAzOnE9MgplPXAKaz1ILlJ1KGUpCmo9SC50cyhlKQpMLkMyKCJjb3VsZG4ndCBh
-cHBseSBoaW50IixrLGopCnM9NQpicmVhawpjYXNlIDI6cz0xCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55
-QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyQkMSxy
-KX0sCiRTOjd9CkwuUVcucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4gdGhpcy5hKyI6XG4iK3RoaXMuYn0s
-CiRpUno6MX0KTC5YQS5wcm90b3R5cGU9ewpFYihhLGIsYyl7cmV0dXJuITB9LAppMChhKXtyZXR1cm4h
-MH0sCiRpa0Y6MX0KTC52dC5wcm90b3R5cGU9ewpnTCgpe3ZhciBzLHIscSxwLG8sbixtLGw9dGhpcy5k
-CmlmKGwubGVuZ3RoPT09MClyZXR1cm4gQy5jdwpzPUMuTm0uZ3RIKGwpLmdMKCkKZm9yKHI9bC5sZW5n
-dGgscT0hMCxwPSEwLG89MDtvPGwubGVuZ3RoO2wubGVuZ3RoPT09cnx8KDAsSC5saykobCksKytvKXtu
-PWxbb10uZ0woKQppZihuIT1zKXM9bnVsbAptPW4hPT1DLmN3CmlmKG0mJm4hPT1DLldEKXE9ITEKaWYo
-bSYmbiE9PUMuWGopcD0hMX1pZihzIT1udWxsKXJldHVybiBzCmlmKHEpcmV0dXJuIEMuV0QKaWYocCly
-ZXR1cm4gQy5YagpyZXR1cm4gQy5kY30sCkxWKCl7dmFyIHMscixxLHA9dGhpcy5kCmlmKHAhPW51bGwp
-Zm9yKHM9cC5sZW5ndGgscj0wO3I8czsrK3Ipe3E9cFtyXQppZihxLmI9PT0kKXEuYj10aGlzCmVsc2Ug
-SC52KG5ldyBILmMoIkZpZWxkICdwYXJlbnQnIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuIikp
-fX0sCmMyKCl7dmFyIHMscixxLHAsbwpmb3Iocz10aGlzLmQscj1zLmxlbmd0aCxxPTA7cTxzLmxlbmd0
-aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrcSl7cD1zW3FdCmlmKHAgaW5zdGFuY2VvZiBMLnZ0
-KXAuYzIoKQplbHNle2lmKHAgaW5zdGFuY2VvZiBMLmNEKXtvPXAueApvLnRvU3RyaW5nCm89byYmcC5y
-PT09Qy5Yan1lbHNlIG89ITEKaWYobylwLnI9Qy5XRH19fSwKbkcoKXt2YXIgcyxyLHEscCxvCmZvcihz
-PXRoaXMuZCxyPXMubGVuZ3RoLHE9MDtxPHMubGVuZ3RoO3MubGVuZ3RoPT09cnx8KDAsSC5saykocyks
-KytxKXtwPXNbcV0KaWYocCBpbnN0YW5jZW9mIEwudnQpcC5uRygpCmVsc2V7aWYocCBpbnN0YW5jZW9m
-IEwuY0Qpe289cC54Cm8udG9TdHJpbmcKbz1vJiZwLnI9PT1DLldEfWVsc2Ugbz0hMQppZihvKXAucj1D
-LlhqfX19LApMdCgpe3ZhciBzLHI9UC5GbCh0Lk4sdC5YKQpyLlk1KDAsInR5cGUiLCJkaXJlY3Rvcnki
-KQpyLlk1KDAsIm5hbWUiLHRoaXMuYSkKcz10aGlzLmQKcy50b1N0cmluZwpyLlk1KDAsInN1YnRyZWUi
-LEwuVkQocykpCnM9dGhpcy5jCmlmKHMhPW51bGwpci5ZNSgwLCJwYXRoIixzKQpyZXR1cm4gcn19Ckwu
-Y0QucHJvdG90eXBlPXsKTHQoKXt2YXIgcyxyPXRoaXMscT1QLkZsKHQuTix0LlgpCnEuWTUoMCwidHlw
-ZSIsImZpbGUiKQpxLlk1KDAsIm5hbWUiLHIuYSkKcz1yLmMKaWYocyE9bnVsbClxLlk1KDAsInBhdGgi
-LHMpCnM9ci5kCmlmKHMhPW51bGwpcS5ZNSgwLCJocmVmIixzKQpzPXIuZQppZihzIT1udWxsKXEuWTUo
-MCwiZWRpdENvdW50IixzKQpzPXIuZgppZihzIT1udWxsKXEuWTUoMCwid2FzRXhwbGljaXRseU9wdGVk
-T3V0IixzKQpzPXIucgppZihzIT1udWxsKXEuWTUoMCwibWlncmF0aW9uU3RhdHVzIixzLmEpCnM9ci54
-CmlmKHMhPW51bGwpcS5ZNSgwLCJtaWdyYXRpb25TdGF0dXNDYW5CZUNoYW5nZWQiLHMpCnJldHVybiBx
-fSwKZ0woKXtyZXR1cm4gdGhpcy5yfX0KTC5EOC5wcm90b3R5cGU9e30KTC5POS5wcm90b3R5cGU9ewp3
-KGEpe3JldHVybiB0aGlzLmJ9fQpMLkdiLnByb3RvdHlwZT17CncoYSl7cmV0dXJuIHRoaXMuYn19ClIu
-TEwucHJvdG90eXBlPXsKTHQoKXtyZXR1cm4gUC5FRihbIm5vZGVJZCIsdGhpcy5iLCJraW5kIix0aGlz
-LmEuYV0sdC5OLHQuWCl9fQpSLk1ELnByb3RvdHlwZT17CiQxKGEpe3JldHVybiB0LmdwLmEoYSkuYT09
-PXRoaXMuYS5xKDAsImtpbmQiKX0sCiRTOjQ4fQpSLkg3LnByb3RvdHlwZT17CncoYSl7cmV0dXJuIHRo
-aXMuYn19Ck0ubEkucHJvdG90eXBlPXsKV08oYSxiKXt2YXIgcyxyLHE9dC5kNApNLllGKCJhYnNvbHV0
-ZSIsSC5RSShbYixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0scSkpCnM9dGhpcy5hCnM9cy5Z
-cihiKT4wJiYhcy5oSyhiKQppZihzKXJldHVybiBiCnM9RC5hYigpCnI9SC5RSShbcyxiLG51bGwsbnVs
-bCxudWxsLG51bGwsbnVsbCxudWxsXSxxKQpNLllGKCJqb2luIixyKQpyZXR1cm4gdGhpcy5JUChuZXcg
-SC51NihyLHQuZUopKX0sCnpmKGEpe3ZhciBzLHIscT1YLkNMKGEsdGhpcy5hKQpxLkl4KCkKcz1xLmQK
-cj1zLmxlbmd0aAppZihyPT09MCl7cz1xLmIKcmV0dXJuIHM9PW51bGw/Ii4iOnN9aWYocj09PTEpe3M9
-cS5iCnJldHVybiBzPT1udWxsPyIuIjpzfWlmKDA+PXIpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQpz
-PXEuZQppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnEuSXgoKQpyZXR1cm4g
-cS53KDApfSwKSVAoYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGoKdC5PLmEoYSkKZm9yKHM9YS4kdGks
-cj1zLkMoImEyKGNYLkUpIikuYShuZXcgTS5xNygpKSxxPWEuZ20oYSkscz1uZXcgSC5TTyhxLHIscy5D
-KCJTTzxjWC5FPiIpKSxyPXRoaXMuYSxwPSExLG89ITEsbj0iIjtzLkYoKTspe209cS5nbCgpCmlmKHIu
-aEsobSkmJm8pe2w9WC5DTChtLHIpCms9bi5jaGFyQ29kZUF0KDApPT0wP246bgpuPUMueEIuTmooayww
-LHIuU3AoaywhMCkpCmwuYj1uCmlmKHIuZHMobikpQy5ObS5ZNShsLmUsMCxyLmdtSSgpKQpuPSIiK2wu
-dygwKX1lbHNlIGlmKHIuWXIobSk+MCl7bz0hci5oSyhtKQpuPSIiK219ZWxzZXtqPW0ubGVuZ3RoCmlm
-KGohPT0wKXtpZigwPj1qKXJldHVybiBILk9IKG0sMCkKaj1yLlVkKG1bMF0pfWVsc2Ugaj0hMQppZigh
-ailpZihwKW4rPXIuZ21JKCkKbis9bX1wPXIuZHMobSl9cmV0dXJuIG4uY2hhckNvZGVBdCgwKT09MD9u
-Om59LApvNShhKXt2YXIgcwppZighdGhpcy55MyhhKSlyZXR1cm4gYQpzPVguQ0woYSx0aGlzLmEpCnMu
-clIoKQpyZXR1cm4gcy53KDApfSwKeTMoYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrPXRoaXMuYSxqPWsu
-WXIoYSkKaWYoaiE9PTApe2lmKGs9PT0kLktrKCkpZm9yKHM9MDtzPGo7KytzKWlmKEMueEIuVyhhLHMp
-PT09NDcpcmV0dXJuITAKcj1qCnE9NDd9ZWxzZXtyPTAKcT1udWxsfWZvcihwPW5ldyBILnFqKGEpLmEs
-bz1wLmxlbmd0aCxzPXIsbj1udWxsO3M8bzsrK3Msbj1xLHE9bSl7bT1DLnhCLk8ocCxzKQppZihrLnI0
-KG0pKXtpZihrPT09JC5LaygpJiZtPT09NDcpcmV0dXJuITAKaWYocSE9bnVsbCYmay5yNChxKSlyZXR1
-cm4hMAppZihxPT09NDYpbD1uPT1udWxsfHxuPT09NDZ8fGsucjQobikKZWxzZSBsPSExCmlmKGwpcmV0
-dXJuITB9fWlmKHE9PW51bGwpcmV0dXJuITAKaWYoay5yNChxKSlyZXR1cm4hMAppZihxPT09NDYpaz1u
-PT1udWxsfHxrLnI0KG4pfHxuPT09NDYKZWxzZSBrPSExCmlmKGspcmV0dXJuITAKcmV0dXJuITF9LApI
-UChhLGIpe3ZhciBzLHIscSxwLG8sbixtLGw9dGhpcyxrPSdVbmFibGUgdG8gZmluZCBhIHBhdGggdG8g
-IicKYj1sLldPKDAsYikKcz1sLmEKaWYocy5ZcihiKTw9MCYmcy5ZcihhKT4wKXJldHVybiBsLm81KGEp
-CmlmKHMuWXIoYSk8PTB8fHMuaEsoYSkpYT1sLldPKDAsYSkKaWYocy5ZcihhKTw9MCYmcy5ZcihiKT4w
-KXRocm93IEguYihYLkk3KGsrYSsnIiBmcm9tICInK2IrJyIuJykpCnI9WC5DTChiLHMpCnIuclIoKQpx
-PVguQ0woYSxzKQpxLnJSKCkKcD1yLmQKbz1wLmxlbmd0aAppZihvIT09MCl7aWYoMD49bylyZXR1cm4g
-SC5PSChwLDApCnA9Si5STShwWzBdLCIuIil9ZWxzZSBwPSExCmlmKHApcmV0dXJuIHEudygwKQpwPXIu
-YgpvPXEuYgppZihwIT1vKXA9cD09bnVsbHx8bz09bnVsbHx8IXMuTmMocCxvKQplbHNlIHA9ITEKaWYo
-cClyZXR1cm4gcS53KDApCndoaWxlKCEwKXtwPXIuZApvPXAubGVuZ3RoCmlmKG8hPT0wKXtuPXEuZApt
-PW4ubGVuZ3RoCmlmKG0hPT0wKXtpZigwPj1vKXJldHVybiBILk9IKHAsMCkKcD1wWzBdCmlmKDA+PW0p
-cmV0dXJuIEguT0gobiwwKQpuPXMuTmMocCxuWzBdKQpwPW59ZWxzZSBwPSExfWVsc2UgcD0hMQppZigh
-cClicmVhawpDLk5tLlc0KHIuZCwwKQpDLk5tLlc0KHIuZSwxKQpDLk5tLlc0KHEuZCwwKQpDLk5tLlc0
-KHEuZSwxKX1wPXIuZApvPXAubGVuZ3RoCmlmKG8hPT0wKXtpZigwPj1vKXJldHVybiBILk9IKHAsMCkK
-cD1KLlJNKHBbMF0sIi4uIil9ZWxzZSBwPSExCmlmKHApdGhyb3cgSC5iKFguSTcoaythKyciIGZyb20g
-IicrYisnIi4nKSkKcD10Lk4KQy5ObS5VRyhxLmQsMCxQLk84KHIuZC5sZW5ndGgsIi4uIiwhMSxwKSkK
-Qy5ObS5ZNShxLmUsMCwiIikKQy5ObS5VRyhxLmUsMSxQLk84KHIuZC5sZW5ndGgscy5nbUkoKSwhMSxw
-KSkKcz1xLmQKcD1zLmxlbmd0aAppZihwPT09MClyZXR1cm4iLiIKaWYocD4xJiZKLlJNKEMuTm0uZ3Ja
-KHMpLCIuIikpe3M9cS5kCmlmKDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkKcz1x
-LmUKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQppZigwPj1zLmxlbmd0aCly
-ZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCkMuTm0uaShzLCIiKX1xLmI9IiIKcS5JeCgpCnJldHVybiBx
-LncoMCl9fQpNLnE3LnByb3RvdHlwZT17CiQxKGEpe3JldHVybiBILm4oYSkhPT0iIn0sCiRTOjZ9Ck0u
-Tm8ucHJvdG90eXBlPXsKJDEoYSl7SC5rKGEpCnJldHVybiBhPT1udWxsPyJudWxsIjonIicrYSsnIid9
-LAokUzo0OX0KQi5mdi5wcm90b3R5cGU9ewp4WihhKXt2YXIgcyxyPXRoaXMuWXIoYSkKaWYocj4wKXJl
-dHVybiBDLnhCLk5qKGEsMCxyKQppZih0aGlzLmhLKGEpKXtpZigwPj1hLmxlbmd0aClyZXR1cm4gSC5P
-SChhLDApCnM9YVswXX1lbHNlIHM9bnVsbApyZXR1cm4gc30sCk5jKGEsYil7cmV0dXJuIGE9PT1ifX0K
-WC5XRC5wcm90b3R5cGU9ewpJeCgpe3ZhciBzLHIscT10aGlzCndoaWxlKCEwKXtzPXEuZAppZighKHMu
-bGVuZ3RoIT09MCYmSi5STShDLk5tLmdyWihzKSwiIikpKWJyZWFrCnM9cS5kCmlmKDA+PXMubGVuZ3Ro
-KXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkKcz1xLmUKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0go
-cywtMSkKcy5wb3AoKX1zPXEuZQpyPXMubGVuZ3RoCmlmKHIhPT0wKUMuTm0uWTUocyxyLTEsIiIpfSwK
-clIoKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9SC5RSShbXSx0LnMpCmZvcihzPW0uZCxyPXMubGVu
-Z3RoLHE9MCxwPTA7cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrcCl7bz1zW3Bd
-Cm49Si5pYShvKQppZighKG4uRE4obywiLiIpfHxuLkROKG8sIiIpKSlpZihuLkROKG8sIi4uIikpe249
-bC5sZW5ndGgKaWYobiE9PTApe2lmKDA+PW4pcmV0dXJuIEguT0gobCwtMSkKbC5wb3AoKX1lbHNlICsr
-cX1lbHNlIEMuTm0uaShsLG8pfWlmKG0uYj09bnVsbClDLk5tLlVHKGwsMCxQLk84KHEsIi4uIiwhMSx0
-Lk4pKQppZihsLmxlbmd0aD09PTAmJm0uYj09bnVsbClDLk5tLmkobCwiLiIpCm0uc25KKGwpCnM9bS5h
-Cm0uc1BoKFAuTzgobC5sZW5ndGgrMSxzLmdtSSgpLCEwLHQuTikpCnI9bS5iCmlmKHI9PW51bGx8fGwu
-bGVuZ3RoPT09MHx8IXMuZHMocikpQy5ObS5ZNShtLmUsMCwiIikKcj1tLmIKaWYociE9bnVsbCYmcz09
-PSQuS2soKSl7ci50b1N0cmluZwptLmI9SC55cyhyLCIvIiwiXFwiKX1tLkl4KCl9LAp3KGEpe3ZhciBz
-LHIscT10aGlzLHA9cS5iCnA9cCE9bnVsbD8iIitwOiIiCmZvcihzPTA7czxxLmQubGVuZ3RoOysrcyl7
-cj1xLmUKaWYocz49ci5sZW5ndGgpcmV0dXJuIEguT0gocixzKQpyPXArSC5FaihyW3NdKQpwPXEuZApp
-ZihzPj1wLmxlbmd0aClyZXR1cm4gSC5PSChwLHMpCnA9citILkVqKHBbc10pfXArPUguRWooQy5ObS5n
-cloocS5lKSkKcmV0dXJuIHAuY2hhckNvZGVBdCgwKT09MD9wOnB9LApzbkooYSl7dGhpcy5kPXQuRC5h
-KGEpfSwKc1BoKGEpe3RoaXMuZT10LkQuYShhKX19ClguZHYucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4i
-UGF0aEV4Y2VwdGlvbjogIit0aGlzLmF9LAokaVJ6OjF9Ck8uekwucHJvdG90eXBlPXsKdyhhKXtyZXR1
-cm4gdGhpcy5nb2ModGhpcyl9fQpFLk9GLnByb3RvdHlwZT17ClVkKGEpe3JldHVybiBDLnhCLnRnKGEs
-Ii8iKX0sCnI0KGEpe3JldHVybiBhPT09NDd9LApkcyhhKXt2YXIgcz1hLmxlbmd0aApyZXR1cm4gcyE9
-PTAmJkMueEIuTyhhLHMtMSkhPT00N30sClNwKGEsYil7aWYoYS5sZW5ndGghPT0wJiZDLnhCLlcoYSww
-KT09PTQ3KXJldHVybiAxCnJldHVybiAwfSwKWXIoYSl7cmV0dXJuIHRoaXMuU3AoYSwhMSl9LApoSyhh
-KXtyZXR1cm4hMX0sCmdvYygpe3JldHVybiJwb3NpeCJ9LApnbUkoKXtyZXR1cm4iLyJ9fQpGLnJ1LnBy
-b3RvdHlwZT17ClVkKGEpe3JldHVybiBDLnhCLnRnKGEsIi8iKX0sCnI0KGEpe3JldHVybiBhPT09NDd9
-LApkcyhhKXt2YXIgcz1hLmxlbmd0aAppZihzPT09MClyZXR1cm4hMQppZihDLnhCLk8oYSxzLTEpIT09
-NDcpcmV0dXJuITAKcmV0dXJuIEMueEIuVGMoYSwiOi8vIikmJnRoaXMuWXIoYSk9PT1zfSwKU3AoYSxi
-KXt2YXIgcyxyLHEscCxvPWEubGVuZ3RoCmlmKG89PT0wKXJldHVybiAwCmlmKEMueEIuVyhhLDApPT09
-NDcpcmV0dXJuIDEKZm9yKHM9MDtzPG87KytzKXtyPUMueEIuVyhhLHMpCmlmKHI9PT00NylyZXR1cm4g
-MAppZihyPT09NTgpe2lmKHM9PT0wKXJldHVybiAwCnE9Qy54Qi5YVShhLCIvIixDLnhCLlFpKGEsIi8v
-IixzKzEpP3MrMzpzKQppZihxPD0wKXJldHVybiBvCmlmKCFifHxvPHErMylyZXR1cm4gcQppZighQy54
-Qi5uKGEsImZpbGU6Ly8iKSlyZXR1cm4gcQppZighQi5ZdShhLHErMSkpcmV0dXJuIHEKcD1xKzMKcmV0
-dXJuIG89PT1wP3A6cSs0fX1yZXR1cm4gMH0sCllyKGEpe3JldHVybiB0aGlzLlNwKGEsITEpfSwKaEso
-YSl7cmV0dXJuIGEubGVuZ3RoIT09MCYmQy54Qi5XKGEsMCk9PT00N30sCmdvYygpe3JldHVybiJ1cmwi
-fSwKZ21JKCl7cmV0dXJuIi8ifX0KTC5JVi5wcm90b3R5cGU9ewpVZChhKXtyZXR1cm4gQy54Qi50Zyhh
-LCIvIil9LApyNChhKXtyZXR1cm4gYT09PTQ3fHxhPT09OTJ9LApkcyhhKXt2YXIgcz1hLmxlbmd0aApp
-ZihzPT09MClyZXR1cm4hMQpzPUMueEIuTyhhLHMtMSkKcmV0dXJuIShzPT09NDd8fHM9PT05Mil9LApT
-cChhLGIpe3ZhciBzLHIscT1hLmxlbmd0aAppZihxPT09MClyZXR1cm4gMApzPUMueEIuVyhhLDApCmlm
-KHM9PT00NylyZXR1cm4gMQppZihzPT09OTIpe2lmKHE8Mnx8Qy54Qi5XKGEsMSkhPT05MilyZXR1cm4g
-MQpyPUMueEIuWFUoYSwiXFwiLDIpCmlmKHI+MCl7cj1DLnhCLlhVKGEsIlxcIixyKzEpCmlmKHI+MCly
-ZXR1cm4gcn1yZXR1cm4gcX1pZihxPDMpcmV0dXJuIDAKaWYoIUIuT1MocykpcmV0dXJuIDAKaWYoQy54
-Qi5XKGEsMSkhPT01OClyZXR1cm4gMApxPUMueEIuVyhhLDIpCmlmKCEocT09PTQ3fHxxPT09OTIpKXJl
-dHVybiAwCnJldHVybiAzfSwKWXIoYSl7cmV0dXJuIHRoaXMuU3AoYSwhMSl9LApoSyhhKXtyZXR1cm4g
-dGhpcy5ZcihhKT09PTF9LApPdChhLGIpe3ZhciBzCmlmKGE9PT1iKXJldHVybiEwCmlmKGE9PT00Nyly
-ZXR1cm4gYj09PTkyCmlmKGE9PT05MilyZXR1cm4gYj09PTQ3CmlmKChhXmIpIT09MzIpcmV0dXJuITEK
-cz1hfDMyCnJldHVybiBzPj05NyYmczw9MTIyfSwKTmMoYSxiKXt2YXIgcyxyCmlmKGE9PT1iKXJldHVy
-biEwCnM9YS5sZW5ndGgKaWYocyE9PWIubGVuZ3RoKXJldHVybiExCmZvcihyPTA7cjxzOysrcilpZigh
-dGhpcy5PdChDLnhCLlcoYSxyKSxDLnhCLlcoYixyKSkpcmV0dXJuITEKcmV0dXJuITB9LApnb2MoKXty
-ZXR1cm4id2luZG93cyJ9LApnbUkoKXtyZXR1cm4iXFwifX07KGZ1bmN0aW9uIGFsaWFzZXMoKXt2YXIg
-cz1KLkd2LnByb3RvdHlwZQpzLlU9cy53CnM9Si5NRi5wcm90b3R5cGUKcy50PXMudwpzPVAuY1gucHJv
-dG90eXBlCnMuR0c9cy5ldgpzPVAuTWgucHJvdG90eXBlCnMueGI9cy53CnM9Vy5jdi5wcm90b3R5cGUK
-cy5EVz1zLnI2CnM9Vy5tNi5wcm90b3R5cGUKcy5qRj1zLkViCnM9UC5FNC5wcm90b3R5cGUKcy5Vcj1z
-LnEKcy5lND1zLlk1CnM9UC52Zy5wcm90b3R5cGUKcy5iaD1zLlk1fSkoKTsoZnVuY3Rpb24gaW5zdGFs
-bFRlYXJPZmZzKCl7dmFyIHM9aHVua0hlbHBlcnMuX3N0YXRpY18xLHI9aHVua0hlbHBlcnMuX3N0YXRp
-Y18wLHE9aHVua0hlbHBlcnMuaW5zdGFsbEluc3RhbmNlVGVhck9mZixwPWh1bmtIZWxwZXJzLmluc3Rh
-bGxTdGF0aWNUZWFyT2ZmLG89aHVua0hlbHBlcnMuX2luc3RhbmNlXzF1CnMoUCwiRVgiLCJaViIsNSkK
-cyhQLCJ5dCIsIm9BIiw1KQpzKFAsInFXIiwiQnoiLDUpCnIoUCwiVUkiLCJlTiIsMCkKcShQLlBmLnBy
-b3RvdHlwZSwiZ1lKIiwwLDEsbnVsbCxbIiQyIiwiJDEiXSxbIncwIiwicG0iXSw0MCwwLDApCnMoUCwi
-Q3kiLCJOQyIsNCkKcyhQLCJQSCIsIk10IiwyKQpwKFcsInBTIiw0LG51bGwsWyIkNCJdLFsicUQiXSwx
-NCwwKQpwKFcsIlY0Iiw0LG51bGwsWyIkNCJdLFsibloiXSwxNCwwKQpvKFAuQXMucHJvdG90eXBlLCJn
-dU0iLCJWIiwyKQpzKFAsImlHIiwid1kiLDUyKQpzKFAsIncwIiwiZFUiLDM1KQpzKEwsImlTIiwiaTYi
-LDEpfSkoKTsoZnVuY3Rpb24gaW5oZXJpdGFuY2UoKXt2YXIgcz1odW5rSGVscGVycy5taXhpbixyPWh1
-bmtIZWxwZXJzLmluaGVyaXQscT1odW5rSGVscGVycy5pbmhlcml0TWFueQpyKFAuTWgsbnVsbCkKcShQ
-Lk1oLFtILkZLLEouR3YsSi5tMSxQLmNYLEguZVQsUC5YUyxQLm5ZLEguYTcsUC5BbixILkZ1LEguSkIs
-SC5TVSxILlJlLEgud3YsUC5QbixILldVLEguTEksSC5UcCxILmY5LEgudGUsSC5icSxILlhPLEgua3Is
-UC5ZayxILnZoLEguTjYsSC5WUixILkVLLEguUGIsSC50USxILlNkLEguSmMsSC5HLFAuVzMsUC5paCxQ
-LkZ5LFAuR1YsUC5DdyxQLlBmLFAuRmUsUC52cyxQLk9NLFAucWgsUC5NTyxQLmtULFAueEksUC5tMCxQ
-LnBSLFAuYm4sUC5sbSxQLmxELFAuS1AsUC5sZixQLldZLFAuVWssUC5TaCxQLlJ3LFAuYnosUC5pUCxQ
-Lms1LFAuS1ksUC5DRCxQLmFFLFAuTjMsUC5jOCxQLlpkLFAuTSxQLkRuLFAuUEUsUC5VZixXLmlkLFcu
-RmssVy5KUSxXLkdtLFcudkQsVy5tNixXLk93LFcuVzksVy5kVyxXLm1rLFcuS28sUC5pSixQLkU0LFUu
-ZDIsVS5TZSxVLk1sLFUueUQsVS53YixCLmo4LEIucXAsVC5tUSxMLlhBLEwuRDgsTC5POSxMLkdiLFIu
-TEwsUi5INyxNLmxJLE8uekwsWC5XRCxYLmR2XSkKcShKLkd2LFtKLnlFLEoud2UsSi5NRixKLmpkLEou
-cUksSi5EcixILkVULFcuRDAsVy5BeixXLkxlLFcuTmgsVy5hZSxXLklCLFcubjcsVy5lYSxXLmJyLFcu
-U2csVy51OCxXLks3LFcuWFcsUC5oRl0pCnEoSi5NRixbSi5pQyxKLmtkLEouYzVdKQpyKEouUG8sSi5q
-ZCkKcShKLnFJLFtKLmJVLEoua0RdKQpxKFAuY1gsW0guQlIsSC5iUSxILmkxLEguVTUsSC5BTSxILnU2
-LEguWFIsUC5tVyxILnVuXSkKcShILkJSLFtILlp5LEguUUNdKQpyKEgub2wsSC5aeSkKcihILlVxLEgu
-UUMpCnIoSC5qVixILlVxKQpxKFAuWFMsW0guYyxQLkV6LEguYXosSC52VixILkVxLFAuQzYsSC5rUyxQ
-LlVkLFAuRixQLkFULFAubXAsUC51YixQLmRzLFAubGosUC5VVixQLnAsTC5RV10pCnIoUC51eSxQLm5Z
-KQpxKFAudXksW0gudzIsVy53eixXLmU3XSkKcihILnFqLEgudzIpCnEoSC5iUSxbSC5hTCxILk1CLEgu
-aTVdKQpxKEguYUwsW0gubkgsSC5sSixQLmk4XSkKcihILnh5LEguaTEpCnEoUC5BbixbSC5NSCxILlNP
-LEguVTFdKQpyKEguZDUsSC5BTSkKcihQLlJVLFAuUG4pCnIoUC5HaixQLlJVKQpyKEguUEQsUC5HaikK
-cihILkxQLEguV1UpCnEoSC5UcCxbSC5FMSxILkF5LEgubGMsSC5kQyxILlZYLFAudGgsUC5oYSxQLldN
-LFAucFYsUC5qWixQLkI1LFAuT1IsUC55USxQLlZDLFAuUlosUC5jNixQLnFkLFcuQ3YsVy52TixXLlV2
-LFcuRWcsVy5FbyxXLldrLFcuSUEsUC5HRSxQLk43LFAudVEsUC5EVixQLlBDLFAuUVMsUC5ucCxQLlV0
-LFUuYU4sVS5iMCxMLmUsTC5vWixMLmpyLEwueTgsTC5IaSxMLkJULEwuUFksTC5MLEwuV3gsTC5IbyxM
-LmROLEwuSUMsTC54eixMLkJOLEwuZkMsTC5UbSxMLnVlLEwuR0gsTC5FRSxMLlZTLEwuVEQsTC5JZixM
-LnRCLEwubTIsUi5NRCxNLnE3LE0uTm9dKQpxKEguRTEsW0guQ2osSC53TixQLlNYLFAuR3MsUC5VNyxQ
-LnJhLFAudGksUC5XRixQLm4xLFAuY1MsUC5KVCxQLk1FLFAueTUsUC55SSxXLktTLFcuQTMsVy5mbSxQ
-LkUyLFAuamcsTC5xbF0pCnIoSC5XMCxQLkV6KQpxKEgubGMsW0guengsSC5yVF0pCnIoSC5rWSxQLkM2
-KQpyKFAuaWwsUC5ZaykKcShQLmlsLFtILk41LFAudXcsVy5jZixXLlN5XSkKcShQLm1XLFtILktXLFAu
-cTRdKQpyKEguTFosSC5FVCkKcShILkxaLFtILlJHLEguV0JdKQpyKEguVlAsSC5SRykKcihILkRnLEgu
-VlApCnIoSC5aRyxILldCKQpyKEguUGcsSC5aRykKcShILlBnLFtILnhqLEguZEUsSC5aQSxILmRULEgu
-UHEsSC5lRSxILlY2XSkKcihILmlNLEgua1MpCnEoSC5BeSxbUC5WcyxQLkZ0LFAueUgsUC5kYSxQLm9R
-LFAudnIsUC5ydCxQLktGLFAuWkwsUC5SVCxQLnJxLFAuUlcsUC51TyxQLkV2LFAuVnAsUC54cixQLk56
-LEwuVlcsTC5uVCxMLk5ZLEwuUUxdKQpyKFAuWmYsUC5QZikKcihQLkppLFAubTApCnIoUC5YdixQLnBS
-KQpyKFAuYjYsUC5YdikKcihQLlZqLFAuV1kpCnEoUC5VayxbUC5DVixQLlppLFAuYnldKQpyKFAud0ks
-UC5rVCkKcShQLndJLFtQLlU4LFAub2osUC5NeCxQLkUzLFAuR1ldKQpyKFAuSzgsUC5VZCkKcihQLnR1
-LFAuU2gpCnIoUC51NSxQLlppKQpxKFAuQVQsW1AuYkosUC5lWV0pCnIoUC5xZSxQLkRuKQpxKFcuRDAs
-W1cuS1YsVy53YSxXLks1LFcuQ21dKQpxKFcuS1YsW1cuY3YsVy5ueCxXLlFGLFcuQ1FdKQpxKFcuY3Ys
-W1cucUUsUC5oaV0pCnEoVy5xRSxbVy5HaCxXLmZZLFcuclosVy5RUCxXLmg0LFcuU04sVy5scCxXLlRi
-LFcuSXYsVy5XUCxXLnlZXSkKcihXLm9KLFcuTGUpCnIoVy5oSCxXLkF6KQpyKFcuVmIsVy5RRikKcihX
-LmZKLFcud2EpCnEoVy5lYSxbVy53NixXLmV3XSkKcihXLkFqLFcudzYpCnIoVy5yQixXLks3KQpyKFcu
-QkgsVy5yQikKcihXLnc0LFcuSUIpCnIoVy5vYSxXLlhXKQpyKFcucmgsVy5vYSkKcihXLmk3LFcuY2Yp
-CnIoUC5BcyxQLlZqKQpxKFAuQXMsW1cuSTQsUC5LZV0pCnIoVy5STyxQLnFoKQpyKFcuQ3EsVy5STykK
-cihXLnhDLFAuTU8pCnIoVy5jdCxXLm02KQpyKFAuQmYsUC5pSikKcShQLkU0LFtQLnI3LFAudmddKQpy
-KFAuVHosUC52ZykKcihQLm5kLFAuaGkpCnEoTC5EOCxbTC52dCxMLmNEXSkKcihCLmZ2LE8uekwpCnEo
-Qi5mdixbRS5PRixGLnJ1LEwuSVZdKQpzKEgudzIsSC5SZSkKcyhILlFDLFAubEQpCnMoSC5SRyxQLmxE
-KQpzKEguVlAsSC5TVSkKcyhILldCLFAubEQpCnMoSC5aRyxILlNVKQpzKFAublksUC5sRCkKcyhQLldZ
-LFAubGYpCnMoUC5SVSxQLktQKQpzKFAucFIsUC5sZikKcyhXLkxlLFcuaWQpCnMoVy5LNyxQLmxEKQpz
-KFcuckIsVy5HbSkKcyhXLlhXLFAubEQpCnMoVy5vYSxXLkdtKQpzKFAudmcsUC5sRCl9KSgpCnZhciB2
-PXt0eXBlVW5pdmVyc2U6e2VDOm5ldyBNYXAoKSx0Ujp7fSxlVDp7fSx0UFY6e30sc0VBOltdfSxtYW5n
-bGVkR2xvYmFsTmFtZXM6e0lqOiJpbnQiLENQOiJkb3VibGUiLFpaOiJudW0iLHFVOiJTdHJpbmciLGEy
-OiJib29sIixjODoiTnVsbCIsek06Ikxpc3QifSxtYW5nbGVkTmFtZXM6e30sdHlwZXM6WyJ+KCkiLCJ+
-KEFqKSIsInFVKHFVKSIsIn4oY3YpIiwiQChAKSIsIn4ofigpKSIsImEyKHFVKSIsImI4PH4+KEFqKSIs
-In4ocVUscVUpIiwifihNaD8sTWg/KSIsIkAoKSIsIn4ocVUsQCkiLCJ+KHh1PHFVPikiLCJjOChAKSIs
-ImEyKGN2LHFVLHFVLEpRKSIsImM4KCkiLCJhMihrRikiLCJjOChlYSkiLCJ+KG42LHFVLElqKSIsIn4o
-cVVbQF0pIiwiSWooSWosSWopIiwiQChxVSkiLCJ+KHFVLHFVPykiLCJuNihALEApIiwifihxVSxJaiki
-LCJhMihLVikiLCJaMDxxVSxxVT4oWjA8cVUscVU+LHFVKSIsIn4oZWEpIiwifihHRCxAKSIsInZzPEA+
-KEApIiwifihLVixLVj8pIiwifihALEApIiwiYzgoQCxAKSIsImEyKHh1PHFVPikiLCJjOChNaCxHeiki
-LCJNaD8oQCkiLCJUejxAPihAKSIsIkU0KEApIiwiTEwoQCkiLCJaMDxxVSxNaD8+KExMKSIsIn4oTWhb
-R3o/XSkiLCJjOCh+KCkpIiwiYzgoWjA8cVUsTWg/Pj8pIiwiYzgoTWgsQCkiLCJyNyhAKSIsIn4oSWos
-QCkiLCJ+KGV3KSIsInFVKFowPEAsQD4pIiwiYTIoSDcpIiwicVUocVU/KSIsIkAoQCxxVSkiLCJ+KEAp
-IiwiTWg/KE1oPykiLCJjOChALEd6KSJdLGludGVyY2VwdG9yc0J5VGFnOm51bGwsbGVhZlRhZ3M6bnVs
-bCxhcnJheVJ0aTpTeW1ib2woIiR0aSIpfQpILnhiKHYudHlwZVVuaXZlcnNlLEpTT04ucGFyc2UoJ3si
-aUMiOiJNRiIsImtkIjoiTUYiLCJjNSI6Ik1GIiwicngiOiJlYSIsImU1IjoiZWEiLCJZMCI6ImhpIiwi
-dHAiOiJoaSIsIkc4IjoiZXciLCJNciI6InFFIiwiZUwiOiJxRSIsIkkwIjoiS1YiLCJocyI6IktWIiwi
-WGciOiJRRiIsIm5yIjoiQWoiLCJ5NCI6Inc2IiwiYVAiOiJDbSIsInhjIjoibngiLCJrSiI6Im54Iiwi
-elUiOiJEZyIsImRmIjoiRVQiLCJ5RSI6eyJhMiI6W119LCJ3ZSI6eyJjOCI6W119LCJNRiI6eyJ2bSI6
-W119LCJqZCI6eyJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdfSwiUG8iOnsiamQiOlsiMSJd
-LCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdfSwibTEiOnsiQW4iOlsiMSJdfSwicUkiOnsi
-Q1AiOltdLCJaWiI6W119LCJiVSI6eyJDUCI6W10sIklqIjpbXSwiWloiOltdfSwia0QiOnsiQ1AiOltd
-LCJaWiI6W119LCJEciI6eyJxVSI6W10sInZYIjpbXX0sIkJSIjp7ImNYIjpbIjIiXX0sImVUIjp7IkFu
-IjpbIjIiXX0sIlp5Ijp7IkJSIjpbIjEiLCIyIl0sImNYIjpbIjIiXSwiY1guRSI6IjIifSwib2wiOnsi
-WnkiOlsiMSIsIjIiXSwiQlIiOlsiMSIsIjIiXSwiYlEiOlsiMiJdLCJjWCI6WyIyIl0sImNYLkUiOiIy
-In0sIlVxIjp7ImxEIjpbIjIiXSwiek0iOlsiMiJdLCJCUiI6WyIxIiwiMiJdLCJiUSI6WyIyIl0sImNY
-IjpbIjIiXX0sImpWIjp7IlVxIjpbIjEiLCIyIl0sImxEIjpbIjIiXSwiek0iOlsiMiJdLCJCUiI6WyIx
-IiwiMiJdLCJiUSI6WyIyIl0sImNYIjpbIjIiXSwibEQuRSI6IjIiLCJjWC5FIjoiMiJ9LCJjIjp7IlhT
-IjpbXX0sInFqIjp7ImxEIjpbIklqIl0sIlJlIjpbIklqIl0sInpNIjpbIklqIl0sImJRIjpbIklqIl0s
-ImNYIjpbIklqIl0sImxELkUiOiJJaiIsIlJlLkUiOiJJaiJ9LCJiUSI6eyJjWCI6WyIxIl19LCJhTCI6
-eyJiUSI6WyIxIl0sImNYIjpbIjEiXX0sIm5IIjp7ImFMIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIx
-Il0sImFMLkUiOiIxIiwiY1guRSI6IjEifSwiYTciOnsiQW4iOlsiMSJdfSwiaTEiOnsiY1giOlsiMiJd
-LCJjWC5FIjoiMiJ9LCJ4eSI6eyJpMSI6WyIxIiwiMiJdLCJiUSI6WyIyIl0sImNYIjpbIjIiXSwiY1gu
-RSI6IjIifSwiTUgiOnsiQW4iOlsiMiJdfSwibEoiOnsiYUwiOlsiMiJdLCJiUSI6WyIyIl0sImNYIjpb
-IjIiXSwiYUwuRSI6IjIiLCJjWC5FIjoiMiJ9LCJVNSI6eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIlNP
-Ijp7IkFuIjpbIjEiXX0sIkFNIjp7ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiZDUiOnsiQU0iOlsiMSJd
-LCJiUSI6WyIxIl0sImNYIjpbIjEiXSwiY1guRSI6IjEifSwiVTEiOnsiQW4iOlsiMSJdfSwiTUIiOnsi
-YlEiOlsiMSJdLCJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIkZ1Ijp7IkFuIjpbIjEiXX0sInU2Ijp7ImNY
-IjpbIjEiXSwiY1guRSI6IjEifSwiSkIiOnsiQW4iOlsiMSJdfSwidzIiOnsibEQiOlsiMSJdLCJSZSI6
-WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJ3diI6eyJHRCI6W119LCJQRCI6
-eyJHaiI6WyIxIiwiMiJdLCJSVSI6WyIxIiwiMiJdLCJQbiI6WyIxIiwiMiJdLCJLUCI6WyIxIiwiMiJd
-LCJaMCI6WyIxIiwiMiJdfSwiV1UiOnsiWjAiOlsiMSIsIjIiXX0sIkxQIjp7IldVIjpbIjEiLCIyIl0s
-IlowIjpbIjEiLCIyIl19LCJYUiI6eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIkxJIjp7InZRIjpbXX0s
-IlcwIjp7IkV6IjpbXSwiWFMiOltdfSwiYXoiOnsiWFMiOltdfSwidlYiOnsiWFMiOltdfSwidGUiOnsi
-UnoiOltdfSwiWE8iOnsiR3oiOltdfSwiVHAiOnsiRUgiOltdfSwiQXkiOnsiRUgiOltdfSwiRTEiOnsi
-RUgiOltdfSwibGMiOnsiRUgiOltdfSwiengiOnsiRUgiOltdfSwiclQiOnsiRUgiOltdfSwiRXEiOnsi
-WFMiOltdfSwia1kiOnsiWFMiOltdfSwiTjUiOnsiWWsiOlsiMSIsIjIiXSwiRm8iOlsiMSIsIjIiXSwi
-WjAiOlsiMSIsIjIiXSwiWWsuSyI6IjEiLCJZay5WIjoiMiJ9LCJpNSI6eyJiUSI6WyIxIl0sImNYIjpb
-IjEiXSwiY1guRSI6IjEifSwiTjYiOnsiQW4iOlsiMSJdfSwiVlIiOnsid0wiOltdLCJ2WCI6W119LCJF
-SyI6eyJpYiI6W10sIk9kIjpbXX0sIktXIjp7ImNYIjpbImliIl0sImNYLkUiOiJpYiJ9LCJQYiI6eyJB
-biI6WyJpYiJdfSwidFEiOnsiT2QiOltdfSwidW4iOnsiY1giOlsiT2QiXSwiY1guRSI6Ik9kIn0sIlNk
-Ijp7IkFuIjpbIk9kIl19LCJFVCI6eyJBUyI6W119LCJMWiI6eyJYaiI6WyIxIl0sIkVUIjpbXSwiQVMi
-OltdfSwiRGciOnsibEQiOlsiQ1AiXSwiWGoiOlsiQ1AiXSwiek0iOlsiQ1AiXSwiRVQiOltdLCJiUSI6
-WyJDUCJdLCJBUyI6W10sImNYIjpbIkNQIl0sIlNVIjpbIkNQIl0sImxELkUiOiJDUCJ9LCJQZyI6eyJs
-RCI6WyJJaiJdLCJYaiI6WyJJaiJdLCJ6TSI6WyJJaiJdLCJFVCI6W10sImJRIjpbIklqIl0sIkFTIjpb
-XSwiY1giOlsiSWoiXSwiU1UiOlsiSWoiXX0sInhqIjp7ImxEIjpbIklqIl0sIlhqIjpbIklqIl0sInpN
-IjpbIklqIl0sIkVUIjpbXSwiYlEiOlsiSWoiXSwiQVMiOltdLCJjWCI6WyJJaiJdLCJTVSI6WyJJaiJd
-LCJsRC5FIjoiSWoifSwiZEUiOnsibEQiOlsiSWoiXSwiWGoiOlsiSWoiXSwiek0iOlsiSWoiXSwiRVQi
-OltdLCJiUSI6WyJJaiJdLCJBUyI6W10sImNYIjpbIklqIl0sIlNVIjpbIklqIl0sImxELkUiOiJJaiJ9
-LCJaQSI6eyJsRCI6WyJJaiJdLCJYaiI6WyJJaiJdLCJ6TSI6WyJJaiJdLCJFVCI6W10sImJRIjpbIklq
-Il0sIkFTIjpbXSwiY1giOlsiSWoiXSwiU1UiOlsiSWoiXSwibEQuRSI6IklqIn0sImRUIjp7ImxEIjpb
+QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
+QUFBQUZGRkZGRkZGRkZGRkZGRkZHR0dHR0dHR0dHR0dHR0dHSEhISEhISEhISEhISEhISEhISEhISEhI
+SEhISUhISEpFRUJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQktDQ0NDQ0NDQ0NDQ0NEQ0xPTk5O
+TUVFRUVFRUVFRUVFIixzKSYzMQpoPWk8PTMyP3MmNjE2OTQ+Pj5xOihzJjYzfGg8PDYpPj4+MAppPUMu
+eEIuVygiIFx4MDAwOlhFQ0NDQ0NOOmxEYiBceDAwMDpYRUNDQ0NDTnZsRGIgXHgwMDA6WEVDQ0NDQ046
+bERiIEFBQUFBXHgwMFx4MDBceDAwXHgwMFx4MDBBQUFBQTAwMDAwQUFBQUE6Ojo6OkFBQUFBR0cwMDBB
+QUFBQTAwS0tLQUFBQUFHOjo6OkFBQUFBOklJSUlBQUFBQTAwMFx4ODAwQUFBQUFceDAwXHgwMFx4MDBc
+eDAwIEFBQUFBIixpK3EpCmlmKGk9PT0wKXtnLmErPUguTHcoaCkKaWYoZj09PWMpYnJlYWsgJGxhYmVs
+MCQwCmJyZWFrfWVsc2UgaWYoKGkmMSkhPT0wKXtpZihyKXN3aXRjaChpKXtjYXNlIDY5OmNhc2UgNjc6
+Zy5hKz1ILkx3KGopCmJyZWFrCmNhc2UgNjU6Zy5hKz1ILkx3KGopOy0tZgpicmVhawpkZWZhdWx0OnA9
+Zy5hKz1ILkx3KGopCmcuYT1wK0guTHcoaikKYnJlYWt9ZWxzZXtrLmI9aQprLmM9Zi0xCnJldHVybiIi
+fWk9MH1pZihmPT09YylicmVhayAkbGFiZWwwJDAKbz1mKzEKaWYoZjwwfHxmPj1lKXJldHVybiBILk9I
+KGEsZikKcz1hW2ZdfW89ZisxCmlmKGY8MHx8Zj49ZSlyZXR1cm4gSC5PSChhLGYpCnM9YVtmXQppZihz
+PDEyOCl7d2hpbGUoITApe2lmKCEobzxjKSl7bj1jCmJyZWFrfW09bysxCmlmKG88MHx8bz49ZSlyZXR1
+cm4gSC5PSChhLG8pCnM9YVtvXQppZihzPj0xMjgpe249bS0xCm89bQpicmVha31vPW19aWYobi1mPDIw
+KWZvcihsPWY7bDxuOysrbCl7aWYobD49ZSlyZXR1cm4gSC5PSChhLGwpCmcuYSs9SC5MdyhhW2xdKX1l
+bHNlIGcuYSs9UC5ITShhLGYsbikKaWYobj09PWMpYnJlYWsgJGxhYmVsMCQwCmY9b31lbHNlIGY9b31p
+ZihkJiZpPjMyKWlmKHIpZy5hKz1ILkx3KGopCmVsc2V7ay5iPTc3CmsuYz1jCnJldHVybiIifWsuYj1p
+CmsuYz1oCmU9Zy5hCnJldHVybiBlLmNoYXJDb2RlQXQoMCk9PTA/ZTplfX0KUC5XRi5wcm90b3R5cGU9
+ewokMihhLGIpe3ZhciBzLHIscQp0LmZvLmEoYSkKcz10aGlzLmIKcj10aGlzLmEKcT1zLmErPXIuYQpx
+Kz1hLmEKcy5hPXEKcy5hPXErIjogIgpzLmErPVAuaGwoYikKci5hPSIsICJ9LAokUzoyOH0KUC5pUC5w
+cm90b3R5cGU9ewpETihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKcmV0dXJuIGIgaW5zdGFuY2VvZiBQ
+LmlQJiZ0aGlzLmE9PT1iLmEmJiEwfSwKZ2lPKGEpe3ZhciBzPXRoaXMuYQpyZXR1cm4oc15DLmpuLndH
+KHMsMzApKSYxMDczNzQxODIzfSwKdyhhKXt2YXIgcz10aGlzLHI9UC5HcShILnRKKHMpKSxxPVAuaDAo
+SC5OUyhzKSkscD1QLmgwKEguakEocykpLG89UC5oMChILklYKHMpKSxuPVAuaDAoSC5jaChzKSksbT1Q
+LmgwKEguSmQocykpLGw9UC5WeChILm8xKHMpKSxrPXIrIi0iK3ErIi0iK3ArIiAiK28rIjoiK24rIjoi
+K20rIi4iK2wKcmV0dXJuIGt9fQpQLlhTLnByb3RvdHlwZT17CmdJSSgpe3JldHVybiBILnRzKHRoaXMu
+JHRocm93bkpzRXJyb3IpfX0KUC5DNi5wcm90b3R5cGU9ewp3KGEpe3ZhciBzPXRoaXMuYQppZihzIT1u
+dWxsKXJldHVybiJBc3NlcnRpb24gZmFpbGVkOiAiK1AuaGwocykKcmV0dXJuIkFzc2VydGlvbiBmYWls
+ZWQifX0KUC5Fei5wcm90b3R5cGU9e30KUC5GLnByb3RvdHlwZT17CncoYSl7cmV0dXJuIlRocm93IG9m
+IG51bGwuIn19ClAuQVQucHJvdG90eXBlPXsKZ1ooKXtyZXR1cm4iSW52YWxpZCBhcmd1bWVudCIrKCF0
+aGlzLmE/IihzKSI6IiIpfSwKZ3UoKXtyZXR1cm4iIn0sCncoYSl7dmFyIHMscixxPXRoaXMscD1xLmMs
+bz1wPT1udWxsPyIiOiIgKCIrcCsiKSIsbj1xLmQsbT1uPT1udWxsPyIiOiI6ICIrSC5FaihuKSxsPXEu
+Z1ooKStvK20KaWYoIXEuYSlyZXR1cm4gbApzPXEuZ3UoKQpyPVAuaGwocS5iKQpyZXR1cm4gbCtzKyI6
+ICIrcn19ClAuYkoucHJvdG90eXBlPXsKZ1ooKXtyZXR1cm4iUmFuZ2VFcnJvciJ9LApndSgpe3ZhciBz
+LHI9dGhpcy5lLHE9dGhpcy5mCmlmKHI9PW51bGwpcz1xIT1udWxsPyI6IE5vdCBsZXNzIHRoYW4gb3Ig
+ZXF1YWwgdG8gIitILkVqKHEpOiIiCmVsc2UgaWYocT09bnVsbClzPSI6IE5vdCBncmVhdGVyIHRoYW4g
+b3IgZXF1YWwgdG8gIitILkVqKHIpCmVsc2UgaWYocT5yKXM9IjogTm90IGluIGluY2x1c2l2ZSByYW5n
+ZSAiK0guRWoocikrIi4uIitILkVqKHEpCmVsc2Ugcz1xPHI/IjogVmFsaWQgdmFsdWUgcmFuZ2UgaXMg
+ZW1wdHkiOiI6IE9ubHkgdmFsaWQgdmFsdWUgaXMgIitILkVqKHIpCnJldHVybiBzfX0KUC5lWS5wcm90
+b3R5cGU9ewpnWigpe3JldHVybiJSYW5nZUVycm9yIn0sCmd1KCl7aWYoSC5JWih0aGlzLmIpPDApcmV0
+dXJuIjogaW5kZXggbXVzdCBub3QgYmUgbmVnYXRpdmUiCnZhciBzPXRoaXMuZgppZihzPT09MClyZXR1
+cm4iOiBubyBpbmRpY2VzIGFyZSB2YWxpZCIKcmV0dXJuIjogaW5kZXggc2hvdWxkIGJlIGxlc3MgdGhh
+biAiK3N9LApnQShhKXtyZXR1cm4gdGhpcy5mfX0KUC5tcC5wcm90b3R5cGU9ewp3KGEpe3ZhciBzLHIs
+cSxwLG8sbixtLGwsaz10aGlzLGo9e30saT1uZXcgUC5NKCIiKQpqLmE9IiIKcz1rLmMKZm9yKHI9cy5s
+ZW5ndGgscT0wLHA9IiIsbz0iIjtxPHI7KytxLG89IiwgIil7bj1zW3FdCmkuYT1wK28KcD1pLmErPVAu
+aGwobikKai5hPSIsICJ9ay5kLksoMCxuZXcgUC5XRihqLGkpKQptPVAuaGwoay5hKQpsPWkudygwKQpy
+PSJOb1N1Y2hNZXRob2RFcnJvcjogbWV0aG9kIG5vdCBmb3VuZDogJyIray5iLmErIidcblJlY2VpdmVy
+OiAiK20rIlxuQXJndW1lbnRzOiBbIitsKyJdIgpyZXR1cm4gcn19ClAudWIucHJvdG90eXBlPXsKdyhh
+KXtyZXR1cm4iVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAiK3RoaXMuYX19ClAuZHMucHJvdG90eXBlPXsK
+dyhhKXt2YXIgcz0iVW5pbXBsZW1lbnRlZEVycm9yOiAiK3RoaXMuYQpyZXR1cm4gc319ClAubGoucHJv
+dG90eXBlPXsKdyhhKXtyZXR1cm4iQmFkIHN0YXRlOiAiK3RoaXMuYX19ClAuVVYucHJvdG90eXBlPXsK
+dyhhKXt2YXIgcz10aGlzLmEKaWYocz09bnVsbClyZXR1cm4iQ29uY3VycmVudCBtb2RpZmljYXRpb24g
+ZHVyaW5nIGl0ZXJhdGlvbi4iCnJldHVybiJDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkdXJpbmcgaXRl
+cmF0aW9uOiAiK1AuaGwocykrIi4ifX0KUC5rNS5wcm90b3R5cGU9ewp3KGEpe3JldHVybiJPdXQgb2Yg
+TWVtb3J5In0sCmdJSSgpe3JldHVybiBudWxsfSwKJGlYUzoxfQpQLktZLnByb3RvdHlwZT17CncoYSl7
+cmV0dXJuIlN0YWNrIE92ZXJmbG93In0sCmdJSSgpe3JldHVybiBudWxsfSwKJGlYUzoxfQpQLnAucHJv
+dG90eXBlPXsKdyhhKXt2YXIgcz0iUmVhZGluZyBzdGF0aWMgdmFyaWFibGUgJyIrdGhpcy5hKyInIGR1
+cmluZyBpdHMgaW5pdGlhbGl6YXRpb24iCnJldHVybiBzfX0KUC5DRC5wcm90b3R5cGU9ewp3KGEpe3Jl
+dHVybiJFeGNlcHRpb246ICIrdGhpcy5hfSwKJGlSejoxfQpQLmFFLnByb3RvdHlwZT17CncoYSl7dmFy
+IHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGc9dGhpcy5hLGY9IiIhPT1nPyJGb3JtYXRFeGNlcHRpb246
+ICIrZzoiRm9ybWF0RXhjZXB0aW9uIixlPXRoaXMuYyxkPXRoaXMuYgppZih0eXBlb2YgZD09InN0cmlu
+ZyIpe2lmKGUhPW51bGwpcz1lPDB8fGU+ZC5sZW5ndGgKZWxzZSBzPSExCmlmKHMpZT1udWxsCmlmKGU9
+PW51bGwpe2lmKGQubGVuZ3RoPjc4KWQ9Qy54Qi5OaihkLDAsNzUpKyIuLi4iCnJldHVybiBmKyJcbiIr
+ZH1mb3Iocj0xLHE9MCxwPSExLG89MDtvPGU7KytvKXtuPUMueEIuVyhkLG8pCmlmKG49PT0xMCl7aWYo
+cSE9PW98fCFwKSsrcgpxPW8rMQpwPSExfWVsc2UgaWYobj09PTEzKXsrK3IKcT1vKzEKcD0hMH19Zj1y
+PjE/ZisoIiAoYXQgbGluZSAiK3IrIiwgY2hhcmFjdGVyICIrKGUtcSsxKSsiKVxuIik6ZisoIiAoYXQg
+Y2hhcmFjdGVyICIrKGUrMSkrIilcbiIpCm09ZC5sZW5ndGgKZm9yKG89ZTtvPG07KytvKXtuPUMueEIu
+TyhkLG8pCmlmKG49PT0xMHx8bj09PTEzKXttPW8KYnJlYWt9fWlmKG0tcT43OClpZihlLXE8NzUpe2w9
+cSs3NQprPXEKaj0iIgppPSIuLi4ifWVsc2V7aWYobS1lPDc1KXtrPW0tNzUKbD1tCmk9IiJ9ZWxzZXtr
+PWUtMzYKbD1lKzM2Cmk9Ii4uLiJ9aj0iLi4uIn1lbHNle2w9bQprPXEKaj0iIgppPSIifWg9Qy54Qi5O
+aihkLGssbCkKcmV0dXJuIGYraitoK2krIlxuIitDLnhCLlQoIiAiLGUtaytqLmxlbmd0aCkrIl5cbiJ9
+ZWxzZSByZXR1cm4gZSE9bnVsbD9mKygiIChhdCBvZmZzZXQgIitILkVqKGUpKyIpIik6Zn0sCiRpUno6
+MX0KUC5jWC5wcm90b3R5cGU9ewpkcihhLGIpe3JldHVybiBILkdKKHRoaXMsSC5MaCh0aGlzKS5DKCJj
+WC5FIiksYil9LApFMihhLGIsYyl7dmFyIHM9SC5MaCh0aGlzKQpyZXR1cm4gSC5LMSh0aGlzLHMuS3Eo
+YykuQygiMShjWC5FKSIpLmEoYikscy5DKCJjWC5FIiksYyl9LApldihhLGIpe3ZhciBzPUguTGgodGhp
+cykKcmV0dXJuIG5ldyBILlU1KHRoaXMscy5DKCJhMihjWC5FKSIpLmEoYikscy5DKCJVNTxjWC5FPiIp
+KX0sCnR0KGEsYil7cmV0dXJuIFAuWTEodGhpcyxiLEguTGgodGhpcykuQygiY1guRSIpKX0sCmJyKGEp
+e3JldHVybiB0aGlzLnR0KGEsITApfSwKZ0EoYSl7dmFyIHMscj10aGlzLmdtKHRoaXMpCmZvcihzPTA7
+ci5GKCk7KSsrcwpyZXR1cm4gc30sCmdsMChhKXtyZXR1cm4hdGhpcy5nbSh0aGlzKS5GKCl9LApnb3Io
+YSl7cmV0dXJuIXRoaXMuZ2wwKHRoaXMpfSwKZVIoYSxiKXtyZXR1cm4gSC5iSyh0aGlzLGIsSC5MaCh0
+aGlzKS5DKCJjWC5FIikpfSwKZ3I4KGEpe3ZhciBzLHI9dGhpcy5nbSh0aGlzKQppZighci5GKCkpdGhy
+b3cgSC5iKEguV3AoKSkKcz1yLmdsKCkKaWYoci5GKCkpdGhyb3cgSC5iKEguQW0oKSkKcmV0dXJuIHN9
+LApFKGEsYil7dmFyIHMscixxClAuazEoYiwiaW5kZXgiKQpmb3Iocz10aGlzLmdtKHRoaXMpLHI9MDtz
+LkYoKTspe3E9cy5nbCgpCmlmKGI9PT1yKXJldHVybiBxOysrcn10aHJvdyBILmIoUC5DZihiLHRoaXMs
+ImluZGV4IixudWxsLHIpKX0sCncoYSl7cmV0dXJuIFAuRVAodGhpcywiKCIsIikiKX19ClAuQW4ucHJv
+dG90eXBlPXt9ClAuTjMucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4iTWFwRW50cnkoIitILkVqKHRoaXMu
+YSkrIjogIitILkVqKHRoaXMuYikrIikifX0KUC5jOC5wcm90b3R5cGU9ewpnaU8oYSl7cmV0dXJuIFAu
+TWgucHJvdG90eXBlLmdpTy5jYWxsKHRoaXMsdGhpcyl9LAp3KGEpe3JldHVybiJudWxsIn19ClAuTWgu
+cHJvdG90eXBlPXskaU1oOjEsCkROKGEsYil7cmV0dXJuIHRoaXM9PT1ifSwKZ2lPKGEpe3JldHVybiBI
+LmVRKHRoaXMpfSwKdyhhKXtyZXR1cm4iSW5zdGFuY2Ugb2YgJyIrSC5saCh0aGlzKSsiJyJ9LAplNyhh
+LGIpe3Quby5hKGIpCnRocm93IEguYihQLmxyKHRoaXMsYi5nV2EoKSxiLmduZCgpLGIuZ1ZtKCkpKX0s
+CnRvU3RyaW5nKCl7cmV0dXJuIHRoaXMudyh0aGlzKX19ClAuWmQucHJvdG90eXBlPXsKdyhhKXtyZXR1
+cm4iIn0sCiRpR3o6MX0KUC5NLnByb3RvdHlwZT17CmdBKGEpe3JldHVybiB0aGlzLmEubGVuZ3RofSwK
+dyhhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LAokaUJMOjF9ClAu
+bjEucHJvdG90eXBlPXsKJDIoYSxiKXt2YXIgcyxyLHEscAp0LmNrLmEoYSkKSC5uKGIpCnM9Qy54Qi5P
+WShiLCI9IikKaWYocz09PS0xKXtpZihiIT09IiIpYS5ZNSgwLFAua3UoYiwwLGIubGVuZ3RoLHRoaXMu
+YSwhMCksIiIpfWVsc2UgaWYocyE9PTApe3I9Qy54Qi5OaihiLDAscykKcT1DLnhCLnluKGIscysxKQpw
+PXRoaXMuYQphLlk1KDAsUC5rdShyLDAsci5sZW5ndGgscCwhMCksUC5rdShxLDAscS5sZW5ndGgscCwh
+MCkpfXJldHVybiBhfSwKJFM6MjZ9ClAuY1MucHJvdG90eXBlPXsKJDIoYSxiKXt0aHJvdyBILmIoUC5y
+cigiSWxsZWdhbCBJUHY0IGFkZHJlc3MsICIrYSx0aGlzLmEsYikpfSwKJFM6MjR9ClAuVkMucHJvdG90
+eXBlPXsKJDIoYSxiKXt0aHJvdyBILmIoUC5ycigiSWxsZWdhbCBJUHY2IGFkZHJlc3MsICIrYSx0aGlz
+LmEsYikpfSwKJDEoYSl7cmV0dXJuIHRoaXMuJDIoYSxudWxsKX0sCiRTOjE5fQpQLkpULnByb3RvdHlw
+ZT17CiQyKGEsYil7dmFyIHMKaWYoYi1hPjQpdGhpcy5hLiQyKCJhbiBJUHY2IHBhcnQgY2FuIG9ubHkg
+Y29udGFpbiBhIG1heGltdW0gb2YgNCBoZXggZGlnaXRzIixhKQpzPVAuUUEoQy54Qi5Oaih0aGlzLmIs
+YSxiKSwxNikKaWYoczwwfHxzPjY1NTM1KXRoaXMuYS4kMigiZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhl
+IHJhbmdlIG9mIGAweDAuLjB4RkZGRmAiLGEpCnJldHVybiBzfSwKJFM6MjB9ClAuRG4ucHJvdG90eXBl
+PXsKZ25EKCl7dmFyIHMscixxLHA9dGhpcyxvPXAueAppZihvPT1udWxsKXtvPXAuYQpzPW8ubGVuZ3Ro
+IT09MD8iIitvKyI6IjoiIgpyPXAuYwpxPXI9PW51bGwKaWYoIXF8fG89PT0iZmlsZSIpe289cysiLy8i
+CnM9cC5iCmlmKHMubGVuZ3RoIT09MClvPW8rcysiQCIKaWYoIXEpbys9cgpzPXAuZAppZihzIT1udWxs
+KW89bysiOiIrSC5FaihzKX1lbHNlIG89cwpvKz1wLmUKcz1wLmYKaWYocyE9bnVsbClvPW8rIj8iK3MK
+cz1wLnIKaWYocyE9bnVsbClvPW8rIiMiK3MKbz1vLmNoYXJDb2RlQXQoMCk9PTA/bzpvCmlmKHAueD09
+bnVsbClwLng9bwplbHNlIG89SC52KEguaigiX3RleHQiKSl9cmV0dXJuIG99LApnRmooKXt2YXIgcyxy
+PXRoaXMscT1yLnkKaWYocT09bnVsbCl7cz1yLmUKaWYocy5sZW5ndGghPT0wJiZDLnhCLlcocywwKT09
+PTQ3KXM9Qy54Qi55bihzLDEpCnE9cy5sZW5ndGg9PT0wP0MueEQ6UC5BRihuZXcgSC5sSihILlFJKHMu
+c3BsaXQoIi8iKSx0LnMpLHQuZE8uYShQLlBIKCkpLHQuZG8pLHQuTikKaWYoci55PT1udWxsKXIuc0tw
+KHEpCmVsc2UgcT1ILnYoSC5qKCJwYXRoU2VnbWVudHMiKSl9cmV0dXJuIHF9LApnaU8oYSl7dmFyIHM9
+dGhpcyxyPXMuegppZihyPT1udWxsKXtyPUMueEIuZ2lPKHMuZ25EKCkpCmlmKHMuej09bnVsbClzLno9
+cgplbHNlIHI9SC52KEguaigiaGFzaENvZGUiKSl9cmV0dXJuIHJ9LApnaFkoKXt2YXIgcz10aGlzLHI9
+cy5RCmlmKHI9PW51bGwpe3I9cy5mCnI9bmV3IFAuR2ooUC5XWChyPT1udWxsPyIiOnIpLHQuZHcpCmlm
+KHMuUT09bnVsbClzLnNOTShyKQplbHNlIHI9SC52KEguaigicXVlcnlQYXJhbWV0ZXJzIikpfXJldHVy
+biByfSwKZ2t1KCl7cmV0dXJuIHRoaXMuYn0sCmdKZihhKXt2YXIgcz10aGlzLmMKaWYocz09bnVsbCly
+ZXR1cm4iIgppZihDLnhCLm4ocywiWyIpKXJldHVybiBDLnhCLk5qKHMsMSxzLmxlbmd0aC0xKQpyZXR1
+cm4gc30sCmd0cChhKXt2YXIgcz10aGlzLmQKcmV0dXJuIHM9PW51bGw/UC53Syh0aGlzLmEpOnN9LApn
+dFAoKXt2YXIgcz10aGlzLmYKcmV0dXJuIHM9PW51bGw/IiI6c30sCmdLYSgpe3ZhciBzPXRoaXMucgpy
+ZXR1cm4gcz09bnVsbD8iIjpzfSwKaEIoYSl7dmFyIHM9dGhpcy5hCmlmKGEubGVuZ3RoIT09cy5sZW5n
+dGgpcmV0dXJuITEKcmV0dXJuIFAuTlIoYSxzKX0sCm5tKGEsYil7dmFyIHMscixxLHAsbyxuLG0sbCxr
+LGo9dGhpcwp0LmM5LmEoYikKcz1qLmEKcj1zPT09ImZpbGUiCnE9ai5iCnA9ai5kCm89ai5jCmlmKCEo
+byE9bnVsbCkpbz1xLmxlbmd0aCE9PTB8fHAhPW51bGx8fHI/IiI6bnVsbApuPWouZQppZighciltPW8h
+PW51bGwmJm4ubGVuZ3RoIT09MAplbHNlIG09ITAKaWYobSYmIUMueEIubihuLCIvIikpbj0iLyIrbgps
+PW4Kaz1QLmxlKG51bGwsMCwwLGIpCnJldHVybiBuZXcgUC5EbihzLHEsbyxwLGwsayxqLnIpfSwKSmgo
+YSxiKXt2YXIgcyxyLHEscCxvLG4KZm9yKHM9MCxyPTA7Qy54Qi5RaShiLCIuLi8iLHIpOyl7cis9Mzsr
+K3N9cT1DLnhCLmNuKGEsIi8iKQp3aGlsZSghMCl7aWYoIShxPjAmJnM+MCkpYnJlYWsKcD1DLnhCLlBr
+KGEsIi8iLHEtMSkKaWYocDwwKWJyZWFrCm89cS1wCm49byE9PTIKaWYoIW58fG89PT0zKWlmKEMueEIu
+TyhhLHArMSk9PT00NiluPSFufHxDLnhCLk8oYSxwKzIpPT09NDYKZWxzZSBuPSExCmVsc2Ugbj0hMQpp
+ZihuKWJyZWFrOy0tcwpxPXB9cmV0dXJuIEMueEIuaTcoYSxxKzEsbnVsbCxDLnhCLnluKGIsci0zKnMp
+KX0sClpJKGEpe3JldHVybiB0aGlzLm1TKFAuaEsoYSkpfSwKbVMoYSl7dmFyIHMscixxLHAsbyxuLG0s
+bCxrLGosaT10aGlzLGg9bnVsbAppZihhLmdGaSgpLmxlbmd0aCE9PTApe3M9YS5nRmkoKQppZihhLmdj
+aigpKXtyPWEuZ2t1KCkKcT1hLmdKZihhKQpwPWEuZ3hBKCk/YS5ndHAoYSk6aH1lbHNle3A9aApxPXAK
+cj0iIn1vPVAueGUoYS5nSWkoYSkpCm49YS5nUUQoKT9hLmd0UCgpOmh9ZWxzZXtzPWkuYQppZihhLmdj
+aigpKXtyPWEuZ2t1KCkKcT1hLmdKZihhKQpwPVAud0IoYS5neEEoKT9hLmd0cChhKTpoLHMpCm89UC54
+ZShhLmdJaShhKSkKbj1hLmdRRCgpP2EuZ3RQKCk6aH1lbHNle3I9aS5iCnE9aS5jCnA9aS5kCm89aS5l
+CmlmKGEuZ0lpKGEpPT09IiIpbj1hLmdRRCgpP2EuZ3RQKCk6aS5mCmVsc2V7bT1QLnVqKGksbykKaWYo
+bT4wKXtsPUMueEIuTmoobywwLG0pCm89YS5ndFQoKT9sK1AueGUoYS5nSWkoYSkpOmwrUC54ZShpLkpo
+KEMueEIueW4obyxsLmxlbmd0aCksYS5nSWkoYSkpKX1lbHNlIGlmKGEuZ3RUKCkpbz1QLnhlKGEuZ0lp
+KGEpKQplbHNlIGlmKG8ubGVuZ3RoPT09MClpZihxPT1udWxsKW89cy5sZW5ndGg9PT0wP2EuZ0lpKGEp
+OlAueGUoYS5nSWkoYSkpCmVsc2Ugbz1QLnhlKCIvIithLmdJaShhKSkKZWxzZXtrPWkuSmgobyxhLmdJ
+aShhKSkKaj1zLmxlbmd0aD09PTAKaWYoIWp8fHEhPW51bGx8fEMueEIubihvLCIvIikpbz1QLnhlKGsp
+CmVsc2Ugbz1QLndGKGssIWp8fHEhPW51bGwpfW49YS5nUUQoKT9hLmd0UCgpOmh9fX1yZXR1cm4gbmV3
+IFAuRG4ocyxyLHEscCxvLG4sYS5nWjgoKT9hLmdLYSgpOmgpfSwKZ2NqKCl7cmV0dXJuIHRoaXMuYyE9
+bnVsbH0sCmd4QSgpe3JldHVybiB0aGlzLmQhPW51bGx9LApnUUQoKXtyZXR1cm4gdGhpcy5mIT1udWxs
+fSwKZ1o4KCl7cmV0dXJuIHRoaXMuciE9bnVsbH0sCmd0VCgpe3JldHVybiBDLnhCLm4odGhpcy5lLCIv
+Iil9LAp0NCgpe3ZhciBzLHI9dGhpcyxxPXIuYQppZihxIT09IiImJnEhPT0iZmlsZSIpdGhyb3cgSC5i
+KFAuTDQoIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSAiK3ErIiBVUkkiKSkKcT1yLmYK
+aWYoKHE9PW51bGw/IiI6cSkhPT0iIil0aHJvdyBILmIoUC5MNCh1LmkpKQpxPXIucgppZigocT09bnVs
+bD8iIjpxKSE9PSIiKXRocm93IEguYihQLkw0KHUubCkpCnE9JC53USgpCmlmKHEpcT1QLm1uKHIpCmVs
+c2V7aWYoci5jIT1udWxsJiZyLmdKZihyKSE9PSIiKUgudihQLkw0KHUuaikpCnM9ci5nRmooKQpQLmtF
+KHMsITEpCnE9UC5sKEMueEIubihyLmUsIi8iKT8iIisiLyI6IiIscywiLyIpCnE9cS5jaGFyQ29kZUF0
+KDApPT0wP3E6cX1yZXR1cm4gcX0sCncoYSl7cmV0dXJuIHRoaXMuZ25EKCl9LApETihhLGIpe3ZhciBz
+LHIscT10aGlzCmlmKGI9PW51bGwpcmV0dXJuITEKaWYocT09PWIpcmV0dXJuITAKaWYodC5kRC5iKGIp
+KWlmKHEuYT09PWIuZ0ZpKCkpaWYocS5jIT1udWxsPT09Yi5nY2ooKSlpZihxLmI9PT1iLmdrdSgpKWlm
+KHEuZ0pmKHEpPT09Yi5nSmYoYikpaWYocS5ndHAocSk9PT1iLmd0cChiKSlpZihxLmU9PT1iLmdJaShi
+KSl7cz1xLmYKcj1zPT1udWxsCmlmKCFyPT09Yi5nUUQoKSl7aWYocilzPSIiCmlmKHM9PT1iLmd0UCgp
+KXtzPXEucgpyPXM9PW51bGwKaWYoIXI9PT1iLmdaOCgpKXtpZihyKXM9IiIKcz1zPT09Yi5nS2EoKX1l
+bHNlIHM9ITF9ZWxzZSBzPSExfWVsc2Ugcz0hMX1lbHNlIHM9ITEKZWxzZSBzPSExCmVsc2Ugcz0hMQpl
+bHNlIHM9ITEKZWxzZSBzPSExCmVsc2Ugcz0hMQplbHNlIHM9ITEKcmV0dXJuIHN9LApzS3AoYSl7dGhp
+cy55PXQuYmsuYShhKX0sCnNOTShhKXt0aGlzLlE9dC5jWi5hKGEpfSwKJGlpRDoxLApnRmkoKXtyZXR1
+cm4gdGhpcy5hfSwKZ0lpKGEpe3JldHVybiB0aGlzLmV9fQpQLlJaLnByb3RvdHlwZT17CiQxKGEpe3Jl
+dHVybiBQLmVQKEMuWkosSC5uKGEpLEMueE0sITEpfSwKJFM6Mn0KUC5NRS5wcm90b3R5cGU9ewokMihh
+LGIpe3ZhciBzPXRoaXMuYixyPXRoaXMuYQpzLmErPXIuYQpyLmE9IiYiCnI9cy5hKz1QLmVQKEMuRjMs
+YSxDLnhNLCEwKQppZihiIT1udWxsJiZiLmxlbmd0aCE9PTApe3MuYT1yKyI9IgpzLmErPVAuZVAoQy5G
+MyxiLEMueE0sITApfX0sCiRTOjIyfQpQLnk1LnByb3RvdHlwZT17CiQyKGEsYil7dmFyIHMscgpILm4o
+YSkKaWYoYj09bnVsbHx8dHlwZW9mIGI9PSJzdHJpbmciKXRoaXMuYS4kMihhLEguayhiKSkKZWxzZSBm
+b3Iocz1KLklUKHQuYS5hKGIpKSxyPXRoaXMuYTtzLkYoKTspci4kMihhLEgubihzLmdsKCkpKX0sCiRT
+OjExfQpQLlBFLnByb3RvdHlwZT17CmdsUigpe3ZhciBzLHIscSxwLG89dGhpcyxuPW51bGwsbT1vLmMK
+aWYobT09bnVsbCl7bT1vLmIKaWYoMD49bS5sZW5ndGgpcmV0dXJuIEguT0gobSwwKQpzPW8uYQptPW1b
+MF0rMQpyPUMueEIuWFUocywiPyIsbSkKcT1zLmxlbmd0aAppZihyPj0wKXtwPVAuUEkocyxyKzEscSxD
+LlZDLCExKQpxPXJ9ZWxzZSBwPW4KbT1vLmM9bmV3IFAucWUoImRhdGEiLCIiLG4sbixQLlBJKHMsbSxx
+LEMuV2QsITEpLHAsbil9cmV0dXJuIG19LAp3KGEpe3ZhciBzLHI9dGhpcy5iCmlmKDA+PXIubGVuZ3Ro
+KXJldHVybiBILk9IKHIsMCkKcz10aGlzLmEKcmV0dXJuIHJbMF09PT0tMT8iZGF0YToiK3M6c319ClAu
+eUkucHJvdG90eXBlPXsKJDIoYSxiKXt2YXIgcz10aGlzLmEKaWYoYT49cy5sZW5ndGgpcmV0dXJuIEgu
+T0gocyxhKQpzPXNbYV0KQy5OQS5kdShzLDAsOTYsYikKcmV0dXJuIHN9LAokUzoyM30KUC5jNi5wcm90
+b3R5cGU9ewokMyhhLGIsYyl7dmFyIHMscixxCmZvcihzPWIubGVuZ3RoLHI9MDtyPHM7KytyKXtxPUMu
+eEIuVyhiLHIpXjk2CmlmKHE+PTk2KXJldHVybiBILk9IKGEscSkKYVtxXT1jfX0sCiRTOjE4fQpQLnFk
+LnByb3RvdHlwZT17CiQzKGEsYixjKXt2YXIgcyxyLHEKZm9yKHM9Qy54Qi5XKGIsMCkscj1DLnhCLlco
+YiwxKTtzPD1yOysrcyl7cT0oc145Nik+Pj4wCmlmKHE+PTk2KXJldHVybiBILk9IKGEscSkKYVtxXT1j
+fX0sCiRTOjE4fQpQLlVmLnByb3RvdHlwZT17Cmdjaigpe3JldHVybiB0aGlzLmM+MH0sCmd4QSgpe3Jl
+dHVybiB0aGlzLmM+MCYmdGhpcy5kKzE8dGhpcy5lfSwKZ1FEKCl7cmV0dXJuIHRoaXMuZjx0aGlzLnJ9
+LApnWjgoKXtyZXR1cm4gdGhpcy5yPHRoaXMuYS5sZW5ndGh9LApndFQoKXtyZXR1cm4gQy54Qi5RaSh0
+aGlzLmEsIi8iLHRoaXMuZSl9LApnRmkoKXt2YXIgcz10aGlzLngKcmV0dXJuIHM9PW51bGw/dGhpcy54
+PXRoaXMuVTIoKTpzfSwKVTIoKXt2YXIgcyxyPXRoaXMscT1yLmIKaWYocTw9MClyZXR1cm4iIgpzPXE9
+PT00CmlmKHMmJkMueEIubihyLmEsImh0dHAiKSlyZXR1cm4iaHR0cCIKaWYocT09PTUmJkMueEIubihy
+LmEsImh0dHBzIikpcmV0dXJuImh0dHBzIgppZihzJiZDLnhCLm4oci5hLCJmaWxlIikpcmV0dXJuImZp
+bGUiCmlmKHE9PT03JiZDLnhCLm4oci5hLCJwYWNrYWdlIikpcmV0dXJuInBhY2thZ2UiCnJldHVybiBD
+LnhCLk5qKHIuYSwwLHEpfSwKZ2t1KCl7dmFyIHM9dGhpcy5jLHI9dGhpcy5iKzMKcmV0dXJuIHM+cj9D
+LnhCLk5qKHRoaXMuYSxyLHMtMSk6IiJ9LApnSmYoYSl7dmFyIHM9dGhpcy5jCnJldHVybiBzPjA/Qy54
+Qi5Oaih0aGlzLmEscyx0aGlzLmQpOiIifSwKZ3RwKGEpe3ZhciBzLHI9dGhpcwppZihyLmd4QSgpKXJl
+dHVybiBQLlFBKEMueEIuTmooci5hLHIuZCsxLHIuZSksbnVsbCkKcz1yLmIKaWYocz09PTQmJkMueEIu
+bihyLmEsImh0dHAiKSlyZXR1cm4gODAKaWYocz09PTUmJkMueEIubihyLmEsImh0dHBzIikpcmV0dXJu
+IDQ0MwpyZXR1cm4gMH0sCmdJaShhKXtyZXR1cm4gQy54Qi5Oaih0aGlzLmEsdGhpcy5lLHRoaXMuZil9
+LApndFAoKXt2YXIgcz10aGlzLmYscj10aGlzLnIKcmV0dXJuIHM8cj9DLnhCLk5qKHRoaXMuYSxzKzEs
+cik6IiJ9LApnS2EoKXt2YXIgcz10aGlzLnIscj10aGlzLmEKcmV0dXJuIHM8ci5sZW5ndGg/Qy54Qi55
+bihyLHMrMSk6IiJ9LApnRmooKXt2YXIgcyxyLHE9dGhpcy5lLHA9dGhpcy5mLG89dGhpcy5hCmlmKEMu
+eEIuUWkobywiLyIscSkpKytxCmlmKHE9PT1wKXJldHVybiBDLnhECnM9SC5RSShbXSx0LnMpCmZvcihy
+PXE7cjxwOysrcilpZihDLnhCLk8obyxyKT09PTQ3KXtDLk5tLmkocyxDLnhCLk5qKG8scSxyKSkKcT1y
+KzF9Qy5ObS5pKHMsQy54Qi5OaihvLHEscCkpCnJldHVybiBQLkFGKHMsdC5OKX0sCmdoWSgpe2lmKHRo
+aXMuZj49dGhpcy5yKXJldHVybiBDLkNNCnJldHVybiBuZXcgUC5HaihQLldYKHRoaXMuZ3RQKCkpLHQu
+ZHcpfSwKa1goYSl7dmFyIHM9dGhpcy5kKzEKcmV0dXJuIHMrYS5sZW5ndGg9PT10aGlzLmUmJkMueEIu
+UWkodGhpcy5hLGEscyl9LApOOSgpe3ZhciBzPXRoaXMscj1zLnIscT1zLmEKaWYocj49cS5sZW5ndGgp
+cmV0dXJuIHMKcmV0dXJuIG5ldyBQLlVmKEMueEIuTmoocSwwLHIpLHMuYixzLmMscy5kLHMuZSxzLmYs
+cixzLngpfSwKbm0oYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpPXRoaXMsaD1udWxsCnQuYzku
+YShiKQpzPWkuZ0ZpKCkKcj1zPT09ImZpbGUiCnE9aS5jCnA9cT4wP0MueEIuTmooaS5hLGkuYiszLHEp
+OiIiCm89aS5neEEoKT9pLmd0cChpKTpoCnE9aS5jCmlmKHE+MCluPUMueEIuTmooaS5hLHEsaS5kKQpl
+bHNlIG49cC5sZW5ndGghPT0wfHxvIT1udWxsfHxyPyIiOmgKcT1pLmEKbT1DLnhCLk5qKHEsaS5lLGku
+ZikKaWYoIXIpbD1uIT1udWxsJiZtLmxlbmd0aCE9PTAKZWxzZSBsPSEwCmlmKGwmJiFDLnhCLm4obSwi
+LyIpKW09Ii8iK20Kaz1QLmxlKGgsMCwwLGIpCmw9aS5yCmo9bDxxLmxlbmd0aD9DLnhCLnluKHEsbCsx
+KTpoCnJldHVybiBuZXcgUC5EbihzLHAsbixvLG0sayxqKX0sClpJKGEpe3JldHVybiB0aGlzLm1TKFAu
+aEsoYSkpfSwKbVMoYSl7aWYoYSBpbnN0YW5jZW9mIFAuVWYpcmV0dXJuIHRoaXMudTEodGhpcyxhKQpy
+ZXR1cm4gdGhpcy5SZSgpLm1TKGEpfSwKdTEoYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgs
+ZyxmLGUsZCxjPWIuYgppZihjPjApcmV0dXJuIGIKcz1iLmMKaWYocz4wKXtyPWEuYgppZihyPD0wKXJl
+dHVybiBiCnE9cj09PTQKaWYocSYmQy54Qi5uKGEuYSwiZmlsZSIpKXA9Yi5lIT09Yi5mCmVsc2UgaWYo
+cSYmQy54Qi5uKGEuYSwiaHR0cCIpKXA9IWIua1goIjgwIikKZWxzZSBwPSEocj09PTUmJkMueEIubihh
+LmEsImh0dHBzIikpfHwhYi5rWCgiNDQzIikKaWYocCl7bz1yKzEKcmV0dXJuIG5ldyBQLlVmKEMueEIu
+TmooYS5hLDAsbykrQy54Qi55bihiLmEsYysxKSxyLHMrbyxiLmQrbyxiLmUrbyxiLmYrbyxiLnIrbyxh
+LngpfWVsc2UgcmV0dXJuIHRoaXMuUmUoKS5tUyhiKX1uPWIuZQpjPWIuZgppZihuPT09Yyl7cz1iLnIK
+aWYoYzxzKXtyPWEuZgpvPXItYwpyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxyKStDLnhCLnlu
+KGIuYSxjKSxhLmIsYS5jLGEuZCxhLmUsYytvLHMrbyxhLngpfWM9Yi5hCmlmKHM8Yy5sZW5ndGgpe3I9
+YS5yCnJldHVybiBuZXcgUC5VZihDLnhCLk5qKGEuYSwwLHIpK0MueEIueW4oYyxzKSxhLmIsYS5jLGEu
+ZCxhLmUsYS5mLHMrKHItcyksYS54KX1yZXR1cm4gYS5OOSgpfXM9Yi5hCmlmKEMueEIuUWkocywiLyIs
+bikpe209YS5lCmw9UC5SeCh0aGlzKQprPWw+MD9sOm0Kbz1rLW4KcmV0dXJuIG5ldyBQLlVmKEMueEIu
+TmooYS5hLDAsaykrQy54Qi55bihzLG4pLGEuYixhLmMsYS5kLG0sYytvLGIucitvLGEueCl9aj1hLmUK
+aT1hLmYKaWYoaj09PWkmJmEuYz4wKXtmb3IoO0MueEIuUWkocywiLi4vIixuKTspbis9MwpvPWotbisx
+CnJldHVybiBuZXcgUC5VZihDLnhCLk5qKGEuYSwwLGopKyIvIitDLnhCLnluKHMsbiksYS5iLGEuYyxh
+LmQsaixjK28sYi5yK28sYS54KX1oPWEuYQpsPVAuUngodGhpcykKaWYobD49MClnPWwKZWxzZSBmb3Io
+Zz1qO0MueEIuUWkoaCwiLi4vIixnKTspZys9MwpmPTAKd2hpbGUoITApe2U9biszCmlmKCEoZTw9YyYm
+Qy54Qi5RaShzLCIuLi8iLG4pKSlicmVhazsrK2YKbj1lfWZvcihkPSIiO2k+Zzspey0taQppZihDLnhC
+Lk8oaCxpKT09PTQ3KXtpZihmPT09MCl7ZD0iLyIKYnJlYWt9LS1mCmQ9Ii8ifX1pZihpPT09ZyYmYS5i
+PD0wJiYhQy54Qi5RaShoLCIvIixqKSl7bi09ZiozCmQ9IiJ9bz1pLW4rZC5sZW5ndGgKcmV0dXJuIG5l
+dyBQLlVmKEMueEIuTmooaCwwLGkpK2QrQy54Qi55bihzLG4pLGEuYixhLmMsYS5kLGosYytvLGIucitv
+LGEueCl9LAp0NCgpe3ZhciBzLHIscT10aGlzLHA9cS5iCmlmKHA+PTApe3M9IShwPT09NCYmQy54Qi5u
+KHEuYSwiZmlsZSIpKQpwPXN9ZWxzZSBwPSExCmlmKHApdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRy
+YWN0IGEgZmlsZSBwYXRoIGZyb20gYSAiK3EuZ0ZpKCkrIiBVUkkiKSkKcD1xLmYKcz1xLmEKaWYocDxz
+Lmxlbmd0aCl7aWYocDxxLnIpdGhyb3cgSC5iKFAuTDQodS5pKSkKdGhyb3cgSC5iKFAuTDQodS5sKSl9
+cj0kLndRKCkKaWYocilwPVAubW4ocSkKZWxzZXtpZihxLmM8cS5kKUgudihQLkw0KHUuaikpCnA9Qy54
+Qi5OaihzLHEuZSxwKX1yZXR1cm4gcH0sCmdpTyhhKXt2YXIgcz10aGlzLnkKcmV0dXJuIHM9PW51bGw/
+dGhpcy55PUMueEIuZ2lPKHRoaXMuYSk6c30sCkROKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQppZih0
+aGlzPT09YilyZXR1cm4hMApyZXR1cm4gdC5kRC5iKGIpJiZ0aGlzLmE9PT1iLncoMCl9LApSZSgpe3Zh
+ciBzPXRoaXMscj1udWxsLHE9cy5nRmkoKSxwPXMuZ2t1KCksbz1zLmM+MD9zLmdKZihzKTpyLG49cy5n
+eEEoKT9zLmd0cChzKTpyLG09cy5hLGw9cy5mLGs9Qy54Qi5OaihtLHMuZSxsKSxqPXMucgpsPWw8aj9z
+Lmd0UCgpOnIKcmV0dXJuIG5ldyBQLkRuKHEscCxvLG4sayxsLGo8bS5sZW5ndGg/cy5nS2EoKTpyKX0s
+CncoYSl7cmV0dXJuIHRoaXMuYX0sCiRpaUQ6MX0KUC5xZS5wcm90b3R5cGU9e30KVy5xRS5wcm90b3R5
+cGU9e30KVy5HaC5wcm90b3R5cGU9ewpzTFUoYSxiKXthLmhyZWY9Yn0sCncoYSl7cmV0dXJuIFN0cmlu
+ZyhhKX0sCiRpR2g6MX0KVy5mWS5wcm90b3R5cGU9ewp3KGEpe3JldHVybiBTdHJpbmcoYSl9fQpXLnJa
+LnByb3RvdHlwZT17JGlyWjoxfQpXLkF6LnByb3RvdHlwZT17JGlBejoxfQpXLlFQLnByb3RvdHlwZT17
+JGlRUDoxfQpXLm54LnByb3RvdHlwZT17CmdBKGEpe3JldHVybiBhLmxlbmd0aH19Clcub0oucHJvdG90
+eXBlPXsKZ0EoYSl7cmV0dXJuIGEubGVuZ3RofX0KVy5pZC5wcm90b3R5cGU9e30KVy5RRi5wcm90b3R5
+cGU9e30KVy5OaC5wcm90b3R5cGU9ewp3KGEpe3JldHVybiBTdHJpbmcoYSl9fQpXLmFlLnByb3RvdHlw
+ZT17CkRjKGEsYil7cmV0dXJuIGEuY3JlYXRlSFRNTERvY3VtZW50KGIpfX0KVy5JQi5wcm90b3R5cGU9
+ewp3KGEpe3ZhciBzLHI9YS5sZWZ0CnIudG9TdHJpbmcKcj0iUmVjdGFuZ2xlICgiK0guRWoocikrIiwg
+IgpzPWEudG9wCnMudG9TdHJpbmcKcz1yK0guRWoocykrIikgIgpyPWEud2lkdGgKci50b1N0cmluZwpy
+PXMrSC5FaihyKSsiIHggIgpzPWEuaGVpZ2h0CnMudG9TdHJpbmcKcmV0dXJuIHIrSC5FaihzKX0sCkRO
+KGEsYil7dmFyIHMscgppZihiPT1udWxsKXJldHVybiExCmlmKHQucS5iKGIpKXtzPWEubGVmdApzLnRv
+U3RyaW5nCnI9Yi5sZWZ0CnIudG9TdHJpbmcKaWYocz09PXIpe3M9YS50b3AKcy50b1N0cmluZwpyPWIu
+dG9wCnIudG9TdHJpbmcKaWYocz09PXIpe3M9YS53aWR0aApzLnRvU3RyaW5nCnI9Yi53aWR0aApyLnRv
+U3RyaW5nCmlmKHM9PT1yKXtzPWEuaGVpZ2h0CnMudG9TdHJpbmcKcj1iLmhlaWdodApyLnRvU3RyaW5n
+CnI9cz09PXIKcz1yfWVsc2Ugcz0hMX1lbHNlIHM9ITF9ZWxzZSBzPSExfWVsc2Ugcz0hMQpyZXR1cm4g
+c30sCmdpTyhhKXt2YXIgcyxyLHEscD1hLmxlZnQKcC50b1N0cmluZwpwPUMuQ0QuZ2lPKHApCnM9YS50
+b3AKcy50b1N0cmluZwpzPUMuQ0QuZ2lPKHMpCnI9YS53aWR0aApyLnRvU3RyaW5nCnI9Qy5DRC5naU8o
+cikKcT1hLmhlaWdodApxLnRvU3RyaW5nCnJldHVybiBXLnJFKHAscyxyLEMuQ0QuZ2lPKHEpKX0sCiRp
+dG46MX0KVy5uNy5wcm90b3R5cGU9ewpnQShhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLnd6LnByb3RvdHlw
+ZT17CmdBKGEpe3JldHVybiB0aGlzLmEubGVuZ3RofSwKcShhLGIpe3ZhciBzCkguSVooYikKcz10aGlz
+LmEKaWYoYjwwfHxiPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLGIpCnJldHVybiB0aGlzLiR0aS5jLmEo
+c1tiXSl9LApZNShhLGIsYyl7dGhpcy4kdGkuYy5hKGMpCnRocm93IEguYihQLkw0KCJDYW5ub3QgbW9k
+aWZ5IGxpc3QiKSl9fQpXLmN2LnByb3RvdHlwZT17CmdRZyhhKXtyZXR1cm4gbmV3IFcuaTcoYSl9LApn
+UChhKXtyZXR1cm4gbmV3IFcuSTQoYSl9LApzUChhLGIpe3ZhciBzCnQuTy5hKGIpCnM9dGhpcy5nUChh
+KQpzLlYxKDApCnMuRlYoMCxiKX0sCncoYSl7cmV0dXJuIGEubG9jYWxOYW1lfSwKRkYoYSl7dmFyIHM9
+ISFhLnNjcm9sbEludG9WaWV3SWZOZWVkZWQKaWYocylhLnNjcm9sbEludG9WaWV3SWZOZWVkZWQoKQpl
+bHNlIGEuc2Nyb2xsSW50b1ZpZXcoKX0sCm56KGEsYixjLGQsZSl7dmFyIHMscj10aGlzLnI2KGEsYyxk
+LGUpCnN3aXRjaChiLnRvTG93ZXJDYXNlKCkpe2Nhc2UiYmVmb3JlYmVnaW4iOnM9YS5wYXJlbnROb2Rl
+CnMudG9TdHJpbmcKSi5FaChzLHIsYSkKYnJlYWsKY2FzZSJhZnRlcmJlZ2luIjpzPWEuY2hpbGROb2Rl
+cwp0aGlzLm1LKGEscixzLmxlbmd0aD4wP3NbMF06bnVsbCkKYnJlYWsKY2FzZSJiZWZvcmVlbmQiOmEu
+YXBwZW5kQ2hpbGQocikKYnJlYWsKY2FzZSJhZnRlcmVuZCI6cz1hLnBhcmVudE5vZGUKcy50b1N0cmlu
+ZwpKLkVoKHMscixhLm5leHRTaWJsaW5nKQpicmVhawpkZWZhdWx0OkgudihQLnhZKCJJbnZhbGlkIHBv
+c2l0aW9uICIrYixudWxsKSl9fSwKcjYoYSxiLGMsZCl7dmFyIHMscixxLHAKaWYoYz09bnVsbCl7aWYo
+ZD09bnVsbCl7cz0kLmx0CmlmKHM9PW51bGwpe3M9SC5RSShbXSx0LnUpCnI9bmV3IFcudkQocykKQy5O
+bS5pKHMsVy5UdyhudWxsKSkKQy5ObS5pKHMsVy5CbCgpKQokLmx0PXIKZD1yfWVsc2UgZD1zfXM9JC5F
+VQppZihzPT1udWxsKXtzPW5ldyBXLktvKGQpCiQuRVU9cwpjPXN9ZWxzZXtzLmE9ZApjPXN9fWVsc2Ug
+aWYoZCE9bnVsbCl0aHJvdyBILmIoUC54WSgidmFsaWRhdG9yIGNhbiBvbmx5IGJlIHBhc3NlZCBpZiB0
+cmVlU2FuaXRpemVyIGlzIG51bGwiLG51bGwpKQppZigkLnhvPT1udWxsKXtzPWRvY3VtZW50CnI9cy5p
+bXBsZW1lbnRhdGlvbgpyLnRvU3RyaW5nCnI9Qy5tSC5EYyhyLCIiKQokLnhvPXIKJC5CTz1yLmNyZWF0
+ZVJhbmdlKCkKcj0kLnhvLmNyZWF0ZUVsZW1lbnQoImJhc2UiKQp0LmNSLmEocikKcz1zLmJhc2VVUkkK
+cy50b1N0cmluZwpyLmhyZWY9cwokLnhvLmhlYWQuYXBwZW5kQ2hpbGQocil9cz0kLnhvCmlmKHMuYm9k
+eT09bnVsbCl7cj1zLmNyZWF0ZUVsZW1lbnQoImJvZHkiKQpDLkJaLnNHUyhzLHQubS5hKHIpKX1zPSQu
+eG8KaWYodC5tLmIoYSkpe3M9cy5ib2R5CnMudG9TdHJpbmcKcT1zfWVsc2V7cy50b1N0cmluZwpxPXMu
+Y3JlYXRlRWxlbWVudChhLnRhZ05hbWUpCiQueG8uYm9keS5hcHBlbmRDaGlsZChxKX1pZigiY3JlYXRl
+Q29udGV4dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cuUmFuZ2UucHJvdG90eXBlJiYhQy5ObS50ZyhDLlNx
+LGEudGFnTmFtZSkpeyQuQk8uc2VsZWN0Tm9kZUNvbnRlbnRzKHEpCnM9JC5CTwpzLnRvU3RyaW5nCnA9
+cy5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoYj09bnVsbD8ibnVsbCI6Yil9ZWxzZXtKLndmKHEsYikK
+cD0kLnhvLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpmb3IoO3M9cS5maXJzdENoaWxkLHMhPW51bGw7
+KXAuYXBwZW5kQ2hpbGQocyl9aWYocSE9PSQueG8uYm9keSlKLkx0KHEpCmMuUG4ocCkKZG9jdW1lbnQu
+YWRvcHROb2RlKHApCnJldHVybiBwfSwKQUgoYSxiLGMpe3JldHVybiB0aGlzLnI2KGEsYixjLG51bGwp
+fSwKc2hmKGEsYil7dGhpcy5ZQyhhLGIpfSwKcGsoYSxiLGMpe3RoaXMuc2E0KGEsbnVsbCkKYS5hcHBl
+bmRDaGlsZCh0aGlzLnI2KGEsYixudWxsLGMpKX0sCllDKGEsYil7cmV0dXJuIHRoaXMucGsoYSxiLG51
+bGwpfSwKc1JOKGEsYil7YS5pbm5lckhUTUw9Yn0sCmducyhhKXtyZXR1cm4gYS50YWdOYW1lfSwKZ1Zs
+KGEpe3JldHVybiBuZXcgVy5DcShhLCJjbGljayIsITEsdC5RKX0sCiRpY3Y6MX0KVy5Ddi5wcm90b3R5
+cGU9ewokMShhKXtyZXR1cm4gdC5oLmIodC5BLmEoYSkpfSwKJFM6MjV9ClcuZWEucHJvdG90eXBlPXsk
+aWVhOjF9ClcuRDAucHJvdG90eXBlPXsKT24oYSxiLGMsZCl7dC5idy5hKGMpCmlmKGMhPW51bGwpdGhp
+cy52KGEsYixjLGQpfSwKQihhLGIsYyl7cmV0dXJuIHRoaXMuT24oYSxiLGMsbnVsbCl9LAp2KGEsYixj
+LGQpe3JldHVybiBhLmFkZEV2ZW50TGlzdGVuZXIoYixILnRSKHQuYncuYShjKSwxKSxkKX0sCiRpRDA6
+MX0KVy5oSC5wcm90b3R5cGU9eyRpaEg6MX0KVy5oNC5wcm90b3R5cGU9ewpnQShhKXtyZXR1cm4gYS5s
+ZW5ndGh9fQpXLmJyLnByb3RvdHlwZT17CmdBKGEpe3JldHVybiBhLmxlbmd0aH19ClcuVmIucHJvdG90
+eXBlPXsKc0dTKGEsYil7YS5ib2R5PWJ9fQpXLmZKLnByb3RvdHlwZT17CmVvKGEsYixjLGQpe3JldHVy
+biBhLm9wZW4oYixjLCEwKX0sCiRpZko6MX0KVy53YS5wcm90b3R5cGU9e30KVy5TZy5wcm90b3R5cGU9
+eyRpU2c6MX0KVy51OC5wcm90b3R5cGU9ewpnRHIoYSl7aWYoIm9yaWdpbiIgaW4gYSlyZXR1cm4gYS5v
+cmlnaW4KcmV0dXJuIGEucHJvdG9jb2wrIi8vIithLmhvc3R9LAp3KGEpe3JldHVybiBTdHJpbmcoYSl9
+LAokaXU4OjF9ClcuQWoucHJvdG90eXBlPXskaUFqOjF9ClcuZTcucHJvdG90eXBlPXsKZ3I4KGEpe3Zh
+ciBzPXRoaXMuYSxyPXMuY2hpbGROb2Rlcy5sZW5ndGgKaWYocj09PTApdGhyb3cgSC5iKFAuUFYoIk5v
+IGVsZW1lbnRzIikpCmlmKHI+MSl0aHJvdyBILmIoUC5QVigiTW9yZSB0aGFuIG9uZSBlbGVtZW50Iikp
+CnM9cy5maXJzdENoaWxkCnMudG9TdHJpbmcKcmV0dXJuIHN9LApGVihhLGIpe3ZhciBzLHIscSxwLG8K
+dC5laC5hKGIpCmlmKGIgaW5zdGFuY2VvZiBXLmU3KXtzPWIuYQpyPXRoaXMuYQppZihzIT09cilmb3Io
+cT1zLmNoaWxkTm9kZXMubGVuZ3RoLHA9MDtwPHE7KytwKXtvPXMuZmlyc3RDaGlsZApvLnRvU3RyaW5n
+CnIuYXBwZW5kQ2hpbGQobyl9cmV0dXJufWZvcihzPWIuZ20oYikscj10aGlzLmE7cy5GKCk7KXIuYXBw
+ZW5kQ2hpbGQocy5nbCgpKX0sClk1KGEsYixjKXt2YXIgcyxyCnQuQS5hKGMpCnM9dGhpcy5hCnI9cy5j
+aGlsZE5vZGVzCmlmKGI8MHx8Yj49ci5sZW5ndGgpcmV0dXJuIEguT0gocixiKQpzLnJlcGxhY2VDaGls
+ZChjLHJbYl0pfSwKZ20oYSl7dmFyIHM9dGhpcy5hLmNoaWxkTm9kZXMKcmV0dXJuIG5ldyBXLlc5KHMs
+cy5sZW5ndGgsSC56SyhzKS5DKCJXOTxHbS5FPiIpKX0sCmdBKGEpe3JldHVybiB0aGlzLmEuY2hpbGRO
+b2Rlcy5sZW5ndGh9LApxKGEsYil7dmFyIHMKSC5JWihiKQpzPXRoaXMuYS5jaGlsZE5vZGVzCmlmKGI8
+MHx8Yj49cy5sZW5ndGgpcmV0dXJuIEguT0gocyxiKQpyZXR1cm4gc1tiXX19ClcuS1YucHJvdG90eXBl
+PXsKd2coYSl7dmFyIHM9YS5wYXJlbnROb2RlCmlmKHMhPW51bGwpcy5yZW1vdmVDaGlsZChhKX0sCkQ0
+KGEpe3ZhciBzCmZvcig7cz1hLmZpcnN0Q2hpbGQscyE9bnVsbDspYS5yZW1vdmVDaGlsZChzKX0sCnco
+YSl7dmFyIHM9YS5ub2RlVmFsdWUKcmV0dXJuIHM9PW51bGw/dGhpcy5VKGEpOnN9LApzYTQoYSxiKXth
+LnRleHRDb250ZW50PWJ9LAptSyhhLGIsYyl7cmV0dXJuIGEuaW5zZXJ0QmVmb3JlKGIsYyl9LAokaUtW
+OjF9ClcuQkgucHJvdG90eXBlPXsKZ0EoYSl7cmV0dXJuIGEubGVuZ3RofSwKcShhLGIpe0guSVooYikK
+aWYoYj4+PjAhPT1ifHxiPj1hLmxlbmd0aCl0aHJvdyBILmIoUC5DZihiLGEsbnVsbCxudWxsLG51bGwp
+KQpyZXR1cm4gYVtiXX0sClk1KGEsYixjKXt0LkEuYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGFz
+c2lnbiBlbGVtZW50IG9mIGltbXV0YWJsZSBMaXN0LiIpKX0sCmd0SChhKXtpZihhLmxlbmd0aD4wKXJl
+dHVybiBhWzBdCnRocm93IEguYihQLlBWKCJObyBlbGVtZW50cyIpKX0sCkUoYSxiKXtpZihiPDB8fGI+
+PWEubGVuZ3RoKXJldHVybiBILk9IKGEsYikKcmV0dXJuIGFbYl19LAokaWJROjEsCiRpWGo6MSwKJGlj
+WDoxLAokaXpNOjF9ClcuU04ucHJvdG90eXBlPXt9ClcuZXcucHJvdG90eXBlPXskaWV3OjF9ClcubHAu
+cHJvdG90eXBlPXsKZ0EoYSl7cmV0dXJuIGEubGVuZ3RofX0KVy5UYi5wcm90b3R5cGU9ewpyNihhLGIs
+YyxkKXt2YXIgcyxyCmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5w
+cm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMsZCkKcz1XLlU5KCI8dGFibGU+IitILkVqKGIpKyI8
+L3RhYmxlPiIsYyxkKQpyPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpuZXcgVy5lNyhy
+KS5GVigwLG5ldyBXLmU3KHMpKQpyZXR1cm4gcn19ClcuSXYucHJvdG90eXBlPXsKcjYoYSxiLGMsZCl7
+dmFyIHMscgppZigiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cuUmFuZ2UucHJvdG90
+eXBlKXJldHVybiB0aGlzLkRXKGEsYixjLGQpCnM9ZG9jdW1lbnQKcj1zLmNyZWF0ZURvY3VtZW50RnJh
+Z21lbnQoKQpzPW5ldyBXLmU3KEMuSWUucjYocy5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpLGIsYyxkKSkK
+cz1uZXcgVy5lNyhzLmdyOChzKSkKbmV3IFcuZTcocikuRlYoMCxuZXcgVy5lNyhzLmdyOChzKSkpCnJl
+dHVybiByfX0KVy5XUC5wcm90b3R5cGU9ewpyNihhLGIsYyxkKXt2YXIgcyxyCmlmKCJjcmVhdGVDb250
+ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxi
+LGMsZCkKcz1kb2N1bWVudApyPXMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCnM9bmV3IFcuZTcoQy5J
+ZS5yNihzLmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksYixjLGQpKQpuZXcgVy5lNyhyKS5GVigwLG5ldyBX
+LmU3KHMuZ3I4KHMpKSkKcmV0dXJuIHJ9fQpXLnlZLnByb3RvdHlwZT17CnBrKGEsYixjKXt2YXIgcyxy
+CnRoaXMuc2E0KGEsbnVsbCkKcz1hLmNvbnRlbnQKcy50b1N0cmluZwpKLmJUKHMpCnI9dGhpcy5yNihh
+LGIsbnVsbCxjKQphLmNvbnRlbnQuYXBwZW5kQ2hpbGQocil9LApZQyhhLGIpe3JldHVybiB0aGlzLnBr
+KGEsYixudWxsKX0sCiRpeVk6MX0KVy53Ni5wcm90b3R5cGU9e30KVy5LNS5wcm90b3R5cGU9ewpQbyhh
+LGIsYyl7dmFyIHM9Vy5QMShhLm9wZW4oYixjKSkKcmV0dXJuIHN9LApnbVcoYSl7cmV0dXJuIHQuRi5h
+KGEubG9jYXRpb24pfSwKdXMoYSxiKXtyZXR1cm4gYS5jb25maXJtKGIpfSwKJGlLNToxLAokaXY2OjF9
+ClcuQ20ucHJvdG90eXBlPXskaUNtOjF9ClcuQ1EucHJvdG90eXBlPXskaUNROjF9ClcudzQucHJvdG90
+eXBlPXsKdyhhKXt2YXIgcyxyPWEubGVmdApyLnRvU3RyaW5nCnI9IlJlY3RhbmdsZSAoIitILkVqKHIp
+KyIsICIKcz1hLnRvcApzLnRvU3RyaW5nCnM9citILkVqKHMpKyIpICIKcj1hLndpZHRoCnIudG9TdHJp
+bmcKcj1zK0guRWoocikrIiB4ICIKcz1hLmhlaWdodApzLnRvU3RyaW5nCnJldHVybiByK0guRWoocyl9
+LApETihhLGIpe3ZhciBzLHIKaWYoYj09bnVsbClyZXR1cm4hMQppZih0LnEuYihiKSl7cz1hLmxlZnQK
+cy50b1N0cmluZwpyPWIubGVmdApyLnRvU3RyaW5nCmlmKHM9PT1yKXtzPWEudG9wCnMudG9TdHJpbmcK
+cj1iLnRvcApyLnRvU3RyaW5nCmlmKHM9PT1yKXtzPWEud2lkdGgKcy50b1N0cmluZwpyPWIud2lkdGgK
+ci50b1N0cmluZwppZihzPT09cil7cz1hLmhlaWdodApzLnRvU3RyaW5nCnI9Yi5oZWlnaHQKci50b1N0
+cmluZwpyPXM9PT1yCnM9cn1lbHNlIHM9ITF9ZWxzZSBzPSExfWVsc2Ugcz0hMX1lbHNlIHM9ITEKcmV0
+dXJuIHN9LApnaU8oYSl7dmFyIHMscixxLHA9YS5sZWZ0CnAudG9TdHJpbmcKcD1DLkNELmdpTyhwKQpz
+PWEudG9wCnMudG9TdHJpbmcKcz1DLkNELmdpTyhzKQpyPWEud2lkdGgKci50b1N0cmluZwpyPUMuQ0Qu
+Z2lPKHIpCnE9YS5oZWlnaHQKcS50b1N0cmluZwpyZXR1cm4gVy5yRShwLHMscixDLkNELmdpTyhxKSl9
+fQpXLnJoLnByb3RvdHlwZT17CmdBKGEpe3JldHVybiBhLmxlbmd0aH0sCnEoYSxiKXtILklaKGIpCmlm
+KGI+Pj4wIT09Ynx8Yj49YS5sZW5ndGgpdGhyb3cgSC5iKFAuQ2YoYixhLG51bGwsbnVsbCxudWxsKSkK
+cmV0dXJuIGFbYl19LApZNShhLGIsYyl7dC5BLmEoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBhc3Np
+Z24gZWxlbWVudCBvZiBpbW11dGFibGUgTGlzdC4iKSl9LApFKGEsYil7aWYoYjwwfHxiPj1hLmxlbmd0
+aClyZXR1cm4gSC5PSChhLGIpCnJldHVybiBhW2JdfSwKJGliUToxLAokaVhqOjEsCiRpY1g6MSwKJGl6
+TToxfQpXLmNmLnByb3RvdHlwZT17CksoYSxiKXt2YXIgcyxyLHEscCxvCnQuZUEuYShiKQpmb3Iocz10
+aGlzLmd2YygpLHI9cy5sZW5ndGgscT10aGlzLmEscD0wO3A8cy5sZW5ndGg7cy5sZW5ndGg9PT1yfHwo
+MCxILmxrKShzKSwrK3Ape289c1twXQpiLiQyKG8sSC5uKHEuZ2V0QXR0cmlidXRlKG8pKSl9fSwKZ3Zj
+KCl7dmFyIHMscixxLHAsbyxuLG09dGhpcy5hLmF0dHJpYnV0ZXMKbS50b1N0cmluZwpzPUguUUkoW10s
+dC5zKQpmb3Iocj1tLmxlbmd0aCxxPXQuaDkscD0wO3A8cjsrK3Ape2lmKHA+PW0ubGVuZ3RoKXJldHVy
+biBILk9IKG0scCkKbz1xLmEobVtwXSkKaWYoby5uYW1lc3BhY2VVUkk9PW51bGwpe249by5uYW1lCm4u
+dG9TdHJpbmcKQy5ObS5pKHMsbil9fXJldHVybiBzfSwKZ2wwKGEpe3JldHVybiB0aGlzLmd2YygpLmxl
+bmd0aD09PTB9fQpXLmk3LnByb3RvdHlwZT17Cng0KGEpe3ZhciBzPXRoaXMuYS5oYXNBdHRyaWJ1dGUo
+YSkKcmV0dXJuIHN9LApxKGEsYil7cmV0dXJuIHRoaXMuYS5nZXRBdHRyaWJ1dGUoSC5uKGIpKX0sClk1
+KGEsYixjKXt0aGlzLmEuc2V0QXR0cmlidXRlKGIsYyl9LApnQShhKXtyZXR1cm4gdGhpcy5ndmMoKS5s
+ZW5ndGh9fQpXLlN5LnByb3RvdHlwZT17Cng0KGEpe3ZhciBzPXRoaXMuYS5hLmhhc0F0dHJpYnV0ZSgi
+ZGF0YS0iK3RoaXMuT1UoYSkpCnJldHVybiBzfSwKcShhLGIpe3JldHVybiB0aGlzLmEuYS5nZXRBdHRy
+aWJ1dGUoImRhdGEtIit0aGlzLk9VKEgubihiKSkpfSwKWTUoYSxiLGMpe3RoaXMuYS5hLnNldEF0dHJp
+YnV0ZSgiZGF0YS0iK3RoaXMuT1UoYiksYyl9LApLKGEsYil7dGhpcy5hLksoMCxuZXcgVy5LUyh0aGlz
+LHQuZUEuYShiKSkpfSwKZ3ZjKCl7dmFyIHM9SC5RSShbXSx0LnMpCnRoaXMuYS5LKDAsbmV3IFcuQTMo
+dGhpcyxzKSkKcmV0dXJuIHN9LApnQShhKXtyZXR1cm4gdGhpcy5ndmMoKS5sZW5ndGh9LApnbDAoYSl7
+cmV0dXJuIHRoaXMuZ3ZjKCkubGVuZ3RoPT09MH0sCnhxKGEpe3ZhciBzLHIscT1ILlFJKGEuc3BsaXQo
+Ii0iKSx0LnMpCmZvcihzPTE7czxxLmxlbmd0aDsrK3Mpe3I9cVtzXQppZihyLmxlbmd0aD4wKUMuTm0u
+WTUocSxzLHJbMF0udG9VcHBlckNhc2UoKStDLnhCLnluKHIsMSkpfXJldHVybiBDLk5tLmsocSwiIil9
+LApPVShhKXt2YXIgcyxyLHEscCxvCmZvcihzPWEubGVuZ3RoLHI9MCxxPSIiO3I8czsrK3Ipe3A9YVty
+XQpvPXAudG9Mb3dlckNhc2UoKQpxPShwIT09byYmcj4wP3ErIi0iOnEpK299cmV0dXJuIHEuY2hhckNv
+ZGVBdCgwKT09MD9xOnF9fQpXLktTLnByb3RvdHlwZT17CiQyKGEsYil7aWYoQy54Qi5uKGEsImRhdGEt
+IikpdGhpcy5iLiQyKHRoaXMuYS54cShDLnhCLnluKGEsNSkpLGIpfSwKJFM6OH0KVy5BMy5wcm90b3R5
+cGU9ewokMihhLGIpe2lmKEMueEIubihhLCJkYXRhLSIpKUMuTm0uaSh0aGlzLmIsdGhpcy5hLnhxKEMu
+eEIueW4oYSw1KSkpfSwKJFM6OH0KVy5JNC5wcm90b3R5cGU9ewpEKCl7dmFyIHMscixxLHAsbz1QLkxz
+KHQuTikKZm9yKHM9dGhpcy5hLmNsYXNzTmFtZS5zcGxpdCgiICIpLHI9cy5sZW5ndGgscT0wO3E8cjsr
+K3Epe3A9Si5UMChzW3FdKQppZihwLmxlbmd0aCE9PTApby5pKDAscCl9cmV0dXJuIG99LApYKGEpe3Ro
+aXMuYS5jbGFzc05hbWU9dC5DLmEoYSkuaygwLCIgIil9LApnQShhKXtyZXR1cm4gdGhpcy5hLmNsYXNz
+TGlzdC5sZW5ndGh9LApnbDAoYSl7cmV0dXJuIHRoaXMuYS5jbGFzc0xpc3QubGVuZ3RoPT09MH0sCmdv
+cihhKXtyZXR1cm4gdGhpcy5hLmNsYXNzTGlzdC5sZW5ndGghPT0wfSwKVjEoYSl7dGhpcy5hLmNsYXNz
+TmFtZT0iIn0sCnRnKGEsYil7dmFyIHM9dGhpcy5hLmNsYXNzTGlzdC5jb250YWlucyhiKQpyZXR1cm4g
+c30sCmkoYSxiKXt2YXIgcyxyCkgubihiKQpzPXRoaXMuYS5jbGFzc0xpc3QKcj1zLmNvbnRhaW5zKGIp
+CnMuYWRkKGIpCnJldHVybiFyfSwKUihhLGIpe3ZhciBzLHIscQppZih0eXBlb2YgYj09InN0cmluZyIp
+e3M9dGhpcy5hLmNsYXNzTGlzdApyPXMuY29udGFpbnMoYikKcy5yZW1vdmUoYikKcT1yfWVsc2UgcT0h
+MQpyZXR1cm4gcX0sCkZWKGEsYil7Vy5UTih0aGlzLmEsdC5PLmEoYikpfX0KVy5Gay5wcm90b3R5cGU9
+e30KVy5STy5wcm90b3R5cGU9e30KVy5DcS5wcm90b3R5cGU9e30KVy54Qy5wcm90b3R5cGU9e30KVy52
+Ti5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdGhpcy5hLiQxKHQuQi5hKGEpKX0sCiRTOjI3fQpXLkpR
+LnByb3RvdHlwZT17CkNZKGEpe3ZhciBzCmlmKCQub3IuZ2wwKCQub3IpKXtmb3Iocz0wO3M8MjYyOysr
+cykkLm9yLlk1KDAsQy5jbVtzXSxXLnBTKCkpCmZvcihzPTA7czwxMjsrK3MpJC5vci5ZNSgwLEMuQklb
+c10sVy5WNCgpKX19LAppMChhKXtyZXR1cm4gJC5BTigpLnRnKDAsVy5yUyhhKSl9LApFYihhLGIsYyl7
+dmFyIHM9JC5vci5xKDAsVy5yUyhhKSsiOjoiK2IpCmlmKHM9PW51bGwpcz0kLm9yLnEoMCwiKjo6Iiti
+KQppZihzPT1udWxsKXJldHVybiExCnJldHVybiBILnA4KHMuJDQoYSxiLGMsdGhpcykpfSwKJGlrRjox
+fQpXLkdtLnByb3RvdHlwZT17CmdtKGEpe3JldHVybiBuZXcgVy5XOShhLHRoaXMuZ0EoYSksSC56Syhh
+KS5DKCJXOTxHbS5FPiIpKX19ClcudkQucHJvdG90eXBlPXsKaTAoYSl7cmV0dXJuIEMuTm0uVnIodGhp
+cy5hLG5ldyBXLlV2KGEpKX0sCkViKGEsYixjKXtyZXR1cm4gQy5ObS5Wcih0aGlzLmEsbmV3IFcuRWco
+YSxiLGMpKX0sCiRpa0Y6MX0KVy5Vdi5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdC5mNi5hKGEpLmkw
+KHRoaXMuYSl9LAokUzoxNn0KVy5FZy5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdC5mNi5hKGEpLkVi
+KHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0sCiRTOjE2fQpXLm02LnByb3RvdHlwZT17CkNZKGEsYixjLGQp
+e3ZhciBzLHIscQp0aGlzLmEuRlYoMCxjKQpzPWIuZXYoMCxuZXcgVy5FbygpKQpyPWIuZXYoMCxuZXcg
+Vy5XaygpKQp0aGlzLmIuRlYoMCxzKQpxPXRoaXMuYwpxLkZWKDAsQy54RCkKcS5GVigwLHIpfSwKaTAo
+YSl7cmV0dXJuIHRoaXMuYS50ZygwLFcuclMoYSkpfSwKRWIoYSxiLGMpe3ZhciBzPXRoaXMscj1XLnJT
+KGEpLHE9cy5jCmlmKHEudGcoMCxyKyI6OiIrYikpcmV0dXJuIHMuZC5EdChjKQplbHNlIGlmKHEudGco
+MCwiKjo6IitiKSlyZXR1cm4gcy5kLkR0KGMpCmVsc2V7cT1zLmIKaWYocS50ZygwLHIrIjo6IitiKSly
+ZXR1cm4hMAplbHNlIGlmKHEudGcoMCwiKjo6IitiKSlyZXR1cm4hMAplbHNlIGlmKHEudGcoMCxyKyI6
+OioiKSlyZXR1cm4hMAplbHNlIGlmKHEudGcoMCwiKjo6KiIpKXJldHVybiEwfXJldHVybiExfSwKJGlr
+RjoxfQpXLkVvLnByb3RvdHlwZT17CiQxKGEpe3JldHVybiFDLk5tLnRnKEMuQkksSC5uKGEpKX0sCiRT
+OjZ9ClcuV2sucHJvdG90eXBlPXsKJDEoYSl7cmV0dXJuIEMuTm0udGcoQy5CSSxILm4oYSkpfSwKJFM6
+Nn0KVy5jdC5wcm90b3R5cGU9ewpFYihhLGIsYyl7aWYodGhpcy5qRihhLGIsYykpcmV0dXJuITAKaWYo
+Yj09PSJ0ZW1wbGF0ZSImJmM9PT0iIilyZXR1cm4hMAppZihhLmdldEF0dHJpYnV0ZSgidGVtcGxhdGUi
+KT09PSIiKXJldHVybiB0aGlzLmUudGcoMCxiKQpyZXR1cm4hMX19ClcuSUEucHJvdG90eXBlPXsKJDEo
+YSl7cmV0dXJuIlRFTVBMQVRFOjoiK0gubihhKX0sCiRTOjJ9ClcuT3cucHJvdG90eXBlPXsKaTAoYSl7
+dmFyIHMKaWYodC5hTy5iKGEpKXJldHVybiExCnM9dC5nNy5iKGEpCmlmKHMmJlcuclMoYSk9PT0iZm9y
+ZWlnbk9iamVjdCIpcmV0dXJuITEKaWYocylyZXR1cm4hMApyZXR1cm4hMX0sCkViKGEsYixjKXtpZihi
+PT09ImlzInx8Qy54Qi5uKGIsIm9uIikpcmV0dXJuITEKcmV0dXJuIHRoaXMuaTAoYSl9LAokaWtGOjF9
+ClcuVzkucHJvdG90eXBlPXsKRigpe3ZhciBzPXRoaXMscj1zLmMrMSxxPXMuYgppZihyPHEpe3Muc3Ao
+Si54OShzLmEscikpCnMuYz1yCnJldHVybiEwfXMuc3AobnVsbCkKcy5jPXEKcmV0dXJuITF9LApnbCgp
+e3JldHVybiB0aGlzLiR0aS5jLmEodGhpcy5kKX0sCnNwKGEpe3RoaXMuZD10aGlzLiR0aS5DKCIxPyIp
+LmEoYSl9LAokaUFuOjF9ClcuZFcucHJvdG90eXBlPXskaUQwOjEsJGl2NjoxfQpXLm1rLnByb3RvdHlw
+ZT17JGl5MDoxfQpXLktvLnByb3RvdHlwZT17ClBuKGEpe3ZhciBzLHI9bmV3IFcuZm0odGhpcykKZG97
+cz10aGlzLmIKci4kMihhLG51bGwpfXdoaWxlKHMhPT10aGlzLmIpfSwKRVAoYSxiKXsrK3RoaXMuYgpp
+ZihiPT1udWxsfHxiIT09YS5wYXJlbnROb2RlKUouTHQoYSkKZWxzZSBiLnJlbW92ZUNoaWxkKGEpfSwK
+STQoYSxiKXt2YXIgcyxyLHEscCxvLG49ITAsbT1udWxsLGw9bnVsbAp0cnl7bT1KLmlnKGEpCmw9bS5h
+LmdldEF0dHJpYnV0ZSgiaXMiKQp0LmguYShhKQpzPWZ1bmN0aW9uKGMpe2lmKCEoYy5hdHRyaWJ1dGVz
+IGluc3RhbmNlb2YgTmFtZWROb2RlTWFwKSlyZXR1cm4gdHJ1ZQppZihjLmlkPT0ibGFzdENoaWxkInx8
+Yy5uYW1lPT0ibGFzdENoaWxkInx8Yy5pZD09InByZXZpb3VzU2libGluZyJ8fGMubmFtZT09InByZXZp
+b3VzU2libGluZyJ8fGMuaWQ9PSJjaGlsZHJlbiJ8fGMubmFtZT09ImNoaWxkcmVuIilyZXR1cm4gdHJ1
+ZQp2YXIgaz1jLmNoaWxkTm9kZXMKaWYoYy5sYXN0Q2hpbGQmJmMubGFzdENoaWxkIT09a1trLmxlbmd0
+aC0xXSlyZXR1cm4gdHJ1ZQppZihjLmNoaWxkcmVuKWlmKCEoYy5jaGlsZHJlbiBpbnN0YW5jZW9mIEhU
+TUxDb2xsZWN0aW9ufHxjLmNoaWxkcmVuIGluc3RhbmNlb2YgTm9kZUxpc3QpKXJldHVybiB0cnVlCnZh
+ciBqPTAKaWYoYy5jaGlsZHJlbilqPWMuY2hpbGRyZW4ubGVuZ3RoCmZvcih2YXIgaT0wO2k8ajtpKysp
+e3ZhciBoPWMuY2hpbGRyZW5baV0KaWYoaC5pZD09ImF0dHJpYnV0ZXMifHxoLm5hbWU9PSJhdHRyaWJ1
+dGVzInx8aC5pZD09Imxhc3RDaGlsZCJ8fGgubmFtZT09Imxhc3RDaGlsZCJ8fGguaWQ9PSJwcmV2aW91
+c1NpYmxpbmcifHxoLm5hbWU9PSJwcmV2aW91c1NpYmxpbmcifHxoLmlkPT0iY2hpbGRyZW4ifHxoLm5h
+bWU9PSJjaGlsZHJlbiIpcmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfShhKQpuPUgub1Qocyk/ITA6IShh
+LmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApfWNhdGNoKHApe0guUnUocCl9cj0iZWxl
+bWVudCB1bnByaW50YWJsZSIKdHJ5e3I9Si53KGEpfWNhdGNoKHApe0guUnUocCl9dHJ5e3E9Vy5yUyhh
+KQp0aGlzLmtSKHQuaC5hKGEpLGIsbixyLHEsdC5mLmEobSksSC5rKGwpKX1jYXRjaChwKXtpZihILlJ1
+KHApIGluc3RhbmNlb2YgUC5BVCl0aHJvdyBwCmVsc2V7dGhpcy5FUChhLGIpCndpbmRvdwpvPSJSZW1v
+dmluZyBjb3JydXB0ZWQgZWxlbWVudCAiK0guRWoocikKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmlu
+ZWQiKXdpbmRvdy5jb25zb2xlLndhcm4obyl9fX0sCmtSKGEsYixjLGQsZSxmLGcpe3ZhciBzLHIscSxw
+LG8sbixtPXRoaXMKaWYoYyl7bS5FUChhLGIpCndpbmRvdwpzPSJSZW1vdmluZyBlbGVtZW50IGR1ZSB0
+byBjb3JydXB0ZWQgYXR0cmlidXRlcyBvbiA8IitkKyI+IgppZih0eXBlb2YgY29uc29sZSE9InVuZGVm
+aW5lZCIpd2luZG93LmNvbnNvbGUud2FybihzKQpyZXR1cm59aWYoIW0uYS5pMChhKSl7bS5FUChhLGIp
+CndpbmRvdwpzPSJSZW1vdmluZyBkaXNhbGxvd2VkIGVsZW1lbnQgPCIrZSsiPiBmcm9tICIrSC5Faihi
+KQppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2FybihzKQpyZXR1
+cm59aWYoZyE9bnVsbClpZighbS5hLkViKGEsImlzIixnKSl7bS5FUChhLGIpCndpbmRvdwpzPSJSZW1v
+dmluZyBkaXNhbGxvd2VkIHR5cGUgZXh0ZW5zaW9uIDwiK2UrJyBpcz0iJytnKyciPicKaWYodHlwZW9m
+IGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLndhcm4ocykKcmV0dXJufXM9Zi5ndmMo
+KQpyPUguUUkocy5zbGljZSgwKSxILnQ2KHMpKQpmb3IocT1mLmd2YygpLmxlbmd0aC0xLHM9Zi5hO3E+
+PTA7LS1xKXtpZihxPj1yLmxlbmd0aClyZXR1cm4gSC5PSChyLHEpCnA9cltxXQpvPW0uYQpuPUouY0go
+cCkKSC5uKHApCmlmKCFvLkViKGEsbixILm4ocy5nZXRBdHRyaWJ1dGUocCkpKSl7d2luZG93Cm89IlJl
+bW92aW5nIGRpc2FsbG93ZWQgYXR0cmlidXRlIDwiK2UrIiAiK3ArJz0iJytILkVqKHMuZ2V0QXR0cmli
+dXRlKHApKSsnIj4nCmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53
+YXJuKG8pCnMucmVtb3ZlQXR0cmlidXRlKHApfX1pZih0LmFXLmIoYSkpe3M9YS5jb250ZW50CnMudG9T
+dHJpbmcKbS5QbihzKX19LAokaW9uOjF9ClcuZm0ucHJvdG90eXBlPXsKJDIoYSxiKXt2YXIgcyxyLHEs
+cCxvLG4sbT10aGlzLmEKc3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgMTptLkk0KGEsYikKYnJlYWsKY2Fz
+ZSA4OmNhc2UgMTE6Y2FzZSAzOmNhc2UgNDpicmVhawpkZWZhdWx0Om0uRVAoYSxiKX1zPWEubGFzdENo
+aWxkCmZvcihxPXQuQTtzIT1udWxsOyl7cj1udWxsCnRyeXtyPXMucHJldmlvdXNTaWJsaW5nCmlmKHIh
+PW51bGwpe3A9ci5uZXh0U2libGluZwpvPXMKbz1wPT1udWxsP28hPW51bGw6cCE9PW8KcD1vfWVsc2Ug
+cD0hMQppZihwKXtwPVAuUFYoIkNvcnJ1cHQgSFRNTCIpCnRocm93IEguYihwKX19Y2F0Y2gobil7SC5S
+dShuKQpwPXEuYShzKTsrK20uYgpvPXAucGFyZW50Tm9kZQppZihhIT09byl7aWYobyE9bnVsbClvLnJl
+bW92ZUNoaWxkKHApfWVsc2UgYS5yZW1vdmVDaGlsZChwKQpzPW51bGwKcj1hLmxhc3RDaGlsZH1pZihz
+IT1udWxsKXRoaXMuJDIocyxhKQpzPXJ9fSwKJFM6MzB9ClcuTGUucHJvdG90eXBlPXt9ClcuSzcucHJv
+dG90eXBlPXt9ClcuckIucHJvdG90eXBlPXt9ClcuWFcucHJvdG90eXBlPXt9Clcub2EucHJvdG90eXBl
+PXt9ClAuaUoucHJvdG90eXBlPXsKVkgoYSl7dmFyIHMscj10aGlzLmEscT1yLmxlbmd0aApmb3Iocz0w
+O3M8cTsrK3MpaWYocltzXT09PWEpcmV0dXJuIHMKQy5ObS5pKHIsYSkKQy5ObS5pKHRoaXMuYixudWxs
+KQpyZXR1cm4gcX0sClB2KGEpe3ZhciBzLHIscSxwPXRoaXMsbz17fQppZihhPT1udWxsKXJldHVybiBh
+CmlmKEguclEoYSkpcmV0dXJuIGEKaWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKHR5cGVv
+ZiBhPT0ic3RyaW5nIilyZXR1cm4gYQppZihhIGluc3RhbmNlb2YgUC5pUClyZXR1cm4gbmV3IERhdGUo
+YS5hKQppZih0LmZ2LmIoYSkpdGhyb3cgSC5iKFAuU1koInN0cnVjdHVyZWQgY2xvbmUgb2YgUmVnRXhw
+IikpCmlmKHQuYzguYihhKSlyZXR1cm4gYQppZih0LncuYihhKSlyZXR1cm4gYQppZih0LkkuYihhKSly
+ZXR1cm4gYQpzPXQuZEUuYihhKXx8ITEKaWYocylyZXR1cm4gYQppZih0LmYuYihhKSl7cj1wLlZIKGEp
+CnM9cC5iCmlmKHI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMscikKcT1vLmE9c1tyXQppZihxIT1udWxs
+KXJldHVybiBxCnE9e30Kby5hPXEKQy5ObS5ZNShzLHIscSkKYS5LKDAsbmV3IFAuRTIobyxwKSkKcmV0
+dXJuIG8uYX1pZih0LmouYihhKSl7cj1wLlZIKGEpCm89cC5iCmlmKHI+PW8ubGVuZ3RoKXJldHVybiBI
+Lk9IKG8scikKcT1vW3JdCmlmKHEhPW51bGwpcmV0dXJuIHEKcmV0dXJuIHAuZWsoYSxyKX1pZih0LmVI
+LmIoYSkpe3I9cC5WSChhKQpzPXAuYgppZihyPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLHIpCnE9by5i
+PXNbcl0KaWYocSE9bnVsbClyZXR1cm4gcQpxPXt9Cm8uYj1xCkMuTm0uWTUocyxyLHEpCnAuaW0oYSxu
+ZXcgUC5qZyhvLHApKQpyZXR1cm4gby5ifXRocm93IEguYihQLlNZKCJzdHJ1Y3R1cmVkIGNsb25lIG9m
+IG90aGVyIHR5cGUiKSl9LAplayhhLGIpe3ZhciBzLHI9Si5VNihhKSxxPXIuZ0EoYSkscD1uZXcgQXJy
+YXkocSkKQy5ObS5ZNSh0aGlzLmIsYixwKQpmb3Iocz0wO3M8cTsrK3MpQy5ObS5ZNShwLHMsdGhpcy5Q
+dihyLnEoYSxzKSkpCnJldHVybiBwfX0KUC5FMi5wcm90b3R5cGU9ewokMihhLGIpe3RoaXMuYS5hW2Fd
+PXRoaXMuYi5QdihiKX0sCiRTOjMxfQpQLmpnLnByb3RvdHlwZT17CiQyKGEsYil7dGhpcy5hLmJbYV09
+dGhpcy5iLlB2KGIpfSwKJFM6MzJ9ClAuQmYucHJvdG90eXBlPXsKaW0oYSxiKXt2YXIgcyxyLHEscAp0
+LmI4LmEoYikKZm9yKHM9T2JqZWN0LmtleXMoYSkscj1zLmxlbmd0aCxxPTA7cTxyOysrcSl7cD1zW3Fd
+CmIuJDIocCxhW3BdKX19fQpQLkFzLnByb3RvdHlwZT17ClYoYSl7dmFyIHMKSC5uKGEpCnM9JC5oRygp
+LmIKaWYocy50ZXN0KGEpKXJldHVybiBhCnRocm93IEguYihQLkwzKGEsInZhbHVlIiwiTm90IGEgdmFs
+aWQgY2xhc3MgdG9rZW4iKSl9LAp3KGEpe3JldHVybiB0aGlzLkQoKS5rKDAsIiAiKX0sCmdtKGEpe3Zh
+ciBzPXRoaXMuRCgpCnJldHVybiBQLnJqKHMscy5yLEguTGgocykuYyl9LApnbDAoYSl7cmV0dXJuIHRo
+aXMuRCgpLmE9PT0wfSwKZ29yKGEpe3JldHVybiB0aGlzLkQoKS5hIT09MH0sCmdBKGEpe3JldHVybiB0
+aGlzLkQoKS5hfSwKdGcoYSxiKXt0aGlzLlYoYikKcmV0dXJuIHRoaXMuRCgpLnRnKDAsYil9LAppKGEs
+Yil7dmFyIHMKSC5uKGIpCnRoaXMuVihiKQpzPXRoaXMuT1MobmV3IFAuR0UoYikpCnJldHVybiBILnA4
+KHM9PW51bGw/ITE6cyl9LApSKGEsYil7dmFyIHMscgppZih0eXBlb2YgYiE9InN0cmluZyIpcmV0dXJu
+ITEKdGhpcy5WKGIpCnM9dGhpcy5EKCkKcj1zLlIoMCxiKQp0aGlzLlgocykKcmV0dXJuIHJ9LApGVihh
+LGIpe3RoaXMuT1MobmV3IFAuTjcodGhpcyx0Lk8uYShiKSkpfSwKZVIoYSxiKXt2YXIgcz10aGlzLkQo
+KQpyZXR1cm4gSC5iSyhzLGIsSC5MaChzKS5DKCJsZi5FIikpfSwKRShhLGIpe3JldHVybiB0aGlzLkQo
+KS5FKDAsYil9LApWMShhKXt0aGlzLk9TKG5ldyBQLnVRKCkpfSwKT1MoYSl7dmFyIHMscgp0LmJVLmEo
+YSkKcz10aGlzLkQoKQpyPWEuJDEocykKdGhpcy5YKHMpCnJldHVybiByfX0KUC5HRS5wcm90b3R5cGU9
+ewokMShhKXtyZXR1cm4gdC5DLmEoYSkuaSgwLHRoaXMuYSl9LAokUzozM30KUC5ONy5wcm90b3R5cGU9
+ewokMShhKXt2YXIgcz10aGlzLmIscj1ILnQ2KHMpCnJldHVybiB0LkMuYShhKS5GVigwLG5ldyBILmxK
+KHMsci5DKCJxVSgxKSIpLmEodGhpcy5hLmd1TSgpKSxyLkMoImxKPDEscVU+IikpKX0sCiRTOjEyfQpQ
+LnVRLnByb3RvdHlwZT17CiQxKGEpe3QuQy5hKGEpCmlmKGEuYT4wKXthLmI9YS5jPWEuZD1hLmU9YS5m
+PW51bGwKYS5hPTAKYS5TKCl9cmV0dXJuIG51bGx9LAokUzoxMn0KUC5oRi5wcm90b3R5cGU9eyRpaEY6
+MX0KUC5EVi5wcm90b3R5cGU9ewokMShhKXt2YXIgcwp0LlkuYShhKQpzPWZ1bmN0aW9uKGIsYyxkKXty
+ZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYihjLGQsdGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBw
+bHkoYXJndW1lbnRzKSl9fShQLlI0LGEsITEpClAuRG0ocywkLnooKSxhKQpyZXR1cm4gc30sCiRTOjR9
+ClAuUEMucHJvdG90eXBlPXsKJDEoYSl7cmV0dXJuIG5ldyB0aGlzLmEoYSl9LAokUzo0fQpQLlFTLnBy
+b3RvdHlwZT17CiQxKGEpe3JldHVybiBuZXcgUC5yNyh0LksuYShhKSl9LAokUzo0NH0KUC5ucC5wcm90
+b3R5cGU9ewokMShhKXtyZXR1cm4gbmV3IFAuVHoodC5LLmEoYSksdC5hbSl9LAokUzozNn0KUC5VdC5w
+cm90b3R5cGU9ewokMShhKXtyZXR1cm4gbmV3IFAuRTQodC5LLmEoYSkpfSwKJFM6Mzd9ClAuRTQucHJv
+dG90eXBlPXsKcShhLGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nIiYmdHlwZW9mIGIhPSJudW1iZXIiKXRo
+cm93IEguYihQLnhZKCJwcm9wZXJ0eSBpcyBub3QgYSBTdHJpbmcgb3IgbnVtIixudWxsKSkKcmV0dXJu
+IFAuZFUodGhpcy5hW2JdKX0sClk1KGEsYixjKXtpZih0eXBlb2YgYiE9InN0cmluZyImJnR5cGVvZiBi
+IT0ibnVtYmVyIil0aHJvdyBILmIoUC54WSgicHJvcGVydHkgaXMgbm90IGEgU3RyaW5nIG9yIG51bSIs
+bnVsbCkpCnRoaXMuYVtiXT1QLndZKGMpfSwKRE4oYSxiKXtpZihiPT1udWxsKXJldHVybiExCnJldHVy
+biBiIGluc3RhbmNlb2YgUC5FNCYmdGhpcy5hPT09Yi5hfSwKdyhhKXt2YXIgcyxyCnRyeXtzPVN0cmlu
+Zyh0aGlzLmEpCnJldHVybiBzfWNhdGNoKHIpe0guUnUocikKcz10aGlzLnhiKDApCnJldHVybiBzfX0s
+ClY3KGEsYil7dmFyIHMscj10aGlzLmEKaWYoYj09bnVsbClzPW51bGwKZWxzZXtzPUgudDYoYikKcz1Q
+LlBXKG5ldyBILmxKKGIscy5DKCJAKDEpIikuYShQLmlHKCkpLHMuQygibEo8MSxAPiIpKSwhMCx0Lnop
+fXJldHVybiBQLmRVKHJbYV0uYXBwbHkocixzKSl9LApnaU8oYSl7cmV0dXJuIDB9fQpQLnI3LnByb3Rv
+dHlwZT17fQpQLlR6LnByb3RvdHlwZT17CmNQKGEpe3ZhciBzPXRoaXMscj1hPDB8fGE+PXMuZ0EocykK
+aWYocil0aHJvdyBILmIoUC5URShhLDAscy5nQShzKSxudWxsLG51bGwpKX0sCnEoYSxiKXtpZihILm9r
+KGIpKXRoaXMuY1AoYikKcmV0dXJuIHRoaXMuJHRpLmMuYSh0aGlzLlVyKDAsYikpfSwKWTUoYSxiLGMp
+e3RoaXMuY1AoYikKdGhpcy5iaCgwLGIsYyl9LApnQShhKXt2YXIgcz10aGlzLmEubGVuZ3RoCmlmKHR5
+cGVvZiBzPT09Im51bWJlciImJnM+Pj4wPT09cylyZXR1cm4gcwp0aHJvdyBILmIoUC5QVigiQmFkIEpz
+QXJyYXkgbGVuZ3RoIikpfSwKJGliUToxLAokaWNYOjEsCiRpek06MX0KUC52Zy5wcm90b3R5cGU9ewpZ
+NShhLGIsYyl7cmV0dXJuIHRoaXMuZTQoMCxiLGMpfX0KUC5uZC5wcm90b3R5cGU9eyRpbmQ6MX0KUC5L
+ZS5wcm90b3R5cGU9ewpEKCl7dmFyIHMscixxLHAsbz10aGlzLmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIp
+LG49UC5Mcyh0Lk4pCmlmKG89PW51bGwpcmV0dXJuIG4KZm9yKHM9by5zcGxpdCgiICIpLHI9cy5sZW5n
+dGgscT0wO3E8cjsrK3Epe3A9Si5UMChzW3FdKQppZihwLmxlbmd0aCE9PTApbi5pKDAscCl9cmV0dXJu
+IG59LApYKGEpe3RoaXMuYS5zZXRBdHRyaWJ1dGUoImNsYXNzIixhLmsoMCwiICIpKX19ClAuaGkucHJv
+dG90eXBlPXsKZ1AoYSl7cmV0dXJuIG5ldyBQLktlKGEpfSwKc2hmKGEsYil7dGhpcy5ZQyhhLGIpfSwK
+cjYoYSxiLGMsZCl7dmFyIHMscixxLHAsbyxuCmlmKGQ9PW51bGwpe3M9SC5RSShbXSx0LnUpCmQ9bmV3
+IFcudkQocykKQy5ObS5pKHMsVy5UdyhudWxsKSkKQy5ObS5pKHMsVy5CbCgpKQpDLk5tLmkocyxuZXcg
+Vy5PdygpKX1jPW5ldyBXLktvKGQpCnI9JzxzdmcgdmVyc2lvbj0iMS4xIj4nK0guRWooYikrIjwvc3Zn
+PiIKcz1kb2N1bWVudApxPXMuYm9keQpxLnRvU3RyaW5nCnA9Qy5SWS5BSChxLHIsYykKbz1zLmNyZWF0
+ZURvY3VtZW50RnJhZ21lbnQoKQpzPW5ldyBXLmU3KHApCm49cy5ncjgocykKZm9yKDtzPW4uZmlyc3RD
+aGlsZCxzIT1udWxsOylvLmFwcGVuZENoaWxkKHMpCnJldHVybiBvfSwKbnooYSxiLGMsZCxlKXt0aHJv
+dyBILmIoUC5MNCgiQ2Fubm90IGludm9rZSBpbnNlcnRBZGphY2VudEh0bWwgb24gU1ZHLiIpKX0sCmdW
+bChhKXtyZXR1cm4gbmV3IFcuQ3EoYSwiY2xpY2siLCExLHQuUSl9LAokaWhpOjF9ClUuZDIucHJvdG90
+eXBlPXsKTHQoKXt2YXIgcyxyLHEscCxvPXRoaXMsbj10Lk4sbT10LlgsbD1QLkZsKG4sbSksaz1vLmEK
+aWYoayE9bnVsbCl7cz1ILlFJKFtdLHQuZCkKZm9yKHI9ay5sZW5ndGgscT0wO3E8ay5sZW5ndGg7ay5s
+ZW5ndGg9PT1yfHwoMCxILmxrKShrKSwrK3Epe3A9a1txXQpzLnB1c2goUC5FRihbImRlc2NyaXB0aW9u
+IixwLmEsImhyZWYiLHAuYl0sbixtKSl9bC5ZNSgwLCJlZGl0cyIscyl9bC5ZNSgwLCJleHBsYW5hdGlv
+biIsby5iKQpsLlk1KDAsImxpbmUiLG8uYykKbC5ZNSgwLCJkaXNwbGF5UGF0aCIsby5kKQpsLlk1KDAs
+InVyaVBhdGgiLG8uZSkKbj1vLmYKaWYobiE9bnVsbCl7bT1ILlFJKFtdLHQuZCkKZm9yKGs9bi5sZW5n
+dGgscT0wO3E8bi5sZW5ndGg7bi5sZW5ndGg9PT1rfHwoMCxILmxrKShuKSwrK3EpbS5wdXNoKG5bcV0u
+THQoKSkKbC5ZNSgwLCJ0cmFjZXMiLG0pfXJldHVybiBsfX0KVS5TZS5wcm90b3R5cGU9ewpMdCgpe3Jl
+dHVybiBQLkVGKFsiZGVzY3JpcHRpb24iLHRoaXMuYSwiaHJlZiIsdGhpcy5iXSx0Lk4sdC5YKX19ClUu
+TWwucHJvdG90eXBlPXsKTHQoKXtyZXR1cm4gUC5FRihbImhyZWYiLHRoaXMuYSwibGluZSIsdGhpcy5i
+LCJwYXRoIix0aGlzLmNdLHQuTix0LlgpfX0KVS55RC5wcm90b3R5cGU9ewpMdCgpe3ZhciBzLHIscSxw
+PUguUUkoW10sdC5kKQpmb3Iocz10aGlzLmIscj1zLmxlbmd0aCxxPTA7cTxzLmxlbmd0aDtzLmxlbmd0
+aD09PXJ8fCgwLEgubGspKHMpLCsrcSlwLnB1c2goc1txXS5MdCgpKQpyZXR1cm4gUC5FRihbImRlc2Ny
+aXB0aW9uIix0aGlzLmEsImVudHJpZXMiLHBdLHQuTix0LlgpfX0KVS53Yi5wcm90b3R5cGU9ewpMdCgp
+e3ZhciBzLHIscSxwPXRoaXMsbz1QLkZsKHQuTix0LlgpCm8uWTUoMCwiZGVzY3JpcHRpb24iLHAuYSkK
+cz1wLmIKaWYocyE9bnVsbClvLlk1KDAsImZ1bmN0aW9uIixzKQpzPXAuYwppZihzIT1udWxsKW8uWTUo
+MCwibGluayIscy5MdCgpKQpzPXAuZAppZihzLmxlbmd0aCE9PTApe3I9SC50NihzKQpxPXIuQygibEo8
+MSxaMDxxVSxNaD8+PiIpCm8uWTUoMCwiaGludEFjdGlvbnMiLFAuWTEobmV3IEgubEoocyxyLkMoIlow
+PHFVLE1oPz4oMSkiKS5hKG5ldyBVLmIwKCkpLHEpLCEwLHEuQygiYUwuRSIpKSl9cmV0dXJuIG99fQpV
+LmFOLnByb3RvdHlwZT17CiQxKGEpe3JldHVybiBSLm56KHQuRy5hKGEpKX0sCiRTOjM4fQpVLmIwLnBy
+b3RvdHlwZT17CiQxKGEpe3JldHVybiB0LkouYShhKS5MdCgpfSwKJFM6Mzl9CkIuajgucHJvdG90eXBl
+PXsKTHQoKXtyZXR1cm4gUC5FRihbImxpbmUiLHRoaXMuYSwiZXhwbGFuYXRpb24iLHRoaXMuYiwib2Zm
+c2V0Iix0aGlzLmNdLHQuTix0LlgpfX0KQi5xcC5wcm90b3R5cGU9ewpMdCgpe3ZhciBzLHIscSxwLG8s
+bixtLGw9dGhpcyxrPXQuTixqPVAuRmwoayx0LkQpCmZvcihzPWwuZCxzPXMuZ1B1KHMpLHM9cy5nbShz
+KSxyPXQuWCxxPXQuZDtzLkYoKTspe3A9cy5nbCgpCm89cC5hCm49SC5RSShbXSxxKQpmb3IocD1KLklU
+KHAuYik7cC5GKCk7KXttPXAuZ2woKQpuLnB1c2goUC5FRihbImxpbmUiLG0uYSwiZXhwbGFuYXRpb24i
+LG0uYiwib2Zmc2V0IixtLmNdLGsscikpfWouWTUoMCxvLG4pfXJldHVybiBQLkVGKFsicmVnaW9ucyIs
+bC5hLCJuYXZpZ2F0aW9uQ29udGVudCIsbC5iLCJzb3VyY2VDb2RlIixsLmMsImVkaXRzIixqXSxrLHIp
+fX0KVC5tUS5wcm90b3R5cGU9e30KTC5lLnByb3RvdHlwZT17CiQxKGEpe3ZhciBzLHIscSxwLG8sbixt
+CnQuQi5hKGEpCnM9dC5GCnI9cy5hKHdpbmRvdy5sb2NhdGlvbikucGF0aG5hbWUKcT1MLkc2KHMuYSh3
+aW5kb3cubG9jYXRpb24pLmhyZWYpCnA9TC5hSyhzLmEod2luZG93LmxvY2F0aW9uKS5ocmVmKQpMLkdl
+KCkKaWYociE9PSIvIil7cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50
+CnMudG9TdHJpbmcKcz1yIT09Qy54Qi5iUyhzKX1lbHNlIHM9ITEKaWYocyl7ci50b1N0cmluZwpMLkc3
+KHIscSxwLCEwLG5ldyBMLlZXKHIscSxwKSl9cz1kb2N1bWVudApvPXMucXVlcnlTZWxlY3RvcigiLmFw
+cGx5LW1pZ3JhdGlvbiIpCm8udG9TdHJpbmcKbz1KLnFGKG8pCm49by4kdGkKbT1uLkMoIn4oMSk/Iiku
+YShuZXcgTC5vWigpKQp0LlouYShudWxsKQpXLkpFKG8uYSxvLmIsbSwhMSxuLmMpCm49cy5xdWVyeVNl
+bGVjdG9yKCIucmVydW4tbWlncmF0aW9uIikKbi50b1N0cmluZwpuPUoucUYobikKbT1uLiR0aQpXLkpF
+KG4uYSxuLmIsbS5DKCJ+KDEpPyIpLmEobmV3IEwueTgoKSksITEsbS5jKQptPXMucXVlcnlTZWxlY3Rv
+cigiLnJlcG9ydC1wcm9ibGVtIikKbS50b1N0cmluZwptPUoucUYobSkKbj1tLiR0aQpXLkpFKG0uYSxt
+LmIsbi5DKCJ+KDEpPyIpLmEobmV3IEwuSGkoKSksITEsbi5jKQpzPXMucXVlcnlTZWxlY3RvcigiLnBv
+cHVwLXBhbmUgLmNsb3NlIikKcy50b1N0cmluZwpzPUoucUYocykKbj1zLiR0aQpXLkpFKHMuYSxzLmIs
+bi5DKCJ+KDEpPyIpLmEobmV3IEwuQlQoKSksITEsbi5jKQpuPSQuYzAoKQpuLnRvU3RyaW5nCm49Si5x
+RihuKQpzPW4uJHRpClcuSkUobi5hLG4uYixzLkMoIn4oMSk/IikuYShuZXcgTC5QWSgpKSwhMSxzLmMp
+fSwKJFM6MTd9CkwuVlcucHJvdG90eXBlPXsKJDAoKXtMLkZyKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0s
+CiRTOjB9Ckwub1oucHJvdG90eXBlPXsKJDEoYSl7dmFyIHMscixxLHAsbwp0LlYuYShhKQppZihDLm9s
+LnVzKHdpbmRvdywiVGhpcyB3aWxsIGFwcGx5IHRoZSBjaGFuZ2VzIHlvdSd2ZSBwcmV2aWV3ZWQgdG8g
+eW91ciB3b3JraW5nIGRpcmVjdG9yeS4gSXQgaXMgcmVjb21tZW5kZWQgeW91IGNvbW1pdCBhbnkgY2hh
+bmdlcyB5b3UgbWFkZSBiZWZvcmUgZG9pbmcgdGhpcy4iKSl7cz1ILlFJKFtdLHQuZCkKZm9yKHI9JC5J
+UixxPXIubGVuZ3RoLHA9MDtwPHIubGVuZ3RoO3IubGVuZ3RoPT09cXx8KDAsSC5saykociksKytwKXMu
+cHVzaChyW3BdLkx0KCkpCnM9TC50eSgiL2FwcGx5LW1pZ3JhdGlvbiIsUC5FRihbIm5hdmlnYXRpb25U
+cmVlIixzXSx0Lk4sdC5EKSkuVzcobmV3IEwuanIoKSx0LlApCm89bmV3IEwucWwoKQp0LmI3LmEobnVs
+bCkKcj1zLiR0aQpxPSQuWDMKaWYocSE9PUMuTlUpbz1QLlZIKG8scSkKcy54ZihuZXcgUC5GZShuZXcg
+UC52cyhxLHIpLDIsbnVsbCxvLHIuQygiQDwxPiIpLktxKHIuYykuQygiRmU8MSwyPiIpKSl9fSwKJFM6
+MX0KTC5qci5wcm90b3R5cGU9ewokMShhKXt2YXIgcwp0LmZuLmEoYSkKcz1kb2N1bWVudC5ib2R5CnMu
+Y2xhc3NMaXN0LnJlbW92ZSgicHJvcG9zZWQiKQpzLmNsYXNzTGlzdC5hZGQoImFwcGxpZWQiKX0sCiRT
+OjQyfQpMLnFsLnByb3RvdHlwZT17CiQyKGEsYil7TC5DMigiQ291bGRuJ3QgYXBwbHkgbWlncmF0aW9u
+Iix0LksuYShhKSxiKX0sCiRTOjQzfQpMLnk4LnByb3RvdHlwZT17CiQxKGEpe3JldHVybiB0aGlzLnhu
+KHQuVi5hKGEpKX0sCnhuKGEpe3ZhciBzPTAscj1QLkZYKHQuSCkscT0xLHAsbz1bXSxuLG0sbCxrLGos
+aQp2YXIgJGFzeW5jJCQxPVAubHooZnVuY3Rpb24oYixjKXtpZihiPT09MSl7cD1jCnM9cX13aGlsZSh0
+cnVlKXN3aXRjaChzKXtjYXNlIDA6cT0zCmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgicmVydW5u
+aW5nIikKcz02CnJldHVybiBQLmpRKEwudHkoIi9yZXJ1bi1taWdyYXRpb24iLG51bGwpLCRhc3luYyQk
+MSkKY2FzZSA2Om49YwprPW4Kay50b1N0cmluZwppZihILnA4KEoueDkoaywic3VjY2VzcyIpKSl0LkYu
+YSh3aW5kb3cubG9jYXRpb24pLnJlbG9hZCgpCmVsc2UgTC5LMCh0LmV3LmEoSi54OShuLCJlcnJvcnMi
+KSkpCm8ucHVzaCg1KQpzPTQKYnJlYWsKY2FzZSAzOnE9MgppPXAKbT1ILlJ1KGkpCmw9SC50cyhpKQpM
+LkMyKCJGYWlsZWQgdG8gcmVydW4gbWlncmF0aW9uIixtLGwpCm8ucHVzaCg1KQpzPTQKYnJlYWsKY2Fz
+ZSAyOm89WzFdCmNhc2UgNDpxPTEKZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJyZXJ1bm5p
+bmciKQpzPW8ucG9wKCkKYnJlYWsKY2FzZSA1OnJldHVybiBQLnlDKG51bGwscikKY2FzZSAxOnJldHVy
+biBQLmYzKHAscil9fSkKcmV0dXJuIFAuREkoJGFzeW5jJCQxLHIpfSwKJFM6N30KTC5IaS5wcm90b3R5
+cGU9ewokMShhKXt0LlYuYShhKQpDLm9sLlBvKHdpbmRvdyxQLlhkKCJodHRwcyIsImdpdGh1Yi5jb20i
+LCJkYXJ0LWxhbmcvc2RrL2lzc3Vlcy9uZXciLFAuRUYoWyJ0aXRsZSIsIkN1c3RvbWVyLXJlcG9ydGVk
+IGlzc3VlIHdpdGggTk5CRCBtaWdyYXRpb24gdG9vbCIsImxhYmVscyIsdS5kLCJib2R5IiwiIyMjIyBT
+dGVwcyB0byByZXByb2R1Y2VcblxuIyMjIyBXaGF0IGRpZCB5b3UgZXhwZWN0IHRvIGhhcHBlbj9cblxu
+IyMjIyBXaGF0IGFjdHVhbGx5IGhhcHBlbmVkP1xuXG5fU2NyZWVuc2hvdHMgYXJlIGFwcHJlY2lhdGVk
+X1xuXG4qKkRhcnQgU0RLIHZlcnNpb24qKjogIitILkVqKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJz
+ZGstdmVyc2lvbiIpLnRleHRDb250ZW50KSsiXG5cblRoYW5rcyBmb3IgZmlsaW5nIVxuIl0sdC5OLHQu
+eikpLmduRCgpLCJyZXBvcnQtcHJvYmxlbSIpfSwKJFM6MX0KTC5CVC5wcm90b3R5cGU9ewokMShhKXt2
+YXIgcwp0LlYuYShhKQpzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5wb3B1cC1wYW5lIikuc3R5bGUK
+cy5kaXNwbGF5PSJub25lIgpyZXR1cm4ibm9uZSJ9LAokUzoxfQpMLlBZLnByb3RvdHlwZT17CiQxKGEp
+e3ZhciBzLHIscSxwLG8KdC5WLmEoYSkKcz0kLkQ5KCkuaW5uZXJUZXh0CnI9dC5oLmEoZG9jdW1lbnQu
+cXVlcnlTZWxlY3RvcignLm5hdi1wYW5lbCBbZGF0YS1uYW1lKj0iJytXLkxqKHMpKyciXScpLnBhcmVu
+dE5vZGUpCnE9ci5xdWVyeVNlbGVjdG9yKCIuc3RhdHVzLWljb24iKQpwPSQuSVIKcC50b1N0cmluZwpv
+PUwueXcocCxzKQppZihvIGluc3RhbmNlb2YgTC5jRCl7cD1vLngKcC50b1N0cmluZ31lbHNlIHA9ITEK
+aWYocCl7TC5PdChvKQpMLnhuKHEsbykKTC5BUihyLG8pfX0sCiRTOjF9CkwuTC5wcm90b3R5cGU9ewok
+MShhKXt2YXIgcyxyLHEscAp0LkIuYShhKQpzPXQuRgpyPXMuYSh3aW5kb3cubG9jYXRpb24pLnBhdGhu
+YW1lCnIudG9TdHJpbmcKcT1MLkc2KHMuYSh3aW5kb3cubG9jYXRpb24pLmhyZWYpCnA9TC5hSyhzLmEo
+d2luZG93LmxvY2F0aW9uKS5ocmVmKQppZihyLmxlbmd0aD4xKUwuRzcocixxLHAsITEsbnVsbCkKZWxz
+ZXtMLkJFKHIsQi53UigpLCEwKQpMLkJYKCImbmJzcDsiLG51bGwpfX0sCiRTOjE3fQpMLld4LnByb3Rv
+dHlwZT17CiQxKGEpe3ZhciBzLHIscSxwLG89ImNvbGxhcHNlZCIKdC5WLmEoYSkKcz10aGlzLmEKcj1K
+LllFKHMpCnE9dGhpcy5iCnA9Si5ZRShxKQppZighci5nUChzKS50ZygwLG8pKXtyLmdQKHMpLmkoMCxv
+KQpwLmdQKHEpLmkoMCxvKX1lbHNle3IuZ1AocykuUigwLG8pCnAuZ1AocSkuUigwLG8pfX0sCiRTOjF9
+CkwuSG8ucHJvdG90eXBlPXsKJDEoYSl7dmFyIHM9Si5xRih0LmguYShhKSkscj1zLiR0aSxxPXIuQygi
+figxKT8iKS5hKG5ldyBMLmROKHRoaXMuYSkpCnQuWi5hKG51bGwpClcuSkUocy5hLHMuYixxLCExLHIu
+Yyl9LAokUzozfQpMLmROLnByb3RvdHlwZT17CiQxKGEpe3JldHVybiBMLnQyKHQuVi5hKGEpLHRoaXMu
+YSl9LAokUzoxfQpMLklDLnByb3RvdHlwZT17CiQxKGEpe3ZhciBzLHIscQp0LmguYShhKQpzPUoucUYo
+YSkKcj1zLiR0aQpxPXIuQygifigxKT8iKS5hKG5ldyBMLnh6KGEsdGhpcy5hKSkKdC5aLmEobnVsbCkK
+Vy5KRShzLmEscy5iLHEsITEsci5jKX0sCiRTOjN9CkwueHoucHJvdG90eXBlPXsKJDEoYSl7dmFyIHMs
+cixxLHAKdC5WLmEoYSkKcz10aGlzLmEKcj1zLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5l
+dyBXLmk3KHMpKS5PVSgib2Zmc2V0IikpCnIudG9TdHJpbmcKcT1QLlFBKHIsbnVsbCkKcz1zLmdldEF0
+dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KHMpKS5PVSgibGluZSIpKQpzLnRvU3RyaW5n
+CnA9UC5RQShzLG51bGwpCnM9dGhpcy5iCnMudG9TdHJpbmcKTC5oWChzLHEscCl9LAokUzoxfQpMLkJO
+LnByb3RvdHlwZT17CiQxKGEpe3ZhciBzPUoucUYodC5oLmEoYSkpLHI9cy4kdGkKci5DKCJ+KDEpPyIp
+LmEoTC5pUygpKQp0LlouYShudWxsKQpXLkpFKHMuYSxzLmIsTC5pUygpLCExLHIuYyl9LAokUzozfQpM
+LmZDLnByb3RvdHlwZT17CiQxKGEpe3QucC5hKGEpCnRoaXMuYS5hTSgwLHRoaXMuYil9LAokUzo0Nn0K
+TC5UbS5wcm90b3R5cGU9ewokMShhKXtILm4oYSkKcmV0dXJuIGEubGVuZ3RoPjQwP0MueEIuTmooYSww
+LDQwKSsiLi4uIjphfSwKJFM6Mn0KTC5uVC5wcm90b3R5cGU9ewokMCgpe0wuRnIodGhpcy5hLHRoaXMu
+Yix0aGlzLmMpfSwKJFM6MH0KTC5OWS5wcm90b3R5cGU9ewokMCgpe0wuRnIodGhpcy5hLG51bGwsbnVs
+bCl9LAokUzowfQpMLnVlLnByb3RvdHlwZT17CiQxKGEpe3QuZi5hKGEpCnJldHVybiBILkVqKGEucSgw
+LCJzZXZlcml0eSIpKSsiIC0gIitILkVqKGEucSgwLCJtZXNzYWdlIikpKyIgYXQgIitILkVqKGEucSgw
+LCJsb2NhdGlvbiIpKSsiIC0gKCIrSC5FaihhLnEoMCwiY29kZSIpKSsiKSJ9LAokUzo0N30KTC5HSC5w
+cm90b3R5cGU9ewokMShhKXt0LmguYShhKQokLnpCKCkKdC5lcy5hKCQub3coKS5xKDAsImhsanMiKSku
+VjcoImhpZ2hsaWdodEJsb2NrIixbYV0pfSwKJFM6M30KTC5FRS5wcm90b3R5cGU9ewokMShhKXt2YXIg
+cyxyCnQuVi5hKGEpLnByZXZlbnREZWZhdWx0KCkKcz10aGlzLmEKcj10aGlzLmIKTC5hZih0LkYuYSh3
+aW5kb3cubG9jYXRpb24pLnBhdGhuYW1lLHMsciwhMCxuZXcgTC5RTChzLHIpKQpMLmhYKHRoaXMuYyxz
+LHIpfSwKJFM6MX0KTC5RTC5wcm90b3R5cGU9ewokMCgpe0wuRnIodC5GLmEod2luZG93LmxvY2F0aW9u
+KS5wYXRobmFtZSx0aGlzLmEsdGhpcy5iKX0sCiRTOjB9CkwuVlMucHJvdG90eXBlPXsKJDEoYSl7dmFy
+IHMscj0ic2VsZWN0ZWQtZmlsZSIKdC5oLmEoYSkKcz1KLllFKGEpCmlmKGEuZ2V0QXR0cmlidXRlKCJk
+YXRhLSIrbmV3IFcuU3kobmV3IFcuaTcoYSkpLk9VKCJuYW1lIikpPT09dGhpcy5hLmEpcy5nUChhKS5p
+KDAscikKZWxzZSBzLmdQKGEpLlIoMCxyKX0sCiRTOjN9CkwuVEQucHJvdG90eXBlPXsKJDEoYSl7dmFy
+IHMscgp0LlYuYShhKQpzPXRoaXMuYQpzd2l0Y2gocy5nTCgpKXtjYXNlIEMuY3c6YnJlYWsKY2FzZSBD
+LldEOnMubkcoKQpicmVhawpjYXNlIEMuWGo6cy5jMigpCmJyZWFrCmNhc2UgQy5kYzpzLmMyKCkKYnJl
+YWt9cj10aGlzLmIKTC5iTChyLHMpCkwueG4odGhpcy5jLHMpCkwuQVIocixzKX0sCiRTOjF9CkwuSWYu
+cHJvdG90eXBlPXsKJDEoYSl7dmFyIHMKdC5WLmEoYSkKcz10aGlzLmEKTC5PdChzKQpMLnhuKHRoaXMu
+YixzKQpMLkFSKHRoaXMuYyxzKX0sCiRTOjF9CkwudEIucHJvdG90eXBlPXsKJDEoYSl7cmV0dXJuIEwu
+dDIodC5WLmEoYSksITApfSwKJFM6MX0KTC5tMi5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdGhpcy5S
+SSh0LlYuYShhKSl9LApSSShhKXt2YXIgcz0wLHI9UC5GWCh0LkgpLHE9MSxwLG89W10sbj10aGlzLG0s
+bCxrLGosaSxoLGcsZixlCnZhciAkYXN5bmMkJDE9UC5seihmdW5jdGlvbihiLGMpe2lmKGI9PT0xKXtw
+PWMKcz1xfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDpxPTMKaT1kb2N1bWVudAptPUMuQ0QuelEo
+aS5xdWVyeVNlbGVjdG9yKCIuY29udGVudCIpLnNjcm9sbFRvcCkKaD10Lk4Kcz02CnJldHVybiBQLmpR
+KEwudHkoTC5RNCgiL2FwcGx5LWhpbnQiLFAuRmwoaCxoKSksbi5hLkx0KCkpLCRhc3luYyQkMSkKY2Fz
+ZSA2Omg9bi5iCmc9aC5hCmcudG9TdHJpbmcKbD1MLlVzKGcpCnM9NwpyZXR1cm4gUC5qUShMLkc3KGws
+bnVsbCxoLmIsITEsbnVsbCksJGFzeW5jJCQxKQpjYXNlIDc6aS5ib2R5LmNsYXNzTGlzdC5hZGQoIm5l
+ZWRzLXJlcnVuIikKaT1pLnF1ZXJ5U2VsZWN0b3IoIi5jb250ZW50IikKaS50b1N0cmluZwppLnNjcm9s
+bFRvcD1DLmpuLnpRKG0pCnE9MQpzPTUKYnJlYWsKY2FzZSAzOnE9MgplPXAKaz1ILlJ1KGUpCmo9SC50
+cyhlKQpMLkMyKCJjb3VsZG4ndCBhcHBseSBoaW50IixrLGopCnM9NQpicmVhawpjYXNlIDI6cz0xCmJy
+ZWFrCmNhc2UgNTpyZXR1cm4gUC55QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIpfX0pCnJl
+dHVybiBQLkRJKCRhc3luYyQkMSxyKX0sCiRTOjd9CkwuUVcucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4g
+dGhpcy5hKyI6XG4iK3RoaXMuYn0sCiRpUno6MX0KTC5YQS5wcm90b3R5cGU9ewpFYihhLGIsYyl7cmV0
+dXJuITB9LAppMChhKXtyZXR1cm4hMH0sCiRpa0Y6MX0KTC52dC5wcm90b3R5cGU9ewpnTCgpe3ZhciBz
+LHIscSxwLG8sbixtLGw9dGhpcy5kCmlmKGwubGVuZ3RoPT09MClyZXR1cm4gQy5jdwpzPUMuTm0uZ3RI
+KGwpLmdMKCkKZm9yKHI9bC5sZW5ndGgscT0hMCxwPSEwLG89MDtvPGwubGVuZ3RoO2wubGVuZ3RoPT09
+cnx8KDAsSC5saykobCksKytvKXtuPWxbb10uZ0woKQppZihuIT1zKXM9bnVsbAptPW4hPT1DLmN3Cmlm
+KG0mJm4hPT1DLldEKXE9ITEKaWYobSYmbiE9PUMuWGopcD0hMX1pZihzIT1udWxsKXJldHVybiBzCmlm
+KHEpcmV0dXJuIEMuV0QKaWYocClyZXR1cm4gQy5YagpyZXR1cm4gQy5kY30sCkxWKCl7dmFyIHMscixx
+LHA9dGhpcy5kCmlmKHAhPW51bGwpZm9yKHM9cC5sZW5ndGgscj0wO3I8czsrK3Ipe3E9cFtyXQppZihx
+LmI9PT0kKXEuYj10aGlzCmVsc2UgSC52KG5ldyBILmMoIkZpZWxkICdwYXJlbnQnIGhhcyBhbHJlYWR5
+IGJlZW4gaW5pdGlhbGl6ZWQuIikpfX0sCmMyKCl7dmFyIHMscixxLHAsbwpmb3Iocz10aGlzLmQscj1z
+Lmxlbmd0aCxxPTA7cTxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrcSl7cD1zW3Fd
+CmlmKHAgaW5zdGFuY2VvZiBMLnZ0KXAuYzIoKQplbHNle2lmKHAgaW5zdGFuY2VvZiBMLmNEKXtvPXAu
+eApvLnRvU3RyaW5nCm89byYmcC5yPT09Qy5Yan1lbHNlIG89ITEKaWYobylwLnI9Qy5XRH19fSwKbkco
+KXt2YXIgcyxyLHEscCxvCmZvcihzPXRoaXMuZCxyPXMubGVuZ3RoLHE9MDtxPHMubGVuZ3RoO3MubGVu
+Z3RoPT09cnx8KDAsSC5saykocyksKytxKXtwPXNbcV0KaWYocCBpbnN0YW5jZW9mIEwudnQpcC5uRygp
+CmVsc2V7aWYocCBpbnN0YW5jZW9mIEwuY0Qpe289cC54Cm8udG9TdHJpbmcKbz1vJiZwLnI9PT1DLldE
+fWVsc2Ugbz0hMQppZihvKXAucj1DLlhqfX19LApMdCgpe3ZhciBzLHI9UC5GbCh0Lk4sdC5YKQpyLlk1
+KDAsInR5cGUiLCJkaXJlY3RvcnkiKQpyLlk1KDAsIm5hbWUiLHRoaXMuYSkKcz10aGlzLmQKcy50b1N0
+cmluZwpyLlk1KDAsInN1YnRyZWUiLEwuVkQocykpCnM9dGhpcy5jCmlmKHMhPW51bGwpci5ZNSgwLCJw
+YXRoIixzKQpyZXR1cm4gcn19CkwuY0QucHJvdG90eXBlPXsKTHQoKXt2YXIgcyxyPXRoaXMscT1QLkZs
+KHQuTix0LlgpCnEuWTUoMCwidHlwZSIsImZpbGUiKQpxLlk1KDAsIm5hbWUiLHIuYSkKcz1yLmMKaWYo
+cyE9bnVsbClxLlk1KDAsInBhdGgiLHMpCnM9ci5kCmlmKHMhPW51bGwpcS5ZNSgwLCJocmVmIixzKQpz
+PXIuZQppZihzIT1udWxsKXEuWTUoMCwiZWRpdENvdW50IixzKQpzPXIuZgppZihzIT1udWxsKXEuWTUo
+MCwid2FzRXhwbGljaXRseU9wdGVkT3V0IixzKQpzPXIucgppZihzIT1udWxsKXEuWTUoMCwibWlncmF0
+aW9uU3RhdHVzIixzLmEpCnM9ci54CmlmKHMhPW51bGwpcS5ZNSgwLCJtaWdyYXRpb25TdGF0dXNDYW5C
+ZUNoYW5nZWQiLHMpCnJldHVybiBxfSwKZ0woKXtyZXR1cm4gdGhpcy5yfX0KTC5EOC5wcm90b3R5cGU9
+e30KTC5POS5wcm90b3R5cGU9ewp3KGEpe3JldHVybiB0aGlzLmJ9fQpMLkdiLnByb3RvdHlwZT17Cnco
+YSl7cmV0dXJuIHRoaXMuYn19ClIuTEwucHJvdG90eXBlPXsKTHQoKXtyZXR1cm4gUC5FRihbIm5vZGVJ
+ZCIsdGhpcy5iLCJraW5kIix0aGlzLmEuYV0sdC5OLHQuWCl9fQpSLk1ELnByb3RvdHlwZT17CiQxKGEp
+e3JldHVybiB0LmdwLmEoYSkuYT09PXRoaXMuYS5xKDAsImtpbmQiKX0sCiRTOjQ4fQpSLkg3LnByb3Rv
+dHlwZT17CncoYSl7cmV0dXJuIHRoaXMuYn19Ck0ubEkucHJvdG90eXBlPXsKV08oYSxiKXt2YXIgcyxy
+LHE9dC5kNApNLllGKCJhYnNvbHV0ZSIsSC5RSShbYixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVs
+bF0scSkpCnM9dGhpcy5hCnM9cy5ZcihiKT4wJiYhcy5oSyhiKQppZihzKXJldHVybiBiCnM9RC5hYigp
+CnI9SC5RSShbcyxiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSxxKQpNLllGKCJqb2luIixy
+KQpyZXR1cm4gdGhpcy5JUChuZXcgSC51NihyLHQuZUopKX0sCnpmKGEpe3ZhciBzLHIscT1YLkNMKGEs
+dGhpcy5hKQpxLkl4KCkKcz1xLmQKcj1zLmxlbmd0aAppZihyPT09MCl7cz1xLmIKcmV0dXJuIHM9PW51
+bGw/Ii4iOnN9aWYocj09PTEpe3M9cS5iCnJldHVybiBzPT1udWxsPyIuIjpzfWlmKDA+PXIpcmV0dXJu
+IEguT0gocywtMSkKcy5wb3AoKQpzPXEuZQppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpz
+LnBvcCgpCnEuSXgoKQpyZXR1cm4gcS53KDApfSwKSVAoYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGoK
+dC5PLmEoYSkKZm9yKHM9YS4kdGkscj1zLkMoImEyKGNYLkUpIikuYShuZXcgTS5xNygpKSxxPWEuZ20o
+YSkscz1uZXcgSC5TTyhxLHIscy5DKCJTTzxjWC5FPiIpKSxyPXRoaXMuYSxwPSExLG89ITEsbj0iIjtz
+LkYoKTspe209cS5nbCgpCmlmKHIuaEsobSkmJm8pe2w9WC5DTChtLHIpCms9bi5jaGFyQ29kZUF0KDAp
+PT0wP246bgpuPUMueEIuTmooaywwLHIuU3AoaywhMCkpCmwuYj1uCmlmKHIuZHMobikpQy5ObS5ZNShs
+LmUsMCxyLmdtSSgpKQpuPSIiK2wudygwKX1lbHNlIGlmKHIuWXIobSk+MCl7bz0hci5oSyhtKQpuPSIi
+K219ZWxzZXtqPW0ubGVuZ3RoCmlmKGohPT0wKXtpZigwPj1qKXJldHVybiBILk9IKG0sMCkKaj1yLlVk
+KG1bMF0pfWVsc2Ugaj0hMQppZighailpZihwKW4rPXIuZ21JKCkKbis9bX1wPXIuZHMobSl9cmV0dXJu
+IG4uY2hhckNvZGVBdCgwKT09MD9uOm59LApvNShhKXt2YXIgcwppZighdGhpcy55MyhhKSlyZXR1cm4g
+YQpzPVguQ0woYSx0aGlzLmEpCnMuclIoKQpyZXR1cm4gcy53KDApfSwKeTMoYSl7dmFyIHMscixxLHAs
+byxuLG0sbCxrPXRoaXMuYSxqPWsuWXIoYSkKaWYoaiE9PTApe2lmKGs9PT0kLktrKCkpZm9yKHM9MDtz
+PGo7KytzKWlmKEMueEIuVyhhLHMpPT09NDcpcmV0dXJuITAKcj1qCnE9NDd9ZWxzZXtyPTAKcT1udWxs
+fWZvcihwPW5ldyBILnFqKGEpLmEsbz1wLmxlbmd0aCxzPXIsbj1udWxsO3M8bzsrK3Msbj1xLHE9bSl7
+bT1DLnhCLk8ocCxzKQppZihrLnI0KG0pKXtpZihrPT09JC5LaygpJiZtPT09NDcpcmV0dXJuITAKaWYo
+cSE9bnVsbCYmay5yNChxKSlyZXR1cm4hMAppZihxPT09NDYpbD1uPT1udWxsfHxuPT09NDZ8fGsucjQo
+bikKZWxzZSBsPSExCmlmKGwpcmV0dXJuITB9fWlmKHE9PW51bGwpcmV0dXJuITAKaWYoay5yNChxKSly
+ZXR1cm4hMAppZihxPT09NDYpaz1uPT1udWxsfHxrLnI0KG4pfHxuPT09NDYKZWxzZSBrPSExCmlmKGsp
+cmV0dXJuITAKcmV0dXJuITF9LApIUChhLGIpe3ZhciBzLHIscSxwLG8sbixtLGw9dGhpcyxrPSdVbmFi
+bGUgdG8gZmluZCBhIHBhdGggdG8gIicKYj1sLldPKDAsYikKcz1sLmEKaWYocy5ZcihiKTw9MCYmcy5Z
+cihhKT4wKXJldHVybiBsLm81KGEpCmlmKHMuWXIoYSk8PTB8fHMuaEsoYSkpYT1sLldPKDAsYSkKaWYo
+cy5ZcihhKTw9MCYmcy5ZcihiKT4wKXRocm93IEguYihYLkk3KGsrYSsnIiBmcm9tICInK2IrJyIuJykp
+CnI9WC5DTChiLHMpCnIuclIoKQpxPVguQ0woYSxzKQpxLnJSKCkKcD1yLmQKbz1wLmxlbmd0aAppZihv
+IT09MCl7aWYoMD49bylyZXR1cm4gSC5PSChwLDApCnA9Si5STShwWzBdLCIuIil9ZWxzZSBwPSExCmlm
+KHApcmV0dXJuIHEudygwKQpwPXIuYgpvPXEuYgppZihwIT1vKXA9cD09bnVsbHx8bz09bnVsbHx8IXMu
+TmMocCxvKQplbHNlIHA9ITEKaWYocClyZXR1cm4gcS53KDApCndoaWxlKCEwKXtwPXIuZApvPXAubGVu
+Z3RoCmlmKG8hPT0wKXtuPXEuZAptPW4ubGVuZ3RoCmlmKG0hPT0wKXtpZigwPj1vKXJldHVybiBILk9I
+KHAsMCkKcD1wWzBdCmlmKDA+PW0pcmV0dXJuIEguT0gobiwwKQpuPXMuTmMocCxuWzBdKQpwPW59ZWxz
+ZSBwPSExfWVsc2UgcD0hMQppZighcClicmVhawpDLk5tLlc0KHIuZCwwKQpDLk5tLlc0KHIuZSwxKQpD
+Lk5tLlc0KHEuZCwwKQpDLk5tLlc0KHEuZSwxKX1wPXIuZApvPXAubGVuZ3RoCmlmKG8hPT0wKXtpZigw
+Pj1vKXJldHVybiBILk9IKHAsMCkKcD1KLlJNKHBbMF0sIi4uIil9ZWxzZSBwPSExCmlmKHApdGhyb3cg
+SC5iKFguSTcoaythKyciIGZyb20gIicrYisnIi4nKSkKcD10Lk4KQy5ObS5VRyhxLmQsMCxQLk84KHIu
+ZC5sZW5ndGgsIi4uIiwhMSxwKSkKQy5ObS5ZNShxLmUsMCwiIikKQy5ObS5VRyhxLmUsMSxQLk84KHIu
+ZC5sZW5ndGgscy5nbUkoKSwhMSxwKSkKcz1xLmQKcD1zLmxlbmd0aAppZihwPT09MClyZXR1cm4iLiIK
+aWYocD4xJiZKLlJNKEMuTm0uZ3JaKHMpLCIuIikpe3M9cS5kCmlmKDA+PXMubGVuZ3RoKXJldHVybiBI
+Lk9IKHMsLTEpCnMucG9wKCkKcz1xLmUKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkKcy5w
+b3AoKQppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCkMuTm0uaShzLCIiKX1x
+LmI9IiIKcS5JeCgpCnJldHVybiBxLncoMCl9fQpNLnE3LnByb3RvdHlwZT17CiQxKGEpe3JldHVybiBI
+Lm4oYSkhPT0iIn0sCiRTOjZ9Ck0uTm8ucHJvdG90eXBlPXsKJDEoYSl7SC5rKGEpCnJldHVybiBhPT1u
+dWxsPyJudWxsIjonIicrYSsnIid9LAokUzo0OX0KQi5mdi5wcm90b3R5cGU9ewp4WihhKXt2YXIgcyxy
+PXRoaXMuWXIoYSkKaWYocj4wKXJldHVybiBDLnhCLk5qKGEsMCxyKQppZih0aGlzLmhLKGEpKXtpZigw
+Pj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLDApCnM9YVswXX1lbHNlIHM9bnVsbApyZXR1cm4gc30sCk5j
+KGEsYil7cmV0dXJuIGE9PT1ifX0KWC5XRC5wcm90b3R5cGU9ewpJeCgpe3ZhciBzLHIscT10aGlzCndo
+aWxlKCEwKXtzPXEuZAppZighKHMubGVuZ3RoIT09MCYmSi5STShDLk5tLmdyWihzKSwiIikpKWJyZWFr
+CnM9cS5kCmlmKDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkKcz1xLmUKaWYoMD49
+cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKX1zPXEuZQpyPXMubGVuZ3RoCmlmKHIhPT0w
+KUMuTm0uWTUocyxyLTEsIiIpfSwKclIoKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9SC5RSShbXSx0
+LnMpCmZvcihzPW0uZCxyPXMubGVuZ3RoLHE9MCxwPTA7cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgw
+LEgubGspKHMpLCsrcCl7bz1zW3BdCm49Si5pYShvKQppZighKG4uRE4obywiLiIpfHxuLkROKG8sIiIp
+KSlpZihuLkROKG8sIi4uIikpe249bC5sZW5ndGgKaWYobiE9PTApe2lmKDA+PW4pcmV0dXJuIEguT0go
+bCwtMSkKbC5wb3AoKX1lbHNlICsrcX1lbHNlIEMuTm0uaShsLG8pfWlmKG0uYj09bnVsbClDLk5tLlVH
+KGwsMCxQLk84KHEsIi4uIiwhMSx0Lk4pKQppZihsLmxlbmd0aD09PTAmJm0uYj09bnVsbClDLk5tLmko
+bCwiLiIpCm0uc25KKGwpCnM9bS5hCm0uc1BoKFAuTzgobC5sZW5ndGgrMSxzLmdtSSgpLCEwLHQuTikp
+CnI9bS5iCmlmKHI9PW51bGx8fGwubGVuZ3RoPT09MHx8IXMuZHMocikpQy5ObS5ZNShtLmUsMCwiIikK
+cj1tLmIKaWYociE9bnVsbCYmcz09PSQuS2soKSl7ci50b1N0cmluZwptLmI9SC55cyhyLCIvIiwiXFwi
+KX1tLkl4KCl9LAp3KGEpe3ZhciBzLHIscT10aGlzLHA9cS5iCnA9cCE9bnVsbD8iIitwOiIiCmZvcihz
+PTA7czxxLmQubGVuZ3RoOysrcyl7cj1xLmUKaWYocz49ci5sZW5ndGgpcmV0dXJuIEguT0gocixzKQpy
+PXArSC5FaihyW3NdKQpwPXEuZAppZihzPj1wLmxlbmd0aClyZXR1cm4gSC5PSChwLHMpCnA9citILkVq
+KHBbc10pfXArPUguRWooQy5ObS5ncloocS5lKSkKcmV0dXJuIHAuY2hhckNvZGVBdCgwKT09MD9wOnB9
+LApzbkooYSl7dGhpcy5kPXQuRS5hKGEpfSwKc1BoKGEpe3RoaXMuZT10LkUuYShhKX19ClguZHYucHJv
+dG90eXBlPXsKdyhhKXtyZXR1cm4iUGF0aEV4Y2VwdGlvbjogIit0aGlzLmF9LAokaVJ6OjF9Ck8uekwu
+cHJvdG90eXBlPXsKdyhhKXtyZXR1cm4gdGhpcy5nb2ModGhpcyl9fQpFLk9GLnByb3RvdHlwZT17ClVk
+KGEpe3JldHVybiBDLnhCLnRnKGEsIi8iKX0sCnI0KGEpe3JldHVybiBhPT09NDd9LApkcyhhKXt2YXIg
+cz1hLmxlbmd0aApyZXR1cm4gcyE9PTAmJkMueEIuTyhhLHMtMSkhPT00N30sClNwKGEsYil7aWYoYS5s
+ZW5ndGghPT0wJiZDLnhCLlcoYSwwKT09PTQ3KXJldHVybiAxCnJldHVybiAwfSwKWXIoYSl7cmV0dXJu
+IHRoaXMuU3AoYSwhMSl9LApoSyhhKXtyZXR1cm4hMX0sCmdvYygpe3JldHVybiJwb3NpeCJ9LApnbUko
+KXtyZXR1cm4iLyJ9fQpGLnJ1LnByb3RvdHlwZT17ClVkKGEpe3JldHVybiBDLnhCLnRnKGEsIi8iKX0s
+CnI0KGEpe3JldHVybiBhPT09NDd9LApkcyhhKXt2YXIgcz1hLmxlbmd0aAppZihzPT09MClyZXR1cm4h
+MQppZihDLnhCLk8oYSxzLTEpIT09NDcpcmV0dXJuITAKcmV0dXJuIEMueEIuVGMoYSwiOi8vIikmJnRo
+aXMuWXIoYSk9PT1zfSwKU3AoYSxiKXt2YXIgcyxyLHEscCxvPWEubGVuZ3RoCmlmKG89PT0wKXJldHVy
+biAwCmlmKEMueEIuVyhhLDApPT09NDcpcmV0dXJuIDEKZm9yKHM9MDtzPG87KytzKXtyPUMueEIuVyhh
+LHMpCmlmKHI9PT00NylyZXR1cm4gMAppZihyPT09NTgpe2lmKHM9PT0wKXJldHVybiAwCnE9Qy54Qi5Y
+VShhLCIvIixDLnhCLlFpKGEsIi8vIixzKzEpP3MrMzpzKQppZihxPD0wKXJldHVybiBvCmlmKCFifHxv
+PHErMylyZXR1cm4gcQppZighQy54Qi5uKGEsImZpbGU6Ly8iKSlyZXR1cm4gcQppZighQi5ZdShhLHEr
+MSkpcmV0dXJuIHEKcD1xKzMKcmV0dXJuIG89PT1wP3A6cSs0fX1yZXR1cm4gMH0sCllyKGEpe3JldHVy
+biB0aGlzLlNwKGEsITEpfSwKaEsoYSl7cmV0dXJuIGEubGVuZ3RoIT09MCYmQy54Qi5XKGEsMCk9PT00
+N30sCmdvYygpe3JldHVybiJ1cmwifSwKZ21JKCl7cmV0dXJuIi8ifX0KTC5JVi5wcm90b3R5cGU9ewpV
+ZChhKXtyZXR1cm4gQy54Qi50ZyhhLCIvIil9LApyNChhKXtyZXR1cm4gYT09PTQ3fHxhPT09OTJ9LApk
+cyhhKXt2YXIgcz1hLmxlbmd0aAppZihzPT09MClyZXR1cm4hMQpzPUMueEIuTyhhLHMtMSkKcmV0dXJu
+IShzPT09NDd8fHM9PT05Mil9LApTcChhLGIpe3ZhciBzLHIscT1hLmxlbmd0aAppZihxPT09MClyZXR1
+cm4gMApzPUMueEIuVyhhLDApCmlmKHM9PT00NylyZXR1cm4gMQppZihzPT09OTIpe2lmKHE8Mnx8Qy54
+Qi5XKGEsMSkhPT05MilyZXR1cm4gMQpyPUMueEIuWFUoYSwiXFwiLDIpCmlmKHI+MCl7cj1DLnhCLlhV
+KGEsIlxcIixyKzEpCmlmKHI+MClyZXR1cm4gcn1yZXR1cm4gcX1pZihxPDMpcmV0dXJuIDAKaWYoIUIu
+T1MocykpcmV0dXJuIDAKaWYoQy54Qi5XKGEsMSkhPT01OClyZXR1cm4gMApxPUMueEIuVyhhLDIpCmlm
+KCEocT09PTQ3fHxxPT09OTIpKXJldHVybiAwCnJldHVybiAzfSwKWXIoYSl7cmV0dXJuIHRoaXMuU3Ao
+YSwhMSl9LApoSyhhKXtyZXR1cm4gdGhpcy5ZcihhKT09PTF9LApPdChhLGIpe3ZhciBzCmlmKGE9PT1i
+KXJldHVybiEwCmlmKGE9PT00NylyZXR1cm4gYj09PTkyCmlmKGE9PT05MilyZXR1cm4gYj09PTQ3Cmlm
+KChhXmIpIT09MzIpcmV0dXJuITEKcz1hfDMyCnJldHVybiBzPj05NyYmczw9MTIyfSwKTmMoYSxiKXt2
+YXIgcyxyCmlmKGE9PT1iKXJldHVybiEwCnM9YS5sZW5ndGgKaWYocyE9PWIubGVuZ3RoKXJldHVybiEx
+CmZvcihyPTA7cjxzOysrcilpZighdGhpcy5PdChDLnhCLlcoYSxyKSxDLnhCLlcoYixyKSkpcmV0dXJu
+ITEKcmV0dXJuITB9LApnb2MoKXtyZXR1cm4id2luZG93cyJ9LApnbUkoKXtyZXR1cm4iXFwifX07KGZ1
+bmN0aW9uIGFsaWFzZXMoKXt2YXIgcz1KLkd2LnByb3RvdHlwZQpzLlU9cy53CnM9Si5NRi5wcm90b3R5
+cGUKcy50PXMudwpzPVAuY1gucHJvdG90eXBlCnMuR0c9cy5ldgpzPVAuTWgucHJvdG90eXBlCnMueGI9
+cy53CnM9Vy5jdi5wcm90b3R5cGUKcy5EVz1zLnI2CnM9Vy5tNi5wcm90b3R5cGUKcy5qRj1zLkViCnM9
+UC5FNC5wcm90b3R5cGUKcy5Vcj1zLnEKcy5lND1zLlk1CnM9UC52Zy5wcm90b3R5cGUKcy5iaD1zLlk1
+fSkoKTsoZnVuY3Rpb24gaW5zdGFsbFRlYXJPZmZzKCl7dmFyIHM9aHVua0hlbHBlcnMuX3N0YXRpY18x
+LHI9aHVua0hlbHBlcnMuX3N0YXRpY18wLHE9aHVua0hlbHBlcnMuaW5zdGFsbEluc3RhbmNlVGVhck9m
+ZixwPWh1bmtIZWxwZXJzLmluc3RhbGxTdGF0aWNUZWFyT2ZmLG89aHVua0hlbHBlcnMuX2luc3RhbmNl
+XzF1CnMoUCwiRVgiLCJaViIsNSkKcyhQLCJ5dCIsIm9BIiw1KQpzKFAsInFXIiwiQnoiLDUpCnIoUCwi
+VUkiLCJlTiIsMCkKcShQLlBmLnByb3RvdHlwZSwiZ1lKIiwwLDEsbnVsbCxbIiQyIiwiJDEiXSxbIncw
+IiwicG0iXSw0MCwwLDApCnMoUCwiQ3kiLCJOQyIsNCkKcyhQLCJQSCIsIk10IiwyKQpwKFcsInBTIiw0
+LG51bGwsWyIkNCJdLFsicUQiXSwxNCwwKQpwKFcsIlY0Iiw0LG51bGwsWyIkNCJdLFsibloiXSwxNCww
+KQpvKFAuQXMucHJvdG90eXBlLCJndU0iLCJWIiwyKQpzKFAsImlHIiwid1kiLDUyKQpzKFAsIncwIiwi
+ZFUiLDM1KQpzKEwsImlTIiwiaTYiLDEpfSkoKTsoZnVuY3Rpb24gaW5oZXJpdGFuY2UoKXt2YXIgcz1o
+dW5rSGVscGVycy5taXhpbixyPWh1bmtIZWxwZXJzLmluaGVyaXQscT1odW5rSGVscGVycy5pbmhlcml0
+TWFueQpyKFAuTWgsbnVsbCkKcShQLk1oLFtILkZLLEouR3YsSi5tMSxQLmNYLEguZVQsUC5YUyxQLm5Z
+LEguYTcsUC5BbixILkZ1LEguSkIsSC5TVSxILlJlLEgud3YsUC5QbixILldVLEguTEksSC5UcCxILmY5
+LEgudGUsSC5icSxILlhPLEgua3IsUC5ZayxILnZoLEguTjYsSC5WUixILkVLLEguUGIsSC50USxILlNk
+LEguSmMsSC5HLFAuVzMsUC5paCxQLkZ5LFAuR1YsUC5DdyxQLlBmLFAuRmUsUC52cyxQLk9NLFAucWgs
+UC5NTyxQLmtULFAueEksUC5tMCxQLnBSLFAuYm4sUC5sbSxQLmxELFAuS1AsUC5sZixQLldZLFAuVWss
+UC5TaCxQLlJ3LFAuYnosUC5pUCxQLms1LFAuS1ksUC5DRCxQLmFFLFAuTjMsUC5jOCxQLlpkLFAuTSxQ
+LkRuLFAuUEUsUC5VZixXLmlkLFcuRmssVy5KUSxXLkdtLFcudkQsVy5tNixXLk93LFcuVzksVy5kVyxX
+Lm1rLFcuS28sUC5pSixQLkU0LFUuZDIsVS5TZSxVLk1sLFUueUQsVS53YixCLmo4LEIucXAsVC5tUSxM
+LlhBLEwuRDgsTC5POSxMLkdiLFIuTEwsUi5INyxNLmxJLE8uekwsWC5XRCxYLmR2XSkKcShKLkd2LFtK
+LnlFLEoud2UsSi5NRixKLmpkLEoucUksSi5EcixILkVULFcuRDAsVy5BeixXLkxlLFcuTmgsVy5hZSxX
+LklCLFcubjcsVy5lYSxXLmJyLFcuU2csVy51OCxXLks3LFcuWFcsUC5oRl0pCnEoSi5NRixbSi5pQyxK
+LmtkLEouYzVdKQpyKEouUG8sSi5qZCkKcShKLnFJLFtKLmJVLEoua0RdKQpxKFAuY1gsW0guQlIsSC5i
+USxILmkxLEguVTUsSC5BTSxILnU2LEguWFIsUC5tVyxILnVuXSkKcShILkJSLFtILlp5LEguUUNdKQpy
+KEgub2wsSC5aeSkKcihILlVxLEguUUMpCnIoSC5qVixILlVxKQpxKFAuWFMsW0guYyxQLkV6LEguYXos
+SC52VixILkVxLFAuQzYsSC5rUyxQLlVkLFAuRixQLkFULFAubXAsUC51YixQLmRzLFAubGosUC5VVixQ
+LnAsTC5RV10pCnIoUC51eSxQLm5ZKQpxKFAudXksW0gudzIsVy53eixXLmU3XSkKcihILnFqLEgudzIp
+CnEoSC5iUSxbSC5hTCxILk1CLEguaTVdKQpxKEguYUwsW0gubkgsSC5sSixQLmk4XSkKcihILnh5LEgu
+aTEpCnEoUC5BbixbSC5NSCxILlNPLEguVTFdKQpyKEguZDUsSC5BTSkKcihQLlJVLFAuUG4pCnIoUC5H
+aixQLlJVKQpyKEguUEQsUC5HaikKcihILkxQLEguV1UpCnEoSC5UcCxbSC5FMSxILkF5LEgubGMsSC5k
+QyxILlZYLFAudGgsUC5oYSxQLldNLFAucFYsUC5qWixQLkI1LFAuT1IsUC55USxQLlZDLFAuUlosUC5j
+NixQLnFkLFcuQ3YsVy52TixXLlV2LFcuRWcsVy5FbyxXLldrLFcuSUEsUC5HRSxQLk43LFAudVEsUC5E
+VixQLlBDLFAuUVMsUC5ucCxQLlV0LFUuYU4sVS5iMCxMLmUsTC5vWixMLmpyLEwueTgsTC5IaSxMLkJU
+LEwuUFksTC5MLEwuV3gsTC5IbyxMLmROLEwuSUMsTC54eixMLkJOLEwuZkMsTC5UbSxMLnVlLEwuR0gs
+TC5FRSxMLlZTLEwuVEQsTC5JZixMLnRCLEwubTIsUi5NRCxNLnE3LE0uTm9dKQpxKEguRTEsW0guQ2os
+SC53TixQLlNYLFAuR3MsUC5VNyxQLnJhLFAudGksUC5XRixQLm4xLFAuY1MsUC5KVCxQLk1FLFAueTUs
+UC55SSxXLktTLFcuQTMsVy5mbSxQLkUyLFAuamcsTC5xbF0pCnIoSC5XMCxQLkV6KQpxKEgubGMsW0gu
+engsSC5yVF0pCnIoSC5rWSxQLkM2KQpyKFAuaWwsUC5ZaykKcShQLmlsLFtILk41LFAudXcsVy5jZixX
+LlN5XSkKcShQLm1XLFtILktXLFAucTRdKQpyKEguTFosSC5FVCkKcShILkxaLFtILlJHLEguV0JdKQpy
+KEguVlAsSC5SRykKcihILkRnLEguVlApCnIoSC5aRyxILldCKQpyKEguUGcsSC5aRykKcShILlBnLFtI
+LnhqLEguZEUsSC5aQSxILmRULEguUHEsSC5lRSxILlY2XSkKcihILmlNLEgua1MpCnEoSC5BeSxbUC5W
+cyxQLkZ0LFAueUgsUC5kYSxQLm9RLFAudnIsUC5ydCxQLktGLFAuWkwsUC5SVCxQLnJxLFAuUlcsUC51
+TyxQLkV2LFAuVnAsUC54cixQLk56LEwuVlcsTC5uVCxMLk5ZLEwuUUxdKQpyKFAuWmYsUC5QZikKcihQ
+LkppLFAubTApCnIoUC5YdixQLnBSKQpyKFAuYjYsUC5YdikKcihQLlZqLFAuV1kpCnEoUC5VayxbUC5D
+VixQLlppLFAuYnldKQpyKFAud0ksUC5rVCkKcShQLndJLFtQLlU4LFAub2osUC5NeCxQLkUzLFAuR1ld
+KQpyKFAuSzgsUC5VZCkKcihQLnR1LFAuU2gpCnIoUC51NSxQLlppKQpxKFAuQVQsW1AuYkosUC5lWV0p
+CnIoUC5xZSxQLkRuKQpxKFcuRDAsW1cuS1YsVy53YSxXLks1LFcuQ21dKQpxKFcuS1YsW1cuY3YsVy5u
+eCxXLlFGLFcuQ1FdKQpxKFcuY3YsW1cucUUsUC5oaV0pCnEoVy5xRSxbVy5HaCxXLmZZLFcuclosVy5R
+UCxXLmg0LFcuU04sVy5scCxXLlRiLFcuSXYsVy5XUCxXLnlZXSkKcihXLm9KLFcuTGUpCnIoVy5oSCxX
+LkF6KQpyKFcuVmIsVy5RRikKcihXLmZKLFcud2EpCnEoVy5lYSxbVy53NixXLmV3XSkKcihXLkFqLFcu
+dzYpCnIoVy5yQixXLks3KQpyKFcuQkgsVy5yQikKcihXLnc0LFcuSUIpCnIoVy5vYSxXLlhXKQpyKFcu
+cmgsVy5vYSkKcihXLmk3LFcuY2YpCnIoUC5BcyxQLlZqKQpxKFAuQXMsW1cuSTQsUC5LZV0pCnIoVy5S
+TyxQLnFoKQpyKFcuQ3EsVy5STykKcihXLnhDLFAuTU8pCnIoVy5jdCxXLm02KQpyKFAuQmYsUC5pSikK
+cShQLkU0LFtQLnI3LFAudmddKQpyKFAuVHosUC52ZykKcihQLm5kLFAuaGkpCnEoTC5EOCxbTC52dCxM
+LmNEXSkKcihCLmZ2LE8uekwpCnEoQi5mdixbRS5PRixGLnJ1LEwuSVZdKQpzKEgudzIsSC5SZSkKcyhI
+LlFDLFAubEQpCnMoSC5SRyxQLmxEKQpzKEguVlAsSC5TVSkKcyhILldCLFAubEQpCnMoSC5aRyxILlNV
+KQpzKFAublksUC5sRCkKcyhQLldZLFAubGYpCnMoUC5SVSxQLktQKQpzKFAucFIsUC5sZikKcyhXLkxl
+LFcuaWQpCnMoVy5LNyxQLmxEKQpzKFcuckIsVy5HbSkKcyhXLlhXLFAubEQpCnMoVy5vYSxXLkdtKQpz
+KFAudmcsUC5sRCl9KSgpCnZhciB2PXt0eXBlVW5pdmVyc2U6e2VDOm5ldyBNYXAoKSx0Ujp7fSxlVDp7
+fSx0UFY6e30sc0VBOltdfSxtYW5nbGVkR2xvYmFsTmFtZXM6e0lqOiJpbnQiLENQOiJkb3VibGUiLFpa
+OiJudW0iLHFVOiJTdHJpbmciLGEyOiJib29sIixjODoiTnVsbCIsek06Ikxpc3QifSxtYW5nbGVkTmFt
+ZXM6e30sdHlwZXM6WyJ+KCkiLCJ+KEFqKSIsInFVKHFVKSIsIn4oY3YpIiwiQChAKSIsIn4ofigpKSIs
+ImEyKHFVKSIsImI4PH4+KEFqKSIsIn4ocVUscVUpIiwifihNaD8sTWg/KSIsIkAoKSIsIn4ocVUsQCki
+LCJ+KHh1PHFVPikiLCJjOChAKSIsImEyKGN2LHFVLHFVLEpRKSIsImM4KCkiLCJhMihrRikiLCJjOChl
+YSkiLCJ+KG42LHFVLElqKSIsIn4ocVVbQF0pIiwiSWooSWosSWopIiwiQChxVSkiLCJ+KHFVLHFVPyki
+LCJuNihALEApIiwifihxVSxJaikiLCJhMihLVikiLCJaMDxxVSxxVT4oWjA8cVUscVU+LHFVKSIsIn4o
+ZWEpIiwifihHRCxAKSIsInZzPEA+KEApIiwifihLVixLVj8pIiwifihALEApIiwiYzgoQCxAKSIsImEy
+KHh1PHFVPikiLCJjOChNaCxHeikiLCJNaD8oQCkiLCJUejxAPihAKSIsIkU0KEApIiwiTEwoQCkiLCJa
+MDxxVSxNaD8+KExMKSIsIn4oTWhbR3o/XSkiLCJjOCh+KCkpIiwiYzgoWjA8cVUsTWg/Pj8pIiwiYzgo
+TWgsQCkiLCJyNyhAKSIsIn4oSWosQCkiLCJ+KGV3KSIsInFVKFowPEAsQD4pIiwiYTIoSDcpIiwicVUo
+cVU/KSIsIkAoQCxxVSkiLCJ+KEApIiwiTWg/KE1oPykiLCJjOChALEd6KSJdLGludGVyY2VwdG9yc0J5
+VGFnOm51bGwsbGVhZlRhZ3M6bnVsbCxhcnJheVJ0aTpTeW1ib2woIiR0aSIpfQpILnhiKHYudHlwZVVu
+aXZlcnNlLEpTT04ucGFyc2UoJ3siaUMiOiJNRiIsImtkIjoiTUYiLCJjNSI6Ik1GIiwicngiOiJlYSIs
+ImU1IjoiZWEiLCJZMCI6ImhpIiwidHAiOiJoaSIsIkc4IjoiZXciLCJNciI6InFFIiwiZUwiOiJxRSIs
+IkkwIjoiS1YiLCJocyI6IktWIiwiWGciOiJRRiIsIm5yIjoiQWoiLCJ5NCI6Inc2IiwiYVAiOiJDbSIs
+InhjIjoibngiLCJrSiI6Im54IiwielUiOiJEZyIsImRmIjoiRVQiLCJ5RSI6eyJhMiI6W119LCJ3ZSI6
+eyJjOCI6W119LCJNRiI6eyJ2bSI6W119LCJqZCI6eyJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsi
+MSJdfSwiUG8iOnsiamQiOlsiMSJdLCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdfSwibTEi
+OnsiQW4iOlsiMSJdfSwicUkiOnsiQ1AiOltdLCJaWiI6W119LCJiVSI6eyJDUCI6W10sIklqIjpbXSwi
+WloiOltdfSwia0QiOnsiQ1AiOltdLCJaWiI6W119LCJEciI6eyJxVSI6W10sInZYIjpbXX0sIkJSIjp7
+ImNYIjpbIjIiXX0sImVUIjp7IkFuIjpbIjIiXX0sIlp5Ijp7IkJSIjpbIjEiLCIyIl0sImNYIjpbIjIi
+XSwiY1guRSI6IjIifSwib2wiOnsiWnkiOlsiMSIsIjIiXSwiQlIiOlsiMSIsIjIiXSwiYlEiOlsiMiJd
+LCJjWCI6WyIyIl0sImNYLkUiOiIyIn0sIlVxIjp7ImxEIjpbIjIiXSwiek0iOlsiMiJdLCJCUiI6WyIx
+IiwiMiJdLCJiUSI6WyIyIl0sImNYIjpbIjIiXX0sImpWIjp7IlVxIjpbIjEiLCIyIl0sImxEIjpbIjIi
+XSwiek0iOlsiMiJdLCJCUiI6WyIxIiwiMiJdLCJiUSI6WyIyIl0sImNYIjpbIjIiXSwibEQuRSI6IjIi
+LCJjWC5FIjoiMiJ9LCJjIjp7IlhTIjpbXX0sInFqIjp7ImxEIjpbIklqIl0sIlJlIjpbIklqIl0sInpN
+IjpbIklqIl0sImJRIjpbIklqIl0sImNYIjpbIklqIl0sImxELkUiOiJJaiIsIlJlLkUiOiJJaiJ9LCJi
+USI6eyJjWCI6WyIxIl19LCJhTCI6eyJiUSI6WyIxIl0sImNYIjpbIjEiXX0sIm5IIjp7ImFMIjpbIjEi
+XSwiYlEiOlsiMSJdLCJjWCI6WyIxIl0sImFMLkUiOiIxIiwiY1guRSI6IjEifSwiYTciOnsiQW4iOlsi
+MSJdfSwiaTEiOnsiY1giOlsiMiJdLCJjWC5FIjoiMiJ9LCJ4eSI6eyJpMSI6WyIxIiwiMiJdLCJiUSI6
+WyIyIl0sImNYIjpbIjIiXSwiY1guRSI6IjIifSwiTUgiOnsiQW4iOlsiMiJdfSwibEoiOnsiYUwiOlsi
+MiJdLCJiUSI6WyIyIl0sImNYIjpbIjIiXSwiYUwuRSI6IjIiLCJjWC5FIjoiMiJ9LCJVNSI6eyJjWCI6
+WyIxIl0sImNYLkUiOiIxIn0sIlNPIjp7IkFuIjpbIjEiXX0sIkFNIjp7ImNYIjpbIjEiXSwiY1guRSI6
+IjEifSwiZDUiOnsiQU0iOlsiMSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXSwiY1guRSI6IjEifSwiVTEi
+OnsiQW4iOlsiMSJdfSwiTUIiOnsiYlEiOlsiMSJdLCJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIkZ1Ijp7
+IkFuIjpbIjEiXX0sInU2Ijp7ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiSkIiOnsiQW4iOlsiMSJdfSwi
+dzIiOnsibEQiOlsiMSJdLCJSZSI6WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19
+LCJ3diI6eyJHRCI6W119LCJQRCI6eyJHaiI6WyIxIiwiMiJdLCJSVSI6WyIxIiwiMiJdLCJQbiI6WyIx
+IiwiMiJdLCJLUCI6WyIxIiwiMiJdLCJaMCI6WyIxIiwiMiJdfSwiV1UiOnsiWjAiOlsiMSIsIjIiXX0s
+IkxQIjp7IldVIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl19LCJYUiI6eyJjWCI6WyIxIl0sImNYLkUi
+OiIxIn0sIkxJIjp7InZRIjpbXX0sIlcwIjp7IkV6IjpbXSwiWFMiOltdfSwiYXoiOnsiWFMiOltdfSwi
+dlYiOnsiWFMiOltdfSwidGUiOnsiUnoiOltdfSwiWE8iOnsiR3oiOltdfSwiVHAiOnsiRUgiOltdfSwi
+QXkiOnsiRUgiOltdfSwiRTEiOnsiRUgiOltdfSwibGMiOnsiRUgiOltdfSwiengiOnsiRUgiOltdfSwi
+clQiOnsiRUgiOltdfSwiRXEiOnsiWFMiOltdfSwia1kiOnsiWFMiOltdfSwiTjUiOnsiWWsiOlsiMSIs
+IjIiXSwiRm8iOlsiMSIsIjIiXSwiWjAiOlsiMSIsIjIiXSwiWWsuSyI6IjEiLCJZay5WIjoiMiJ9LCJp
+NSI6eyJiUSI6WyIxIl0sImNYIjpbIjEiXSwiY1guRSI6IjEifSwiTjYiOnsiQW4iOlsiMSJdfSwiVlIi
+Onsid0wiOltdLCJ2WCI6W119LCJFSyI6eyJpYiI6W10sIk9kIjpbXX0sIktXIjp7ImNYIjpbImliIl0s
+ImNYLkUiOiJpYiJ9LCJQYiI6eyJBbiI6WyJpYiJdfSwidFEiOnsiT2QiOltdfSwidW4iOnsiY1giOlsi
+T2QiXSwiY1guRSI6Ik9kIn0sIlNkIjp7IkFuIjpbIk9kIl19LCJFVCI6eyJBUyI6W119LCJMWiI6eyJY
+aiI6WyIxIl0sIkVUIjpbXSwiQVMiOltdfSwiRGciOnsibEQiOlsiQ1AiXSwiWGoiOlsiQ1AiXSwiek0i
+OlsiQ1AiXSwiRVQiOltdLCJiUSI6WyJDUCJdLCJBUyI6W10sImNYIjpbIkNQIl0sIlNVIjpbIkNQIl0s
+ImxELkUiOiJDUCJ9LCJQZyI6eyJsRCI6WyJJaiJdLCJYaiI6WyJJaiJdLCJ6TSI6WyJJaiJdLCJFVCI6
+W10sImJRIjpbIklqIl0sIkFTIjpbXSwiY1giOlsiSWoiXSwiU1UiOlsiSWoiXX0sInhqIjp7ImxEIjpb
 IklqIl0sIlhqIjpbIklqIl0sInpNIjpbIklqIl0sIkVUIjpbXSwiYlEiOlsiSWoiXSwiQVMiOltdLCJj
-WCI6WyJJaiJdLCJTVSI6WyJJaiJdLCJsRC5FIjoiSWoifSwiUHEiOnsibEQiOlsiSWoiXSwiWGoiOlsi
+WCI6WyJJaiJdLCJTVSI6WyJJaiJdLCJsRC5FIjoiSWoifSwiZEUiOnsibEQiOlsiSWoiXSwiWGoiOlsi
 SWoiXSwiek0iOlsiSWoiXSwiRVQiOltdLCJiUSI6WyJJaiJdLCJBUyI6W10sImNYIjpbIklqIl0sIlNV
-IjpbIklqIl0sImxELkUiOiJJaiJ9LCJlRSI6eyJsRCI6WyJJaiJdLCJYaiI6WyJJaiJdLCJ6TSI6WyJJ
+IjpbIklqIl0sImxELkUiOiJJaiJ9LCJaQSI6eyJsRCI6WyJJaiJdLCJYaiI6WyJJaiJdLCJ6TSI6WyJJ
 aiJdLCJFVCI6W10sImJRIjpbIklqIl0sIkFTIjpbXSwiY1giOlsiSWoiXSwiU1UiOlsiSWoiXSwibEQu
-RSI6IklqIn0sIlY2Ijp7ImxEIjpbIklqIl0sIm42IjpbXSwiWGoiOlsiSWoiXSwiek0iOlsiSWoiXSwi
-RVQiOltdLCJiUSI6WyJJaiJdLCJBUyI6W10sImNYIjpbIklqIl0sIlNVIjpbIklqIl0sImxELkUiOiJJ
-aiJ9LCJrUyI6eyJYUyI6W119LCJpTSI6eyJFeiI6W10sIlhTIjpbXX0sInZzIjp7ImI4IjpbIjEiXX0s
-IkdWIjp7IkFuIjpbIjEiXX0sInE0Ijp7ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiQ3ciOnsiWFMiOltd
-fSwiWmYiOnsiUGYiOlsiMSJdfSwibTAiOnsiUW0iOltdfSwiSmkiOnsibTAiOltdLCJRbSI6W119LCJi
-NiI6eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl0sImxmLkUiOiIxIn0s
-ImxtIjp7IkFuIjpbIjEiXX0sIm1XIjp7ImNYIjpbIjEiXX0sInV5Ijp7ImxEIjpbIjEiXSwiek0iOlsi
-MSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXX0sImlsIjp7IllrIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIy
-Il19LCJZayI6eyJaMCI6WyIxIiwiMiJdfSwiUG4iOnsiWjAiOlsiMSIsIjIiXX0sIkdqIjp7IlJVIjpb
-IjEiLCIyIl0sIlBuIjpbIjEiLCIyIl0sIktQIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl19LCJWaiI6
-eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJYdiI6eyJsZiI6WyIx
-Il0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJ1dyI6eyJZayI6WyJxVSIsIkAiXSwi
-WjAiOlsicVUiLCJAIl0sIllrLksiOiJxVSIsIllrLlYiOiJAIn0sImk4Ijp7ImFMIjpbInFVIl0sImJR
-IjpbInFVIl0sImNYIjpbInFVIl0sImFMLkUiOiJxVSIsImNYLkUiOiJxVSJ9LCJDViI6eyJVayI6WyJ6
-TTxJaj4iLCJxVSJdLCJVay5TIjoiek08SWo+In0sIlU4Ijp7IndJIjpbInpNPElqPiIsInFVIl19LCJa
-aSI6eyJVayI6WyJxVSIsInpNPElqPiJdfSwiVWQiOnsiWFMiOltdfSwiSzgiOnsiWFMiOltdfSwiYnki
-OnsiVWsiOlsiTWg/IiwicVUiXSwiVWsuUyI6Ik1oPyJ9LCJvaiI6eyJ3SSI6WyJNaD8iLCJxVSJdfSwi
-TXgiOnsid0kiOlsicVUiLCJNaD8iXX0sInU1Ijp7IlVrIjpbInFVIiwiek08SWo+Il0sIlVrLlMiOiJx
-VSJ9LCJFMyI6eyJ3SSI6WyJxVSIsInpNPElqPiJdfSwiR1kiOnsid0kiOlsiek08SWo+IiwicVUiXX0s
-IkNQIjp7IlpaIjpbXX0sIklqIjp7IlpaIjpbXX0sInpNIjp7ImJRIjpbIjEiXSwiY1giOlsiMSJdfSwi
-aWIiOnsiT2QiOltdfSwieHUiOnsiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJxVSI6eyJ2WCI6W119LCJD
-NiI6eyJYUyI6W119LCJFeiI6eyJYUyI6W119LCJGIjp7IlhTIjpbXX0sIkFUIjp7IlhTIjpbXX0sImJK
-Ijp7IlhTIjpbXX0sImVZIjp7IlhTIjpbXX0sIm1wIjp7IlhTIjpbXX0sInViIjp7IlhTIjpbXX0sImRz
-Ijp7IlhTIjpbXX0sImxqIjp7IlhTIjpbXX0sIlVWIjp7IlhTIjpbXX0sIms1Ijp7IlhTIjpbXX0sIktZ
-Ijp7IlhTIjpbXX0sInAiOnsiWFMiOltdfSwiQ0QiOnsiUnoiOltdfSwiYUUiOnsiUnoiOltdfSwiWmQi
-OnsiR3oiOltdfSwiTSI6eyJCTCI6W119LCJEbiI6eyJpRCI6W119LCJVZiI6eyJpRCI6W119LCJxZSI6
-eyJpRCI6W119LCJjdiI6eyJLViI6W10sIkQwIjpbXX0sImZKIjp7IkQwIjpbXX0sIkFqIjp7ImVhIjpb
-XX0sIktWIjp7IkQwIjpbXX0sImV3Ijp7ImVhIjpbXX0sIkpRIjp7ImtGIjpbXX0sInFFIjp7ImN2Ijpb
-XSwiS1YiOltdLCJEMCI6W119LCJHaCI6eyJjdiI6W10sIktWIjpbXSwiRDAiOltdfSwiZlkiOnsiY3Yi
-OltdLCJLViI6W10sIkQwIjpbXX0sInJaIjp7ImN2IjpbXSwiS1YiOltdLCJEMCI6W119LCJRUCI6eyJj
-diI6W10sIktWIjpbXSwiRDAiOltdfSwibngiOnsiS1YiOltdLCJEMCI6W119LCJRRiI6eyJLViI6W10s
-IkQwIjpbXX0sIklCIjp7InRuIjpbIlpaIl19LCJ3eiI6eyJsRCI6WyIxIl0sInpNIjpbIjEiXSwiYlEi
-OlsiMSJdLCJjWCI6WyIxIl0sImxELkUiOiIxIn0sImhIIjp7IkF6IjpbXX0sImg0Ijp7ImN2IjpbXSwi
-S1YiOltdLCJEMCI6W119LCJWYiI6eyJLViI6W10sIkQwIjpbXX0sIndhIjp7IkQwIjpbXX0sImU3Ijp7
-ImxEIjpbIktWIl0sInpNIjpbIktWIl0sImJRIjpbIktWIl0sImNYIjpbIktWIl0sImxELkUiOiJLViJ9
-LCJCSCI6eyJsRCI6WyJLViJdLCJHbSI6WyJLViJdLCJ6TSI6WyJLViJdLCJYaiI6WyJLViJdLCJiUSI6
-WyJLViJdLCJjWCI6WyJLViJdLCJsRC5FIjoiS1YiLCJHbS5FIjoiS1YifSwiU04iOnsiY3YiOltdLCJL
-ViI6W10sIkQwIjpbXX0sImxwIjp7ImN2IjpbXSwiS1YiOltdLCJEMCI6W119LCJUYiI6eyJjdiI6W10s
-IktWIjpbXSwiRDAiOltdfSwiSXYiOnsiY3YiOltdLCJLViI6W10sIkQwIjpbXX0sIldQIjp7ImN2Ijpb
-XSwiS1YiOltdLCJEMCI6W119LCJ5WSI6eyJjdiI6W10sIktWIjpbXSwiRDAiOltdfSwidzYiOnsiZWEi
-OltdfSwiSzUiOnsidjYiOltdLCJEMCI6W119LCJDbSI6eyJEMCI6W119LCJDUSI6eyJLViI6W10sIkQw
-IjpbXX0sInc0Ijp7InRuIjpbIlpaIl19LCJyaCI6eyJsRCI6WyJLViJdLCJHbSI6WyJLViJdLCJ6TSI6
-WyJLViJdLCJYaiI6WyJLViJdLCJiUSI6WyJLViJdLCJjWCI6WyJLViJdLCJsRC5FIjoiS1YiLCJHbS5F
-IjoiS1YifSwiY2YiOnsiWWsiOlsicVUiLCJxVSJdLCJaMCI6WyJxVSIsInFVIl19LCJpNyI6eyJZayI6
-WyJxVSIsInFVIl0sIlowIjpbInFVIiwicVUiXSwiWWsuSyI6InFVIiwiWWsuViI6InFVIn0sIlN5Ijp7
-IllrIjpbInFVIiwicVUiXSwiWjAiOlsicVUiLCJxVSJdLCJZay5LIjoicVUiLCJZay5WIjoicVUifSwi
-STQiOnsibGYiOlsicVUiXSwieHUiOlsicVUiXSwiYlEiOlsicVUiXSwiY1giOlsicVUiXSwibGYuRSI6
-InFVIn0sIlJPIjp7InFoIjpbIjEiXX0sIkNxIjp7IlJPIjpbIjEiXSwicWgiOlsiMSJdfSwieEMiOnsi
-TU8iOlsiMSJdfSwidkQiOnsia0YiOltdfSwibTYiOnsia0YiOltdfSwiY3QiOnsia0YiOltdfSwiT3ci
-Onsia0YiOltdfSwiVzkiOnsiQW4iOlsiMSJdfSwiZFciOnsidjYiOltdLCJEMCI6W119LCJtayI6eyJ5
-MCI6W119LCJLbyI6eyJvbiI6W119LCJBcyI6eyJsZiI6WyJxVSJdLCJ4dSI6WyJxVSJdLCJiUSI6WyJx
-VSJdLCJjWCI6WyJxVSJdfSwicjciOnsiRTQiOltdfSwiVHoiOnsibEQiOlsiMSJdLCJ6TSI6WyIxIl0s
-ImJRIjpbIjEiXSwiRTQiOltdLCJjWCI6WyIxIl0sImxELkUiOiIxIn0sIm5kIjp7ImhpIjpbXSwiY3Yi
-OltdLCJLViI6W10sIkQwIjpbXX0sIktlIjp7ImxmIjpbInFVIl0sInh1IjpbInFVIl0sImJRIjpbInFV
-Il0sImNYIjpbInFVIl0sImxmLkUiOiJxVSJ9LCJoaSI6eyJjdiI6W10sIktWIjpbXSwiRDAiOltdfSwi
-UVciOnsiWFMiOltdLCJSeiI6W119LCJYQSI6eyJrRiI6W119LCJ2dCI6eyJEOCI6W119LCJjRCI6eyJE
-OCI6W119LCJkdiI6eyJSeiI6W119LCJPRiI6eyJmdiI6W119LCJydSI6eyJmdiI6W119LCJJViI6eyJm
-diI6W119LCJuNiI6eyJ6TSI6WyJJaiJdLCJiUSI6WyJJaiJdLCJjWCI6WyJJaiJdLCJBUyI6W119fScp
-KQpILkZGKHYudHlwZVVuaXZlcnNlLEpTT04ucGFyc2UoJ3sidzIiOjEsIlFDIjoyLCJMWiI6MSwia1Qi
-OjIsIm1XIjoxLCJ1eSI6MSwiaWwiOjIsIlZqIjoxLCJYdiI6MSwiblkiOjEsIldZIjoxLCJwUiI6MSwi
-dmciOjF9JykpCnZhciB1PXtsOiJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgVVJJIHdp
-dGggYSBmcmFnbWVudCBjb21wb25lbnQiLGk6IkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20g
-YSBVUkkgd2l0aCBhIHF1ZXJ5IGNvbXBvbmVudCIsajoiQ2Fubm90IGV4dHJhY3QgYSBub24tV2luZG93
-cyBmaWxlIHBhdGggZnJvbSBhIGZpbGUgVVJJIHdpdGggYW4gYXV0aG9yaXR5IixjOiJFcnJvciBoYW5k
-bGVyIG11c3QgYWNjZXB0IG9uZSBPYmplY3Qgb3Igb25lIE9iamVjdCBhbmQgYSBTdGFja1RyYWNlIGFz
-IGFyZ3VtZW50cywgYW5kIHJldHVybiBhIHZhbHVlIG9mIHRoZSByZXR1cm5lZCBmdXR1cmUncyB0eXBl
-IixkOiJhcmVhLWFuYWx5emVyLGFuYWx5emVyLW5uYmQtbWlncmF0aW9uLHR5cGUtYnVnIn0KdmFyIHQ9
-KGZ1bmN0aW9uIHJ0aWkoKXt2YXIgcz1ILk4wCnJldHVybnticTpzKCJHaCIpLG46cygiQ3ciKSxjUjpz
-KCJyWiIpLHc6cygiQXoiKSxrOnMoIlFQIiksZ0Y6cygiUEQ8R0QsQD4iKSxXOnMoImJRPEA+IiksaDpz
-KCJjdiIpLG06cygiWFMiKSxCOnMoImVhIiksZzg6cygiUnoiKSxjODpzKCJoSCIpLFk6cygiRUgiKSxp
-OnMoImI4PEA+IiksSjpzKCJMTCIpLGdwOnMoIkg3IiksSTpzKCJTZyIpLG86cygidlEiKSxlaDpzKCJj
-WDxLVj4iKSxPOnMoImNYPHFVPiIpLFI6cygiY1g8QD4iKSxmQTpzKCJqZDxTZT4iKSxnaTpzKCJqZDxq
-OD4iKSxkOnMoImpkPFowPHFVLE1oPz4+IiksZmg6cygiamQ8RDg+IikscjpzKCJqZDxrRj4iKSxzOnMo
-ImpkPHFVPiIpLGhoOnMoImpkPHlEPiIpLGFKOnMoImpkPHdiPiIpLGdOOnMoImpkPG42PiIpLGI6cygi
-amQ8QD4iKSx0OnMoImpkPElqPiIpLGQ0OnMoImpkPHFVPz4iKSxUOnMoIndlIiksZUg6cygidm0iKSx1
-OnMoImM1IiksYVU6cygiWGo8QD4iKSxhbTpzKCJUejxAPiIpLGVvOnMoIk41PEdELEA+IiksZHo6cygi
-aEYiKSxmNDpzKCJ6TTxqOD4iKSx4OnMoInpNPFowPHFVLE1oPz4+IiksZXc6cygiek08TWg+IiksRDpz
-KCJ6TTxxVT4iKSxqOnMoInpNPEA+IiksTDpzKCJ6TTxJaj4iKSxlZTpzKCJ6TTxNaD8+IiksRjpzKCJ1
-OCIpLGg2OnMoIlowPHFVLE1oPiIpLEU6cygiWjA8cVUscVU+IiksZjpzKCJaMDxALEA+IiksRzpzKCJa
-MDxxVSxNaD8+IiksZHY6cygibEo8cVUscVU+IiksZG86cygibEo8cVUsQD4iKSxWOnMoIkFqIiksZEU6
-cygiRVQiKSxBOnMoIktWIiksZjY6cygia0YiKSxQOnMoImM4IiksSzpzKCJNaCIpLHA6cygiZXciKSxx
-OnMoInRuPFpaPiIpLGZ2OnMoIndMIiksY3o6cygiaWIiKSxhTzpzKCJuZCIpLEM6cygieHU8cVU+Iiks
-bDpzKCJHeiIpLE46cygicVUiKSxkRzpzKCJxVShxVSkiKSxnNzpzKCJoaSIpLGZvOnMoIkdEIiksYVc6
-cygieVkiKSxlSzpzKCJFeiIpLGFrOnMoIkFTIiksZ2M6cygibjYiKSxiSTpzKCJrZCIpLGR3OnMoIkdq
-PHFVLHFVPiIpLGREOnMoImlEIiksZUo6cygidTY8cVU+IiksZzQ6cygiSzUiKSxjaTpzKCJ2NiIpLGcy
-OnMoIkNtIiksYmo6cygiWmY8Zko+IiksaDk6cygiQ1EiKSxhYzpzKCJlNyIpLFE6cygiQ3E8QWo+Iiks
-VTpzKCJ3ejxjdj4iKSxhbzpzKCJ2czxmSj4iKSxjOnMoInZzPEA+IiksZko6cygidnM8SWo+IiksY3I6
-cygiSlEiKSx5OnMoImEyIiksYWw6cygiYTIoTWgpIiksZ1I6cygiQ1AiKSx6OnMoIkAiKSxmTzpzKCJA
-KCkiKSx2OnMoIkAoTWgpIiksYTpzKCJAKE1oLEd6KSIpLGJVOnMoIkAoeHU8cVU+KSIpLGRPOnMoIkAo
-cVUpIiksYjg6cygiQChALEApIiksUzpzKCJJaiIpLGF3OnMoIjAmKiIpLF86cygiTWgqIiksY2g6cygi
-RDA/IiksYkc6cygiYjg8Yzg+PyIpLGVzOnMoIkU0PyIpLGJrOnMoInpNPHFVPj8iKSxiTTpzKCJ6TTxA
-Pj8iKSxjWjpzKCJaMDxxVSxxVT4/IiksYzk6cygiWjA8cVUsQD4/IiksZm46cygiWjA8cVUsTWg/Pj8i
-KSxYOnMoIk1oPyIpLGRrOnMoInFVPyIpLGU6cygiRmU8QCxAPj8iKSxnOnMoImJuPyIpLGI3OnMoImEy
-KE1oKT8iKSxidzpzKCJAKGVhKT8iKSxmVjpzKCJNaD8oTWg/LE1oPyk/IiksZEE6cygiTWg/KEApPyIp
-LFo6cygifigpPyIpLGd4OnMoIn4oZXcpPyIpLGRpOnMoIlpaIiksSDpzKCJ+IiksTTpzKCJ+KCkiKSxl
-QTpzKCJ+KHFVLHFVKSIpLGNBOnMoIn4ocVUsQCkiKX19KSgpOyhmdW5jdGlvbiBjb25zdGFudHMoKXt2
-YXIgcz1odW5rSGVscGVycy5tYWtlQ29uc3RMaXN0CkMueG49Vy5HaC5wcm90b3R5cGUKQy5SWT1XLlFQ
-LnByb3RvdHlwZQpDLm1IPVcuYWUucHJvdG90eXBlCkMuQlo9Vy5WYi5wcm90b3R5cGUKQy5EdD1XLmZK
-LnByb3RvdHlwZQpDLk9rPUouR3YucHJvdG90eXBlCkMuTm09Si5qZC5wcm90b3R5cGUKQy5qbj1KLmJV
-LnByb3RvdHlwZQpDLkNEPUoucUkucHJvdG90eXBlCkMueEI9Si5Eci5wcm90b3R5cGUKQy5ERz1KLmM1
-LnByb3RvdHlwZQpDLkV4PVcudTgucHJvdG90eXBlCkMuTkE9SC5WNi5wcm90b3R5cGUKQy50NT1XLkJI
-LnByb3RvdHlwZQpDLkx0PVcuU04ucHJvdG90eXBlCkMuWlE9Si5pQy5wcm90b3R5cGUKQy5JZT1XLlRi
-LnByb3RvdHlwZQpDLnZCPUoua2QucHJvdG90eXBlCkMub2w9Vy5LNS5wcm90b3R5cGUKQy55OD1uZXcg
-UC5VOCgpCkMuaDk9bmV3IFAuQ1YoKQpDLkd3PW5ldyBILkZ1KEguTjAoIkZ1PDAmPiIpKQpDLk80PWZ1
-bmN0aW9uIGdldFRhZ0ZhbGxiYWNrKG8pIHsKICB2YXIgcyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJp
-bmcuY2FsbChvKTsKICByZXR1cm4gcy5zdWJzdHJpbmcoOCwgcy5sZW5ndGggLSAxKTsKfQpDLllxPWZ1
-bmN0aW9uKCkgewogIHZhciB0b1N0cmluZ0Z1bmN0aW9uID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmlu
-ZzsKICBmdW5jdGlvbiBnZXRUYWcobykgewogICAgdmFyIHMgPSB0b1N0cmluZ0Z1bmN0aW9uLmNhbGwo
-byk7CiAgICByZXR1cm4gcy5zdWJzdHJpbmcoOCwgcy5sZW5ndGggLSAxKTsKICB9CiAgZnVuY3Rpb24g
-Z2V0VW5rbm93blRhZyhvYmplY3QsIHRhZykgewogICAgaWYgKC9eSFRNTFtBLVpdLipFbGVtZW50JC8u
-dGVzdCh0YWcpKSB7CiAgICAgIHZhciBuYW1lID0gdG9TdHJpbmdGdW5jdGlvbi5jYWxsKG9iamVjdCk7
-CiAgICAgIGlmIChuYW1lID09ICJbb2JqZWN0IE9iamVjdF0iKSByZXR1cm4gbnVsbDsKICAgICAgcmV0
-dXJuICJIVE1MRWxlbWVudCI7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGdldFVua25vd25UYWdHZW5lcmlj
-QnJvd3NlcihvYmplY3QsIHRhZykgewogICAgaWYgKHNlbGYuSFRNTEVsZW1lbnQgJiYgb2JqZWN0IGlu
-c3RhbmNlb2YgSFRNTEVsZW1lbnQpIHJldHVybiAiSFRNTEVsZW1lbnQiOwogICAgcmV0dXJuIGdldFVu
-a25vd25UYWcob2JqZWN0LCB0YWcpOwogIH0KICBmdW5jdGlvbiBwcm90b3R5cGVGb3JUYWcodGFnKSB7
-CiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PSAidW5kZWZpbmVkIikgcmV0dXJuIG51bGw7CiAgICBpZiAo
-dHlwZW9mIHdpbmRvd1t0YWddID09ICJ1bmRlZmluZWQiKSByZXR1cm4gbnVsbDsKICAgIHZhciBjb25z
-dHJ1Y3RvciA9IHdpbmRvd1t0YWddOwogICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPSAiZnVuY3Rp
-b24iKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAgfQogIGZ1
-bmN0aW9uIGRpc2NyaW1pbmF0b3IodGFnKSB7IHJldHVybiBudWxsOyB9CiAgdmFyIGlzQnJvd3NlciA9
-IHR5cGVvZiBuYXZpZ2F0b3IgPT0gIm9iamVjdCI7CiAgcmV0dXJuIHsKICAgIGdldFRhZzogZ2V0VGFn
-LAogICAgZ2V0VW5rbm93blRhZzogaXNCcm93c2VyID8gZ2V0VW5rbm93blRhZ0dlbmVyaWNCcm93c2Vy
-IDogZ2V0VW5rbm93blRhZywKICAgIHByb3RvdHlwZUZvclRhZzogcHJvdG90eXBlRm9yVGFnLAogICAg
-ZGlzY3JpbWluYXRvcjogZGlzY3JpbWluYXRvciB9Owp9CkMud2I9ZnVuY3Rpb24oZ2V0VGFnRmFsbGJh
-Y2spIHsKICByZXR1cm4gZnVuY3Rpb24oaG9va3MpIHsKICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9
-ICJvYmplY3QiKSByZXR1cm4gaG9va3M7CiAgICB2YXIgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50Owog
-ICAgaWYgKHVhLmluZGV4T2YoIkR1bXBSZW5kZXJUcmVlIikgPj0gMCkgcmV0dXJuIGhvb2tzOwogICAg
-aWYgKHVhLmluZGV4T2YoIkNocm9tZSIpID49IDApIHsKICAgICAgZnVuY3Rpb24gY29uZmlybShwKSB7
-CiAgICAgICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgPT0gIm9iamVjdCIgJiYgd2luZG93W3BdICYmIHdp
-bmRvd1twXS5uYW1lID09IHA7CiAgICAgIH0KICAgICAgaWYgKGNvbmZpcm0oIldpbmRvdyIpICYmIGNv
-bmZpcm0oIkhUTUxFbGVtZW50IikpIHJldHVybiBob29rczsKICAgIH0KICAgIGhvb2tzLmdldFRhZyA9
-IGdldFRhZ0ZhbGxiYWNrOwogIH07Cn0KQy5LVT1mdW5jdGlvbihob29rcykgewogIGlmICh0eXBlb2Yg
-ZGFydEV4cGVyaW1lbnRhbEZpeHVwR2V0VGFnICE9ICJmdW5jdGlvbiIpIHJldHVybiBob29rczsKICBo
-b29rcy5nZXRUYWcgPSBkYXJ0RXhwZXJpbWVudGFsRml4dXBHZXRUYWcoaG9va3MuZ2V0VGFnKTsKfQpD
-LmZRPWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFyIGdldFRhZyA9IGhvb2tzLmdldFRhZzsKICB2YXIgcHJv
-dG90eXBlRm9yVGFnID0gaG9va3MucHJvdG90eXBlRm9yVGFnOwogIGZ1bmN0aW9uIGdldFRhZ0ZpeGVk
-KG8pIHsKICAgIHZhciB0YWcgPSBnZXRUYWcobyk7CiAgICBpZiAodGFnID09ICJEb2N1bWVudCIpIHsK
-ICAgICAgaWYgKCEhby54bWxWZXJzaW9uKSByZXR1cm4gIiFEb2N1bWVudCI7CiAgICAgIHJldHVybiAi
-IUhUTUxEb2N1bWVudCI7CiAgICB9CiAgICByZXR1cm4gdGFnOwogIH0KICBmdW5jdGlvbiBwcm90b3R5
-cGVGb3JUYWdGaXhlZCh0YWcpIHsKICAgIGlmICh0YWcgPT0gIkRvY3VtZW50IikgcmV0dXJuIG51bGw7
-CiAgICByZXR1cm4gcHJvdG90eXBlRm9yVGFnKHRhZyk7CiAgfQogIGhvb2tzLmdldFRhZyA9IGdldFRh
-Z0ZpeGVkOwogIGhvb2tzLnByb3RvdHlwZUZvclRhZyA9IHByb3RvdHlwZUZvclRhZ0ZpeGVkOwp9CkMu
-ZGs9ZnVuY3Rpb24oaG9va3MpIHsKICB2YXIgdXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRvciA9PSAi
-b2JqZWN0IiA/IG5hdmlnYXRvci51c2VyQWdlbnQgOiAiIjsKICBpZiAodXNlckFnZW50LmluZGV4T2Yo
-IkZpcmVmb3giKSA9PSAtMSkgcmV0dXJuIGhvb2tzOwogIHZhciBnZXRUYWcgPSBob29rcy5nZXRUYWc7
-CiAgdmFyIHF1aWNrTWFwID0gewogICAgIkJlZm9yZVVubG9hZEV2ZW50IjogIkV2ZW50IiwKICAgICJE
-YXRhVHJhbnNmZXIiOiAiQ2xpcGJvYXJkIiwKICAgICJHZW9HZW9sb2NhdGlvbiI6ICJHZW9sb2NhdGlv
-biIsCiAgICAiTG9jYXRpb24iOiAiIUxvY2F0aW9uIiwKICAgICJXb3JrZXJNZXNzYWdlRXZlbnQiOiAi
-TWVzc2FnZUV2ZW50IiwKICAgICJYTUxEb2N1bWVudCI6ICIhRG9jdW1lbnQifTsKICBmdW5jdGlvbiBn
-ZXRUYWdGaXJlZm94KG8pIHsKICAgIHZhciB0YWcgPSBnZXRUYWcobyk7CiAgICByZXR1cm4gcXVpY2tN
-YXBbdGFnXSB8fCB0YWc7CiAgfQogIGhvb2tzLmdldFRhZyA9IGdldFRhZ0ZpcmVmb3g7Cn0KQy54aT1m
-dW5jdGlvbihob29rcykgewogIHZhciB1c2VyQWdlbnQgPSB0eXBlb2YgbmF2aWdhdG9yID09ICJvYmpl
-Y3QiID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6ICIiOwogIGlmICh1c2VyQWdlbnQuaW5kZXhPZigiVHJp
-ZGVudC8iKSA9PSAtMSkgcmV0dXJuIGhvb2tzOwogIHZhciBnZXRUYWcgPSBob29rcy5nZXRUYWc7CiAg
-dmFyIHF1aWNrTWFwID0gewogICAgIkJlZm9yZVVubG9hZEV2ZW50IjogIkV2ZW50IiwKICAgICJEYXRh
-VHJhbnNmZXIiOiAiQ2xpcGJvYXJkIiwKICAgICJIVE1MRERFbGVtZW50IjogIkhUTUxFbGVtZW50IiwK
-ICAgICJIVE1MRFRFbGVtZW50IjogIkhUTUxFbGVtZW50IiwKICAgICJIVE1MUGhyYXNlRWxlbWVudCI6
-ICJIVE1MRWxlbWVudCIsCiAgICAiUG9zaXRpb24iOiAiR2VvcG9zaXRpb24iCiAgfTsKICBmdW5jdGlv
-biBnZXRUYWdJRShvKSB7CiAgICB2YXIgdGFnID0gZ2V0VGFnKG8pOwogICAgdmFyIG5ld1RhZyA9IHF1
-aWNrTWFwW3RhZ107CiAgICBpZiAobmV3VGFnKSByZXR1cm4gbmV3VGFnOwogICAgaWYgKHRhZyA9PSAi
-T2JqZWN0IikgewogICAgICBpZiAod2luZG93LkRhdGFWaWV3ICYmIChvIGluc3RhbmNlb2Ygd2luZG93
-LkRhdGFWaWV3KSkgcmV0dXJuICJEYXRhVmlldyI7CiAgICB9CiAgICByZXR1cm4gdGFnOwogIH0KICBm
-dW5jdGlvbiBwcm90b3R5cGVGb3JUYWdJRSh0YWcpIHsKICAgIHZhciBjb25zdHJ1Y3RvciA9IHdpbmRv
-d1t0YWddOwogICAgaWYgKGNvbnN0cnVjdG9yID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJu
-IGNvbnN0cnVjdG9yLnByb3RvdHlwZTsKICB9CiAgaG9va3MuZ2V0VGFnID0gZ2V0VGFnSUU7CiAgaG9v
-a3MucHJvdG90eXBlRm9yVGFnID0gcHJvdG90eXBlRm9yVGFnSUU7Cn0KQy5pNz1mdW5jdGlvbihob29r
-cykgeyByZXR1cm4gaG9va3M7IH0KCkMuQ3Q9bmV3IFAuYnkoKQpDLkVxPW5ldyBQLms1KCkKQy54TT1u
-ZXcgUC51NSgpCkMuUWs9bmV3IFAuRTMoKQpDLk52PW5ldyBILmtyKCkKQy5OVT1uZXcgUC5KaSgpCkMu
-cGQ9bmV3IFAuWmQoKQpDLkFkPW5ldyBSLkg3KDAsIkhpbnRBY3Rpb25LaW5kLmFkZE51bGxhYmxlSGlu
-dCIpCkMubmU9bmV3IFIuSDcoMSwiSGludEFjdGlvbktpbmQuYWRkTm9uTnVsbGFibGVIaW50IikKQy5t
-eT1uZXcgUi5INygyLCJIaW50QWN0aW9uS2luZC5jaGFuZ2VUb051bGxhYmxlSGludCIpCkMucng9bmV3
-IFIuSDcoMywiSGludEFjdGlvbktpbmQuY2hhbmdlVG9Ob25OdWxsYWJsZUhpbnQiKQpDLndWPW5ldyBS
-Lkg3KDQsIkhpbnRBY3Rpb25LaW5kLnJlbW92ZU51bGxhYmxlSGludCIpCkMuZlI9bmV3IFIuSDcoNSwi
-SGludEFjdGlvbktpbmQucmVtb3ZlTm9uTnVsbGFibGVIaW50IikKQy5BMz1uZXcgUC5NeChudWxsKQpD
-Lm5YPW5ldyBQLm9qKG51bGwpCkMuY3c9bmV3IEwuR2IoMCwiVW5pdE1pZ3JhdGlvblN0YXR1cy5hbHJl
-YWR5TWlncmF0ZWQiKQpDLmRjPW5ldyBMLkdiKDEsIlVuaXRNaWdyYXRpb25TdGF0dXMuaW5kZXRlcm1p
-bmF0ZSIpCkMuV0Q9bmV3IEwuR2IoMiwiVW5pdE1pZ3JhdGlvblN0YXR1cy5taWdyYXRpbmciKQpDLlhq
-PW5ldyBMLkdiKDMsIlVuaXRNaWdyYXRpb25TdGF0dXMub3B0aW5nT3V0IikKQy5sMD1ILlFJKHMoW0Mu
-Y3csQy5kYyxDLldELEMuWGpdKSxILk4wKCJqZDxHYj4iKSkKQy5haz1ILlFJKHMoWzAsMCwzMjc3Niwz
-Mzc5MiwxLDEwMjQwLDAsMF0pLHQudCkKQy5jbT1ILlFJKHMoWyIqOjpjbGFzcyIsIio6OmRpciIsIio6
-OmRyYWdnYWJsZSIsIio6OmhpZGRlbiIsIio6OmlkIiwiKjo6aW5lcnQiLCIqOjppdGVtcHJvcCIsIio6
-Oml0ZW1yZWYiLCIqOjppdGVtc2NvcGUiLCIqOjpsYW5nIiwiKjo6c3BlbGxjaGVjayIsIio6OnRpdGxl
-IiwiKjo6dHJhbnNsYXRlIiwiQTo6YWNjZXNza2V5IiwiQTo6Y29vcmRzIiwiQTo6aHJlZmxhbmciLCJB
-OjpuYW1lIiwiQTo6c2hhcGUiLCJBOjp0YWJpbmRleCIsIkE6OnRhcmdldCIsIkE6OnR5cGUiLCJBUkVB
-OjphY2Nlc3NrZXkiLCJBUkVBOjphbHQiLCJBUkVBOjpjb29yZHMiLCJBUkVBOjpub2hyZWYiLCJBUkVB
-OjpzaGFwZSIsIkFSRUE6OnRhYmluZGV4IiwiQVJFQTo6dGFyZ2V0IiwiQVVESU86OmNvbnRyb2xzIiwi
-QVVESU86Omxvb3AiLCJBVURJTzo6bWVkaWFncm91cCIsIkFVRElPOjptdXRlZCIsIkFVRElPOjpwcmVs
-b2FkIiwiQkRPOjpkaXIiLCJCT0RZOjphbGluayIsIkJPRFk6OmJnY29sb3IiLCJCT0RZOjpsaW5rIiwi
-Qk9EWTo6dGV4dCIsIkJPRFk6OnZsaW5rIiwiQlI6OmNsZWFyIiwiQlVUVE9OOjphY2Nlc3NrZXkiLCJC
-VVRUT046OmRpc2FibGVkIiwiQlVUVE9OOjpuYW1lIiwiQlVUVE9OOjp0YWJpbmRleCIsIkJVVFRPTjo6
-dHlwZSIsIkJVVFRPTjo6dmFsdWUiLCJDQU5WQVM6OmhlaWdodCIsIkNBTlZBUzo6d2lkdGgiLCJDQVBU
-SU9OOjphbGlnbiIsIkNPTDo6YWxpZ24iLCJDT0w6OmNoYXIiLCJDT0w6OmNoYXJvZmYiLCJDT0w6OnNw
-YW4iLCJDT0w6OnZhbGlnbiIsIkNPTDo6d2lkdGgiLCJDT0xHUk9VUDo6YWxpZ24iLCJDT0xHUk9VUDo6
-Y2hhciIsIkNPTEdST1VQOjpjaGFyb2ZmIiwiQ09MR1JPVVA6OnNwYW4iLCJDT0xHUk9VUDo6dmFsaWdu
-IiwiQ09MR1JPVVA6OndpZHRoIiwiQ09NTUFORDo6Y2hlY2tlZCIsIkNPTU1BTkQ6OmNvbW1hbmQiLCJD
-T01NQU5EOjpkaXNhYmxlZCIsIkNPTU1BTkQ6OmxhYmVsIiwiQ09NTUFORDo6cmFkaW9ncm91cCIsIkNP
-TU1BTkQ6OnR5cGUiLCJEQVRBOjp2YWx1ZSIsIkRFTDo6ZGF0ZXRpbWUiLCJERVRBSUxTOjpvcGVuIiwi
-RElSOjpjb21wYWN0IiwiRElWOjphbGlnbiIsIkRMOjpjb21wYWN0IiwiRklFTERTRVQ6OmRpc2FibGVk
-IiwiRk9OVDo6Y29sb3IiLCJGT05UOjpmYWNlIiwiRk9OVDo6c2l6ZSIsIkZPUk06OmFjY2VwdCIsIkZP
-Uk06OmF1dG9jb21wbGV0ZSIsIkZPUk06OmVuY3R5cGUiLCJGT1JNOjptZXRob2QiLCJGT1JNOjpuYW1l
-IiwiRk9STTo6bm92YWxpZGF0ZSIsIkZPUk06OnRhcmdldCIsIkZSQU1FOjpuYW1lIiwiSDE6OmFsaWdu
-IiwiSDI6OmFsaWduIiwiSDM6OmFsaWduIiwiSDQ6OmFsaWduIiwiSDU6OmFsaWduIiwiSDY6OmFsaWdu
-IiwiSFI6OmFsaWduIiwiSFI6Om5vc2hhZGUiLCJIUjo6c2l6ZSIsIkhSOjp3aWR0aCIsIkhUTUw6OnZl
-cnNpb24iLCJJRlJBTUU6OmFsaWduIiwiSUZSQU1FOjpmcmFtZWJvcmRlciIsIklGUkFNRTo6aGVpZ2h0
-IiwiSUZSQU1FOjptYXJnaW5oZWlnaHQiLCJJRlJBTUU6Om1hcmdpbndpZHRoIiwiSUZSQU1FOjp3aWR0
-aCIsIklNRzo6YWxpZ24iLCJJTUc6OmFsdCIsIklNRzo6Ym9yZGVyIiwiSU1HOjpoZWlnaHQiLCJJTUc6
-OmhzcGFjZSIsIklNRzo6aXNtYXAiLCJJTUc6Om5hbWUiLCJJTUc6OnVzZW1hcCIsIklNRzo6dnNwYWNl
-IiwiSU1HOjp3aWR0aCIsIklOUFVUOjphY2NlcHQiLCJJTlBVVDo6YWNjZXNza2V5IiwiSU5QVVQ6OmFs
-aWduIiwiSU5QVVQ6OmFsdCIsIklOUFVUOjphdXRvY29tcGxldGUiLCJJTlBVVDo6YXV0b2ZvY3VzIiwi
-SU5QVVQ6OmNoZWNrZWQiLCJJTlBVVDo6ZGlzYWJsZWQiLCJJTlBVVDo6aW5wdXRtb2RlIiwiSU5QVVQ6
-OmlzbWFwIiwiSU5QVVQ6Omxpc3QiLCJJTlBVVDo6bWF4IiwiSU5QVVQ6Om1heGxlbmd0aCIsIklOUFVU
-OjptaW4iLCJJTlBVVDo6bXVsdGlwbGUiLCJJTlBVVDo6bmFtZSIsIklOUFVUOjpwbGFjZWhvbGRlciIs
-IklOUFVUOjpyZWFkb25seSIsIklOUFVUOjpyZXF1aXJlZCIsIklOUFVUOjpzaXplIiwiSU5QVVQ6OnN0
-ZXAiLCJJTlBVVDo6dGFiaW5kZXgiLCJJTlBVVDo6dHlwZSIsIklOUFVUOjp1c2VtYXAiLCJJTlBVVDo6
-dmFsdWUiLCJJTlM6OmRhdGV0aW1lIiwiS0VZR0VOOjpkaXNhYmxlZCIsIktFWUdFTjo6a2V5dHlwZSIs
-IktFWUdFTjo6bmFtZSIsIkxBQkVMOjphY2Nlc3NrZXkiLCJMQUJFTDo6Zm9yIiwiTEVHRU5EOjphY2Nl
-c3NrZXkiLCJMRUdFTkQ6OmFsaWduIiwiTEk6OnR5cGUiLCJMSTo6dmFsdWUiLCJMSU5LOjpzaXplcyIs
-Ik1BUDo6bmFtZSIsIk1FTlU6OmNvbXBhY3QiLCJNRU5VOjpsYWJlbCIsIk1FTlU6OnR5cGUiLCJNRVRF
-Ujo6aGlnaCIsIk1FVEVSOjpsb3ciLCJNRVRFUjo6bWF4IiwiTUVURVI6Om1pbiIsIk1FVEVSOjp2YWx1
-ZSIsIk9CSkVDVDo6dHlwZW11c3RtYXRjaCIsIk9MOjpjb21wYWN0IiwiT0w6OnJldmVyc2VkIiwiT0w6
-OnN0YXJ0IiwiT0w6OnR5cGUiLCJPUFRHUk9VUDo6ZGlzYWJsZWQiLCJPUFRHUk9VUDo6bGFiZWwiLCJP
-UFRJT046OmRpc2FibGVkIiwiT1BUSU9OOjpsYWJlbCIsIk9QVElPTjo6c2VsZWN0ZWQiLCJPUFRJT046
-OnZhbHVlIiwiT1VUUFVUOjpmb3IiLCJPVVRQVVQ6Om5hbWUiLCJQOjphbGlnbiIsIlBSRTo6d2lkdGgi
-LCJQUk9HUkVTUzo6bWF4IiwiUFJPR1JFU1M6Om1pbiIsIlBST0dSRVNTOjp2YWx1ZSIsIlNFTEVDVDo6
-YXV0b2NvbXBsZXRlIiwiU0VMRUNUOjpkaXNhYmxlZCIsIlNFTEVDVDo6bXVsdGlwbGUiLCJTRUxFQ1Q6
-Om5hbWUiLCJTRUxFQ1Q6OnJlcXVpcmVkIiwiU0VMRUNUOjpzaXplIiwiU0VMRUNUOjp0YWJpbmRleCIs
-IlNPVVJDRTo6dHlwZSIsIlRBQkxFOjphbGlnbiIsIlRBQkxFOjpiZ2NvbG9yIiwiVEFCTEU6OmJvcmRl
-ciIsIlRBQkxFOjpjZWxscGFkZGluZyIsIlRBQkxFOjpjZWxsc3BhY2luZyIsIlRBQkxFOjpmcmFtZSIs
-IlRBQkxFOjpydWxlcyIsIlRBQkxFOjpzdW1tYXJ5IiwiVEFCTEU6OndpZHRoIiwiVEJPRFk6OmFsaWdu
-IiwiVEJPRFk6OmNoYXIiLCJUQk9EWTo6Y2hhcm9mZiIsIlRCT0RZOjp2YWxpZ24iLCJURDo6YWJiciIs
-IlREOjphbGlnbiIsIlREOjpheGlzIiwiVEQ6OmJnY29sb3IiLCJURDo6Y2hhciIsIlREOjpjaGFyb2Zm
-IiwiVEQ6OmNvbHNwYW4iLCJURDo6aGVhZGVycyIsIlREOjpoZWlnaHQiLCJURDo6bm93cmFwIiwiVEQ6
-OnJvd3NwYW4iLCJURDo6c2NvcGUiLCJURDo6dmFsaWduIiwiVEQ6OndpZHRoIiwiVEVYVEFSRUE6OmFj
-Y2Vzc2tleSIsIlRFWFRBUkVBOjphdXRvY29tcGxldGUiLCJURVhUQVJFQTo6Y29scyIsIlRFWFRBUkVB
-OjpkaXNhYmxlZCIsIlRFWFRBUkVBOjppbnB1dG1vZGUiLCJURVhUQVJFQTo6bmFtZSIsIlRFWFRBUkVB
-OjpwbGFjZWhvbGRlciIsIlRFWFRBUkVBOjpyZWFkb25seSIsIlRFWFRBUkVBOjpyZXF1aXJlZCIsIlRF
-WFRBUkVBOjpyb3dzIiwiVEVYVEFSRUE6OnRhYmluZGV4IiwiVEVYVEFSRUE6OndyYXAiLCJURk9PVDo6
-YWxpZ24iLCJURk9PVDo6Y2hhciIsIlRGT09UOjpjaGFyb2ZmIiwiVEZPT1Q6OnZhbGlnbiIsIlRIOjph
-YmJyIiwiVEg6OmFsaWduIiwiVEg6OmF4aXMiLCJUSDo6Ymdjb2xvciIsIlRIOjpjaGFyIiwiVEg6OmNo
-YXJvZmYiLCJUSDo6Y29sc3BhbiIsIlRIOjpoZWFkZXJzIiwiVEg6OmhlaWdodCIsIlRIOjpub3dyYXAi
-LCJUSDo6cm93c3BhbiIsIlRIOjpzY29wZSIsIlRIOjp2YWxpZ24iLCJUSDo6d2lkdGgiLCJUSEVBRDo6
-YWxpZ24iLCJUSEVBRDo6Y2hhciIsIlRIRUFEOjpjaGFyb2ZmIiwiVEhFQUQ6OnZhbGlnbiIsIlRSOjph
-bGlnbiIsIlRSOjpiZ2NvbG9yIiwiVFI6OmNoYXIiLCJUUjo6Y2hhcm9mZiIsIlRSOjp2YWxpZ24iLCJU
-UkFDSzo6ZGVmYXVsdCIsIlRSQUNLOjpraW5kIiwiVFJBQ0s6OmxhYmVsIiwiVFJBQ0s6OnNyY2xhbmci
-LCJVTDo6Y29tcGFjdCIsIlVMOjp0eXBlIiwiVklERU86OmNvbnRyb2xzIiwiVklERU86OmhlaWdodCIs
-IlZJREVPOjpsb29wIiwiVklERU86Om1lZGlhZ3JvdXAiLCJWSURFTzo6bXV0ZWQiLCJWSURFTzo6cHJl
-bG9hZCIsIlZJREVPOjp3aWR0aCJdKSx0LnMpCkMuVkM9SC5RSShzKFswLDAsNjU0OTAsNDUwNTUsNjU1
-MzUsMzQ4MTUsNjU1MzQsMTg0MzFdKSx0LnQpCkMubUs9SC5RSShzKFswLDAsMjY2MjQsMTAyMyw2NTUz
-NCwyMDQ3LDY1NTM0LDIwNDddKSx0LnQpCkMuU3E9SC5RSShzKFsiSEVBRCIsIkFSRUEiLCJCQVNFIiwi
-QkFTRUZPTlQiLCJCUiIsIkNPTCIsIkNPTEdST1VQIiwiRU1CRUQiLCJGUkFNRSIsIkZSQU1FU0VUIiwi
-SFIiLCJJTUFHRSIsIklNRyIsIklOUFVUIiwiSVNJTkRFWCIsIkxJTksiLCJNRVRBIiwiUEFSQU0iLCJT
-T1VSQ0UiLCJTVFlMRSIsIlRJVExFIiwiV0JSIl0pLHQucykKQy5kbj1ILlFJKHMoW10pLEguTjAoImpk
-PExMPiIpKQpDLnhEPUguUUkocyhbXSksdC5zKQpDLmhVPUguUUkocyhbXSksdC5iKQpDLnRvPUguUUko
-cyhbMCwwLDMyNzIyLDEyMjg3LDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLnJrPUguUUko
-cyhbQy5BZCxDLm5lLEMubXksQy5yeCxDLndWLEMuZlJdKSxILk4wKCJqZDxINz4iKSkKQy5GMz1ILlFJ
-KHMoWzAsMCwyNDU3NiwxMDIzLDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLmVhPUguUUko
-cyhbMCwwLDMyNzU0LDExMjYzLDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLlpKPUguUUko
-cyhbMCwwLDMyNzIyLDEyMjg3LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLldkPUguUUko
-cyhbMCwwLDY1NDkwLDEyMjg3LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLlF4PUguUUko
-cyhbImJpbmQiLCJpZiIsInJlZiIsInJlcGVhdCIsInN5bnRheCJdKSx0LnMpCkMuQkk9SC5RSShzKFsi
-QTo6aHJlZiIsIkFSRUE6OmhyZWYiLCJCTE9DS1FVT1RFOjpjaXRlIiwiQk9EWTo6YmFja2dyb3VuZCIs
-IkNPTU1BTkQ6Omljb24iLCJERUw6OmNpdGUiLCJGT1JNOjphY3Rpb24iLCJJTUc6OnNyYyIsIklOUFVU
-OjpzcmMiLCJJTlM6OmNpdGUiLCJROjpjaXRlIiwiVklERU86OnBvc3RlciJdKSx0LnMpCkMuRHg9bmV3
-IEguTFAoMCx7fSxDLnhELEguTjAoIkxQPHFVLHpNPGo4Pj4iKSkKQy5DTT1uZXcgSC5MUCgwLHt9LEMu
-eEQsSC5OMCgiTFA8cVUscVU+IikpCkMuaUg9SC5RSShzKFtdKSxILk4wKCJqZDxHRD4iKSkKQy5XTz1u
-ZXcgSC5MUCgwLHt9LEMuaUgsSC5OMCgiTFA8R0QsQD4iKSkKQy5ZMj1uZXcgTC5POSgiTmF2aWdhdGlv
-blRyZWVOb2RlVHlwZS5kaXJlY3RvcnkiKQpDLnJmPW5ldyBMLk85KCJOYXZpZ2F0aW9uVHJlZU5vZGVU
-eXBlLmZpbGUiKQpDLlRlPW5ldyBILnd2KCJjYWxsIikKQy5vRT1uZXcgUC5HWSghMSkKQy53UT1uZXcg
-UC5GeShudWxsLDIpfSkoKTsoZnVuY3Rpb24gc3RhdGljRmllbGRzKCl7JC56bT1udWxsCiQueWo9MAok
-LmkwPW51bGwKJC5BbD1udWxsCiQuTkY9bnVsbAokLlRYPW51bGwKJC54Nz1udWxsCiQubnc9bnVsbAok
-LnZ2PW51bGwKJC5Cdj1udWxsCiQuUzY9bnVsbAokLms4PW51bGwKJC5tZz1udWxsCiQuVUQ9ITEKJC5Y
-Mz1DLk5VCiQueGc9SC5RSShbXSxILk4wKCJqZDxNaD4iKSkKJC54bz1udWxsCiQuQk89bnVsbAokLmx0
-PW51bGwKJC5FVT1udWxsCiQub3I9UC5GbCh0Lk4sdC5ZKQokLklSPW51bGwKJC5JNj1udWxsCiQuRmY9
-bnVsbH0pKCk7KGZ1bmN0aW9uIGxhenlJbml0aWFsaXplcnMoKXt2YXIgcz1odW5rSGVscGVycy5sYXp5
-RmluYWwscj1odW5rSGVscGVycy5sYXp5CnMoJCwiZmEiLCJ6IixmdW5jdGlvbigpe3JldHVybiBILlln
-KCJfJGRhcnRfZGFydENsb3N1cmUiKX0pCnMoJCwiS3EiLCJTbiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5j
-TShILlM3KHsKdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iJHJlY2VpdmVyJCJ9fSkpfSkKcygkLCJ4
-cSIsImxxIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcoeyRtZXRob2QkOm51bGwsCnRvU3RyaW5n
-OmZ1bmN0aW9uKCl7cmV0dXJuIiRyZWNlaXZlciQifX0pKX0pCnMoJCwiUjEiLCJOOSIsZnVuY3Rpb24o
-KXtyZXR1cm4gSC5jTShILlM3KG51bGwpKX0pCnMoJCwiZk4iLCJpSSIsZnVuY3Rpb24oKXtyZXR1cm4g
-SC5jTShmdW5jdGlvbigpe3ZhciAkYXJndW1lbnRzRXhwciQ9IiRhcmd1bWVudHMkIgp0cnl7bnVsbC4k
-bWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNhdGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMo
-JCwicWkiLCJVTiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KHZvaWQgMCkpfSkKcygkLCJwdiIs
-IlpoIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dmFyICRhcmd1bWVudHNFeHByJD0i
-JGFyZ3VtZW50cyQiCnRyeXsodm9pZCAwKS4kbWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNhdGNoKHEp
-e3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMoJCwia3EiLCJyTiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5j
-TShILk1qKG51bGwpKX0pCnMoJCwidHQiLCJjMyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShmdW5jdGlv
-bigpe3RyeXtudWxsLiRtZXRob2QkfWNhdGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMoJCwi
-ZHQiLCJISyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILk1qKHZvaWQgMCkpfSkKcygkLCJBNyIsInIx
-IixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dHJ5eyh2b2lkIDApLiRtZXRob2QkfWNh
-dGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMoJCwiV2MiLCJ1dCIsZnVuY3Rpb24oKXtyZXR1
-cm4gUC5PaigpfSkKcygkLCJraCIsInJmIixmdW5jdGlvbigpe3JldHVybiBuZXcgUC54cigpLiQwKCl9
-KQpzKCQsImRIIiwiSEciLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQLk56KCkuJDAoKX0pCnMoJCwiaGoi
-LCJWNyIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEludDhBcnJheShILlhGKEguUUkoWy0yLC0yLC0yLC0y
-LC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0y
-LC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0xLC0yLC0yLC0yLC0yLC0yLDYy
-LC0yLDYyLC0yLDYzLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLC0yLC0yLC0yLC0xLC0yLC0y
-LC0yLDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEs
-MjIsMjMsMjQsMjUsLTIsLTIsLTIsLTIsNjMsLTIsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUs
-MzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsLTIsLTIsLTIsLTIs
-LTJdLHQudCkpKX0pCnMoJCwiWWUiLCJ3USIsZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIHByb2Nlc3Mh
-PSJ1bmRlZmluZWQiJiZPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocHJvY2Vzcyk9PSJbb2Jq
-ZWN0IHByb2Nlc3NdIiYmcHJvY2Vzcy5wbGF0Zm9ybT09IndpbjMyIn0pCnMoJCwibWYiLCJ6NCIsZnVu
-Y3Rpb24oKXtyZXR1cm4gUC5udSgiXltcXC1cXC4wLTlBLVpfYS16fl0qJCIpfSkKcygkLCJPUSIsInZa
-IixmdW5jdGlvbigpe3JldHVybiBQLktOKCl9KQpzKCQsIlNDIiwiQU4iLGZ1bmN0aW9uKCl7cmV0dXJu
-IFAudE0oWyJBIiwiQUJCUiIsIkFDUk9OWU0iLCJBRERSRVNTIiwiQVJFQSIsIkFSVElDTEUiLCJBU0lE
-RSIsIkFVRElPIiwiQiIsIkJESSIsIkJETyIsIkJJRyIsIkJMT0NLUVVPVEUiLCJCUiIsIkJVVFRPTiIs
-IkNBTlZBUyIsIkNBUFRJT04iLCJDRU5URVIiLCJDSVRFIiwiQ09ERSIsIkNPTCIsIkNPTEdST1VQIiwi
-Q09NTUFORCIsIkRBVEEiLCJEQVRBTElTVCIsIkREIiwiREVMIiwiREVUQUlMUyIsIkRGTiIsIkRJUiIs
-IkRJViIsIkRMIiwiRFQiLCJFTSIsIkZJRUxEU0VUIiwiRklHQ0FQVElPTiIsIkZJR1VSRSIsIkZPTlQi
-LCJGT09URVIiLCJGT1JNIiwiSDEiLCJIMiIsIkgzIiwiSDQiLCJINSIsIkg2IiwiSEVBREVSIiwiSEdS
-T1VQIiwiSFIiLCJJIiwiSUZSQU1FIiwiSU1HIiwiSU5QVVQiLCJJTlMiLCJLQkQiLCJMQUJFTCIsIkxF
-R0VORCIsIkxJIiwiTUFQIiwiTUFSSyIsIk1FTlUiLCJNRVRFUiIsIk5BViIsIk5PQlIiLCJPTCIsIk9Q
-VEdST1VQIiwiT1BUSU9OIiwiT1VUUFVUIiwiUCIsIlBSRSIsIlBST0dSRVNTIiwiUSIsIlMiLCJTQU1Q
-IiwiU0VDVElPTiIsIlNFTEVDVCIsIlNNQUxMIiwiU09VUkNFIiwiU1BBTiIsIlNUUklLRSIsIlNUUk9O
-RyIsIlNVQiIsIlNVTU1BUlkiLCJTVVAiLCJUQUJMRSIsIlRCT0RZIiwiVEQiLCJURVhUQVJFQSIsIlRG
-T09UIiwiVEgiLCJUSEVBRCIsIlRJTUUiLCJUUiIsIlRSQUNLIiwiVFQiLCJVIiwiVUwiLCJWQVIiLCJW
-SURFTyIsIldCUiJdLHQuTil9KQpzKCQsIlg0IiwiaEciLGZ1bmN0aW9uKCl7cmV0dXJuIFAubnUoIl5c
-XFMrJCIpfSkKcygkLCJ3TyIsIm93IixmdW5jdGlvbigpe3JldHVybiBQLk5EKHNlbGYpfSkKcygkLCJr
-dCIsIlI4IixmdW5jdGlvbigpe3JldHVybiBILllnKCJfJGRhcnRfZGFydE9iamVjdCIpfSkKcygkLCJm
-SyIsImtJIixmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiBEYXJ0T2JqZWN0KGEpe3RoaXMubz1hfX0p
-CnMoJCwicXQiLCJ6QiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFQubVEoKX0pCnMoJCwiT2wiLCJVRSIs
-ZnVuY3Rpb24oKXtyZXR1cm4gUC5oSyhDLm9sLmdtVyhXLngzKCkpLmhyZWYpLmdoWSgpLnEoMCwiYXV0
-aFRva2VuIil9KQpzKCQsImhUIiwieVAiLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVj
-dG9yKCIuZWRpdC1saXN0IC5wYW5lbC1jb250ZW50Iil9KQpzKCQsIlc2IiwiaEwiLGZ1bmN0aW9uKCl7
-cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCIuZWRpdC1wYW5lbCAucGFuZWwtY29udGVudCIpfSkK
-cygkLCJUUiIsIkRXIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxlY3RvcigiZm9vdGVy
-Iil9KQpzKCQsIkVZIiwiZmkiLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCJo
-ZWFkZXIiKX0pCnMoJCwiYkEiLCJjMCIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0
-b3IoIiNtaWdyYXRlLXVuaXQtc3RhdHVzLWljb24iKX0pCnMoJCwidDAiLCJiTiIsZnVuY3Rpb24oKXty
-ZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoIiNtaWdyYXRlLXVuaXQtc3RhdHVzLWljb24tbGFiZWwi
-KX0pCnMoJCwiYXYiLCJEOSIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoIiN1
-bml0LW5hbWUiKX0pCnIoJCwiZmUiLCJLRyIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEwuWEEoKX0pCnMo
-JCwiZW8iLCJuVSIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE0ubEkoSC5OMCgiZnYiKS5hKCQuSGsoKSkp
-fSkKcygkLCJ5ciIsImJEIixmdW5jdGlvbigpe3JldHVybiBuZXcgRS5PRihQLm51KCIvIiksUC5udSgi
-W14vXSQiKSxQLm51KCJeLyIpKX0pCnMoJCwiTWsiLCJLayIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEwu
-SVYoUC5udSgiWy9cXFxcXSIpLFAubnUoIlteL1xcXFxdJCIpLFAubnUoIl4oXFxcXFxcXFxbXlxcXFxd
-K1xcXFxbXlxcXFwvXSt8W2EtekEtWl06Wy9cXFxcXSkiKSxQLm51KCJeWy9cXFxcXSg/IVsvXFxcXF0p
-IikpfSkKcygkLCJhayIsIkViIixmdW5jdGlvbigpe3JldHVybiBuZXcgRi5ydShQLm51KCIvIiksUC5u
-dSgiKF5bYS16QS1aXVstKy5hLXpBLVpcXGRdKjovL3xbXi9dKSQiKSxQLm51KCJbYS16QS1aXVstKy5h
-LXpBLVpcXGRdKjovL1teL10qIiksUC5udSgiXi8iKSl9KQpzKCQsImxzIiwiSGsiLGZ1bmN0aW9uKCl7
-cmV0dXJuIE8uUmgoKX0pfSkoKTsoZnVuY3Rpb24gbmF0aXZlU3VwcG9ydCgpeyFmdW5jdGlvbigpe3Zh
-ciBzPWZ1bmN0aW9uKGEpe3ZhciBtPXt9Cm1bYV09MQpyZXR1cm4gT2JqZWN0LmtleXMoaHVua0hlbHBl
-cnMuY29udmVydFRvRmFzdE9iamVjdChtKSlbMF19CnYuZ2V0SXNvbGF0ZVRhZz1mdW5jdGlvbihhKXty
-ZXR1cm4gcygiX19fZGFydF8iK2Erdi5pc29sYXRlVGFnKX0KdmFyIHI9Il9fX2RhcnRfaXNvbGF0ZV90
-YWdzXyIKdmFyIHE9T2JqZWN0W3JdfHwoT2JqZWN0W3JdPU9iamVjdC5jcmVhdGUobnVsbCkpCnZhciBw
-PSJfWnhZeFgiCmZvcih2YXIgbz0wOztvKyspe3ZhciBuPXMocCsiXyIrbysiXyIpCmlmKCEobiBpbiBx
-KSl7cVtuXT0xCnYuaXNvbGF0ZVRhZz1uCmJyZWFrfX12LmRpc3BhdGNoUHJvcGVydHlOYW1lPXYuZ2V0
-SXNvbGF0ZVRhZygiZGlzcGF0Y2hfcmVjb3JkIil9KCkKaHVua0hlbHBlcnMuc2V0T3JVcGRhdGVJbnRl
-cmNlcHRvcnNCeVRhZyh7RE9NRXJyb3I6Si5HdixNZWRpYUVycm9yOkouR3YsTmF2aWdhdG9yOkouR3Ys
-TmF2aWdhdG9yQ29uY3VycmVudEhhcmR3YXJlOkouR3YsTmF2aWdhdG9yVXNlck1lZGlhRXJyb3I6Si5H
-dixPdmVyY29uc3RyYWluZWRFcnJvcjpKLkd2LFBvc2l0aW9uRXJyb3I6Si5HdixHZW9sb2NhdGlvblBv
-c2l0aW9uRXJyb3I6Si5HdixSYW5nZTpKLkd2LFNRTEVycm9yOkouR3YsRGF0YVZpZXc6SC5FVCxBcnJh
-eUJ1ZmZlclZpZXc6SC5FVCxGbG9hdDMyQXJyYXk6SC5EZyxGbG9hdDY0QXJyYXk6SC5EZyxJbnQxNkFy
-cmF5OkgueGosSW50MzJBcnJheTpILmRFLEludDhBcnJheTpILlpBLFVpbnQxNkFycmF5OkguZFQsVWlu
-dDMyQXJyYXk6SC5QcSxVaW50OENsYW1wZWRBcnJheTpILmVFLENhbnZhc1BpeGVsQXJyYXk6SC5lRSxV
-aW50OEFycmF5OkguVjYsSFRNTEF1ZGlvRWxlbWVudDpXLnFFLEhUTUxCUkVsZW1lbnQ6Vy5xRSxIVE1M
-QnV0dG9uRWxlbWVudDpXLnFFLEhUTUxDYW52YXNFbGVtZW50OlcucUUsSFRNTENvbnRlbnRFbGVtZW50
-OlcucUUsSFRNTERMaXN0RWxlbWVudDpXLnFFLEhUTUxEYXRhRWxlbWVudDpXLnFFLEhUTUxEYXRhTGlz
-dEVsZW1lbnQ6Vy5xRSxIVE1MRGV0YWlsc0VsZW1lbnQ6Vy5xRSxIVE1MRGlhbG9nRWxlbWVudDpXLnFF
-LEhUTUxEaXZFbGVtZW50OlcucUUsSFRNTEVtYmVkRWxlbWVudDpXLnFFLEhUTUxGaWVsZFNldEVsZW1l
-bnQ6Vy5xRSxIVE1MSFJFbGVtZW50OlcucUUsSFRNTEhlYWRFbGVtZW50OlcucUUsSFRNTEhlYWRpbmdF
-bGVtZW50OlcucUUsSFRNTEh0bWxFbGVtZW50OlcucUUsSFRNTElGcmFtZUVsZW1lbnQ6Vy5xRSxIVE1M
-SW1hZ2VFbGVtZW50OlcucUUsSFRNTElucHV0RWxlbWVudDpXLnFFLEhUTUxMSUVsZW1lbnQ6Vy5xRSxI
-VE1MTGFiZWxFbGVtZW50OlcucUUsSFRNTExlZ2VuZEVsZW1lbnQ6Vy5xRSxIVE1MTGlua0VsZW1lbnQ6
-Vy5xRSxIVE1MTWFwRWxlbWVudDpXLnFFLEhUTUxNZWRpYUVsZW1lbnQ6Vy5xRSxIVE1MTWVudUVsZW1l
-bnQ6Vy5xRSxIVE1MTWV0YUVsZW1lbnQ6Vy5xRSxIVE1MTWV0ZXJFbGVtZW50OlcucUUsSFRNTE1vZEVs
-ZW1lbnQ6Vy5xRSxIVE1MT0xpc3RFbGVtZW50OlcucUUsSFRNTE9iamVjdEVsZW1lbnQ6Vy5xRSxIVE1M
-T3B0R3JvdXBFbGVtZW50OlcucUUsSFRNTE9wdGlvbkVsZW1lbnQ6Vy5xRSxIVE1MT3V0cHV0RWxlbWVu
-dDpXLnFFLEhUTUxQYXJhbUVsZW1lbnQ6Vy5xRSxIVE1MUGljdHVyZUVsZW1lbnQ6Vy5xRSxIVE1MUHJl
-RWxlbWVudDpXLnFFLEhUTUxQcm9ncmVzc0VsZW1lbnQ6Vy5xRSxIVE1MUXVvdGVFbGVtZW50OlcucUUs
-SFRNTFNjcmlwdEVsZW1lbnQ6Vy5xRSxIVE1MU2hhZG93RWxlbWVudDpXLnFFLEhUTUxTbG90RWxlbWVu
-dDpXLnFFLEhUTUxTb3VyY2VFbGVtZW50OlcucUUsSFRNTFNwYW5FbGVtZW50OlcucUUsSFRNTFN0eWxl
-RWxlbWVudDpXLnFFLEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OlcucUUsSFRNTFRhYmxlQ2VsbEVsZW1l
-bnQ6Vy5xRSxIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQ6Vy5xRSxIVE1MVGFibGVIZWFkZXJDZWxsRWxl
-bWVudDpXLnFFLEhUTUxUYWJsZUNvbEVsZW1lbnQ6Vy5xRSxIVE1MVGV4dEFyZWFFbGVtZW50OlcucUUs
-SFRNTFRpbWVFbGVtZW50OlcucUUsSFRNTFRpdGxlRWxlbWVudDpXLnFFLEhUTUxUcmFja0VsZW1lbnQ6
-Vy5xRSxIVE1MVUxpc3RFbGVtZW50OlcucUUsSFRNTFVua25vd25FbGVtZW50OlcucUUsSFRNTFZpZGVv
-RWxlbWVudDpXLnFFLEhUTUxEaXJlY3RvcnlFbGVtZW50OlcucUUsSFRNTEZvbnRFbGVtZW50OlcucUUs
-SFRNTEZyYW1lRWxlbWVudDpXLnFFLEhUTUxGcmFtZVNldEVsZW1lbnQ6Vy5xRSxIVE1MTWFycXVlZUVs
-ZW1lbnQ6Vy5xRSxIVE1MRWxlbWVudDpXLnFFLEhUTUxBbmNob3JFbGVtZW50OlcuR2gsSFRNTEFyZWFF
-bGVtZW50OlcuZlksSFRNTEJhc2VFbGVtZW50OlcuclosQmxvYjpXLkF6LEhUTUxCb2R5RWxlbWVudDpX
-LlFQLENEQVRBU2VjdGlvbjpXLm54LENoYXJhY3RlckRhdGE6Vy5ueCxDb21tZW50OlcubngsUHJvY2Vz
-c2luZ0luc3RydWN0aW9uOlcubngsVGV4dDpXLm54LENTU1N0eWxlRGVjbGFyYXRpb246Vy5vSixNU1N0
-eWxlQ1NTUHJvcGVydGllczpXLm9KLENTUzJQcm9wZXJ0aWVzOlcub0osWE1MRG9jdW1lbnQ6Vy5RRixE
-b2N1bWVudDpXLlFGLERPTUV4Y2VwdGlvbjpXLk5oLERPTUltcGxlbWVudGF0aW9uOlcuYWUsRE9NUmVj
-dFJlYWRPbmx5OlcuSUIsRE9NVG9rZW5MaXN0OlcubjcsRWxlbWVudDpXLmN2LEFib3J0UGF5bWVudEV2
-ZW50OlcuZWEsQW5pbWF0aW9uRXZlbnQ6Vy5lYSxBbmltYXRpb25QbGF5YmFja0V2ZW50OlcuZWEsQXBw
-bGljYXRpb25DYWNoZUVycm9yRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hDbGlja0V2ZW50OlcuZWEs
-QmFja2dyb3VuZEZldGNoRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hGYWlsRXZlbnQ6Vy5lYSxCYWNr
-Z3JvdW5kRmV0Y2hlZEV2ZW50OlcuZWEsQmVmb3JlSW5zdGFsbFByb21wdEV2ZW50OlcuZWEsQmVmb3Jl
-VW5sb2FkRXZlbnQ6Vy5lYSxCbG9iRXZlbnQ6Vy5lYSxDYW5NYWtlUGF5bWVudEV2ZW50OlcuZWEsQ2xp
-cGJvYXJkRXZlbnQ6Vy5lYSxDbG9zZUV2ZW50OlcuZWEsQ3VzdG9tRXZlbnQ6Vy5lYSxEZXZpY2VNb3Rp
-b25FdmVudDpXLmVhLERldmljZU9yaWVudGF0aW9uRXZlbnQ6Vy5lYSxFcnJvckV2ZW50OlcuZWEsRXh0
-ZW5kYWJsZUV2ZW50OlcuZWEsRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudDpXLmVhLEZldGNoRXZlbnQ6Vy5l
-YSxGb250RmFjZVNldExvYWRFdmVudDpXLmVhLEZvcmVpZ25GZXRjaEV2ZW50OlcuZWEsR2FtZXBhZEV2
-ZW50OlcuZWEsSGFzaENoYW5nZUV2ZW50OlcuZWEsSW5zdGFsbEV2ZW50OlcuZWEsTWVkaWFFbmNyeXB0
-ZWRFdmVudDpXLmVhLE1lZGlhS2V5TWVzc2FnZUV2ZW50OlcuZWEsTWVkaWFRdWVyeUxpc3RFdmVudDpX
-LmVhLE1lZGlhU3RyZWFtRXZlbnQ6Vy5lYSxNZWRpYVN0cmVhbVRyYWNrRXZlbnQ6Vy5lYSxNZXNzYWdl
-RXZlbnQ6Vy5lYSxNSURJQ29ubmVjdGlvbkV2ZW50OlcuZWEsTUlESU1lc3NhZ2VFdmVudDpXLmVhLE11
-dGF0aW9uRXZlbnQ6Vy5lYSxOb3RpZmljYXRpb25FdmVudDpXLmVhLFBhZ2VUcmFuc2l0aW9uRXZlbnQ6
-Vy5lYSxQYXltZW50UmVxdWVzdEV2ZW50OlcuZWEsUGF5bWVudFJlcXVlc3RVcGRhdGVFdmVudDpXLmVh
-LFBvcFN0YXRlRXZlbnQ6Vy5lYSxQcmVzZW50YXRpb25Db25uZWN0aW9uQXZhaWxhYmxlRXZlbnQ6Vy5l
-YSxQcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VFdmVudDpXLmVhLFByb21pc2VSZWplY3Rpb25FdmVu
-dDpXLmVhLFB1c2hFdmVudDpXLmVhLFJUQ0RhdGFDaGFubmVsRXZlbnQ6Vy5lYSxSVENEVE1GVG9uZUNo
-YW5nZUV2ZW50OlcuZWEsUlRDUGVlckNvbm5lY3Rpb25JY2VFdmVudDpXLmVhLFJUQ1RyYWNrRXZlbnQ6
-Vy5lYSxTZWN1cml0eVBvbGljeVZpb2xhdGlvbkV2ZW50OlcuZWEsU2Vuc29yRXJyb3JFdmVudDpXLmVh
-LFNwZWVjaFJlY29nbml0aW9uRXJyb3I6Vy5lYSxTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OlcuZWEsU3Bl
-ZWNoU3ludGhlc2lzRXZlbnQ6Vy5lYSxTdG9yYWdlRXZlbnQ6Vy5lYSxTeW5jRXZlbnQ6Vy5lYSxUcmFj
-a0V2ZW50OlcuZWEsVHJhbnNpdGlvbkV2ZW50OlcuZWEsV2ViS2l0VHJhbnNpdGlvbkV2ZW50OlcuZWEs
-VlJEZXZpY2VFdmVudDpXLmVhLFZSRGlzcGxheUV2ZW50OlcuZWEsVlJTZXNzaW9uRXZlbnQ6Vy5lYSxN
-b2pvSW50ZXJmYWNlUmVxdWVzdEV2ZW50OlcuZWEsVVNCQ29ubmVjdGlvbkV2ZW50OlcuZWEsSURCVmVy
-c2lvbkNoYW5nZUV2ZW50OlcuZWEsQXVkaW9Qcm9jZXNzaW5nRXZlbnQ6Vy5lYSxPZmZsaW5lQXVkaW9D
-b21wbGV0aW9uRXZlbnQ6Vy5lYSxXZWJHTENvbnRleHRFdmVudDpXLmVhLEV2ZW50OlcuZWEsSW5wdXRF
-dmVudDpXLmVhLFN1Ym1pdEV2ZW50OlcuZWEsRXZlbnRUYXJnZXQ6Vy5EMCxGaWxlOlcuaEgsSFRNTEZv
-cm1FbGVtZW50OlcuaDQsSGlzdG9yeTpXLmJyLEhUTUxEb2N1bWVudDpXLlZiLFhNTEh0dHBSZXF1ZXN0
-OlcuZkosWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDpXLndhLEltYWdlRGF0YTpXLlNnLExvY2F0aW9u
-OlcudTgsTW91c2VFdmVudDpXLkFqLERyYWdFdmVudDpXLkFqLFBvaW50ZXJFdmVudDpXLkFqLFdoZWVs
-RXZlbnQ6Vy5BaixEb2N1bWVudEZyYWdtZW50OlcuS1YsU2hhZG93Um9vdDpXLktWLERvY3VtZW50VHlw
-ZTpXLktWLE5vZGU6Vy5LVixOb2RlTGlzdDpXLkJILFJhZGlvTm9kZUxpc3Q6Vy5CSCxIVE1MUGFyYWdy
-YXBoRWxlbWVudDpXLlNOLFByb2dyZXNzRXZlbnQ6Vy5ldyxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6Vy5l
-dyxIVE1MU2VsZWN0RWxlbWVudDpXLmxwLEhUTUxUYWJsZUVsZW1lbnQ6Vy5UYixIVE1MVGFibGVSb3dF
-bGVtZW50OlcuSXYsSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6Vy5XUCxIVE1MVGVtcGxhdGVFbGVtZW50
-OlcueVksQ29tcG9zaXRpb25FdmVudDpXLnc2LEZvY3VzRXZlbnQ6Vy53NixLZXlib2FyZEV2ZW50Olcu
-dzYsVGV4dEV2ZW50OlcudzYsVG91Y2hFdmVudDpXLnc2LFVJRXZlbnQ6Vy53NixXaW5kb3c6Vy5LNSxE
-T01XaW5kb3c6Vy5LNSxEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZTpXLkNtLFNlcnZpY2VXb3JrZXJH
-bG9iYWxTY29wZTpXLkNtLFNoYXJlZFdvcmtlckdsb2JhbFNjb3BlOlcuQ20sV29ya2VyR2xvYmFsU2Nv
-cGU6Vy5DbSxBdHRyOlcuQ1EsQ2xpZW50UmVjdDpXLnc0LERPTVJlY3Q6Vy53NCxOYW1lZE5vZGVNYXA6
-Vy5yaCxNb3pOYW1lZEF0dHJNYXA6Vy5yaCxJREJLZXlSYW5nZTpQLmhGLFNWR1NjcmlwdEVsZW1lbnQ6
-UC5uZCxTVkdBRWxlbWVudDpQLmhpLFNWR0FuaW1hdGVFbGVtZW50OlAuaGksU1ZHQW5pbWF0ZU1vdGlv
-bkVsZW1lbnQ6UC5oaSxTVkdBbmltYXRlVHJhbnNmb3JtRWxlbWVudDpQLmhpLFNWR0FuaW1hdGlvbkVs
-ZW1lbnQ6UC5oaSxTVkdDaXJjbGVFbGVtZW50OlAuaGksU1ZHQ2xpcFBhdGhFbGVtZW50OlAuaGksU1ZH
-RGVmc0VsZW1lbnQ6UC5oaSxTVkdEZXNjRWxlbWVudDpQLmhpLFNWR0Rpc2NhcmRFbGVtZW50OlAuaGks
-U1ZHRWxsaXBzZUVsZW1lbnQ6UC5oaSxTVkdGRUJsZW5kRWxlbWVudDpQLmhpLFNWR0ZFQ29sb3JNYXRy
-aXhFbGVtZW50OlAuaGksU1ZHRkVDb21wb25lbnRUcmFuc2ZlckVsZW1lbnQ6UC5oaSxTVkdGRUNvbXBv
-c2l0ZUVsZW1lbnQ6UC5oaSxTVkdGRUNvbnZvbHZlTWF0cml4RWxlbWVudDpQLmhpLFNWR0ZFRGlmZnVz
-ZUxpZ2h0aW5nRWxlbWVudDpQLmhpLFNWR0ZFRGlzcGxhY2VtZW50TWFwRWxlbWVudDpQLmhpLFNWR0ZF
-RGlzdGFudExpZ2h0RWxlbWVudDpQLmhpLFNWR0ZFRmxvb2RFbGVtZW50OlAuaGksU1ZHRkVGdW5jQUVs
-ZW1lbnQ6UC5oaSxTVkdGRUZ1bmNCRWxlbWVudDpQLmhpLFNWR0ZFRnVuY0dFbGVtZW50OlAuaGksU1ZH
-RkVGdW5jUkVsZW1lbnQ6UC5oaSxTVkdGRUdhdXNzaWFuQmx1ckVsZW1lbnQ6UC5oaSxTVkdGRUltYWdl
-RWxlbWVudDpQLmhpLFNWR0ZFTWVyZ2VFbGVtZW50OlAuaGksU1ZHRkVNZXJnZU5vZGVFbGVtZW50OlAu
-aGksU1ZHRkVNb3JwaG9sb2d5RWxlbWVudDpQLmhpLFNWR0ZFT2Zmc2V0RWxlbWVudDpQLmhpLFNWR0ZF
-UG9pbnRMaWdodEVsZW1lbnQ6UC5oaSxTVkdGRVNwZWN1bGFyTGlnaHRpbmdFbGVtZW50OlAuaGksU1ZH
-RkVTcG90TGlnaHRFbGVtZW50OlAuaGksU1ZHRkVUaWxlRWxlbWVudDpQLmhpLFNWR0ZFVHVyYnVsZW5j
-ZUVsZW1lbnQ6UC5oaSxTVkdGaWx0ZXJFbGVtZW50OlAuaGksU1ZHRm9yZWlnbk9iamVjdEVsZW1lbnQ6
-UC5oaSxTVkdHRWxlbWVudDpQLmhpLFNWR0dlb21ldHJ5RWxlbWVudDpQLmhpLFNWR0dyYXBoaWNzRWxl
-bWVudDpQLmhpLFNWR0ltYWdlRWxlbWVudDpQLmhpLFNWR0xpbmVFbGVtZW50OlAuaGksU1ZHTGluZWFy
-R3JhZGllbnRFbGVtZW50OlAuaGksU1ZHTWFya2VyRWxlbWVudDpQLmhpLFNWR01hc2tFbGVtZW50OlAu
-aGksU1ZHTWV0YWRhdGFFbGVtZW50OlAuaGksU1ZHUGF0aEVsZW1lbnQ6UC5oaSxTVkdQYXR0ZXJuRWxl
-bWVudDpQLmhpLFNWR1BvbHlnb25FbGVtZW50OlAuaGksU1ZHUG9seWxpbmVFbGVtZW50OlAuaGksU1ZH
-UmFkaWFsR3JhZGllbnRFbGVtZW50OlAuaGksU1ZHUmVjdEVsZW1lbnQ6UC5oaSxTVkdTZXRFbGVtZW50
-OlAuaGksU1ZHU3RvcEVsZW1lbnQ6UC5oaSxTVkdTdHlsZUVsZW1lbnQ6UC5oaSxTVkdTVkdFbGVtZW50
-OlAuaGksU1ZHU3dpdGNoRWxlbWVudDpQLmhpLFNWR1N5bWJvbEVsZW1lbnQ6UC5oaSxTVkdUU3BhbkVs
-ZW1lbnQ6UC5oaSxTVkdUZXh0Q29udGVudEVsZW1lbnQ6UC5oaSxTVkdUZXh0RWxlbWVudDpQLmhpLFNW
-R1RleHRQYXRoRWxlbWVudDpQLmhpLFNWR1RleHRQb3NpdGlvbmluZ0VsZW1lbnQ6UC5oaSxTVkdUaXRs
-ZUVsZW1lbnQ6UC5oaSxTVkdVc2VFbGVtZW50OlAuaGksU1ZHVmlld0VsZW1lbnQ6UC5oaSxTVkdHcmFk
-aWVudEVsZW1lbnQ6UC5oaSxTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9uRWxlbWVudDpQLmhpLFNW
-R0ZFRHJvcFNoYWRvd0VsZW1lbnQ6UC5oaSxTVkdNUGF0aEVsZW1lbnQ6UC5oaSxTVkdFbGVtZW50OlAu
-aGl9KQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUxlYWZUYWdzKHtET01FcnJvcjp0cnVlLE1lZGlhRXJy
-b3I6dHJ1ZSxOYXZpZ2F0b3I6dHJ1ZSxOYXZpZ2F0b3JDb25jdXJyZW50SGFyZHdhcmU6dHJ1ZSxOYXZp
-Z2F0b3JVc2VyTWVkaWFFcnJvcjp0cnVlLE92ZXJjb25zdHJhaW5lZEVycm9yOnRydWUsUG9zaXRpb25F
-cnJvcjp0cnVlLEdlb2xvY2F0aW9uUG9zaXRpb25FcnJvcjp0cnVlLFJhbmdlOnRydWUsU1FMRXJyb3I6
-dHJ1ZSxEYXRhVmlldzp0cnVlLEFycmF5QnVmZmVyVmlldzpmYWxzZSxGbG9hdDMyQXJyYXk6dHJ1ZSxG
-bG9hdDY0QXJyYXk6dHJ1ZSxJbnQxNkFycmF5OnRydWUsSW50MzJBcnJheTp0cnVlLEludDhBcnJheTp0
-cnVlLFVpbnQxNkFycmF5OnRydWUsVWludDMyQXJyYXk6dHJ1ZSxVaW50OENsYW1wZWRBcnJheTp0cnVl
-LENhbnZhc1BpeGVsQXJyYXk6dHJ1ZSxVaW50OEFycmF5OmZhbHNlLEhUTUxBdWRpb0VsZW1lbnQ6dHJ1
-ZSxIVE1MQlJFbGVtZW50OnRydWUsSFRNTEJ1dHRvbkVsZW1lbnQ6dHJ1ZSxIVE1MQ2FudmFzRWxlbWVu
-dDp0cnVlLEhUTUxDb250ZW50RWxlbWVudDp0cnVlLEhUTUxETGlzdEVsZW1lbnQ6dHJ1ZSxIVE1MRGF0
-YUVsZW1lbnQ6dHJ1ZSxIVE1MRGF0YUxpc3RFbGVtZW50OnRydWUsSFRNTERldGFpbHNFbGVtZW50OnRy
-dWUsSFRNTERpYWxvZ0VsZW1lbnQ6dHJ1ZSxIVE1MRGl2RWxlbWVudDp0cnVlLEhUTUxFbWJlZEVsZW1l
-bnQ6dHJ1ZSxIVE1MRmllbGRTZXRFbGVtZW50OnRydWUsSFRNTEhSRWxlbWVudDp0cnVlLEhUTUxIZWFk
-RWxlbWVudDp0cnVlLEhUTUxIZWFkaW5nRWxlbWVudDp0cnVlLEhUTUxIdG1sRWxlbWVudDp0cnVlLEhU
-TUxJRnJhbWVFbGVtZW50OnRydWUsSFRNTEltYWdlRWxlbWVudDp0cnVlLEhUTUxJbnB1dEVsZW1lbnQ6
-dHJ1ZSxIVE1MTElFbGVtZW50OnRydWUsSFRNTExhYmVsRWxlbWVudDp0cnVlLEhUTUxMZWdlbmRFbGVt
-ZW50OnRydWUsSFRNTExpbmtFbGVtZW50OnRydWUsSFRNTE1hcEVsZW1lbnQ6dHJ1ZSxIVE1MTWVkaWFF
-bGVtZW50OnRydWUsSFRNTE1lbnVFbGVtZW50OnRydWUsSFRNTE1ldGFFbGVtZW50OnRydWUsSFRNTE1l
-dGVyRWxlbWVudDp0cnVlLEhUTUxNb2RFbGVtZW50OnRydWUsSFRNTE9MaXN0RWxlbWVudDp0cnVlLEhU
-TUxPYmplY3RFbGVtZW50OnRydWUsSFRNTE9wdEdyb3VwRWxlbWVudDp0cnVlLEhUTUxPcHRpb25FbGVt
-ZW50OnRydWUsSFRNTE91dHB1dEVsZW1lbnQ6dHJ1ZSxIVE1MUGFyYW1FbGVtZW50OnRydWUsSFRNTFBp
-Y3R1cmVFbGVtZW50OnRydWUsSFRNTFByZUVsZW1lbnQ6dHJ1ZSxIVE1MUHJvZ3Jlc3NFbGVtZW50OnRy
-dWUsSFRNTFF1b3RlRWxlbWVudDp0cnVlLEhUTUxTY3JpcHRFbGVtZW50OnRydWUsSFRNTFNoYWRvd0Vs
-ZW1lbnQ6dHJ1ZSxIVE1MU2xvdEVsZW1lbnQ6dHJ1ZSxIVE1MU291cmNlRWxlbWVudDp0cnVlLEhUTUxT
-cGFuRWxlbWVudDp0cnVlLEhUTUxTdHlsZUVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVDYXB0aW9uRWxlbWVu
-dDp0cnVlLEhUTUxUYWJsZUNlbGxFbGVtZW50OnRydWUsSFRNTFRhYmxlRGF0YUNlbGxFbGVtZW50OnRy
-dWUsSFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVDb2xFbGVtZW50OnRydWUs
-SFRNTFRleHRBcmVhRWxlbWVudDp0cnVlLEhUTUxUaW1lRWxlbWVudDp0cnVlLEhUTUxUaXRsZUVsZW1l
-bnQ6dHJ1ZSxIVE1MVHJhY2tFbGVtZW50OnRydWUsSFRNTFVMaXN0RWxlbWVudDp0cnVlLEhUTUxVbmtu
-b3duRWxlbWVudDp0cnVlLEhUTUxWaWRlb0VsZW1lbnQ6dHJ1ZSxIVE1MRGlyZWN0b3J5RWxlbWVudDp0
-cnVlLEhUTUxGb250RWxlbWVudDp0cnVlLEhUTUxGcmFtZUVsZW1lbnQ6dHJ1ZSxIVE1MRnJhbWVTZXRF
-bGVtZW50OnRydWUsSFRNTE1hcnF1ZWVFbGVtZW50OnRydWUsSFRNTEVsZW1lbnQ6ZmFsc2UsSFRNTEFu
-Y2hvckVsZW1lbnQ6dHJ1ZSxIVE1MQXJlYUVsZW1lbnQ6dHJ1ZSxIVE1MQmFzZUVsZW1lbnQ6dHJ1ZSxC
-bG9iOmZhbHNlLEhUTUxCb2R5RWxlbWVudDp0cnVlLENEQVRBU2VjdGlvbjp0cnVlLENoYXJhY3RlckRh
-dGE6dHJ1ZSxDb21tZW50OnRydWUsUHJvY2Vzc2luZ0luc3RydWN0aW9uOnRydWUsVGV4dDp0cnVlLENT
-U1N0eWxlRGVjbGFyYXRpb246dHJ1ZSxNU1N0eWxlQ1NTUHJvcGVydGllczp0cnVlLENTUzJQcm9wZXJ0
-aWVzOnRydWUsWE1MRG9jdW1lbnQ6dHJ1ZSxEb2N1bWVudDpmYWxzZSxET01FeGNlcHRpb246dHJ1ZSxE
-T01JbXBsZW1lbnRhdGlvbjp0cnVlLERPTVJlY3RSZWFkT25seTpmYWxzZSxET01Ub2tlbkxpc3Q6dHJ1
-ZSxFbGVtZW50OmZhbHNlLEFib3J0UGF5bWVudEV2ZW50OnRydWUsQW5pbWF0aW9uRXZlbnQ6dHJ1ZSxB
-bmltYXRpb25QbGF5YmFja0V2ZW50OnRydWUsQXBwbGljYXRpb25DYWNoZUVycm9yRXZlbnQ6dHJ1ZSxC
-YWNrZ3JvdW5kRmV0Y2hDbGlja0V2ZW50OnRydWUsQmFja2dyb3VuZEZldGNoRXZlbnQ6dHJ1ZSxCYWNr
-Z3JvdW5kRmV0Y2hGYWlsRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hlZEV2ZW50OnRydWUsQmVmb3Jl
-SW5zdGFsbFByb21wdEV2ZW50OnRydWUsQmVmb3JlVW5sb2FkRXZlbnQ6dHJ1ZSxCbG9iRXZlbnQ6dHJ1
-ZSxDYW5NYWtlUGF5bWVudEV2ZW50OnRydWUsQ2xpcGJvYXJkRXZlbnQ6dHJ1ZSxDbG9zZUV2ZW50OnRy
-dWUsQ3VzdG9tRXZlbnQ6dHJ1ZSxEZXZpY2VNb3Rpb25FdmVudDp0cnVlLERldmljZU9yaWVudGF0aW9u
-RXZlbnQ6dHJ1ZSxFcnJvckV2ZW50OnRydWUsRXh0ZW5kYWJsZUV2ZW50OnRydWUsRXh0ZW5kYWJsZU1l
-c3NhZ2VFdmVudDp0cnVlLEZldGNoRXZlbnQ6dHJ1ZSxGb250RmFjZVNldExvYWRFdmVudDp0cnVlLEZv
-cmVpZ25GZXRjaEV2ZW50OnRydWUsR2FtZXBhZEV2ZW50OnRydWUsSGFzaENoYW5nZUV2ZW50OnRydWUs
-SW5zdGFsbEV2ZW50OnRydWUsTWVkaWFFbmNyeXB0ZWRFdmVudDp0cnVlLE1lZGlhS2V5TWVzc2FnZUV2
-ZW50OnRydWUsTWVkaWFRdWVyeUxpc3RFdmVudDp0cnVlLE1lZGlhU3RyZWFtRXZlbnQ6dHJ1ZSxNZWRp
-YVN0cmVhbVRyYWNrRXZlbnQ6dHJ1ZSxNZXNzYWdlRXZlbnQ6dHJ1ZSxNSURJQ29ubmVjdGlvbkV2ZW50
-OnRydWUsTUlESU1lc3NhZ2VFdmVudDp0cnVlLE11dGF0aW9uRXZlbnQ6dHJ1ZSxOb3RpZmljYXRpb25F
-dmVudDp0cnVlLFBhZ2VUcmFuc2l0aW9uRXZlbnQ6dHJ1ZSxQYXltZW50UmVxdWVzdEV2ZW50OnRydWUs
-UGF5bWVudFJlcXVlc3RVcGRhdGVFdmVudDp0cnVlLFBvcFN0YXRlRXZlbnQ6dHJ1ZSxQcmVzZW50YXRp
-b25Db25uZWN0aW9uQXZhaWxhYmxlRXZlbnQ6dHJ1ZSxQcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VF
-dmVudDp0cnVlLFByb21pc2VSZWplY3Rpb25FdmVudDp0cnVlLFB1c2hFdmVudDp0cnVlLFJUQ0RhdGFD
-aGFubmVsRXZlbnQ6dHJ1ZSxSVENEVE1GVG9uZUNoYW5nZUV2ZW50OnRydWUsUlRDUGVlckNvbm5lY3Rp
-b25JY2VFdmVudDp0cnVlLFJUQ1RyYWNrRXZlbnQ6dHJ1ZSxTZWN1cml0eVBvbGljeVZpb2xhdGlvbkV2
-ZW50OnRydWUsU2Vuc29yRXJyb3JFdmVudDp0cnVlLFNwZWVjaFJlY29nbml0aW9uRXJyb3I6dHJ1ZSxT
-cGVlY2hSZWNvZ25pdGlvbkV2ZW50OnRydWUsU3BlZWNoU3ludGhlc2lzRXZlbnQ6dHJ1ZSxTdG9yYWdl
-RXZlbnQ6dHJ1ZSxTeW5jRXZlbnQ6dHJ1ZSxUcmFja0V2ZW50OnRydWUsVHJhbnNpdGlvbkV2ZW50OnRy
-dWUsV2ViS2l0VHJhbnNpdGlvbkV2ZW50OnRydWUsVlJEZXZpY2VFdmVudDp0cnVlLFZSRGlzcGxheUV2
-ZW50OnRydWUsVlJTZXNzaW9uRXZlbnQ6dHJ1ZSxNb2pvSW50ZXJmYWNlUmVxdWVzdEV2ZW50OnRydWUs
-VVNCQ29ubmVjdGlvbkV2ZW50OnRydWUsSURCVmVyc2lvbkNoYW5nZUV2ZW50OnRydWUsQXVkaW9Qcm9j
-ZXNzaW5nRXZlbnQ6dHJ1ZSxPZmZsaW5lQXVkaW9Db21wbGV0aW9uRXZlbnQ6dHJ1ZSxXZWJHTENvbnRl
-eHRFdmVudDp0cnVlLEV2ZW50OmZhbHNlLElucHV0RXZlbnQ6ZmFsc2UsU3VibWl0RXZlbnQ6ZmFsc2Us
-RXZlbnRUYXJnZXQ6ZmFsc2UsRmlsZTp0cnVlLEhUTUxGb3JtRWxlbWVudDp0cnVlLEhpc3Rvcnk6dHJ1
-ZSxIVE1MRG9jdW1lbnQ6dHJ1ZSxYTUxIdHRwUmVxdWVzdDp0cnVlLFhNTEh0dHBSZXF1ZXN0RXZlbnRU
-YXJnZXQ6ZmFsc2UsSW1hZ2VEYXRhOnRydWUsTG9jYXRpb246dHJ1ZSxNb3VzZUV2ZW50OnRydWUsRHJh
-Z0V2ZW50OnRydWUsUG9pbnRlckV2ZW50OnRydWUsV2hlZWxFdmVudDp0cnVlLERvY3VtZW50RnJhZ21l
-bnQ6dHJ1ZSxTaGFkb3dSb290OnRydWUsRG9jdW1lbnRUeXBlOnRydWUsTm9kZTpmYWxzZSxOb2RlTGlz
-dDp0cnVlLFJhZGlvTm9kZUxpc3Q6dHJ1ZSxIVE1MUGFyYWdyYXBoRWxlbWVudDp0cnVlLFByb2dyZXNz
-RXZlbnQ6dHJ1ZSxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6dHJ1ZSxIVE1MU2VsZWN0RWxlbWVudDp0cnVl
-LEhUTUxUYWJsZUVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVSb3dFbGVtZW50OnRydWUsSFRNTFRhYmxlU2Vj
-dGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MVGVtcGxhdGVFbGVtZW50OnRydWUsQ29tcG9zaXRpb25FdmVudDp0
-cnVlLEZvY3VzRXZlbnQ6dHJ1ZSxLZXlib2FyZEV2ZW50OnRydWUsVGV4dEV2ZW50OnRydWUsVG91Y2hF
-dmVudDp0cnVlLFVJRXZlbnQ6ZmFsc2UsV2luZG93OnRydWUsRE9NV2luZG93OnRydWUsRGVkaWNhdGVk
-V29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxTZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxTaGFyZWRX
-b3JrZXJHbG9iYWxTY29wZTp0cnVlLFdvcmtlckdsb2JhbFNjb3BlOnRydWUsQXR0cjp0cnVlLENsaWVu
-dFJlY3Q6dHJ1ZSxET01SZWN0OnRydWUsTmFtZWROb2RlTWFwOnRydWUsTW96TmFtZWRBdHRyTWFwOnRy
-dWUsSURCS2V5UmFuZ2U6dHJ1ZSxTVkdTY3JpcHRFbGVtZW50OnRydWUsU1ZHQUVsZW1lbnQ6dHJ1ZSxT
-VkdBbmltYXRlRWxlbWVudDp0cnVlLFNWR0FuaW1hdGVNb3Rpb25FbGVtZW50OnRydWUsU1ZHQW5pbWF0
-ZVRyYW5zZm9ybUVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRpb25FbGVtZW50OnRydWUsU1ZHQ2lyY2xlRWxl
-bWVudDp0cnVlLFNWR0NsaXBQYXRoRWxlbWVudDp0cnVlLFNWR0RlZnNFbGVtZW50OnRydWUsU1ZHRGVz
-Y0VsZW1lbnQ6dHJ1ZSxTVkdEaXNjYXJkRWxlbWVudDp0cnVlLFNWR0VsbGlwc2VFbGVtZW50OnRydWUs
-U1ZHRkVCbGVuZEVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbG9yTWF0cml4RWxlbWVudDp0cnVlLFNWR0ZFQ29t
-cG9uZW50VHJhbnNmZXJFbGVtZW50OnRydWUsU1ZHRkVDb21wb3NpdGVFbGVtZW50OnRydWUsU1ZHRkVD
-b252b2x2ZU1hdHJpeEVsZW1lbnQ6dHJ1ZSxTVkdGRURpZmZ1c2VMaWdodGluZ0VsZW1lbnQ6dHJ1ZSxT
-VkdGRURpc3BsYWNlbWVudE1hcEVsZW1lbnQ6dHJ1ZSxTVkdGRURpc3RhbnRMaWdodEVsZW1lbnQ6dHJ1
-ZSxTVkdGRUZsb29kRWxlbWVudDp0cnVlLFNWR0ZFRnVuY0FFbGVtZW50OnRydWUsU1ZHRkVGdW5jQkVs
-ZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNHRWxlbWVudDp0cnVlLFNWR0ZFRnVuY1JFbGVtZW50OnRydWUsU1ZH
-RkVHYXVzc2lhbkJsdXJFbGVtZW50OnRydWUsU1ZHRkVJbWFnZUVsZW1lbnQ6dHJ1ZSxTVkdGRU1lcmdl
-RWxlbWVudDp0cnVlLFNWR0ZFTWVyZ2VOb2RlRWxlbWVudDp0cnVlLFNWR0ZFTW9ycGhvbG9neUVsZW1l
-bnQ6dHJ1ZSxTVkdGRU9mZnNldEVsZW1lbnQ6dHJ1ZSxTVkdGRVBvaW50TGlnaHRFbGVtZW50OnRydWUs
-U1ZHRkVTcGVjdWxhckxpZ2h0aW5nRWxlbWVudDp0cnVlLFNWR0ZFU3BvdExpZ2h0RWxlbWVudDp0cnVl
-LFNWR0ZFVGlsZUVsZW1lbnQ6dHJ1ZSxTVkdGRVR1cmJ1bGVuY2VFbGVtZW50OnRydWUsU1ZHRmlsdGVy
-RWxlbWVudDp0cnVlLFNWR0ZvcmVpZ25PYmplY3RFbGVtZW50OnRydWUsU1ZHR0VsZW1lbnQ6dHJ1ZSxT
-VkdHZW9tZXRyeUVsZW1lbnQ6dHJ1ZSxTVkdHcmFwaGljc0VsZW1lbnQ6dHJ1ZSxTVkdJbWFnZUVsZW1l
-bnQ6dHJ1ZSxTVkdMaW5lRWxlbWVudDp0cnVlLFNWR0xpbmVhckdyYWRpZW50RWxlbWVudDp0cnVlLFNW
-R01hcmtlckVsZW1lbnQ6dHJ1ZSxTVkdNYXNrRWxlbWVudDp0cnVlLFNWR01ldGFkYXRhRWxlbWVudDp0
-cnVlLFNWR1BhdGhFbGVtZW50OnRydWUsU1ZHUGF0dGVybkVsZW1lbnQ6dHJ1ZSxTVkdQb2x5Z29uRWxl
-bWVudDp0cnVlLFNWR1BvbHlsaW5lRWxlbWVudDp0cnVlLFNWR1JhZGlhbEdyYWRpZW50RWxlbWVudDp0
-cnVlLFNWR1JlY3RFbGVtZW50OnRydWUsU1ZHU2V0RWxlbWVudDp0cnVlLFNWR1N0b3BFbGVtZW50OnRy
-dWUsU1ZHU3R5bGVFbGVtZW50OnRydWUsU1ZHU1ZHRWxlbWVudDp0cnVlLFNWR1N3aXRjaEVsZW1lbnQ6
-dHJ1ZSxTVkdTeW1ib2xFbGVtZW50OnRydWUsU1ZHVFNwYW5FbGVtZW50OnRydWUsU1ZHVGV4dENvbnRl
-bnRFbGVtZW50OnRydWUsU1ZHVGV4dEVsZW1lbnQ6dHJ1ZSxTVkdUZXh0UGF0aEVsZW1lbnQ6dHJ1ZSxT
-VkdUZXh0UG9zaXRpb25pbmdFbGVtZW50OnRydWUsU1ZHVGl0bGVFbGVtZW50OnRydWUsU1ZHVXNlRWxl
-bWVudDp0cnVlLFNWR1ZpZXdFbGVtZW50OnRydWUsU1ZHR3JhZGllbnRFbGVtZW50OnRydWUsU1ZHQ29t
-cG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdGRURyb3BTaGFkb3dFbGVtZW50OnRy
-dWUsU1ZHTVBhdGhFbGVtZW50OnRydWUsU1ZHRWxlbWVudDpmYWxzZX0pCkguTFouJG5hdGl2ZVN1cGVy
-Y2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5SRy4kbmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJyYXlC
-dWZmZXJWaWV3IgpILlZQLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXciCkguRGcu
-JG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5XQi4kbmF0aXZlU3VwZXJjbGFz
-c1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILlpHLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZl
-clZpZXciCkguUGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyJ9KSgpCmNvbnZl
-cnRBbGxUb0Zhc3RPYmplY3QodykKY29udmVydFRvRmFzdE9iamVjdCgkKTsoZnVuY3Rpb24oYSl7aWYo
-dHlwZW9mIGRvY3VtZW50PT09InVuZGVmaW5lZCIpe2EobnVsbCkKcmV0dXJufWlmKHR5cGVvZiBkb2N1
-bWVudC5jdXJyZW50U2NyaXB0IT0idW5kZWZpbmVkIil7YShkb2N1bWVudC5jdXJyZW50U2NyaXB0KQpy
-ZXR1cm59dmFyIHM9ZG9jdW1lbnQuc2NyaXB0cwpmdW5jdGlvbiBvbkxvYWQoYil7Zm9yKHZhciBxPTA7
-cTxzLmxlbmd0aDsrK3Epc1txXS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixvbkxvYWQsZmFsc2Up
-CmEoYi50YXJnZXQpfWZvcih2YXIgcj0wO3I8cy5sZW5ndGg7KytyKXNbcl0uYWRkRXZlbnRMaXN0ZW5l
-cigibG9hZCIsb25Mb2FkLGZhbHNlKX0pKGZ1bmN0aW9uKGEpe3YuY3VycmVudFNjcmlwdD1hCnZhciBz
-PUwuSXEKaWYodHlwZW9mIGRhcnRNYWluUnVubmVyPT09ImZ1bmN0aW9uIilkYXJ0TWFpblJ1bm5lcihz
-LFtdKQplbHNlIHMoW10pfSl9KSgpCi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pZ3JhdGlvbi5qcy5tYXAK
+RSI6IklqIn0sImRUIjp7ImxEIjpbIklqIl0sIlhqIjpbIklqIl0sInpNIjpbIklqIl0sIkVUIjpbXSwi
+YlEiOlsiSWoiXSwiQVMiOltdLCJjWCI6WyJJaiJdLCJTVSI6WyJJaiJdLCJsRC5FIjoiSWoifSwiUHEi
+OnsibEQiOlsiSWoiXSwiWGoiOlsiSWoiXSwiek0iOlsiSWoiXSwiRVQiOltdLCJiUSI6WyJJaiJdLCJB
+UyI6W10sImNYIjpbIklqIl0sIlNVIjpbIklqIl0sImxELkUiOiJJaiJ9LCJlRSI6eyJsRCI6WyJJaiJd
+LCJYaiI6WyJJaiJdLCJ6TSI6WyJJaiJdLCJFVCI6W10sImJRIjpbIklqIl0sIkFTIjpbXSwiY1giOlsi
+SWoiXSwiU1UiOlsiSWoiXSwibEQuRSI6IklqIn0sIlY2Ijp7ImxEIjpbIklqIl0sIm42IjpbXSwiWGoi
+OlsiSWoiXSwiek0iOlsiSWoiXSwiRVQiOltdLCJiUSI6WyJJaiJdLCJBUyI6W10sImNYIjpbIklqIl0s
+IlNVIjpbIklqIl0sImxELkUiOiJJaiJ9LCJrUyI6eyJYUyI6W119LCJpTSI6eyJFeiI6W10sIlhTIjpb
+XX0sInZzIjp7ImI4IjpbIjEiXX0sIkdWIjp7IkFuIjpbIjEiXX0sInE0Ijp7ImNYIjpbIjEiXSwiY1gu
+RSI6IjEifSwiQ3ciOnsiWFMiOltdfSwiWmYiOnsiUGYiOlsiMSJdfSwibTAiOnsiUW0iOltdfSwiSmki
+OnsibTAiOltdLCJRbSI6W119LCJiNiI6eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJj
+WCI6WyIxIl0sImxmLkUiOiIxIn0sImxtIjp7IkFuIjpbIjEiXX0sIm1XIjp7ImNYIjpbIjEiXX0sInV5
+Ijp7ImxEIjpbIjEiXSwiek0iOlsiMSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXX0sImlsIjp7IllrIjpb
+IjEiLCIyIl0sIlowIjpbIjEiLCIyIl19LCJZayI6eyJaMCI6WyIxIiwiMiJdfSwiUG4iOnsiWjAiOlsi
+MSIsIjIiXX0sIkdqIjp7IlJVIjpbIjEiLCIyIl0sIlBuIjpbIjEiLCIyIl0sIktQIjpbIjEiLCIyIl0s
+IlowIjpbIjEiLCIyIl19LCJWaiI6eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6
+WyIxIl19LCJYdiI6eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJ1
+dyI6eyJZayI6WyJxVSIsIkAiXSwiWjAiOlsicVUiLCJAIl0sIllrLksiOiJxVSIsIllrLlYiOiJAIn0s
+Imk4Ijp7ImFMIjpbInFVIl0sImJRIjpbInFVIl0sImNYIjpbInFVIl0sImFMLkUiOiJxVSIsImNYLkUi
+OiJxVSJ9LCJDViI6eyJVayI6WyJ6TTxJaj4iLCJxVSJdLCJVay5TIjoiek08SWo+In0sIlU4Ijp7IndJ
+IjpbInpNPElqPiIsInFVIl19LCJaaSI6eyJVayI6WyJxVSIsInpNPElqPiJdfSwiVWQiOnsiWFMiOltd
+fSwiSzgiOnsiWFMiOltdfSwiYnkiOnsiVWsiOlsiTWg/IiwicVUiXSwiVWsuUyI6Ik1oPyJ9LCJvaiI6
+eyJ3SSI6WyJNaD8iLCJxVSJdfSwiTXgiOnsid0kiOlsicVUiLCJNaD8iXX0sInU1Ijp7IlVrIjpbInFV
+Iiwiek08SWo+Il0sIlVrLlMiOiJxVSJ9LCJFMyI6eyJ3SSI6WyJxVSIsInpNPElqPiJdfSwiR1kiOnsi
+d0kiOlsiek08SWo+IiwicVUiXX0sIkNQIjp7IlpaIjpbXX0sIklqIjp7IlpaIjpbXX0sInpNIjp7ImJR
+IjpbIjEiXSwiY1giOlsiMSJdfSwiaWIiOnsiT2QiOltdfSwieHUiOnsiYlEiOlsiMSJdLCJjWCI6WyIx
+Il19LCJxVSI6eyJ2WCI6W119LCJDNiI6eyJYUyI6W119LCJFeiI6eyJYUyI6W119LCJGIjp7IlhTIjpb
+XX0sIkFUIjp7IlhTIjpbXX0sImJKIjp7IlhTIjpbXX0sImVZIjp7IlhTIjpbXX0sIm1wIjp7IlhTIjpb
+XX0sInViIjp7IlhTIjpbXX0sImRzIjp7IlhTIjpbXX0sImxqIjp7IlhTIjpbXX0sIlVWIjp7IlhTIjpb
+XX0sIms1Ijp7IlhTIjpbXX0sIktZIjp7IlhTIjpbXX0sInAiOnsiWFMiOltdfSwiQ0QiOnsiUnoiOltd
+fSwiYUUiOnsiUnoiOltdfSwiWmQiOnsiR3oiOltdfSwiTSI6eyJCTCI6W119LCJEbiI6eyJpRCI6W119
+LCJVZiI6eyJpRCI6W119LCJxZSI6eyJpRCI6W119LCJjdiI6eyJLViI6W10sIkQwIjpbXX0sImZKIjp7
+IkQwIjpbXX0sIkFqIjp7ImVhIjpbXX0sIktWIjp7IkQwIjpbXX0sImV3Ijp7ImVhIjpbXX0sIkpRIjp7
+ImtGIjpbXX0sInFFIjp7ImN2IjpbXSwiS1YiOltdLCJEMCI6W119LCJHaCI6eyJjdiI6W10sIktWIjpb
+XSwiRDAiOltdfSwiZlkiOnsiY3YiOltdLCJLViI6W10sIkQwIjpbXX0sInJaIjp7ImN2IjpbXSwiS1Yi
+OltdLCJEMCI6W119LCJRUCI6eyJjdiI6W10sIktWIjpbXSwiRDAiOltdfSwibngiOnsiS1YiOltdLCJE
+MCI6W119LCJRRiI6eyJLViI6W10sIkQwIjpbXX0sIklCIjp7InRuIjpbIlpaIl19LCJ3eiI6eyJsRCI6
+WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl0sImxELkUiOiIxIn0sImhIIjp7IkF6
+IjpbXX0sImg0Ijp7ImN2IjpbXSwiS1YiOltdLCJEMCI6W119LCJWYiI6eyJLViI6W10sIkQwIjpbXX0s
+IndhIjp7IkQwIjpbXX0sImU3Ijp7ImxEIjpbIktWIl0sInpNIjpbIktWIl0sImJRIjpbIktWIl0sImNY
+IjpbIktWIl0sImxELkUiOiJLViJ9LCJCSCI6eyJsRCI6WyJLViJdLCJHbSI6WyJLViJdLCJ6TSI6WyJL
+ViJdLCJYaiI6WyJLViJdLCJiUSI6WyJLViJdLCJjWCI6WyJLViJdLCJsRC5FIjoiS1YiLCJHbS5FIjoi
+S1YifSwiU04iOnsiY3YiOltdLCJLViI6W10sIkQwIjpbXX0sImxwIjp7ImN2IjpbXSwiS1YiOltdLCJE
+MCI6W119LCJUYiI6eyJjdiI6W10sIktWIjpbXSwiRDAiOltdfSwiSXYiOnsiY3YiOltdLCJLViI6W10s
+IkQwIjpbXX0sIldQIjp7ImN2IjpbXSwiS1YiOltdLCJEMCI6W119LCJ5WSI6eyJjdiI6W10sIktWIjpb
+XSwiRDAiOltdfSwidzYiOnsiZWEiOltdfSwiSzUiOnsidjYiOltdLCJEMCI6W119LCJDbSI6eyJEMCI6
+W119LCJDUSI6eyJLViI6W10sIkQwIjpbXX0sInc0Ijp7InRuIjpbIlpaIl19LCJyaCI6eyJsRCI6WyJL
+ViJdLCJHbSI6WyJLViJdLCJ6TSI6WyJLViJdLCJYaiI6WyJLViJdLCJiUSI6WyJLViJdLCJjWCI6WyJL
+ViJdLCJsRC5FIjoiS1YiLCJHbS5FIjoiS1YifSwiY2YiOnsiWWsiOlsicVUiLCJxVSJdLCJaMCI6WyJx
+VSIsInFVIl19LCJpNyI6eyJZayI6WyJxVSIsInFVIl0sIlowIjpbInFVIiwicVUiXSwiWWsuSyI6InFV
+IiwiWWsuViI6InFVIn0sIlN5Ijp7IllrIjpbInFVIiwicVUiXSwiWjAiOlsicVUiLCJxVSJdLCJZay5L
+IjoicVUiLCJZay5WIjoicVUifSwiSTQiOnsibGYiOlsicVUiXSwieHUiOlsicVUiXSwiYlEiOlsicVUi
+XSwiY1giOlsicVUiXSwibGYuRSI6InFVIn0sIlJPIjp7InFoIjpbIjEiXX0sIkNxIjp7IlJPIjpbIjEi
+XSwicWgiOlsiMSJdfSwieEMiOnsiTU8iOlsiMSJdfSwidkQiOnsia0YiOltdfSwibTYiOnsia0YiOltd
+fSwiY3QiOnsia0YiOltdfSwiT3ciOnsia0YiOltdfSwiVzkiOnsiQW4iOlsiMSJdfSwiZFciOnsidjYi
+OltdLCJEMCI6W119LCJtayI6eyJ5MCI6W119LCJLbyI6eyJvbiI6W119LCJBcyI6eyJsZiI6WyJxVSJd
+LCJ4dSI6WyJxVSJdLCJiUSI6WyJxVSJdLCJjWCI6WyJxVSJdfSwicjciOnsiRTQiOltdfSwiVHoiOnsi
+bEQiOlsiMSJdLCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiRTQiOltdLCJjWCI6WyIxIl0sImxELkUiOiIx
+In0sIm5kIjp7ImhpIjpbXSwiY3YiOltdLCJLViI6W10sIkQwIjpbXX0sIktlIjp7ImxmIjpbInFVIl0s
+Inh1IjpbInFVIl0sImJRIjpbInFVIl0sImNYIjpbInFVIl0sImxmLkUiOiJxVSJ9LCJoaSI6eyJjdiI6
+W10sIktWIjpbXSwiRDAiOltdfSwiUVciOnsiWFMiOltdLCJSeiI6W119LCJYQSI6eyJrRiI6W119LCJ2
+dCI6eyJEOCI6W119LCJjRCI6eyJEOCI6W119LCJkdiI6eyJSeiI6W119LCJPRiI6eyJmdiI6W119LCJy
+dSI6eyJmdiI6W119LCJJViI6eyJmdiI6W119LCJuNiI6eyJ6TSI6WyJJaiJdLCJiUSI6WyJJaiJdLCJj
+WCI6WyJJaiJdLCJBUyI6W119fScpKQpILkZGKHYudHlwZVVuaXZlcnNlLEpTT04ucGFyc2UoJ3sidzIi
+OjEsIlFDIjoyLCJMWiI6MSwia1QiOjIsIm1XIjoxLCJ1eSI6MSwiaWwiOjIsIlZqIjoxLCJYdiI6MSwi
+blkiOjEsIldZIjoxLCJwUiI6MSwidmciOjF9JykpCnZhciB1PXtsOiJDYW5ub3QgZXh0cmFjdCBhIGZp
+bGUgcGF0aCBmcm9tIGEgVVJJIHdpdGggYSBmcmFnbWVudCBjb21wb25lbnQiLGk6IkNhbm5vdCBleHRy
+YWN0IGEgZmlsZSBwYXRoIGZyb20gYSBVUkkgd2l0aCBhIHF1ZXJ5IGNvbXBvbmVudCIsajoiQ2Fubm90
+IGV4dHJhY3QgYSBub24tV2luZG93cyBmaWxlIHBhdGggZnJvbSBhIGZpbGUgVVJJIHdpdGggYW4gYXV0
+aG9yaXR5IixjOiJFcnJvciBoYW5kbGVyIG11c3QgYWNjZXB0IG9uZSBPYmplY3Qgb3Igb25lIE9iamVj
+dCBhbmQgYSBTdGFja1RyYWNlIGFzIGFyZ3VtZW50cywgYW5kIHJldHVybiBhIHZhbHVlIG9mIHRoZSBy
+ZXR1cm5lZCBmdXR1cmUncyB0eXBlIixkOiJhcmVhLWFuYWx5emVyLGFuYWx5emVyLW5uYmQtbWlncmF0
+aW9uLHR5cGUtYnVnIn0KdmFyIHQ9KGZ1bmN0aW9uIHJ0aWkoKXt2YXIgcz1ILk4wCnJldHVybnticTpz
+KCJHaCIpLG46cygiQ3ciKSxjUjpzKCJyWiIpLHc6cygiQXoiKSxtOnMoIlFQIiksZ0Y6cygiUEQ8R0Qs
+QD4iKSxVOnMoImJRPEA+IiksaDpzKCJjdiIpLHI6cygiWFMiKSxCOnMoImVhIiksZzg6cygiUnoiKSxj
+ODpzKCJoSCIpLFk6cygiRUgiKSxpOnMoImI4PEA+IiksSjpzKCJMTCIpLGdwOnMoIkg3IiksSTpzKCJT
+ZyIpLG86cygidlEiKSxlaDpzKCJjWDxLVj4iKSxPOnMoImNYPHFVPiIpLGE6cygiY1g8QD4iKSxmQTpz
+KCJqZDxTZT4iKSxnaTpzKCJqZDxqOD4iKSxkOnMoImpkPFowPHFVLE1oPz4+IiksZmg6cygiamQ8RDg+
+IiksdTpzKCJqZDxrRj4iKSxzOnMoImpkPHFVPiIpLGhoOnMoImpkPHlEPiIpLGFKOnMoImpkPHdiPiIp
+LGdOOnMoImpkPG42PiIpLGI6cygiamQ8QD4iKSx0OnMoImpkPElqPiIpLGQ0OnMoImpkPHFVPz4iKSxU
+OnMoIndlIiksZUg6cygidm0iKSx4OnMoImM1IiksYVU6cygiWGo8QD4iKSxhbTpzKCJUejxAPiIpLGVv
+OnMoIk41PEdELEA+IiksZHo6cygiaEYiKSxmNDpzKCJ6TTxqOD4iKSxEOnMoInpNPFowPHFVLE1oPz4+
+IiksZXc6cygiek08TWg+IiksRTpzKCJ6TTxxVT4iKSxqOnMoInpNPEA+IiksTDpzKCJ6TTxJaj4iKSxX
+OnMoInpNPE1oPz4iKSxGOnMoInU4IiksaDY6cygiWjA8cVUsTWg+IiksY2s6cygiWjA8cVUscVU+Iiks
+ZjpzKCJaMDxALEA+IiksRzpzKCJaMDxxVSxNaD8+IiksZHY6cygibEo8cVUscVU+IiksZG86cygibEo8
+cVUsQD4iKSxWOnMoIkFqIiksZEU6cygiRVQiKSxBOnMoIktWIiksZjY6cygia0YiKSxQOnMoImM4Iiks
+SzpzKCJNaCIpLHA6cygiZXciKSxxOnMoInRuPFpaPiIpLGZ2OnMoIndMIiksY3o6cygiaWIiKSxhTzpz
+KCJuZCIpLEM6cygieHU8cVU+IiksbDpzKCJHeiIpLE46cygicVUiKSxkRzpzKCJxVShxVSkiKSxnNzpz
+KCJoaSIpLGZvOnMoIkdEIiksYVc6cygieVkiKSxlSzpzKCJFeiIpLGFrOnMoIkFTIiksZ2M6cygibjYi
+KSxiSTpzKCJrZCIpLGR3OnMoIkdqPHFVLHFVPiIpLGREOnMoImlEIiksZUo6cygidTY8cVU+IiksZzQ6
+cygiSzUiKSxjaTpzKCJ2NiIpLGcyOnMoIkNtIiksYmo6cygiWmY8Zko+IiksaDk6cygiQ1EiKSxhYzpz
+KCJlNyIpLFE6cygiQ3E8QWo+IiksUjpzKCJ3ejxjdj4iKSxhbzpzKCJ2czxmSj4iKSxjOnMoInZzPEA+
+IiksZko6cygidnM8SWo+IiksY3I6cygiSlEiKSx5OnMoImEyIiksYWw6cygiYTIoTWgpIiksZ1I6cygi
+Q1AiKSx6OnMoIkAiKSxmTzpzKCJAKCkiKSx2OnMoIkAoTWgpIiksazpzKCJAKE1oLEd6KSIpLGJVOnMo
+IkAoeHU8cVU+KSIpLGRPOnMoIkAocVUpIiksYjg6cygiQChALEApIiksUzpzKCJJaiIpLGF3OnMoIjAm
+KiIpLF86cygiTWgqIiksY2g6cygiRDA/IiksYkc6cygiYjg8Yzg+PyIpLGVzOnMoIkU0PyIpLGJrOnMo
+InpNPHFVPj8iKSxiTTpzKCJ6TTxAPj8iKSxncTpzKCJ6TTxNaD8+PyIpLGNaOnMoIlowPHFVLHFVPj8i
+KSxjOTpzKCJaMDxxVSxAPj8iKSxmbjpzKCJaMDxxVSxNaD8+PyIpLFg6cygiTWg/IiksZGs6cygicVU/
+IiksZTpzKCJGZTxALEA+PyIpLGc6cygiYm4/IiksYjc6cygiYTIoTWgpPyIpLGJ3OnMoIkAoZWEpPyIp
+LGZWOnMoIk1oPyhNaD8sTWg/KT8iKSxkQTpzKCJNaD8oQCk/IiksWjpzKCJ+KCk/IiksZ3g6cygifihl
+dyk/IiksZGk6cygiWloiKSxIOnMoIn4iKSxNOnMoIn4oKSIpLGVBOnMoIn4ocVUscVUpIiksY0E6cygi
+fihxVSxAKSIpfX0pKCk7KGZ1bmN0aW9uIGNvbnN0YW50cygpe3ZhciBzPWh1bmtIZWxwZXJzLm1ha2VD
+b25zdExpc3QKQy54bj1XLkdoLnByb3RvdHlwZQpDLlJZPVcuUVAucHJvdG90eXBlCkMubUg9Vy5hZS5w
+cm90b3R5cGUKQy5CWj1XLlZiLnByb3RvdHlwZQpDLkR0PVcuZkoucHJvdG90eXBlCkMuT2s9Si5Hdi5w
+cm90b3R5cGUKQy5ObT1KLmpkLnByb3RvdHlwZQpDLmpuPUouYlUucHJvdG90eXBlCkMuQ0Q9Si5xSS5w
+cm90b3R5cGUKQy54Qj1KLkRyLnByb3RvdHlwZQpDLkRHPUouYzUucHJvdG90eXBlCkMuRXg9Vy51OC5w
+cm90b3R5cGUKQy5OQT1ILlY2LnByb3RvdHlwZQpDLnQ1PVcuQkgucHJvdG90eXBlCkMuTHQ9Vy5TTi5w
+cm90b3R5cGUKQy5aUT1KLmlDLnByb3RvdHlwZQpDLkllPVcuVGIucHJvdG90eXBlCkMudkI9Si5rZC5w
+cm90b3R5cGUKQy5vbD1XLks1LnByb3RvdHlwZQpDLnk4PW5ldyBQLlU4KCkKQy5oOT1uZXcgUC5DVigp
+CkMuR3c9bmV3IEguRnUoSC5OMCgiRnU8MCY+IikpCkMuTzQ9ZnVuY3Rpb24gZ2V0VGFnRmFsbGJhY2so
+bykgewogIHZhciBzID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pOwogIHJldHVybiBz
+LnN1YnN0cmluZyg4LCBzLmxlbmd0aCAtIDEpOwp9CkMuWXE9ZnVuY3Rpb24oKSB7CiAgdmFyIHRvU3Ry
+aW5nRnVuY3Rpb24gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwogIGZ1bmN0aW9uIGdldFRhZyhv
+KSB7CiAgICB2YXIgcyA9IHRvU3RyaW5nRnVuY3Rpb24uY2FsbChvKTsKICAgIHJldHVybiBzLnN1YnN0
+cmluZyg4LCBzLmxlbmd0aCAtIDEpOwogIH0KICBmdW5jdGlvbiBnZXRVbmtub3duVGFnKG9iamVjdCwg
+dGFnKSB7CiAgICBpZiAoL15IVE1MW0EtWl0uKkVsZW1lbnQkLy50ZXN0KHRhZykpIHsKICAgICAgdmFy
+IG5hbWUgPSB0b1N0cmluZ0Z1bmN0aW9uLmNhbGwob2JqZWN0KTsKICAgICAgaWYgKG5hbWUgPT0gIltv
+YmplY3QgT2JqZWN0XSIpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gIkhUTUxFbGVtZW50IjsKICAg
+IH0KICB9CiAgZnVuY3Rpb24gZ2V0VW5rbm93blRhZ0dlbmVyaWNCcm93c2VyKG9iamVjdCwgdGFnKSB7
+CiAgICBpZiAoc2VsZi5IVE1MRWxlbWVudCAmJiBvYmplY3QgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkg
+cmV0dXJuICJIVE1MRWxlbWVudCI7CiAgICByZXR1cm4gZ2V0VW5rbm93blRhZyhvYmplY3QsIHRhZyk7
+CiAgfQogIGZ1bmN0aW9uIHByb3RvdHlwZUZvclRhZyh0YWcpIHsKICAgIGlmICh0eXBlb2Ygd2luZG93
+ID09ICJ1bmRlZmluZWQiKSByZXR1cm4gbnVsbDsKICAgIGlmICh0eXBlb2Ygd2luZG93W3RhZ10gPT0g
+InVuZGVmaW5lZCIpIHJldHVybiBudWxsOwogICAgdmFyIGNvbnN0cnVjdG9yID0gd2luZG93W3RhZ107
+CiAgICBpZiAodHlwZW9mIGNvbnN0cnVjdG9yICE9ICJmdW5jdGlvbiIpIHJldHVybiBudWxsOwogICAg
+cmV0dXJuIGNvbnN0cnVjdG9yLnByb3RvdHlwZTsKICB9CiAgZnVuY3Rpb24gZGlzY3JpbWluYXRvcih0
+YWcpIHsgcmV0dXJuIG51bGw7IH0KICB2YXIgaXNCcm93c2VyID0gdHlwZW9mIG5hdmlnYXRvciA9PSAi
+b2JqZWN0IjsKICByZXR1cm4gewogICAgZ2V0VGFnOiBnZXRUYWcsCiAgICBnZXRVbmtub3duVGFnOiBp
+c0Jyb3dzZXIgPyBnZXRVbmtub3duVGFnR2VuZXJpY0Jyb3dzZXIgOiBnZXRVbmtub3duVGFnLAogICAg
+cHJvdG90eXBlRm9yVGFnOiBwcm90b3R5cGVGb3JUYWcsCiAgICBkaXNjcmltaW5hdG9yOiBkaXNjcmlt
+aW5hdG9yIH07Cn0KQy53Yj1mdW5jdGlvbihnZXRUYWdGYWxsYmFjaykgewogIHJldHVybiBmdW5jdGlv
+bihob29rcykgewogICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT0gIm9iamVjdCIpIHJldHVybiBob29r
+czsKICAgIHZhciB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICBpZiAodWEuaW5kZXhPZigiRHVt
+cFJlbmRlclRyZWUiKSA+PSAwKSByZXR1cm4gaG9va3M7CiAgICBpZiAodWEuaW5kZXhPZigiQ2hyb21l
+IikgPj0gMCkgewogICAgICBmdW5jdGlvbiBjb25maXJtKHApIHsKICAgICAgICByZXR1cm4gdHlwZW9m
+IHdpbmRvdyA9PSAib2JqZWN0IiAmJiB3aW5kb3dbcF0gJiYgd2luZG93W3BdLm5hbWUgPT0gcDsKICAg
+ICAgfQogICAgICBpZiAoY29uZmlybSgiV2luZG93IikgJiYgY29uZmlybSgiSFRNTEVsZW1lbnQiKSkg
+cmV0dXJuIGhvb2tzOwogICAgfQogICAgaG9va3MuZ2V0VGFnID0gZ2V0VGFnRmFsbGJhY2s7CiAgfTsK
+fQpDLktVPWZ1bmN0aW9uKGhvb2tzKSB7CiAgaWYgKHR5cGVvZiBkYXJ0RXhwZXJpbWVudGFsRml4dXBH
+ZXRUYWcgIT0gImZ1bmN0aW9uIikgcmV0dXJuIGhvb2tzOwogIGhvb2tzLmdldFRhZyA9IGRhcnRFeHBl
+cmltZW50YWxGaXh1cEdldFRhZyhob29rcy5nZXRUYWcpOwp9CkMuZlE9ZnVuY3Rpb24oaG9va3MpIHsK
+ICB2YXIgZ2V0VGFnID0gaG9va3MuZ2V0VGFnOwogIHZhciBwcm90b3R5cGVGb3JUYWcgPSBob29rcy5w
+cm90b3R5cGVGb3JUYWc7CiAgZnVuY3Rpb24gZ2V0VGFnRml4ZWQobykgewogICAgdmFyIHRhZyA9IGdl
+dFRhZyhvKTsKICAgIGlmICh0YWcgPT0gIkRvY3VtZW50IikgewogICAgICBpZiAoISFvLnhtbFZlcnNp
+b24pIHJldHVybiAiIURvY3VtZW50IjsKICAgICAgcmV0dXJuICIhSFRNTERvY3VtZW50IjsKICAgIH0K
+ICAgIHJldHVybiB0YWc7CiAgfQogIGZ1bmN0aW9uIHByb3RvdHlwZUZvclRhZ0ZpeGVkKHRhZykgewog
+ICAgaWYgKHRhZyA9PSAiRG9jdW1lbnQiKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBwcm90b3R5cGVG
+b3JUYWcodGFnKTsKICB9CiAgaG9va3MuZ2V0VGFnID0gZ2V0VGFnRml4ZWQ7CiAgaG9va3MucHJvdG90
+eXBlRm9yVGFnID0gcHJvdG90eXBlRm9yVGFnRml4ZWQ7Cn0KQy5kaz1mdW5jdGlvbihob29rcykgewog
+IHZhciB1c2VyQWdlbnQgPSB0eXBlb2YgbmF2aWdhdG9yID09ICJvYmplY3QiID8gbmF2aWdhdG9yLnVz
+ZXJBZ2VudCA6ICIiOwogIGlmICh1c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpID09IC0xKSByZXR1
+cm4gaG9va3M7CiAgdmFyIGdldFRhZyA9IGhvb2tzLmdldFRhZzsKICB2YXIgcXVpY2tNYXAgPSB7CiAg
+ICAiQmVmb3JlVW5sb2FkRXZlbnQiOiAiRXZlbnQiLAogICAgIkRhdGFUcmFuc2ZlciI6ICJDbGlwYm9h
+cmQiLAogICAgIkdlb0dlb2xvY2F0aW9uIjogIkdlb2xvY2F0aW9uIiwKICAgICJMb2NhdGlvbiI6ICIh
+TG9jYXRpb24iLAogICAgIldvcmtlck1lc3NhZ2VFdmVudCI6ICJNZXNzYWdlRXZlbnQiLAogICAgIlhN
+TERvY3VtZW50IjogIiFEb2N1bWVudCJ9OwogIGZ1bmN0aW9uIGdldFRhZ0ZpcmVmb3gobykgewogICAg
+dmFyIHRhZyA9IGdldFRhZyhvKTsKICAgIHJldHVybiBxdWlja01hcFt0YWddIHx8IHRhZzsKICB9CiAg
+aG9va3MuZ2V0VGFnID0gZ2V0VGFnRmlyZWZveDsKfQpDLnhpPWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFy
+IHVzZXJBZ2VudCA9IHR5cGVvZiBuYXZpZ2F0b3IgPT0gIm9iamVjdCIgPyBuYXZpZ2F0b3IudXNlckFn
+ZW50IDogIiI7CiAgaWYgKHVzZXJBZ2VudC5pbmRleE9mKCJUcmlkZW50LyIpID09IC0xKSByZXR1cm4g
+aG9va3M7CiAgdmFyIGdldFRhZyA9IGhvb2tzLmdldFRhZzsKICB2YXIgcXVpY2tNYXAgPSB7CiAgICAi
+QmVmb3JlVW5sb2FkRXZlbnQiOiAiRXZlbnQiLAogICAgIkRhdGFUcmFuc2ZlciI6ICJDbGlwYm9hcmQi
+LAogICAgIkhUTUxEREVsZW1lbnQiOiAiSFRNTEVsZW1lbnQiLAogICAgIkhUTUxEVEVsZW1lbnQiOiAi
+SFRNTEVsZW1lbnQiLAogICAgIkhUTUxQaHJhc2VFbGVtZW50IjogIkhUTUxFbGVtZW50IiwKICAgICJQ
+b3NpdGlvbiI6ICJHZW9wb3NpdGlvbiIKICB9OwogIGZ1bmN0aW9uIGdldFRhZ0lFKG8pIHsKICAgIHZh
+ciB0YWcgPSBnZXRUYWcobyk7CiAgICB2YXIgbmV3VGFnID0gcXVpY2tNYXBbdGFnXTsKICAgIGlmIChu
+ZXdUYWcpIHJldHVybiBuZXdUYWc7CiAgICBpZiAodGFnID09ICJPYmplY3QiKSB7CiAgICAgIGlmICh3
+aW5kb3cuRGF0YVZpZXcgJiYgKG8gaW5zdGFuY2VvZiB3aW5kb3cuRGF0YVZpZXcpKSByZXR1cm4gIkRh
+dGFWaWV3IjsKICAgIH0KICAgIHJldHVybiB0YWc7CiAgfQogIGZ1bmN0aW9uIHByb3RvdHlwZUZvclRh
+Z0lFKHRhZykgewogICAgdmFyIGNvbnN0cnVjdG9yID0gd2luZG93W3RhZ107CiAgICBpZiAoY29uc3Ry
+dWN0b3IgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gY29uc3RydWN0b3IucHJvdG90eXBl
+OwogIH0KICBob29rcy5nZXRUYWcgPSBnZXRUYWdJRTsKICBob29rcy5wcm90b3R5cGVGb3JUYWcgPSBw
+cm90b3R5cGVGb3JUYWdJRTsKfQpDLmk3PWZ1bmN0aW9uKGhvb2tzKSB7IHJldHVybiBob29rczsgfQoK
+Qy5DdD1uZXcgUC5ieSgpCkMuRXE9bmV3IFAuazUoKQpDLnhNPW5ldyBQLnU1KCkKQy5Raz1uZXcgUC5F
+MygpCkMuTnY9bmV3IEgua3IoKQpDLk5VPW5ldyBQLkppKCkKQy5wZD1uZXcgUC5aZCgpCkMuQWQ9bmV3
+IFIuSDcoMCwiSGludEFjdGlvbktpbmQuYWRkTnVsbGFibGVIaW50IikKQy5uZT1uZXcgUi5INygxLCJI
+aW50QWN0aW9uS2luZC5hZGROb25OdWxsYWJsZUhpbnQiKQpDLm15PW5ldyBSLkg3KDIsIkhpbnRBY3Rp
+b25LaW5kLmNoYW5nZVRvTnVsbGFibGVIaW50IikKQy5yeD1uZXcgUi5INygzLCJIaW50QWN0aW9uS2lu
+ZC5jaGFuZ2VUb05vbk51bGxhYmxlSGludCIpCkMud1Y9bmV3IFIuSDcoNCwiSGludEFjdGlvbktpbmQu
+cmVtb3ZlTnVsbGFibGVIaW50IikKQy5mUj1uZXcgUi5INyg1LCJIaW50QWN0aW9uS2luZC5yZW1vdmVO
+b25OdWxsYWJsZUhpbnQiKQpDLkEzPW5ldyBQLk14KG51bGwpCkMublg9bmV3IFAub2oobnVsbCkKQy5j
+dz1uZXcgTC5HYigwLCJVbml0TWlncmF0aW9uU3RhdHVzLmFscmVhZHlNaWdyYXRlZCIpCkMuZGM9bmV3
+IEwuR2IoMSwiVW5pdE1pZ3JhdGlvblN0YXR1cy5pbmRldGVybWluYXRlIikKQy5XRD1uZXcgTC5HYigy
+LCJVbml0TWlncmF0aW9uU3RhdHVzLm1pZ3JhdGluZyIpCkMuWGo9bmV3IEwuR2IoMywiVW5pdE1pZ3Jh
+dGlvblN0YXR1cy5vcHRpbmdPdXQiKQpDLmwwPUguUUkocyhbQy5jdyxDLmRjLEMuV0QsQy5Yal0pLEgu
+TjAoImpkPEdiPiIpKQpDLmFrPUguUUkocyhbMCwwLDMyNzc2LDMzNzkyLDEsMTAyNDAsMCwwXSksdC50
+KQpDLmNtPUguUUkocyhbIio6OmNsYXNzIiwiKjo6ZGlyIiwiKjo6ZHJhZ2dhYmxlIiwiKjo6aGlkZGVu
+IiwiKjo6aWQiLCIqOjppbmVydCIsIio6Oml0ZW1wcm9wIiwiKjo6aXRlbXJlZiIsIio6Oml0ZW1zY29w
+ZSIsIio6OmxhbmciLCIqOjpzcGVsbGNoZWNrIiwiKjo6dGl0bGUiLCIqOjp0cmFuc2xhdGUiLCJBOjph
+Y2Nlc3NrZXkiLCJBOjpjb29yZHMiLCJBOjpocmVmbGFuZyIsIkE6Om5hbWUiLCJBOjpzaGFwZSIsIkE6
+OnRhYmluZGV4IiwiQTo6dGFyZ2V0IiwiQTo6dHlwZSIsIkFSRUE6OmFjY2Vzc2tleSIsIkFSRUE6OmFs
+dCIsIkFSRUE6OmNvb3JkcyIsIkFSRUE6Om5vaHJlZiIsIkFSRUE6OnNoYXBlIiwiQVJFQTo6dGFiaW5k
+ZXgiLCJBUkVBOjp0YXJnZXQiLCJBVURJTzo6Y29udHJvbHMiLCJBVURJTzo6bG9vcCIsIkFVRElPOjpt
+ZWRpYWdyb3VwIiwiQVVESU86Om11dGVkIiwiQVVESU86OnByZWxvYWQiLCJCRE86OmRpciIsIkJPRFk6
+OmFsaW5rIiwiQk9EWTo6Ymdjb2xvciIsIkJPRFk6OmxpbmsiLCJCT0RZOjp0ZXh0IiwiQk9EWTo6dmxp
+bmsiLCJCUjo6Y2xlYXIiLCJCVVRUT046OmFjY2Vzc2tleSIsIkJVVFRPTjo6ZGlzYWJsZWQiLCJCVVRU
+T046Om5hbWUiLCJCVVRUT046OnRhYmluZGV4IiwiQlVUVE9OOjp0eXBlIiwiQlVUVE9OOjp2YWx1ZSIs
+IkNBTlZBUzo6aGVpZ2h0IiwiQ0FOVkFTOjp3aWR0aCIsIkNBUFRJT046OmFsaWduIiwiQ09MOjphbGln
+biIsIkNPTDo6Y2hhciIsIkNPTDo6Y2hhcm9mZiIsIkNPTDo6c3BhbiIsIkNPTDo6dmFsaWduIiwiQ09M
+Ojp3aWR0aCIsIkNPTEdST1VQOjphbGlnbiIsIkNPTEdST1VQOjpjaGFyIiwiQ09MR1JPVVA6OmNoYXJv
+ZmYiLCJDT0xHUk9VUDo6c3BhbiIsIkNPTEdST1VQOjp2YWxpZ24iLCJDT0xHUk9VUDo6d2lkdGgiLCJD
+T01NQU5EOjpjaGVja2VkIiwiQ09NTUFORDo6Y29tbWFuZCIsIkNPTU1BTkQ6OmRpc2FibGVkIiwiQ09N
+TUFORDo6bGFiZWwiLCJDT01NQU5EOjpyYWRpb2dyb3VwIiwiQ09NTUFORDo6dHlwZSIsIkRBVEE6OnZh
+bHVlIiwiREVMOjpkYXRldGltZSIsIkRFVEFJTFM6Om9wZW4iLCJESVI6OmNvbXBhY3QiLCJESVY6OmFs
+aWduIiwiREw6OmNvbXBhY3QiLCJGSUVMRFNFVDo6ZGlzYWJsZWQiLCJGT05UOjpjb2xvciIsIkZPTlQ6
+OmZhY2UiLCJGT05UOjpzaXplIiwiRk9STTo6YWNjZXB0IiwiRk9STTo6YXV0b2NvbXBsZXRlIiwiRk9S
+TTo6ZW5jdHlwZSIsIkZPUk06Om1ldGhvZCIsIkZPUk06Om5hbWUiLCJGT1JNOjpub3ZhbGlkYXRlIiwi
+Rk9STTo6dGFyZ2V0IiwiRlJBTUU6Om5hbWUiLCJIMTo6YWxpZ24iLCJIMjo6YWxpZ24iLCJIMzo6YWxp
+Z24iLCJINDo6YWxpZ24iLCJINTo6YWxpZ24iLCJINjo6YWxpZ24iLCJIUjo6YWxpZ24iLCJIUjo6bm9z
+aGFkZSIsIkhSOjpzaXplIiwiSFI6OndpZHRoIiwiSFRNTDo6dmVyc2lvbiIsIklGUkFNRTo6YWxpZ24i
+LCJJRlJBTUU6OmZyYW1lYm9yZGVyIiwiSUZSQU1FOjpoZWlnaHQiLCJJRlJBTUU6Om1hcmdpbmhlaWdo
+dCIsIklGUkFNRTo6bWFyZ2lud2lkdGgiLCJJRlJBTUU6OndpZHRoIiwiSU1HOjphbGlnbiIsIklNRzo6
+YWx0IiwiSU1HOjpib3JkZXIiLCJJTUc6OmhlaWdodCIsIklNRzo6aHNwYWNlIiwiSU1HOjppc21hcCIs
+IklNRzo6bmFtZSIsIklNRzo6dXNlbWFwIiwiSU1HOjp2c3BhY2UiLCJJTUc6OndpZHRoIiwiSU5QVVQ6
+OmFjY2VwdCIsIklOUFVUOjphY2Nlc3NrZXkiLCJJTlBVVDo6YWxpZ24iLCJJTlBVVDo6YWx0IiwiSU5Q
+VVQ6OmF1dG9jb21wbGV0ZSIsIklOUFVUOjphdXRvZm9jdXMiLCJJTlBVVDo6Y2hlY2tlZCIsIklOUFVU
+OjpkaXNhYmxlZCIsIklOUFVUOjppbnB1dG1vZGUiLCJJTlBVVDo6aXNtYXAiLCJJTlBVVDo6bGlzdCIs
+IklOUFVUOjptYXgiLCJJTlBVVDo6bWF4bGVuZ3RoIiwiSU5QVVQ6Om1pbiIsIklOUFVUOjptdWx0aXBs
+ZSIsIklOUFVUOjpuYW1lIiwiSU5QVVQ6OnBsYWNlaG9sZGVyIiwiSU5QVVQ6OnJlYWRvbmx5IiwiSU5Q
+VVQ6OnJlcXVpcmVkIiwiSU5QVVQ6OnNpemUiLCJJTlBVVDo6c3RlcCIsIklOUFVUOjp0YWJpbmRleCIs
+IklOUFVUOjp0eXBlIiwiSU5QVVQ6OnVzZW1hcCIsIklOUFVUOjp2YWx1ZSIsIklOUzo6ZGF0ZXRpbWUi
+LCJLRVlHRU46OmRpc2FibGVkIiwiS0VZR0VOOjprZXl0eXBlIiwiS0VZR0VOOjpuYW1lIiwiTEFCRUw6
+OmFjY2Vzc2tleSIsIkxBQkVMOjpmb3IiLCJMRUdFTkQ6OmFjY2Vzc2tleSIsIkxFR0VORDo6YWxpZ24i
+LCJMSTo6dHlwZSIsIkxJOjp2YWx1ZSIsIkxJTks6OnNpemVzIiwiTUFQOjpuYW1lIiwiTUVOVTo6Y29t
+cGFjdCIsIk1FTlU6OmxhYmVsIiwiTUVOVTo6dHlwZSIsIk1FVEVSOjpoaWdoIiwiTUVURVI6OmxvdyIs
+Ik1FVEVSOjptYXgiLCJNRVRFUjo6bWluIiwiTUVURVI6OnZhbHVlIiwiT0JKRUNUOjp0eXBlbXVzdG1h
+dGNoIiwiT0w6OmNvbXBhY3QiLCJPTDo6cmV2ZXJzZWQiLCJPTDo6c3RhcnQiLCJPTDo6dHlwZSIsIk9Q
+VEdST1VQOjpkaXNhYmxlZCIsIk9QVEdST1VQOjpsYWJlbCIsIk9QVElPTjo6ZGlzYWJsZWQiLCJPUFRJ
+T046OmxhYmVsIiwiT1BUSU9OOjpzZWxlY3RlZCIsIk9QVElPTjo6dmFsdWUiLCJPVVRQVVQ6OmZvciIs
+Ik9VVFBVVDo6bmFtZSIsIlA6OmFsaWduIiwiUFJFOjp3aWR0aCIsIlBST0dSRVNTOjptYXgiLCJQUk9H
+UkVTUzo6bWluIiwiUFJPR1JFU1M6OnZhbHVlIiwiU0VMRUNUOjphdXRvY29tcGxldGUiLCJTRUxFQ1Q6
+OmRpc2FibGVkIiwiU0VMRUNUOjptdWx0aXBsZSIsIlNFTEVDVDo6bmFtZSIsIlNFTEVDVDo6cmVxdWly
+ZWQiLCJTRUxFQ1Q6OnNpemUiLCJTRUxFQ1Q6OnRhYmluZGV4IiwiU09VUkNFOjp0eXBlIiwiVEFCTEU6
+OmFsaWduIiwiVEFCTEU6OmJnY29sb3IiLCJUQUJMRTo6Ym9yZGVyIiwiVEFCTEU6OmNlbGxwYWRkaW5n
+IiwiVEFCTEU6OmNlbGxzcGFjaW5nIiwiVEFCTEU6OmZyYW1lIiwiVEFCTEU6OnJ1bGVzIiwiVEFCTEU6
+OnN1bW1hcnkiLCJUQUJMRTo6d2lkdGgiLCJUQk9EWTo6YWxpZ24iLCJUQk9EWTo6Y2hhciIsIlRCT0RZ
+OjpjaGFyb2ZmIiwiVEJPRFk6OnZhbGlnbiIsIlREOjphYmJyIiwiVEQ6OmFsaWduIiwiVEQ6OmF4aXMi
+LCJURDo6Ymdjb2xvciIsIlREOjpjaGFyIiwiVEQ6OmNoYXJvZmYiLCJURDo6Y29sc3BhbiIsIlREOjpo
+ZWFkZXJzIiwiVEQ6OmhlaWdodCIsIlREOjpub3dyYXAiLCJURDo6cm93c3BhbiIsIlREOjpzY29wZSIs
+IlREOjp2YWxpZ24iLCJURDo6d2lkdGgiLCJURVhUQVJFQTo6YWNjZXNza2V5IiwiVEVYVEFSRUE6OmF1
+dG9jb21wbGV0ZSIsIlRFWFRBUkVBOjpjb2xzIiwiVEVYVEFSRUE6OmRpc2FibGVkIiwiVEVYVEFSRUE6
+OmlucHV0bW9kZSIsIlRFWFRBUkVBOjpuYW1lIiwiVEVYVEFSRUE6OnBsYWNlaG9sZGVyIiwiVEVYVEFS
+RUE6OnJlYWRvbmx5IiwiVEVYVEFSRUE6OnJlcXVpcmVkIiwiVEVYVEFSRUE6OnJvd3MiLCJURVhUQVJF
+QTo6dGFiaW5kZXgiLCJURVhUQVJFQTo6d3JhcCIsIlRGT09UOjphbGlnbiIsIlRGT09UOjpjaGFyIiwi
+VEZPT1Q6OmNoYXJvZmYiLCJURk9PVDo6dmFsaWduIiwiVEg6OmFiYnIiLCJUSDo6YWxpZ24iLCJUSDo6
+YXhpcyIsIlRIOjpiZ2NvbG9yIiwiVEg6OmNoYXIiLCJUSDo6Y2hhcm9mZiIsIlRIOjpjb2xzcGFuIiwi
+VEg6OmhlYWRlcnMiLCJUSDo6aGVpZ2h0IiwiVEg6Om5vd3JhcCIsIlRIOjpyb3dzcGFuIiwiVEg6OnNj
+b3BlIiwiVEg6OnZhbGlnbiIsIlRIOjp3aWR0aCIsIlRIRUFEOjphbGlnbiIsIlRIRUFEOjpjaGFyIiwi
+VEhFQUQ6OmNoYXJvZmYiLCJUSEVBRDo6dmFsaWduIiwiVFI6OmFsaWduIiwiVFI6OmJnY29sb3IiLCJU
+Ujo6Y2hhciIsIlRSOjpjaGFyb2ZmIiwiVFI6OnZhbGlnbiIsIlRSQUNLOjpkZWZhdWx0IiwiVFJBQ0s6
+OmtpbmQiLCJUUkFDSzo6bGFiZWwiLCJUUkFDSzo6c3JjbGFuZyIsIlVMOjpjb21wYWN0IiwiVUw6OnR5
+cGUiLCJWSURFTzo6Y29udHJvbHMiLCJWSURFTzo6aGVpZ2h0IiwiVklERU86Omxvb3AiLCJWSURFTzo6
+bWVkaWFncm91cCIsIlZJREVPOjptdXRlZCIsIlZJREVPOjpwcmVsb2FkIiwiVklERU86OndpZHRoIl0p
+LHQucykKQy5WQz1ILlFJKHMoWzAsMCw2NTQ5MCw0NTA1NSw2NTUzNSwzNDgxNSw2NTUzNCwxODQzMV0p
+LHQudCkKQy5tSz1ILlFJKHMoWzAsMCwyNjYyNCwxMDIzLDY1NTM0LDIwNDcsNjU1MzQsMjA0N10pLHQu
+dCkKQy5TcT1ILlFJKHMoWyJIRUFEIiwiQVJFQSIsIkJBU0UiLCJCQVNFRk9OVCIsIkJSIiwiQ09MIiwi
+Q09MR1JPVVAiLCJFTUJFRCIsIkZSQU1FIiwiRlJBTUVTRVQiLCJIUiIsIklNQUdFIiwiSU1HIiwiSU5Q
+VVQiLCJJU0lOREVYIiwiTElOSyIsIk1FVEEiLCJQQVJBTSIsIlNPVVJDRSIsIlNUWUxFIiwiVElUTEUi
+LCJXQlIiXSksdC5zKQpDLmRuPUguUUkocyhbXSksSC5OMCgiamQ8TEw+IikpCkMueEQ9SC5RSShzKFtd
+KSx0LnMpCkMuaFU9SC5RSShzKFtdKSx0LmIpCkMudG89SC5RSShzKFswLDAsMzI3MjIsMTIyODcsNjU1
+MzQsMzQ4MTUsNjU1MzQsMTg0MzFdKSx0LnQpCkMucms9SC5RSShzKFtDLkFkLEMubmUsQy5teSxDLnJ4
+LEMud1YsQy5mUl0pLEguTjAoImpkPEg3PiIpKQpDLkYzPUguUUkocyhbMCwwLDI0NTc2LDEwMjMsNjU1
+MzQsMzQ4MTUsNjU1MzQsMTg0MzFdKSx0LnQpCkMuZWE9SC5RSShzKFswLDAsMzI3NTQsMTEyNjMsNjU1
+MzQsMzQ4MTUsNjU1MzQsMTg0MzFdKSx0LnQpCkMuWko9SC5RSShzKFswLDAsMzI3MjIsMTIyODcsNjU1
+MzUsMzQ4MTUsNjU1MzQsMTg0MzFdKSx0LnQpCkMuV2Q9SC5RSShzKFswLDAsNjU0OTAsMTIyODcsNjU1
+MzUsMzQ4MTUsNjU1MzQsMTg0MzFdKSx0LnQpCkMuUXg9SC5RSShzKFsiYmluZCIsImlmIiwicmVmIiwi
+cmVwZWF0Iiwic3ludGF4Il0pLHQucykKQy5CST1ILlFJKHMoWyJBOjpocmVmIiwiQVJFQTo6aHJlZiIs
+IkJMT0NLUVVPVEU6OmNpdGUiLCJCT0RZOjpiYWNrZ3JvdW5kIiwiQ09NTUFORDo6aWNvbiIsIkRFTDo6
+Y2l0ZSIsIkZPUk06OmFjdGlvbiIsIklNRzo6c3JjIiwiSU5QVVQ6OnNyYyIsIklOUzo6Y2l0ZSIsIlE6
+OmNpdGUiLCJWSURFTzo6cG9zdGVyIl0pLHQucykKQy5EeD1uZXcgSC5MUCgwLHt9LEMueEQsSC5OMCgi
+TFA8cVUsek08ajg+PiIpKQpDLkNNPW5ldyBILkxQKDAse30sQy54RCxILk4wKCJMUDxxVSxxVT4iKSkK
+Qy5pSD1ILlFJKHMoW10pLEguTjAoImpkPEdEPiIpKQpDLldPPW5ldyBILkxQKDAse30sQy5pSCxILk4w
+KCJMUDxHRCxAPiIpKQpDLlkyPW5ldyBMLk85KCJOYXZpZ2F0aW9uVHJlZU5vZGVUeXBlLmRpcmVjdG9y
+eSIpCkMucmY9bmV3IEwuTzkoIk5hdmlnYXRpb25UcmVlTm9kZVR5cGUuZmlsZSIpCkMuVGU9bmV3IEgu
+d3YoImNhbGwiKQpDLm9FPW5ldyBQLkdZKCExKQpDLndRPW5ldyBQLkZ5KG51bGwsMil9KSgpOyhmdW5j
+dGlvbiBzdGF0aWNGaWVsZHMoKXskLnptPW51bGwKJC55aj0wCiQuaTA9bnVsbAokLkFsPW51bGwKJC5O
+Rj1udWxsCiQuVFg9bnVsbAokLng3PW51bGwKJC5udz1udWxsCiQudnY9bnVsbAokLkJ2PW51bGwKJC5T
+Nj1udWxsCiQuazg9bnVsbAokLm1nPW51bGwKJC5VRD0hMQokLlgzPUMuTlUKJC54Zz1ILlFJKFtdLEgu
+TjAoImpkPE1oPiIpKQokLnhvPW51bGwKJC5CTz1udWxsCiQubHQ9bnVsbAokLkVVPW51bGwKJC5vcj1Q
+LkZsKHQuTix0LlkpCiQuSVI9bnVsbAokLkk2PW51bGwKJC5GZj1udWxsfSkoKTsoZnVuY3Rpb24gbGF6
+eUluaXRpYWxpemVycygpe3ZhciBzPWh1bmtIZWxwZXJzLmxhenlGaW5hbCxyPWh1bmtIZWxwZXJzLmxh
+enkKcygkLCJmYSIsInoiLGZ1bmN0aW9uKCl7cmV0dXJuIEguWWcoIl8kZGFydF9kYXJ0Q2xvc3VyZSIp
+fSkKcygkLCJLcSIsIlNuIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcoewp0b1N0cmluZzpmdW5j
+dGlvbigpe3JldHVybiIkcmVjZWl2ZXIkIn19KSl9KQpzKCQsInhxIiwibHEiLGZ1bmN0aW9uKCl7cmV0
+dXJuIEguY00oSC5TNyh7JG1ldGhvZCQ6bnVsbCwKdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iJHJl
+Y2VpdmVyJCJ9fSkpfSkKcygkLCJSMSIsIk45IixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcobnVs
+bCkpfSkKcygkLCJmTiIsImlJIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dmFyICRh
+cmd1bWVudHNFeHByJD0iJGFyZ3VtZW50cyQiCnRyeXtudWxsLiRtZXRob2QkKCRhcmd1bWVudHNFeHBy
+JCl9Y2F0Y2gocSl7cmV0dXJuIHEubWVzc2FnZX19KCkpfSkKcygkLCJxaSIsIlVOIixmdW5jdGlvbigp
+e3JldHVybiBILmNNKEguUzcodm9pZCAwKSl9KQpzKCQsInB2IiwiWmgiLGZ1bmN0aW9uKCl7cmV0dXJu
+IEguY00oZnVuY3Rpb24oKXt2YXIgJGFyZ3VtZW50c0V4cHIkPSIkYXJndW1lbnRzJCIKdHJ5eyh2b2lk
+IDApLiRtZXRob2QkKCRhcmd1bWVudHNFeHByJCl9Y2F0Y2gocSl7cmV0dXJuIHEubWVzc2FnZX19KCkp
+fSkKcygkLCJrcSIsInJOIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguTWoobnVsbCkpfSkKcygkLCJ0
+dCIsImMzIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dHJ5e251bGwuJG1ldGhvZCR9
+Y2F0Y2gocSl7cmV0dXJuIHEubWVzc2FnZX19KCkpfSkKcygkLCJkdCIsIkhLIixmdW5jdGlvbigpe3Jl
+dHVybiBILmNNKEguTWoodm9pZCAwKSl9KQpzKCQsIkE3IiwicjEiLGZ1bmN0aW9uKCl7cmV0dXJuIEgu
+Y00oZnVuY3Rpb24oKXt0cnl7KHZvaWQgMCkuJG1ldGhvZCR9Y2F0Y2gocSl7cmV0dXJuIHEubWVzc2Fn
+ZX19KCkpfSkKcygkLCJXYyIsInV0IixmdW5jdGlvbigpe3JldHVybiBQLk9qKCl9KQpzKCQsImtoIiwi
+cmYiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQLnhyKCkuJDAoKX0pCnMoJCwiZEgiLCJIRyIsZnVuY3Rp
+b24oKXtyZXR1cm4gbmV3IFAuTnooKS4kMCgpfSkKcygkLCJoaiIsIlY3IixmdW5jdGlvbigpe3JldHVy
+biBuZXcgSW50OEFycmF5KEguWEYoSC5RSShbLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIs
+LTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIs
+LTIsLTIsLTIsLTIsLTIsLTIsLTEsLTIsLTIsLTIsLTIsLTIsNjIsLTIsNjIsLTIsNjMsNTIsNTMsNTQs
+NTUsNTYsNTcsNTgsNTksNjAsNjEsLTIsLTIsLTIsLTEsLTIsLTIsLTIsMCwxLDIsMyw0LDUsNiw3LDgs
+OSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwtMiwtMiwtMiwt
+Miw2MywtMiwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0
+Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSwtMiwtMiwtMiwtMiwtMl0sdC50KSkpfSkKcygkLCJZZSIs
+IndRIixmdW5jdGlvbigpe3JldHVybiB0eXBlb2YgcHJvY2VzcyE9InVuZGVmaW5lZCImJk9iamVjdC5w
+cm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9jZXNzKT09IltvYmplY3QgcHJvY2Vzc10iJiZwcm9jZXNz
+LnBsYXRmb3JtPT0id2luMzIifSkKcygkLCJtZiIsIno0IixmdW5jdGlvbigpe3JldHVybiBQLm51KCJe
+W1xcLVxcLjAtOUEtWl9hLXp+XSokIil9KQpzKCQsIk9RIiwidloiLGZ1bmN0aW9uKCl7cmV0dXJuIFAu
+S04oKX0pCnMoJCwiU0MiLCJBTiIsZnVuY3Rpb24oKXtyZXR1cm4gUC50TShbIkEiLCJBQkJSIiwiQUNS
+T05ZTSIsIkFERFJFU1MiLCJBUkVBIiwiQVJUSUNMRSIsIkFTSURFIiwiQVVESU8iLCJCIiwiQkRJIiwi
+QkRPIiwiQklHIiwiQkxPQ0tRVU9URSIsIkJSIiwiQlVUVE9OIiwiQ0FOVkFTIiwiQ0FQVElPTiIsIkNF
+TlRFUiIsIkNJVEUiLCJDT0RFIiwiQ09MIiwiQ09MR1JPVVAiLCJDT01NQU5EIiwiREFUQSIsIkRBVEFM
+SVNUIiwiREQiLCJERUwiLCJERVRBSUxTIiwiREZOIiwiRElSIiwiRElWIiwiREwiLCJEVCIsIkVNIiwi
+RklFTERTRVQiLCJGSUdDQVBUSU9OIiwiRklHVVJFIiwiRk9OVCIsIkZPT1RFUiIsIkZPUk0iLCJIMSIs
+IkgyIiwiSDMiLCJINCIsIkg1IiwiSDYiLCJIRUFERVIiLCJIR1JPVVAiLCJIUiIsIkkiLCJJRlJBTUUi
+LCJJTUciLCJJTlBVVCIsIklOUyIsIktCRCIsIkxBQkVMIiwiTEVHRU5EIiwiTEkiLCJNQVAiLCJNQVJL
+IiwiTUVOVSIsIk1FVEVSIiwiTkFWIiwiTk9CUiIsIk9MIiwiT1BUR1JPVVAiLCJPUFRJT04iLCJPVVRQ
+VVQiLCJQIiwiUFJFIiwiUFJPR1JFU1MiLCJRIiwiUyIsIlNBTVAiLCJTRUNUSU9OIiwiU0VMRUNUIiwi
+U01BTEwiLCJTT1VSQ0UiLCJTUEFOIiwiU1RSSUtFIiwiU1RST05HIiwiU1VCIiwiU1VNTUFSWSIsIlNV
+UCIsIlRBQkxFIiwiVEJPRFkiLCJURCIsIlRFWFRBUkVBIiwiVEZPT1QiLCJUSCIsIlRIRUFEIiwiVElN
+RSIsIlRSIiwiVFJBQ0siLCJUVCIsIlUiLCJVTCIsIlZBUiIsIlZJREVPIiwiV0JSIl0sdC5OKX0pCnMo
+JCwiWDQiLCJoRyIsZnVuY3Rpb24oKXtyZXR1cm4gUC5udSgiXlxcUyskIil9KQpzKCQsIndPIiwib3ci
+LGZ1bmN0aW9uKCl7cmV0dXJuIFAuTkQoc2VsZil9KQpzKCQsImt0IiwiUjgiLGZ1bmN0aW9uKCl7cmV0
+dXJuIEguWWcoIl8kZGFydF9kYXJ0T2JqZWN0Iil9KQpzKCQsImZLIiwia0kiLGZ1bmN0aW9uKCl7cmV0
+dXJuIGZ1bmN0aW9uIERhcnRPYmplY3QoYSl7dGhpcy5vPWF9fSkKcygkLCJxdCIsInpCIixmdW5jdGlv
+bigpe3JldHVybiBuZXcgVC5tUSgpfSkKcygkLCJPbCIsIlVFIixmdW5jdGlvbigpe3JldHVybiBQLmhL
+KEMub2wuZ21XKFcueDMoKSkuaHJlZikuZ2hZKCkucSgwLCJhdXRoVG9rZW4iKX0pCnMoJCwiaFQiLCJ5
+UCIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0LWxpc3QgLnBhbmVs
+LWNvbnRlbnQiKX0pCnMoJCwiVzYiLCJoTCIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2Vs
+ZWN0b3IoIi5lZGl0LXBhbmVsIC5wYW5lbC1jb250ZW50Iil9KQpzKCQsIlRSIiwiRFciLGZ1bmN0aW9u
+KCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCJmb290ZXIiKX0pCnMoJCwiRVkiLCJmaSIsZnVu
+Y3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoImhlYWRlciIpfSkKcygkLCJiQSIsImMw
+IixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxlY3RvcigiI21pZ3JhdGUtdW5pdC1zdGF0
+dXMtaWNvbiIpfSkKcygkLCJ0MCIsImJOIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxl
+Y3RvcigiI21pZ3JhdGUtdW5pdC1zdGF0dXMtaWNvbi1sYWJlbCIpfSkKcygkLCJhdiIsIkQ5IixmdW5j
+dGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxlY3RvcigiI3VuaXQtbmFtZSIpfSkKcigkLCJmZSIs
+IktHIixmdW5jdGlvbigpe3JldHVybiBuZXcgTC5YQSgpfSkKcygkLCJlbyIsIm5VIixmdW5jdGlvbigp
+e3JldHVybiBuZXcgTS5sSShILk4wKCJmdiIpLmEoJC5IaygpKSl9KQpzKCQsInlyIiwiYkQiLGZ1bmN0
+aW9uKCl7cmV0dXJuIG5ldyBFLk9GKFAubnUoIi8iKSxQLm51KCJbXi9dJCIpLFAubnUoIl4vIikpfSkK
+cygkLCJNayIsIktrIixmdW5jdGlvbigpe3JldHVybiBuZXcgTC5JVihQLm51KCJbL1xcXFxdIiksUC5u
+dSgiW14vXFxcXF0kIiksUC5udSgiXihcXFxcXFxcXFteXFxcXF0rXFxcXFteXFxcXC9dK3xbYS16QS1a
+XTpbL1xcXFxdKSIpLFAubnUoIl5bL1xcXFxdKD8hWy9cXFxcXSkiKSl9KQpzKCQsImFrIiwiRWIiLGZ1
+bmN0aW9uKCl7cmV0dXJuIG5ldyBGLnJ1KFAubnUoIi8iKSxQLm51KCIoXlthLXpBLVpdWy0rLmEtekEt
+WlxcZF0qOi8vfFteL10pJCIpLFAubnUoIlthLXpBLVpdWy0rLmEtekEtWlxcZF0qOi8vW14vXSoiKSxQ
+Lm51KCJeLyIpKX0pCnMoJCwibHMiLCJIayIsZnVuY3Rpb24oKXtyZXR1cm4gTy5SaCgpfSl9KSgpOyhm
+dW5jdGlvbiBuYXRpdmVTdXBwb3J0KCl7IWZ1bmN0aW9uKCl7dmFyIHM9ZnVuY3Rpb24oYSl7dmFyIG09
+e30KbVthXT0xCnJldHVybiBPYmplY3Qua2V5cyhodW5rSGVscGVycy5jb252ZXJ0VG9GYXN0T2JqZWN0
+KG0pKVswXX0Kdi5nZXRJc29sYXRlVGFnPWZ1bmN0aW9uKGEpe3JldHVybiBzKCJfX19kYXJ0XyIrYSt2
+Lmlzb2xhdGVUYWcpfQp2YXIgcj0iX19fZGFydF9pc29sYXRlX3RhZ3NfIgp2YXIgcT1PYmplY3Rbcl18
+fChPYmplY3Rbcl09T2JqZWN0LmNyZWF0ZShudWxsKSkKdmFyIHA9Il9aeFl4WCIKZm9yKHZhciBvPTA7
+O28rKyl7dmFyIG49cyhwKyJfIitvKyJfIikKaWYoIShuIGluIHEpKXtxW25dPTEKdi5pc29sYXRlVGFn
+PW4KYnJlYWt9fXYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWU9di5nZXRJc29sYXRlVGFnKCJkaXNwYXRjaF9y
+ZWNvcmQiKX0oKQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUludGVyY2VwdG9yc0J5VGFnKHtET01FcnJv
+cjpKLkd2LE1lZGlhRXJyb3I6Si5HdixOYXZpZ2F0b3I6Si5HdixOYXZpZ2F0b3JDb25jdXJyZW50SGFy
+ZHdhcmU6Si5HdixOYXZpZ2F0b3JVc2VyTWVkaWFFcnJvcjpKLkd2LE92ZXJjb25zdHJhaW5lZEVycm9y
+OkouR3YsUG9zaXRpb25FcnJvcjpKLkd2LEdlb2xvY2F0aW9uUG9zaXRpb25FcnJvcjpKLkd2LFJhbmdl
+OkouR3YsU1FMRXJyb3I6Si5HdixEYXRhVmlldzpILkVULEFycmF5QnVmZmVyVmlldzpILkVULEZsb2F0
+MzJBcnJheTpILkRnLEZsb2F0NjRBcnJheTpILkRnLEludDE2QXJyYXk6SC54aixJbnQzMkFycmF5Okgu
+ZEUsSW50OEFycmF5OkguWkEsVWludDE2QXJyYXk6SC5kVCxVaW50MzJBcnJheTpILlBxLFVpbnQ4Q2xh
+bXBlZEFycmF5OkguZUUsQ2FudmFzUGl4ZWxBcnJheTpILmVFLFVpbnQ4QXJyYXk6SC5WNixIVE1MQXVk
+aW9FbGVtZW50OlcucUUsSFRNTEJSRWxlbWVudDpXLnFFLEhUTUxCdXR0b25FbGVtZW50OlcucUUsSFRN
+TENhbnZhc0VsZW1lbnQ6Vy5xRSxIVE1MQ29udGVudEVsZW1lbnQ6Vy5xRSxIVE1MRExpc3RFbGVtZW50
+OlcucUUsSFRNTERhdGFFbGVtZW50OlcucUUsSFRNTERhdGFMaXN0RWxlbWVudDpXLnFFLEhUTUxEZXRh
+aWxzRWxlbWVudDpXLnFFLEhUTUxEaWFsb2dFbGVtZW50OlcucUUsSFRNTERpdkVsZW1lbnQ6Vy5xRSxI
+VE1MRW1iZWRFbGVtZW50OlcucUUsSFRNTEZpZWxkU2V0RWxlbWVudDpXLnFFLEhUTUxIUkVsZW1lbnQ6
+Vy5xRSxIVE1MSGVhZEVsZW1lbnQ6Vy5xRSxIVE1MSGVhZGluZ0VsZW1lbnQ6Vy5xRSxIVE1MSHRtbEVs
+ZW1lbnQ6Vy5xRSxIVE1MSUZyYW1lRWxlbWVudDpXLnFFLEhUTUxJbWFnZUVsZW1lbnQ6Vy5xRSxIVE1M
+SW5wdXRFbGVtZW50OlcucUUsSFRNTExJRWxlbWVudDpXLnFFLEhUTUxMYWJlbEVsZW1lbnQ6Vy5xRSxI
+VE1MTGVnZW5kRWxlbWVudDpXLnFFLEhUTUxMaW5rRWxlbWVudDpXLnFFLEhUTUxNYXBFbGVtZW50Olcu
+cUUsSFRNTE1lZGlhRWxlbWVudDpXLnFFLEhUTUxNZW51RWxlbWVudDpXLnFFLEhUTUxNZXRhRWxlbWVu
+dDpXLnFFLEhUTUxNZXRlckVsZW1lbnQ6Vy5xRSxIVE1MTW9kRWxlbWVudDpXLnFFLEhUTUxPTGlzdEVs
+ZW1lbnQ6Vy5xRSxIVE1MT2JqZWN0RWxlbWVudDpXLnFFLEhUTUxPcHRHcm91cEVsZW1lbnQ6Vy5xRSxI
+VE1MT3B0aW9uRWxlbWVudDpXLnFFLEhUTUxPdXRwdXRFbGVtZW50OlcucUUsSFRNTFBhcmFtRWxlbWVu
+dDpXLnFFLEhUTUxQaWN0dXJlRWxlbWVudDpXLnFFLEhUTUxQcmVFbGVtZW50OlcucUUsSFRNTFByb2dy
+ZXNzRWxlbWVudDpXLnFFLEhUTUxRdW90ZUVsZW1lbnQ6Vy5xRSxIVE1MU2NyaXB0RWxlbWVudDpXLnFF
+LEhUTUxTaGFkb3dFbGVtZW50OlcucUUsSFRNTFNsb3RFbGVtZW50OlcucUUsSFRNTFNvdXJjZUVsZW1l
+bnQ6Vy5xRSxIVE1MU3BhbkVsZW1lbnQ6Vy5xRSxIVE1MU3R5bGVFbGVtZW50OlcucUUsSFRNTFRhYmxl
+Q2FwdGlvbkVsZW1lbnQ6Vy5xRSxIVE1MVGFibGVDZWxsRWxlbWVudDpXLnFFLEhUTUxUYWJsZURhdGFD
+ZWxsRWxlbWVudDpXLnFFLEhUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50OlcucUUsSFRNTFRhYmxlQ29s
+RWxlbWVudDpXLnFFLEhUTUxUZXh0QXJlYUVsZW1lbnQ6Vy5xRSxIVE1MVGltZUVsZW1lbnQ6Vy5xRSxI
+VE1MVGl0bGVFbGVtZW50OlcucUUsSFRNTFRyYWNrRWxlbWVudDpXLnFFLEhUTUxVTGlzdEVsZW1lbnQ6
+Vy5xRSxIVE1MVW5rbm93bkVsZW1lbnQ6Vy5xRSxIVE1MVmlkZW9FbGVtZW50OlcucUUsSFRNTERpcmVj
+dG9yeUVsZW1lbnQ6Vy5xRSxIVE1MRm9udEVsZW1lbnQ6Vy5xRSxIVE1MRnJhbWVFbGVtZW50OlcucUUs
+SFRNTEZyYW1lU2V0RWxlbWVudDpXLnFFLEhUTUxNYXJxdWVlRWxlbWVudDpXLnFFLEhUTUxFbGVtZW50
+OlcucUUsSFRNTEFuY2hvckVsZW1lbnQ6Vy5HaCxIVE1MQXJlYUVsZW1lbnQ6Vy5mWSxIVE1MQmFzZUVs
+ZW1lbnQ6Vy5yWixCbG9iOlcuQXosSFRNTEJvZHlFbGVtZW50OlcuUVAsQ0RBVEFTZWN0aW9uOlcubngs
+Q2hhcmFjdGVyRGF0YTpXLm54LENvbW1lbnQ6Vy5ueCxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246Vy5ueCxU
+ZXh0OlcubngsQ1NTU3R5bGVEZWNsYXJhdGlvbjpXLm9KLE1TU3R5bGVDU1NQcm9wZXJ0aWVzOlcub0os
+Q1NTMlByb3BlcnRpZXM6Vy5vSixYTUxEb2N1bWVudDpXLlFGLERvY3VtZW50OlcuUUYsRE9NRXhjZXB0
+aW9uOlcuTmgsRE9NSW1wbGVtZW50YXRpb246Vy5hZSxET01SZWN0UmVhZE9ubHk6Vy5JQixET01Ub2tl
+bkxpc3Q6Vy5uNyxFbGVtZW50OlcuY3YsQWJvcnRQYXltZW50RXZlbnQ6Vy5lYSxBbmltYXRpb25FdmVu
+dDpXLmVhLEFuaW1hdGlvblBsYXliYWNrRXZlbnQ6Vy5lYSxBcHBsaWNhdGlvbkNhY2hlRXJyb3JFdmVu
+dDpXLmVhLEJhY2tncm91bmRGZXRjaENsaWNrRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hFdmVudDpX
+LmVhLEJhY2tncm91bmRGZXRjaEZhaWxFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaGVkRXZlbnQ6Vy5l
+YSxCZWZvcmVJbnN0YWxsUHJvbXB0RXZlbnQ6Vy5lYSxCZWZvcmVVbmxvYWRFdmVudDpXLmVhLEJsb2JF
+dmVudDpXLmVhLENhbk1ha2VQYXltZW50RXZlbnQ6Vy5lYSxDbGlwYm9hcmRFdmVudDpXLmVhLENsb3Nl
+RXZlbnQ6Vy5lYSxDdXN0b21FdmVudDpXLmVhLERldmljZU1vdGlvbkV2ZW50OlcuZWEsRGV2aWNlT3Jp
+ZW50YXRpb25FdmVudDpXLmVhLEVycm9yRXZlbnQ6Vy5lYSxFeHRlbmRhYmxlRXZlbnQ6Vy5lYSxFeHRl
+bmRhYmxlTWVzc2FnZUV2ZW50OlcuZWEsRmV0Y2hFdmVudDpXLmVhLEZvbnRGYWNlU2V0TG9hZEV2ZW50
+OlcuZWEsRm9yZWlnbkZldGNoRXZlbnQ6Vy5lYSxHYW1lcGFkRXZlbnQ6Vy5lYSxIYXNoQ2hhbmdlRXZl
+bnQ6Vy5lYSxJbnN0YWxsRXZlbnQ6Vy5lYSxNZWRpYUVuY3J5cHRlZEV2ZW50OlcuZWEsTWVkaWFLZXlN
+ZXNzYWdlRXZlbnQ6Vy5lYSxNZWRpYVF1ZXJ5TGlzdEV2ZW50OlcuZWEsTWVkaWFTdHJlYW1FdmVudDpX
+LmVhLE1lZGlhU3RyZWFtVHJhY2tFdmVudDpXLmVhLE1lc3NhZ2VFdmVudDpXLmVhLE1JRElDb25uZWN0
+aW9uRXZlbnQ6Vy5lYSxNSURJTWVzc2FnZUV2ZW50OlcuZWEsTXV0YXRpb25FdmVudDpXLmVhLE5vdGlm
+aWNhdGlvbkV2ZW50OlcuZWEsUGFnZVRyYW5zaXRpb25FdmVudDpXLmVhLFBheW1lbnRSZXF1ZXN0RXZl
+bnQ6Vy5lYSxQYXltZW50UmVxdWVzdFVwZGF0ZUV2ZW50OlcuZWEsUG9wU3RhdGVFdmVudDpXLmVhLFBy
+ZXNlbnRhdGlvbkNvbm5lY3Rpb25BdmFpbGFibGVFdmVudDpXLmVhLFByZXNlbnRhdGlvbkNvbm5lY3Rp
+b25DbG9zZUV2ZW50OlcuZWEsUHJvbWlzZVJlamVjdGlvbkV2ZW50OlcuZWEsUHVzaEV2ZW50OlcuZWEs
+UlRDRGF0YUNoYW5uZWxFdmVudDpXLmVhLFJUQ0RUTUZUb25lQ2hhbmdlRXZlbnQ6Vy5lYSxSVENQZWVy
+Q29ubmVjdGlvbkljZUV2ZW50OlcuZWEsUlRDVHJhY2tFdmVudDpXLmVhLFNlY3VyaXR5UG9saWN5Vmlv
+bGF0aW9uRXZlbnQ6Vy5lYSxTZW5zb3JFcnJvckV2ZW50OlcuZWEsU3BlZWNoUmVjb2duaXRpb25FcnJv
+cjpXLmVhLFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6Vy5lYSxTcGVlY2hTeW50aGVzaXNFdmVudDpXLmVh
+LFN0b3JhZ2VFdmVudDpXLmVhLFN5bmNFdmVudDpXLmVhLFRyYWNrRXZlbnQ6Vy5lYSxUcmFuc2l0aW9u
+RXZlbnQ6Vy5lYSxXZWJLaXRUcmFuc2l0aW9uRXZlbnQ6Vy5lYSxWUkRldmljZUV2ZW50OlcuZWEsVlJE
+aXNwbGF5RXZlbnQ6Vy5lYSxWUlNlc3Npb25FdmVudDpXLmVhLE1vam9JbnRlcmZhY2VSZXF1ZXN0RXZl
+bnQ6Vy5lYSxVU0JDb25uZWN0aW9uRXZlbnQ6Vy5lYSxJREJWZXJzaW9uQ2hhbmdlRXZlbnQ6Vy5lYSxB
+dWRpb1Byb2Nlc3NpbmdFdmVudDpXLmVhLE9mZmxpbmVBdWRpb0NvbXBsZXRpb25FdmVudDpXLmVhLFdl
+YkdMQ29udGV4dEV2ZW50OlcuZWEsRXZlbnQ6Vy5lYSxJbnB1dEV2ZW50OlcuZWEsU3VibWl0RXZlbnQ6
+Vy5lYSxFdmVudFRhcmdldDpXLkQwLEZpbGU6Vy5oSCxIVE1MRm9ybUVsZW1lbnQ6Vy5oNCxIaXN0b3J5
+OlcuYnIsSFRNTERvY3VtZW50OlcuVmIsWE1MSHR0cFJlcXVlc3Q6Vy5mSixYTUxIdHRwUmVxdWVzdEV2
+ZW50VGFyZ2V0Olcud2EsSW1hZ2VEYXRhOlcuU2csTG9jYXRpb246Vy51OCxNb3VzZUV2ZW50OlcuQWos
+RHJhZ0V2ZW50OlcuQWosUG9pbnRlckV2ZW50OlcuQWosV2hlZWxFdmVudDpXLkFqLERvY3VtZW50RnJh
+Z21lbnQ6Vy5LVixTaGFkb3dSb290OlcuS1YsRG9jdW1lbnRUeXBlOlcuS1YsTm9kZTpXLktWLE5vZGVM
+aXN0OlcuQkgsUmFkaW9Ob2RlTGlzdDpXLkJILEhUTUxQYXJhZ3JhcGhFbGVtZW50OlcuU04sUHJvZ3Jl
+c3NFdmVudDpXLmV3LFJlc291cmNlUHJvZ3Jlc3NFdmVudDpXLmV3LEhUTUxTZWxlY3RFbGVtZW50Olcu
+bHAsSFRNTFRhYmxlRWxlbWVudDpXLlRiLEhUTUxUYWJsZVJvd0VsZW1lbnQ6Vy5JdixIVE1MVGFibGVT
+ZWN0aW9uRWxlbWVudDpXLldQLEhUTUxUZW1wbGF0ZUVsZW1lbnQ6Vy55WSxDb21wb3NpdGlvbkV2ZW50
+OlcudzYsRm9jdXNFdmVudDpXLnc2LEtleWJvYXJkRXZlbnQ6Vy53NixUZXh0RXZlbnQ6Vy53NixUb3Vj
+aEV2ZW50OlcudzYsVUlFdmVudDpXLnc2LFdpbmRvdzpXLks1LERPTVdpbmRvdzpXLks1LERlZGljYXRl
+ZFdvcmtlckdsb2JhbFNjb3BlOlcuQ20sU2VydmljZVdvcmtlckdsb2JhbFNjb3BlOlcuQ20sU2hhcmVk
+V29ya2VyR2xvYmFsU2NvcGU6Vy5DbSxXb3JrZXJHbG9iYWxTY29wZTpXLkNtLEF0dHI6Vy5DUSxDbGll
+bnRSZWN0OlcudzQsRE9NUmVjdDpXLnc0LE5hbWVkTm9kZU1hcDpXLnJoLE1vek5hbWVkQXR0ck1hcDpX
+LnJoLElEQktleVJhbmdlOlAuaEYsU1ZHU2NyaXB0RWxlbWVudDpQLm5kLFNWR0FFbGVtZW50OlAuaGks
+U1ZHQW5pbWF0ZUVsZW1lbnQ6UC5oaSxTVkdBbmltYXRlTW90aW9uRWxlbWVudDpQLmhpLFNWR0FuaW1h
+dGVUcmFuc2Zvcm1FbGVtZW50OlAuaGksU1ZHQW5pbWF0aW9uRWxlbWVudDpQLmhpLFNWR0NpcmNsZUVs
+ZW1lbnQ6UC5oaSxTVkdDbGlwUGF0aEVsZW1lbnQ6UC5oaSxTVkdEZWZzRWxlbWVudDpQLmhpLFNWR0Rl
+c2NFbGVtZW50OlAuaGksU1ZHRGlzY2FyZEVsZW1lbnQ6UC5oaSxTVkdFbGxpcHNlRWxlbWVudDpQLmhp
+LFNWR0ZFQmxlbmRFbGVtZW50OlAuaGksU1ZHRkVDb2xvck1hdHJpeEVsZW1lbnQ6UC5oaSxTVkdGRUNv
+bXBvbmVudFRyYW5zZmVyRWxlbWVudDpQLmhpLFNWR0ZFQ29tcG9zaXRlRWxlbWVudDpQLmhpLFNWR0ZF
+Q29udm9sdmVNYXRyaXhFbGVtZW50OlAuaGksU1ZHRkVEaWZmdXNlTGlnaHRpbmdFbGVtZW50OlAuaGks
+U1ZHRkVEaXNwbGFjZW1lbnRNYXBFbGVtZW50OlAuaGksU1ZHRkVEaXN0YW50TGlnaHRFbGVtZW50OlAu
+aGksU1ZHRkVGbG9vZEVsZW1lbnQ6UC5oaSxTVkdGRUZ1bmNBRWxlbWVudDpQLmhpLFNWR0ZFRnVuY0JF
+bGVtZW50OlAuaGksU1ZHRkVGdW5jR0VsZW1lbnQ6UC5oaSxTVkdGRUZ1bmNSRWxlbWVudDpQLmhpLFNW
+R0ZFR2F1c3NpYW5CbHVyRWxlbWVudDpQLmhpLFNWR0ZFSW1hZ2VFbGVtZW50OlAuaGksU1ZHRkVNZXJn
+ZUVsZW1lbnQ6UC5oaSxTVkdGRU1lcmdlTm9kZUVsZW1lbnQ6UC5oaSxTVkdGRU1vcnBob2xvZ3lFbGVt
+ZW50OlAuaGksU1ZHRkVPZmZzZXRFbGVtZW50OlAuaGksU1ZHRkVQb2ludExpZ2h0RWxlbWVudDpQLmhp
+LFNWR0ZFU3BlY3VsYXJMaWdodGluZ0VsZW1lbnQ6UC5oaSxTVkdGRVNwb3RMaWdodEVsZW1lbnQ6UC5o
+aSxTVkdGRVRpbGVFbGVtZW50OlAuaGksU1ZHRkVUdXJidWxlbmNlRWxlbWVudDpQLmhpLFNWR0ZpbHRl
+ckVsZW1lbnQ6UC5oaSxTVkdGb3JlaWduT2JqZWN0RWxlbWVudDpQLmhpLFNWR0dFbGVtZW50OlAuaGks
+U1ZHR2VvbWV0cnlFbGVtZW50OlAuaGksU1ZHR3JhcGhpY3NFbGVtZW50OlAuaGksU1ZHSW1hZ2VFbGVt
+ZW50OlAuaGksU1ZHTGluZUVsZW1lbnQ6UC5oaSxTVkdMaW5lYXJHcmFkaWVudEVsZW1lbnQ6UC5oaSxT
+VkdNYXJrZXJFbGVtZW50OlAuaGksU1ZHTWFza0VsZW1lbnQ6UC5oaSxTVkdNZXRhZGF0YUVsZW1lbnQ6
+UC5oaSxTVkdQYXRoRWxlbWVudDpQLmhpLFNWR1BhdHRlcm5FbGVtZW50OlAuaGksU1ZHUG9seWdvbkVs
+ZW1lbnQ6UC5oaSxTVkdQb2x5bGluZUVsZW1lbnQ6UC5oaSxTVkdSYWRpYWxHcmFkaWVudEVsZW1lbnQ6
+UC5oaSxTVkdSZWN0RWxlbWVudDpQLmhpLFNWR1NldEVsZW1lbnQ6UC5oaSxTVkdTdG9wRWxlbWVudDpQ
+LmhpLFNWR1N0eWxlRWxlbWVudDpQLmhpLFNWR1NWR0VsZW1lbnQ6UC5oaSxTVkdTd2l0Y2hFbGVtZW50
+OlAuaGksU1ZHU3ltYm9sRWxlbWVudDpQLmhpLFNWR1RTcGFuRWxlbWVudDpQLmhpLFNWR1RleHRDb250
+ZW50RWxlbWVudDpQLmhpLFNWR1RleHRFbGVtZW50OlAuaGksU1ZHVGV4dFBhdGhFbGVtZW50OlAuaGks
+U1ZHVGV4dFBvc2l0aW9uaW5nRWxlbWVudDpQLmhpLFNWR1RpdGxlRWxlbWVudDpQLmhpLFNWR1VzZUVs
+ZW1lbnQ6UC5oaSxTVkdWaWV3RWxlbWVudDpQLmhpLFNWR0dyYWRpZW50RWxlbWVudDpQLmhpLFNWR0Nv
+bXBvbmVudFRyYW5zZmVyRnVuY3Rpb25FbGVtZW50OlAuaGksU1ZHRkVEcm9wU2hhZG93RWxlbWVudDpQ
+LmhpLFNWR01QYXRoRWxlbWVudDpQLmhpLFNWR0VsZW1lbnQ6UC5oaX0pCmh1bmtIZWxwZXJzLnNldE9y
+VXBkYXRlTGVhZlRhZ3Moe0RPTUVycm9yOnRydWUsTWVkaWFFcnJvcjp0cnVlLE5hdmlnYXRvcjp0cnVl
+LE5hdmlnYXRvckNvbmN1cnJlbnRIYXJkd2FyZTp0cnVlLE5hdmlnYXRvclVzZXJNZWRpYUVycm9yOnRy
+dWUsT3ZlcmNvbnN0cmFpbmVkRXJyb3I6dHJ1ZSxQb3NpdGlvbkVycm9yOnRydWUsR2VvbG9jYXRpb25Q
+b3NpdGlvbkVycm9yOnRydWUsUmFuZ2U6dHJ1ZSxTUUxFcnJvcjp0cnVlLERhdGFWaWV3OnRydWUsQXJy
+YXlCdWZmZXJWaWV3OmZhbHNlLEZsb2F0MzJBcnJheTp0cnVlLEZsb2F0NjRBcnJheTp0cnVlLEludDE2
+QXJyYXk6dHJ1ZSxJbnQzMkFycmF5OnRydWUsSW50OEFycmF5OnRydWUsVWludDE2QXJyYXk6dHJ1ZSxV
+aW50MzJBcnJheTp0cnVlLFVpbnQ4Q2xhbXBlZEFycmF5OnRydWUsQ2FudmFzUGl4ZWxBcnJheTp0cnVl
+LFVpbnQ4QXJyYXk6ZmFsc2UsSFRNTEF1ZGlvRWxlbWVudDp0cnVlLEhUTUxCUkVsZW1lbnQ6dHJ1ZSxI
+VE1MQnV0dG9uRWxlbWVudDp0cnVlLEhUTUxDYW52YXNFbGVtZW50OnRydWUsSFRNTENvbnRlbnRFbGVt
+ZW50OnRydWUsSFRNTERMaXN0RWxlbWVudDp0cnVlLEhUTUxEYXRhRWxlbWVudDp0cnVlLEhUTUxEYXRh
+TGlzdEVsZW1lbnQ6dHJ1ZSxIVE1MRGV0YWlsc0VsZW1lbnQ6dHJ1ZSxIVE1MRGlhbG9nRWxlbWVudDp0
+cnVlLEhUTUxEaXZFbGVtZW50OnRydWUsSFRNTEVtYmVkRWxlbWVudDp0cnVlLEhUTUxGaWVsZFNldEVs
+ZW1lbnQ6dHJ1ZSxIVE1MSFJFbGVtZW50OnRydWUsSFRNTEhlYWRFbGVtZW50OnRydWUsSFRNTEhlYWRp
+bmdFbGVtZW50OnRydWUsSFRNTEh0bWxFbGVtZW50OnRydWUsSFRNTElGcmFtZUVsZW1lbnQ6dHJ1ZSxI
+VE1MSW1hZ2VFbGVtZW50OnRydWUsSFRNTElucHV0RWxlbWVudDp0cnVlLEhUTUxMSUVsZW1lbnQ6dHJ1
+ZSxIVE1MTGFiZWxFbGVtZW50OnRydWUsSFRNTExlZ2VuZEVsZW1lbnQ6dHJ1ZSxIVE1MTGlua0VsZW1l
+bnQ6dHJ1ZSxIVE1MTWFwRWxlbWVudDp0cnVlLEhUTUxNZWRpYUVsZW1lbnQ6dHJ1ZSxIVE1MTWVudUVs
+ZW1lbnQ6dHJ1ZSxIVE1MTWV0YUVsZW1lbnQ6dHJ1ZSxIVE1MTWV0ZXJFbGVtZW50OnRydWUsSFRNTE1v
+ZEVsZW1lbnQ6dHJ1ZSxIVE1MT0xpc3RFbGVtZW50OnRydWUsSFRNTE9iamVjdEVsZW1lbnQ6dHJ1ZSxI
+VE1MT3B0R3JvdXBFbGVtZW50OnRydWUsSFRNTE9wdGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MT3V0cHV0RWxl
+bWVudDp0cnVlLEhUTUxQYXJhbUVsZW1lbnQ6dHJ1ZSxIVE1MUGljdHVyZUVsZW1lbnQ6dHJ1ZSxIVE1M
+UHJlRWxlbWVudDp0cnVlLEhUTUxQcm9ncmVzc0VsZW1lbnQ6dHJ1ZSxIVE1MUXVvdGVFbGVtZW50OnRy
+dWUsSFRNTFNjcmlwdEVsZW1lbnQ6dHJ1ZSxIVE1MU2hhZG93RWxlbWVudDp0cnVlLEhUTUxTbG90RWxl
+bWVudDp0cnVlLEhUTUxTb3VyY2VFbGVtZW50OnRydWUsSFRNTFNwYW5FbGVtZW50OnRydWUsSFRNTFN0
+eWxlRWxlbWVudDp0cnVlLEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OnRydWUsSFRNTFRhYmxlQ2VsbEVs
+ZW1lbnQ6dHJ1ZSxIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVIZWFkZXJDZWxs
+RWxlbWVudDp0cnVlLEhUTUxUYWJsZUNvbEVsZW1lbnQ6dHJ1ZSxIVE1MVGV4dEFyZWFFbGVtZW50OnRy
+dWUsSFRNTFRpbWVFbGVtZW50OnRydWUsSFRNTFRpdGxlRWxlbWVudDp0cnVlLEhUTUxUcmFja0VsZW1l
+bnQ6dHJ1ZSxIVE1MVUxpc3RFbGVtZW50OnRydWUsSFRNTFVua25vd25FbGVtZW50OnRydWUsSFRNTFZp
+ZGVvRWxlbWVudDp0cnVlLEhUTUxEaXJlY3RvcnlFbGVtZW50OnRydWUsSFRNTEZvbnRFbGVtZW50OnRy
+dWUsSFRNTEZyYW1lRWxlbWVudDp0cnVlLEhUTUxGcmFtZVNldEVsZW1lbnQ6dHJ1ZSxIVE1MTWFycXVl
+ZUVsZW1lbnQ6dHJ1ZSxIVE1MRWxlbWVudDpmYWxzZSxIVE1MQW5jaG9yRWxlbWVudDp0cnVlLEhUTUxB
+cmVhRWxlbWVudDp0cnVlLEhUTUxCYXNlRWxlbWVudDp0cnVlLEJsb2I6ZmFsc2UsSFRNTEJvZHlFbGVt
+ZW50OnRydWUsQ0RBVEFTZWN0aW9uOnRydWUsQ2hhcmFjdGVyRGF0YTp0cnVlLENvbW1lbnQ6dHJ1ZSxQ
+cm9jZXNzaW5nSW5zdHJ1Y3Rpb246dHJ1ZSxUZXh0OnRydWUsQ1NTU3R5bGVEZWNsYXJhdGlvbjp0cnVl
+LE1TU3R5bGVDU1NQcm9wZXJ0aWVzOnRydWUsQ1NTMlByb3BlcnRpZXM6dHJ1ZSxYTUxEb2N1bWVudDp0
+cnVlLERvY3VtZW50OmZhbHNlLERPTUV4Y2VwdGlvbjp0cnVlLERPTUltcGxlbWVudGF0aW9uOnRydWUs
+RE9NUmVjdFJlYWRPbmx5OmZhbHNlLERPTVRva2VuTGlzdDp0cnVlLEVsZW1lbnQ6ZmFsc2UsQWJvcnRQ
+YXltZW50RXZlbnQ6dHJ1ZSxBbmltYXRpb25FdmVudDp0cnVlLEFuaW1hdGlvblBsYXliYWNrRXZlbnQ6
+dHJ1ZSxBcHBsaWNhdGlvbkNhY2hlRXJyb3JFdmVudDp0cnVlLEJhY2tncm91bmRGZXRjaENsaWNrRXZl
+bnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hFdmVudDp0cnVlLEJhY2tncm91bmRGZXRjaEZhaWxFdmVudDp0
+cnVlLEJhY2tncm91bmRGZXRjaGVkRXZlbnQ6dHJ1ZSxCZWZvcmVJbnN0YWxsUHJvbXB0RXZlbnQ6dHJ1
+ZSxCZWZvcmVVbmxvYWRFdmVudDp0cnVlLEJsb2JFdmVudDp0cnVlLENhbk1ha2VQYXltZW50RXZlbnQ6
+dHJ1ZSxDbGlwYm9hcmRFdmVudDp0cnVlLENsb3NlRXZlbnQ6dHJ1ZSxDdXN0b21FdmVudDp0cnVlLERl
+dmljZU1vdGlvbkV2ZW50OnRydWUsRGV2aWNlT3JpZW50YXRpb25FdmVudDp0cnVlLEVycm9yRXZlbnQ6
+dHJ1ZSxFeHRlbmRhYmxlRXZlbnQ6dHJ1ZSxFeHRlbmRhYmxlTWVzc2FnZUV2ZW50OnRydWUsRmV0Y2hF
+dmVudDp0cnVlLEZvbnRGYWNlU2V0TG9hZEV2ZW50OnRydWUsRm9yZWlnbkZldGNoRXZlbnQ6dHJ1ZSxH
+YW1lcGFkRXZlbnQ6dHJ1ZSxIYXNoQ2hhbmdlRXZlbnQ6dHJ1ZSxJbnN0YWxsRXZlbnQ6dHJ1ZSxNZWRp
+YUVuY3J5cHRlZEV2ZW50OnRydWUsTWVkaWFLZXlNZXNzYWdlRXZlbnQ6dHJ1ZSxNZWRpYVF1ZXJ5TGlz
+dEV2ZW50OnRydWUsTWVkaWFTdHJlYW1FdmVudDp0cnVlLE1lZGlhU3RyZWFtVHJhY2tFdmVudDp0cnVl
+LE1lc3NhZ2VFdmVudDp0cnVlLE1JRElDb25uZWN0aW9uRXZlbnQ6dHJ1ZSxNSURJTWVzc2FnZUV2ZW50
+OnRydWUsTXV0YXRpb25FdmVudDp0cnVlLE5vdGlmaWNhdGlvbkV2ZW50OnRydWUsUGFnZVRyYW5zaXRp
+b25FdmVudDp0cnVlLFBheW1lbnRSZXF1ZXN0RXZlbnQ6dHJ1ZSxQYXltZW50UmVxdWVzdFVwZGF0ZUV2
+ZW50OnRydWUsUG9wU3RhdGVFdmVudDp0cnVlLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25BdmFpbGFibGVF
+dmVudDp0cnVlLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZUV2ZW50OnRydWUsUHJvbWlzZVJlamVj
+dGlvbkV2ZW50OnRydWUsUHVzaEV2ZW50OnRydWUsUlRDRGF0YUNoYW5uZWxFdmVudDp0cnVlLFJUQ0RU
+TUZUb25lQ2hhbmdlRXZlbnQ6dHJ1ZSxSVENQZWVyQ29ubmVjdGlvbkljZUV2ZW50OnRydWUsUlRDVHJh
+Y2tFdmVudDp0cnVlLFNlY3VyaXR5UG9saWN5VmlvbGF0aW9uRXZlbnQ6dHJ1ZSxTZW5zb3JFcnJvckV2
+ZW50OnRydWUsU3BlZWNoUmVjb2duaXRpb25FcnJvcjp0cnVlLFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6
+dHJ1ZSxTcGVlY2hTeW50aGVzaXNFdmVudDp0cnVlLFN0b3JhZ2VFdmVudDp0cnVlLFN5bmNFdmVudDp0
+cnVlLFRyYWNrRXZlbnQ6dHJ1ZSxUcmFuc2l0aW9uRXZlbnQ6dHJ1ZSxXZWJLaXRUcmFuc2l0aW9uRXZl
+bnQ6dHJ1ZSxWUkRldmljZUV2ZW50OnRydWUsVlJEaXNwbGF5RXZlbnQ6dHJ1ZSxWUlNlc3Npb25FdmVu
+dDp0cnVlLE1vam9JbnRlcmZhY2VSZXF1ZXN0RXZlbnQ6dHJ1ZSxVU0JDb25uZWN0aW9uRXZlbnQ6dHJ1
+ZSxJREJWZXJzaW9uQ2hhbmdlRXZlbnQ6dHJ1ZSxBdWRpb1Byb2Nlc3NpbmdFdmVudDp0cnVlLE9mZmxp
+bmVBdWRpb0NvbXBsZXRpb25FdmVudDp0cnVlLFdlYkdMQ29udGV4dEV2ZW50OnRydWUsRXZlbnQ6ZmFs
+c2UsSW5wdXRFdmVudDpmYWxzZSxTdWJtaXRFdmVudDpmYWxzZSxFdmVudFRhcmdldDpmYWxzZSxGaWxl
+OnRydWUsSFRNTEZvcm1FbGVtZW50OnRydWUsSGlzdG9yeTp0cnVlLEhUTUxEb2N1bWVudDp0cnVlLFhN
+TEh0dHBSZXF1ZXN0OnRydWUsWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDpmYWxzZSxJbWFnZURhdGE6
+dHJ1ZSxMb2NhdGlvbjp0cnVlLE1vdXNlRXZlbnQ6dHJ1ZSxEcmFnRXZlbnQ6dHJ1ZSxQb2ludGVyRXZl
+bnQ6dHJ1ZSxXaGVlbEV2ZW50OnRydWUsRG9jdW1lbnRGcmFnbWVudDp0cnVlLFNoYWRvd1Jvb3Q6dHJ1
+ZSxEb2N1bWVudFR5cGU6dHJ1ZSxOb2RlOmZhbHNlLE5vZGVMaXN0OnRydWUsUmFkaW9Ob2RlTGlzdDp0
+cnVlLEhUTUxQYXJhZ3JhcGhFbGVtZW50OnRydWUsUHJvZ3Jlc3NFdmVudDp0cnVlLFJlc291cmNlUHJv
+Z3Jlc3NFdmVudDp0cnVlLEhUTUxTZWxlY3RFbGVtZW50OnRydWUsSFRNTFRhYmxlRWxlbWVudDp0cnVl
+LEhUTUxUYWJsZVJvd0VsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVTZWN0aW9uRWxlbWVudDp0cnVlLEhUTUxU
+ZW1wbGF0ZUVsZW1lbnQ6dHJ1ZSxDb21wb3NpdGlvbkV2ZW50OnRydWUsRm9jdXNFdmVudDp0cnVlLEtl
+eWJvYXJkRXZlbnQ6dHJ1ZSxUZXh0RXZlbnQ6dHJ1ZSxUb3VjaEV2ZW50OnRydWUsVUlFdmVudDpmYWxz
+ZSxXaW5kb3c6dHJ1ZSxET01XaW5kb3c6dHJ1ZSxEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZTp0cnVl
+LFNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZTp0cnVlLFNoYXJlZFdvcmtlckdsb2JhbFNjb3BlOnRydWUs
+V29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxBdHRyOnRydWUsQ2xpZW50UmVjdDp0cnVlLERPTVJlY3Q6dHJ1
+ZSxOYW1lZE5vZGVNYXA6dHJ1ZSxNb3pOYW1lZEF0dHJNYXA6dHJ1ZSxJREJLZXlSYW5nZTp0cnVlLFNW
+R1NjcmlwdEVsZW1lbnQ6dHJ1ZSxTVkdBRWxlbWVudDp0cnVlLFNWR0FuaW1hdGVFbGVtZW50OnRydWUs
+U1ZHQW5pbWF0ZU1vdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRlVHJhbnNmb3JtRWxlbWVudDp0cnVl
+LFNWR0FuaW1hdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdDaXJjbGVFbGVtZW50OnRydWUsU1ZHQ2xpcFBhdGhF
+bGVtZW50OnRydWUsU1ZHRGVmc0VsZW1lbnQ6dHJ1ZSxTVkdEZXNjRWxlbWVudDp0cnVlLFNWR0Rpc2Nh
+cmRFbGVtZW50OnRydWUsU1ZHRWxsaXBzZUVsZW1lbnQ6dHJ1ZSxTVkdGRUJsZW5kRWxlbWVudDp0cnVl
+LFNWR0ZFQ29sb3JNYXRyaXhFbGVtZW50OnRydWUsU1ZHRkVDb21wb25lbnRUcmFuc2ZlckVsZW1lbnQ6
+dHJ1ZSxTVkdGRUNvbXBvc2l0ZUVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbnZvbHZlTWF0cml4RWxlbWVudDp0
+cnVlLFNWR0ZFRGlmZnVzZUxpZ2h0aW5nRWxlbWVudDp0cnVlLFNWR0ZFRGlzcGxhY2VtZW50TWFwRWxl
+bWVudDp0cnVlLFNWR0ZFRGlzdGFudExpZ2h0RWxlbWVudDp0cnVlLFNWR0ZFRmxvb2RFbGVtZW50OnRy
+dWUsU1ZHRkVGdW5jQUVsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNCRWxlbWVudDp0cnVlLFNWR0ZFRnVuY0dF
+bGVtZW50OnRydWUsU1ZHRkVGdW5jUkVsZW1lbnQ6dHJ1ZSxTVkdGRUdhdXNzaWFuQmx1ckVsZW1lbnQ6
+dHJ1ZSxTVkdGRUltYWdlRWxlbWVudDp0cnVlLFNWR0ZFTWVyZ2VFbGVtZW50OnRydWUsU1ZHRkVNZXJn
+ZU5vZGVFbGVtZW50OnRydWUsU1ZHRkVNb3JwaG9sb2d5RWxlbWVudDp0cnVlLFNWR0ZFT2Zmc2V0RWxl
+bWVudDp0cnVlLFNWR0ZFUG9pbnRMaWdodEVsZW1lbnQ6dHJ1ZSxTVkdGRVNwZWN1bGFyTGlnaHRpbmdF
+bGVtZW50OnRydWUsU1ZHRkVTcG90TGlnaHRFbGVtZW50OnRydWUsU1ZHRkVUaWxlRWxlbWVudDp0cnVl
+LFNWR0ZFVHVyYnVsZW5jZUVsZW1lbnQ6dHJ1ZSxTVkdGaWx0ZXJFbGVtZW50OnRydWUsU1ZHRm9yZWln
+bk9iamVjdEVsZW1lbnQ6dHJ1ZSxTVkdHRWxlbWVudDp0cnVlLFNWR0dlb21ldHJ5RWxlbWVudDp0cnVl
+LFNWR0dyYXBoaWNzRWxlbWVudDp0cnVlLFNWR0ltYWdlRWxlbWVudDp0cnVlLFNWR0xpbmVFbGVtZW50
+OnRydWUsU1ZHTGluZWFyR3JhZGllbnRFbGVtZW50OnRydWUsU1ZHTWFya2VyRWxlbWVudDp0cnVlLFNW
+R01hc2tFbGVtZW50OnRydWUsU1ZHTWV0YWRhdGFFbGVtZW50OnRydWUsU1ZHUGF0aEVsZW1lbnQ6dHJ1
+ZSxTVkdQYXR0ZXJuRWxlbWVudDp0cnVlLFNWR1BvbHlnb25FbGVtZW50OnRydWUsU1ZHUG9seWxpbmVF
+bGVtZW50OnRydWUsU1ZHUmFkaWFsR3JhZGllbnRFbGVtZW50OnRydWUsU1ZHUmVjdEVsZW1lbnQ6dHJ1
+ZSxTVkdTZXRFbGVtZW50OnRydWUsU1ZHU3RvcEVsZW1lbnQ6dHJ1ZSxTVkdTdHlsZUVsZW1lbnQ6dHJ1
+ZSxTVkdTVkdFbGVtZW50OnRydWUsU1ZHU3dpdGNoRWxlbWVudDp0cnVlLFNWR1N5bWJvbEVsZW1lbnQ6
+dHJ1ZSxTVkdUU3BhbkVsZW1lbnQ6dHJ1ZSxTVkdUZXh0Q29udGVudEVsZW1lbnQ6dHJ1ZSxTVkdUZXh0
+RWxlbWVudDp0cnVlLFNWR1RleHRQYXRoRWxlbWVudDp0cnVlLFNWR1RleHRQb3NpdGlvbmluZ0VsZW1l
+bnQ6dHJ1ZSxTVkdUaXRsZUVsZW1lbnQ6dHJ1ZSxTVkdVc2VFbGVtZW50OnRydWUsU1ZHVmlld0VsZW1l
+bnQ6dHJ1ZSxTVkdHcmFkaWVudEVsZW1lbnQ6dHJ1ZSxTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9u
+RWxlbWVudDp0cnVlLFNWR0ZFRHJvcFNoYWRvd0VsZW1lbnQ6dHJ1ZSxTVkdNUGF0aEVsZW1lbnQ6dHJ1
+ZSxTVkdFbGVtZW50OmZhbHNlfSkKSC5MWi4kbmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJW
+aWV3IgpILlJHLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXciCkguVlAuJG5hdGl2
+ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5EZy4kbmF0aXZlU3VwZXJjbGFzc1RhZz0i
+QXJyYXlCdWZmZXJWaWV3IgpILldCLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXci
+CkguWkcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5QZy4kbmF0aXZlU3Vw
+ZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3In0pKCkKY29udmVydEFsbFRvRmFzdE9iamVjdCh3KQpj
+b252ZXJ0VG9GYXN0T2JqZWN0KCQpOyhmdW5jdGlvbihhKXtpZih0eXBlb2YgZG9jdW1lbnQ9PT0idW5k
+ZWZpbmVkIil7YShudWxsKQpyZXR1cm59aWYodHlwZW9mIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQhPSJ1
+bmRlZmluZWQiKXthKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpCnJldHVybn12YXIgcz1kb2N1bWVudC5z
+Y3JpcHRzCmZ1bmN0aW9uIG9uTG9hZChiKXtmb3IodmFyIHE9MDtxPHMubGVuZ3RoOysrcSlzW3FdLnJl
+bW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLG9uTG9hZCxmYWxzZSkKYShiLnRhcmdldCl9Zm9yKHZhciBy
+PTA7cjxzLmxlbmd0aDsrK3Ipc1tyXS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixvbkxvYWQsZmFsc2Up
+fSkoZnVuY3Rpb24oYSl7di5jdXJyZW50U2NyaXB0PWEKdmFyIHM9TC5JcQppZih0eXBlb2YgZGFydE1h
+aW5SdW5uZXI9PT0iZnVuY3Rpb24iKWRhcnRNYWluUnVubmVyKHMsW10pCmVsc2UgcyhbXSl9KX0pKCkK
+Ly8jIHNvdXJjZU1hcHBpbmdVUkw9bWlncmF0aW9uLmpzLm1hcAo=
 ''';
diff --git a/pkg/nnbd_migration/lib/src/front_end/web/edit_details.dart b/pkg/nnbd_migration/lib/src/front_end/web/edit_details.dart
index 53a17bf..4699bed 100644
--- a/pkg/nnbd_migration/lib/src/front_end/web/edit_details.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/web/edit_details.dart
@@ -37,12 +37,12 @@
       this.traces = const []});
 
   EditDetails.fromJson(dynamic json)
-      : edits = _decodeEdits(json['edits']),
+      : edits = _decodeEdits(json['edits'] as List<Object?>?),
         explanation = json['explanation'] as String?,
         line = json['line'] as int?,
         displayPath = json['displayPath'] as String?,
         uriPath = json['uriPath'] as String?,
-        traces = _decodeTraces(json['traces']);
+        traces = _decodeTraces(json['traces'] as List<Object?>?);
 
   Map<String, Object?> toJson() => {
         if (edits != null) 'edits': [for (var edit in edits!) edit.toJson()],
@@ -54,10 +54,10 @@
           'traces': [for (var trace in traces!) trace.toJson()],
       };
 
-  static List<EditLink>? _decodeEdits(dynamic json) =>
+  static List<EditLink>? _decodeEdits(List<Object?>? json) =>
       json == null ? null : [for (var edit in json) EditLink.fromJson(edit)];
 
-  static List<Trace>? _decodeTraces(dynamic json) =>
+  static List<Trace>? _decodeTraces(List<Object?>? json) =>
       json == null ? null : [for (var trace in json) Trace.fromJson(trace)];
 }
 
@@ -125,7 +125,8 @@
   Trace.fromJson(dynamic json)
       : description = json['description'] as String?,
         entries = [
-          for (var entry in json['entries']) TraceEntry.fromJson(entry)
+          for (var entry in json['entries'] as List<Object?>)
+            TraceEntry.fromJson(entry)
         ];
 
   Map<String, Object?> toJson() => {
diff --git a/pkg/nnbd_migration/lib/src/front_end/web/migration.dart b/pkg/nnbd_migration/lib/src/front_end/web/migration.dart
index 9be3101..0ca93ca 100644
--- a/pkg/nnbd_migration/lib/src/front_end/web/migration.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/web/migration.dart
@@ -492,7 +492,7 @@
 
   // Request the navigation tree, then do work with the response.
   try {
-    final response = await doGet<List<Object?>>(path);
+    final response = (await doGet<List<Object?>>(path))!;
     var navTree = document.querySelector('.nav-tree')!;
     navTree.innerHtml = '';
     navigationTree = NavigationTreeNode.listFromJson(response);
diff --git a/pkg/nnbd_migration/lib/src/front_end/web/navigation_tree.dart b/pkg/nnbd_migration/lib/src/front_end/web/navigation_tree.dart
index 16ff587..7bc708a 100644
--- a/pkg/nnbd_migration/lib/src/front_end/web/navigation_tree.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/web/navigation_tree.dart
@@ -190,13 +190,13 @@
   Map<String, Object?> toJson();
 
   /// Deserializes a list of navigation tree nodes from a JSON list.
-  static List<NavigationTreeNode> listFromJson(dynamic json) =>
+  static List<NavigationTreeNode> listFromJson(List<Object?> json) =>
       [for (var node in json) NavigationTreeNode.fromJson(node)];
 
   /// Deserializes a list of navigation tree nodes from a possibly null JSON
   /// list.  If the argument is `null`, `null` is returned.
   static List<NavigationTreeNode>? listFromJsonOrNull(dynamic json) =>
-      json == null ? null : listFromJson(json);
+      json == null ? null : listFromJson(json as List<Object?>);
 
   /// Serializes a list of navigation tree nodes into JSON.
   static List<Map<String, Object?>> listToJson(
diff --git a/pkg/nnbd_migration/lib/src/node_builder.dart b/pkg/nnbd_migration/lib/src/node_builder.dart
index 653d36b..2dad8d1 100644
--- a/pkg/nnbd_migration/lib/src/node_builder.dart
+++ b/pkg/nnbd_migration/lib/src/node_builder.dart
@@ -660,7 +660,7 @@
   DecoratedType? visitVariableDeclarationList(VariableDeclarationList node) {
     node.metadata.accept(this);
     var typeAnnotation = node.type;
-    var type = _pushNullabilityNodeTarget(
+    var declaredType = _pushNullabilityNodeTarget(
         NullabilityNodeTarget.element(
             node.variables.first.declaredElement!, _getLineInfo),
         () => typeAnnotation?.accept(this));
@@ -671,9 +671,11 @@
     if (hint != null && hint.kind == HintCommentKind.lateFinal) {
       _variables!.recordLateHint(source, node, hint);
     }
+    var parent = node.parent;
     for (var variable in node.variables) {
       variable.metadata.accept(this);
       var declaredElement = variable.declaredElement;
+      var type = declaredType;
       if (type == null) {
         var target =
             NullabilityNodeTarget.element(declaredElement!, _getLineInfo);
@@ -683,11 +685,11 @@
       }
       _variables!.recordDecoratedElementType(declaredElement, type);
       variable.initializer?.accept(this);
-    }
-    var parent = node.parent;
-    if (parent is FieldDeclaration) {
-      if (_hasAngularChildAnnotation(parent.metadata)) {
-        _graph.makeNullable(type!.node!, AngularAnnotationOrigin(source, node));
+      if (parent is FieldDeclaration) {
+        if (_hasAngularChildAnnotation(parent.metadata)) {
+          _graph.makeNullable(
+              type.node!, AngularAnnotationOrigin(source, node));
+        }
       }
     }
     return null;
diff --git a/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart b/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
index 867f72a..a9d155e 100644
--- a/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
+++ b/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
@@ -236,6 +236,7 @@
           unit.declaredElement!.source,
           _permissive! ? listener : null,
           _decoratedClassHierarchy,
+          result.libraryElement,
           instrumentation: _instrumentation));
     } finally {
       DecoratedTypeParameterBounds.current = null;
diff --git a/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart b/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
index abc2788..7eeea96 100644
--- a/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
+++ b/pkg/nnbd_migration/test/already_migrated_code_decorator_test.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/analysis/analysis_context_collection.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
@@ -9,9 +11,11 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/source.dart';
-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:analyzer/src/test_utilities/find_element.dart';
+import 'package:analyzer/src/test_utilities/find_node.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/src/already_migrated_code_decorator.dart';
 import 'package:nnbd_migration/src/decorated_type.dart';
@@ -29,35 +33,475 @@
   });
 }
 
-class _AlreadyMigratedCodeDecoratorTestBase extends Object with EdgeTester {
-  final TypeProvider typeProvider;
-
-  final AlreadyMigratedCodeDecorator decorator;
-
-  final NullabilityGraphForTesting graph;
-
+class _AlreadyMigratedCodeDecoratorTestBase {
   final NullabilitySuffix suffix;
 
-  Element element = _MockElement();
-
   final decoratedTypeParameterBounds = DecoratedTypeParameterBounds();
 
-  _AlreadyMigratedCodeDecoratorTestBase(NullabilitySuffix nullabilitySuffix)
-      : this._(
-          nullabilitySuffix,
-          NullabilityGraphForTesting(),
-          TestTypeProvider(),
-        );
+  _AlreadyMigratedCodeDecoratorTestBase(this.suffix);
 
-  _AlreadyMigratedCodeDecoratorTestBase._(
-      this.suffix, this.graph, this.typeProvider)
-      : decorator =
-            AlreadyMigratedCodeDecorator(graph, typeProvider, _getLineInfo);
+  DecoratedType? getDecoratedBound(TypeParameterElement element) =>
+      decoratedTypeParameterBounds.get(element);
+
+  void setUp() {
+    DecoratedTypeParameterBounds.current = decoratedTypeParameterBounds;
+  }
+
+  void tearDown() {
+    DecoratedTypeParameterBounds.current = null;
+  }
+
+  Future<void> test_decorate_dynamic() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+    withElement.checkDynamic(
+        withElement.decorate(withElement.typeProvider.dynamicType),
+        'test type');
+  }
+
+  Future<void> test_decorate_functionType_generic_bounded() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement(
+      'class A<T extends num> {}',
+    );
+    var typeFormal = withUnit.findElement.typeParameter('T');
+    var withElement = withUnit.withElement(typeFormal);
+
+    var decoratedType = withElement.decorate(
+      FunctionTypeImpl(
+        typeFormals: [typeFormal],
+        parameters: const [],
+        returnType: TypeParameterTypeImpl(
+          element: typeFormal,
+          nullabilitySuffix: NullabilitySuffix.star,
+        ),
+        nullabilitySuffix: suffix,
+      ),
+    );
+    withElement.checkNum(
+        getDecoratedBound(typeFormal)!,
+        withElement.checkExplicitlyNonNullable,
+        'bound of type formal T of test type');
+    withElement.checkTypeParameter(
+        decoratedType.returnType!,
+        withElement.checkExplicitlyNonNullable,
+        typeFormal,
+        'return type of test type');
+  }
+
+  Future<void> test_decorate_functionType_generic_no_explicit_bound() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement(
+      'class A<T> {}',
+    );
+    var typeFormal = withUnit.findElement.typeParameter('T');
+    var withElement = withUnit.withElement(typeFormal);
+
+    var decoratedType = withElement.decorate(
+      FunctionTypeImpl(
+        typeFormals: [typeFormal],
+        parameters: const [],
+        returnType: TypeParameterTypeImpl(
+          element: typeFormal,
+          nullabilitySuffix: NullabilitySuffix.star,
+        ),
+        nullabilitySuffix: suffix,
+      ),
+    );
+    withElement.checkObject(
+        getDecoratedBound(typeFormal)!,
+        withElement.checkExplicitlyNullable,
+        'bound of type formal T of test type');
+    withElement.checkTypeParameter(
+        decoratedType.returnType!,
+        withElement.checkExplicitlyNonNullable,
+        typeFormal,
+        'return type of test type');
+  }
+
+  Future<void> test_decorate_functionType_named_parameter() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    withElement.checkDynamic(
+        withElement
+            .decorate(
+              FunctionTypeImpl(
+                typeFormals: const [],
+                parameters: [
+                  ParameterElementImpl.synthetic(
+                    'x',
+                    withElement.typeProvider.dynamicType,
+                    ParameterKind.NAMED,
+                  )
+                ],
+                returnType: withElement.typeProvider.voidType,
+                nullabilitySuffix: suffix,
+              ),
+            )
+            .namedParameters!['x'],
+        'parameter x of test type');
+  }
+
+  Future<void> test_decorate_functionType_ordinary_parameters() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    var decoratedType = withElement.decorate(
+      FunctionTypeImpl(
+        typeFormals: const [],
+        parameters: [
+          ParameterElementImpl.synthetic(
+            'x',
+            withElement.typeProvider.dynamicType,
+            ParameterKind.REQUIRED,
+          ),
+          ParameterElementImpl.synthetic(
+            'y',
+            withElement.typeProvider.dynamicType,
+            ParameterKind.REQUIRED,
+          )
+        ],
+        returnType: withElement.typeProvider.voidType,
+        nullabilitySuffix: suffix,
+      ),
+    );
+    withElement.checkDynamic(
+        decoratedType.positionalParameters![0], 'parameter 0 of test type');
+    withElement.checkDynamic(
+        decoratedType.positionalParameters![1], 'parameter 1 of test type');
+  }
+
+  Future<void> test_decorate_functionType_positional_parameter() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    withElement.checkDynamic(
+        withElement
+            .decorate(
+              FunctionTypeImpl(
+                typeFormals: const [],
+                parameters: [
+                  ParameterElementImpl.synthetic(
+                    'x',
+                    withElement.typeProvider.dynamicType,
+                    ParameterKind.POSITIONAL,
+                  )
+                ],
+                returnType: withElement.typeProvider.voidType,
+                nullabilitySuffix: suffix,
+              ),
+            )
+            .positionalParameters![0],
+        'parameter 0 of test type');
+  }
+
+  Future<void> test_decorate_functionType_question() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    withElement.checkExplicitlyNullable(
+        withElement
+            .decorate(
+              FunctionTypeImpl(
+                typeFormals: const [],
+                parameters: const [],
+                returnType: withElement.typeProvider.voidType,
+                nullabilitySuffix: NullabilitySuffix.question,
+              ),
+            )
+            .node,
+        'test type');
+  }
+
+  Future<void> test_decorate_functionType_returnType() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    withElement.checkDynamic(
+        withElement
+            .decorate(
+              FunctionTypeImpl(
+                typeFormals: const [],
+                parameters: const [],
+                returnType: withElement.typeProvider.dynamicType,
+                nullabilitySuffix: suffix,
+              ),
+            )
+            .returnType,
+        'return type of test type');
+  }
+
+  Future<void> test_decorate_functionType_star() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    withElement.checkExplicitlyNonNullable(
+        withElement
+            .decorate(
+              FunctionTypeImpl(
+                typeFormals: const [],
+                parameters: const [],
+                returnType: withElement.typeProvider.voidType,
+                nullabilitySuffix: suffix,
+              ),
+            )
+            .node,
+        'test type');
+  }
+
+  Future<void> test_decorate_interfaceType_parameters() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    var decoratedType = withElement.decorate(InterfaceTypeImpl(
+        element: withElement.typeProvider.mapElement,
+        typeArguments: [
+          withElement.typeProvider.intType,
+          withElement.typeProvider.numType
+        ],
+        nullabilitySuffix: suffix));
+    withElement.checkInt(decoratedType.typeArguments[0]!,
+        withElement.checkExplicitlyNonNullable, 'type argument 0 of test type');
+    withElement.checkNum(decoratedType.typeArguments[1]!,
+        withElement.checkExplicitlyNonNullable, 'type argument 1 of test type');
+  }
+
+  Future<void> test_decorate_interfaceType_simple_question() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    withElement.checkInt(
+        withElement.decorate(
+          InterfaceTypeImpl(
+            element: withElement.typeProvider.intElement,
+            typeArguments: const [],
+            nullabilitySuffix: NullabilitySuffix.question,
+          ),
+        ),
+        withElement.checkExplicitlyNullable,
+        'test type');
+  }
+
+  Future<void> test_decorate_interfaceType_simple_star() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    withElement.checkInt(
+        withElement.decorate(
+          InterfaceTypeImpl(
+            element: withElement.typeProvider.intElement,
+            typeArguments: const [],
+            nullabilitySuffix: suffix,
+          ),
+        ),
+        withElement.checkExplicitlyNonNullable,
+        'test type');
+  }
+
+  Future<void> test_decorate_iterable_dynamic() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    var decorated =
+        withElement.decorate(withElement.typeProvider.iterableDynamicType);
+    withElement.checkIterable(decorated, withElement.checkExplicitlyNonNullable,
+        withElement.checkDynamic, 'test type');
+  }
+
+  Future<void> test_decorate_never() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    withElement.checkNever(
+        withElement.decorate(withElement.typeProvider.neverType), 'test type');
+  }
+
+  Future<void> test_decorate_typeParameterType_question() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement(
+      'class A<T> {}',
+    );
+    var element = withUnit.findElement.typeParameter('T');
+    var withElement = withUnit.withElement(element);
+
+    withElement.checkTypeParameter(
+        withElement.decorate(TypeParameterTypeImpl(
+            element: element, nullabilitySuffix: NullabilitySuffix.question)),
+        withElement.checkExplicitlyNullable,
+        element,
+        'test type');
+  }
+
+  Future<void> test_decorate_typeParameterType_star() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement(
+      'class A<T> {}',
+    );
+    var element = withUnit.findElement.typeParameter('T');
+    var withElement = withUnit.withElement(element);
+
+    withElement.checkTypeParameter(
+        withElement.decorate(
+            TypeParameterTypeImpl(element: element, nullabilitySuffix: suffix)),
+        withElement.checkExplicitlyNonNullable,
+        element,
+        'test type');
+  }
+
+  Future<void> test_decorate_void() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    withElement.checkVoid(
+        withElement.decorate(withElement.typeProvider.voidType), 'test type');
+  }
+
+  Future<void> test_getImmediateSupertypes_future() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement('');
+    var element = withUnit.typeProvider.futureElement;
+    var withElement = withUnit.withElement(element);
+
+    // var class_ = element = typeProvider.futureElement;
+    var class_ = withElement.typeProvider.futureElement;
+    var decoratedSupertypes =
+        withElement.decorator.getImmediateSupertypes(class_).toList();
+    var typeParam = class_.typeParameters[0];
+    expect(decoratedSupertypes, hasLength(2));
+    // TODO(scheglov) Use location matcher.
+    withElement.checkObject(decoratedSupertypes[0],
+        withElement.checkExplicitlyNonNullable, 'Future (async.dart:1:79)');
+    // Since Future<T> is a subtype of FutureOr<T>, we consider FutureOr<T> to
+    // be an immediate supertype, even though the class declaration for Future
+    // doesn't mention FutureOr.
+    // TODO(scheglov) Use location matcher.
+    withElement.checkFutureOr(
+        decoratedSupertypes[1],
+        withElement.checkExplicitlyNonNullable,
+        (t, displayName) => withElement.checkTypeParameter(
+            t!, withElement.checkExplicitlyNonNullable, typeParam, displayName),
+        'Future (async.dart:1:79)');
+  }
+
+  Future<void> test_getImmediateSupertypes_generic() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement(
+      'class C<T> extends Iterable<T> {}',
+    );
+    var unitElement = withUnit.unitElement;
+    var class_ = unitElement.classes.single;
+    var t = class_.typeParameters.single;
+
+    var withElement = withUnit.withElement(class_);
+
+    var decoratedSupertypes =
+        withElement.decorator.getImmediateSupertypes(class_).toList();
+    expect(decoratedSupertypes, hasLength(1));
+    withElement.checkIterable(
+        decoratedSupertypes[0],
+        withElement.checkExplicitlyNonNullable,
+        (type, displayName) => withElement.checkTypeParameter(
+            type!, withElement.checkExplicitlyNonNullable, t, displayName),
+        'C (test.dart:1:7)');
+  }
+
+  Future<void> test_getImmediateSupertypes_interface() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement(
+      'class C implements num {}',
+    );
+    var unitElement = withUnit.unitElement;
+    var class_ = unitElement.classes.single;
+
+    var withElement = withUnit.withElement(class_);
+
+    var decoratedSupertypes =
+        withElement.decorator.getImmediateSupertypes(class_).toList();
+    expect(decoratedSupertypes, hasLength(2));
+    withElement.checkObject(decoratedSupertypes[0],
+        withElement.checkExplicitlyNonNullable, 'C (test.dart:1:7)');
+    withElement.checkNum(decoratedSupertypes[1],
+        withElement.checkExplicitlyNonNullable, 'C (test.dart:1:7)');
+  }
+
+  Future<void> test_getImmediateSupertypes_mixin() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement(
+      'class C with num {}',
+    );
+    var unitElement = withUnit.unitElement;
+    var class_ = unitElement.classes.single;
+
+    var withElement = withUnit.withElement(class_);
+
+    var decoratedSupertypes =
+        withElement.decorator.getImmediateSupertypes(class_).toList();
+    expect(decoratedSupertypes, hasLength(2));
+    withElement.checkObject(decoratedSupertypes[0],
+        withElement.checkExplicitlyNonNullable, 'C (test.dart:1:7)');
+    withElement.checkNum(decoratedSupertypes[1],
+        withElement.checkExplicitlyNonNullable, 'C (test.dart:1:7)');
+  }
+
+  Future<void> test_getImmediateSupertypes_superclassConstraint() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement(
+      'mixin C on num {}',
+    );
+    var unitElement = withUnit.unitElement;
+    var mixin_ = unitElement.mixins.single;
+
+    var withElement = withUnit.withElement(mixin_);
+
+    var decoratedSupertypes =
+        withElement.decorator.getImmediateSupertypes(mixin_).toList();
+    expect(decoratedSupertypes, hasLength(1));
+    withElement.checkNum(decoratedSupertypes[0],
+        withElement.checkExplicitlyNonNullable, 'C (test.dart:1:7)');
+  }
+
+  Future<void> test_getImmediateSupertypes_supertype() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement(
+      'class C {}',
+    );
+    var unitElement = withUnit.unitElement;
+    var class_ = unitElement.classes.single;
+
+    var withElement = withUnit.withElement(class_);
+
+    var decoratedSupertypes =
+        withElement.decorator.getImmediateSupertypes(class_).toList();
+    expect(decoratedSupertypes, hasLength(1));
+    // TODO(paulberry): displayName should be 'Object supertype of C'
+    withElement.checkObject(decoratedSupertypes[0],
+        withElement.checkExplicitlyNonNullable, 'C (test.dart:1:7)');
+  }
+}
+
+/// Specialization of [_AlreadyMigratedCodeDecoratorTestBase] for testing the
+/// situation where the already migrated code does not contain star types.  In
+/// the final product, by definition all already-migrated code will be free of
+/// star types.  However, since we do not yet migrate using a fully NNBD-aware
+/// SDK, we need to handle both star and non-star variants on a short term
+/// basis.
+@reflectiveTest
+class _AlreadyMigratedCodeDecoratorTestNormal
+    extends _AlreadyMigratedCodeDecoratorTestBase {
+  _AlreadyMigratedCodeDecoratorTestNormal() : super(NullabilitySuffix.none);
+}
+
+/// Specialization of [_AlreadyMigratedCodeDecoratorTestBase] for testing the
+/// situation where the already migrated code contains star types.  In the final
+/// product, this will never happen.  However, since we do not yet migrate using
+/// a fully NNBD-aware SDK, we need to handle both star and non-star variants on
+/// a short term basis.
+@reflectiveTest
+class _AlreadyMigratedCodeDecoratorTestProvisional
+    extends _AlreadyMigratedCodeDecoratorTestBase {
+  _AlreadyMigratedCodeDecoratorTestProvisional()
+      : super(NullabilitySuffix.star);
+}
+
+class _ContextWithElement with EdgeTester {
+  final _ContextWithUnitElement _withUnit;
+  final Element element;
+
+  final NullabilityGraphForTesting graph = NullabilityGraphForTesting();
+
+  _ContextWithElement(this._withUnit, this.element);
 
   NullabilityNode get always => graph.always;
 
+  AlreadyMigratedCodeDecorator get decorator {
+    return AlreadyMigratedCodeDecorator(
+        graph, typeProvider, (_) => LineInfo([0]));
+  }
+
   NullabilityNode get never => graph.never;
 
+  TypeProvider get typeProvider {
+    return _withUnit.typeProvider;
+  }
+
   void checkAlwaysNullable(NullabilityNode node, String displayName) {
     var edge = assertEdge(always, node, hard: true, checkable: false);
     var origin = graph.getEdgeOrigin(edge)!;
@@ -88,10 +532,11 @@
   }
 
   void checkFutureOr(
-      DecoratedType decoratedType,
-      void Function(NullabilityNode?, String) checkNullability,
-      void Function(DecoratedType?, String) checkArgument,
-      String displayName) {
+    DecoratedType decoratedType,
+    void Function(NullabilityNode?, String) checkNullability,
+    void Function(DecoratedType?, String) checkArgument,
+    String displayName,
+  ) {
     expect(decoratedType.type!.element, typeProvider.futureOrElement);
     checkNullability(decoratedType.node, displayName);
     checkArgument(
@@ -99,18 +544,20 @@
   }
 
   void checkInt(
-      DecoratedType decoratedType,
-      void Function(NullabilityNode?, String) checkNullability,
-      String displayName) {
+    DecoratedType decoratedType,
+    void Function(NullabilityNode?, String) checkNullability,
+    String displayName,
+  ) {
     expect(decoratedType.type!.element, typeProvider.intType.element);
     checkNullability(decoratedType.node, displayName);
   }
 
   void checkIterable(
-      DecoratedType decoratedType,
-      void Function(NullabilityNode?, String) checkNullability,
-      void Function(DecoratedType?, String) checkArgument,
-      String displayName) {
+    DecoratedType decoratedType,
+    void Function(NullabilityNode?, String) checkNullability,
+    void Function(DecoratedType?, String) checkArgument,
+    String displayName,
+  ) {
     expect(
         decoratedType.type!.element, typeProvider.iterableDynamicType.element);
     checkNullability(decoratedType.node, displayName);
@@ -124,26 +571,29 @@
   }
 
   void checkNum(
-      DecoratedType decoratedType,
-      void Function(NullabilityNode?, String) checkNullability,
-      String displayName) {
+    DecoratedType decoratedType,
+    void Function(NullabilityNode?, String) checkNullability,
+    String displayName,
+  ) {
     expect(decoratedType.type!.element, typeProvider.numType.element);
     checkNullability(decoratedType.node, displayName);
   }
 
   void checkObject(
-      DecoratedType decoratedType,
-      void Function(NullabilityNode?, String) checkNullability,
-      String displayName) {
+    DecoratedType decoratedType,
+    void Function(NullabilityNode?, String) checkNullability,
+    String displayName,
+  ) {
     expect(decoratedType.type!.element, typeProvider.objectType.element);
     checkNullability(decoratedType.node, displayName);
   }
 
   void checkTypeParameter(
-      DecoratedType decoratedType,
-      void Function(NullabilityNode?, String) checkNullability,
-      TypeParameterElement expectedElement,
-      String displayName) {
+    DecoratedType decoratedType,
+    void Function(NullabilityNode?, String) checkNullability,
+    TypeParameterElement expectedElement,
+    String displayName,
+  ) {
     var type = decoratedType.type as TypeParameterTypeImpl;
     expect(type.element, same(expectedElement));
     checkNullability(decoratedType.node, displayName);
@@ -160,397 +610,57 @@
     expect(decoratedType.type, same(type));
     return decoratedType;
   }
+}
 
-  DecoratedType? getDecoratedBound(TypeParameterElement element) =>
-      decoratedTypeParameterBounds.get(element);
+class _ContextWithFiles with ResourceProviderMixin {
+  Future<_ContextWithUnitElement> buildUnitElement(String content) async {
+    var file = newFile('/home/test/lib/test.dart', content: content);
 
-  void setUp() {
-    DecoratedTypeParameterBounds.current = decoratedTypeParameterBounds;
-  }
-
-  void tearDown() {
-    DecoratedTypeParameterBounds.current = null;
-  }
-
-  void test_decorate_dynamic() {
-    checkDynamic(decorate(typeProvider.dynamicType), 'test type');
-  }
-
-  void test_decorate_functionType_generic_bounded() {
-    var typeFormal = element = TypeParameterElementImpl.synthetic('T')
-      ..bound = typeProvider.numType;
-    var decoratedType = decorate(
-      FunctionTypeImpl(
-        typeFormals: [typeFormal],
-        parameters: const [],
-        returnType: TypeParameterTypeImpl(
-          element: typeFormal,
-          nullabilitySuffix: NullabilitySuffix.star,
-        ),
-        nullabilitySuffix: suffix,
-      ),
+    var sdkRoot = newFolder('/sdk');
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
     );
-    checkNum(getDecoratedBound(typeFormal)!, checkExplicitlyNonNullable,
-        'bound of type formal T of test type');
-    checkTypeParameter(decoratedType.returnType!, checkExplicitlyNonNullable,
-        typeFormal, 'return type of test type');
-  }
 
-  void test_decorate_functionType_generic_no_explicit_bound() {
-    var typeFormal = element = TypeParameterElementImpl.synthetic('T');
-    var decoratedType = decorate(
-      FunctionTypeImpl(
-        typeFormals: [typeFormal],
-        parameters: const [],
-        returnType: TypeParameterTypeImpl(
-          element: typeFormal,
-          nullabilitySuffix: NullabilitySuffix.star,
-        ),
-        nullabilitySuffix: suffix,
-      ),
+    var contextCollection = AnalysisContextCollection(
+      resourceProvider: resourceProvider,
+      includedPaths: [file.path],
+      sdkPath: sdkRoot.path,
     );
-    checkObject(getDecoratedBound(typeFormal)!, checkExplicitlyNullable,
-        'bound of type formal T of test type');
-    checkTypeParameter(decoratedType.returnType!, checkExplicitlyNonNullable,
-        typeFormal, 'return type of test type');
+    var analysisContext = contextCollection.contextFor(file.path);
+    var analysisSession = analysisContext.currentSession;
+    var result = await analysisSession.getResolvedUnit(file.path);
+    return _ContextWithUnitElement(result as ResolvedUnitResult);
   }
 
-  void test_decorate_functionType_named_parameter() {
-    checkDynamic(
-        decorate(
-          FunctionTypeImpl(
-            typeFormals: const [],
-            parameters: [
-              ParameterElementImpl.synthetic(
-                'x',
-                typeProvider.dynamicType,
-                ParameterKind.NAMED,
-              )
-            ],
-            returnType: typeProvider.voidType,
-            nullabilitySuffix: suffix,
-          ),
-        ).namedParameters!['x'],
-        'parameter x of test type');
+  Future<_ContextWithElement> withEmptyUnit() async {
+    var withUnit = await buildUnitElement('');
+    return withUnit.withElement(withUnit.unitElement);
   }
-
-  void test_decorate_functionType_ordinary_parameters() {
-    var decoratedType = decorate(
-      FunctionTypeImpl(
-        typeFormals: const [],
-        parameters: [
-          ParameterElementImpl.synthetic(
-            'x',
-            typeProvider.dynamicType,
-            ParameterKind.REQUIRED,
-          ),
-          ParameterElementImpl.synthetic(
-            'y',
-            typeProvider.dynamicType,
-            ParameterKind.REQUIRED,
-          )
-        ],
-        returnType: typeProvider.voidType,
-        nullabilitySuffix: suffix,
-      ),
-    );
-    checkDynamic(
-        decoratedType.positionalParameters![0], 'parameter 0 of test type');
-    checkDynamic(
-        decoratedType.positionalParameters![1], 'parameter 1 of test type');
-  }
-
-  void test_decorate_functionType_positional_parameter() {
-    checkDynamic(
-        decorate(
-          FunctionTypeImpl(
-            typeFormals: const [],
-            parameters: [
-              ParameterElementImpl.synthetic(
-                'x',
-                typeProvider.dynamicType,
-                ParameterKind.POSITIONAL,
-              )
-            ],
-            returnType: typeProvider.voidType,
-            nullabilitySuffix: suffix,
-          ),
-        ).positionalParameters![0],
-        'parameter 0 of test type');
-  }
-
-  void test_decorate_functionType_question() {
-    checkExplicitlyNullable(
-        decorate(
-          FunctionTypeImpl(
-            typeFormals: const [],
-            parameters: const [],
-            returnType: typeProvider.voidType,
-            nullabilitySuffix: NullabilitySuffix.question,
-          ),
-        ).node,
-        'test type');
-  }
-
-  void test_decorate_functionType_returnType() {
-    checkDynamic(
-        decorate(
-          FunctionTypeImpl(
-            typeFormals: const [],
-            parameters: const [],
-            returnType: typeProvider.dynamicType,
-            nullabilitySuffix: suffix,
-          ),
-        ).returnType,
-        'return type of test type');
-  }
-
-  void test_decorate_functionType_star() {
-    checkExplicitlyNonNullable(
-        decorate(
-          FunctionTypeImpl(
-            typeFormals: const [],
-            parameters: const [],
-            returnType: typeProvider.voidType,
-            nullabilitySuffix: suffix,
-          ),
-        ).node,
-        'test type');
-  }
-
-  void test_decorate_interfaceType_parameters() {
-    var decoratedType = decorate(InterfaceTypeImpl(
-        element: typeProvider.mapElement,
-        typeArguments: [typeProvider.intType, typeProvider.numType],
-        nullabilitySuffix: suffix));
-    checkInt(decoratedType.typeArguments[0]!, checkExplicitlyNonNullable,
-        'type argument 0 of test type');
-    checkNum(decoratedType.typeArguments[1]!, checkExplicitlyNonNullable,
-        'type argument 1 of test type');
-  }
-
-  void test_decorate_interfaceType_simple_question() {
-    checkInt(
-        decorate(
-          InterfaceTypeImpl(
-            element: typeProvider.intElement,
-            typeArguments: const [],
-            nullabilitySuffix: NullabilitySuffix.question,
-          ),
-        ),
-        checkExplicitlyNullable,
-        'test type');
-  }
-
-  void test_decorate_interfaceType_simple_star() {
-    checkInt(
-        decorate(
-          InterfaceTypeImpl(
-            element: typeProvider.intElement,
-            typeArguments: const [],
-            nullabilitySuffix: suffix,
-          ),
-        ),
-        checkExplicitlyNonNullable,
-        'test type');
-  }
-
-  void test_decorate_iterable_dynamic() {
-    var decorated = decorate(typeProvider.iterableDynamicType);
-    checkIterable(
-        decorated, checkExplicitlyNonNullable, checkDynamic, 'test type');
-  }
-
-  void test_decorate_never() {
-    checkNever(decorate(typeProvider.neverType), 'test type');
-  }
-
-  void test_decorate_typeParameterType_question() {
-    var element = TypeParameterElementImpl.synthetic('T');
-    checkTypeParameter(
-        decorate(TypeParameterTypeImpl(
-            element: element, nullabilitySuffix: NullabilitySuffix.question)),
-        checkExplicitlyNullable,
-        element,
-        'test type');
-  }
-
-  void test_decorate_typeParameterType_star() {
-    var element = TypeParameterElementImpl.synthetic('T');
-    checkTypeParameter(
-        decorate(
-            TypeParameterTypeImpl(element: element, nullabilitySuffix: suffix)),
-        checkExplicitlyNonNullable,
-        element,
-        'test type');
-  }
-
-  void test_decorate_void() {
-    checkVoid(decorate(typeProvider.voidType), 'test type');
-  }
-
-  void test_getImmediateSupertypes_future() {
-    var class_ = element = typeProvider.futureElement;
-    var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
-    var typeParam = class_.typeParameters[0];
-    expect(decoratedSupertypes, hasLength(2));
-    // Note: the bogus location `async:1:1` is because we're using a
-    // TestTypeProvider.
-    checkObject(decoratedSupertypes[0], checkExplicitlyNonNullable,
-        'Future (async:1:1)');
-    // Since Future<T> is a subtype of FutureOr<T>, we consider FutureOr<T> to
-    // be an immediate supertype, even though the class declaration for Future
-    // doesn't mention FutureOr.
-    // Note: the bogus location `async:1:1` is because we're using a
-    // TestTypeProvider.
-    checkFutureOr(
-        decoratedSupertypes[1],
-        checkExplicitlyNonNullable,
-        (t, displayName) => checkTypeParameter(
-            t!, checkExplicitlyNonNullable, typeParam, displayName),
-        'Future (async:1:1)');
-  }
-
-  void test_getImmediateSupertypes_generic() {
-    var library = _LibraryElementMock();
-    var t = ElementFactory.typeParameterElement('T');
-    var class_ = element = ElementFactory.classElement3(
-      name: 'C',
-      typeParameters: [t],
-      supertype: typeProvider.iterableType(
-        t.instantiate(nullabilitySuffix: suffix),
-      ),
-    );
-    class_.enclosingElement = library.definingCompilationUnit;
-    var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
-    expect(decoratedSupertypes, hasLength(1));
-    checkIterable(
-        decoratedSupertypes[0],
-        checkExplicitlyNonNullable,
-        (type, displayName) => checkTypeParameter(
-            type!, checkExplicitlyNonNullable, t, displayName),
-        'C (test.dart:1:1)');
-  }
-
-  void test_getImmediateSupertypes_interface() {
-    var library = _LibraryElementMock();
-    var class_ =
-        element = ElementFactory.classElement('C', typeProvider.objectType);
-    class_.interfaces = [typeProvider.numType];
-    class_.enclosingElement = library.definingCompilationUnit;
-    var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
-    expect(decoratedSupertypes, hasLength(2));
-    checkObject(decoratedSupertypes[0], checkExplicitlyNonNullable,
-        'C (test.dart:1:1)');
-    checkNum(decoratedSupertypes[1], checkExplicitlyNonNullable,
-        'C (test.dart:1:1)');
-  }
-
-  void test_getImmediateSupertypes_mixin() {
-    var library = _LibraryElementMock();
-    var class_ =
-        element = ElementFactory.classElement('C', typeProvider.objectType);
-    class_.mixins = [typeProvider.numType];
-    class_.enclosingElement = library.definingCompilationUnit;
-    var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
-    expect(decoratedSupertypes, hasLength(2));
-    checkObject(decoratedSupertypes[0], checkExplicitlyNonNullable,
-        'C (test.dart:1:1)');
-    checkNum(decoratedSupertypes[1], checkExplicitlyNonNullable,
-        'C (test.dart:1:1)');
-  }
-
-  void test_getImmediateSupertypes_superclassConstraint() {
-    var library = _LibraryElementMock();
-    var class_ = element = ElementFactory.mixinElement(
-        name: 'C', constraints: [typeProvider.numType]);
-    class_.enclosingElement = library.definingCompilationUnit;
-    var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
-    expect(decoratedSupertypes, hasLength(1));
-    checkNum(decoratedSupertypes[0], checkExplicitlyNonNullable,
-        'C (test.dart:1:1)');
-  }
-
-  void test_getImmediateSupertypes_supertype() {
-    var library = _LibraryElementMock();
-    var class_ =
-        element = ElementFactory.classElement('C', typeProvider.objectType);
-    class_.enclosingElement = library.definingCompilationUnit;
-    var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
-    expect(decoratedSupertypes, hasLength(1));
-    // TODO(paulberry): displayName should be 'Object supertype of C'
-    checkObject(decoratedSupertypes[0], checkExplicitlyNonNullable,
-        'C (test.dart:1:1)');
-  }
-
-  static LineInfo _getLineInfo(String path) => LineInfo([0]);
 }
 
-/// Specialization of [_AlreadyMigratedCodeDecoratorTestBase] for testing the
-/// situation where the already migrated code does not contain star types.  In
-/// the final product, by definition all already-migrated code will be free of
-/// star types.  However, since we do not yet migrate using a fully NNBD-aware
-/// SDK, we need to handle both star and non-star variants on a short term
-/// basis.
-@reflectiveTest
-class _AlreadyMigratedCodeDecoratorTestNormal
-    extends _AlreadyMigratedCodeDecoratorTestBase {
-  _AlreadyMigratedCodeDecoratorTestNormal() : super(NullabilitySuffix.none);
-}
+class _ContextWithUnitElement {
+  final ResolvedUnitResult _unitResult;
 
-/// Specialization of [_AlreadyMigratedCodeDecoratorTestBase] for testing the
-/// situation where the already migrated code contains star types.  In the final
-/// product, this will never happen.  However, since we do not yet migrate using
-/// a fully NNBD-aware SDK, we need to handle both star and non-star variants on
-/// a short term basis.
-@reflectiveTest
-class _AlreadyMigratedCodeDecoratorTestProvisional
-    extends _AlreadyMigratedCodeDecoratorTestBase {
-  _AlreadyMigratedCodeDecoratorTestProvisional()
-      : super(NullabilitySuffix.star);
-}
+  _ContextWithUnitElement(this._unitResult);
 
-class _CompilationUnitElementMock implements CompilationUnitElementImpl {
-  @override
-  final LibraryElement enclosingElement;
-
-  @override
-  final Source source;
-
-  _CompilationUnitElementMock(this.enclosingElement, this.source);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-class _LibraryElementMock implements LibraryElementImpl {
-  @override
-  late CompilationUnitElement definingCompilationUnit;
-
-  @override
-  late Source source;
-
-  _LibraryElementMock() {
-    source = _SourceMock();
-    definingCompilationUnit = _CompilationUnitElementMock(this, source);
+  FindElement get findElement {
+    return FindElement(_unitResult.unit);
   }
 
-  @override
-  Element? get enclosingElement => null;
+  FindNode get findNode {
+    return FindNode(_unitResult.content, _unitResult.unit);
+  }
 
-  @override
-  bool get isNonNullableByDefault => false;
+  TypeProvider get typeProvider {
+    return unitElement.library.typeProvider;
+  }
 
-  @override
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
+  CompilationUnitElement get unitElement {
+    return _unitResult.unit.declaredElement!;
+  }
 
-class _MockElement implements Element {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-class _SourceMock implements Source {
-  String get fullName => '/test.dart';
-
-  @override
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+  _ContextWithElement withElement(Element element) {
+    return _ContextWithElement(this, element);
+  }
 }
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index a13964d..a2bbb70 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -639,6 +639,20 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_await_null() async {
+    var content = '''
+Future<int> test() async {
+  return await null;
+}
+''';
+    var expected = '''
+Future<int?> test() async {
+  return await null;
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void>
       test_back_propagation_stops_at_implicitly_typed_variables() async {
     var content = '''
@@ -863,6 +877,171 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_call_tearoff() async {
+    var content = '''
+class C {
+  void call() {}
+}
+void Function() f(C c) => c;
+''';
+    var expected = '''
+class C {
+  void call() {}
+}
+void Function() f(C c) => c;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_call_tearoff_already_migrated() async {
+    var content = '''
+import 'already_migrated.dart';
+void Function() f(C c) => c;
+''';
+    var alreadyMigrated = '''
+// @dart=2.12
+class C {
+  void call() {}
+}
+''';
+    var expected = '''
+import 'already_migrated.dart';
+void Function() f(C c) => c;
+''';
+    await _checkSingleFileChanges(content, expected, migratedInput: {
+      '$projectPath/lib/already_migrated.dart': alreadyMigrated
+    });
+  }
+
+  Future<void>
+      test_call_tearoff_already_migrated_propagate_nullability() async {
+    var content = '''
+import 'already_migrated.dart';
+Map<int, String> Function() f(C c) => c;
+''';
+    var alreadyMigrated = '''
+// @dart=2.12
+class C {
+  Map<int, String?> call() => {};
+}
+''';
+    var expected = '''
+import 'already_migrated.dart';
+Map<int, String?> Function() f(C c) => c;
+''';
+    await _checkSingleFileChanges(content, expected, migratedInput: {
+      '$projectPath/lib/already_migrated.dart': alreadyMigrated
+    });
+  }
+
+  Future<void> test_call_tearoff_already_migrated_with_substitution() async {
+    var content = '''
+import 'already_migrated.dart';
+Map<int, String> Function() f(C<String/*?*/> c) => c;
+''';
+    var alreadyMigrated = '''
+// @dart=2.12
+class C<T> {
+  Map<int, T> call() => {};
+}
+''';
+    var expected = '''
+import 'already_migrated.dart';
+Map<int, String?> Function() f(C<String?> c) => c;
+''';
+    await _checkSingleFileChanges(content, expected, migratedInput: {
+      '$projectPath/lib/already_migrated.dart': alreadyMigrated
+    });
+  }
+
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/47848')
+  Future<void> test_call_tearoff_futureOr() async {
+    var content = '''
+import 'dart:async';
+class C {
+  void call() {}
+}
+FutureOr<void Function()> f(C c) => c;
+''';
+    var expected = '''
+import 'dart:async';
+class C {
+  void call() {}
+}
+FutureOr<void Function()> f(C c) => c;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_call_tearoff_inherited() async {
+    var content = '''
+class B {
+  void call() {}
+}
+class C extends B {}
+void Function() f(C c) => c;
+''';
+    var expected = '''
+class B {
+  void call() {}
+}
+class C extends B {}
+void Function() f(C c) => c;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_call_tearoff_inherited_propagate_nullability() async {
+    var content = '''
+class B {
+  Map<int, String> call() => {1: null};
+}
+class C extends B {}
+Map<int, String> Function() f(C c) => c;
+''';
+    var expected = '''
+class B {
+  Map<int, String?> call() => {1: null};
+}
+class C extends B {}
+Map<int, String?> Function() f(C c) => c;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_call_tearoff_propagate_nullability() async {
+    var content = '''
+class C {
+  Map<int, String> call() => {1: null};
+}
+Map<int, String> Function() f(C c) => c;
+''';
+    var expected = '''
+class C {
+  Map<int, String?> call() => {1: null};
+}
+Map<int, String?> Function() f(C c) => c;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/47848')
+  Future<void> test_call_tearoff_raw_function() async {
+    var content = '''
+class C {
+  void call() {}
+}
+Function f(C c) => c;
+''';
+    var expected = '''
+class C {
+  void call() {}
+}
+Function f(C c) => c;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_catch_simple() async {
     var content = '''
 void f() {
@@ -4924,6 +5103,18 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_implicit_tearoff_type_arguments() async {
+    var content = '''
+T f<T>(T t) => t;
+int Function(int) g() => f;
+''';
+    var expected = '''
+T f<T>(T t) => t;
+int Function(int) g() => f;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_implicit_type_parameter_bound_nullable() async {
     var content = '''
 class C<T> {
@@ -5169,6 +5360,16 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_int_double_coercion() async {
+    var content = '''
+double f() => 0;
+''';
+    var expected = '''
+double f() => 0;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_is_promotion_implies_non_nullable() async {
     var content = '''
 bool f(Object o) => o is int && o.isEven;
@@ -8913,6 +9114,49 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_var_with_different_types() async {
+    // Based on https://github.com/dart-lang/sdk/issues/47669
+    var content = '''
+class C<T> {
+  T m() => throw 'foo';
+}
+f(bool b, List<C<int>> cs) {
+  var x = !b,
+      y = cs.first,
+      z = y.m();
+}
+''';
+    var expected = '''
+class C<T> {
+  T m() => throw 'foo';
+}
+f(bool b, List<C<int>> cs) {
+  var x = !b,
+      y = cs.first,
+      z = y.m();
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_var_with_different_types_becoming_explicit() async {
+    // When types need to be added to some variables in a declaration but not
+    // others, we handle it by introducing `as` casts.
+    var content = '''
+f(int i, String s) {
+  var x = i, y = s;
+  x = null;
+}
+''';
+    var expected = '''
+f(int i, String s) {
+  var x = i as int?, y = s;
+  x = null;
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_weak_if_visit_weak_subexpression() async {
     var content = '''
 int f(int x, int/*?*/ y) {
diff --git a/pkg/nnbd_migration/test/edge_builder_test.dart b/pkg/nnbd_migration/test/edge_builder_test.dart
index fcec048..2be4a72 100644
--- a/pkg/nnbd_migration/test/edge_builder_test.dart
+++ b/pkg/nnbd_migration/test/edge_builder_test.dart
@@ -70,6 +70,7 @@
         TypeSystemImpl(
           implicitCasts: true,
           isNonNullableByDefault: false,
+          strictCasts: false,
           strictInference: false,
           typeProvider: typeProvider,
         ),
@@ -500,6 +501,7 @@
     var typeSystem = TypeSystemImpl(
       isNonNullableByDefault: false,
       implicitCasts: true,
+      strictCasts: false,
       strictInference: false,
       typeProvider: typeProvider,
     );
diff --git a/pkg/nnbd_migration/test/migration_cli_test.dart b/pkg/nnbd_migration/test/migration_cli_test.dart
index 08b16bc..48c7c49 100644
--- a/pkg/nnbd_migration/test/migration_cli_test.dart
+++ b/pkg/nnbd_migration/test/migration_cli_test.dart
@@ -1114,7 +1114,7 @@
               path: '/_preview/navigationTree.json',
               queryParameters: {'authToken': authToken}),
           headers: {'Content-Type': 'application/json; charset=UTF-8'});
-      var navRoots = jsonDecode(treeResponse.body);
+      var navRoots = jsonDecode(treeResponse.body) as List<Object?>;
       for (final root in navRoots) {
         var navTree =
             NavigationTreeNode.fromJson(root) as NavigationTreeDirectoryNode;
diff --git a/pkg/nnbd_migration/test/migration_visitor_test_base.dart b/pkg/nnbd_migration/test/migration_visitor_test_base.dart
index 9a4294b..85448d0 100644
--- a/pkg/nnbd_migration/test/migration_visitor_test_base.dart
+++ b/pkg/nnbd_migration/test/migration_visitor_test_base.dart
@@ -147,8 +147,15 @@
   Future<CompilationUnit> analyze(String code) async {
     var unit = await super.analyze(code);
     decoratedClassHierarchy = DecoratedClassHierarchy(variables, graph);
-    unit.accept(EdgeBuilder(typeProvider, typeSystem, variables, graph,
-        testSource, null, decoratedClassHierarchy));
+    unit.accept(EdgeBuilder(
+        typeProvider,
+        typeSystem,
+        variables,
+        graph,
+        testSource,
+        null,
+        decoratedClassHierarchy,
+        unit.declaredElement!.library));
     return unit;
   }
 }
diff --git a/pkg/test_runner/lib/src/compiler_configuration.dart b/pkg/test_runner/lib/src/compiler_configuration.dart
index cb968a9..a32b394 100644
--- a/pkg/test_runner/lib/src/compiler_configuration.dart
+++ b/pkg/test_runner/lib/src/compiler_configuration.dart
@@ -828,6 +828,9 @@
       if (_configuration.useQemu) '--no-use-integer-division',
       if (arguments.contains('--print-flow-graph-optimized'))
         '--redirect-isolate-log-to=$tempDir/out.il',
+      if (arguments.contains('--print-flow-graph-optimized') &&
+          (_configuration.isMinified || arguments.contains('--obfuscate')))
+        '--save-obfuscation_map=$tempDir/renames.json',
       ..._replaceDartFiles(arguments, tempKernelFile(tempDir)),
     ];
 
@@ -844,6 +847,7 @@
     var args = [
       arguments.firstWhere((arg) => arg.endsWith('_il_test.dart')),
       '$tempDir/out.il',
+      if (arguments.contains('--obfuscate')) '$tempDir/renames.json',
     ];
 
     return CompilationCommand('compare_il', tempDir, bootstrapDependencies(),
@@ -965,9 +969,10 @@
   List<String> computeCompilerArguments(
       TestFile testFile, List<String> vmOptions, List<String> args) {
     return [
-      if (testFile.ilMatches.isNotEmpty) ...[
+      if (testFile.isVmIntermediateLanguageTest) ...[
         '--print-flow-graph-optimized',
-        '--print-flow-graph-filter=${testFile.ilMatches.join(',')}'
+        '--print-flow-graph-as-json',
+        '--print-flow-graph-filter=@pragma',
       ],
       if (_enableAsserts) '--enable_asserts',
       ...filterVmOptions(vmOptions),
diff --git a/pkg/test_runner/lib/src/fuchsia.dart b/pkg/test_runner/lib/src/fuchsia.dart
index a3880c5..aeeab96 100644
--- a/pkg/test_runner/lib/src/fuchsia.dart
+++ b/pkg/test_runner/lib/src/fuchsia.dart
@@ -11,11 +11,13 @@
 
 class FuchsiaEmulator {
   static final Uri toolsDir =
+      Repository.uri.resolve('third_party/fuchsia/sdk/linux/tools/x64/');
+  static final Uri scriptsDir =
       Repository.uri.resolve('third_party/fuchsia/sdk/linux/bin/');
-  static final String femuTool = toolsDir.resolve('femu.sh').toFilePath();
-  static final String fserveTool = toolsDir.resolve('fserve.sh').toFilePath();
-  static final String fpubTool = toolsDir.resolve('fpublish.sh').toFilePath();
-  static final String fsshTool = toolsDir.resolve('fssh.sh').toFilePath();
+  static final String femuTool = scriptsDir.resolve('femu.sh').toFilePath();
+  static final String fserveTool = toolsDir.resolve('fserve').toFilePath();
+  static final String fpubTool = toolsDir.resolve('fpublish').toFilePath();
+  static final String fsshTool = toolsDir.resolve('fssh').toFilePath();
   static final RegExp emulatorReadyPattern =
       RegExp(r'Using unique host name (.+)\.local\.');
   static final RegExp emulatorPidPattern =
diff --git a/pkg/test_runner/lib/src/test_file.dart b/pkg/test_runner/lib/src/test_file.dart
index 8b61d68..3c71e5b 100644
--- a/pkg/test_runner/lib/src/test_file.dart
+++ b/pkg/test_runner/lib/src/test_file.dart
@@ -211,10 +211,7 @@
       throw FormatException('Unknown feature "$name" in test $filePath');
     });
 
-    var ilMatches = filePath.endsWith('_il_test.dart')
-        ? _parseStringOption(filePath, contents, r'MatchIL\[AOT\]',
-            allowMultiple: true)
-        : const <String>[];
+    final isVmIntermediateLanguageTest = filePath.endsWith('_il_test.dart');
 
     // VM options.
     var vmOptions = <List<String>>[];
@@ -341,7 +338,7 @@
         sharedObjects: sharedObjects,
         otherResources: otherResources,
         experiments: experiments,
-        ilMatches: ilMatches);
+        isVmIntermediateLanguageTest: isVmIntermediateLanguageTest);
   }
 
   /// A special fake test file for representing a VM unit test written in C++.
@@ -363,7 +360,7 @@
         sharedObjects = [],
         otherResources = [],
         experiments = [],
-        ilMatches = [],
+        isVmIntermediateLanguageTest = false,
         super(null, null, []);
 
   TestFile._(Path suiteDirectory, Path path, List<StaticError> expectedErrors,
@@ -384,7 +381,7 @@
       this.sharedObjects,
       this.otherResources,
       this.experiments,
-      this.ilMatches = const <String>[]})
+      this.isVmIntermediateLanguageTest = false})
       : super(suiteDirectory, path, expectedErrors) {
     assert(!isMultitest || dartOptions.isEmpty);
   }
@@ -403,6 +400,7 @@
   final bool hasRuntimeError;
   final bool hasStaticWarning;
   final bool hasCrash;
+  final bool isVmIntermediateLanguageTest;
 
   /// The features that a test configuration must support in order to run this
   /// test.
@@ -411,9 +409,6 @@
   /// requirements, the test is implicitly skipped.
   final List<Feature> requirements;
 
-  /// List of functions which will have their IL verified (in AOT mode).
-  final List<String> ilMatches;
-
   final List<String> sharedOptions;
   final List<String> dartOptions;
   final List<String> dart2jsOptions;
@@ -479,6 +474,7 @@
   final bool hasStaticWarning;
   final bool hasSyntaxError;
   bool get hasCrash => _origin.hasCrash;
+  bool get isVmIntermediateLanguageTest => _origin.isVmIntermediateLanguageTest;
 
   _MultitestFile(this._origin, Path path, this.multitestKey,
       List<StaticError> expectedErrors,
@@ -493,7 +489,6 @@
   String get packages => _origin.packages;
 
   List<Feature> get requirements => _origin.requirements;
-  List<String> get ilMatches => _origin.ilMatches;
   List<String> get dart2jsOptions => _origin.dart2jsOptions;
   List<String> get dartOptions => _origin.dartOptions;
   List<String> get ddcOptions => _origin.ddcOptions;
diff --git a/pkg/vm/bin/compare_il.dart b/pkg/vm/bin/compare_il.dart
index 9d9febd..5b9caa3 100644
--- a/pkg/vm/bin/compare_il.dart
+++ b/pkg/vm/bin/compare_il.dart
@@ -5,185 +5,157 @@
 // This is a helper script which performs IL matching for AOT IL tests.
 // See runtime/docs/infra/il_tests.md for more information.
 
+import 'dart:collection';
+import 'dart:convert';
 import 'dart:io';
+import 'dart:mirrors';
 
-void main(List<String> args) {
-  if (args.length != 2) {
-    throw 'Usage: compare_il <*_il_test.dart> <output.il>';
+import 'package:collection/collection.dart';
+
+import 'package:vm/testing/il_matchers.dart';
+
+void main(List<String> args) async {
+  getName = MirrorSystem.getName;
+
+  if (args.length < 2 || args.length > 3) {
+    throw 'Usage: compare_il <*_il_test.dart> <output.il> [<renames.json>]';
   }
 
   final testFile = args[0];
   final ilFile = args[1];
+  final renamesFile = args.length == 3 ? args[2] : null;
 
-  final graphs = _extractGraphs(ilFile);
+  final rename = _loadRenames(renamesFile);
+  final graphs = _loadGraphs(ilFile, rename);
+  final tests = await _loadTestCases(testFile);
 
-  final expectations = _extractExpectations(testFile);
+  Map<String, FlowGraph> findMatchingGraphs(String name) {
+    final suffix = '_${rename(name)}';
+    return graphs.entries.firstWhere((f) => f.key.contains(suffix)).value;
+  }
 
-  for (var expectation in expectations.entries) {
-    // Find a graph for this expectation. We expect that function names are
-    // unique enough to identify a specific graph.
-    final graph =
-        graphs.entries.singleWhere((e) => e.key.contains(expectation.key));
-
-    // Extract the list of opcodes, ignoring irrelevant things like
-    // ParallelMove.
-    final gotOpcodesIgnoringMoves = graph.value
-        .where((instr) => instr.opcode != 'ParallelMove')
-        .map((instr) => instr.opcode)
-        .toList();
-
-    // Check that expectations are the prefix of gotOpcodesIgnoringMoves.
-    print('Matching ${graph.key}');
-    for (var i = 0; i < expectation.value.length; i++) {
-      final gotOpcode = gotOpcodesIgnoringMoves[i];
-      final expectedOpcode = expectation.value[i];
-      if (gotOpcode != expectedOpcode) {
-        throw 'Failed to match graph of ${graph.key} to '
-            'expectations for ${expectation.key} at instruction ${i}: '
-            'got ${gotOpcode} expected ${expectedOpcode}';
-      }
-    }
-    print('... ok');
+  for (var test in tests) {
+    test.run(findMatchingGraphs(test.name));
   }
 
   exit(0); // Success.
 }
 
-// IL instruction extracted from flow graph dump.
-class Instruction {
-  final String raw;
+class TestCase {
+  final String name;
+  final String phasesFilter;
+  final LibraryMirror library;
 
-  Instruction(this.raw);
+  late final phases =
+      phasesFilter.split(',').expand(_expandPhasePattern).toList();
 
-  String get opcode {
-    final match = instructionPattern.firstMatch(raw)!;
-    final op = match.namedGroup('opcode')!;
-    final blockType = match.namedGroup('block_type');
+  TestCase({
+    required this.name,
+    required this.phasesFilter,
+    required this.library,
+  });
 
-    // Handle blocks which look like "B%d[%s]".
-    if (blockType != null) {
-      return blockTypes[blockType]!;
-    }
-
-    // Handle parallel moves specially.
-    if (op.startsWith('ParallelMove')) {
-      return 'ParallelMove';
-    }
-
-    // Handle branches.
-    if (op.startsWith(branchIfPrefix)) {
-      return 'Branch(${op.substring(branchIfPrefix.length)})';
-    }
-
-    // Normal instruction.
-    return op;
+  void run(Map<String, FlowGraph> graphs) {
+    print('matching IL (${phases.join(', ')}) for $name');
+    library.invoke(MirrorSystem.getSymbol('matchIL\$$name'),
+        phases.map((phase) => graphs[phase]!).toList());
+    print('... ok');
   }
 
-  @override
-  String toString() => 'Instruction($opcode)';
+  /// Parses phase filter components (same format as --compiler-passes flag).
+  static List<String> _expandPhasePattern(String pattern) {
+    bool printBefore = false, printAfter = false;
+    switch (pattern[0]) {
+      case '[':
+        printBefore = true;
+        break;
+      case ']':
+        printAfter = true;
+        break;
+      case '*':
+        printBefore = printAfter = true;
+        break;
+    }
 
-  static final instructionPattern = RegExp(
-      r'^\s*\d+:\s+(v\d+ <- )?(?<opcode>[^:[(]+(?<block_type>\[[\w ]+\])?)');
+    final phaseName =
+        (printBefore || printAfter) ? pattern.substring(1) : pattern;
 
-  static const blockTypes = {
-    '[join]': 'JoinEntry',
-    '[target]': 'TargetEntry',
-    '[graph]': 'GraphEntry',
-    '[function entry]': 'FunctionEntry'
-  };
+    if (!printBefore && !printAfter) {
+      printAfter = true;
+    }
 
-  static const branchIfPrefix = 'Branch if ';
+    return [
+      if (printBefore) 'Before $phaseName',
+      if (printAfter) 'After $phaseName',
+    ];
+  }
 }
 
-Map<String, List<Instruction>> _extractGraphs(String ilFile) {
-  final graphs = <String, List<Instruction>>{};
+/// Extracts test cases from the given file by looking for functions
+/// marked with @pragma('vm:testing:print-flow-graph', ...).
+Future<Set<TestCase>> _loadTestCases(String testFile) async {
+  final mirrorSystem = currentMirrorSystem();
+  final library =
+      await mirrorSystem.isolate.loadUri(File(testFile).absolute.uri);
 
-  final reader = LineReader(ilFile);
+  pragma? getPragma(DeclarationMirror decl, String name) => decl.metadata
+      .map((m) => m.reflectee)
+      .whereType<pragma>()
+      .firstWhereOrNull((p) => p.name == name);
 
-  var instructions = <Instruction>[];
-  while (reader.hasMore) {
-    if (reader.testNext('*** BEGIN CFG')) {
-      reader.next(); // Skip phase name.
-      final functionName = reader.next();
-      while (!reader.testNext('*** END CFG')) {
-        var curr = reader.next();
+  final cases = LinkedHashSet<TestCase>(
+    equals: (a, b) => a.name == b.name,
+    hashCode: (a) => a.name.hashCode,
+  );
 
-        // If instruction line ends with '{' search for a matching '}' (it will
-        // be on its own line).
-        if (curr.endsWith('{')) {
-          do {
-            curr += '\n' + reader.current;
-          } while (reader.next() != '}');
-        }
-
-        instructions.add(Instruction(curr));
-      }
-
-      graphs[functionName] = instructions;
-      instructions = <Instruction>[];
-    } else {
-      reader.next();
+  void processDeclaration(DeclarationMirror decl) {
+    final p = getPragma(decl, 'vm:testing:print-flow-graph');
+    if (p != null) {
+      final name = MirrorSystem.getName(decl.simpleName);
+      final added = cases.add(TestCase(
+        name: name,
+        phasesFilter: (p.options as String?) ?? 'AllocateRegisters',
+        library: library,
+      ));
+      if (!added) throw 'duplicate test case with name $name';
     }
   }
 
+  for (var decl in library.declarations.values) {
+    if (decl is ClassMirror) {
+      decl.declarations.values.forEach(processDeclaration);
+    } else {
+      processDeclaration(decl);
+    }
+  }
+
+  return cases;
+}
+
+Map<String, Map<String, FlowGraph>> _loadGraphs(String ilFile, Renamer rename) {
+  final graphs = <String, Map<String, FlowGraph>>{};
+
+  for (var graph in File(ilFile).readAsLinesSync()) {
+    final m = jsonDecode(graph) as Map<String, dynamic>;
+    graphs.putIfAbsent(m['f'], () => {})[m['p']] =
+        FlowGraph(m['b'], m['desc'], m['flags'], rename: rename);
+  }
+
   return graphs;
 }
 
-Map<String, List<String>> _extractExpectations(String testFile) {
-  final expectations = <String, List<String>>{};
-
-  final reader = LineReader(testFile);
-
-  final matchILPattern = RegExp(r'^// MatchIL\[AOT\]=(?<value>.*)$');
-  final matcherPattern = RegExp(r'^// __ (?<value>.*)$');
-
-  var matchers = <String>[];
-  while (reader.hasMore) {
-    var functionName = reader.matchNext(matchILPattern);
-    if (functionName != null) {
-      // Read comment block which follows `// MatchIL[AOT]=...`.
-      while (reader.hasMore && reader.current.startsWith('//')) {
-        final match = matcherPattern.firstMatch(reader.next());
-        if (match != null) {
-          matchers.add(match.namedGroup('value')!);
-        }
-      }
-      expectations[functionName] = matchers;
-      matchers = <String>[];
-    } else {
-      reader.next();
-    }
+Renamer _loadRenames(String? renamesFile) {
+  // Load renames map if present.
+  if (renamesFile == null) {
+    return (v) => v;
   }
 
-  return expectations;
-}
+  final list =
+      (jsonDecode(File(renamesFile).readAsStringSync()) as List).cast<String>();
 
-class LineReader {
-  final List<String> lines;
-  int lineno = 0;
+  final renamesMap = <String, String>{
+    for (var i = 0; i < list.length; i += 2) list[i]: list[i + 1],
+  };
 
-  LineReader(String path) : lines = File(path).readAsLinesSync();
-
-  String get current => lines[lineno];
-
-  bool get hasMore => lineno < lines.length;
-
-  String next() {
-    final curr = current;
-    lineno++;
-    return curr;
-  }
-
-  bool testNext(String expected) {
-    if (current == expected) {
-      next();
-      return true;
-    }
-    return false;
-  }
-
-  String? matchNext(RegExp pattern) {
-    final m = pattern.firstMatch(current);
-    return m?.namedGroup('value');
-  }
+  return (v) => renamesMap[v] ?? v;
 }
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 8854910..f18f0d2 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -333,9 +333,10 @@
     final generator = this.generator ??= IncrementalCompiler(options, script);
     errorsPlain.clear();
     errorsColorized.clear();
-    final component = await generator.compile(entryPoint: script);
+    final compilerResult = await generator.compile(entryPoint: script);
+    final component = compilerResult.component;
     return new CompilerResult(component, const {},
-        generator.getClassHierarchy(), generator.getCoreTypes());
+        compilerResult.classHierarchy, compilerResult.coreTypes);
   }
 
   void accept() => generator!.accept();
@@ -353,7 +354,8 @@
     // TODO(VM TEAM): This does not seem safe. What if cloning while having
     // pending deltas for instance?
     generator.resetDeltaState();
-    Component fullComponent = await generator.compile();
+    IncrementalCompilerResult compilerResult = await generator.compile();
+    Component fullComponent = compilerResult.component;
 
     // Assume fileSystem is HybridFileSystem because that is the setup where
     // clone should be used for.
diff --git a/pkg/vm/lib/incremental_compiler.dart b/pkg/vm/lib/incremental_compiler.dart
index 3ad1270..08b00e7 100644
--- a/pkg/vm/lib/incremental_compiler.dart
+++ b/pkg/vm/lib/incremental_compiler.dart
@@ -23,8 +23,8 @@
 
   // Component that reflect the state that was most recently accepted by the
   // client. Is [null], if no compilation results were accepted by the client.
-  Component? _lastKnownGood;
-  late List<Component> _pendingDeltas;
+  IncrementalCompilerResult? _lastKnownGood;
+  late List<IncrementalCompilerResult> _pendingDeltas;
   CompilerOptions _compilerOptions;
   bool initialized = false;
   bool fullComponent = false;
@@ -34,7 +34,7 @@
 
   Uri get entryPoint => _entryPoint;
   IncrementalKernelGenerator get generator => _generator;
-  Component? get lastKnownGoodComponent => _lastKnownGood;
+  IncrementalCompilerResult? get lastKnownGoodResult => _lastKnownGood;
 
   IncrementalCompiler(this._compilerOptions, this._entryPoint,
       {this.initializeFromDillUri, bool incrementalSerialization: true})
@@ -44,7 +44,7 @@
     }
     _generator = new IncrementalKernelGenerator(_compilerOptions, _entryPoint,
         initializeFromDillUri, false, incrementalSerializer);
-    _pendingDeltas = <Component>[];
+    _pendingDeltas = <IncrementalCompilerResult>[];
   }
 
   IncrementalCompiler.forExpressionCompilationOnly(
@@ -52,41 +52,46 @@
       : forExpressionCompilationOnly = true {
     _generator = new IncrementalKernelGenerator.forExpressionCompilationOnly(
         _compilerOptions, _entryPoint, component);
-    _pendingDeltas = <Component>[];
+    _pendingDeltas = <IncrementalCompilerResult>[];
   }
 
   /// Recompiles invalidated files, produces incremental component.
   ///
   /// 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 {
+  Future<IncrementalCompilerResult> compile({Uri? entryPoint}) async {
     final task = new TimelineTask();
     try {
       task.start("IncrementalCompiler.compile");
       _entryPoint = entryPoint ?? _entryPoint;
       List<Uri>? entryPoints;
       if (entryPoint != null) entryPoints = [entryPoint];
-      Component component = await _generator.computeDelta(
+      IncrementalCompilerResult compilerResult = await _generator.computeDelta(
           entryPoints: entryPoints, fullComponent: fullComponent);
       initialized = true;
       fullComponent = false;
-      _pendingDeltas.add(component);
+      _pendingDeltas.add(compilerResult);
       return _combinePendingDeltas(false);
     } finally {
       task.finish();
     }
   }
 
-  _combinePendingDeltas(bool includePlatform) {
+  IncrementalCompilerResult _combinePendingDeltas(bool includePlatform) {
     Procedure? mainMethod;
     NonNullableByDefaultCompiledMode compilationMode =
         NonNullableByDefaultCompiledMode.Invalid;
     Map<Uri, Library> combined = <Uri, Library>{};
     Map<Uri, Source> uriToSource = new Map<Uri, Source>();
-    for (Component delta in _pendingDeltas) {
+    ClassHierarchy? classHierarchy;
+    CoreTypes? coreTypes;
+    for (IncrementalCompilerResult deltaResult in _pendingDeltas) {
+      Component delta = deltaResult.component;
       if (delta.mainMethod != null) {
         mainMethod = delta.mainMethod;
       }
+      classHierarchy ??= deltaResult.classHierarchy;
+      coreTypes ??= deltaResult.coreTypes;
       compilationMode = delta.mode;
       uriToSource.addAll(delta.uriToSource);
       for (Library library in delta.libraries) {
@@ -98,14 +103,14 @@
     }
 
     // TODO(vegorov) this needs to merge metadata repositories from deltas.
-    return new Component(
-        libraries: combined.values.toList(), uriToSource: uriToSource)
-      ..setMainMethodAndMode(mainMethod?.reference, true, compilationMode);
+    return new IncrementalCompilerResult(
+        new Component(
+            libraries: combined.values.toList(), uriToSource: uriToSource)
+          ..setMainMethodAndMode(mainMethod?.reference, true, compilationMode),
+        classHierarchy: classHierarchy,
+        coreTypes: coreTypes);
   }
 
-  CoreTypes? getCoreTypes() => _generator.getCoreTypes();
-  ClassHierarchy? getClassHierarchy() => _generator.getClassHierarchy();
-
   /// This lets incremental compiler know that results of last [compile] call
   /// were accepted, don't need to be included into subsequent [compile] calls
   /// results.
@@ -117,29 +122,33 @@
     Map<Uri, Library> combined = <Uri, Library>{};
     Map<Uri, Source> uriToSource = <Uri, Source>{};
 
-    Component? lastKnownGood = _lastKnownGood;
+    IncrementalCompilerResult? lastKnownGood = _lastKnownGood;
     if (lastKnownGood != null) {
       // TODO(aam): Figure out how to skip no-longer-used libraries from
       // [_lastKnownGood] libraries.
-      for (Library library in lastKnownGood.libraries) {
+      for (Library library in lastKnownGood.component.libraries) {
         combined[library.importUri] = library;
       }
-      uriToSource.addAll(lastKnownGood.uriToSource);
+      uriToSource.addAll(lastKnownGood.component.uriToSource);
     }
 
-    Component candidate = _combinePendingDeltas(true);
+    IncrementalCompilerResult result = _combinePendingDeltas(true);
+    Component candidate = result.component;
     for (Library library in candidate.libraries) {
       combined[library.importUri] = library;
     }
     uriToSource.addAll(candidate.uriToSource);
 
-    _lastKnownGood = lastKnownGood = new Component(
-      libraries: combined.values.toList(),
-      uriToSource: uriToSource,
-    )..setMainMethodAndMode(
-        candidate.mainMethod?.reference, true, candidate.mode);
+    _lastKnownGood = lastKnownGood = new IncrementalCompilerResult(
+        new Component(
+          libraries: combined.values.toList(),
+          uriToSource: uriToSource,
+        )..setMainMethodAndMode(
+            candidate.mainMethod?.reference, true, candidate.mode),
+        classHierarchy: result.classHierarchy,
+        coreTypes: result.coreTypes);
     for (final repo in candidate.metadata.values) {
-      lastKnownGood.addMetadataRepository(repo);
+      lastKnownGood.component.addMetadataRepository(repo);
     }
     _pendingDeltas.clear();
   }
@@ -164,10 +173,10 @@
     // sure it's "updated back".
     // Note that if accept was never called [_lastKnownGood] is null (and
     // loading from it below is basically nonsense, it will just start over).
-    _lastKnownGood?.relink();
+    _lastKnownGood?.component.relink();
 
     _generator = new IncrementalKernelGenerator.fromComponent(_compilerOptions,
-        _entryPoint, _lastKnownGood, false, incrementalSerializer);
+        _entryPoint, _lastKnownGood?.component, false, incrementalSerializer);
     await _generator.computeDelta(entryPoints: [_entryPoint]);
   }
 
diff --git a/pkg/vm/lib/testing/il_matchers.dart b/pkg/vm/lib/testing/il_matchers.dart
new file mode 100644
index 0000000..1c2f883
--- /dev/null
+++ b/pkg/vm/lib/testing/il_matchers.dart
@@ -0,0 +1,462 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 library to facilitate programmatic matching against flow graphs
+/// collected during IL tests. See runtime/docs/infra/il_tests.md for more
+/// info.
+
+typedef Renamer = String Function(String);
+
+/// Flow graph parsed from --print-flow-graph-as-json output.
+class FlowGraph {
+  final List<dynamic> blocks;
+  final Map<String, InstructionDescriptor> descriptors;
+  final Map<String, dynamic> flags;
+  final Renamer rename;
+
+  FlowGraph(this.blocks, Map<String, dynamic> desc, this.flags,
+      {required this.rename})
+      : descriptors = {
+          for (var e in desc.entries)
+            e.key: InstructionDescriptor.fromJson(e.value)
+        };
+
+  bool get soundNullSafety => flags['nnbd'];
+
+  /// Match the sequence of blocks in this flow graph against the given
+  /// sequence of matchers: `expected[i]` is expected to match `blocks[i]`,
+  /// but there can be more blocks in the graph than matchers (the suffix is
+  /// ignored).
+  ///
+  /// If [env] is provided it will be used as matching environment, otherwise
+  /// a fresh instance of [Env] will be created and used.
+  ///
+  /// This function returns the populated matching environment.
+  Env match(List<Matcher> expected, {Env? env}) {
+    env ??= Env(rename: rename, descriptors: descriptors);
+
+    for (var i = 0; i < expected.length; i++) {
+      final result = expected[i].match(env, blocks[i]);
+      if (result.isFail) {
+        print('Failed to match: ${result.message}');
+        dump();
+        throw 'Failed to match';
+      }
+    }
+
+    return env;
+  }
+
+  void dump() {
+    for (var block in blocks) {
+      print('B${block['b']}[${block['o']}]');
+      for (var instr in [...?block['d'], ...?block['is']]) {
+        final v = instr['v'] ?? -1;
+        final prefix = v != -1 ? 'v$v <- ' : '';
+        final inputs = instr['i']?.map((v) => 'v$v').join(', ') ?? '';
+        final attrs = descriptors[instr['o']]
+            ?.attributeIndex
+            .entries
+            .map((e) => '${e.key}: ${instr['d'][e.value]}')
+            .join(',');
+        final attrsWrapped = attrs != null ? '[$attrs]' : '';
+        print('  ${prefix}${instr['o']}$attrsWrapped($inputs)');
+      }
+    }
+  }
+}
+
+class InstructionDescriptor {
+  final List<String> attributes;
+  final Map<String, int> attributeIndex;
+
+  InstructionDescriptor.fromJson(List<dynamic> attrs)
+      : this._(attrs.map((v) => _demangle(v)).toList());
+
+  InstructionDescriptor._(List<String> attrs)
+      : attributes = attrs.cast<String>(),
+        attributeIndex = {for (var i = 0; i < attrs.length; i++) attrs[i]: i};
+
+  static String _demangle(String v) {
+    final prefixLen = v.startsWith('&') ? 1 : 0;
+    final suffixLen = v.endsWith('()') ? 2 : 0;
+    return v.substring(prefixLen, v.length - suffixLen);
+  }
+}
+
+/// Matching environment.
+///
+/// This is fundamentally just a name to id mapping which allows to track
+/// correspondence between names given to some matchers and blocks/instructions
+/// which matched those matchers.
+///
+/// This object is also used to carry around auxiliary information which might
+/// be needed for matching, e.g. [Renamer].
+class Env {
+  final Map<String, InstructionDescriptor> descriptors;
+  final Renamer rename;
+  final Map<String, int> nameToId = {};
+
+  Env({required this.rename, required this.descriptors});
+
+  void bind(String name, Map<String, dynamic> instrOrBlock) {
+    final id = instrOrBlock['v'] ?? instrOrBlock['b'];
+
+    if (nameToId.containsKey(name) && nameToId[name] != id) {
+      throw 'Binding mismatch for $name: got ${nameToId[name]} and $id';
+    }
+
+    nameToId[name] = id;
+  }
+}
+
+abstract class Matcher {
+  /// Try matching this matcher against the given value. Returns
+  /// [MatchStatus.matched] if match succeeded and an instance of
+  /// [MatchStatus.fail] otherwise.
+  MatchStatus match(Env e, dynamic v);
+}
+
+class MatchStatus {
+  final String? message;
+
+  const MatchStatus._matched() : message = null;
+  const MatchStatus.fail(String message) : message = message;
+
+  bool get isMatch => message == null;
+  bool get isFail => message != null;
+
+  static const MatchStatus matched = MatchStatus._matched();
+
+  void expectMatched(String s) {
+    if (message != null) {
+      throw 'Failed to match: $message';
+    }
+  }
+}
+
+/// Matcher which always succeeds.
+class _AnyMatcher implements Matcher {
+  const _AnyMatcher();
+
+  @override
+  MatchStatus match(Env e, v) => MatchStatus.matched;
+
+  @override
+  String toString() {
+    return '*';
+  }
+}
+
+/// Matcher which updates matching environment when it succeeds.
+class _BoundMatcher implements Matcher {
+  final String name;
+  final Matcher nested;
+
+  _BoundMatcher(this.name, this.nested);
+
+  @override
+  MatchStatus match(Env e, dynamic v) {
+    final result = nested.match(e, v);
+    if (result.isMatch) {
+      e.bind(name, v);
+    }
+    return result;
+  }
+
+  @override
+  String toString() {
+    return '$name <- $nested';
+  }
+}
+
+/// Matcher which matches a specified value [v].
+class _EqualsMatcher implements Matcher {
+  final dynamic v;
+
+  _EqualsMatcher(this.v);
+
+  @override
+  MatchStatus match(Env e, v) {
+    if (this.v == v) {
+      return MatchStatus.matched;
+    }
+
+    // Some instructions refer to obfuscated names, try to rename
+    // the expectation and try again.
+    if (this.v is String && v is String && e.rename(this.v) == v) {
+      return MatchStatus.matched;
+    }
+
+    return this.v == v
+        ? MatchStatus.matched
+        : MatchStatus.fail('expected ${this.v} got $v');
+  }
+
+  @override
+  String toString() => '$v';
+}
+
+/// Matcher which matches the value which is equivalent to the binding
+/// with the given [name] in the matching environment.
+///
+/// If this matcher is [binding] then it will populate the binding in the
+/// matching environment if the [name] is not bound yet on the first call
+/// to [match]. Otherwise if the [name] is not bound when [match] is called
+/// an exception will be thrown.
+///
+/// Binding matchers are used when we might see the use of a value before its
+/// definition (e.g. we usually use the name of the block in the `Goto` or
+/// `Branch` before we see the block itself).
+class _RefMatcher implements Matcher {
+  final String name;
+  final bool binding;
+
+  _RefMatcher(this.name, {this.binding = false});
+
+  @override
+  MatchStatus match(Env e, v) {
+    if (e.nameToId.containsKey(name)) {
+      return e.nameToId[name] == v
+          ? MatchStatus.matched
+          : MatchStatus.fail(
+              'expected $name to bind to ${e.nameToId[name]} but got $v');
+    }
+
+    if (!binding) {
+      throw UnimplementedError('Unbound reference to ${name}');
+    }
+
+    e.nameToId[name] = v;
+    return MatchStatus.matched;
+  }
+
+  @override
+  String toString() {
+    return name;
+  }
+}
+
+/// A wrapper which matches a list of matchers against a list of values.
+class _ListMatcher implements Matcher {
+  final List<Matcher> expected;
+
+  _ListMatcher(this.expected);
+
+  @override
+  MatchStatus match(Env e, dynamic got) {
+    if (got is! List) {
+      return MatchStatus.fail('expected List, got ${got.runtimeType}');
+    }
+
+    if (expected.length > got.length) {
+      return MatchStatus.fail(
+          'expected at least ${expected.length} elements got ${got.length}');
+    }
+
+    for (var i = 0; i < expected.length; i++) {
+      final result = expected[i].match(e, got[i]);
+      if (result.isFail) {
+        return MatchStatus.fail(
+            'mismatch at index ${i}, expected ${expected[i]} '
+            'got ${got[i]}: ${result.message}');
+      }
+    }
+
+    if (expected.last is _AnyMatcher || expected.length == got.length) {
+      return MatchStatus.matched;
+    }
+
+    return MatchStatus.fail(
+        'expected exactly ${expected.length} elements got ${got.length}');
+  }
+
+  @override
+  String toString() => '[${expected.join(',')}]';
+}
+
+/// A matcher which matches a block of the specified [kind] and contents.
+///
+/// Contents are specified as a sequence of matchers ([body]). For each of
+/// those matchers a matching block is expected to contain at least one
+/// instruction that matches it. Matching is done in order: first we scan
+/// the block until we find the match for the first matcher in body, then
+/// we continue scanning until we find the match for the second and so on.
+class _BlockMatcher implements Matcher {
+  final String kind;
+  final List<Matcher> body;
+
+  _BlockMatcher(this.kind, [this.body = const []]);
+
+  @override
+  MatchStatus match(Env e, covariant Map<String, dynamic> block) {
+    if (block['o'] != '${kind}Entry') {
+      return MatchStatus.fail(
+          'Expected block of kind ${kind} got ${block['o']} '
+          'when matching B${block['b']}');
+    }
+
+    final gotBody = [...?block['d'], ...?block['is']];
+
+    var matcherIndex = 0;
+    for (int i = 0; i < gotBody.length && matcherIndex < body.length; i++) {
+      if (body[matcherIndex].match(e, gotBody[i]).isMatch) {
+        matcherIndex++;
+      }
+    }
+    if (matcherIndex != body.length) {
+      return MatchStatus.fail('Unmatched instruction: ${body[matcherIndex]} '
+          'in block B${block['b']}');
+    }
+    return MatchStatus.matched;
+  }
+}
+
+/// A matcher for instruction's named attributes.
+///
+/// Attributes are resolved to their indices through [Env.descriptors].
+class _AttributesMatcher implements Matcher {
+  final String op;
+  final Map<String, Matcher> matchers;
+
+  _ListMatcher? impl;
+
+  _AttributesMatcher(this.op, this.matchers);
+
+  @override
+  MatchStatus match(Env e, dynamic v) {
+    impl ??= _ListMatcher(e.descriptors[op]!.attributes
+        .map((name) => matchers[name] ?? const _AnyMatcher())
+        .toList());
+    return impl!.match(e, v);
+  }
+
+  @override
+  String toString() {
+    return matchers.toString();
+  }
+}
+
+/// Matcher which matches an instruction with opcode [op] and properties
+/// specified in [matchers] map.
+class InstructionMatcher implements Matcher {
+  final String op;
+  final Map<String, Matcher> matchers;
+
+  InstructionMatcher(
+      {required String op, List<Matcher>? data, List<Matcher>? inputs})
+      : this._(op: op, matchers: {
+          if (data != null) 'd': _ListMatcher(data),
+          if (inputs != null) 'i': _ListMatcher(inputs),
+        });
+
+  InstructionMatcher._({
+    required this.op,
+    required this.matchers,
+  });
+
+  @override
+  MatchStatus match(Env e, covariant Map<String, dynamic> instr) {
+    if (instr['o'] != op) {
+      return MatchStatus.fail('expected instruction ${op} got ${instr['o']}');
+    }
+
+    for (var entry in matchers.entries) {
+      final result = entry.value.match(e, instr[entry.key]);
+      if (result.isFail) {
+        return result;
+      }
+    }
+
+    return MatchStatus.matched;
+  }
+
+  @override
+  String toString() {
+    return '$op($matchers)';
+  }
+}
+
+/// This class uses `noSuchMethod` to allow writing code like
+///
+/// ```
+/// match.Op(in0, ..., inN, attr0: a0, ..., attrK: aK)
+/// ```
+///
+/// This will produce an instruction matcher which matches opcode `Op` and
+/// expects `in0, ..., inN` to match instructions inputs, while `a0, ...`
+/// matchers are expected to match attributes with names `attr0, ...`.
+class Matchers {
+  _BlockMatcher block(String kind, [List<dynamic> body = const []]) {
+    return _BlockMatcher(kind, List<Matcher>.from(body));
+  }
+
+  final _AnyMatcher any = const _AnyMatcher();
+
+  InstructionMatcher Goto(String dest) =>
+      InstructionMatcher._(op: 'Goto', matchers: {
+        's': _ListMatcher([_blockRef(dest)])
+      });
+
+  InstructionMatcher Branch(InstructionMatcher compare,
+          {String? ifTrue, String? ifFalse}) =>
+      InstructionMatcher._(op: 'Branch', matchers: {
+        'cc': compare,
+        's': _ListMatcher([
+          ifTrue != null ? _blockRef(ifTrue) : any,
+          ifFalse != null ? _blockRef(ifFalse) : any,
+        ]),
+      });
+
+  @override
+  Object? noSuchMethod(Invocation invocation) {
+    final data = {
+      for (var e in invocation.namedArguments.entries)
+        getName(e.key): Matchers._toAttributeMatcher(e.value),
+    };
+    final inputs =
+        invocation.positionalArguments.map(Matchers._toInputMatcher).toList();
+    final op = getName(invocation.memberName);
+    return InstructionMatcher._(op: op, matchers: {
+      if (data.isNotEmpty) 'd': _AttributesMatcher(op, data),
+      if (inputs.isNotEmpty) 'i': _ListMatcher(inputs),
+    });
+  }
+
+  static Matcher _blockRef(String name) => _RefMatcher(name, binding: true);
+
+  static Matcher _toAttributeMatcher(dynamic v) {
+    if (v is Matcher) {
+      return v;
+    } else {
+      return _EqualsMatcher(v);
+    }
+  }
+
+  static Matcher _toInputMatcher(dynamic v) {
+    if (v is Matcher) {
+      return v;
+    } else if (v is String) {
+      return _RefMatcher(v);
+    } else {
+      throw ArgumentError.value(
+          v, 'v', 'Expected either a Matcher or a String (binding name)');
+    }
+  }
+}
+
+/// Extension which enables `'name' << matcher` syntax for creating bound
+/// matchers.
+extension BindingExtension on String {
+  Matcher operator <<(Matcher matcher) {
+    return _BoundMatcher(this, matcher);
+  }
+}
+
+final dynamic match = Matchers();
+
+/// This file should not depend on dart:mirrors because it is imported into
+/// tests, which are compiled in AOT mode. So instead we let compare_il driver
+/// set this field.
+late String Function(Symbol) getName;
diff --git a/pkg/vm/lib/transformations/ffi/abi.dart b/pkg/vm/lib/transformations/ffi/abi.dart
new file mode 100644
index 0000000..04bc8e2
--- /dev/null
+++ b/pkg/vm/lib/transformations/ffi/abi.dart
@@ -0,0 +1,278 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. 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';
+
+// TODO(http://dartbug.com/47823): Remove this copy of `Abi`.
+
+/// The hardware architectures the Dart VM runs on.
+enum _Architecture {
+  arm,
+  arm64,
+  ia32,
+  x64,
+}
+
+extension on _Architecture {
+  /// The size of integer registers and memory addresses in bytes.
+  int get wordSize {
+    switch (this) {
+      case _Architecture.arm:
+      case _Architecture.ia32:
+        return 4;
+      case _Architecture.arm64:
+      case _Architecture.x64:
+        return 8;
+    }
+  }
+}
+
+/// The operating systems the Dart VM runs on.
+enum _OS {
+  android,
+  fuchsia,
+  ios,
+  linux,
+  macos,
+  windows,
+}
+
+/// An application binary interface (ABI).
+///
+/// An ABI defines the memory layout of data
+/// and the function call protocol for native code.
+/// It is usually defined by the an operating system for each
+/// architecture that operating system runs on.
+///
+/// The Dart VM can run on a variety of operating systems and architectures.
+/// Supported ABIs are represented by `Abi` objects.
+/// See [values] for all the supported ABIs.
+class Abi {
+  /// The application binary interface for Android on the Arm architecture.
+  static const androidArm = _androidArm;
+
+  /// The application binary interface for Android on the Arm64 architecture.
+  static const androidArm64 = _androidArm64;
+
+  /// The application binary interface for Android on the IA32 architecture.
+  static const androidIA32 = _androidIA32;
+
+  /// The application binary interface for android on the X64 architecture.
+  static const androidX64 = _androidX64;
+
+  /// The application binary interface for Fuchsia on the Arm64 architecture.
+  static const fuchsiaArm64 = _fuchsiaArm64;
+
+  /// The application binary interface for Fuchsia on the X64 architecture.
+  static const fuchsiaX64 = _fuchsiaX64;
+
+  /// The application binary interface for iOS on the Arm architecture.
+  static const iosArm = _iosArm;
+
+  /// The application binary interface for iOS on the Arm64 architecture.
+  static const iosArm64 = _iosArm64;
+
+  /// The application binary interface for iOS on the X64 architecture.
+  static const iosX64 = _iosX64;
+
+  /// The application binary interface for Linux on the Arm architecture.
+  ///
+  /// Does not distinguish between hard and soft fp. Currently, no uses of Abi
+  /// require this distinction.
+  static const linuxArm = _linuxArm;
+
+  /// The application binary interface for linux on the Arm64 architecture.
+  static const linuxArm64 = _linuxArm64;
+
+  /// The application binary interface for linux on the IA32 architecture.
+  static const linuxIA32 = _linuxIA32;
+
+  /// The application binary interface for linux on the X64 architecture.
+  static const linuxX64 = _linuxX64;
+
+  /// The application binary interface for MacOS on the Arm64 architecture.
+  static const macosArm64 = _macosArm64;
+
+  /// The application binary interface for MacOS on the X64 architecture.
+  static const macosX64 = _macosX64;
+
+  /// The application binary interface for Windows on the Arm64 architecture.
+  static const windowsArm64 = _windowsArm64;
+
+  /// The application binary interface for Windows on the IA32 architecture.
+  static const windowsIA32 = _windowsIA32;
+
+  /// The application binary interface for Windows on the X64 architecture.
+  static const windowsX64 = _windowsX64;
+
+  /// The ABIs that the DartVM can run on, sorted alphabetically.
+  ///
+  /// Does not contain macosIA32, we stopped supporting it.
+  /// https://github.com/dart-lang/sdk/issues/39810
+  ///
+  /// Includes [windowsArm64], even though it is currently not supported.
+  /// Support has been requested for Flutter.
+  /// https://github.com/flutter/flutter/issues/53120
+  static const values = [
+    androidArm,
+    androidArm64,
+    androidIA32,
+    androidX64,
+    fuchsiaArm64,
+    fuchsiaX64,
+    iosArm,
+    iosArm64,
+    iosX64,
+    linuxArm,
+    linuxArm64,
+    linuxIA32,
+    linuxX64,
+    macosArm64,
+    macosX64,
+    windowsArm64,
+    windowsIA32,
+    windowsX64,
+  ];
+
+  /// The ABI the Dart VM is currently running on.
+  external factory Abi.current();
+
+  /// A string representation of this ABI.
+  ///
+  /// The string is equal to the 'on' part from `Platform.version` and
+  /// `dart --version`.
+  @override
+  String toString() => '${_os.name}_${_architecture.name}';
+
+  /// The size of both integer registers and memory addresses in bytes.
+  int get wordSize => _architecture.wordSize;
+
+  /// The operating system of this [Abi].
+  final _OS _os;
+
+  /// The architecture of this [Abi].
+  final _Architecture _architecture;
+
+  /// The constructor is private so that we can use [Abi.values] as opaque
+  /// tokens.
+  const Abi._(this._architecture, this._os);
+
+  static const _androidArm = Abi._(_Architecture.arm, _OS.android);
+  static const _androidArm64 = Abi._(_Architecture.arm64, _OS.android);
+  static const _androidIA32 = Abi._(_Architecture.ia32, _OS.android);
+  static const _androidX64 = Abi._(_Architecture.x64, _OS.android);
+  static const _fuchsiaArm64 = Abi._(_Architecture.arm64, _OS.fuchsia);
+  static const _fuchsiaX64 = Abi._(_Architecture.x64, _OS.fuchsia);
+  static const _iosArm = Abi._(_Architecture.arm, _OS.ios);
+  static const _iosArm64 = Abi._(_Architecture.arm64, _OS.ios);
+  static const _iosX64 = Abi._(_Architecture.x64, _OS.ios);
+  static const _linuxArm = Abi._(_Architecture.arm, _OS.linux);
+  static const _linuxArm64 = Abi._(_Architecture.arm64, _OS.linux);
+  static const _linuxIA32 = Abi._(_Architecture.ia32, _OS.linux);
+  static const _linuxX64 = Abi._(_Architecture.x64, _OS.linux);
+  static const _macosArm64 = Abi._(_Architecture.arm64, _OS.macos);
+  static const _macosX64 = Abi._(_Architecture.x64, _OS.macos);
+  static const _windowsArm64 = Abi._(_Architecture.arm64, _OS.windows);
+  static const _windowsIA32 = Abi._(_Architecture.ia32, _OS.windows);
+  static const _windowsX64 = Abi._(_Architecture.x64, _OS.windows);
+}
+
+// Keep consistent with sdk/lib/ffi/abi.dart.
+const Map<Abi, String> abiNames = {
+  Abi.androidArm: 'androidArm',
+  Abi.androidArm64: 'androidArm64',
+  Abi.androidIA32: 'androidIA32',
+  Abi.androidX64: 'androidX64',
+  Abi.fuchsiaArm64: 'fuchsiaArm64',
+  Abi.fuchsiaX64: 'fuchsiaX64',
+  Abi.iosArm: 'iosArm',
+  Abi.iosArm64: 'iosArm64',
+  Abi.iosX64: 'iosX64',
+  Abi.linuxArm: 'linuxArm',
+  Abi.linuxArm64: 'linuxArm64',
+  Abi.linuxIA32: 'linuxIA32',
+  Abi.linuxX64: 'linuxX64',
+  Abi.macosArm64: 'macosArm64',
+  Abi.macosX64: 'macosX64',
+  Abi.windowsArm64: 'windowsArm64',
+  Abi.windowsIA32: 'windowsIA32',
+  Abi.windowsX64: 'windowsX64',
+};
+
+/// The size of integer registers and memory addresses in bytes per [Abi].
+// Keep consistent with sdk/lib/_internal/vm/lib/ffi_patch.dart
+final Map<Abi, int> wordSize =
+    Map.unmodifiable({for (final abi in Abi.values) abi: abi.wordSize});
+
+/// Alignment for types that are not aligned to a multiple of their size.
+///
+/// When a type occurs in a struct or union, it's usually aligned
+/// to a multiple of its own size.
+/// Some ABIs have types which are not aligned to their own size,
+/// but to a smaller size.
+///
+/// This map maps each [Abi] to a mapping from types that are not
+/// aligned by their size, to their actual alignment.
+/// If such a map is empty, which many are,
+/// it means that all types are aligned to their own size in that ABI.
+///
+/// See runtime/vm/compiler/ffi/abi.cc for asserts in the VM that verify these
+/// alignments.
+const Map<Abi, Map<NativeType, int>> nonSizeAlignment = {
+  // _wordSize64
+  Abi.androidArm64: _wordSize64,
+  Abi.androidX64: _wordSize64,
+  Abi.fuchsiaArm64: _wordSize64,
+  Abi.fuchsiaX64: _wordSize64,
+  Abi.iosArm64: _wordSize64,
+  Abi.iosX64: _wordSize64,
+  Abi.linuxArm64: _wordSize64,
+  Abi.linuxX64: _wordSize64,
+  Abi.macosArm64: _wordSize64,
+  Abi.macosX64: _wordSize64,
+  Abi.windowsArm64: _wordSize64,
+  Abi.windowsX64: _wordSize64,
+  // _wordSize32Align32
+  Abi.androidIA32: _wordSize32Align32,
+  Abi.iosArm: _wordSize32Align32,
+  Abi.linuxIA32: _wordSize32Align32,
+  // _wordSize32Align64
+  Abi.androidArm: _wordSize32Align64,
+  Abi.linuxArm: _wordSize32Align64,
+  Abi.windowsIA32: _wordSize32Align64,
+};
+
+// All 64 bit ABIs align struct fields to their size.
+const Map<NativeType, int> _wordSize64 = {};
+
+// x86 System V ABI:
+// > uint64_t | size 8 | alignment 4
+// > double   | size 8 | alignment 4
+// https://github.com/hjl-tools/x86-psABI/wiki/intel386-psABI-1.1.pdf page 8.
+//
+// ios 32 bit alignment:
+// https://developer.apple.com/documentation/uikit/app_and_environment/updating_your_app_from_32-bit_to_64-bit_architecture/updating_data_structures
+const Map<NativeType, int> _wordSize32Align32 = {
+  NativeType.kDouble: 4,
+  NativeType.kInt64: 4,
+  NativeType.kUint64: 4
+};
+
+// The default for MSVC x86:
+// > The alignment-requirement for all data except structures, unions, and
+// > arrays is either the size of the object or the current packing size
+// > (specified with either /Zp or the pack pragma, whichever is less).
+// https://docs.microsoft.com/en-us/cpp/c-language/padding-and-alignment-of-structure-members?view=vs-2019
+//
+// GCC _can_ compile on Linux to this alignment with -malign-double, but does
+// not do so by default:
+// > Warning: if you use the -malign-double switch, structures containing the
+// > above types are aligned differently than the published application
+// > binary interface specifications for the x86-32 and are not binary
+// > compatible with structures in code compiled without that switch.
+// https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html
+//
+// Arm always requires 8 byte alignment for 8 byte values:
+// http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf 4.1 Fundamental Data Types
+const Map<NativeType, int> _wordSize32Align64 = {};
diff --git a/pkg/vm/lib/transformations/ffi/common.dart b/pkg/vm/lib/transformations/ffi/common.dart
index dc51195..42235ff 100644
--- a/pkg/vm/lib/transformations/ffi/common.dart
+++ b/pkg/vm/lib/transformations/ffi/common.dart
@@ -17,6 +17,8 @@
 import 'package:kernel/type_environment.dart'
     show TypeEnvironment, SubtypeCheckMode;
 
+import 'abi.dart';
+
 /// Represents the (instantiated) ffi.NativeType.
 enum NativeType {
   kNativeType,
@@ -107,78 +109,6 @@
   NativeType.kBool: 1,
 };
 
-/// The struct layout in various ABIs.
-///
-/// ABIs differ per architectures and with different compilers.
-/// We pick the default struct layout based on the architecture and OS.
-///
-/// Compilers _can_ deviate from the default layout, but this prevents
-/// executables from making system calls. So this seems rather uncommon.
-///
-/// In the future, we might support custom struct layouts. For more info see
-/// https://github.com/dart-lang/sdk/issues/35768.
-enum Abi {
-  /// Layout in all 64bit ABIs (x64 and arm64).
-  wordSize64,
-
-  /// Layout in System V ABI for x386 (ia32 on Linux) and in iOS Arm 32 bit.
-  wordSize32Align32,
-
-  /// Layout in both the Arm 32 bit ABI and the Windows ia32 ABI.
-  wordSize32Align64,
-}
-
-/// WORD_SIZE in bytes.
-const wordSize = <Abi, int>{
-  Abi.wordSize64: 8,
-  Abi.wordSize32Align32: 4,
-  Abi.wordSize32Align64: 4,
-};
-
-/// Elements that are not aligned to their size.
-///
-/// Has an entry for all Abis. Empty entries document that every native
-/// type is aligned to it's own size in this ABI.
-///
-/// See runtime/vm/ffi/abi.cc for asserts in the VM that verify these
-/// alignments.
-///
-/// TODO(37470): Add uncommon primitive data types when we want to support them.
-const nonSizeAlignment = <Abi, Map<NativeType, int>>{
-  Abi.wordSize64: {},
-
-  // x86 System V ABI:
-  // > uint64_t | size 8 | alignment 4
-  // > double   | size 8 | alignment 4
-  // https://github.com/hjl-tools/x86-psABI/wiki/intel386-psABI-1.1.pdf page 8.
-  //
-  // iOS 32 bit alignment:
-  // https://developer.apple.com/documentation/uikit/app_and_environment/updating_your_app_from_32-bit_to_64-bit_architecture/updating_data_structures
-  Abi.wordSize32Align32: {
-    NativeType.kDouble: 4,
-    NativeType.kInt64: 4,
-    NativeType.kUint64: 4
-  },
-
-  // The default for MSVC x86:
-  // > The alignment-requirement for all data except structures, unions, and
-  // > arrays is either the size of the object or the current packing size
-  // > (specified with either /Zp or the pack pragma, whichever is less).
-  // https://docs.microsoft.com/en-us/cpp/c-language/padding-and-alignment-of-structure-members?view=vs-2019
-  //
-  // GCC _can_ compile on Linux to this alignment with -malign-double, but does
-  // not do so by default:
-  // > Warning: if you use the -malign-double switch, structures containing the
-  // > above types are aligned differently than the published application
-  // > binary interface specifications for the x86-32 and are not binary
-  // > compatible with structures in code compiled without that switch.
-  // https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html
-  //
-  // Arm always requires 8 byte alignment for 8 byte values:
-  // http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf 4.1 Fundamental Data Types
-  Abi.wordSize32Align64: {},
-};
-
 /// Load, store, and elementAt are rewired to their static type for these types.
 const List<NativeType> optimizedTypes = [
   NativeType.kBool,
@@ -304,6 +234,7 @@
   final Procedure lookupFunctionTearoff;
   final Procedure getNativeFieldFunction;
   final Procedure reachabilityFenceFunction;
+  final Procedure checkAbiSpecificIntegerMappingFunction;
 
   late final InterfaceType nativeFieldWrapperClass1Type;
   late final InterfaceType voidType;
@@ -487,7 +418,9 @@
         getNativeFieldFunction = index.getTopLevelProcedure(
             'dart:nativewrappers', '_getNativeField'),
         reachabilityFenceFunction =
-            index.getTopLevelProcedure('dart:_internal', 'reachabilityFence') {
+            index.getTopLevelProcedure('dart:_internal', 'reachabilityFence'),
+        checkAbiSpecificIntegerMappingFunction = index.getTopLevelProcedure(
+            'dart:ffi', "_checkAbiSpecificIntegerMapping") {
     nativeFieldWrapperClass1Type = nativeFieldWrapperClass1Class.getThisType(
         coreTypes, Nullability.nonNullable);
     voidType = nativeTypesClasses[NativeType.kVoid]!
@@ -523,7 +456,7 @@
   /// [Bool]                               -> [bool]
   /// [Void]                               -> [void]
   /// [Pointer]<T>                         -> [Pointer]<T>
-  /// T extends [Pointer]                  -> T
+  /// T extends [Compound]                 -> T
   /// [Handle]                             -> [Object]
   /// [NativeFunction]<T1 Function(T2, T3) -> S1 Function(S2, S3)
   ///    where DartRepresentationOf(Tn) -> Sn
@@ -605,29 +538,42 @@
   InterfaceType _listOfIntType() => InterfaceType(
       listClass, Nullability.legacy, [coreTypes.intLegacyRawType]);
 
-  ConstantExpression intListConstantExpression(List<int> values) =>
+  ConstantExpression intListConstantExpression(List<int?> values) =>
       ConstantExpression(
-          ListConstant(coreTypes.intLegacyRawType,
-              [for (var v in values) IntConstant(v)]),
+          ListConstant(coreTypes.intLegacyRawType, [
+            for (var v in values)
+              if (v != null) IntConstant(v) else NullConstant()
+          ]),
           _listOfIntType());
 
   /// Expression that queries VM internals at runtime to figure out on which ABI
   /// we are.
-  Expression runtimeBranchOnLayout(Map<Abi, int> values) {
-    return InstanceInvocation(
+  Expression runtimeBranchOnLayout(Map<Abi, int?> values) {
+    final result = InstanceInvocation(
         InstanceAccessKind.Instance,
         intListConstantExpression([
-          values[Abi.wordSize64]!,
-          values[Abi.wordSize32Align32]!,
-          values[Abi.wordSize32Align64]!
+          for (final abi in Abi.values) values[abi],
         ]),
         listElementAt.name,
         Arguments([StaticInvocation(abiMethod, Arguments([]))]),
         interfaceTarget: listElementAt,
         functionType: Substitution.fromInterfaceType(_listOfIntType())
             .substituteType(listElementAt.getterType) as FunctionType);
+    if (values.isPartial) {
+      return checkAbiSpecificIntegerMapping(result);
+    }
+    return result;
   }
 
+  Expression checkAbiSpecificIntegerMapping(Expression nullableExpression) =>
+      StaticInvocation(
+        checkAbiSpecificIntegerMappingFunction,
+        Arguments(
+          [nullableExpression],
+          types: [InterfaceType(intClass, Nullability.nonNullable)],
+        ),
+      );
+
   /// Generates an expression that returns a new `Pointer<dartType>` offset
   /// by [offset] from [pointer].
   ///
@@ -797,10 +743,16 @@
   /// Returns the single element type nested type argument of `Array`.
   ///
   /// `Array<Array<Array<Int8>>>` -> `Int8`.
+  ///
+  /// `Array<Array<Array<Unknown>>>` -> [InvalidType].
   DartType arraySingleElementType(DartType dartType) {
     InterfaceType elementType = dartType as InterfaceType;
     while (elementType.classNode == arrayClass) {
-      elementType = elementType.typeArguments[0] as InterfaceType;
+      final elementTypeAny = elementType.typeArguments[0];
+      if (elementTypeAny is InvalidType) {
+        return elementTypeAny;
+      }
+      elementType = elementTypeAny as InterfaceType;
     }
     return elementType;
   }
@@ -808,11 +760,14 @@
   /// Returns the number of dimensions of `Array`.
   ///
   /// `Array<Array<Array<Int8>>>` -> 3.
+  ///
+  /// `Array<Array<Array<Unknown>>>` -> 3.
   int arrayDimensions(DartType dartType) {
-    InterfaceType elementType = dartType as InterfaceType;
+    DartType elementType = dartType;
     int dimensions = 0;
-    while (elementType.classNode == arrayClass) {
-      elementType = elementType.typeArguments[0] as InterfaceType;
+    while (
+        elementType is InterfaceType && elementType.classNode == arrayClass) {
+      elementType = elementType.typeArguments[0];
       dimensions++;
     }
     return dimensions;
@@ -882,3 +837,8 @@
   }
   return false;
 }
+
+extension on Map<Abi, Object?> {
+  bool get isPartial =>
+      [for (final abi in Abi.values) this[abi]].contains(null);
+}
diff --git a/pkg/vm/lib/transformations/ffi/definitions.dart b/pkg/vm/lib/transformations/ffi/definitions.dart
index 49a4b8d..fbf2052 100644
--- a/pkg/vm/lib/transformations/ffi/definitions.dart
+++ b/pkg/vm/lib/transformations/ffi/definitions.dart
@@ -2,8 +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:math' as math;
-
 import 'package:front_end/src/api_unstable/vm.dart'
     show
         messageFfiPackedAnnotationAlignment,
@@ -31,7 +29,9 @@
 import 'package:kernel/type_environment.dart' show SubtypeCheckMode;
 import 'package:kernel/util/graph.dart';
 
+import 'abi.dart';
 import 'common.dart';
+import 'native_type_cfe.dart';
 
 /// Checks and elaborates the dart:ffi compounds and their fields.
 ///
@@ -145,8 +145,9 @@
         final sizeAnnotations = _getArraySizeAnnotations(f);
         if (sizeAnnotations.length == 1) {
           final singleElementType = arraySingleElementType(type);
-          if (isCompoundSubtype(singleElementType)) {
-            final clazz = (singleElementType as InterfaceType).classNode;
+          if (singleElementType is InterfaceType &&
+              isCompoundSubtype(singleElementType)) {
+            final clazz = singleElementType.classNode;
             dependencies.add(clazz);
           }
         }
@@ -402,24 +403,31 @@
           final sizeAnnotations = _getArraySizeAnnotations(f);
           if (sizeAnnotations.length == 1) {
             final singleElementType = arraySingleElementType(type);
-            if (isCompoundSubtype(singleElementType)) {
-              final clazz = (singleElementType as InterfaceType).classNode;
-              _checkPacking(node, packing, clazz, f);
-            }
-            final dimensions = sizeAnnotations.single;
-            if (arrayDimensions(type) != dimensions.length) {
-              diagnosticReporter.report(
-                  templateFfiSizeAnnotationDimensions
-                      .withArguments(f.name.text),
-                  f.fileOffset,
-                  f.name.text.length,
-                  f.fileUri);
-            }
-            for (var dimension in dimensions) {
-              if (dimension < 0) {
-                diagnosticReporter.report(messageNonPositiveArrayDimensions,
-                    f.fileOffset, f.name.text.length, f.fileUri);
-                success = false;
+            if (singleElementType is! InterfaceType) {
+              assert(singleElementType is InvalidType);
+              // This class is invalid, but continue reporting other errors on it.
+              // An error on the type will already have been reported.
+              success = false;
+            } else {
+              if (isCompoundSubtype(singleElementType)) {
+                final clazz = singleElementType.classNode;
+                _checkPacking(node, packing, clazz, f);
+              }
+              final dimensions = sizeAnnotations.single;
+              if (arrayDimensions(type) != dimensions.length) {
+                diagnosticReporter.report(
+                    templateFfiSizeAnnotationDimensions
+                        .withArguments(f.name.text),
+                    f.fileOffset,
+                    f.name.text.length,
+                    f.fileUri);
+              }
+              for (var dimension in dimensions) {
+                if (dimension < 0) {
+                  diagnosticReporter.report(messageNonPositiveArrayDimensions,
+                      f.fileOffset, f.name.text.length, f.fileUri);
+                  success = false;
+                }
               }
             }
           } else {
@@ -440,9 +448,8 @@
         // This class is invalid, but continue reporting other errors on it.
         success = false;
       } else {
-        final DartType nativeType = InterfaceType(
-            nativeTypesClasses[_getFieldType(nativeTypeAnnos.first)!]!,
-            Nullability.legacy);
+        final DartType nativeType =
+            InterfaceType(nativeTypeAnnos.first, Nullability.legacy);
         final DartType? shouldBeDartType = convertNativeTypeToDartType(
             nativeType,
             allowCompounds: true,
@@ -567,8 +574,15 @@
         if (sizeAnnotations.length == 1) {
           final arrayDimensions = sizeAnnotations.single;
           if (this.arrayDimensions(dartType) == arrayDimensions.length) {
-            type = NativeTypeCfe(this, dartType,
-                compoundCache: compoundCache, arrayDimensions: arrayDimensions);
+            final elementType = arraySingleElementType(dartType);
+            if (elementType is! InterfaceType) {
+              assert(elementType is InvalidType);
+              type = InvalidNativeTypeCfe("Invalid element type.");
+            } else {
+              type = NativeTypeCfe(this, dartType,
+                  compoundCache: compoundCache,
+                  arrayDimensions: arrayDimensions);
+            }
           } else {
             type = InvalidNativeTypeCfe("Invalid array dimensions.");
           }
@@ -689,7 +703,6 @@
 
   static const vmFfiStructFields = "vm:ffi:struct-fields";
 
-  // return value is nullable.
   InstanceConstant? _compoundAnnotatedFields(Class node) {
     for (final annotation in node.annotations) {
       if (annotation is ConstantExpression) {
@@ -759,7 +772,6 @@
     return UnionNativeTypeCfe(compoundClass, members);
   }
 
-  // packing is `int?`.
   void _annoteCompoundWithFields(
       Class node, List<NativeTypeCfe> types, int? packing) {
     List<Constant> constants =
@@ -779,8 +791,13 @@
         InterfaceType(pragmaClass, Nullability.nonNullable, [])));
   }
 
-  void _generateMethodsForField(Class node, Field field, NativeTypeCfe type,
-      Map<Abi, int> offsets, bool unalignedAccess, IndexedClass? indexedClass) {
+  void _generateMethodsForField(
+      Class node,
+      Field field,
+      NativeTypeCfe type,
+      Map<Abi, int?> offsets,
+      bool unalignedAccess,
+      IndexedClass? indexedClass) {
     // TODO(johnniwinther): Avoid passing [indexedClass]. When compiling
     // incrementally, [field] should already carry the references from
     // [indexedClass].
@@ -831,9 +848,9 @@
   /// If sizes are not supplied still emits a field so that the use site
   /// transformer can still rewrite to it.
   void _addSizeOfField(Class compound, IndexedClass? indexedClass,
-      [Map<Abi, int>? sizes = null]) {
+      [Map<Abi, int?>? sizes = null]) {
     if (sizes == null) {
-      sizes = Map.fromEntries(Abi.values.map((abi) => MapEntry(abi, 0)));
+      sizes = {for (var abi in Abi.values) abi: 0};
     }
     final name = Name("#sizeOf");
     final getterReference = indexedClass?.lookupGetterReference(name);
@@ -940,542 +957,3 @@
 
   CompoundField(this.type, this.field, this.getter, this.setter);
 }
-
-/// The layout of a `Struct` or `Union` in one [Abi].
-class CompoundLayout {
-  /// Size of the entire struct or union.
-  final int size;
-
-  /// Alignment of struct or union when nested in a struct.
-  final int alignment;
-
-  /// Offset in bytes for each field, indexed by field number.
-  ///
-  /// Always 0 for unions.
-  final List<int> offsets;
-
-  CompoundLayout(this.size, this.alignment, this.offsets);
-}
-
-/// AST node wrapper for native types.
-///
-/// This algebraic data structure does not stand on its own but refers
-/// intimately to AST nodes such as [Class].
-abstract class NativeTypeCfe {
-  factory NativeTypeCfe(FfiTransformer transformer, DartType dartType,
-      {List<int>? arrayDimensions,
-      Map<Class, NativeTypeCfe> compoundCache = const {}}) {
-    if (transformer.isPrimitiveType(dartType)) {
-      final clazz = (dartType as InterfaceType).classNode;
-      final nativeType = transformer.getType(clazz)!;
-      return PrimitiveNativeTypeCfe(nativeType, clazz);
-    }
-    if (transformer.isPointerType(dartType)) {
-      return PointerNativeTypeCfe();
-    }
-    if (transformer.isCompoundSubtype(dartType)) {
-      final clazz = (dartType as InterfaceType).classNode;
-      if (compoundCache.containsKey(clazz)) {
-        return compoundCache[clazz]!;
-      } else {
-        throw "Class '$clazz' not found in compoundCache.";
-      }
-    }
-    if (transformer.isArrayType(dartType)) {
-      if (arrayDimensions == null) {
-        throw "Must have array dimensions for ArrayType.";
-      }
-      if (arrayDimensions.length == 0) {
-        throw "Must have a size for this array dimension.";
-      }
-      final elementType = transformer.arraySingleElementType(dartType);
-      final elementCfeType =
-          NativeTypeCfe(transformer, elementType, compoundCache: compoundCache);
-      if (elementCfeType is InvalidNativeTypeCfe) {
-        return elementCfeType;
-      }
-      return ArrayNativeTypeCfe.multi(elementCfeType, arrayDimensions);
-    }
-    throw "Invalid type $dartType";
-  }
-
-  /// The size in bytes per [Abi].
-  Map<Abi, int> get size;
-
-  /// The alignment inside structs in bytes per [Abi].
-  ///
-  /// This is not the alignment on stack, this is only calculated in the VM.
-  Map<Abi, int> get alignment;
-
-  /// Generates a Constant representing the type which is consumed by the VM.
-  ///
-  /// Takes [transformer] to be able to lookup classes and methods.
-  ///
-  /// See runtime/vm/compiler/ffi/native_type.cc:NativeType::FromAbstractType.
-  Constant generateConstant(FfiTransformer transformer);
-
-  /// Generates the return statement for a compound field getter with this type.
-  ///
-  /// Takes [transformer] to be able to lookup classes and methods.
-  ReturnStatement generateGetterStatement(DartType dartType, int fileOffset,
-      Map<Abi, int> offsets, bool unalignedAccess, FfiTransformer transformer);
-
-  /// Generates the return statement for a compound field setter with this type.
-  ///
-  /// Takes [transformer] to be able to lookup classes and methods.
-  ReturnStatement generateSetterStatement(
-      DartType dartType,
-      int fileOffset,
-      Map<Abi, int> offsets,
-      bool unalignedAccess,
-      VariableDeclaration argument,
-      FfiTransformer transformer);
-}
-
-class InvalidNativeTypeCfe implements NativeTypeCfe {
-  final String reason;
-
-  InvalidNativeTypeCfe(this.reason);
-
-  @override
-  Map<Abi, int> get alignment => throw reason;
-
-  @override
-  Constant generateConstant(FfiTransformer transformer) => throw reason;
-
-  @override
-  ReturnStatement generateGetterStatement(
-          DartType dartType,
-          int fileOffset,
-          Map<Abi, int> offsets,
-          bool unalignedAccess,
-          FfiTransformer transformer) =>
-      throw reason;
-
-  @override
-  ReturnStatement generateSetterStatement(
-          DartType dartType,
-          int fileOffset,
-          Map<Abi, int> offsets,
-          bool unalignedAccess,
-          VariableDeclaration argument,
-          FfiTransformer transformer) =>
-      throw reason;
-
-  @override
-  Map<Abi, int> get size => throw reason;
-}
-
-class PrimitiveNativeTypeCfe implements NativeTypeCfe {
-  final NativeType nativeType;
-
-  final Class clazz;
-
-  PrimitiveNativeTypeCfe(this.nativeType, this.clazz);
-
-  @override
-  Map<Abi, int> get size {
-    final int size = nativeTypeSizes[nativeType]!;
-    if (size == WORD_SIZE) {
-      return wordSize;
-    }
-    return Map.fromEntries(Abi.values.map((abi) => MapEntry(abi, size)));
-  }
-
-  @override
-  Map<Abi, int> get alignment => Map.fromEntries(Abi.values.map((abi) =>
-      MapEntry(abi, nonSizeAlignment[abi]![nativeType] ?? size[abi]!)));
-
-  @override
-  Constant generateConstant(FfiTransformer transformer) =>
-      TypeLiteralConstant(InterfaceType(clazz, Nullability.nonNullable));
-
-  bool get isFloat =>
-      nativeType == NativeType.kFloat || nativeType == NativeType.kDouble;
-
-  bool isUnaligned(Map<Abi, int> offsets) {
-    final alignments = alignment;
-    for (final abi in offsets.keys) {
-      final offset = offsets[abi]!;
-      final alignment = alignments[abi]!;
-      if (offset % alignment != 0) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /// Sample output for `int get x =>`:
-  ///
-  /// ```
-  /// _loadInt8(_typedDataBase, offset);
-  /// ```
-  @override
-  ReturnStatement generateGetterStatement(
-          DartType dartType,
-          int fileOffset,
-          Map<Abi, int> offsets,
-          bool unalignedAccess,
-          FfiTransformer transformer) =>
-      ReturnStatement(StaticInvocation(
-          (unalignedAccess && isFloat
-              ? transformer.loadUnalignedMethods
-              : transformer.loadMethods)[nativeType]!,
-          Arguments([
-            transformer.getCompoundTypedDataBaseField(
-                ThisExpression(), fileOffset),
-            transformer.runtimeBranchOnLayout(offsets)
-          ]))
-        ..fileOffset = fileOffset);
-
-  /// Sample output for `set x(int #v) =>`:
-  ///
-  /// ```
-  /// _storeInt8(_typedDataBase, offset, #v);
-  /// ```
-  @override
-  ReturnStatement generateSetterStatement(
-          DartType dartType,
-          int fileOffset,
-          Map<Abi, int> offsets,
-          bool unalignedAccess,
-          VariableDeclaration argument,
-          FfiTransformer transformer) =>
-      ReturnStatement(StaticInvocation(
-          (unalignedAccess && isFloat
-              ? transformer.storeUnalignedMethods
-              : transformer.storeMethods)[nativeType]!,
-          Arguments([
-            transformer.getCompoundTypedDataBaseField(
-                ThisExpression(), fileOffset),
-            transformer.runtimeBranchOnLayout(offsets),
-            VariableGet(argument)
-          ]))
-        ..fileOffset = fileOffset);
-}
-
-class PointerNativeTypeCfe implements NativeTypeCfe {
-  @override
-  Map<Abi, int> get size => wordSize;
-
-  @override
-  Map<Abi, int> get alignment => wordSize;
-
-  @override
-  Constant generateConstant(FfiTransformer transformer) => TypeLiteralConstant(
-          InterfaceType(transformer.pointerClass, Nullability.nonNullable, [
-        InterfaceType(
-            transformer.pointerClass.superclass!, Nullability.nonNullable)
-      ]));
-
-  /// Sample output for `Pointer<Int8> get x =>`:
-  ///
-  /// ```
-  /// _fromAddress<Int8>(_loadIntPtr(_typedDataBase, offset));
-  /// ```
-  @override
-  ReturnStatement generateGetterStatement(
-          DartType dartType,
-          int fileOffset,
-          Map<Abi, int> offsets,
-          bool unalignedAccess,
-          FfiTransformer transformer) =>
-      ReturnStatement(StaticInvocation(
-          transformer.fromAddressInternal,
-          Arguments([
-            StaticInvocation(
-                transformer.loadMethods[NativeType.kIntptr]!,
-                Arguments([
-                  transformer.getCompoundTypedDataBaseField(
-                      ThisExpression(), fileOffset),
-                  transformer.runtimeBranchOnLayout(offsets)
-                ]))
-              ..fileOffset = fileOffset
-          ], types: [
-            (dartType as InterfaceType).typeArguments.single
-          ]))
-        ..fileOffset = fileOffset);
-
-  /// Sample output for `set x(Pointer<Int8> #v) =>`:
-  ///
-  /// ```
-  /// _storeIntPtr(_typedDataBase, offset, (#v as Pointer<Int8>).address);
-  /// ```
-  @override
-  ReturnStatement generateSetterStatement(
-          DartType dartType,
-          int fileOffset,
-          Map<Abi, int> offsets,
-          bool unalignedAccess,
-          VariableDeclaration argument,
-          FfiTransformer transformer) =>
-      ReturnStatement(StaticInvocation(
-          transformer.storeMethods[NativeType.kIntptr]!,
-          Arguments([
-            transformer.getCompoundTypedDataBaseField(
-                ThisExpression(), fileOffset),
-            transformer.runtimeBranchOnLayout(offsets),
-            InstanceGet(InstanceAccessKind.Instance, VariableGet(argument),
-                transformer.addressGetter.name,
-                interfaceTarget: transformer.addressGetter,
-                resultType: transformer.addressGetter.getterType)
-              ..fileOffset = fileOffset
-          ]))
-        ..fileOffset = fileOffset);
-}
-
-abstract class CompoundNativeTypeCfe implements NativeTypeCfe {
-  final Class clazz;
-
-  final List<NativeTypeCfe> members;
-
-  final Map<Abi, CompoundLayout> layout;
-
-  CompoundNativeTypeCfe._(this.clazz, this.members, this.layout);
-
-  @override
-  Map<Abi, int> get size =>
-      layout.map((abi, layout) => MapEntry(abi, layout.size));
-
-  @override
-  Map<Abi, int> get alignment =>
-      layout.map((abi, layout) => MapEntry(abi, layout.alignment));
-
-  @override
-  Constant generateConstant(FfiTransformer transformer) =>
-      TypeLiteralConstant(InterfaceType(clazz, Nullability.nonNullable));
-
-  /// Sample output for `MyStruct get x =>`:
-  ///
-  /// ```
-  /// MyStruct.#fromTypedDataBase(
-  ///   typedDataBaseOffset(_typedDataBase, offset, size, dartType)
-  /// );
-  /// ```
-  @override
-  ReturnStatement generateGetterStatement(DartType dartType, int fileOffset,
-      Map<Abi, int> offsets, bool unalignedAccess, FfiTransformer transformer) {
-    final constructor = clazz.constructors
-        .firstWhere((c) => c.name == Name("#fromTypedDataBase"));
-
-    return ReturnStatement(ConstructorInvocation(
-        constructor,
-        Arguments([
-          transformer.typedDataBaseOffset(
-              transformer.getCompoundTypedDataBaseField(
-                  ThisExpression(), fileOffset),
-              transformer.runtimeBranchOnLayout(offsets),
-              transformer.runtimeBranchOnLayout(size),
-              dartType,
-              fileOffset)
-        ]))
-      ..fileOffset = fileOffset);
-  }
-
-  /// Sample output for `set x(MyStruct #v) =>`:
-  ///
-  /// ```
-  /// _memCopy(_typedDataBase, offset, #v._typedDataBase, 0, size);
-  /// ```
-  @override
-  ReturnStatement generateSetterStatement(
-          DartType dartType,
-          int fileOffset,
-          Map<Abi, int> offsets,
-          bool unalignedAccess,
-          VariableDeclaration argument,
-          FfiTransformer transformer) =>
-      ReturnStatement(StaticInvocation(
-          transformer.memCopy,
-          Arguments([
-            transformer.getCompoundTypedDataBaseField(
-                ThisExpression(), fileOffset),
-            transformer.runtimeBranchOnLayout(offsets),
-            transformer.getCompoundTypedDataBaseField(
-                VariableGet(argument), fileOffset),
-            ConstantExpression(IntConstant(0)),
-            transformer.runtimeBranchOnLayout(size),
-          ]))
-        ..fileOffset = fileOffset);
-}
-
-class StructNativeTypeCfe extends CompoundNativeTypeCfe {
-  // Nullable int.
-  final int? packing;
-
-  factory StructNativeTypeCfe(Class clazz, List<NativeTypeCfe> members,
-      {int? packing}) {
-    final layout = Map.fromEntries(Abi.values
-        .map((abi) => MapEntry(abi, _calculateLayout(members, packing, abi))));
-    return StructNativeTypeCfe._(clazz, members, packing, layout);
-  }
-
-  StructNativeTypeCfe._(Class clazz, List<NativeTypeCfe> members, this.packing,
-      Map<Abi, CompoundLayout> layout)
-      : super._(clazz, members, layout);
-
-  // Keep consistent with runtime/vm/compiler/ffi/native_type.cc
-  // NativeStructType::FromNativeTypes.
-  static CompoundLayout _calculateLayout(
-      List<NativeTypeCfe> types, int? packing, Abi abi) {
-    int offset = 0;
-    final offsets = <int>[];
-    int structAlignment = 1;
-    for (int i = 0; i < types.length; i++) {
-      final int size = types[i].size[abi]!;
-      int alignment = types[i].alignment[abi]!;
-      if (packing != null && packing < alignment) {
-        alignment = packing;
-      }
-      if (alignment > 0) {
-        offset = _alignOffset(offset, alignment);
-      }
-      offsets.add(offset);
-      offset += size;
-      structAlignment = math.max(structAlignment, alignment);
-    }
-    final int size = _alignOffset(offset, structAlignment);
-    return CompoundLayout(size, structAlignment, offsets);
-  }
-}
-
-class UnionNativeTypeCfe extends CompoundNativeTypeCfe {
-  factory UnionNativeTypeCfe(Class clazz, List<NativeTypeCfe> members) {
-    final layout = Map.fromEntries(
-        Abi.values.map((abi) => MapEntry(abi, _calculateLayout(members, abi))));
-    return UnionNativeTypeCfe._(clazz, members, layout);
-  }
-
-  UnionNativeTypeCfe._(
-      Class clazz, List<NativeTypeCfe> members, Map<Abi, CompoundLayout> layout)
-      : super._(clazz, members, layout);
-
-  // Keep consistent with runtime/vm/compiler/ffi/native_type.cc
-  // NativeUnionType::FromNativeTypes.
-  static CompoundLayout _calculateLayout(List<NativeTypeCfe> types, Abi abi) {
-    int unionSize = 1;
-    int unionAlignment = 1;
-    for (int i = 0; i < types.length; i++) {
-      final int size = types[i].size[abi]!;
-      int alignment = types[i].alignment[abi]!;
-      unionSize = math.max(unionSize, size);
-      unionAlignment = math.max(unionAlignment, alignment);
-    }
-    final int size = _alignOffset(unionSize, unionAlignment);
-    return CompoundLayout(size, unionAlignment, List.filled(types.length, 0));
-  }
-}
-
-class ArrayNativeTypeCfe implements NativeTypeCfe {
-  final NativeTypeCfe elementType;
-  final int length;
-
-  ArrayNativeTypeCfe(this.elementType, this.length);
-
-  factory ArrayNativeTypeCfe.multi(
-      NativeTypeCfe elementType, List<int> dimensions) {
-    if (dimensions.length == 1) {
-      return ArrayNativeTypeCfe(elementType, dimensions.single);
-    }
-    return ArrayNativeTypeCfe(
-        ArrayNativeTypeCfe.multi(elementType, dimensions.sublist(1)),
-        dimensions.first);
-  }
-
-  List<int> get dimensions {
-    final elementType = this.elementType;
-    if (elementType is ArrayNativeTypeCfe) {
-      return [length, ...elementType.dimensions];
-    }
-    return [length];
-  }
-
-  List<int> get nestedDimensions => dimensions.sublist(1);
-
-  int get dimensionsFlattened =>
-      dimensions.fold(1, (accumulator, element) => accumulator * element);
-
-  NativeTypeCfe get singleElementType {
-    final elementType = this.elementType;
-    if (elementType is ArrayNativeTypeCfe) {
-      return elementType.singleElementType;
-    }
-    return elementType;
-  }
-
-  @override
-  Map<Abi, int> get size =>
-      elementType.size.map((abi, size) => MapEntry(abi, size * length));
-
-  @override
-  Map<Abi, int> get alignment => elementType.alignment;
-
-  // Note that we flatten multi dimensional arrays.
-  @override
-  Constant generateConstant(FfiTransformer transformer) =>
-      InstanceConstant(transformer.ffiInlineArrayClass.reference, [], {
-        transformer.ffiInlineArrayElementTypeField.fieldReference:
-            singleElementType.generateConstant(transformer),
-        transformer.ffiInlineArrayLengthField.fieldReference:
-            IntConstant(dimensionsFlattened)
-      });
-
-  /// Sample output for `Array<Int8> get x =>`:
-  ///
-  /// ```
-  /// Array<Int8>._(
-  ///   typedDataBaseOffset(_typedDataBase, offset, size, typeArgument)
-  /// );
-  /// ```
-  @override
-  ReturnStatement generateGetterStatement(DartType dartType, int fileOffset,
-      Map<Abi, int> offsets, bool unalignedAccess, FfiTransformer transformer) {
-    InterfaceType typeArgument =
-        (dartType as InterfaceType).typeArguments.single as InterfaceType;
-    return ReturnStatement(ConstructorInvocation(
-        transformer.arrayConstructor,
-        Arguments([
-          transformer.typedDataBaseOffset(
-              transformer.getCompoundTypedDataBaseField(
-                  ThisExpression(), fileOffset),
-              transformer.runtimeBranchOnLayout(offsets),
-              transformer.runtimeBranchOnLayout(size),
-              typeArgument,
-              fileOffset),
-          ConstantExpression(IntConstant(length)),
-          transformer.intListConstantExpression(nestedDimensions)
-        ], types: [
-          typeArgument
-        ]))
-      ..fileOffset = fileOffset);
-  }
-
-  /// Sample output for `set x(Array #v) =>`:
-  ///
-  /// ```
-  /// _memCopy(_typedDataBase, offset, #v._typedDataBase, 0, size);
-  /// ```
-  @override
-  ReturnStatement generateSetterStatement(
-          DartType dartType,
-          int fileOffset,
-          Map<Abi, int> offsets,
-          bool unalignedAccess,
-          VariableDeclaration argument,
-          FfiTransformer transformer) =>
-      ReturnStatement(StaticInvocation(
-          transformer.memCopy,
-          Arguments([
-            transformer.getCompoundTypedDataBaseField(
-                ThisExpression(), fileOffset),
-            transformer.runtimeBranchOnLayout(offsets),
-            transformer.getArrayTypedDataBaseField(
-                VariableGet(argument), fileOffset),
-            ConstantExpression(IntConstant(0)),
-            transformer.runtimeBranchOnLayout(size),
-          ]))
-        ..fileOffset = fileOffset);
-}
-
-int _alignOffset(int offset, int alignment) =>
-    ((offset + alignment - 1) ~/ alignment) * alignment;
diff --git a/pkg/vm/lib/transformations/ffi/native_type_cfe.dart b/pkg/vm/lib/transformations/ffi/native_type_cfe.dart
new file mode 100644
index 0000000..862d1bd
--- /dev/null
+++ b/pkg/vm/lib/transformations/ffi/native_type_cfe.dart
@@ -0,0 +1,627 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. 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' as math;
+
+import 'package:kernel/ast.dart';
+
+import 'abi.dart';
+import 'common.dart';
+
+/// AST node wrapper for native types.
+///
+/// This algebraic data structure does not stand on its own but refers
+/// intimately to AST nodes such as [Class].
+abstract class NativeTypeCfe {
+  factory NativeTypeCfe(FfiTransformer transformer, DartType dartType,
+      {List<int>? arrayDimensions,
+      Map<Class, NativeTypeCfe> compoundCache = const {}}) {
+    if (transformer.isPrimitiveType(dartType)) {
+      final clazz = (dartType as InterfaceType).classNode;
+      final nativeType = transformer.getType(clazz)!;
+      return PrimitiveNativeTypeCfe(nativeType, clazz);
+    }
+    if (transformer.isPointerType(dartType)) {
+      return PointerNativeTypeCfe();
+    }
+    if (transformer.isCompoundSubtype(dartType)) {
+      final clazz = (dartType as InterfaceType).classNode;
+      if (compoundCache.containsKey(clazz)) {
+        return compoundCache[clazz]!;
+      } else {
+        throw "Class '$clazz' not found in compoundCache.";
+      }
+    }
+    if (transformer.isArrayType(dartType)) {
+      if (arrayDimensions == null) {
+        throw "Must have array dimensions for ArrayType.";
+      }
+      if (arrayDimensions.length == 0) {
+        throw "Must have a size for this array dimension.";
+      }
+      final elementType = transformer.arraySingleElementType(dartType);
+      final elementCfeType =
+          NativeTypeCfe(transformer, elementType, compoundCache: compoundCache);
+      if (elementCfeType is InvalidNativeTypeCfe) {
+        return elementCfeType;
+      }
+      return ArrayNativeTypeCfe.multi(elementCfeType, arrayDimensions);
+    }
+    throw "Invalid type $dartType";
+  }
+
+  /// The size in bytes per [Abi].
+  Map<Abi, int?> get size;
+
+  /// The alignment inside structs in bytes per [Abi].
+  ///
+  /// This is not the alignment on stack, this is only calculated in the VM.
+  Map<Abi, int?> get alignment;
+
+  /// Generates a Constant representing the type which is consumed by the VM.
+  ///
+  /// Takes [transformer] to be able to lookup classes and methods.
+  ///
+  /// See runtime/vm/compiler/ffi/native_type.cc:NativeType::FromAbstractType.
+  Constant generateConstant(FfiTransformer transformer);
+
+  /// Generates the return statement for a compound field getter with this type.
+  ///
+  /// Takes [transformer] to be able to lookup classes and methods.
+  ReturnStatement generateGetterStatement(DartType dartType, int fileOffset,
+      Map<Abi, int?> offsets, bool unalignedAccess, FfiTransformer transformer);
+
+  /// Generates the return statement for a compound field setter with this type.
+  ///
+  /// Takes [transformer] to be able to lookup classes and methods.
+  ReturnStatement generateSetterStatement(
+      DartType dartType,
+      int fileOffset,
+      Map<Abi, int?> offsets,
+      bool unalignedAccess,
+      VariableDeclaration argument,
+      FfiTransformer transformer);
+}
+
+class InvalidNativeTypeCfe implements NativeTypeCfe {
+  final String reason;
+
+  InvalidNativeTypeCfe(this.reason);
+
+  @override
+  Map<Abi, int?> get alignment => throw reason;
+
+  @override
+  Constant generateConstant(FfiTransformer transformer) => throw reason;
+
+  @override
+  ReturnStatement generateGetterStatement(
+          DartType dartType,
+          int fileOffset,
+          Map<Abi, int?> offsets,
+          bool unalignedAccess,
+          FfiTransformer transformer) =>
+      throw reason;
+
+  @override
+  ReturnStatement generateSetterStatement(
+          DartType dartType,
+          int fileOffset,
+          Map<Abi, int?> offsets,
+          bool unalignedAccess,
+          VariableDeclaration argument,
+          FfiTransformer transformer) =>
+      throw reason;
+
+  @override
+  Map<Abi, int?> get size => throw reason;
+}
+
+class PrimitiveNativeTypeCfe implements NativeTypeCfe {
+  final NativeType nativeType;
+
+  final Class clazz;
+
+  PrimitiveNativeTypeCfe(this.nativeType, this.clazz);
+
+  @override
+  Map<Abi, int?> get size {
+    final int size = nativeTypeSizes[nativeType]!;
+    if (size == WORD_SIZE) {
+      return wordSize;
+    }
+    return {for (var abi in Abi.values) abi: size};
+  }
+
+  @override
+  Map<Abi, int> get alignment => {
+        for (var abi in Abi.values)
+          abi: nonSizeAlignment[abi]![nativeType] ?? size[abi]!
+      };
+
+  @override
+  Constant generateConstant(FfiTransformer transformer) =>
+      TypeLiteralConstant(InterfaceType(clazz, Nullability.nonNullable));
+
+  bool get isFloat =>
+      nativeType == NativeType.kFloat || nativeType == NativeType.kDouble;
+
+  bool isUnaligned(Map<Abi, int?> offsets) {
+    final alignments = alignment;
+    for (final abi in offsets.keys) {
+      final offset = offsets[abi]!;
+      final alignment = alignments[abi]!;
+      if (offset % alignment != 0) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /// Sample output for `int get x =>`:
+  ///
+  /// ```
+  /// _loadInt8(_typedDataBase, offset);
+  /// ```
+  @override
+  ReturnStatement generateGetterStatement(
+          DartType dartType,
+          int fileOffset,
+          Map<Abi, int?> offsets,
+          bool unalignedAccess,
+          FfiTransformer transformer) =>
+      ReturnStatement(StaticInvocation(
+          (unalignedAccess && isFloat
+              ? transformer.loadUnalignedMethods
+              : transformer.loadMethods)[nativeType]!,
+          Arguments([
+            transformer.getCompoundTypedDataBaseField(
+                ThisExpression(), fileOffset),
+            transformer.runtimeBranchOnLayout(offsets)
+          ]))
+        ..fileOffset = fileOffset);
+
+  /// Sample output for `set x(int #v) =>`:
+  ///
+  /// ```
+  /// _storeInt8(_typedDataBase, offset, #v);
+  /// ```
+  @override
+  ReturnStatement generateSetterStatement(
+          DartType dartType,
+          int fileOffset,
+          Map<Abi, int?> offsets,
+          bool unalignedAccess,
+          VariableDeclaration argument,
+          FfiTransformer transformer) =>
+      ReturnStatement(StaticInvocation(
+          (unalignedAccess && isFloat
+              ? transformer.storeUnalignedMethods
+              : transformer.storeMethods)[nativeType]!,
+          Arguments([
+            transformer.getCompoundTypedDataBaseField(
+                ThisExpression(), fileOffset),
+            transformer.runtimeBranchOnLayout(offsets),
+            VariableGet(argument)
+          ]))
+        ..fileOffset = fileOffset);
+}
+
+class PointerNativeTypeCfe implements NativeTypeCfe {
+  @override
+  Map<Abi, int?> get size => wordSize;
+
+  @override
+  Map<Abi, int?> get alignment => wordSize;
+
+  @override
+  Constant generateConstant(FfiTransformer transformer) => TypeLiteralConstant(
+          InterfaceType(transformer.pointerClass, Nullability.nonNullable, [
+        InterfaceType(
+            transformer.pointerClass.superclass!, Nullability.nonNullable)
+      ]));
+
+  /// Sample output for `Pointer<Int8> get x =>`:
+  ///
+  /// ```
+  /// _fromAddress<Int8>(_loadIntPtr(_typedDataBase, offset));
+  /// ```
+  @override
+  ReturnStatement generateGetterStatement(
+          DartType dartType,
+          int fileOffset,
+          Map<Abi, int?> offsets,
+          bool unalignedAccess,
+          FfiTransformer transformer) =>
+      ReturnStatement(StaticInvocation(
+          transformer.fromAddressInternal,
+          Arguments([
+            StaticInvocation(
+                transformer.loadMethods[NativeType.kIntptr]!,
+                Arguments([
+                  transformer.getCompoundTypedDataBaseField(
+                      ThisExpression(), fileOffset),
+                  transformer.runtimeBranchOnLayout(offsets)
+                ]))
+              ..fileOffset = fileOffset
+          ], types: [
+            (dartType as InterfaceType).typeArguments.single
+          ]))
+        ..fileOffset = fileOffset);
+
+  /// Sample output for `set x(Pointer<Int8> #v) =>`:
+  ///
+  /// ```
+  /// _storeIntPtr(_typedDataBase, offset, (#v as Pointer<Int8>).address);
+  /// ```
+  @override
+  ReturnStatement generateSetterStatement(
+          DartType dartType,
+          int fileOffset,
+          Map<Abi, int?> offsets,
+          bool unalignedAccess,
+          VariableDeclaration argument,
+          FfiTransformer transformer) =>
+      ReturnStatement(StaticInvocation(
+          transformer.storeMethods[NativeType.kIntptr]!,
+          Arguments([
+            transformer.getCompoundTypedDataBaseField(
+                ThisExpression(), fileOffset),
+            transformer.runtimeBranchOnLayout(offsets),
+            InstanceGet(InstanceAccessKind.Instance, VariableGet(argument),
+                transformer.addressGetter.name,
+                interfaceTarget: transformer.addressGetter,
+                resultType: transformer.addressGetter.getterType)
+              ..fileOffset = fileOffset
+          ]))
+        ..fileOffset = fileOffset);
+}
+
+/// The layout of a `Struct` or `Union` in one [Abi].
+class CompoundLayout {
+  /// Size of the entire struct or union.
+  final int? size;
+
+  /// Alignment of struct or union when nested in a struct.
+  final int? alignment;
+
+  /// Offset in bytes for each field, indexed by field number.
+  ///
+  /// Always 0 for unions.
+  final List<int?> offsets;
+
+  CompoundLayout(this.size, this.alignment, this.offsets);
+}
+
+abstract class CompoundNativeTypeCfe implements NativeTypeCfe {
+  final Class clazz;
+
+  final List<NativeTypeCfe> members;
+
+  final Map<Abi, CompoundLayout> layout;
+
+  CompoundNativeTypeCfe._(this.clazz, this.members, this.layout);
+
+  @override
+  Map<Abi, int?> get size =>
+      layout.map((abi, layout) => MapEntry(abi, layout.size));
+
+  @override
+  Map<Abi, int?> get alignment =>
+      layout.map((abi, layout) => MapEntry(abi, layout.alignment));
+
+  @override
+  Constant generateConstant(FfiTransformer transformer) =>
+      TypeLiteralConstant(InterfaceType(clazz, Nullability.nonNullable));
+
+  /// Sample output for `MyStruct get x =>`:
+  ///
+  /// ```
+  /// MyStruct.#fromTypedDataBase(
+  ///   typedDataBaseOffset(_typedDataBase, offset, size, dartType)
+  /// );
+  /// ```
+  @override
+  ReturnStatement generateGetterStatement(
+      DartType dartType,
+      int fileOffset,
+      Map<Abi, int?> offsets,
+      bool unalignedAccess,
+      FfiTransformer transformer) {
+    final constructor = clazz.constructors
+        .firstWhere((c) => c.name == Name("#fromTypedDataBase"));
+
+    return ReturnStatement(ConstructorInvocation(
+        constructor,
+        Arguments([
+          transformer.typedDataBaseOffset(
+              transformer.getCompoundTypedDataBaseField(
+                  ThisExpression(), fileOffset),
+              transformer.runtimeBranchOnLayout(offsets),
+              transformer.runtimeBranchOnLayout(size),
+              dartType,
+              fileOffset)
+        ]))
+      ..fileOffset = fileOffset);
+  }
+
+  /// Sample output for `set x(MyStruct #v) =>`:
+  ///
+  /// ```
+  /// _memCopy(_typedDataBase, offset, #v._typedDataBase, 0, size);
+  /// ```
+  @override
+  ReturnStatement generateSetterStatement(
+          DartType dartType,
+          int fileOffset,
+          Map<Abi, int?> offsets,
+          bool unalignedAccess,
+          VariableDeclaration argument,
+          FfiTransformer transformer) =>
+      ReturnStatement(StaticInvocation(
+          transformer.memCopy,
+          Arguments([
+            transformer.getCompoundTypedDataBaseField(
+                ThisExpression(), fileOffset),
+            transformer.runtimeBranchOnLayout(offsets),
+            transformer.getCompoundTypedDataBaseField(
+                VariableGet(argument), fileOffset),
+            ConstantExpression(IntConstant(0)),
+            transformer.runtimeBranchOnLayout(size),
+          ]))
+        ..fileOffset = fileOffset);
+}
+
+class StructNativeTypeCfe extends CompoundNativeTypeCfe {
+  // Nullable int.
+  final int? packing;
+
+  factory StructNativeTypeCfe(Class clazz, List<NativeTypeCfe> members,
+      {int? packing}) {
+    final layout = {
+      for (var abi in Abi.values) abi: _calculateLayout(members, packing, abi)
+    };
+    return StructNativeTypeCfe._(clazz, members, packing, layout);
+  }
+
+  StructNativeTypeCfe._(Class clazz, List<NativeTypeCfe> members, this.packing,
+      Map<Abi, CompoundLayout> layout)
+      : super._(clazz, members, layout);
+
+  // Keep consistent with runtime/vm/compiler/ffi/native_type.cc
+  // NativeStructType::FromNativeTypes.
+  static CompoundLayout _calculateLayout(
+      List<NativeTypeCfe> types, int? packing, Abi abi) {
+    int? offset = 0;
+    final offsets = <int?>[];
+    int? structAlignment = 1;
+    for (int i = 0; i < types.length; i++) {
+      final int? size = types[i].size[abi];
+      int? alignment = types[i].alignment[abi];
+      if (packing != null) {
+        alignment = min(packing, alignment);
+      }
+      if (alignment != null && alignment > 0) {
+        offset = offset.align(alignment);
+      }
+      offsets.add(offset);
+      offset += size;
+      structAlignment = max(structAlignment, alignment);
+    }
+    final int? size = offset.align(structAlignment);
+    return CompoundLayout(size, structAlignment, offsets);
+  }
+}
+
+class UnionNativeTypeCfe extends CompoundNativeTypeCfe {
+  factory UnionNativeTypeCfe(Class clazz, List<NativeTypeCfe> members) {
+    final layout = {
+      for (var abi in Abi.values) abi: _calculateLayout(members, abi)
+    };
+    return UnionNativeTypeCfe._(clazz, members, layout);
+  }
+
+  UnionNativeTypeCfe._(
+      Class clazz, List<NativeTypeCfe> members, Map<Abi, CompoundLayout> layout)
+      : super._(clazz, members, layout);
+
+  // Keep consistent with runtime/vm/compiler/ffi/native_type.cc
+  // NativeUnionType::FromNativeTypes.
+  static CompoundLayout _calculateLayout(List<NativeTypeCfe> types, Abi abi) {
+    int? unionSize = 1;
+    int? unionAlignment = 1;
+    for (int i = 0; i < types.length; i++) {
+      final int? size = types[i].size[abi];
+      int? alignment = types[i].alignment[abi];
+      unionSize = max(unionSize, size);
+      unionAlignment = max(unionAlignment, alignment);
+    }
+    final int? size = unionSize.align(unionAlignment);
+    return CompoundLayout(size, unionAlignment, List.filled(types.length, 0));
+  }
+}
+
+class ArrayNativeTypeCfe implements NativeTypeCfe {
+  final NativeTypeCfe elementType;
+  final int length;
+
+  ArrayNativeTypeCfe(this.elementType, this.length);
+
+  factory ArrayNativeTypeCfe.multi(
+      NativeTypeCfe elementType, List<int> dimensions) {
+    if (dimensions.length == 1) {
+      return ArrayNativeTypeCfe(elementType, dimensions.single);
+    }
+    return ArrayNativeTypeCfe(
+        ArrayNativeTypeCfe.multi(elementType, dimensions.sublist(1)),
+        dimensions.first);
+  }
+
+  List<int> get dimensions {
+    final elementType = this.elementType;
+    if (elementType is ArrayNativeTypeCfe) {
+      return [length, ...elementType.dimensions];
+    }
+    return [length];
+  }
+
+  List<int> get nestedDimensions => dimensions.sublist(1);
+
+  int get dimensionsFlattened =>
+      dimensions.fold(1, (accumulator, element) => accumulator * element);
+
+  NativeTypeCfe get singleElementType {
+    final elementType = this.elementType;
+    if (elementType is ArrayNativeTypeCfe) {
+      return elementType.singleElementType;
+    }
+    return elementType;
+  }
+
+  @override
+  Map<Abi, int?> get size =>
+      elementType.size.map((abi, size) => MapEntry(abi, size * length));
+
+  @override
+  Map<Abi, int?> get alignment => elementType.alignment;
+
+  // Note that we flatten multi dimensional arrays.
+  @override
+  Constant generateConstant(FfiTransformer transformer) =>
+      InstanceConstant(transformer.ffiInlineArrayClass.reference, [], {
+        transformer.ffiInlineArrayElementTypeField.fieldReference:
+            singleElementType.generateConstant(transformer),
+        transformer.ffiInlineArrayLengthField.fieldReference:
+            IntConstant(dimensionsFlattened)
+      });
+
+  /// Sample output for `Array<Int8> get x =>`:
+  ///
+  /// ```
+  /// Array<Int8>._(
+  ///   typedDataBaseOffset(_typedDataBase, offset, size, typeArgument)
+  /// );
+  /// ```
+  @override
+  ReturnStatement generateGetterStatement(
+      DartType dartType,
+      int fileOffset,
+      Map<Abi, int?> offsets,
+      bool unalignedAccess,
+      FfiTransformer transformer) {
+    InterfaceType typeArgument =
+        (dartType as InterfaceType).typeArguments.single as InterfaceType;
+    return ReturnStatement(ConstructorInvocation(
+        transformer.arrayConstructor,
+        Arguments([
+          transformer.typedDataBaseOffset(
+              transformer.getCompoundTypedDataBaseField(
+                  ThisExpression(), fileOffset),
+              transformer.runtimeBranchOnLayout(offsets),
+              transformer.runtimeBranchOnLayout(size),
+              typeArgument,
+              fileOffset),
+          ConstantExpression(IntConstant(length)),
+          transformer.intListConstantExpression(nestedDimensions)
+        ], types: [
+          typeArgument
+        ]))
+      ..fileOffset = fileOffset);
+  }
+
+  /// Sample output for `set x(Array #v) =>`:
+  ///
+  /// ```
+  /// _memCopy(_typedDataBase, offset, #v._typedDataBase, 0, size);
+  /// ```
+  @override
+  ReturnStatement generateSetterStatement(
+          DartType dartType,
+          int fileOffset,
+          Map<Abi, int?> offsets,
+          bool unalignedAccess,
+          VariableDeclaration argument,
+          FfiTransformer transformer) =>
+      ReturnStatement(StaticInvocation(
+          transformer.memCopy,
+          Arguments([
+            transformer.getCompoundTypedDataBaseField(
+                ThisExpression(), fileOffset),
+            transformer.runtimeBranchOnLayout(offsets),
+            transformer.getArrayTypedDataBaseField(
+                VariableGet(argument), fileOffset),
+            ConstantExpression(IntConstant(0)),
+            transformer.runtimeBranchOnLayout(size),
+          ]))
+        ..fileOffset = fileOffset);
+}
+
+extension on int? {
+  int? align(int? alignment) =>
+      ((this + alignment - 1) ~/ alignment) * alignment;
+
+  int? operator *(int? other) {
+    final this_ = this;
+    if (this_ == null) {
+      return null;
+    }
+    if (other == null) {
+      return null;
+    }
+    return this_ * other;
+  }
+
+  int? operator +(int? other) {
+    final this_ = this;
+    if (this_ == null) {
+      return null;
+    }
+    if (other == null) {
+      return null;
+    }
+    return this_ + other;
+  }
+
+  int? operator -(int? other) {
+    final this_ = this;
+    if (this_ == null) {
+      return null;
+    }
+    if (other == null) {
+      return null;
+    }
+    return this_ - other;
+  }
+
+  int? operator ~/(int? other) {
+    final this_ = this;
+    if (this_ == null) {
+      return null;
+    }
+    if (other == null) {
+      return null;
+    }
+    return this_ ~/ other;
+  }
+}
+
+int? max(int? a, int? b) {
+  if (a == null) {
+    return null;
+  }
+  if (b == null) {
+    return null;
+  }
+  return math.max(a, b);
+}
+
+int? min(int? a, int? b) {
+  if (a == null) {
+    return null;
+  }
+  if (b == null) {
+    return null;
+  }
+  return math.min(a, b);
+}
diff --git a/pkg/vm/lib/transformations/ffi/use_sites.dart b/pkg/vm/lib/transformations/ffi/use_sites.dart
index 744bc00..69a52e5 100644
--- a/pkg/vm/lib/transformations/ffi/use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi/use_sites.dart
@@ -26,14 +26,9 @@
 import 'package:kernel/type_algebra.dart' show Substitution;
 import 'package:kernel/type_environment.dart';
 
+import 'abi.dart' show wordSize;
 import 'common.dart'
-    show
-        NativeType,
-        FfiTransformer,
-        nativeTypeSizes,
-        WORD_SIZE,
-        UNKNOWN,
-        wordSize;
+    show NativeType, FfiTransformer, nativeTypeSizes, WORD_SIZE, UNKNOWN;
 
 /// Checks and replaces calls to dart:ffi compound fields and methods.
 void transformLibraries(
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
index 61870d6..7cdec21 100644
--- a/pkg/vm/lib/transformations/type_flow/analysis.dart
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -764,6 +764,16 @@
   /// different arguments reaches this limit.
   static const int maxInvocationsPerSelector = 5000;
 
+  /// [_DirectInvocation] can be approximated with raw arguments
+  /// if number of operations in its summary exceeds this threshold.
+  static const int largeSummarySize = 300;
+
+  /// If summary exceeds [largeSummarySize] and number of
+  /// [_DirectInvocation] objects with same selector but
+  /// different arguments exceeds this limit, then approximate
+  /// [_DirectInvocation] with raw arguments is created and used.
+  static const int maxDirectInvocationsPerSelector = 10;
+
   int count = 0;
   _Invocation? approximation;
 }
@@ -773,14 +783,19 @@
 class _InvocationsCache {
   final TypeFlowAnalysis _typeFlowAnalysis;
   final Set<_Invocation> _invocations = new Set<_Invocation>();
-  final Map<Selector, _SelectorApproximation> _approximations =
-      <Selector, _SelectorApproximation>{};
+  final Map<InterfaceSelector, _SelectorApproximation>
+      _interfaceSelectorApproximations =
+      <InterfaceSelector, _SelectorApproximation>{};
+  final Map<DirectSelector, _SelectorApproximation>
+      _directSelectorApproximations =
+      <DirectSelector, _SelectorApproximation>{};
 
   _InvocationsCache(this._typeFlowAnalysis);
 
   _Invocation getInvocation(Selector selector, Args<Type> args) {
     ++Statistics.invocationsQueriedInCache;
-    _Invocation invocation = (selector is DirectSelector)
+    final bool isDirectSelector = (selector is DirectSelector);
+    _Invocation invocation = isDirectSelector
         ? new _DirectInvocation(selector, args)
         : new _DispatchableInvocation(selector, args);
     _Invocation? result = _invocations.lookup(invocation);
@@ -788,12 +803,36 @@
       return result;
     }
 
-    if (selector is InterfaceSelector) {
+    if (isDirectSelector) {
+      // If there is a selector approximation (meaning the summary is large)
+      // then number of distinct invocations per selector should be limited
+      // in order to bound analysis time.
+
+      final sa = _directSelectorApproximations[selector];
+      if (sa != null) {
+        if (sa.count >=
+            _SelectorApproximation.maxDirectInvocationsPerSelector) {
+          _Invocation? approximation = sa.approximation;
+          if (approximation == null) {
+            final rawArgs =
+                _typeFlowAnalysis.summaryCollector.rawArguments(selector);
+            sa.approximation =
+                approximation = _DirectInvocation(selector, rawArgs);
+            approximation.init();
+            Statistics.approximateDirectInvocationsCreated++;
+          }
+          Statistics.approximateDirectInvocationsUsed++;
+          return approximation;
+        }
+        ++sa.count;
+      }
+    } else if (selector is InterfaceSelector) {
       // Detect if there are too many invocations per selector. In such case,
       // approximate extra invocations with a single invocation with raw
       // arguments.
 
-      final sa = (_approximations[selector] ??= new _SelectorApproximation());
+      final sa = (_interfaceSelectorApproximations[selector] ??=
+          new _SelectorApproximation());
 
       if (sa.count >= _SelectorApproximation.maxInvocationsPerSelector) {
         _Invocation? approximation = sa.approximation;
@@ -803,9 +842,9 @@
           sa.approximation =
               approximation = _DispatchableInvocation(selector, rawArgs);
           approximation.init();
-          Statistics.approximateInvocationsCreated++;
+          Statistics.approximateInterfaceInvocationsCreated++;
         }
-        Statistics.approximateInvocationsUsed++;
+        Statistics.approximateInterfaceInvocationsUsed++;
         return approximation;
       }
 
@@ -820,6 +859,10 @@
     ++Statistics.invocationsAddedToCache;
     return invocation;
   }
+
+  void addDirectSelectorApproximation(DirectSelector selector) {
+    _directSelectorApproximations[selector] ??= new _SelectorApproximation();
+  }
 }
 
 class _FieldValue extends _DependencyTracker {
@@ -1530,7 +1573,17 @@
   _Invocation get currentInvocation => workList.callStack.last;
 
   Summary getSummary(Member member) {
-    return _summaries[member] ??= summaryCollector.createSummary(member);
+    Summary? summary = _summaries[member];
+    if (summary == null) {
+      _summaries[member] = summary = summaryCollector.createSummary(member);
+      if (summary.statements.length >=
+          _SelectorApproximation.largeSummarySize) {
+        final DirectSelector selector =
+            currentInvocation.selector as DirectSelector;
+        _invocationsCache.addDirectSelectorApproximation(selector);
+      }
+    }
+    return summary;
   }
 
   _FieldValue getFieldValue(Field field) {
diff --git a/pkg/vm/lib/transformations/type_flow/summary.dart b/pkg/vm/lib/transformations/type_flow/summary.dart
index 72b0b68..a309138 100644
--- a/pkg/vm/lib/transformations/type_flow/summary.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary.dart
@@ -682,8 +682,8 @@
       if (staticTypeForNarrowing != null) {
         types[i] = argType.intersection(staticTypeForNarrowing, typeHierarchy);
       } else {
-        // TODO(sjindel/tfa): Narrowing is performed inside a [TypeCheck] later.
-        types[i] = args[i];
+        // Narrowing is performed inside a [TypeCheck] later.
+        types[i] = argType;
       }
     }
 
diff --git a/pkg/vm/lib/transformations/type_flow/utils.dart b/pkg/vm/lib/transformations/type_flow/utils.dart
index c85dfc7..42f54c0 100644
--- a/pkg/vm/lib/transformations/type_flow/utils.dart
+++ b/pkg/vm/lib/transformations/type_flow/utils.dart
@@ -188,8 +188,10 @@
   static int invocationsQueriedInCache = 0;
   static int invocationsAddedToCache = 0;
   static int maxInvocationsCachedPerSelector = 0;
-  static int approximateInvocationsCreated = 0;
-  static int approximateInvocationsUsed = 0;
+  static int approximateDirectInvocationsCreated = 0;
+  static int approximateDirectInvocationsUsed = 0;
+  static int approximateInterfaceInvocationsCreated = 0;
+  static int approximateInterfaceInvocationsUsed = 0;
   static int deepInvocationsDeferred = 0;
   static int classesDropped = 0;
   static int membersDropped = 0;
@@ -222,8 +224,10 @@
     invocationsQueriedInCache = 0;
     invocationsAddedToCache = 0;
     maxInvocationsCachedPerSelector = 0;
-    approximateInvocationsCreated = 0;
-    approximateInvocationsUsed = 0;
+    approximateDirectInvocationsCreated = 0;
+    approximateDirectInvocationsUsed = 0;
+    approximateInterfaceInvocationsCreated = 0;
+    approximateInterfaceInvocationsUsed = 0;
     deepInvocationsDeferred = 0;
     classesDropped = 0;
     membersDropped = 0;
@@ -267,8 +271,10 @@
     ${invocationsQueriedInCache} invocations queried in cache
     ${invocationsAddedToCache} invocations added to cache
     ${maxInvocationsCachedPerSelector} maximum invocations cached per selector
-    ${approximateInvocationsCreated} approximate invocations created
-    ${approximateInvocationsUsed} times approximate invocation is used
+    ${approximateDirectInvocationsCreated} approximate direct invocations created
+    ${approximateDirectInvocationsUsed} times direct interface invocation is used
+    ${approximateInterfaceInvocationsCreated} approximate interface invocations created
+    ${approximateInterfaceInvocationsUsed} times approximate interface invocation is used
     ${deepInvocationsDeferred} times invocation processing was deferred due to deep call stack
     ${classesDropped} classes dropped
     ${membersDropped} members dropped
diff --git a/pkg/vm/test/incremental_compiler_test.dart b/pkg/vm/test/incremental_compiler_test.dart
index b24cb9e..62a66f4 100644
--- a/pkg/vm/test/incremental_compiler_test.dart
+++ b/pkg/vm/test/incremental_compiler_test.dart
@@ -12,6 +12,7 @@
         CompilerOptions,
         DiagnosticMessage,
         ExperimentalFlag,
+        IncrementalCompilerResult,
         computePlatformBinariesLocation;
 import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
 import 'package:kernel/binary/ast_to_binary.dart';
@@ -65,7 +66,8 @@
 
     test('compile', () async {
       IncrementalCompiler compiler = new IncrementalCompiler(options, main.uri);
-      Component component = await compiler.compile();
+      IncrementalCompilerResult compilerResult = await compiler.compile();
+      Component component = compilerResult.component;
 
       final StringBuffer buffer = new StringBuffer();
       new Printer(buffer, showMetadata: true)
@@ -83,7 +85,8 @@
         ..embedSourceText = false;
       IncrementalCompiler compiler =
           new IncrementalCompiler(optionsExcludeSources, main.uri);
-      Component component = await compiler.compile();
+      IncrementalCompilerResult compilerResult = await compiler.compile();
+      Component component = compilerResult.component;
 
       for (Source source in component.uriToSource.values) {
         expect(source.source.length, equals(0));
@@ -319,7 +322,8 @@
 
     compileAndSerialize(
         File mainDill, File libDill, IncrementalCompiler compiler) async {
-      Component component = await compiler.compile();
+      IncrementalCompilerResult compilerResult = await compiler.compile();
+      Component component = compilerResult.component;
       new BinaryPrinter(new DevNullSink<List<int>>())
           .writeComponentFile(component);
       IOSink sink = mainDill.openWrite();
@@ -621,7 +625,8 @@
       // collector helper in this file.
       File libDill = File(p.join(dir.path, p.basename(lib1.path + ".dill")));
       IncrementalCompiler compiler = new IncrementalCompiler(options, lib1.uri);
-      Component component = await compiler.compile();
+      IncrementalCompilerResult compilerResult = await compiler.compile();
+      Component component = compilerResult.component;
       expect(component.libraries.length, equals(1));
       expect(component.libraries.single.fileUri, equals(lib1.uri));
       IOSink sink = libDill.openWrite();
@@ -649,7 +654,8 @@
       // Then compile lib, run and verify coverage (un-named constructor
       // covered, and the named constructor coveraged too).
       File mainDill = File(p.join(dir.path, p.basename(main.path + ".dill")));
-      component = await compiler.compile(entryPoint: main.uri);
+      compilerResult = await compiler.compile(entryPoint: main.uri);
+      component = compilerResult.component;
       expect(component.libraries.length, equals(1));
       expect(component.libraries.single.fileUri, equals(main.uri));
       sink = mainDill.openWrite();
@@ -706,7 +712,8 @@
       int newLineForUnnamedConstructor = 8;
       int newLineForNamedConstructor = 9;
       compiler.invalidate(lib1.uri);
-      component = await compiler.compile(entryPoint: lib1.uri);
+      compilerResult = await compiler.compile(entryPoint: lib1.uri);
+      component = compilerResult.component;
       expect(component.libraries.length, equals(1));
       expect(component.libraries.single.fileUri, equals(lib1.uri));
       sink = libDill.openWrite();
@@ -794,7 +801,8 @@
 
     compileAndSerialize(File mainDill, File lib1Dill, File lib2Dill,
         IncrementalCompiler compiler) async {
-      Component component = await compiler.compile();
+      IncrementalCompilerResult compilerResult = await compiler.compile();
+      Component component = compilerResult.component;
       new BinaryPrinter(new DevNullSink<List<int>>())
           .writeComponentFile(component);
       IOSink sink = mainDill.openWrite();
@@ -901,7 +909,8 @@
           "openReceivePortSoWeWontDie() { new RawReceivePort(); }\n");
 
       IncrementalCompiler compiler = new IncrementalCompiler(options, file.uri);
-      Component component = await compiler.compile();
+      IncrementalCompilerResult compilerResult = await compiler.compile();
+      Component component = compilerResult.component;
 
       File outputFile = new File('${mytest.path}/foo.dart.dill');
       await _writeProgramToFile(component, outputFile);
@@ -948,7 +957,8 @@
       compiler.accept();
 
       // Confirm that without changes VM reloads nothing.
-      component = await compiler.compile();
+      compilerResult = await compiler.compile();
+      component = compilerResult.component;
       await _writeProgramToFile(component, outputFile);
       var reloadResult = await remoteVm.reload(new Uri.file(outputFile.path));
       expect(reloadResult['success'], isTrue);
@@ -957,7 +967,8 @@
       // Introduce a change that force VM to reject the change.
       fileBar.writeAsStringSync("class A<T,U> { int _a = 0; }\n");
       compiler.invalidate(fileBar.uri);
-      component = await compiler.compile();
+      compilerResult = await compiler.compile();
+      component = compilerResult.component;
       await _writeProgramToFile(component, outputFile);
       reloadResult = await remoteVm.reload(new Uri.file(outputFile.path));
       expect(reloadResult['success'], isFalse);
@@ -965,7 +976,8 @@
       // Fix a change so VM is happy to accept the change.
       fileBar.writeAsStringSync("class A<T> { int _a = 0; hi() => _a; }\n");
       compiler.invalidate(fileBar.uri);
-      component = await compiler.compile();
+      compilerResult = await compiler.compile();
+      component = compilerResult.component;
       await _writeProgramToFile(component, outputFile);
       reloadResult = await remoteVm.reload(new Uri.file(outputFile.path));
       expect(reloadResult['success'], isTrue);
@@ -1018,7 +1030,9 @@
       IncrementalCompiler compiler =
           new IncrementalCompiler(optionsModified, packageEntry);
       {
-        Component component = await compiler.compile(entryPoint: packageEntry);
+        IncrementalCompilerResult compilerResult =
+            await compiler.compile(entryPoint: packageEntry);
+        Component component = compilerResult.component;
         File outputFile = new File('${mytest.path}/foo.dart.dill');
         await _writeProgramToFile(component, outputFile);
       }
@@ -1033,7 +1047,9 @@
           .writeAsStringSync("class A { static int b; }\n");
       compiler.invalidate(barUri);
       {
-        Component component = await compiler.compile(entryPoint: packageEntry);
+        IncrementalCompilerResult compilerResult =
+            await compiler.compile(entryPoint: packageEntry);
+        Component component = compilerResult.component;
         File outputFile = new File('${mytest.path}/foo1.dart.dill');
         await _writeProgramToFile(component, outputFile);
       }
@@ -1076,7 +1092,9 @@
       Library fooLib;
       Library barLib;
       {
-        final Component component = await compiler.compile(entryPoint: fooUri);
+        final IncrementalCompilerResult compilerResult =
+            await compiler.compile(entryPoint: fooUri);
+        final Component component = compilerResult.component;
         expect(component.libraries.length, equals(2));
         fooLib = component.libraries.firstWhere((lib) => lib.fileUri == fooUri);
         barLib = component.libraries.firstWhere((lib) => lib.fileUri == barUri);
@@ -1104,7 +1122,9 @@
         """);
       compiler.invalidate(barUri);
       {
-        final Component component = await compiler.compile(entryPoint: fooUri);
+        final IncrementalCompilerResult compilerResult =
+            await compiler.compile(entryPoint: fooUri);
+        final Component component = compilerResult.component;
         final Library? fooLib2 = component.libraries
             .firstWhereOrNull((lib) => lib.fileUri == fooUri);
         expect(fooLib2, isNull);
@@ -1125,10 +1145,10 @@
         expect(lrc.librariesReferenced, equals(<Library>{barLib}));
       }
       {
-        // Verify that the saved "last known good" compnent only contains links
+        // Verify that the saved "last known good" component only contains links
         // to the original 'foo' and 'bar' libraries.
         final LibraryReferenceCollector lrc = new LibraryReferenceCollector();
-        compiler.lastKnownGoodComponent!.accept(lrc);
+        compiler.lastKnownGoodResult!.component.accept(lrc);
         expect(lrc.librariesReferenced, equals(<Library>{fooLib, barLib}));
       }
       {
@@ -1272,7 +1292,8 @@
       """);
       IncrementalCompiler compiler =
           new IncrementalCompiler(options, mainFile.uri);
-      Component component = await compiler.compile();
+      IncrementalCompilerResult compilerResult = await compiler.compile();
+      Component component = compilerResult.component;
       File mainDill = new File.fromUri(mainFile.uri.resolve("main.dill"));
       IOSink sink = mainDill.openWrite();
       new BinaryPrinter(sink).writeComponentFile(component);
@@ -1345,7 +1366,8 @@
       """);
       IncrementalCompiler compiler =
           new IncrementalCompiler(options, mainFile.uri);
-      Component component = await compiler.compile();
+      IncrementalCompilerResult compilerResult = await compiler.compile();
+      Component component = compilerResult.component;
       File mainDill = new File.fromUri(mainFile.uri.resolve("main.dill"));
       IOSink sink = mainDill.openWrite();
       new BinaryPrinter(sink).writeComponentFile(component);
@@ -1367,7 +1389,8 @@
         }
       """);
       compiler.invalidate(helperFile.uri);
-      component = await compiler.compile();
+      compilerResult = await compiler.compile();
+      component = compilerResult.component;
       File partial1Dill =
           new File.fromUri(mainFile.uri.resolve("partial1.dill"));
       sink = partial1Dill.openWrite();
@@ -1393,7 +1416,8 @@
         }
       """);
       compiler.invalidate(helperFile.uri);
-      component = await compiler.compile();
+      compilerResult = await compiler.compile();
+      component = compilerResult.component;
       File partial2Dill =
           new File.fromUri(mainFile.uri.resolve("partial2.dill"));
       sink = partial2Dill.openWrite();
@@ -1519,7 +1543,8 @@
         IncrementalCompiler compiler =
             new IncrementalCompiler(optionsModified, mainUri);
 
-        Component component = await compiler.compile();
+        IncrementalCompilerResult compilerResult = await compiler.compile();
+        Component component = compilerResult.component;
         File mainDill = new File.fromUri(mainFile.uri.resolve("main.dill"));
         IOSink sink = mainDill.openWrite();
         new BinaryPrinter(sink).writeComponentFile(component);
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/enum_from_lib_used_as_type.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/enum_from_lib_used_as_type.dart.expect
index 463adf9..db77666 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/enum_from_lib_used_as_type.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/enum_from_lib_used_as_type.dart.expect
@@ -22,6 +22,6 @@
   synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3252,getterSelectorId:3253]  method method([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::Enum e) → core::int
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3254,getterSelectorId:3255]  method method([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::Enum e) → core::int
     return [@vm.inferred-type.metadata=!] e.{core::_Enum::index}{core::int};
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/ffi_struct_constructors.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/ffi_struct_constructors.dart.expect
index f449731..c2c6faa 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/ffi_struct_constructors.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/ffi_struct_constructors.dart.expect
@@ -128,10 +128,10 @@
   #C9 = ffi::_FfiStructLayout {fieldTypes:#C8, packing:#C4}
   #C10 = core::pragma {name:#C1, options:#C9}
   #C11 = 0
-  #C12 = <core::int*>[#C11, #C11, #C11]
-  #C13 = 8
-  #C14 = 4
-  #C15 = <core::int*>[#C13, #C14, #C14]
+  #C12 = <core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
+  #C13 = 4
+  #C14 = 8
+  #C15 = <core::int*>[#C13, #C14, #C13, #C14, #C14, #C14, #C13, #C14, #C14, #C13, #C14, #C13, #C14, #C14, #C14, #C14, #C13, #C14]
   #C16 = static-tearoff self::useStruct3
   #C17 = static-tearoff self::returnStruct7
   #C18 = 1
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tree_shake_enum_from_lib.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tree_shake_enum_from_lib.dart.expect
index 3a69351..3aa20dc 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tree_shake_enum_from_lib.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tree_shake_enum_from_lib.dart.expect
@@ -51,6 +51,6 @@
   synthetic constructor •() → self::ConstClass
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3256,getterSelectorId:3257]  method method([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::ConstEnum e) → core::int
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3258,getterSelectorId:3259]  method method([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::ConstEnum e) → core::int
     return [@vm.inferred-type.metadata=!] e.{core::_Enum::index}{core::int};
 }
diff --git a/pkg/vm/tool/compare_il b/pkg/vm/tool/compare_il
index 65ad55e..4973042 100755
--- a/pkg/vm/tool/compare_il
+++ b/pkg/vm/tool/compare_il
@@ -26,10 +26,6 @@
 
 # TODO(kustermann): For windows as well as for hosts running on arm, our
 # checked-in dart binaries must be adjusted.
-if [[ `uname` == 'Darwin' ]]; then
-  DART="$SDK_DIR/tools/sdks/dart-sdk/bin/dart"
-else
-  DART="$SDK_DIR/tools/sdks/dart-sdk/bin/dart"
-fi
+DART="$SDK_DIR/tools/sdks/dart-sdk/bin/dart"
 
 exec "$DART" $DART_VM_FLAGS "${SDK_DIR}/pkg/vm/bin/compare_il.dart" $@
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index 6b3803c..16605c0 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,5 +1,20 @@
 # Changelog
 
+## 8.0.0
+- *breaking* Updated type of `Event.cpuSamples` from `CpuSamples` to
+  `CpuSamplesEvent`, which is less expensive to generate and serialize.
+- Added `CpuSamplesEvent` object.
+
+## 7.5.0
+- Update to version `3.53` of the spec.
+- Added `setIsolatePauseMode` RPC.
+- Deprecated `setExceptionPauseMode` in favor of `setIsolatePauseMode`.
+
+## 7.4.0
+- Update to version `3.52` of the spec.
+- Added `lookupResolvedPackageUris` and `lookupPackageUris` RPCs and `UriList`
+  type.
+
 ## 7.3.0
 - Update to version `3.51` of the spec.
 - Added optional `reportLines` parameter to `getSourceReport` RPC.
diff --git a/pkg/vm_service/example/vm_service_assert.dart b/pkg/vm_service/example/vm_service_assert.dart
index f30e794..aa1b7c7 100644
--- a/pkg/vm_service/example/vm_service_assert.dart
+++ b/pkg/vm_service/example/vm_service_assert.dart
@@ -453,6 +453,20 @@
   return obj;
 }
 
+vms.CpuSamplesEvent assertCpuSamplesEvent(vms.CpuSamplesEvent obj) {
+  assertNotNull(obj);
+  assertInt(obj.samplePeriod!);
+  assertInt(obj.maxStackDepth!);
+  assertInt(obj.sampleCount!);
+  assertInt(obj.timeSpan!);
+  assertInt(obj.timeOriginMicros!);
+  assertInt(obj.timeExtentMicros!);
+  assertInt(obj.pid!);
+  assertListOfDynamic(obj.functions!);
+  assertListOfCpuSample(obj.samples!);
+  return obj;
+}
+
 vms.CpuSample assertCpuSample(vms.CpuSample obj) {
   assertNotNull(obj);
   assertInt(obj.tid!);
diff --git a/pkg/vm_service/java/.gitignore b/pkg/vm_service/java/.gitignore
index 817e983..5fe823e 100644
--- a/pkg/vm_service/java/.gitignore
+++ b/pkg/vm_service/java/.gitignore
@@ -36,6 +36,7 @@
 src/org/dartlang/vm/service/consumer/ResumeConsumer.java
 src/org/dartlang/vm/service/consumer/SetExceptionPauseModeConsumer.java
 src/org/dartlang/vm/service/consumer/SetFlagConsumer.java
+src/org/dartlang/vm/service/consumer/SetIsolatePauseModeConsumer.java
 src/org/dartlang/vm/service/consumer/SetLibraryDebuggableConsumer.java
 src/org/dartlang/vm/service/consumer/SetNameConsumer.java
 src/org/dartlang/vm/service/consumer/SetTraceClassAllocationConsumer.java
@@ -62,6 +63,7 @@
 src/org/dartlang/vm/service/element/ContextRef.java
 src/org/dartlang/vm/service/element/CpuSample.java
 src/org/dartlang/vm/service/element/CpuSamples.java
+src/org/dartlang/vm/service/element/CpuSamplesEvent.java
 src/org/dartlang/vm/service/element/ErrorKind.java
 src/org/dartlang/vm/service/element/ErrorObj.java
 src/org/dartlang/vm/service/element/ErrorRef.java
diff --git a/pkg/vm_service/java/version.properties b/pkg/vm_service/java/version.properties
index 8ae6998..84daa3b 100644
--- a/pkg/vm_service/java/version.properties
+++ b/pkg/vm_service/java/version.properties
@@ -1 +1 @@
-version=3.52
+version=3.54
diff --git a/pkg/vm_service/lib/src/vm_service.dart b/pkg/vm_service/lib/src/vm_service.dart
index 51958bd..fcdfe9b 100644
--- a/pkg/vm_service/lib/src/vm_service.dart
+++ b/pkg/vm_service/lib/src/vm_service.dart
@@ -26,7 +26,7 @@
         HeapSnapshotObjectNoData,
         HeapSnapshotObjectNullData;
 
-const String vmServiceVersion = '3.52.0';
+const String vmServiceVersion = '3.54.0';
 
 /// @optional
 const String optional = 'optional';
@@ -123,6 +123,7 @@
   'Context': Context.parse,
   'ContextElement': ContextElement.parse,
   'CpuSamples': CpuSamples.parse,
+  'CpuSamplesEvent': CpuSamplesEvent.parse,
   'CpuSample': CpuSample.parse,
   '@Error': ErrorRef.parse,
   'Error': Error.parse,
@@ -236,6 +237,7 @@
   'resume': const ['Success'],
   'setBreakpointState': const ['Breakpoint'],
   'setExceptionPauseMode': const ['Success'],
+  'setIsolatePauseMode': const ['Success'],
   'setFlag': const ['Success', 'Error'],
   'setLibraryDebuggable': const ['Success'],
   'setName': const ['Success'],
@@ -1078,9 +1080,34 @@
   ///
   /// This method will throw a [SentinelException] in the case a [Sentinel] is
   /// returned.
+  @Deprecated('Use setIsolatePauseMode instead')
   Future<Success> setExceptionPauseMode(
       String isolateId, /*ExceptionPauseMode*/ String mode);
 
+  /// The `setIsolatePauseMode` RPC is used to control if or when an isolate
+  /// will pause due to a change in execution state.
+  ///
+  /// The `shouldPauseOnExit` parameter specify whether the target isolate
+  /// should pause on exit.
+  ///
+  /// The `setExceptionPauseMode` RPC is used to control if an isolate pauses
+  /// when an exception is thrown.
+  ///
+  /// mode | meaning
+  /// ---- | -------
+  /// None | Do not pause isolate on thrown exceptions
+  /// Unhandled | Pause isolate on unhandled exceptions
+  /// All  | Pause isolate on all thrown exceptions
+  ///
+  /// If `isolateId` refers to an isolate which has exited, then the `Collected`
+  /// [Sentinel] is returned.
+  ///
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Success> setIsolatePauseMode(String isolateId,
+      {/*ExceptionPauseMode*/ String? exceptionPauseMode,
+      bool? shouldPauseOnExit});
+
   /// The `setFlag` RPC is used to set a VM flag at runtime. Returns an error if
   /// the named flag does not exist, the flag may not be set at runtime, or the
   /// value is of the wrong type for the flag.
@@ -1101,6 +1128,7 @@
   /// provided value. If set to false when the profiler is already running, the
   /// profiler will be stopped but may not free its sample buffer depending on
   /// platform limitations.
+  /// - Isolate pause settings will only be applied to newly spawned isolates.
   ///
   /// See [Success].
   ///
@@ -1549,11 +1577,19 @@
           );
           break;
         case 'setExceptionPauseMode':
+          // ignore: deprecated_member_use_from_same_package
           response = await _serviceImplementation.setExceptionPauseMode(
             params!['isolateId'],
             params['mode'],
           );
           break;
+        case 'setIsolatePauseMode':
+          response = await _serviceImplementation.setIsolatePauseMode(
+            params!['isolateId'],
+            exceptionPauseMode: params['exceptionPauseMode'],
+            shouldPauseOnExit: params['shouldPauseOnExit'],
+          );
+          break;
         case 'setFlag':
           response = await _serviceImplementation.setFlag(
             params!['name'],
@@ -2081,12 +2117,24 @@
         'enable': enable
       });
 
+  @Deprecated('Use setIsolatePauseMode instead')
   @override
   Future<Success> setExceptionPauseMode(
           String isolateId, /*ExceptionPauseMode*/ String mode) =>
       _call('setExceptionPauseMode', {'isolateId': isolateId, 'mode': mode});
 
   @override
+  Future<Success> setIsolatePauseMode(String isolateId,
+          {/*ExceptionPauseMode*/ String? exceptionPauseMode,
+          bool? shouldPauseOnExit}) =>
+      _call('setIsolatePauseMode', {
+        'isolateId': isolateId,
+        if (exceptionPauseMode != null)
+          'exceptionPauseMode': exceptionPauseMode,
+        if (shouldPauseOnExit != null) 'shouldPauseOnExit': shouldPauseOnExit,
+      });
+
+  @override
   Future<Response> setFlag(String name, String value) =>
       _call('setFlag', {'name': name, 'value': value});
 
@@ -3611,6 +3659,92 @@
   String toString() => '[CpuSamples]';
 }
 
+class CpuSamplesEvent {
+  static CpuSamplesEvent? parse(Map<String, dynamic>? json) =>
+      json == null ? null : CpuSamplesEvent._fromJson(json);
+
+  /// The sampling rate for the profiler in microseconds.
+  int? samplePeriod;
+
+  /// The maximum possible stack depth for samples.
+  int? maxStackDepth;
+
+  /// The number of samples returned.
+  int? sampleCount;
+
+  /// The timespan the set of returned samples covers, in microseconds
+  /// (deprecated).
+  ///
+  /// Note: this property is deprecated and will always return -1. Use
+  /// `timeExtentMicros` instead.
+  int? timeSpan;
+
+  /// The start of the period of time in which the returned samples were
+  /// collected.
+  int? timeOriginMicros;
+
+  /// The duration of time covered by the returned samples.
+  int? timeExtentMicros;
+
+  /// The process ID for the VM.
+  int? pid;
+
+  /// A list of references to functions seen in the relevant samples. These
+  /// references can be looked up using the indicies provided in a `CpuSample`
+  /// `stack` to determine which function was on the stack.
+  List<dynamic>? functions;
+
+  /// A list of samples collected in the range `[timeOriginMicros,
+  /// timeOriginMicros + timeExtentMicros]`
+  List<CpuSample>? samples;
+
+  CpuSamplesEvent({
+    required this.samplePeriod,
+    required this.maxStackDepth,
+    required this.sampleCount,
+    required this.timeSpan,
+    required this.timeOriginMicros,
+    required this.timeExtentMicros,
+    required this.pid,
+    required this.functions,
+    required this.samples,
+  });
+
+  CpuSamplesEvent._fromJson(Map<String, dynamic> json) {
+    samplePeriod = json['samplePeriod'] ?? -1;
+    maxStackDepth = json['maxStackDepth'] ?? -1;
+    sampleCount = json['sampleCount'] ?? -1;
+    timeSpan = json['timeSpan'] ?? -1;
+    timeOriginMicros = json['timeOriginMicros'] ?? -1;
+    timeExtentMicros = json['timeExtentMicros'] ?? -1;
+    pid = json['pid'] ?? -1;
+    functions = List<dynamic>.from(
+        createServiceObject(json['functions'], const ['dynamic']) as List? ??
+            []);
+    samples = List<CpuSample>.from(
+        createServiceObject(json['samples'], const ['CpuSample']) as List? ??
+            []);
+  }
+
+  Map<String, dynamic> toJson() {
+    final json = <String, dynamic>{};
+    json.addAll({
+      'samplePeriod': samplePeriod,
+      'maxStackDepth': maxStackDepth,
+      'sampleCount': sampleCount,
+      'timeSpan': timeSpan,
+      'timeOriginMicros': timeOriginMicros,
+      'timeExtentMicros': timeExtentMicros,
+      'pid': pid,
+      'functions': functions?.map((f) => f.toJson()).toList(),
+      'samples': samples?.map((f) => f.toJson()).toList(),
+    });
+    return json;
+  }
+
+  String toString() => '[CpuSamplesEvent]';
+}
+
 /// See [getCpuSamples] and [CpuSamples].
 class CpuSample {
   static CpuSample? parse(Map<String, dynamic>? json) =>
@@ -4004,7 +4138,7 @@
 
   /// A CPU profile containing recent samples.
   @optional
-  CpuSamples? cpuSamples;
+  CpuSamplesEvent? cpuSamples;
 
   /// Binary data associated with the event.
   ///
@@ -4085,8 +4219,9 @@
     last = json['last'];
     updatedTag = json['updatedTag'];
     previousTag = json['previousTag'];
-    cpuSamples = createServiceObject(json['cpuSamples'], const ['CpuSamples'])
-        as CpuSamples?;
+    cpuSamples =
+        createServiceObject(json['cpuSamples'], const ['CpuSamplesEvent'])
+            as CpuSamplesEvent?;
     data = json['data'];
   }
 
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index 85b7cad..d613713 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -3,7 +3,7 @@
   A library to communicate with a service implementing the Dart VM
   service protocol.
 
-version: 7.3.0
+version: 8.0.0
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_service
 
@@ -21,3 +21,5 @@
   process: ^4.0.0
   pub_semver: ^2.0.0-nullsafety.0
   test: ^1.16.0-nullsafety.13
+  test_package:
+    path: 'test/test_package'
diff --git a/pkg/vm_service/test/add_breakpoint_rpc_kernel_test.dart b/pkg/vm_service/test/add_breakpoint_rpc_kernel_test.dart
new file mode 100644
index 0000000..bead75c
--- /dev/null
+++ b/pkg/vm_service/test/add_breakpoint_rpc_kernel_test.dart
@@ -0,0 +1,178 @@
+// 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:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE_A = 24;
+const int LINE_B = 26;
+
+int value = 0;
+
+int incValue(int amount) {
+  value += amount;
+  return amount;
+}
+
+Future testMain() async {
+  incValue(incValue(1)); // line A.
+
+  incValue(incValue(1)); // line B.
+}
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+
+  // Test future breakpoints.
+  (VmService service, IsolateRef isolateRef) async {
+    final isolateId = isolateRef.id!;
+    final isolate = await service.getIsolate(isolateId);
+    final rootLib =
+        await service.getObject(isolateId, isolate.rootLib!.id!) as Library;
+    final rootLibId = rootLib.id!;
+    final scriptId = rootLib.scripts![0].id!;
+    final script = await service.getObject(isolateId, scriptId) as Script;
+
+    // Future breakpoint.
+    var futureBpt1 = await service.addBreakpoint(isolateId, scriptId, LINE_A);
+    expect(futureBpt1.breakpointNumber, 1);
+    expect(futureBpt1.resolved, isFalse);
+    expect(await futureBpt1.location!.line!, LINE_A);
+    expect(await futureBpt1.location!.column, null);
+
+    // Future breakpoint with specific column.
+    var futureBpt2 =
+        await service.addBreakpoint(isolateId, scriptId, LINE_A, column: 3);
+    expect(futureBpt2.breakpointNumber, 2);
+    expect(futureBpt2.resolved, isFalse);
+    expect(await futureBpt2.location!.line!, LINE_A);
+    expect(await futureBpt2.location!.column!, 3);
+
+    int resolvedCount = await resumeAndCountResolvedBreakpointsUntilPause(
+      service,
+      isolate,
+    );
+
+    // After resolution the breakpoints have assigned line & column.
+    expect(resolvedCount, 2);
+
+    // Refresh objects
+    futureBpt1 =
+        await service.getObject(isolateId, futureBpt1.id!) as Breakpoint;
+    futureBpt2 =
+        await service.getObject(isolateId, futureBpt2.id!) as Breakpoint;
+
+    expect(futureBpt1.resolved, isTrue);
+    expect(script.getLineNumberFromTokenPos(futureBpt1.location!.tokenPos!),
+        LINE_A);
+    expect(
+        script.getColumnNumberFromTokenPos(futureBpt1.location!.tokenPos!), 12);
+    expect(futureBpt2.resolved, isTrue);
+    expect(script.getLineNumberFromTokenPos(futureBpt2.location!.tokenPos!),
+        LINE_A);
+    expect(
+        script.getColumnNumberFromTokenPos(futureBpt2.location!.tokenPos!), 3);
+
+    // The first breakpoint hits before value is modified.
+    InstanceRef result =
+        await service.evaluate(isolateId, rootLibId, 'value') as InstanceRef;
+    expect(result.valueAsString, '0');
+
+    await service.resume(isolateId);
+    await hasStoppedAtBreakpoint(service, isolate);
+
+    // The second breakpoint hits after value has been modified once.
+    result =
+        await service.evaluate(isolateId, rootLibId, 'value') as InstanceRef;
+    expect(result.valueAsString, '1');
+
+    // Remove the breakpoints.
+    expect((await service.removeBreakpoint(isolateId, futureBpt1.id!)).type,
+        'Success');
+    expect((await service.removeBreakpoint(isolateId, futureBpt2.id!)).type,
+        'Success');
+  },
+
+  // Test resolution of column breakpoints.
+  (VmService service, IsolateRef isolateRef) async {
+    final isolateId = isolateRef.id!;
+    final isolate = await service.getIsolate(isolateId);
+    final rootLibId = isolate.rootLib!.id!;
+    final rootLib = await service.getObject(isolateId, rootLibId) as Library;
+
+    final scriptId = rootLib.scripts![0].id!;
+    final script = await service.getObject(isolateId, scriptId) as Script;
+
+    // Try all columns, including some columns that are too big.
+    for (int col = 1; col <= 50; col++) {
+      final bpt =
+          await service.addBreakpoint(isolateId, scriptId, LINE_A, column: col);
+      expect(bpt.resolved, isTrue);
+      int resolvedLine =
+          script.getLineNumberFromTokenPos(bpt.location!.tokenPos!)!;
+      int resolvedCol =
+          script.getColumnNumberFromTokenPos(bpt.location!.tokenPos!)!;
+      print('$LINE_A:${col} -> ${resolvedLine}:${resolvedCol}');
+      if (col <= 12) {
+        expect(resolvedLine, LINE_A);
+        expect(resolvedCol, 3);
+      } else if (col <= 36) {
+        expect(resolvedLine, LINE_A);
+        expect(resolvedCol, 12);
+      } else {
+        expect(resolvedLine, LINE_B);
+        expect(resolvedCol, 12);
+      }
+      expect(
+          (await service.removeBreakpoint(isolateId, bpt.id!)).type, 'Success');
+    }
+
+    // Make sure that a zero column is an error.
+    var caughtException = false;
+    try {
+      await service.addBreakpoint(isolateId, scriptId, 20, column: 0);
+      expect(false, isTrue, reason: 'Unreachable');
+    } on RPCError catch (e) {
+      caughtException = true;
+      expect(e.code, RPCError.kInvalidParams);
+      expect(e.details, "addBreakpoint: invalid 'column' parameter: 0");
+    }
+    expect(caughtException, isTrue);
+  },
+];
+
+Future<int> resumeAndCountResolvedBreakpointsUntilPause(
+    VmService service, Isolate isolate) async {
+  final completer = Completer<void>();
+  late StreamSubscription subscription;
+  int resolvedCount = 0;
+
+  subscription = service.onDebugEvent.listen((event) {
+    if (event.kind == EventKind.kBreakpointResolved) {
+      resolvedCount++;
+    } else if (event.kind == EventKind.kPauseBreakpoint) {
+      subscription.cancel();
+      service.streamCancel(EventStreams.kDebug);
+      completer.complete();
+    }
+  });
+  await service.streamListen(EventStreams.kDebug);
+
+  await service.resume(isolate.id!);
+  await completer.future;
+  return resolvedCount;
+}
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      'add_breakpoint_rpc_kernel_test.dart',
+      testeeConcurrent: testMain,
+      pause_on_start: true,
+    );
diff --git a/pkg/vm_service/test/allocations_test.dart b/pkg/vm_service/test/allocations_test.dart
new file mode 100644
index 0000000..9e38e57
--- /dev/null
+++ b/pkg/vm_service/test/allocations_test.dart
@@ -0,0 +1,43 @@
+// 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/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/test_helper.dart';
+
+class Foo {}
+
+// Prevent TFA from removing this static field to ensure the objects are kept
+// alive, so the allocation stats will report them via the service api.
+@pragma('vm:entry-point')
+List<Foo>? foos;
+
+void script() {
+  foos = [
+    Foo(),
+    Foo(),
+    Foo(),
+  ];
+}
+
+var tests = <IsolateTest>[
+  (VmService service, IsolateRef isolateRef) async {
+    var profile = await service.callMethod('_getAllocationProfile',
+        isolateId: isolateRef.id!) as AllocationProfile;
+    print(profile.runtimeType);
+    var classHeapStats = profile.members!.singleWhere((stats) {
+      return stats.classRef!.name == 'Foo';
+    });
+    expect(classHeapStats.instancesCurrent, 3);
+    expect(classHeapStats.instancesAccumulated, 3);
+  },
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      'allocations_test.dart',
+      testeeBefore: script,
+    );
diff --git a/pkg/vm_service/test/async_next_regression_18877_test.dart b/pkg/vm_service/test/async_next_regression_18877_test.dart
new file mode 100644
index 0000000..6912a67
--- /dev/null
+++ b/pkg/vm_service/test/async_next_regression_18877_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.
+// VMOptions=--verbose_debug
+
+import 'dart:developer';
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE_A = 24;
+const int LINE_B = 25;
+const int LINE_C = 26;
+
+foo() async {}
+
+doAsync(stop) async {
+  // Flutter issue 18877:
+  // If a closure is defined in the context of an async method, stepping over
+  // an await causes the implicit breakpoint to be set for that closure instead
+  // of the async_op, resulting in the debugger falling through.
+  final baz = () => print('doAsync($stop) done!');
+  if (stop) debugger();
+  await foo(); // Line A.
+  await foo(); // Line B.
+  await foo(); // Line C.
+  baz();
+  return null;
+}
+
+testMain() {
+  // With two runs of doAsync floating around, async step should only cause
+  // us to stop in the run we started in.
+  doAsync(false);
+  doAsync(true);
+}
+
+var tests = <IsolateTest>[
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_A),
+  stepOver, // foo()
+  stoppedAtLine(LINE_A),
+  asyncNext,
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_B),
+  stepOver, // foo()
+  stoppedAtLine(LINE_B),
+  asyncNext,
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_C),
+  resumeIsolate,
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      'async_next_regression_18877_test.dart',
+      testeeConcurrent: testMain,
+    );
diff --git a/pkg/vm_service/test/awaiter_async_stack_contents_2_test.dart b/pkg/vm_service/test/awaiter_async_stack_contents_2_test.dart
new file mode 100644
index 0000000..88d17d0a
--- /dev/null
+++ b/pkg/vm_service/test/awaiter_async_stack_contents_2_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.
+//
+// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+
+import 'dart:developer';
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const LINE_A = 28;
+const LINE_B = 34;
+const LINE_C = 38;
+
+notCalled() async {
+  await null;
+  await null;
+  await null;
+  await null;
+}
+
+foobar() async {
+  await null;
+  debugger();
+  print('foobar'); // LINE_A.
+}
+
+helper() async {
+  await null;
+  print('helper');
+  await foobar(); // LINE_B.
+}
+
+testMain() async {
+  helper(); // LINE_C.
+}
+
+var tests = <IsolateTest>[
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_A),
+  (VmService service, IsolateRef isolate) async {
+    final isolateId = isolate.id!;
+    // Verify awaiter stack trace is the current frame + the awaiter.
+    Stack stack = await service.getStack(isolateId);
+    expect(stack.awaiterFrames, isNotNull);
+    List<Frame> awaiterFrames = stack.awaiterFrames!;
+    expect(awaiterFrames.length, greaterThanOrEqualTo(2));
+    // Awaiter frame.
+    expect(awaiterFrames[0].function!.owner.name, 'foobar');
+    // Awaiter frame.
+    expect(awaiterFrames[1].function!.owner.name, 'helper');
+  },
+];
+
+main(args) => runIsolateTestsSynchronous(
+      args,
+      tests,
+      'awaiter_async_stack_contents_2_test.dart',
+      testeeConcurrent: testMain,
+      extraArgs: extraDebuggingArgs,
+    );
diff --git a/pkg/vm_service/test/awaiter_async_stack_contents_test.dart b/pkg/vm_service/test/awaiter_async_stack_contents_test.dart
new file mode 100644
index 0000000..0fea350
--- /dev/null
+++ b/pkg/vm_service/test/awaiter_async_stack_contents_test.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.
+//
+// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+
+import 'dart:developer';
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const LINE_C = 22;
+const LINE_A = 28;
+const LINE_B = 34;
+const LINE_D = 29;
+
+foobar() async {
+  await null;
+  debugger();
+  print('foobar'); // LINE_C.
+}
+
+helper() async {
+  await null;
+  debugger();
+  print('helper'); // LINE_A.
+  await foobar(); // LINE_D
+}
+
+testMain() {
+  debugger();
+  helper(); // LINE_B.
+}
+
+var tests = <IsolateTest>[
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_B),
+  (VmService service, IsolateRef isolateRef) async {
+    Stack stack = await service.getStack(isolateRef.id!);
+    // No awaiter frames because we are in a completely synchronous stack.
+    expect(stack.awaiterFrames, isNull);
+  },
+  resumeIsolate,
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_A),
+  resumeIsolate,
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_C),
+  (VmService service, IsolateRef isolateRef) async {
+    // Verify awaiter stack trace is the current frame + the awaiter.
+    Stack stack = await service.getStack(isolateRef.id!);
+    expect(stack.awaiterFrames, isNotNull);
+    List<Frame> awaiterFrames = stack.awaiterFrames!;
+
+    expect(awaiterFrames.length, greaterThanOrEqualTo(2));
+    // Awaiter frame.
+    expect(await awaiterFrames[0].function!.owner.name, 'foobar');
+    // Awaiter frame.
+    expect(await awaiterFrames[1].function!.owner.name, 'helper');
+    // "helper" is not await'ed.
+  },
+];
+
+main(args) => runIsolateTestsSynchronous(
+      args,
+      tests,
+      'awaiter_async_stack_contents_test.dart',
+      testeeConcurrent: testMain,
+      extraArgs: extraDebuggingArgs,
+    );
diff --git a/pkg/vm_service/test/breakpoint_async_break_test.dart b/pkg/vm_service/test/breakpoint_async_break_test.dart
new file mode 100644
index 0000000..d0c2443
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_async_break_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 'dart:async';
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE = 18;
+
+// Issue: https://github.com/dart-lang/sdk/issues/36622
+Future<void> testMain() async {
+  for (int i = 0; i < 2; i++) {
+    if (i > 0) {
+      break; // breakpoint here
+    }
+    await Future.delayed(Duration(seconds: 1));
+  }
+}
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  // Test future breakpoints.
+  (VmService service, IsolateRef isolateRef) async {
+    final isolateId = isolateRef.id!;
+    final isolate = await service.getIsolate(isolateId);
+    final rootLib =
+        await service.getObject(isolateId, isolate.rootLib!.id!) as Library;
+    final scriptId = rootLib.scripts![0].id!;
+    final script = await service.getObject(isolateId, scriptId) as Script;
+
+    // Future breakpoint.
+    var futureBpt = await service.addBreakpoint(isolateId, scriptId, LINE);
+    expect(futureBpt.breakpointNumber, 1);
+    expect(futureBpt.resolved, isFalse);
+    expect(await futureBpt.location!.line, LINE);
+    expect(await futureBpt.location!.column, null);
+
+    final completer = Completer<void>();
+    int resolvedCount = 0;
+    late StreamSubscription subscription;
+    subscription = service.onDebugEvent.listen((event) {
+      if (event.kind == EventKind.kBreakpointResolved) {
+        resolvedCount++;
+      } else if (event.kind == EventKind.kPauseBreakpoint) {
+        subscription.cancel();
+        service.streamCancel(EventStreams.kDebug);
+        completer.complete();
+      }
+    });
+
+    await service.streamListen(EventStreams.kDebug);
+    await service.resume(isolateId);
+    await hasStoppedAtBreakpoint(service, isolate);
+
+    // After resolution the breakpoints have assigned line & column.
+    expect(resolvedCount, 1);
+    futureBpt = await service.getObject(isolateId, futureBpt.id!) as Breakpoint;
+    expect(futureBpt.resolved, isTrue);
+    expect(
+        script.getLineNumberFromTokenPos(futureBpt.location!.tokenPos), LINE);
+    expect(script.getColumnNumberFromTokenPos(futureBpt.location!.tokenPos), 7);
+
+    // Remove the breakpoints.
+    expect((await service.removeBreakpoint(isolateId, futureBpt.id!)).type,
+        'Success');
+  },
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      'breakpoint_async_break_test.dart',
+      testeeConcurrent: testMain,
+      pause_on_start: true,
+    );
diff --git a/pkg/vm_service/test/breakpoint_in_package_parts_class_file_uri_test.dart b/pkg/vm_service/test/breakpoint_in_package_parts_class_file_uri_test.dart
new file mode 100644
index 0000000..70cd0fd
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_in_package_parts_class_file_uri_test.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.
+
+import 'dart:io' show Platform;
+
+import 'package:path/path.dart' as path;
+import 'package:test_package/has_part.dart' as has_part;
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+// Chop off the file name.
+String baseDirectory = path.dirname(Platform.script.path) + '/';
+Uri baseUri = Platform.script.replace(path: baseDirectory);
+Uri breakpointFile = baseUri.resolve('test_package/the_part.dart');
+const String shortFile = "the_part.dart";
+
+const int LINE = 87;
+
+code() {
+  has_part.main();
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$shortFile:${LINE + 0}:5", // on 'print'
+  "$shortFile:${LINE + 1}:3" // on class ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(breakpointFile.toString(), LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main([args = const <String>[]]) {
+  runIsolateTestsSynchronous(
+    args,
+    tests,
+    'breakpoint_in_package_parts_class_file_uri_test.dart',
+    testeeConcurrent: code,
+    pause_on_start: true,
+    pause_on_exit: true,
+  );
+}
diff --git a/pkg/vm_service/test/breakpoint_in_package_parts_class_test.dart b/pkg/vm_service/test/breakpoint_in_package_parts_class_test.dart
new file mode 100644
index 0000000..2dcf30f
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_in_package_parts_class_test.dart
@@ -0,0 +1,42 @@
+// 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 breakpoint_in_parts_class;
+
+import 'package:test_package/has_part.dart' as has_part;
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE = 87;
+const String breakpointFile = "package:test_package/the_part.dart";
+const String shortFile = "the_part.dart";
+
+code() {
+  has_part.main();
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$shortFile:${LINE + 0}:5", // on 'print'
+  "$shortFile:${LINE + 1}:3" // on class ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(breakpointFile, LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(
+    args,
+    tests,
+    'breakpoint_in_package_parts_class_test.dart',
+    testeeConcurrent: code,
+    pause_on_start: true,
+    pause_on_exit: true,
+  );
+}
diff --git a/pkg/vm_service/test/breakpoint_in_parts_class_part.dart b/pkg/vm_service/test/breakpoint_in_parts_class_part.dart
new file mode 100644
index 0000000..4855332
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_in_parts_class_part.dart
@@ -0,0 +1,91 @@
+// 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.
+
+part of breakpoint_in_parts_class;
+
+void foo() {
+  print("lalala");
+}
+
+class Foo1 {
+  final foo;
+
+  Foo1(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo2 {
+  final foo;
+
+  Foo2(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo3 {
+  final foo;
+
+  Foo3(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo4 {
+  final foo;
+
+  Foo4(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo5 {
+  final foo;
+
+  Foo5(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo6 {
+  final foo;
+
+  Foo6(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo7 {
+  final foo;
+
+  Foo7(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo8 {
+  final foo;
+
+  Foo8(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo9 {
+  final foo;
+
+  Foo9(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo10 {
+  final foo;
+
+  Foo10(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+var foo2 = foo() as dynamic;
diff --git a/pkg/vm_service/test/breakpoint_in_parts_class_test.dart b/pkg/vm_service/test/breakpoint_in_parts_class_test.dart
new file mode 100644
index 0000000..89f4e7f
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_in_parts_class_test.dart
@@ -0,0 +1,43 @@
+// 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.
+
+library breakpoint_in_parts_class;
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+part 'breakpoint_in_parts_class_part.dart';
+
+const int LINE = 87;
+const String file = "breakpoint_in_parts_class_part.dart";
+
+code() {
+  final foo = Foo10("Foo!");
+  print(foo);
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$file:${LINE + 0}:5", // on 'print'
+  "$file:${LINE + 1}:3" // on class ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(file, LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(
+    args,
+    tests,
+    'breakpoint_in_parts_class_test.dart',
+    testeeConcurrent: code,
+    pause_on_start: true,
+    pause_on_exit: true,
+  );
+}
diff --git a/pkg/vm_service/test/breakpoint_non_debuggable_library_test.dart b/pkg/vm_service/test/breakpoint_non_debuggable_library_test.dart
new file mode 100644
index 0000000..4ecd5c4
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_non_debuggable_library_test.dart
@@ -0,0 +1,83 @@
+// 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_package/has_part.dart' as test_pkg;
+import 'package:vm_service/vm_service.dart';
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const String file = 'package:test_package/has_part.dart';
+// print() within fooz()
+const int LINE_A = 15;
+// print() within barz()
+const int LINE_B = 11;
+
+testMain() {
+  test_pkg.fooz();
+}
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  (VmService service, IsolateRef isolateRef) async {
+    // Mark 'package:observatory_test_package/has_part.dart' as not debuggable.
+    final isolateId = isolateRef.id!;
+    final isolate = await service.getIsolate(isolateId);
+
+    LibraryRef has_part_ref = isolate.libraries!.firstWhere(
+      (LibraryRef library) => library.uri == file,
+    );
+
+    Library has_part =
+        await service.getObject(isolateId, has_part_ref.id!) as Library;
+    expect(has_part.debuggable, true);
+    // SetBreakpoint before setting library to non-debuggable.
+    // Breakpoints are allowed to be set (before marking library as
+    // non-debuggable) but are not hit when running (after marking library
+    // as non-debuggable).
+    ScriptRef script = has_part.scripts!.firstWhere(
+      (ScriptRef script) => script.uri == file,
+    );
+    Breakpoint bpt = await service.addBreakpoint(isolateId, script.id!, LINE_A);
+    print("Breakpoint is $bpt");
+    expect(bpt, isNotNull);
+
+    // Set breakpoint and check later that this breakpoint won't be added if
+    // the library is non-debuggable.
+    bpt = await service.addBreakpoint(isolateId, script.id!, LINE_B);
+    print("Breakpoint is $bpt");
+    expect(bpt, isNotNull);
+
+    // Remove breakpoint.
+    final res = await service.removeBreakpoint(isolateId, bpt.id!);
+    expect(res.type, 'Success');
+
+    await service.setLibraryDebuggable(isolateId, has_part.id!, false);
+    has_part = await service.getObject(isolateId, has_part.id!) as Library;
+    expect(has_part.debuggable, false);
+    print('$has_part is debuggable: ${has_part.debuggable}');
+
+    // Breakpoints are not allowed to set on non-debuggable libraries.
+    try {
+      await service.addBreakpoint(isolateId, script.id!, LINE_B);
+    } on RPCError catch (e) {
+      // Cannot add breakpoint error code
+      expect(e.code, 102);
+      expect(e.details, contains("Cannot add breakpoint at line '11'"));
+      print("Set Breakpoint to non-debuggable library is not allowed");
+    }
+  },
+  resumeIsolate,
+  hasStoppedAtExit,
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      'breakpoint_non_debuggable_library_test.dart',
+      testeeConcurrent: testMain,
+      pause_on_start: true,
+      pause_on_exit: true,
+    );
diff --git a/pkg/vm_service/test/breakpoint_on_if_null_1_test.dart b/pkg/vm_service/test/breakpoint_on_if_null_1_test.dart
new file mode 100644
index 0000000..c46cabe
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_on_if_null_1_test.dart
@@ -0,0 +1,56 @@
+// 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 breakpoint_in_parts_class;
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE = 18;
+const String file = "breakpoint_on_if_null_1_test.dart";
+
+code() {
+  foo(42);
+}
+
+foo(dynamic args) {
+  if (args == null) {
+    print("was null");
+  }
+  if (args != null) {
+    print("was not null");
+  }
+  if (args == 42) {
+    print("was 42!");
+  }
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$file:${LINE + 0}:12", // on '=='
+  "$file:${LINE + 3}:12", // on '!='
+  "$file:${LINE + 4}:5", // on 'print'
+  "$file:${LINE + 6}:12", // on '=='
+  "$file:${LINE + 7}:5", // on 'print'
+  "$file:${LINE + 9}:1", // on ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(file, LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(
+    args,
+    tests,
+    'breakpoint_on_if_null_1_test.dart',
+    testeeConcurrent: code,
+    pause_on_start: true,
+    pause_on_exit: true,
+  );
+}
diff --git a/pkg/vm_service/test/breakpoint_on_if_null_2_test.dart b/pkg/vm_service/test/breakpoint_on_if_null_2_test.dart
new file mode 100644
index 0000000..69bee59
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_on_if_null_2_test.dart
@@ -0,0 +1,59 @@
+// 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 breakpoint_in_parts_class;
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE = 21;
+const String file = "breakpoint_on_if_null_2_test.dart";
+
+dynamic compareWithMe = 43;
+
+code() {
+  compareWithMe = null;
+  foo(42);
+}
+
+foo(dynamic args) {
+  if (args == compareWithMe) {
+    print("was null");
+  }
+  if (args != compareWithMe) {
+    print("was not null");
+  }
+  if (args == 42) {
+    print("was 42!");
+  }
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$file:${LINE + 0}:12", // on '=='
+  "$file:${LINE + 3}:12", // on '!='
+  "$file:${LINE + 4}:5", // on 'print'
+  "$file:${LINE + 6}:12", // on '=='
+  "$file:${LINE + 7}:5", // on 'print'
+  "$file:${LINE + 9}:1", // on ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(file, LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(
+    args,
+    tests,
+    'breakpoint_on_if_null_2_test.dart',
+    testeeConcurrent: code,
+    pause_on_start: true,
+    pause_on_exit: true,
+  );
+}
diff --git a/pkg/vm_service/test/breakpoint_on_if_null_3_test.dart b/pkg/vm_service/test/breakpoint_on_if_null_3_test.dart
new file mode 100644
index 0000000..9211410
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_on_if_null_3_test.dart
@@ -0,0 +1,57 @@
+// 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 breakpoint_in_parts_class;
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE = 17;
+const String file = "breakpoint_on_if_null_3_test.dart";
+
+code() {
+  foo(42);
+}
+
+foo(dynamic args) {
+  if (args == null) {
+    print("was null");
+  }
+  if (args != null) {
+    print("was not null");
+  }
+  if (args == 42) {
+    print("was 42!");
+  }
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$file:${LINE + 0}:13", // on 'args'
+  "$file:${LINE + 1}:12", // on '=='
+  "$file:${LINE + 4}:12", // on '!='
+  "$file:${LINE + 5}:5", // on 'print'
+  "$file:${LINE + 7}:12", // on '=='
+  "$file:${LINE + 8}:5", // on 'print'
+  "$file:${LINE + 10}:1", // on ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(file, LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(
+    args,
+    tests,
+    'breakpoint_on_if_null_3_test.dart',
+    testeeConcurrent: code,
+    pause_on_start: true,
+    pause_on_exit: true,
+  );
+}
diff --git a/pkg/vm_service/test/breakpoint_on_if_null_4_test.dart b/pkg/vm_service/test/breakpoint_on_if_null_4_test.dart
new file mode 100644
index 0000000..08b7760
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_on_if_null_4_test.dart
@@ -0,0 +1,60 @@
+// 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 breakpoint_in_parts_class;
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE = 20;
+const String file = "breakpoint_on_if_null_4_test.dart";
+
+dynamic compareWithMe = 43;
+
+code() {
+  compareWithMe = null;
+  foo(42);
+}
+
+foo(dynamic args) {
+  if (args == compareWithMe) {
+    print("was null");
+  }
+  if (args != compareWithMe) {
+    print("was not null");
+  }
+  if (args == 42) {
+    print("was 42!");
+  }
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$file:${LINE + 0}:13", // on 'args'
+  "$file:${LINE + 1}:12", // on '=='
+  "$file:${LINE + 4}:12", // on '!='
+  "$file:${LINE + 5}:5", // on 'print'
+  "$file:${LINE + 7}:12", // on '=='
+  "$file:${LINE + 8}:5", // on 'print'
+  "$file:${LINE + 10}:1", // on ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(file, LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(
+    args,
+    tests,
+    'breakpoint_on_if_null_4_test.dart',
+    testeeConcurrent: code,
+    pause_on_start: true,
+    pause_on_exit: true,
+  );
+}
diff --git a/pkg/vm_service/test/breakpoint_partfile_test.dart b/pkg/vm_service/test/breakpoint_partfile_test.dart
new file mode 100644
index 0000000..a3c5fd1
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_partfile_test.dart
@@ -0,0 +1,42 @@
+// 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 breakpoint_in_parts_class;
+
+import 'package:test_package/has_part.dart' as has_part;
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE = 8;
+const String breakpointFile = "package:test_package/the_part_2.dart";
+const String shortFile = "the_part_2.dart";
+
+code() {
+  has_part.bar();
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$shortFile:${LINE + 0}:3", // on 'print'
+  "$shortFile:${LINE + 1}:1" // on class ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(breakpointFile, LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(
+    args,
+    tests,
+    'breakpoint_partfile_test.dart',
+    testeeConcurrent: code,
+    pause_on_start: true,
+    pause_on_exit: true,
+  );
+}
diff --git a/pkg/vm_service/test/breakpoint_two_args_checked_test.dart b/pkg/vm_service/test/breakpoint_two_args_checked_test.dart
new file mode 100644
index 0000000..40d0dc6
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_two_args_checked_test.dart
@@ -0,0 +1,87 @@
+// 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
+
+// TODO(bkonyi): consider deleting now that DBC is no more.
+// This test was mostly interesting for DBC, which needed to patch two bytecodes
+// to create a breakpoint for fast Smi ops.
+
+import 'dart:developer';
+
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE_A = 29;
+const int LINE_B = 30;
+const int LINE_C = 31;
+
+class NotGeneric {}
+
+testeeMain() {
+  final x = List<dynamic>.filled(1, null);
+  final y = 7;
+  debugger();
+  print("Statement");
+  x[0] = 3; // Line A.
+  x is NotGeneric; // Line B.
+  y & 4; // Line C.
+}
+
+final tests = <IsolateTest>[
+  hasStoppedAtBreakpoint,
+
+// Add breakpoints.
+  (VmService service, IsolateRef isolateRef) async {
+    final isolateId = isolateRef.id!;
+    final isolate = await service.getIsolate(isolateId);
+    Library rootLib =
+        await service.getObject(isolateId, isolate.rootLib!.id!) as Library;
+
+    final script =
+        await service.getObject(isolateId, rootLib.scripts![0].id!) as Script;
+    final scriptId = script.id!;
+
+    final bpt1 = await service.addBreakpoint(isolateId, scriptId, LINE_A);
+    print(bpt1);
+    expect(bpt1.resolved, isTrue);
+    expect(script.getLineNumberFromTokenPos(bpt1.location!.tokenPos),
+        equals(LINE_A));
+
+    final bpt2 = await service.addBreakpoint(isolateId, scriptId, LINE_B);
+    print(bpt2);
+    expect(bpt2.resolved, isTrue);
+    expect(script.getLineNumberFromTokenPos(bpt2.location!.tokenPos),
+        equals(LINE_B));
+
+    final bpt3 = await service.addBreakpoint(isolateId, scriptId, LINE_C);
+    print(bpt3);
+    expect(bpt3.resolved, isTrue);
+    expect(script.getLineNumberFromTokenPos(bpt3.location!.tokenPos),
+        equals(LINE_C));
+  },
+
+  resumeIsolate,
+
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_A),
+  resumeIsolate,
+
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_B),
+  resumeIsolate,
+
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_C),
+  resumeIsolate,
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      'breakpoint_two_args_checked_test.dart',
+      testeeConcurrent: testeeMain,
+    );
diff --git a/pkg/vm_service/test/breakpoints_with_mixin_lib1.dart b/pkg/vm_service/test/breakpoints_with_mixin_lib1.dart
new file mode 100644
index 0000000..3c43715
--- /dev/null
+++ b/pkg/vm_service/test/breakpoints_with_mixin_lib1.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "breakpoints_with_mixin_lib3.dart";
+
+class Test1 extends Object with Foo {}
diff --git a/pkg/vm_service/test/breakpoints_with_mixin_lib2.dart b/pkg/vm_service/test/breakpoints_with_mixin_lib2.dart
new file mode 100644
index 0000000..c054176
--- /dev/null
+++ b/pkg/vm_service/test/breakpoints_with_mixin_lib2.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "breakpoints_with_mixin_lib3.dart";
+
+class Test2 extends Object with Foo {}
diff --git a/pkg/vm_service/test/breakpoints_with_mixin_lib3.dart b/pkg/vm_service/test/breakpoints_with_mixin_lib3.dart
new file mode 100644
index 0000000..a7329de
--- /dev/null
+++ b/pkg/vm_service/test/breakpoints_with_mixin_lib3.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for 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 Foo {
+  foo() {
+    print("I should be breakable!");
+  }
+}
+
+class Bar {
+  bar() {
+    print("I should be breakable too!");
+  }
+}
diff --git a/pkg/vm_service/test/breakpoints_with_mixin_test.dart b/pkg/vm_service/test/breakpoints_with_mixin_test.dart
new file mode 100644
index 0000000..f382628
--- /dev/null
+++ b/pkg/vm_service/test/breakpoints_with_mixin_test.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "breakpoints_with_mixin_lib1.dart";
+import "breakpoints_with_mixin_lib2.dart";
+import "breakpoints_with_mixin_lib3.dart";
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const String testFilename = "breakpoints_with_mixin_test.dart";
+const int testCodeLineStart = 17;
+const String lib3Filename = "breakpoints_with_mixin_lib3.dart";
+const int lib3Bp1 = 7;
+const int lib3Bp2 = 13;
+
+void code() {
+  Test1 test1 = Test1();
+  test1.foo();
+  Test2 test2 = Test2();
+  test2.foo();
+  Foo foo = Foo();
+  foo.foo();
+  Bar bar = Bar();
+  bar.bar();
+  test1.foo();
+  test2.foo();
+  foo.foo();
+  bar.bar();
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$lib3Filename:$lib3Bp1:5 ($testFilename:${testCodeLineStart + 2}:9)",
+  "$lib3Filename:$lib3Bp1:5 ($testFilename:${testCodeLineStart + 4}:9)",
+  "$lib3Filename:$lib3Bp1:5 ($testFilename:${testCodeLineStart + 6}:7)",
+  "$lib3Filename:$lib3Bp2:5 ($testFilename:${testCodeLineStart + 8}:7)",
+  "$lib3Filename:$lib3Bp1:5 ($testFilename:${testCodeLineStart + 9}:9)",
+  "$lib3Filename:$lib3Bp1:5 ($testFilename:${testCodeLineStart + 10}:9)",
+  "$lib3Filename:$lib3Bp1:5 ($testFilename:${testCodeLineStart + 11}:7)",
+  "$lib3Filename:$lib3Bp2:5 ($testFilename:${testCodeLineStart + 12}:7)",
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(lib3Filename, lib3Bp1),
+  setBreakpointAtUriAndLine(lib3Filename, lib3Bp2),
+  resumeProgramRecordingStops(stops, true),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(
+    args,
+    tests,
+    'breakpoints_with_mixin_test.dart',
+    testeeConcurrent: code,
+    pause_on_start: true,
+    pause_on_exit: true,
+  );
+}
diff --git a/pkg/vm_service/test/common/service_test_common.dart b/pkg/vm_service/test/common/service_test_common.dart
index 4f616ab..6e84d16 100644
--- a/pkg/vm_service/test/common/service_test_common.dart
+++ b/pkg/vm_service/test/common/service_test_common.dart
@@ -6,6 +6,7 @@
 
 import 'dart:async';
 
+import 'package:path/path.dart';
 import 'package:test/test.dart';
 import 'package:vm_service/vm_service.dart';
 
@@ -131,6 +132,16 @@
   };
 }
 
+IsolateTest setBreakpointAtUriAndLine(String uri, int line) {
+  return (VmService service, IsolateRef isolateRef) async {
+    print("Setting breakpoint for line $line in $uri");
+    Breakpoint bpt =
+        await service.addBreakpointWithScriptUri(isolateRef.id!, uri, line);
+    print("Breakpoint is $bpt");
+    expect(bpt, isNotNull);
+  };
+}
+
 IsolateTest stoppedAtLine(int line) {
   return (VmService service, IsolateRef isolateRef) async {
     print("Checking we are at line $line");
@@ -221,3 +232,154 @@
   await hasStoppedAtBreakpoint(service, isolateRef);
   await _unsubscribeDebugStream(service);
 }
+
+IsolateTest resumeProgramRecordingStops(
+    List<String> recordStops, bool includeCaller) {
+  return (VmService service, IsolateRef isolateRef) async {
+    final completer = Completer<void>();
+
+    late StreamSubscription subscription;
+    subscription = service.onDebugEvent.listen((event) async {
+      if (event.kind == EventKind.kPauseBreakpoint) {
+        final stack = await service.getStack(isolateRef.id!);
+        final frames = stack.frames!;
+        expect(frames.length, greaterThanOrEqualTo(2));
+
+        String brokeAt =
+            await _locationToString(service, isolateRef, frames[0]);
+        if (includeCaller) {
+          brokeAt =
+              '$brokeAt (${await _locationToString(service, isolateRef, frames[1])})';
+        }
+        recordStops.add(brokeAt);
+        await service.resume(isolateRef.id!);
+      } else if (event.kind == EventKind.kPauseExit) {
+        await subscription.cancel();
+        await service.streamCancel(EventStreams.kDebug);
+        completer.complete();
+      }
+    });
+
+    await service.streamListen(EventStreams.kDebug);
+    await service.resume(isolateRef.id!);
+    return completer.future;
+  };
+}
+
+Future<String> _locationToString(
+  VmService service,
+  IsolateRef isolateRef,
+  Frame frame,
+) async {
+  final location = frame.location!;
+  Script script =
+      await service.getObject(isolateRef.id!, location.script!.id!) as Script;
+  final scriptName = basename(script.uri!);
+  final tokenPos = location.tokenPos!;
+  final line = script.getLineNumberFromTokenPos(tokenPos);
+  final column = script.getColumnNumberFromTokenPos(tokenPos);
+  return '$scriptName:$line:$column';
+}
+
+IsolateTest runStepThroughProgramRecordingStops(List<String> recordStops) {
+  return (VmService service, IsolateRef isolateRef) async {
+    final completer = Completer<void>();
+
+    late StreamSubscription subscription;
+    subscription = service.onDebugEvent.listen((event) async {
+      if (event.kind == EventKind.kPauseBreakpoint) {
+        final isolate = await service.getIsolate(isolateRef.id!);
+        final frame = isolate.pauseEvent!.topFrame!;
+        recordStops.add(await _locationToString(service, isolateRef, frame));
+        if (event.atAsyncSuspension ?? false) {
+          await service.resume(isolateRef.id!,
+              step: StepOption.kOverAsyncSuspension);
+        } else {
+          await service.resume(isolateRef.id!, step: StepOption.kOver);
+        }
+      } else if (event.kind == EventKind.kPauseExit) {
+        await subscription.cancel();
+        await service.streamCancel(EventStreams.kDebug);
+        completer.complete();
+      }
+    });
+
+    await service.streamListen(EventStreams.kDebug);
+    await service.resume(isolateRef.id!);
+    return completer.future;
+  };
+}
+
+IsolateTest checkRecordedStops(
+    List<String> recordStops, List<String> expectedStops,
+    {bool removeDuplicates = false,
+    bool debugPrint = false,
+    String? debugPrintFile,
+    int? debugPrintLine}) {
+  return (VmService service, IsolateRef isolate) async {
+    if (debugPrint) {
+      for (int i = 0; i < recordStops.length; i++) {
+        String line = recordStops[i];
+        String output = line;
+        int firstColon = line.indexOf(":");
+        int lastColon = line.lastIndexOf(":");
+        if (debugPrintFile != null &&
+            debugPrintLine != null &&
+            firstColon > 0 &&
+            lastColon > 0) {
+          int lineNumber = int.parse(line.substring(firstColon + 1, lastColon));
+          int relativeLineNumber = lineNumber - debugPrintLine;
+          var columnNumber = line.substring(lastColon + 1);
+          var file = line.substring(0, firstColon);
+          if (file == debugPrintFile) {
+            output = '\$file:\${LINE+$relativeLineNumber}:$columnNumber';
+          }
+        }
+        String comma = i == recordStops.length - 1 ? "" : ",";
+        print('"$output"$comma');
+      }
+    }
+    if (removeDuplicates) {
+      recordStops = removeAdjacentDuplicates(recordStops);
+      expectedStops = removeAdjacentDuplicates(expectedStops);
+    }
+
+    // Single stepping may record extra stops.
+    // Allow the extra ones as long as the expected ones are recorded.
+    int i = 0;
+    int j = 0;
+    while (i < recordStops.length && j < expectedStops.length) {
+      if (recordStops[i] != expectedStops[j]) {
+        // Check if recordStops[i] is an extra stop.
+        int k = i + 1;
+        while (k < recordStops.length && recordStops[k] != expectedStops[j]) {
+          k++;
+        }
+        if (k < recordStops.length) {
+          // Allow and ignore extra recorded stops from i to k-1.
+          i = k;
+        } else {
+          // This will report an error.
+          expect(recordStops[i], expectedStops[j]);
+        }
+      }
+      i++;
+      j++;
+    }
+
+    expect(recordStops.length >= expectedStops.length, true,
+        reason: "Expects at least ${expectedStops.length} breaks, "
+            "got ${recordStops.length}.");
+  };
+}
+
+List<String> removeAdjacentDuplicates(List<String> fromList) {
+  List<String> result = <String>[];
+  String? latestLine;
+  for (String s in fromList) {
+    if (s == latestLine) continue;
+    latestLine = s;
+    result.add(s);
+  }
+  return result;
+}
diff --git a/pkg/vm_service/test/common/test_helper.dart b/pkg/vm_service/test/common/test_helper.dart
index 45ce97b..e16e307d 100644
--- a/pkg/vm_service/test/common/test_helper.dart
+++ b/pkg/vm_service/test/common/test_helper.dart
@@ -277,6 +277,7 @@
         vm = await vmServiceConnectUri(serviceWebsocketAddress);
         print('Done loading VM');
         isolate = await getFirstIsolate(vm);
+        print('Got first isolate');
       });
     });
 
@@ -326,18 +327,23 @@
     Completer<dynamic>? completer = Completer();
     late StreamSubscription subscription;
     subscription = service.onIsolateEvent.listen((Event event) async {
+      print('Isolate event: $event');
       if (completer == null) {
         await subscription.cancel();
         return;
       }
       if (event.kind == EventKind.kIsolateRunnable) {
+        print(event.isolate!.name);
         vm = await service.getVM();
-        assert(vmIsolates.isNotEmpty);
         await subscription.cancel();
-        completer!.complete(vmIsolates.first);
+        await service.streamCancel(EventStreams.kIsolate);
+        completer!.complete(event.isolate!);
         completer = null;
       }
     });
+    await service.streamListen(EventStreams.kIsolate);
+
+    await service.streamListen(EventStreams.kIsolate);
 
     // The isolate may have started before we subscribed.
     vm = await service.getVM();
diff --git a/pkg/vm_service/test/mark_main_isolate_as_system_isolate_test.dart b/pkg/vm_service/test/mark_main_isolate_as_system_isolate_test.dart
index fb97b82..6219ebf 100644
--- a/pkg/vm_service/test/mark_main_isolate_as_system_isolate_test.dart
+++ b/pkg/vm_service/test/mark_main_isolate_as_system_isolate_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:developer';
 import 'dart:io';
 import 'dart:isolate';
diff --git a/pkg/vm_service/test/pause_on_exceptions_legacy_test.dart b/pkg/vm_service/test/pause_on_exceptions_legacy_test.dart
new file mode 100644
index 0000000..21ff3a8
--- /dev/null
+++ b/pkg/vm_service/test/pause_on_exceptions_legacy_test.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. 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:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/test_helper.dart';
+
+doThrow() {
+  throw "TheException"; // Line 13.
+}
+
+doCaught() {
+  try {
+    doThrow();
+  } catch (e) {
+    return "end of doCaught";
+  }
+}
+
+doUncaught() {
+  doThrow();
+  return "end of doUncaught";
+}
+
+final tests = <IsolateTest>[
+  (VmService service, IsolateRef isolateRef) async {
+    final isolate = await service.getIsolate(isolateRef.id!);
+    final lib = await service.getObject(isolateRef.id!, isolate.rootLib!.id!);
+
+    Completer? onPaused;
+    Completer? onResume;
+
+    final stream = service.onDebugEvent;
+    final subscription = stream.listen((Event event) {
+      print("Event $event");
+      if (event.kind == EventKind.kPauseException) {
+        if (onPaused == null) throw "Unexpected pause event $event";
+        final t = onPaused;
+        onPaused = null;
+        t!.complete(event);
+      }
+      if (event.kind == EventKind.kResume) {
+        if (onResume == null) throw "Unexpected resume event $event";
+        final t = onResume;
+        onResume = null;
+        t!.complete(event);
+      }
+    });
+    await service.streamListen(EventStreams.kDebug);
+
+    test(String pauseMode, String expression, bool shouldPause,
+        bool shouldBeCaught) async {
+      print("Evaluating $expression with pause on $pauseMode exception");
+
+      // ignore: deprecated_member_use_from_same_package
+      await service.setExceptionPauseMode(isolate.id!, pauseMode);
+
+      late Completer t;
+      if (shouldPause) {
+        t = Completer();
+        onPaused = t;
+      }
+      final fres = service.evaluate(isolate.id!, lib.id!, expression);
+      if (shouldPause) {
+        await t.future;
+
+        final stack = await service.getStack(isolate.id!);
+        expect(stack.frames![0].function!.name, 'doThrow');
+
+        t = Completer();
+        onResume = t;
+        await service.resume(isolate.id!);
+        await t.future;
+      }
+
+      dynamic res = await fres;
+      if (shouldBeCaught) {
+        expect(res is InstanceRef, true);
+        expect(res.kind, 'String');
+        expect(res.valueAsString, equals("end of doCaught"));
+      } else {
+        print(res.json);
+        expect(res is ErrorRef, true);
+        res = await service.getObject(isolate.id!, res.id!);
+        expect(res is Error, true);
+        expect(res.exception.kind, 'String');
+        expect(res.exception.valueAsString, equals("TheException"));
+      }
+    }
+
+    await test("All", "doCaught()", true, true);
+    await test("All", "doUncaught()", true, false);
+
+    await test("Unhandled", "doCaught()", false, true);
+    await test("Unhandled", "doUncaught()", true, false);
+
+    await test("None", "doCaught()", false, true);
+    await test("None", "doUncaught()", false, false);
+
+    await subscription.cancel();
+  },
+];
+
+main([args = const <String>[]]) => runIsolateTests(
+      args,
+      tests,
+      'pause_on_exceptions_test.dart',
+    );
diff --git a/pkg/vm_service/test/pause_on_exceptions_test.dart b/pkg/vm_service/test/pause_on_exceptions_test.dart
new file mode 100644
index 0000000..9da7dfc
--- /dev/null
+++ b/pkg/vm_service/test/pause_on_exceptions_test.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. 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:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/test_helper.dart';
+
+doThrow() {
+  throw "TheException"; // Line 13.
+}
+
+doCaught() {
+  try {
+    doThrow();
+  } catch (e) {
+    return "end of doCaught";
+  }
+}
+
+doUncaught() {
+  doThrow();
+  return "end of doUncaught";
+}
+
+final tests = <IsolateTest>[
+  (VmService service, IsolateRef isolateRef) async {
+    final isolate = await service.getIsolate(isolateRef.id!);
+    final lib = await service.getObject(isolateRef.id!, isolate.rootLib!.id!);
+
+    Completer? onPaused;
+    Completer? onResume;
+
+    final stream = service.onDebugEvent;
+    final subscription = stream.listen((Event event) {
+      print("Event $event");
+      if (event.kind == EventKind.kPauseException) {
+        if (onPaused == null) throw "Unexpected pause event $event";
+        final t = onPaused;
+        onPaused = null;
+        t!.complete(event);
+      }
+      if (event.kind == EventKind.kResume) {
+        if (onResume == null) throw "Unexpected resume event $event";
+        final t = onResume;
+        onResume = null;
+        t!.complete(event);
+      }
+    });
+    await service.streamListen(EventStreams.kDebug);
+
+    test(String pauseMode, String expression, bool shouldPause,
+        bool shouldBeCaught) async {
+      print("Evaluating $expression with pause on $pauseMode exception");
+
+      await service.setIsolatePauseMode(isolate.id!,
+          exceptionPauseMode: pauseMode);
+
+      late Completer t;
+      if (shouldPause) {
+        t = Completer();
+        onPaused = t;
+      }
+      final fres = service.evaluate(isolate.id!, lib.id!, expression);
+      if (shouldPause) {
+        await t.future;
+
+        final stack = await service.getStack(isolate.id!);
+        expect(stack.frames![0].function!.name, 'doThrow');
+
+        t = Completer();
+        onResume = t;
+        await service.resume(isolate.id!);
+        await t.future;
+      }
+
+      dynamic res = await fres;
+      if (shouldBeCaught) {
+        expect(res is InstanceRef, true);
+        expect(res.kind, 'String');
+        expect(res.valueAsString, equals("end of doCaught"));
+      } else {
+        print(res.json);
+        expect(res is ErrorRef, true);
+        res = await service.getObject(isolate.id!, res.id!);
+        expect(res is Error, true);
+        expect(res.exception.kind, 'String');
+        expect(res.exception.valueAsString, equals("TheException"));
+      }
+    }
+
+    await test("All", "doCaught()", true, true);
+    await test("All", "doUncaught()", true, false);
+
+    await test("Unhandled", "doCaught()", false, true);
+    await test("Unhandled", "doUncaught()", true, false);
+
+    await test("None", "doCaught()", false, true);
+    await test("None", "doUncaught()", false, false);
+
+    await subscription.cancel();
+  },
+];
+
+main([args = const <String>[]]) => runIsolateTests(
+      args,
+      tests,
+      'pause_on_exceptions_test.dart',
+    );
diff --git a/pkg/vm_service/test/should_pause_on_exit_test.dart b/pkg/vm_service/test/should_pause_on_exit_test.dart
new file mode 100644
index 0000000..575530c
--- /dev/null
+++ b/pkg/vm_service/test/should_pause_on_exit_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. 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:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/test_helper.dart';
+
+void testMain() {
+  print('Hello world!');
+}
+
+Future<bool> shouldPauseOnExit(VmService service, IsolateRef isolateRef) async {
+  final isolate = await service.getIsolate(isolateRef.id!);
+  return isolate.pauseOnExit!;
+}
+
+final tests = <IsolateTest>[
+  (VmService service, IsolateRef isolateRef) async {
+    await service.setIsolatePauseMode(isolateRef.id!, shouldPauseOnExit: false);
+    expect(await shouldPauseOnExit(service, isolateRef), false);
+    final completer = Completer<void>();
+
+    final stream = service.onDebugEvent;
+    final subscription = stream.listen((Event event) {
+      if (event.kind == EventKind.kPauseExit) {
+        completer.complete();
+      }
+    });
+    await service.streamListen(EventStreams.kDebug);
+
+    await service.setIsolatePauseMode(isolateRef.id!, shouldPauseOnExit: true);
+    expect(await shouldPauseOnExit(service, isolateRef), true);
+    await service.resume(isolateRef.id!);
+    await completer.future;
+    await service.resume(isolateRef.id!);
+    await subscription.cancel();
+  },
+];
+
+void main([args = const <String>[]]) => runIsolateTests(
+      args,
+      tests,
+      'should_pause_on_exit_test.dart',
+      pause_on_start: true,
+      pause_on_exit: true,
+      testeeConcurrent: testMain,
+    );
diff --git a/pkg/vm_service/test/test_package/has_part.dart b/pkg/vm_service/test/test_package/has_part.dart
new file mode 100644
index 0000000..fb68ee7
--- /dev/null
+++ b/pkg/vm_service/test/test_package/has_part.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.
+
+library has_part;
+
+part 'the_part.dart';
+part 'the_part_2.dart';
+
+barz() {
+  print('in bar!');
+}
+
+fooz() {
+  print('in foo!');
+  bar();
+}
+
+main() {
+  Foo10 foo = Foo10("Foo!");
+  print(foo);
+}
diff --git a/pkg/vm_service/test/test_package/pubspec.yaml b/pkg/vm_service/test/test_package/pubspec.yaml
new file mode 100644
index 0000000..b5bc9d7
--- /dev/null
+++ b/pkg/vm_service/test/test_package/pubspec.yaml
@@ -0,0 +1,4 @@
+name: test_package
+publish_to: none
+environment:
+  sdk: '>=2.12.0-0 <3.0.0'
diff --git a/pkg/vm_service/test/test_package/the_part.dart b/pkg/vm_service/test/test_package/the_part.dart
new file mode 100644
index 0000000..d8545f8
--- /dev/null
+++ b/pkg/vm_service/test/test_package/the_part.dart
@@ -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.
+
+part of has_part;
+
+void foo() {
+  print("lalala");
+}
+
+class Foo1 {
+  final foo;
+
+  Foo1(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo2 {
+  final foo;
+
+  Foo2(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo3 {
+  final foo;
+
+  Foo3(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo4 {
+  final foo;
+
+  Foo4(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo5 {
+  final foo;
+
+  Foo5(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo6 {
+  final foo;
+
+  Foo6(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo7 {
+  final foo;
+
+  Foo7(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo8 {
+  final foo;
+
+  Foo8(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo9 {
+  final foo;
+
+  Foo9(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo10 {
+  final foo;
+
+  Foo10(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+var foo2 = foo() as dynamic;
diff --git a/pkg/vm_service/test/test_package/the_part_2.dart b/pkg/vm_service/test/test_package/the_part_2.dart
new file mode 100644
index 0000000..c38df9c
--- /dev/null
+++ b/pkg/vm_service/test/test_package/the_part_2.dart
@@ -0,0 +1,9 @@
+// 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.
+
+part of has_part;
+
+void bar() {
+  print('Should break here');
+}
diff --git a/pkg/vm_service/tool/common/parser.dart b/pkg/vm_service/tool/common/parser.dart
index 08d3709..233320a 100644
--- a/pkg/vm_service/tool/common/parser.dart
+++ b/pkg/vm_service/tool/common/parser.dart
@@ -167,6 +167,23 @@
         .trim();
   }
 
+  String? consumeString() {
+    StringBuffer buf = StringBuffer();
+    String startQuotation = advance()!.text!;
+    if (startQuotation != '"' && startQuotation != "'") {
+      return null;
+    }
+    while (peek()!.text != startQuotation) {
+      Token t = advance()!;
+      if (t.text == null) {
+        throw FormatException('Reached EOF');
+      }
+      buf.write('${t.text} ');
+    }
+    advance();
+    return buf.toString().trim();
+  }
+
   void validate(bool result, String message) {
     if (!result) throw 'expected ${message}';
   }
diff --git a/pkg/vm_service/tool/dart/generate_dart.dart b/pkg/vm_service/tool/dart/generate_dart.dart
index 844b1ff..d59b1e7 100644
--- a/pkg/vm_service/tool/dart/generate_dart.dart
+++ b/pkg/vm_service/tool/dart/generate_dart.dart
@@ -725,6 +725,9 @@
             }
             return result;
           };
+          if (m.deprecated) {
+            gen.writeln("// ignore: deprecated_member_use_from_same_package");
+          }
           gen.write("response = await _serviceImplementation.${m.name}(");
           // Positional args
           m.args.where((arg) => !arg.optional).forEach((MethodArg arg) {
@@ -932,6 +935,10 @@
   return obj;
 }
 
+List<dynamic> assertListOfDynamic(List<dynamic> list) {
+  return list;
+}
+
 List<int> assertListOfInt(List<int> list) {
   for (int elem in list) {
     assertInt(elem);
@@ -1130,6 +1137,8 @@
   final String? docs;
 
   MemberType returnType = MemberType();
+  bool get deprecated => deprecationMessage != null;
+  String? deprecationMessage;
   List<MethodArg> args = [];
 
   Method(this.name, String definition, [this.docs]) {
@@ -1196,6 +1205,9 @@
       }
       if (_docs.isNotEmpty) gen.writeDocs(_docs);
     }
+    if (deprecated) {
+      gen.writeln("@Deprecated('$deprecationMessage')");
+    }
     if (withOverrides) gen.writeln('@override');
     gen.write('Future<${returnType.name}> ${name}(');
     bool startedOptional = false;
@@ -2128,7 +2140,12 @@
   void parseInto(Method method) {
     // method is return type, name, (, args )
     // args is type name, [optional], comma
-
+    if (peek()?.text?.startsWith('@deprecated') ?? false) {
+      advance();
+      expect('(');
+      method.deprecationMessage = consumeString()!;
+      expect(')');
+    }
     method.returnType.parse(this, isReturnType: true);
 
     Token t = expectName();
diff --git a/pkg/vm_service/tool/java/generate_java.dart b/pkg/vm_service/tool/java/generate_java.dart
index 9ef243d..c80a481 100644
--- a/pkg/vm_service/tool/java/generate_java.dart
+++ b/pkg/vm_service/tool/java/generate_java.dart
@@ -496,6 +496,7 @@
   final String? docs;
 
   MemberType returnType = MemberType();
+  bool deprecated = false;
   List<MethodArg> args = [];
 
   Method(this.name, String definition, [this.docs]) {
@@ -606,7 +607,7 @@
         }
       }
       writer.addLine('request("$name", params, consumer);');
-    }, javadoc: javadoc.toString());
+    }, javadoc: javadoc.toString(), isDeprecated: deprecated);
   }
 
   void _parse(Token? token) {
@@ -647,6 +648,13 @@
     // method is return type, name, (, args )
     // args is type name, [optional], comma
 
+    if (peek()?.text?.startsWith('@deprecated') ?? false) {
+      advance();
+      expect('(');
+      consumeString();
+      expect(')');
+      method.deprecated = true;
+    }
     method.returnType.parse(this);
 
     Token t = expectName();
diff --git a/pkg/vm_service/tool/java/src_gen_java.dart b/pkg/vm_service/tool/java/src_gen_java.dart
index b67c203..a2e62e5 100644
--- a/pkg/vm_service/tool/java/src_gen_java.dart
+++ b/pkg/vm_service/tool/java/src_gen_java.dart
@@ -214,6 +214,7 @@
     String? modifiers = 'public',
     String? returnType = 'void',
     bool isOverride = false,
+    bool isDeprecated = false,
   }) {
     var methodDecl = StringBuffer();
     if (javadoc != null && javadoc.isNotEmpty) {
@@ -223,6 +224,9 @@
           .forEach((line) => methodDecl.writeln('   * $line'.trimRight()));
       methodDecl.writeln('   */');
     }
+    if (isDeprecated) {
+      methodDecl.writeln('  @Deprecated');
+    }
     if (isOverride) {
       methodDecl.writeln('  @Override');
     }
diff --git a/runtime/bin/directory_win.cc b/runtime/bin/directory_win.cc
index 804bfff..3e199239 100644
--- a/runtime/bin/directory_win.cc
+++ b/runtime/bin/directory_win.cc
@@ -512,16 +512,6 @@
   }
   const char* prefixed_new_dir = PrefixLongDirectoryPath(new_path);
   Utf8ToWideScope system_new_path(prefixed_new_dir);
-  ExistsResult new_exists = ExistsHelper(system_new_path.wide());
-  // MoveFile does not allow replacing existing directories. Therefore,
-  // if the new_path is currently a directory we need to delete it
-  // first.
-  if (new_exists == EXISTS) {
-    bool success = Delete(namespc, prefixed_new_dir, true);
-    if (!success) {
-      return false;
-    }
-  }
   DWORD flags = MOVEFILE_WRITE_THROUGH;
   int move_status =
       MoveFileExW(system_path.wide(), system_new_path.wide(), flags);
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index bb24d00..6cb8860 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -896,7 +896,7 @@
 
 void File::Stat(Namespace* namespc, const char* name, int64_t* data) {
   const char* prefixed_name = PrefixLongFilePath(name);
-  File::Type type = GetType(namespc, prefixed_name, false);
+  File::Type type = GetType(namespc, prefixed_name, true);
   data[kType] = type;
   if (type != kDoesNotExist) {
     struct _stat64 st;
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index df755a73..00cf482 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -879,7 +879,6 @@
   if (IsSnapshottingForPrecompilation()) {
     vm_options.AddArgument("--precompilation");
   } else if ((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
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 4193965..88e7c9e9 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -222,7 +222,7 @@
     if (Dart_IsError(result)) goto failed;
   } else {
     result = DartUtils::ResolveScript(Dart_NewStringFromCString(script_uri));
-    if (Dart_IsError(result)) return result != nullptr;
+    if (Dart_IsError(result)) goto failed;
 
     if (isolate_group_data->kernel_buffer().get() != nullptr) {
       // Various core-library parts will send requests to the Loader to resolve
@@ -637,36 +637,36 @@
       delete app_snapshot;
     }
 
-    if (dartdev_path.get() != nullptr) {
-      isolate_group_data =
-          new IsolateGroupData(DART_DEV_ISOLATE_NAME, packages_config, nullptr,
-                               isolate_run_app_snapshot);
-      uint8_t* application_kernel_buffer = NULL;
-      intptr_t application_kernel_buffer_size = 0;
-      dfe.ReadScript(dartdev_path.get(), &application_kernel_buffer,
-                     &application_kernel_buffer_size, /*decode_uri=*/false);
-      isolate_group_data->SetKernelBufferNewlyOwned(
-          application_kernel_buffer, application_kernel_buffer_size);
-
-      isolate_data = new IsolateData(isolate_group_data);
-      isolate = Dart_CreateIsolateGroup(
-          DART_DEV_ISOLATE_NAME, DART_DEV_ISOLATE_NAME, isolate_snapshot_data,
-          isolate_snapshot_instructions, flags, isolate_group_data,
-          isolate_data, error);
+    if (dartdev_path.get() == nullptr) {
+      Syslog::PrintErr(
+          "Failed to start the Dart CLI isolate. Could not resolve DartDev "
+          "snapshot or kernel.\n");
+      delete isolate_data;
+      delete isolate_group_data;
+      return nullptr;
     }
+
+    isolate_group_data =
+        new IsolateGroupData(DART_DEV_ISOLATE_NAME, packages_config, nullptr,
+                             isolate_run_app_snapshot);
+    uint8_t* application_kernel_buffer = NULL;
+    intptr_t application_kernel_buffer_size = 0;
+    dfe.ReadScript(dartdev_path.get(), &application_kernel_buffer,
+                   &application_kernel_buffer_size, /*decode_uri=*/false);
+    isolate_group_data->SetKernelBufferNewlyOwned(
+        application_kernel_buffer, application_kernel_buffer_size);
+
+    isolate_data = new IsolateData(isolate_group_data);
+    isolate = Dart_CreateIsolateGroup(
+        DART_DEV_ISOLATE_NAME, DART_DEV_ISOLATE_NAME, isolate_snapshot_data,
+        isolate_snapshot_instructions, flags, isolate_group_data, isolate_data,
+        error);
   }
 
-  Dart_Isolate created_isolate = nullptr;
-  if (isolate == nullptr) {
-    Syslog::PrintErr("Failed to start the Dart CLI isolate\n");
-    delete isolate_data;
-    delete isolate_group_data;
-    return nullptr;
-  } else {
-    created_isolate = IsolateSetupHelper(
-        isolate, false, DART_DEV_ISOLATE_NAME, packages_config,
-        isolate_run_app_snapshot, flags, error, exit_code);
-  }
+  Dart_Isolate created_isolate =
+      IsolateSetupHelper(isolate, false, DART_DEV_ISOLATE_NAME, packages_config,
+                         isolate_run_app_snapshot, flags, error, exit_code);
+
   int64_t end = Dart_TimelineGetMicros();
   Dart_TimelineEvent("CreateAndSetupDartDevIsolate", start, end,
                      Dart_Timeline_Event_Duration, 0, NULL, NULL);
@@ -827,6 +827,20 @@
   ASSERT(flags != NULL);
   ASSERT(flags->version == DART_FLAGS_CURRENT_VERSION);
   ASSERT(package_root == nullptr);
+
+  bool dontneed_safe = true;
+#if defined(DART_HOST_OS_LINUX)
+  // This would also be true in Linux, except that Google3 overrides the default
+  // ELF interpreter to one that apparently doesn't create proper mappings.
+  dontneed_safe = false;
+#elif defined(DEBUG)
+  // If the snapshot isn't file-backed, madvise(DONT_NEED) is destructive.
+  if (Options::force_load_elf_from_memory()) {
+    dontneed_safe = false;
+  }
+#endif
+  flags->snapshot_is_dontneed_safe = dontneed_safe;
+
   int exit_code = 0;
 #if !defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM)
   if (strcmp(script_uri, DART_KERNEL_ISOLATE_NAME) == 0) {
@@ -946,6 +960,18 @@
   Dart_IsolateFlags flags;
   Dart_IsolateFlagsInitialize(&flags);
   flags.is_system_isolate = Options::mark_main_isolate_as_system_isolate();
+  bool dontneed_safe = true;
+#if defined(DART_HOST_OS_LINUX)
+  // This would also be true in Linux, except that Google3 overrides the default
+  // ELF interpreter to one that apparently doesn't create proper mappings.
+  dontneed_safe = false;
+#elif defined(DEBUG)
+  // If the snapshot isn't file-backed, madvise(DONT_NEED) is destructive.
+  if (Options::force_load_elf_from_memory()) {
+    dontneed_safe = false;
+  }
+#endif
+  flags.snapshot_is_dontneed_safe = dontneed_safe;
 
   Dart_Isolate isolate = CreateIsolateGroupAndSetupHelper(
       /* is_main_isolate */ true, script_name, "main",
@@ -1213,9 +1239,6 @@
     try_load_snapshots_lambda();
   }
 
-  if (Options::gen_snapshot_kind() == kAppJIT) {
-    vm_options.AddArgument("--fields_may_be_reset");
-  }
 #if defined(DART_PRECOMPILED_RUNTIME)
   vm_options.AddArgument("--precompilation");
 #endif
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index ccd8144..d560dab 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -384,7 +384,8 @@
       dart::bin::DartUtils::ReadFile, dart::bin::DartUtils::WriteFile,
       dart::bin::DartUtils::CloseFile, /*entropy_source=*/nullptr,
       /*get_service_assets=*/nullptr, start_kernel_isolate,
-      /*code_observer=*/nullptr);
+      /*code_observer=*/nullptr, /*post_task=*/nullptr,
+      /*post_task_data*/ nullptr);
   if (error != nullptr) {
     Syslog::PrintErr("Failed to initialize VM: %s\n", error);
     free(error);
diff --git a/runtime/docs/infra/il_tests.md b/runtime/docs/infra/il_tests.md
index 8400b6e..94c4500 100644
--- a/runtime/docs/infra/il_tests.md
+++ b/runtime/docs/infra/il_tests.md
@@ -11,76 +11,47 @@
 
 IL tests are placed in files ending with `_il_test.dart`.
 
-Each IL test should contain one or more _IL matching blocks_, which have the
-following format:
+Each IL test should contain one or more of the functions marked with a
+`@pragma('vm:testing:print-flow-graph'[, 'phases filter'])`.
+
+These functions will have their IL dumped at points specified by the
+_phases filter_ (if present, `]AllocateRegisters` by default), which follows
+the same syntax as `--compiler-passes=` flag and dumped IL will be compared
+against the expectations, which are specified programmatically using
+`package:vm/testing/il_matchers.dart` helpers. A function named `foo` has
+its IL expectations in the function called `matchIL$foo` in the same file.
 
 ```dart
-// MatchIL[AOT]=functionName
-//   comment
-// __ op
-//   comment
-// __ op
-// __ op
-// __ op
+import 'package:vm/testing/il_matchers.dart';
+
+@pragma('vm:testing:print-flow-graph')
+void foo() {
+}
+
+/// Expectations for [foo].
+void matchIL$foo(FlowGraph graph) {
+  graph.match([/* expectations */]);
+}
 ```
 
-Each section starts with a `// MatchIL[AOT]=functionName` line which contains
-the name (or a substring of a name) of the function for which IL should be
-matched.
-
-`// MatchIL[AOT]=...` line is followed by some number of comment lines `//`,
-where lines starting with `// __ ` specify _an instruction matcher_ and the rest
-are ignored (they just act as normal comments).
-
-`gen_snapshot` will be instructed (via `--print-flow-graph-optimized` and
-`--print-flow-graph-filter=functionName,...` flags) to dump IL for all
-functions names specified in IL matching blocks.
-
-After that `pkg/vm/tool/compare_il` script will be used to compare the dumps
-to actual expectations: by checking that dumped flow graph starts with the
-expected sequence of commands (ignoring some instructions like `ParallelMove`).
+Actual matching is done by the `pkg/vm/tool/compare_il` script.
 
 ## Example
 
 ```dart
-// MatchIL[AOT]=factorial
-// __ GraphEntry
-// __ FunctionEntry
-// __ CheckStackOverflow
-// __ Branch(EqualityCompare)
 @pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph')
 int factorial(int value) => value == 1 ? value : value * factorial(value - 1);
-```
 
-This test specifies that the graph for `factorial` should start with a sequence
-`GraphEntry`, `FunctionEntry`, `CheckStackOverflow`, `Branch(EqualityCompare)`.
-
-If the graph has a different shape the test will fail, e.g. given the graph
-
-```
-*** BEGIN CFG
-After AllocateRegisters
-==== file:///.../src/dart/sdk/runtime/tests/vm/dart/aot_prefer_equality_comparison_il_test.dart_::_factorial (RegularFunction)
-  0: B0[graph]:0 {
-      v3 <- Constant(#1) [1, 1] T{_Smi}
-      v19 <- UnboxedConstant(#1 int64) T{_Smi}
+void matchIL$factorial(FlowGraph graph) {
+  // Expected a graph which starts with GraphEntry block followed by a
+  // FunctionEntry block. FunctionEntry block should contain a Branch()
+  // instruction, with EqualityCompare as a comparison.
+  graph.match([
+    match.block('Graph'),
+    match.block('Function', [
+      match.Branch(match.EqualityCompare(match.any, match.any, kind: '==')),
+    ]),
+  ]);
 }
-  2: B1[function entry]:2 {
-      v2 <- Parameter(0) [-9223372036854775808, 9223372036854775807] T{int}
-}
-  4:     CheckStackOverflow:8(stack=0, loop=0)
-  5:     ParallelMove rcx <- S+2
-  6:     v17 <- BoxInt64(v2) [-9223372036854775808, 9223372036854775807] T{int}
-  7:     ParallelMove rax <- rax
-  8:     Branch if StrictCompare(===, v17 T{int}, v3) T{bool} goto (3, 4)
-```
-
-we will get:
-
-```
-Unhandled exception:
-Failed to match graph of ==== file:///.../src/dart/sdk/runtime/tests/vm/dart/aot_prefer_equality_comparison_il_test.dart_::_factorial (RegularFunction) to expectations for factorial at instruction 3: got BoxInt64 expected Branch(EqualityCompare)
-#0      main (file:///.../src/dart/sdk/pkg/vm/bin/compare_il.dart:37:9)
-#1      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:285:32)
-#2      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:187:12)
-```
+```
\ No newline at end of file
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index b62c1a7..e79e6c4 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -381,9 +381,9 @@
  * See the additional discussion under "Propagating Errors" at the
  * beginning of this file.
  *
- * \param An error handle (See Dart_IsError)
+ * \param handle An error handle (See Dart_IsError)
  *
- * \return On success, this function does not return.  On failure, the
+ * On success, this function does not return.  On failure, the
  * process is terminated.
  */
 DART_EXPORT void Dart_PropagateError(Dart_Handle handle);
@@ -443,9 +443,6 @@
  *
  * \param obj1 A persistent handle whose value needs to be set.
  * \param obj2 An object whose value needs to be set to the persistent handle.
- *
- * \return Success if the persistent handle was set
- *   Otherwise, returns an error.
  */
 DART_EXPORT void Dart_SetPersistentHandle(Dart_PersistentHandle obj1,
                                           Dart_Handle obj2);
@@ -586,7 +583,7 @@
  *
  * \return The version string for the embedded Dart VM.
  */
-DART_EXPORT const char* Dart_VersionString();
+DART_EXPORT const char* Dart_VersionString(void);
 
 /**
  * Isolate specific flags are set when creating a new isolate using the
@@ -772,45 +769,63 @@
  * This function could be used to dispose of native resources that
  * are associated and attached to the thread, in order to avoid leaks.
  */
-typedef void (*Dart_ThreadExitCallback)();
+typedef void (*Dart_ThreadExitCallback)(void);
 
 /**
- * Callbacks provided by the embedder for file operations. If the
- * embedder does not allow file operations these callbacks can be
+ * Opens a file for reading or writing.
+ *
+ * Callback provided by the embedder for file operations. If the
+ * embedder does not allow file operations this callback can be
  * NULL.
  *
- * Dart_FileOpenCallback - opens a file for reading or writing.
  * \param name The name of the file to open.
  * \param write A boolean variable which indicates if the file is to
  *   opened for writing. If there is an existing file it needs to truncated.
+ */
+typedef void* (*Dart_FileOpenCallback)(const char* name, bool write);
+
+/**
+ * Read contents of file.
  *
- * Dart_FileReadCallback - Read contents of file.
+ * Callback provided by the embedder for file operations. If the
+ * embedder does not allow file operations this callback can be
+ * NULL.
+ *
  * \param data Buffer allocated in the callback into which the contents
  *   of the file are read into. It is the responsibility of the caller to
  *   free this buffer.
  * \param file_length A variable into which the length of the file is returned.
  *   In the case of an error this value would be -1.
  * \param stream Handle to the opened file.
- *
- * Dart_FileWriteCallback - Write data into file.
- * \param data Buffer which needs to be written into the file.
- * \param length Length of the buffer.
- * \param stream Handle to the opened file.
- *
- * Dart_FileCloseCallback - Closes the opened file.
- * \param stream Handle to the opened file.
- *
  */
-typedef void* (*Dart_FileOpenCallback)(const char* name, bool write);
-
 typedef void (*Dart_FileReadCallback)(uint8_t** data,
                                       intptr_t* file_length,
                                       void* stream);
 
+/**
+ * Write data into file.
+ *
+ * Callback provided by the embedder for file operations. If the
+ * embedder does not allow file operations this callback can be
+ * NULL.
+ *
+ * \param data Buffer which needs to be written into the file.
+ * \param length Length of the buffer.
+ * \param stream Handle to the opened file.
+ */
 typedef void (*Dart_FileWriteCallback)(const void* data,
                                        intptr_t length,
                                        void* stream);
 
+/**
+ * Closes the opened file.
+ *
+ * Callback provided by the embedder for file operations. If the
+ * embedder does not allow file operations this callback can be
+ * NULL.
+ *
+ * \param stream Handle to the opened file.
+ */
 typedef void (*Dart_FileCloseCallback)(void* stream);
 
 typedef bool (*Dart_EntropySource)(uint8_t* buffer, intptr_t length);
@@ -825,13 +840,13 @@
  * \return The embedder must return a handle to a Uint8List containing an
  *   uncompressed tar archive or null.
  */
-typedef Dart_Handle (*Dart_GetVMServiceAssetsArchive)();
+typedef Dart_Handle (*Dart_GetVMServiceAssetsArchive)(void);
 
 /**
  * The current version of the Dart_InitializeFlags. Should be incremented every
  * time Dart_InitializeFlags changes in a binary incompatible way.
  */
-#define DART_INITIALIZE_PARAMS_CURRENT_VERSION (0x00000004)
+#define DART_INITIALIZE_PARAMS_CURRENT_VERSION (0x00000005)
 
 /** Forward declaration */
 struct Dart_CodeObserver;
@@ -857,52 +872,133 @@
   Dart_OnNewCodeCallback on_new_code;
 } Dart_CodeObserver;
 
+typedef struct _Dart_Task* Dart_Task;
+typedef enum {
+  Dart_TaskPriority_Default,
+} Dart_TaskPriority;
+typedef struct {
+  /**
+   * Placeholder.
+   */
+  Dart_TaskPriority priority;
+  /**
+   * Time after which the task should run according to the clock of
+   * Dart_TimelineGetMicros.
+   */
+  int64_t time_point;
+} Dart_TaskData;
+/**
+ * Callback provided by the embedder that is used by the VM to eventually run
+ * various tasks. If no callback is provided, these tasks will run on a
+ * VM-internal thread pool. This callback allows the embedder to make its own
+ * choices around the scheduling of these tasks: when they run, how many threads
+ * are servicing these tasks, the priorities of said threads, etc.
+ * The callback can be invoked as early as during the Dart_Initialize call.
+ *
+ * \param post_task_data
+ *     The data provided to Dart_InitializeParams.post_task_data.
+ * \param task
+ *     A task that should eventually be passed to Dart_RunTask.
+ * \param task_data
+ *     Hints about when the task should run.
+ */
+typedef void (*Dart_PostTaskCallback)(void* post_task_data,
+                                      Dart_Task task,
+                                      Dart_TaskData task_data);
+
+/**
+ * Runs a task given to the Dart_PostTaskCallback. Must not be called
+ * synchronously in response to any callback from the VM. In particular, must
+ * not be called synchronously by the implemention of a Dart native function
+ * or Dart_Post_TaskCallback.
+ *
+ * Requires there to be no current isolate or isolate group.
+ */
+DART_EXPORT void Dart_RunTask(Dart_Task task);
+
 /**
  * Describes how to initialize the VM. Used with Dart_Initialize.
- *
- * \param version Identifies the version of the struct used by the client.
- *   should be initialized to DART_INITIALIZE_PARAMS_CURRENT_VERSION.
- * \param vm_isolate_snapshot A buffer containing a snapshot of the VM isolate
- *   or NULL if no snapshot is provided. If provided, the buffer must remain
- *   valid until Dart_Cleanup returns.
- * \param instructions_snapshot A buffer containing a snapshot of precompiled
- *   instructions, or NULL if no snapshot is provided. If provided, the buffer
- *   must remain valid until Dart_Cleanup returns.
- * \param initialize_isolate A function to be called during isolate
- *   initialization inside an existing isolate group.
- *   See Dart_InitializeIsolateCallback.
- * \param create_group A function to be called during isolate group creation.
- *   See Dart_IsolateGroupCreateCallback.
- * \param shutdown A function to be called right before an isolate is shutdown.
- *   See Dart_IsolateShutdownCallback.
- * \param cleanup A function to be called after an isolate was shutdown.
- *   See Dart_IsolateCleanupCallback.
- * \param cleanup_group A function to be called after an isolate group is shutdown.
- *   See Dart_IsolateGroupCleanupCallback.
- * \param get_service_assets A function to be called by the service isolate when
- *    it requires the vmservice assets archive.
- *    See Dart_GetVMServiceAssetsArchive.
- * \param code_observer An external code observer callback function.
- *    The observer can be invoked as early as during the Dart_Initialize() call.
  */
 typedef struct {
+  /**
+   * Identifies the version of the struct used by the client.
+   * should be initialized to DART_INITIALIZE_PARAMS_CURRENT_VERSION.
+   */
   int32_t version;
+
+  /**
+   * A buffer containing snapshot data, or NULL if no snapshot is provided.
+   *
+   * If provided, the buffer must remain valid until Dart_Cleanup returns.
+   */
   const uint8_t* vm_snapshot_data;
+
+  /**
+   * A buffer containing a snapshot of precompiled instructions, or NULL if
+   * no snapshot is provided.
+   *
+   * If provided, the buffer must remain valid until Dart_Cleanup returns.
+   */
   const uint8_t* vm_snapshot_instructions;
+
+  /**
+   * A function to be called during isolate group creation.
+   * See Dart_IsolateGroupCreateCallback.
+   */
   Dart_IsolateGroupCreateCallback create_group;
+
+  /**
+   * A function to be called during isolate
+   * initialization inside an existing isolate group.
+   * See Dart_InitializeIsolateCallback.
+   */
   Dart_InitializeIsolateCallback initialize_isolate;
+
+  /**
+   * A function to be called right before an isolate is shutdown.
+   * See Dart_IsolateShutdownCallback.
+   */
   Dart_IsolateShutdownCallback shutdown_isolate;
+
+  /**
+   * A function to be called after an isolate was shutdown.
+   * See Dart_IsolateCleanupCallback.
+   */
   Dart_IsolateCleanupCallback cleanup_isolate;
+
+  /**
+   * A function to be called after an isolate group is
+   * shutdown. See Dart_IsolateGroupCleanupCallback.
+   */
   Dart_IsolateGroupCleanupCallback cleanup_group;
+
   Dart_ThreadExitCallback thread_exit;
   Dart_FileOpenCallback file_open;
   Dart_FileReadCallback file_read;
   Dart_FileWriteCallback file_write;
   Dart_FileCloseCallback file_close;
   Dart_EntropySource entropy_source;
+
+  /**
+   * A function to be called by the service isolate when it requires the
+   * vmservice assets archive. See Dart_GetVMServiceAssetsArchive.
+   */
   Dart_GetVMServiceAssetsArchive get_service_assets;
+
   bool start_kernel_isolate;
+
+  /**
+   * An external code observer callback function. The observer can be invoked
+   * as early as during the Dart_Initialize() call.
+   */
   Dart_CodeObserver* code_observer;
+
+  /**
+   * A task scheduling callback function. See Dart_PostTaskCallback.
+   */
+  Dart_PostTaskCallback post_task;
+
+  void* post_task_data;
 } Dart_InitializeParams;
 
 /**
@@ -926,7 +1022,7 @@
  * NOTE: This function must not be called on a thread that was created by the VM
  * itself.
  */
-DART_EXPORT DART_WARN_UNUSED_RESULT char* Dart_Cleanup();
+DART_EXPORT DART_WARN_UNUSED_RESULT char* Dart_Cleanup(void);
 
 /**
  * Sets command line flags. Should be called before Dart_Initialize.
@@ -969,15 +1065,17 @@
  * Requires there to be no current isolate.
  *
  * \param script_uri The main source file or snapshot this isolate will load.
- *   The VM will provide this URI to the Dart_IsolateGroupCreateCallback when a child
- *   isolate is created by Isolate.spawn. The embedder should use a URI that
- *   allows it to load the same program into such a child isolate.
+ *   The VM will provide this URI to the Dart_IsolateGroupCreateCallback when a
+ *   child isolate is created by Isolate.spawn. The embedder should use a URI
+ *   that allows it to load the same program into such a child isolate.
  * \param name A short name for the isolate to improve debugging messages.
  *   Typically of the format 'foo.dart:main()'.
- * \param isolate_snapshot_data
- * \param isolate_snapshot_instructions Buffers containing a snapshot of the
- *   isolate or NULL if no snapshot is provided. If provided, the buffers must
+ * \param isolate_snapshot_data Buffer containing the snapshot data of the
+ *   isolate or NULL if no snapshot is provided. If provided, the buffer must
  *   remain valid until the isolate shuts down.
+ * \param isolate_snapshot_instructions Buffer containing the snapshot
+ *   instructions of the isolate or NULL if no snapshot is provided. If
+ *   provided, the buffer must remain valid until the isolate shuts down.
  * \param flags Pointer to VM specific flags or NULL for default flags.
  * \param isolate_group_data Embedder group data. This data can be obtained
  *   by calling Dart_IsolateGroupData and will be passed to the
@@ -1042,14 +1140,14 @@
  * Requires there to be no current isolate.
  *
  * \param script_uri The main source file or snapshot this isolate will load.
- *   The VM will provide this URI to the Dart_IsolateGroupCreateCallback when a child
- *   isolate is created by Isolate.spawn. The embedder should use a URI that
+ *   The VM will provide this URI to the Dart_IsolateGroupCreateCallback when a
+ * child isolate is created by Isolate.spawn. The embedder should use a URI that
  *   allows it to load the same program into such a child isolate.
  * \param name A short name for the isolate to improve debugging messages.
  *   Typically of the format 'foo.dart:main()'.
- * \param kernel_buffer
- * \param kernel_buffer_size A buffer which contains a kernel/DIL program. Must
+ * \param kernel_buffer A buffer which contains a kernel/DIL program. Must
  *   remain valid until isolate shutdown.
+ * \param kernel_buffer_size The size of `kernel_buffer`.
  * \param flags Pointer to VM specific flags or NULL for default flags.
  * \param isolate_group_data Embedder group data. This data can be obtained
  *   by calling Dart_IsolateGroupData and will be passed to the
@@ -1080,20 +1178,20 @@
  *
  * Requires there to be a current isolate.
  */
-DART_EXPORT void Dart_ShutdownIsolate();
+DART_EXPORT void Dart_ShutdownIsolate(void);
 /* TODO(turnidge): Document behavior when there is no current isolate. */
 
 /**
  * Returns the current isolate. Will return NULL if there is no
  * current isolate.
  */
-DART_EXPORT Dart_Isolate Dart_CurrentIsolate();
+DART_EXPORT Dart_Isolate Dart_CurrentIsolate(void);
 
 /**
  * Returns the callback data associated with the current isolate. This
  * data was set when the isolate got created or initialized.
  */
-DART_EXPORT void* Dart_CurrentIsolateData();
+DART_EXPORT void* Dart_CurrentIsolateData(void);
 
 /**
  * Returns the callback data associated with the given isolate. This
@@ -1105,13 +1203,13 @@
  * Returns the current isolate group. Will return NULL if there is no
  * current isolate group.
  */
-DART_EXPORT Dart_IsolateGroup Dart_CurrentIsolateGroup();
+DART_EXPORT Dart_IsolateGroup Dart_CurrentIsolateGroup(void);
 
 /**
  * Returns the callback data associated with the current isolate group. This
  * data was passed to the isolate group when it was created.
  */
-DART_EXPORT void* Dart_CurrentIsolateGroupData();
+DART_EXPORT void* Dart_CurrentIsolateGroupData(void);
 
 /**
  * Returns the callback data associated with the specified isolate group. This
@@ -1127,7 +1225,7 @@
  * This name is unique to each isolate and should only be used to make
  * debugging messages more comprehensible.
  */
-DART_EXPORT Dart_Handle Dart_DebugName();
+DART_EXPORT Dart_Handle Dart_DebugName(void);
 
 /**
  * Returns the ID for an isolate which is used to query the service protocol.
@@ -1188,12 +1286,12 @@
  *
  * Does not require a current isolate. Only valid after calling Dart_Initialize.
  */
-DART_EXPORT void Dart_NotifyLowMemory();
+DART_EXPORT void Dart_NotifyLowMemory(void);
 
 /**
  * Starts the CPU sampling profiler.
  */
-DART_EXPORT void Dart_StartProfiling();
+DART_EXPORT void Dart_StartProfiling(void);
 
 /**
  * Stops the CPU sampling profiler.
@@ -1202,7 +1300,7 @@
  * returns due to the asynchronous nature of the implementation on some
  * platforms.
  */
-DART_EXPORT void Dart_StopProfiling();
+DART_EXPORT void Dart_StopProfiling(void);
 
 /**
  * Notifies the VM that the current thread should not be profiled until a
@@ -1213,7 +1311,7 @@
  * to make a blocking call and wants to avoid unnecessary interrupts by
  * the profiler.
  */
-DART_EXPORT void Dart_ThreadDisableProfiling();
+DART_EXPORT void Dart_ThreadDisableProfiling(void);
 
 /**
  * Notifies the VM that the current thread should be profiled.
@@ -1223,7 +1321,7 @@
  *
  * NOTE: By default, if a thread has entered an isolate it will be profiled.
  */
-DART_EXPORT void Dart_ThreadEnableProfiling();
+DART_EXPORT void Dart_ThreadEnableProfiling(void);
 
 /**
  * Register symbol information for the Dart VM's profiler and crash dumps.
@@ -1241,7 +1339,7 @@
  *
  * Requires there to be a current isolate.
  */
-DART_EXPORT void Dart_ExitIsolate();
+DART_EXPORT void Dart_ExitIsolate(void);
 /* TODO(turnidge): We don't want users of the api to be able to exit a
  * "pure" dart isolate. Implement and document. */
 
@@ -1256,12 +1354,17 @@
  * Requires there to be a current isolate. Not available in the precompiled
  * runtime (check Dart_IsPrecompiledRuntime).
  *
- * \param buffer Returns a pointer to a buffer containing the
- *   snapshot. This buffer is scope allocated and is only valid
+ * \param vm_snapshot_data_buffer Returns a pointer to a buffer containing the
+ *   vm snapshot. This buffer is scope allocated and is only valid
  *   until the next call to Dart_ExitScope.
- * \param size Returns the size of the buffer.
+ * \param vm_snapshot_data_size Returns the size of vm_snapshot_data_buffer.
+ * \param isolate_snapshot_data_buffer Returns a pointer to a buffer containing
+ *   the isolate snapshot. This buffer is scope allocated and is only valid
+ *   until the next call to Dart_ExitScope.
+ * \param isolate_snapshot_data_size Returns the size of
+ *   isolate_snapshot_data_buffer.
  * \param is_core Create a snapshot containing core libraries.
- *                Such snapshot should be agnostic to null safety mode.
+ *   Such snapshot should be agnostic to null safety mode.
  *
  * \return A valid handle if no error occurs during the operation.
  */
@@ -1344,7 +1447,7 @@
  *
  * \return The current message notify callback for the isolate.
  */
-DART_EXPORT Dart_MessageNotifyCallback Dart_GetMessageNotifyCallback();
+DART_EXPORT Dart_MessageNotifyCallback Dart_GetMessageNotifyCallback(void);
 
 /**
  * The VM's default message handler supports pausing an isolate before it
@@ -1370,7 +1473,7 @@
  *
  * \return A boolean value indicating if pause on start was requested.
  */
-DART_EXPORT bool Dart_ShouldPauseOnStart();
+DART_EXPORT bool Dart_ShouldPauseOnStart(void);
 
 /**
  * Override the VM flag `--pause-isolates-on-start` for the current isolate.
@@ -1386,7 +1489,7 @@
  *
  * \return A boolean value indicating if the isolate is paused on start.
  */
-DART_EXPORT bool Dart_IsPausedOnStart();
+DART_EXPORT bool Dart_IsPausedOnStart(void);
 
 /**
  * Called when the embedder has paused the current isolate on start and when
@@ -1401,7 +1504,7 @@
  *
  * \return A boolean value indicating if pause on exit was requested.
  */
-DART_EXPORT bool Dart_ShouldPauseOnExit();
+DART_EXPORT bool Dart_ShouldPauseOnExit(void);
 
 /**
  * Override the VM flag `--pause-isolates-on-exit` for the current isolate.
@@ -1416,7 +1519,7 @@
  *
  * \return A boolean value indicating if the isolate is paused on exit.
  */
-DART_EXPORT bool Dart_IsPausedOnExit();
+DART_EXPORT bool Dart_IsPausedOnExit(void);
 
 /**
  * Called when the embedder has paused the current isolate on exit and when
@@ -1440,14 +1543,14 @@
 /**
  * Does the current isolate have a sticky error?
  */
-DART_EXPORT bool Dart_HasStickyError();
+DART_EXPORT bool Dart_HasStickyError(void);
 
 /**
  * Gets the sticky error for the current isolate.
  *
  * \return A handle to the sticky error object or null.
  */
-DART_EXPORT Dart_Handle Dart_GetStickyError();
+DART_EXPORT Dart_Handle Dart_GetStickyError(void);
 
 /**
  * Handles the next pending message for the current isolate.
@@ -1456,7 +1559,7 @@
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_HandleMessage();
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_HandleMessage(void);
 
 /**
  * Drains the microtask queue, then blocks the calling thread until the current
@@ -1482,14 +1585,14 @@
  * \return true if the vm service requests the program resume
  * execution, false otherwise
  */
-DART_EXPORT bool Dart_HandleServiceMessages();
+DART_EXPORT bool Dart_HandleServiceMessages(void);
 
 /**
  * Does the current isolate have pending service messages?
  *
  * \return true if the isolate has pending service messages, false otherwise.
  */
-DART_EXPORT bool Dart_HasServiceMessages();
+DART_EXPORT bool Dart_HasServiceMessages(void);
 
 /**
  * Processes any incoming messages for the current isolate.
@@ -1507,7 +1610,7 @@
  *   exception or other error occurs while processing messages, an
  *   error handle is returned.
  */
-DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_RunLoop();
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_RunLoop(void);
 
 /**
  * Lets the VM run message processing for the isolate.
@@ -1538,14 +1641,14 @@
 /**
  * Gets the main port id for the current isolate.
  */
-DART_EXPORT Dart_Port Dart_GetMainPortId();
+DART_EXPORT Dart_Port Dart_GetMainPortId(void);
 
 /**
  * Does the current isolate have live ReceivePorts?
  *
  * A ReceivePort is live when it has not been closed.
  */
-DART_EXPORT bool Dart_HasLivePorts();
+DART_EXPORT bool Dart_HasLivePorts(void);
 
 /**
  * Posts a message for some isolate. The message is a serialized
@@ -1553,7 +1656,7 @@
  *
  * Requires there to be a current isolate.
  *
- * \param port The destination port.
+ * \param port_id The destination port.
  * \param object An object from the current isolate.
  *
  * \return True if the message was posted.
@@ -1595,7 +1698,7 @@
  *
  * Requires there to be a current isolate.
  */
-DART_EXPORT void Dart_EnterScope();
+DART_EXPORT void Dart_EnterScope(void);
 
 /**
  * Exits a scope.
@@ -1604,7 +1707,7 @@
  *
  * Requires there to be a current isolate.
  */
-DART_EXPORT void Dart_ExitScope();
+DART_EXPORT void Dart_ExitScope(void);
 
 /**
  * The Dart VM uses "zone allocation" for temporary structures. Zones
@@ -1641,7 +1744,7 @@
  *
  * \return A handle to the null object.
  */
-DART_EXPORT Dart_Handle Dart_Null();
+DART_EXPORT Dart_Handle Dart_Null(void);
 
 /**
  * Is this object null?
@@ -1653,7 +1756,7 @@
  *
  * \return A handle to the empty string object.
  */
-DART_EXPORT Dart_Handle Dart_EmptyString();
+DART_EXPORT Dart_Handle Dart_EmptyString(void);
 
 /**
  * Returns types that are not classes, and which therefore cannot be looked up
@@ -1661,9 +1764,9 @@
  *
  * \return A handle to the dynamic, void or Never type.
  */
-DART_EXPORT Dart_Handle Dart_TypeDynamic();
-DART_EXPORT Dart_Handle Dart_TypeVoid();
-DART_EXPORT Dart_Handle Dart_TypeNever();
+DART_EXPORT Dart_Handle Dart_TypeDynamic(void);
+DART_EXPORT Dart_Handle Dart_TypeVoid(void);
+DART_EXPORT Dart_Handle Dart_TypeNever(void);
 
 /**
  * Checks if the two objects are equal.
@@ -1972,7 +2075,7 @@
  *
  * \return A handle to the True object.
  */
-DART_EXPORT Dart_Handle Dart_True();
+DART_EXPORT Dart_Handle Dart_True(void);
 
 /**
  * Returns the False object.
@@ -1981,7 +2084,7 @@
  *
  * \return A handle to the False object.
  */
-DART_EXPORT Dart_Handle Dart_False();
+DART_EXPORT Dart_Handle Dart_False(void);
 
 /**
  * Returns a Boolean with the provided value.
@@ -2025,7 +2128,7 @@
  *  UTF-8 encoded characters and '\0' is considered as a termination
  *  character).
  *
- * \param value A C String
+ * \param str A C String
  *
  * \return The String object if no error occurs. Otherwise returns
  *   an error handle.
@@ -2182,7 +2285,7 @@
  * Gets the storage size in bytes of a String.
  *
  * \param str A String.
- * \param length Returns the storage size in bytes of the String.
+ * \param size Returns the storage size in bytes of the String.
  *  This is the size in bytes needed to store the String.
  *
  * \return A valid handle if no error occurs during the operation.
@@ -2329,7 +2432,7 @@
  *
  * May generate an unhandled exception error.
  *
- * \param array A List.
+ * \param list A List.
  * \param index A valid index into the List.
  * \param value The Object to put in the List.
  *
@@ -2494,7 +2597,7 @@
 /**
  * Returns a ByteBuffer object for the typed data.
  *
- * \param type_data The TypedData object.
+ * \param typed_data The TypedData object.
  *
  * \return The ByteBuffer object if no error occurs. Otherwise returns
  *   an error handle.
@@ -2653,13 +2756,13 @@
  * Invokes a Generative Constructor on an object that was previously
  * allocated using Dart_Allocate/Dart_AllocateWithNativeFields.
  *
- * The 'target' parameter must be an object.
+ * The 'object' parameter must be an object.
  *
  * This function ignores visibility (leading underscores in names).
  *
  * May generate an unhandled exception error.
  *
- * \param target An object.
+ * \param object An object.
  * \param name The name of the constructor to invoke.
  *   Use Dart_Null() or Dart_EmptyString() to invoke the unnamed constructor.
  * \param number_of_arguments Size of the arguments array.
@@ -2937,7 +3040,7 @@
 /**
  * Gets an integer native argument at some index.
  * \param args Native arguments structure.
- * \param arg_index Index of the desired argument in the structure above.
+ * \param index Index of the desired argument in the structure above.
  * \param value Returns the integer value if the argument is an Integer.
  * \return Success if no error occurs. Otherwise returns an error handle.
  */
@@ -2948,7 +3051,7 @@
 /**
  * Gets a boolean native argument at some index.
  * \param args Native arguments structure.
- * \param arg_index Index of the desired argument in the structure above.
+ * \param index Index of the desired argument in the structure above.
  * \param value Returns the boolean value if the argument is a Boolean.
  * \return Success if no error occurs. Otherwise returns an error handle.
  */
@@ -2959,7 +3062,7 @@
 /**
  * Gets a double native argument at some index.
  * \param args Native arguments structure.
- * \param arg_index Index of the desired argument in the structure above.
+ * \param index Index of the desired argument in the structure above.
  * \param value Returns the double value if the argument is a double.
  * \return Success if no error occurs. Otherwise returns an error handle.
  */
@@ -3271,9 +3374,9 @@
  *
  * Requires there to be no current root library.
  *
- * \param buffer A buffer which contains a kernel binary (see
+ * \param kernel_buffer A buffer which contains a kernel binary (see
  *     pkg/kernel/binary.md). Must remain valid until isolate group shutdown.
- * \param buffer_size Length of the passed in buffer.
+ * \param kernel_size Length of the passed in buffer.
  *
  * \return A handle to the root library, or an error.
  */
@@ -3289,7 +3392,7 @@
  *
  * \return Returns the root Library for the current isolate or Dart_Null().
  */
-DART_EXPORT Dart_Handle Dart_RootLibrary();
+DART_EXPORT Dart_Handle Dart_RootLibrary(void);
 
 /**
  * Sets the root library for the current isolate.
@@ -3417,7 +3520,7 @@
 /**
  * \return An array of libraries.
  */
-DART_EXPORT Dart_Handle Dart_GetLoadedLibraries();
+DART_EXPORT Dart_Handle Dart_GetLoadedLibraries(void);
 
 DART_EXPORT Dart_Handle Dart_LookupLibrary(Dart_Handle url);
 /* TODO(turnidge): Consider returning Dart_Null() when the library is
@@ -3440,9 +3543,9 @@
  * Called by the embedder to load a partial program. Does not set the root
  * library.
  *
- * \param buffer A buffer which contains a kernel binary (see
+ * \param kernel_buffer A buffer which contains a kernel binary (see
  *     pkg/kernel/binary.md). Must remain valid until isolate shutdown.
- * \param buffer_size Length of the passed in buffer.
+ * \param kernel_buffer_size Length of the passed in buffer.
  *
  * \return A handle to the main library of the compilation unit, or an error.
  */
@@ -3542,8 +3645,8 @@
 } Dart_KernelCompilationVerbosityLevel;
 
 DART_EXPORT bool Dart_IsKernelIsolate(Dart_Isolate isolate);
-DART_EXPORT bool Dart_KernelIsolateIsRunning();
-DART_EXPORT Dart_Port Dart_KernelPort();
+DART_EXPORT bool Dart_KernelIsolateIsRunning(void);
+DART_EXPORT Dart_Port Dart_KernelPort(void);
 
 /**
  * Compiles the given `script_uri` to a kernel file.
@@ -3586,7 +3689,7 @@
   const char* source;
 } Dart_SourceFile;
 
-DART_EXPORT Dart_KernelCompilationResult Dart_KernelListDependencies();
+DART_EXPORT Dart_KernelCompilationResult Dart_KernelListDependencies(void);
 
 /**
  * Sets the kernel buffer which will be used to load Dart SDK sources
@@ -3621,17 +3724,19 @@
  *   process was launched, this is used to correctly resolve the path specified
  *   for package_config.
  *
- * \param snapshot_data
- *
- * \param snapshot_instructions Buffers containing a snapshot of the
+ * \param snapshot_data Buffer containing the snapshot data of the
  *   isolate or NULL if no snapshot is provided. If provided, the buffers must
  *   remain valid until the isolate shuts down.
  *
- * \param kernel_buffer
+ * \param snapshot_instructions Buffer containing the snapshot instructions of
+ *   the isolate or NULL if no snapshot is provided. If provided, the buffers
+ *   must remain valid until the isolate shuts down.
  *
- * \param kernel_buffer_size A buffer which contains a kernel/DIL program. Must
+ * \param kernel_buffer A buffer which contains a kernel/DIL program. Must
  *   remain valid until isolate shutdown.
  *
+ * \param kernel_buffer_size The size of `kernel_buffer`.
+ *
  * \return Returns true if the null safety is opted in by the input being
  *   run `script_uri`, `snapshot_data` or `kernel_buffer`.
  *
@@ -3692,7 +3797,7 @@
  * \return An error handle if a compilation error or runtime error running const
  * constructors was encountered.
  */
-DART_EXPORT Dart_Handle Dart_Precompile();
+DART_EXPORT Dart_Handle Dart_Precompile(void);
 
 typedef void (*Dart_CreateLoadingUnitCallback)(
     void* callback_data,
@@ -3830,7 +3935,7 @@
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_SortClasses();
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_SortClasses(void);
 
 /**
  *  Creates a snapshot that caches compiled code and type feedback for faster
@@ -3890,7 +3995,7 @@
  *  not from any other kind of snapshot or from source (that is, the VM was
  *  compiled with DART_PRECOMPILED_RUNTIME).
  */
-DART_EXPORT bool Dart_IsPrecompiledRuntime();
+DART_EXPORT bool Dart_IsPrecompiledRuntime(void);
 
 /**
  *  Print a native stack trace. Used for crash handling.
@@ -3905,6 +4010,6 @@
  *  Indicate that the process is about to abort, and the Dart VM should not
  *  attempt to cleanup resources.
  */
-DART_EXPORT void Dart_PrepareToAbort();
+DART_EXPORT void Dart_PrepareToAbort(void);
 
 #endif /* INCLUDE_DART_API_H_ */ /* NOLINT */
diff --git a/runtime/include/dart_api_dl.h b/runtime/include/dart_api_dl.h
index 1521df2..804b281 100644
--- a/runtime/include/dart_api_dl.h
+++ b/runtime/include/dart_api_dl.h
@@ -96,8 +96,8 @@
   F(Dart_SendPortGetId, Dart_Handle,                                           \
     (Dart_Handle port, Dart_Port_DL * port_id))                                \
   /* Scopes */                                                                 \
-  F(Dart_EnterScope, void, ())                                                 \
-  F(Dart_ExitScope, void, ())
+  F(Dart_EnterScope, void, (void))                                             \
+  F(Dart_ExitScope, void, (void))
 
 #define DART_API_ALL_DL_SYMBOLS(F)                                             \
   DART_NATIVE_API_DL_SYMBOLS(F)                                                \
diff --git a/runtime/include/dart_native_api.h b/runtime/include/dart_native_api.h
index f99fff1..66e5f93 100644
--- a/runtime/include/dart_native_api.h
+++ b/runtime/include/dart_native_api.h
@@ -181,12 +181,12 @@
  *
  * TODO(turnidge): Document.
  */
-DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_CompileAll();
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_CompileAll(void);
 
 /**
  * Finalizes all classes.
  */
-DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_FinalizeAllClasses();
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_FinalizeAllClasses(void);
 
 /*  This function is intentionally undocumented.
  *
diff --git a/runtime/include/dart_tools_api.h b/runtime/include/dart_tools_api.h
index f36ec6b..1a2d9bb 100644
--- a/runtime/include/dart_tools_api.h
+++ b/runtime/include/dart_tools_api.h
@@ -222,25 +222,6 @@
     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
@@ -363,6 +344,37 @@
  */
 
 /**
+ * Enable tracking of specified timeline category. This is operational
+ * only when systrace timeline functionality is turned on.
+ *
+ * \param categories A comma seperated list of categories that need to
+ *   be enabled, the categories are
+ *   "all" : All categories
+ *   "API" - Execution of Dart C API functions
+ *   "Compiler" - Execution of Dart JIT compiler
+ *   "CompilerVerbose" - More detailed Execution of Dart JIT compiler
+ *   "Dart" - Execution of Dart code
+ *   "Debugger" - Execution of Dart debugger
+ *   "Embedder" - Execution of Dart embedder code
+ *   "GC" - Execution of Dart Garbage Collector
+ *   "Isolate" - Dart Isolate lifecycle execution
+ *   "VM" - Excution in Dart VM runtime code
+ *   "" - None
+ *
+ *  When "all" is specified all the categories are enabled.
+ *  When a comma seperated list of categories is specified, the categories
+ *   that are specified will be enabled and the rest will be disabled. 
+ *  When "" is specified all the categories are disabled.
+ *  The category names are case sensitive.
+ *  eg:  Dart_EnableTimelineCategory("all");
+ *       Dart_EnableTimelineCategory("GC,API,Isolate");
+ *       Dart_EnableTimelineCategory("GC,Debugger,Dart");
+ *
+ * \return True if the categories were successfully enabled, False otherwise.
+ */
+DART_EXPORT bool Dart_SetEnabledTimelineCategory(const char* categories);
+
+/**
  * Returns a timestamp in microseconds. This timestamp is suitable for
  * passing into the timeline system, and uses the same monotonic clock
  * as dart:developer's Timeline.now.
diff --git a/runtime/include/internal/dart_api_dl_impl.h b/runtime/include/internal/dart_api_dl_impl.h
index ad13a4b..e4a5689 100644
--- a/runtime/include/internal/dart_api_dl_impl.h
+++ b/runtime/include/internal/dart_api_dl_impl.h
@@ -9,7 +9,7 @@
 
 typedef struct {
   const char* name;
-  void (*function)();
+  void (*function)(void);
 } DartApiEntry;
 
 typedef struct {
diff --git a/runtime/lib/errors.cc b/runtime/lib/errors.cc
index 42c0acc..7a3415a 100644
--- a/runtime/lib/errors.cc
+++ b/runtime/lib/errors.cc
@@ -220,10 +220,10 @@
 }
 
 // Rethrow an error with a stacktrace.
-DEFINE_NATIVE_ENTRY(Async_rethrow, 0, 2) {
+DEFINE_NATIVE_ENTRY(Error_throwWithStackTrace, 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);
+  Exceptions::ThrowWithStackTrace(thread, error, stacktrace);
   return Object::null();
 }
 
diff --git a/runtime/lib/ffi.cc b/runtime/lib/ffi.cc
index 239f758..9f0bf75 100644
--- a/runtime/lib/ffi.cc
+++ b/runtime/lib/ffi.cc
@@ -68,91 +68,10 @@
   UNREACHABLE();
 }
 
-DEFINE_NATIVE_ENTRY(Ffi_asExternalTypedData, 0, 2) {
-  GET_NON_NULL_NATIVE_ARGUMENT(Pointer, pointer, arguments->NativeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Integer, count, arguments->NativeArgAt(1));
-  const auto& pointer_type_arg = AbstractType::Handle(pointer.type_argument());
-  const classid_t type_cid = pointer_type_arg.type_class_id();
-  classid_t cid = 0;
-
-  switch (type_cid) {
-    case kFfiInt8Cid:
-      cid = kExternalTypedDataInt8ArrayCid;
-      break;
-    case kFfiUint8Cid:
-      cid = kExternalTypedDataUint8ArrayCid;
-      break;
-    case kFfiInt16Cid:
-      cid = kExternalTypedDataInt16ArrayCid;
-      break;
-    case kFfiUint16Cid:
-      cid = kExternalTypedDataUint16ArrayCid;
-      break;
-    case kFfiInt32Cid:
-      cid = kExternalTypedDataInt32ArrayCid;
-      break;
-    case kFfiUint32Cid:
-      cid = kExternalTypedDataUint32ArrayCid;
-      break;
-    case kFfiInt64Cid:
-      cid = kExternalTypedDataInt64ArrayCid;
-      break;
-    case kFfiUint64Cid:
-      cid = kExternalTypedDataUint64ArrayCid;
-      break;
-    case kFfiIntPtrCid:
-      cid = kWordSize == 4 ? kExternalTypedDataInt32ArrayCid
-                           : kExternalTypedDataInt64ArrayCid;
-      break;
-    case kFfiFloatCid:
-      cid = kExternalTypedDataFloat32ArrayCid;
-      break;
-    case kFfiDoubleCid:
-      cid = kExternalTypedDataFloat64ArrayCid;
-      break;
-    default: {
-      const String& error = String::Handle(
-          String::NewFormatted("Cannot create a TypedData from a Pointer to %s",
-                               pointer_type_arg.ToCString()));
-      Exceptions::ThrowArgumentError(error);
-      UNREACHABLE();
-    }
-  }
-
-  const intptr_t element_count = count.AsInt64Value();
-
-  if (element_count < 0 ||
-      element_count > ExternalTypedData::MaxElements(cid)) {
-    const String& error = String::Handle(
-        String::NewFormatted("Count must be in the range [0, %" Pd "].",
-                             ExternalTypedData::MaxElements(cid)));
-    Exceptions::ThrowArgumentError(error);
-  }
-
-  // The address must be aligned by the element size.
-  const intptr_t element_size = ExternalTypedData::ElementSizeFor(cid);
-  if (!Utils::IsAligned(pointer.NativeAddress(), element_size)) {
-    const String& error = String::Handle(
-        String::NewFormatted("Pointer address must be aligned to a multiple of"
-                             "the element size (%" Pd ").",
-                             element_size));
-    Exceptions::ThrowArgumentError(error);
-  }
-
-  const auto& typed_data_class =
-      Class::Handle(zone, isolate->group()->class_table()->At(cid));
-  const auto& error =
-      Error::Handle(zone, typed_data_class.EnsureIsAllocateFinalized(thread));
-  if (!error.IsNull()) {
-    Exceptions::PropagateError(error);
-  }
-
-  // We disable msan initialization check because the memory may not be
-  // initialized yet - dart code might do that later on.
-  return ExternalTypedData::New(
-      cid, reinterpret_cast<uint8_t*>(pointer.NativeAddress()), element_count,
-      Heap::kNew, /*perform_eager_msan_initialization_check=*/false);
-}
+#define DEFINE_NATIVE_ENTRY_AS_EXTERNAL_TYPED_DATA(type)                       \
+  DEFINE_NATIVE_ENTRY(Ffi_asExternalTypedData##type, 0, 2) { UNREACHABLE(); }
+CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(DEFINE_NATIVE_ENTRY_AS_EXTERNAL_TYPED_DATA)
+#undef DEFINE_NATIVE_ENTRY_AS_EXTERNAL_TYPED_DATA
 
 DEFINE_NATIVE_ENTRY(Ffi_nativeCallbackFunction, 1, 2) {
 #if defined(DART_PRECOMPILED_RUNTIME) || defined(DART_PRECOMPILER)
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 21b66a2..f57a6c4 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -111,9 +111,8 @@
   // We have to check whether the receiver has the same isolate group (e.g.
   // native message handlers such as an IOService handler does not but does
   // share the same origin port).
-  const bool same_group =
-      FLAG_enable_isolate_groups && PortMap::IsReceiverInThisIsolateGroup(
-                                        destination_port_id, isolate->group());
+  const bool same_group = PortMap::IsReceiverInThisIsolateGroup(
+      destination_port_id, isolate->group());
   // TODO(turnidge): Throw an exception when the return value is false?
   PortMap::PostMessage(WriteMessage(can_send_any_object, same_group, obj,
                                     destination_port_id,
@@ -639,7 +638,7 @@
     ASSERT(name != nullptr);
 
     auto group = state_->isolate_group();
-    if (!FLAG_enable_isolate_groups || group == nullptr) {
+    if (group == nullptr) {
       RunHeavyweight(name);
     } else {
       RunLightweight(name);
@@ -676,8 +675,7 @@
   }
 
   void RunLightweight(const char* name) {
-    // The create isolate initialize callback is mandatory if
-    // --enable-isolate-groups was passed.
+    // The create isolate initialize callback is mandatory.
     auto initialize_callback = Isolate::InitializeCallback();
     if (initialize_callback == nullptr) {
       FailedSpawn(
@@ -938,22 +936,16 @@
   const auto& func = Function::Handle(zone, GetTopLevelFunction(zone, closure));
   PersistentHandle* closure_tuple_handle = nullptr;
   if (func.IsNull()) {
-    if (!FLAG_enable_isolate_groups) {
-      const String& msg = String::Handle(String::New(
-          "Isolate.spawn expects to be passed a static or top-level function"));
-      Exceptions::ThrowArgumentError(msg);
-    } else {
-      // We have a non-toplevel closure that we might need to copy.
-      // Result will be [<closure-copy>, <objects-in-msg-to-rehash>]
-      const auto& closure_copy_tuple = Object::Handle(
-          zone, CopyMutableObjectGraph(closure));  // Throws if it fails.
-      ASSERT(closure_copy_tuple.IsArray());
-      ASSERT(Object::Handle(zone, Array::Cast(closure_copy_tuple).At(0))
-                 .IsClosure());
-      closure_tuple_handle =
-          isolate->group()->api_state()->AllocatePersistentHandle();
-      closure_tuple_handle->set_ptr(closure_copy_tuple.ptr());
-    }
+    // We have a non-toplevel closure that we might need to copy.
+    // Result will be [<closure-copy>, <objects-in-msg-to-rehash>]
+    const auto& closure_copy_tuple = Object::Handle(
+        zone, CopyMutableObjectGraph(closure));  // Throws if it fails.
+    ASSERT(closure_copy_tuple.IsArray());
+    ASSERT(Object::Handle(zone, Array::Cast(closure_copy_tuple).At(0))
+               .IsClosure());
+    closure_tuple_handle =
+        isolate->group()->api_state()->AllocatePersistentHandle();
+    closure_tuple_handle->set_ptr(closure_copy_tuple.ptr());
   }
 
   bool fatal_errors = fatalErrors.IsNull() ? true : fatalErrors.value();
@@ -964,9 +956,8 @@
   // serializable this will throw an exception.
   SerializedObjectBuffer message_buffer;
   message_buffer.set_message(WriteMessage(
-      /* can_send_any_object */ true,
-      /* same_group */ FLAG_enable_isolate_groups, message, ILLEGAL_PORT,
-      Message::kNormalPriority));
+      /*can_send_any_object=*/true,
+      /*same_group=*/true, message, ILLEGAL_PORT, Message::kNormalPriority));
 
   const char* utf8_package_config =
       packageConfig.IsNull() ? NULL : String2UTF8(packageConfig);
diff --git a/runtime/observatory/tests/service/break_on_function_child_isolate_test.dart b/runtime/observatory/tests/service/break_on_function_child_isolate_test.dart
index 3922aa6..f1ebfd3 100644
--- a/runtime/observatory/tests/service/break_on_function_child_isolate_test.dart
+++ b/runtime/observatory/tests/service/break_on_function_child_isolate_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
 // for 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 --enable-isolate-groups
+// VMOptions=--verbose_debug
 
 import 'break_on_function_many_child_isolates_test.dart';
 
diff --git a/runtime/observatory/tests/service/break_on_function_many_child_isolates_test.dart b/runtime/observatory/tests/service/break_on_function_many_child_isolates_test.dart
index b0e75a8..0b162ae 100644
--- a/runtime/observatory/tests/service/break_on_function_many_child_isolates_test.dart
+++ b/runtime/observatory/tests/service/break_on_function_many_child_isolates_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
 // for 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 --enable-isolate-groups
+// VMOptions=--verbose_debug
 //
 // Tests breakpoint pausing and resuming with many isolates running and pausing
 // simultaneously.
diff --git a/runtime/observatory/tests/service/get_object_rpc_test.dart b/runtime/observatory/tests/service/get_object_rpc_test.dart
index d553138..a1f0582 100644
--- a/runtime/observatory/tests/service/get_object_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_object_rpc_test.dart
@@ -14,8 +14,12 @@
 class _DummyClass {
   static var dummyVar = 11;
   final List<String> dummyList = new List<String>.filled(20, '');
+  static var dummyVarWithInit = foo();
+  late String dummyLateVarWithInit = 'bar';
+  late String dummyLateVar;
   void dummyFunction(int a, [bool b = false]) {}
   void dummyGenericFunction<K, V>(K a, {required V param}) {}
+  static List foo() => List<String>.filled(20, '');
 }
 
 class _DummySubClass extends _DummyClass {}
@@ -982,6 +986,83 @@
     expect(result['_guardLength'], isNotNull);
   },
 
+  // static field initializer
+  (Isolate isolate) async {
+    // Call eval to get a class id.
+    var evalResult = await invoke(isolate, 'getDummyClass');
+    var id = "${evalResult['class']['id']}/field_inits/dummyVarWithInit";
+    var params = {
+      'objectId': id,
+    };
+    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
+    expect(result['type'], equals('Function'));
+    expect(result['id'], equals(id));
+    expect(result['name'], equals('dummyVarWithInit'));
+    expect(result['_kind'], equals('FieldInitializer'));
+    expect(result['static'], equals(true));
+    expect(result['const'], equals(false));
+    expect(result['implicit'], equals(false));
+    expect(result['signature']['typeParameters'], isNull);
+    expect(result['signature']['returnType'], isNotNull);
+    expect(result['signature']['parameters'].length, 0);
+    expect(result['location']['type'], equals('SourceLocation'));
+    expect(result['code']['type'], equals('@Code'));
+    expect(result['_optimizable'], equals(true));
+    expect(result['_inlinable'], equals(false));
+    expect(result['_usageCounter'], isZero);
+    expect(result['_optimizedCallSiteCount'], isZero);
+    expect(result['_deoptimizations'], isZero);
+  },
+
+  // late field initializer
+  (Isolate isolate) async {
+    // Call eval to get a class id.
+    var evalResult = await invoke(isolate, 'getDummyClass');
+    var id = "${evalResult['class']['id']}/field_inits/dummyLateVarWithInit";
+    var params = {
+      'objectId': id,
+    };
+    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
+    expect(result['type'], equals('Function'));
+    expect(result['id'], equals(id));
+    expect(result['name'], equals('dummyLateVarWithInit'));
+    expect(result['_kind'], equals('FieldInitializer'));
+    expect(result['static'], equals(false));
+    expect(result['const'], equals(false));
+    expect(result['implicit'], equals(false));
+    expect(result['signature']['typeParameters'], isNull);
+    expect(result['signature']['returnType'], isNotNull);
+    expect(result['signature']['parameters'].length, 1);
+    expect(result['location']['type'], equals('SourceLocation'));
+    expect(result['code']['type'], equals('@Code'));
+    expect(result['_optimizable'], equals(true));
+    expect(result['_inlinable'], equals(false));
+    expect(result['_usageCounter'], isZero);
+    expect(result['_optimizedCallSiteCount'], isZero);
+    expect(result['_deoptimizations'], isZero);
+  },
+
+  // invalid late field initialize.
+  (Isolate isolate) async {
+    // Call eval to get a class id.
+    var evalResult = await invoke(isolate, 'getDummyClass');
+    var id = "${evalResult['class']['id']}/field_inits/dummyLateVar";
+    var params = {
+      'objectId': id,
+    };
+    bool caughtException = false;
+    try {
+      await isolate.invokeRpcNoUpgrade('getObject', params);
+      expect(false, isTrue, reason: 'Unreachable');
+    } on ServerRpcException catch (e) {
+      caughtException = true;
+      expect(e.code, equals(ServerRpcException.kInvalidParams));
+      expect(
+          e.message, startsWith("getObject: invalid 'objectId' parameter: "));
+    }
+    expect(caughtException, isTrue);
+  },
+
   // field with guards
   (Isolate isolate) async {
     var result = await isolate.vm.invokeRpcNoUpgrade('getFlagList', {});
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index 4ad1d93..59afe6d 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 @@
     final result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], 'Version');
     expect(result['major'], 3);
-    expect(result['minor'], 52);
+    expect(result['minor'], 54);
     expect(result['_privateMajor'], 0);
     expect(result['_privateMinor'], 0);
   },
diff --git a/runtime/observatory/tests/service/object_graph_isolate_group_test.dart b/runtime/observatory/tests/service/object_graph_isolate_group_test.dart
index d325f75..b2580bb 100644
--- a/runtime/observatory/tests/service/object_graph_isolate_group_test.dart
+++ b/runtime/observatory/tests/service/object_graph_isolate_group_test.dart
@@ -2,8 +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.
 
-// VMOptions=--enable_isolate_groups
-
 import 'dart:isolate' as isolate;
 import 'package:observatory/object_graph.dart';
 import 'package:observatory/service_io.dart';
diff --git a/runtime/observatory_2/tests/service_2/break_on_function_child_isolate_test.dart b/runtime/observatory_2/tests/service_2/break_on_function_child_isolate_test.dart
index 3922aa6..f1ebfd3 100644
--- a/runtime/observatory_2/tests/service_2/break_on_function_child_isolate_test.dart
+++ b/runtime/observatory_2/tests/service_2/break_on_function_child_isolate_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
 // for 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 --enable-isolate-groups
+// VMOptions=--verbose_debug
 
 import 'break_on_function_many_child_isolates_test.dart';
 
diff --git a/runtime/observatory_2/tests/service_2/break_on_function_many_child_isolates_test.dart b/runtime/observatory_2/tests/service_2/break_on_function_many_child_isolates_test.dart
index e5b6b56..77eb09d 100644
--- a/runtime/observatory_2/tests/service_2/break_on_function_many_child_isolates_test.dart
+++ b/runtime/observatory_2/tests/service_2/break_on_function_many_child_isolates_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
 // for 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 --enable-isolate-groups
+// VMOptions=--verbose_debug
 //
 // Tests breakpoint pausing and resuming with many isolates running and pausing
 // simultaneously.
diff --git a/runtime/observatory_2/tests/service_2/get_object_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_object_rpc_test.dart
index 44912b3..9c45a9e 100644
--- a/runtime/observatory_2/tests/service_2/get_object_rpc_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_object_rpc_test.dart
@@ -14,8 +14,10 @@
 class _DummyClass {
   static var dummyVar = 11;
   final List<String> dummyList = new List<String>.filled(20, null);
+  static var dummyVarWithInit = foo();
   void dummyFunction(int a, [bool b = false]) {}
   void dummyGenericFunction<K, V>(K a, {V param}) {}
+  static List foo() => List<String>.filled(20, '');
 }
 
 class _DummySubClass extends _DummyClass {}
@@ -1014,6 +1016,34 @@
     expect(result['_guardLength'], equals('20'));
   },
 
+  // static field initializer
+  (Isolate isolate) async {
+    // Call eval to get a class id.
+    var evalResult = await invoke(isolate, 'getDummyClass');
+    var id = "${evalResult['class']['id']}/field_inits/dummyVarWithInit";
+    var params = {
+      'objectId': id,
+    };
+    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
+    expect(result['type'], equals('Function'));
+    expect(result['id'], equals(id));
+    expect(result['name'], equals('dummyVarWithInit'));
+    expect(result['_kind'], equals('FieldInitializer'));
+    expect(result['static'], equals(true));
+    expect(result['const'], equals(false));
+    expect(result['implicit'], equals(false));
+    expect(result['signature']['typeParameters'], isNull);
+    expect(result['signature']['returnType'], isNotNull);
+    expect(result['signature']['parameters'].length, 0);
+    expect(result['location']['type'], equals('SourceLocation'));
+    expect(result['code']['type'], equals('@Code'));
+    expect(result['_optimizable'], equals(true));
+    expect(result['_inlinable'], equals(false));
+    expect(result['_usageCounter'], isZero);
+    expect(result['_optimizedCallSiteCount'], isZero);
+    expect(result['_deoptimizations'], isZero);
+  },
+
   // invalid field.
   (Isolate isolate) async {
     // Call eval to get a class id.
diff --git a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
index 12ffc1c..4daa57a 100644
--- a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
@@ -12,7 +12,7 @@
     final result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], equals('Version'));
     expect(result['major'], equals(3));
-    expect(result['minor'], equals(52));
+    expect(result['minor'], equals(54));
     expect(result['_privateMajor'], equals(0));
     expect(result['_privateMinor'], equals(0));
   },
diff --git a/runtime/observatory_2/tests/service_2/object_graph_isolate_group_test.dart b/runtime/observatory_2/tests/service_2/object_graph_isolate_group_test.dart
index b9ddf82..93bfb77 100644
--- a/runtime/observatory_2/tests/service_2/object_graph_isolate_group_test.dart
+++ b/runtime/observatory_2/tests/service_2/object_graph_isolate_group_test.dart
@@ -2,8 +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.
 
-// VMOptions=--enable_isolate_groups
-
 // @dart = 2.7
 
 import 'dart:isolate' as isolate;
diff --git a/runtime/tests/concurrency/run_stress_test_shards.dart b/runtime/tests/concurrency/run_stress_test_shards.dart
index 5f29e01..bae35d6 100644
--- a/runtime/tests/concurrency/run_stress_test_shards.dart
+++ b/runtime/tests/concurrency/run_stress_test_shards.dart
@@ -146,13 +146,11 @@
   JitTestRunner('out/DebugX64', [
     '--disable-dart-dev',
     '--no-sound-null-safety',
-    '--enable-isolate-groups',
     'runtime/tests/concurrency/generated_stress_test.dart.jit.dill',
   ]),
   JitTestRunner('out/ReleaseX64', [
     '--disable-dart-dev',
     '--no-sound-null-safety',
-    '--enable-isolate-groups',
     '--no-inline-alloc',
     '--use-slow-path',
     '--deoptimize-on-runtime-call-every=3',
@@ -165,7 +163,6 @@
       '-Dshard=$i',
       '-Dshards=$tsanShards',
       '--no-sound-null-safety',
-      '--enable-isolate-groups',
       'runtime/tests/concurrency/generated_stress_test.dart.jit.dill',
     ]),
   AotTestRunner('out/ReleaseX64', [
@@ -173,14 +170,12 @@
     'runtime/tests/concurrency/generated_stress_test.dart.aot.dill',
   ], [
     '--no-sound-null-safety',
-    '--enable-isolate-groups',
   ]),
   AotTestRunner('out/DebugX64', [
     '--no-sound-null-safety',
     'runtime/tests/concurrency/generated_stress_test.dart.aot.dill',
   ], [
     '--no-sound-null-safety',
-    '--enable-isolate-groups',
   ]),
 ];
 
diff --git a/runtime/tests/concurrency/stress_test_list.json b/runtime/tests/concurrency/stress_test_list.json
index f851825..a3073eb 100644
--- a/runtime/tests/concurrency/stress_test_list.json
+++ b/runtime/tests/concurrency/stress_test_list.json
@@ -340,7 +340,6 @@
     "../../../tests/corelib/regexp/backreferences_test.dart",
     "../../../tests/corelib/regexp/bol-with-multiline_test.dart",
     "../../../tests/corelib/regexp/bol_test.dart",
-    "../../../tests/corelib/regexp/capture-3_test.dart",
     "../../../tests/corelib/regexp/capture_test.dart",
     "../../../tests/corelib/regexp/captures_test.dart",
     "../../../tests/corelib/regexp/char-insensitive_test.dart",
@@ -3230,7 +3229,6 @@
     "../../../tests/standalone/double_smi_comparison_test.dart",
     "../../../tests/standalone/double_temp_test.dart",
     "../../../tests/standalone/double_to_int_test.dart",
-    "../../../tests/standalone/fields_may_be_reset_test.dart",
     "../../../tests/standalone/float_array_test.dart",
     "../../../tests/standalone/fragmentation_typed_data_test.dart",
     "../../../tests/standalone/int_array_load_elimination_test.dart",
@@ -3753,7 +3751,6 @@
     "../../../tests/corelib_2/regexp/backreferences_test.dart",
     "../../../tests/corelib_2/regexp/bol-with-multiline_test.dart",
     "../../../tests/corelib_2/regexp/bol_test.dart",
-    "../../../tests/corelib_2/regexp/capture-3_test.dart",
     "../../../tests/corelib_2/regexp/capture_test.dart",
     "../../../tests/corelib_2/regexp/captures_test.dart",
     "../../../tests/corelib_2/regexp/char-insensitive_test.dart",
@@ -6560,7 +6557,6 @@
     "../../../tests/standalone_2/double_smi_comparison_test.dart",
     "../../../tests/standalone_2/double_temp_test.dart",
     "../../../tests/standalone_2/double_to_int_test.dart",
-    "../../../tests/standalone_2/fields_may_be_reset_test.dart",
     "../../../tests/standalone_2/float_array_test.dart",
     "../../../tests/standalone_2/int_array_load_elimination_test.dart",
     "../../../tests/standalone_2/int_array_test.dart",
diff --git a/runtime/tests/vm/dart/aot_prefer_equality_comparison_il_test.dart b/runtime/tests/vm/dart/aot_prefer_equality_comparison_il_test.dart
index 9baf000..8447554 100644
--- a/runtime/tests/vm/dart/aot_prefer_equality_comparison_il_test.dart
+++ b/runtime/tests/vm/dart/aot_prefer_equality_comparison_il_test.dart
@@ -5,14 +5,21 @@
 // Test that we emit EqualityCompare rather than StrictCompare+BoxInt64
 // when comparing non-nullable integer to a Smi.
 
-// MatchIL[AOT]=factorial
-// __ GraphEntry
-// __ FunctionEntry
-// __ CheckStackOverflow
-// __ Branch(EqualityCompare)
+import 'package:vm/testing/il_matchers.dart';
+
 @pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph')
 int factorial(int value) => value == 1 ? value : value * factorial(value - 1);
 
+void matchIL$factorial(FlowGraph graph) {
+  graph.match([
+    match.block('Graph'),
+    match.block('Function', [
+      match.Branch(match.EqualityCompare(match.any, match.any, kind: '==')),
+    ]),
+  ]);
+}
+
 void main() {
   print(factorial(4));
 }
diff --git a/runtime/tests/vm/dart/bare_instructions_trampolines_test.dart b/runtime/tests/vm/dart/bare_instructions_trampolines_test.dart
index b7d734d..12201d2 100644
--- a/runtime/tests/vm/dart/bare_instructions_trampolines_test.dart
+++ b/runtime/tests/vm/dart/bare_instructions_trampolines_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 file.
 
-// VMOptions=--always-generate-trampolines-for-testing --use-bare-instructions
+// VMOptions=--always-generate-trampolines-for-testing
 
 // We use a reasonable sized test and run it with the above options.
 import 'hello_fuchsia_test.dart' as test;
diff --git a/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart b/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart
index 5f18af8..d131340 100644
--- a/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart
+++ b/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_non_symbolic_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 file.
 //
-// VMOptions=--dwarf-stack-traces --save-debugging-info=async_lazy_debug.so --lazy-async-stacks --no-use-bare-instructions
+// VMOptions=--dwarf-stack-traces --save-debugging-info=async_lazy_debug.so --lazy-async-stacks
 
 import 'dart:async';
 import 'dart:io';
diff --git a/runtime/tests/vm/dart/causal_stacks/utils.dart b/runtime/tests/vm/dart/causal_stacks/utils.dart
index c8b3774..077e9bd 100644
--- a/runtime/tests/vm/dart/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart/causal_stacks/utils.dart
@@ -850,7 +850,7 @@
       r'^<asynchronous suspension>$',
       r'^#1      asyncStarThrowAsync \(.*/utils.dart:126(:5)?\)$',
       r'^<asynchronous suspension>$',
-      r'^#2      listenAsyncStarThrowAsync.<anonymous closure> \(.+/utils.dart(:0)?\)$',
+      r'^#2      listenAsyncStarThrowAsync.<anonymous closure> \(.+/utils.dart:132(:56)?\)$',
       r'^<asynchronous suspension>$',
     ];
     await doTestAwait(
diff --git a/runtime/tests/vm/dart/deferred_isolate_test.dart b/runtime/tests/vm/dart/deferred_isolate_test.dart
index 94be755..7afc208 100644
--- a/runtime/tests/vm/dart/deferred_isolate_test.dart
+++ b/runtime/tests/vm/dart/deferred_isolate_test.dart
@@ -4,8 +4,6 @@
 
 // Verify deferred library status is per-isolate, not per-isolate-group.
 
-// VMOptions=--enable-isolate-groups
-
 import 'dart:async';
 import 'dart:isolate';
 import 'package:expect/expect.dart';
diff --git a/runtime/tests/vm/dart/deferred_loading_call_modes_test.dart b/runtime/tests/vm/dart/deferred_loading_call_modes_test.dart
index 8fa1e45..954a3d9 100644
--- a/runtime/tests/vm/dart/deferred_loading_call_modes_test.dart
+++ b/runtime/tests/vm/dart/deferred_loading_call_modes_test.dart
@@ -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.
 
-// VMOptions=--use_bare_instructions=false
-// VMOptions=--use_bare_instructions=true --use_table_dispatch=false
-// VMOptions=--use_bare_instructions=true --use_table_dispatch=true
+// VMOptions=--use_table_dispatch=false
+// VMOptions=--use_table_dispatch=true
 
 import "splay_test.dart" deferred as splay; // Some non-trivial code.
 
diff --git a/runtime/tests/vm/dart/flutter_regress_91370_il_test.dart b/runtime/tests/vm/dart/flutter_regress_91370_il_test.dart
new file mode 100644
index 0000000..afa6bcf
--- /dev/null
+++ b/runtime/tests/vm/dart/flutter_regress_91370_il_test.dart
@@ -0,0 +1,730 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:vm/testing/il_matchers.dart';
+
+bool shouldPrint = false;
+
+@pragma('vm:never-inline')
+void blackhole(Object v) {
+  if (shouldPrint) {
+    print(v);
+  }
+}
+
+class A {}
+
+class A0 extends A {
+  final double x;
+  final String str;
+
+  A0(this.x, this.str);
+
+  // Use [x] to prevent the field from being shaken out. We would like
+  // [x] to occupy the same location that [A1.str] takes so that
+  // type confusion / incorrect LICM would cause a crash when we load
+  // `o.[A1.str].length` on an object of type [A0]
+  String toString() => 'A0($x)';
+}
+
+class A1 extends A {
+  final String str;
+
+  A1(this.str);
+}
+
+class H<T> {
+  final T data;
+  H(this.data);
+}
+
+abstract class B<T extends A> {
+  final T v;
+
+  B(this.v);
+
+  int load(H<T> h);
+  int loadWithNamedParam({required H<T> h});
+
+  @pragma('vm:never-inline')
+  @pragma('vm:testing:print-flow-graph', '*LICM')
+  int testNarrowingThroughThisCallWithPositionalParam(H<T> h) {
+    var result = 0;
+    for (var i = 0; i < 10; i++) {
+      // We will perform polymorphic inlining of `load` because `this`
+      // is known to be either B0 or B1. In both cases we will have
+      // v.str.length loads fully inlined because inlined bodies
+      // have precise type information for v.
+      // Then we will hoist v.str.length out of the loop past
+      // class-id comparisons generated by the inlining leading
+      // to incorrect code which will crash.
+      result += load(h);
+    }
+    return result;
+  }
+
+  @pragma('vm:never-inline')
+  @pragma('vm:testing:print-flow-graph', '*LICM')
+  int testNarrowingThroughThisCallWithNamedParams(H<T> h) {
+    var result = 0;
+    for (var i = 0; i < 10; i++) {
+      // We will perform polymorphic inlining of `load` because `this`
+      // is known to be either B0 or B1. In both cases we will have
+      // v.str.length loads fully inlined because inlined bodies
+      // have precise type information for v.
+      // Then we will hoist v.str.length out of the loop past
+      // class-id comparisons generated by the inlining leading
+      // to incorrect code which will crash.
+      result += loadWithNamedParam(h: h);
+    }
+    return result;
+  }
+}
+
+class BImpl<T extends A> extends B<T> {
+  BImpl(T v) : super(v);
+
+  // These methods do not matter. They can just return 0.
+  int load(H<T> h) => 0;
+  int loadWithNamedParam({required H<T> h}) => 0;
+}
+
+class B0 extends B<A0> {
+  B0(A0 a) : super(a);
+
+  int load(H<A0> h) {
+    return h.data.str.length;
+  }
+
+  int loadWithNamedParam({String? a, required H<A0> h, String? z}) {
+    return h.data.str.length;
+  }
+}
+
+class B1 extends B<A1> {
+  B1(A1 a) : super(a);
+
+  int load(H<A1> h) {
+    return h.data.str.length;
+  }
+
+  int loadWithNamedParam({String? a, required H<A1> h, String? z}) {
+    return h.data.str.length;
+  }
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIsCheckOnSubclass(B b) {
+  int sum = 0;
+  b.v.toString();
+  for (var i = 0; i < 2; i++) {
+    if (b is B1) {
+      sum += b.v.str.length;
+    }
+  }
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIsCheckWithTypeArgPolymorphic(B b) {
+  int sum = 0;
+  final v = b.v;
+  for (var i = 0; i < 2; i++) {
+    if (b is B<A1>) {
+      sum += b.v.str.length;
+    }
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIsCheckWithTypeArgMonomorphic(B b) {
+  int sum = 0;
+  final v = b.v;
+  for (var i = 0; i < 2; i++) {
+    if (b is B<A1>) {
+      sum += b.v.str.length;
+    }
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughAsCheckWithTypeArgPolymorphic(B b) {
+  int sum = 0;
+  final v = b.v;
+  for (var i = 0; i < 2; i++) {
+    // Branch with a side-effect to avoid b as B<A1> hoisting.
+    if (sum == 42) throw '42';
+    sum += (b as B<A1>).v.str.length;
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughPhiOfAsChecksWithTypeArgPolymorphic(B b) {
+  int sum = 0;
+  final v = b.v;
+  for (var i = 0; i < 2; i++) {
+    // Branch with a side-effect to avoid b as B<A1> hoisting.
+    if (sum == 42) throw '42';
+    sum += (sum == 22 ? b as B<A1> : b as B<A1>).v.str.length;
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIndexedLoadFromGrowableArray(List<A> l) {
+  int sum = 0;
+  final v = l[0];
+  for (var i = 0; i < 2; i++) {
+    if (l is List<A1>) {
+      sum += l[0].str.length;
+    }
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIndexedLoadFromFixedArray(List<A> l) {
+  int sum = 0;
+  final v = l[0];
+  for (var i = 0; i < 2; i++) {
+    if (l is List<A1>) {
+      sum += l[0].str.length;
+    }
+  }
+  blackhole(v);
+  return sum;
+}
+
+void main(List<String> args) {
+  shouldPrint = args.contains("shouldPrint");
+
+  // Prevent shaking of BImpl.load and BImpl.loadWithNamed, if these methods
+  // are shaked (because they are not used) that would inhibit polymorphic
+  // inlining at testNarrowingThroughThisCall{,WithNamedParams}
+  BImpl(A1("")).load(H(A1("")));
+  BImpl(A1("")).loadWithNamedParam(h: H(A1("")));
+
+  for (var i = 0; i < 2; i++) {
+    final a1 = A1("$i");
+    final a0 = A0(i.toDouble(), "$i");
+    B1(a1).testNarrowingThroughThisCallWithPositionalParam(H(a1));
+    B0(a0).testNarrowingThroughThisCallWithPositionalParam(H(a0));
+    B1(a1).testNarrowingThroughThisCallWithNamedParams(H(a1));
+    B0(a0).testNarrowingThroughThisCallWithNamedParams(H(a0));
+    testNarrowingThroughIsCheckOnSubclass(B1(a1));
+    testNarrowingThroughIsCheckOnSubclass(B0(a0));
+    testNarrowingThroughIsCheckWithTypeArgPolymorphic(B1(a1));
+    testNarrowingThroughIsCheckWithTypeArgPolymorphic(B0(a0));
+    testNarrowingThroughIsCheckWithTypeArgMonomorphic(BImpl<A1>(a1));
+    testNarrowingThroughIsCheckWithTypeArgMonomorphic(BImpl<A0>(a0));
+    testNarrowingThroughAsCheckWithTypeArgPolymorphic(B1(a1));
+    try {
+      testNarrowingThroughAsCheckWithTypeArgPolymorphic(B0(a0));
+      throw "Should be unreachable";
+    } on TypeError catch (e) {}
+    testNarrowingThroughPhiOfAsChecksWithTypeArgPolymorphic(B1(a1));
+    try {
+      testNarrowingThroughPhiOfAsChecksWithTypeArgPolymorphic(B0(a0));
+      throw "Should be unreachable";
+    } on TypeError catch (e) {}
+    testNarrowingThroughIndexedLoadFromGrowableArray([a1]);
+    testNarrowingThroughIndexedLoadFromGrowableArray([a0]);
+    testNarrowingThroughIndexedLoadFromFixedArray(
+        List<A1>.filled(1, a1, growable: false));
+    testNarrowingThroughIndexedLoadFromFixedArray(
+        List<A0>.filled(1, a0, growable: false));
+  }
+}
+
+void matchIL$testNarrowingThroughThisCallWithPositionalParam(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'h_raw' << match.Parameter(index: 1),
+      'h' << match.AssertAssignable('h_raw', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_cid' << match.LoadClassId('this'),
+          match.Branch(match.StrictCompare('this_cid', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('this'),
+          // This redefinition was inserted by inlining.
+          'h_' << match.Redefinition('h'),
+          'v0' << match.LoadField('h_', slot: 'data'),
+          'v1' << match.LoadField('v0', slot: 'str'),
+          'v2' << match.LoadField('v1', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'h_raw' << match.Parameter(index: 1),
+      'h' << match.AssertAssignable('h_raw', match.any),
+      'this_cid' << match.LoadClassId('this'), // Hoisted.
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.StrictCompare('this_cid', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          // After LICM redefinitions are removed.
+          'v0' << match.LoadField('h', slot: 'data'),
+          'v1' << match.LoadField('v0', slot: 'str'),
+          'v2' << match.LoadField('v1', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughThisCallWithNamedParams(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  // Graph shape is basically the same.
+  matchIL$testNarrowingThroughThisCallWithPositionalParam(
+      beforeLICM, afterLICM);
+}
+
+void matchIL$testNarrowingThroughIsCheckOnSubclass(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'b_cid' << match.LoadClassId('b'),
+          match.Branch(match.StrictCompare('b_cid', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('b'),
+          // This redefinition was inserted by load forwarding.
+          'b.v*' << match.Redefinition('b.v'),
+          'v0' << match.LoadField('b.v*', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      'b_cid' << match.LoadClassId('b'), // Hoisted.
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.StrictCompare('b_cid', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          'v0' << match.LoadField('b.v', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughIsCheckWithTypeArgMonomorphic(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'b_is_B<A1>' << match.InstanceOf('b', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('b_is_B<A1>', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('b'),
+          // This redefinition was inserted by load forwarding.
+          'b.v*' << match.Redefinition('b.v'),
+          'v0' << match.LoadField('b.v*', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'b_is_B<A1>' << match.InstanceOf('b', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('b_is_B<A1>', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          'v0' << match.LoadField('b.v', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughAsCheckWithTypeArgPolymorphic(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B3', ifFalse: 'B4'),
+        ]),
+    'B3' << match.block('Target', [match.Throw(match.any)]),
+    'B4' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          // This redefinition was inserted by load forwarding.
+          'b.v*' << match.Redefinition('b.v'),
+          'v0' << match.LoadField('b.v*', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B3', ifFalse: 'B4'),
+        ]),
+    'B3' << match.block('Target', [match.Throw(match.any)]),
+    'B4' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          'v0' << match.LoadField('b.v', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughPhiOfAsChecksWithTypeArgPolymorphic(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B3', ifFalse: 'B4'),
+        ]),
+    'B3' << match.block('Target', [match.Throw(match.any)]),
+    'B4' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B5', ifFalse: 'B6'),
+        ]),
+    'B5' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          match.Goto('B7'),
+        ]),
+    'B6' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          match.Goto('B7'),
+        ]),
+    'B7' <<
+        match.block('Join', [
+          // This redefinition was inserted by PhiInstr::Canonicalize
+          // which removed Phi of two AssertAssignables above.
+          match.Redefinition('b'),
+          // This redefinition was inserted by load forwarding.
+          'b.v*' << match.Redefinition('b.v'),
+          'v0' << match.LoadField('b.v*', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B3', ifFalse: 'B4'),
+        ]),
+    'B3' << match.block('Target', [match.Throw(match.any)]),
+    'B4' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B5', ifFalse: 'B6'),
+        ]),
+    'B5' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          match.Goto('B7'),
+        ]),
+    'B6' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          match.Goto('B7'),
+        ]),
+    'B7' <<
+        match.block('Join', [
+          'v0' << match.LoadField('b.v', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughIndexedLoadFromGrowableArray(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'a.data' << match.LoadField('this', slot: 'GrowableObjectArray.data'),
+      'a.data[0]' << match.LoadIndexed('a.data', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_is_List' << match.InstanceOf('this', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('this_is_List', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('this'),
+          // This redefinition was inserted by load forwarding.
+          'a.data[0]*' << match.Redefinition('a.data[0]'),
+          if (!beforeLICM.soundNullSafety)
+            'a.data[0]*!' << match.CheckNull('a.data[0]*'),
+          'a.data[0].str' <<
+              match.LoadField(
+                  beforeLICM.soundNullSafety ? 'a.data[0]*' : 'a.data[0]*!',
+                  slot: 'str'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'a.data' << match.LoadField('this', slot: 'GrowableObjectArray.data'),
+      'a.data[0]' << match.LoadIndexed('a.data', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_is_List' << match.InstanceOf('this', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('this_is_List', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          if (!beforeLICM.soundNullSafety)
+            'a.data[0]!' << match.CheckNull('a.data[0]'),
+          'a.data[0].str' <<
+              match.LoadField(
+                  beforeLICM.soundNullSafety ? 'a.data[0]' : 'a.data[0]!',
+                  slot: 'str'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughIsCheckWithTypeArgPolymorphic(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  matchIL$testNarrowingThroughIsCheckWithTypeArgMonomorphic(
+      beforeLICM, afterLICM);
+}
+
+void matchIL$testNarrowingThroughIndexedLoadFromFixedArray(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'a[0]' << match.LoadIndexed('this', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_is_List' << match.InstanceOf('this', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('this_is_List', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('this'),
+          // This redefinition was inserted by load forwarding.
+          'a[0]*' << match.Redefinition('a[0]'),
+          if (!beforeLICM.soundNullSafety) 'a[0]*!' << match.CheckNull('a[0]*'),
+          'a[0].str' <<
+              match.LoadField(beforeLICM.soundNullSafety ? 'a[0]*' : 'a[0]*!',
+                  slot: 'str'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'a[0]' << match.LoadIndexed('this', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_is_List' << match.InstanceOf('this', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('this_is_List', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          if (!beforeLICM.soundNullSafety) 'a[0]!' << match.CheckNull('a[0]'),
+          'a[0].str' <<
+              match.LoadField(beforeLICM.soundNullSafety ? 'a[0]' : 'a[0]!',
+                  slot: 'str'),
+        ]),
+  ], env: env);
+}
diff --git a/runtime/tests/vm/dart/isolates/closure_entrypoint_test.dart b/runtime/tests/vm/dart/isolates/closure_entrypoint_test.dart
index b855c4f..7b8450e 100644
--- a/runtime/tests/vm/dart/isolates/closure_entrypoint_test.dart
+++ b/runtime/tests/vm/dart/isolates/closure_entrypoint_test.dart
@@ -2,10 +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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
+// VMOptions=--no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
+// VMOptions=--enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
 
 // The tests in this file will only succeed when isolate groups are enabled
 // (hence the VMOptions above).
diff --git a/runtime/tests/vm/dart/isolates/closures_without_captured_variables_test.dart b/runtime/tests/vm/dart/isolates/closures_without_captured_variables_test.dart
index d7970cc..386d73e 100644
--- a/runtime/tests/vm/dart/isolates/closures_without_captured_variables_test.dart
+++ b/runtime/tests/vm/dart/isolates/closures_without_captured_variables_test.dart
@@ -2,8 +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.
 
-// VMOptions=--enable-isolate-groups
-
 // The tests in this file will only succeed when isolate groups are enabled
 // (hence the VMOptions above).
 
diff --git a/runtime/tests/vm/dart/isolates/dart_api_create_lightweight_isolate_test.dart b/runtime/tests/vm/dart/isolates/dart_api_create_lightweight_isolate_test.dart
index f4005be..d4734b8 100644
--- a/runtime/tests/vm/dart/isolates/dart_api_create_lightweight_isolate_test.dart
+++ b/runtime/tests/vm/dart/isolates/dart_api_create_lightweight_isolate_test.dart
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // SharedObjects=ffi_test_functions
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:async';
 import 'dart:ffi';
@@ -17,8 +16,6 @@
 import 'test_utils.dart' show isArtificialReloadMode;
 import '../../../../../tests/ffi/dylib_utils.dart';
 
-final bool isolateGroupsEnabled =
-    Platform.executableArguments.contains('--enable-isolate-groups');
 final bool usesDwarfStackTraces = Platform.executableArguments
     .any((entry) => RegExp('--dwarf[-_]stack[-_]traces').hasMatch(entry));
 final bool hasSymbolicStackTraces = !usesDwarfStackTraces;
@@ -223,25 +220,7 @@
   await testFatalError();
 }
 
-Future testNotSupported() async {
-  dynamic exception;
-  try {
-    FfiBindings.createLightweightIsolate('debug-name', Pointer.fromAddress(0));
-  } catch (e) {
-    exception = e;
-  }
-  Expect.contains(
-      'Lightweight isolates need to be explicitly enabled by passing '
-      '--enable-isolate-groups.',
-      exception.toString());
-}
-
 Future main(args) async {
-  if (!isolateGroupsEnabled) {
-    await testNotSupported();
-    return;
-  }
-
   // This test should not run in hot-reload because of the way it is written
   // (embedder related code written in Dart instead of C)
   if (isArtificialReloadMode) return;
diff --git a/runtime/tests/vm/dart/isolates/fast_object_copy2_test.dart b/runtime/tests/vm/dart/isolates/fast_object_copy2_test.dart
index 3977179..4a2a72f 100644
--- a/runtime/tests/vm/dart/isolates/fast_object_copy2_test.dart
+++ b/runtime/tests/vm/dart/isolates/fast_object_copy2_test.dart
@@ -2,10 +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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
+// VMOptions=--no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
+// VMOptions=--enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
 
 // The tests in this file will only succeed when isolate groups are enabled
 // (hence the VMOptions above).
diff --git a/runtime/tests/vm/dart/isolates/fast_object_copy_test.dart b/runtime/tests/vm/dart/isolates/fast_object_copy_test.dart
index 169a1b9..955e13d 100644
--- a/runtime/tests/vm/dart/isolates/fast_object_copy_test.dart
+++ b/runtime/tests/vm/dart/isolates/fast_object_copy_test.dart
@@ -2,11 +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.
 
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation --verify-store-buffer
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation --verify-store-buffer
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
+// VMOptions=--no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation --verify-store-buffer
+// VMOptions=--enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation --verify-store-buffer
 
 // The tests in this file are particularly for an implementation that tries to
 // allocate the entire graph in BFS order using a fast new space allocation
diff --git a/runtime/tests/vm/dart/isolates/fibonacci_call_test.dart b/runtime/tests/vm/dart/isolates/fibonacci_call_test.dart
index daf66e0..04e8684 100644
--- a/runtime/tests/vm/dart/isolates/fibonacci_call_test.dart
+++ b/runtime/tests/vm/dart/isolates/fibonacci_call_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 file.
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:isolate';
 
diff --git a/runtime/tests/vm/dart/isolates/limited_active_mutator_test.dart b/runtime/tests/vm/dart/isolates/limited_active_mutator_test.dart
index f56e9ee..1fc5a31 100644
--- a/runtime/tests/vm/dart/isolates/limited_active_mutator_test.dart
+++ b/runtime/tests/vm/dart/isolates/limited_active_mutator_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 file.
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification --disable-thread-pool-limit
+// VMOptions=--disable-heap-verification --disable-thread-pool-limit
 
 import 'dart:async';
 import 'dart:math' as math;
diff --git a/runtime/tests/vm/dart/isolates/regress_46539_test.dart b/runtime/tests/vm/dart/isolates/regress_46539_test.dart
index 0814f0d..148280d 100644
--- a/runtime/tests/vm/dart/isolates/regress_46539_test.dart
+++ b/runtime/tests/vm/dart/isolates/regress_46539_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 file.
 
-// VMOptions=--optimization-filter=foo --enable-isolate-groups --no-use-osr --optimization-counter-threshold=1 --deterministic
+// VMOptions=--optimization-filter=foo --no-use-osr --optimization-counter-threshold=1 --deterministic
 
 // Important: This is a regression test for a concurrency issue, if this test
 // is flaky it is essentially failing!
diff --git a/runtime/tests/vm/dart/isolates/ring_gc_sendAndExit_test.dart b/runtime/tests/vm/dart/isolates/ring_gc_sendAndExit_test.dart
index a50d9e8..0f9c559 100644
--- a/runtime/tests/vm/dart/isolates/ring_gc_sendAndExit_test.dart
+++ b/runtime/tests/vm/dart/isolates/ring_gc_sendAndExit_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 file.
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:math' as math;
 
diff --git a/runtime/tests/vm/dart/isolates/ring_gc_test.dart b/runtime/tests/vm/dart/isolates/ring_gc_test.dart
index c27cd6c..ff74f7d 100644
--- a/runtime/tests/vm/dart/isolates/ring_gc_test.dart
+++ b/runtime/tests/vm/dart/isolates/ring_gc_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 file.
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:async';
 import 'dart:math' as math;
diff --git a/runtime/tests/vm/dart/isolates/spawn_function_test.dart b/runtime/tests/vm/dart/isolates/spawn_function_test.dart
index f2a85ea..d1f4b7b 100644
--- a/runtime/tests/vm/dart/isolates/spawn_function_test.dart
+++ b/runtime/tests/vm/dart/isolates/spawn_function_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import 'dart:async';
 
diff --git a/runtime/tests/vm/dart/isolates/sum_recursive_call_test.dart b/runtime/tests/vm/dart/isolates/sum_recursive_call_test.dart
index 89bcc58..81beb3d 100644
--- a/runtime/tests/vm/dart/isolates/sum_recursive_call_test.dart
+++ b/runtime/tests/vm/dart/isolates/sum_recursive_call_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 file.
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:isolate';
 
diff --git a/runtime/tests/vm/dart/isolates/sum_recursive_tail_call_test.dart b/runtime/tests/vm/dart/isolates/sum_recursive_tail_call_test.dart
index 866b8f3..9148bcd 100644
--- a/runtime/tests/vm/dart/isolates/sum_recursive_tail_call_test.dart
+++ b/runtime/tests/vm/dart/isolates/sum_recursive_tail_call_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 file.
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:isolate';
 
diff --git a/runtime/tests/vm/dart/isolates/thread_pool_test.dart b/runtime/tests/vm/dart/isolates/thread_pool_test.dart
index 3d689ca..d12e272 100644
--- a/runtime/tests/vm/dart/isolates/thread_pool_test.dart
+++ b/runtime/tests/vm/dart/isolates/thread_pool_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // SharedObjects=ffi_test_functions
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:async';
 import 'dart:ffi';
diff --git a/runtime/tests/vm/dart/issue_31959_31960_test.dart b/runtime/tests/vm/dart/issue_31959_31960_test.dart
index 3ca1be2..6a3a3e5 100644
--- a/runtime/tests/vm/dart/issue_31959_31960_test.dart
+++ b/runtime/tests/vm/dart/issue_31959_31960_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:isolate';
 import 'dart:math';
diff --git a/runtime/tests/vm/dart/regress_46878_test.dart b/runtime/tests/vm/dart/regress_46878_test.dart
index 6ef37bc..ad59a65 100644
--- a/runtime/tests/vm/dart/regress_46878_test.dart
+++ b/runtime/tests/vm/dart/regress_46878_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 
 import 'package:expect/expect.dart';
diff --git a/runtime/tests/vm/dart/regress_47468_test.dart b/runtime/tests/vm/dart/regress_47468_test.dart
deleted file mode 100644
index 1ff1bbe..0000000
--- a/runtime/tests/vm/dart/regress_47468_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
-// for 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 https://github.com/dart-lang/sdk/issues/47468.
-// Verifies that the sending empty non-const maps works
-
-// VMOptions=--no-enable-isolate-groups
-
-import 'dart:isolate';
-
-void main() async {
-  final nonConstMap = <int, Object>{};
-  final receivePort = ReceivePort();
-  final sendPort = receivePort.sendPort;
-  sendPort.send(nonConstMap);
-  await receivePort.first;
-}
diff --git a/runtime/tests/vm/dart/regress_47704_test.dart b/runtime/tests/vm/dart/regress_47704_test.dart
new file mode 100644
index 0000000..fca9648
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_47704_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 https://github.com/dart-lang/sdk/issues/47704.
+// Verifies that compiler doesn't crash with compressed pointers when
+// generating code involving as 32-bit Smi constant which is not
+// sign-extended to 64 bits.
+
+// VMOptions=--deterministic --optimization_counter_threshold=80
+
+import 'dart:typed_data';
+import "package:expect/expect.dart";
+
+const int minLevel = -1;
+
+void foo() {
+  // Make sure this method is compiled.
+  for (int i = 0; i < 100; i++) {}
+
+  bool ok = false;
+  try {
+    for (int loc0 in ((Uint16List(40)).sublist(minLevel, 42))) {
+      print(loc0);
+    }
+  } catch (e) {
+    ok = true;
+  }
+  Expect.isTrue(ok);
+}
+
+void main() {
+  foo();
+  foo();
+}
diff --git a/runtime/tests/vm/dart/sendandexit_test.dart b/runtime/tests/vm/dart/sendandexit_test.dart
index a48ec13..90c4e8a 100644
--- a/runtime/tests/vm/dart/sendandexit_test.dart
+++ b/runtime/tests/vm/dart/sendandexit_test.dart
@@ -2,8 +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.
 //
-// VMOptions=--enable-isolate-groups
-//
 // Validates functionality of Isolate.exit().
 
 import 'dart:async';
diff --git a/runtime/tests/vm/dart/spawn_infinite_loop_test.dart b/runtime/tests/vm/dart/spawn_infinite_loop_test.dart
index 3a89e80..cc0fb42 100644
--- a/runtime/tests/vm/dart/spawn_infinite_loop_test.dart
+++ b/runtime/tests/vm/dart/spawn_infinite_loop_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 
 // This test ensures that the VM can kill the spawned isolate during VM
diff --git a/runtime/tests/vm/dart/spawn_shutdown_test.dart b/runtime/tests/vm/dart/spawn_shutdown_test.dart
index d47db32..d1e96925 100644
--- a/runtime/tests/vm/dart/spawn_shutdown_test.dart
+++ b/runtime/tests/vm/dart/spawn_shutdown_test.dart
@@ -2,8 +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.
 
-// VMOptions=--enable-asserts --enable-isolate-groups
-// VMOptions=--enable-asserts --no-enable-isolate-groups
+// VMOptions=--enable-asserts
 
 import 'dart:io';
 import 'dart:isolate';
diff --git a/runtime/tests/vm/dart/split_literals_test.dart b/runtime/tests/vm/dart/split_literals_test.dart
index 076e27a..a5391b1 100644
--- a/runtime/tests/vm/dart/split_literals_test.dart
+++ b/runtime/tests/vm/dart/split_literals_test.dart
@@ -65,8 +65,6 @@
 
     // Compile kernel to ELF.
     await run(genSnapshot, <String>[
-      "--use_bare_instructions=false", //# object: ok
-      "--use_bare_instructions=true", //# bare: ok
       "--snapshot-kind=app-aot-elf",
       "--elf=$snapshot",
       "--loading-unit-manifest=$manifest",
diff --git a/runtime/tests/vm/dart/transferable_test.dart b/runtime/tests/vm/dart/transferable_test.dart
index 2f5155a..9d76575 100644
--- a/runtime/tests/vm/dart/transferable_test.dart
+++ b/runtime/tests/vm/dart/transferable_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test that validates that transferables are faster than regular typed data.
 
 import 'dart:async';
diff --git a/runtime/tests/vm/dart/transferable_throws_test.dart b/runtime/tests/vm/dart/transferable_throws_test.dart
index 201c020..1c3aadf 100644
--- a/runtime/tests/vm/dart/transferable_throws_test.dart
+++ b/runtime/tests/vm/dart/transferable_throws_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test that ensures correct exceptions are thrown when misusing
 // [TransferableTypedData].
 
diff --git a/runtime/tests/vm/dart/use_bare_instructions_flag_test.dart b/runtime/tests/vm/dart/use_bare_instructions_flag_test.dart
deleted file mode 100644
index eead3b6..0000000
--- a/runtime/tests/vm/dart/use_bare_instructions_flag_test.dart
+++ /dev/null
@@ -1,103 +0,0 @@
-// 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 is ensuring that the flag for --use-bare-instructions given at
-// AOT compile-time will be used at runtime (irrespective if other values were
-// passed to the runtime).
-
-import "dart:async";
-import "dart:io";
-
-import 'package:expect/expect.dart';
-import 'package:path/path.dart' as path;
-
-import 'use_flag_test_helper.dart';
-
-main(List<String> args) async {
-  if (!isAOTRuntime) {
-    return; // Running in JIT: AOT binaries not available.
-  }
-
-  if (Platform.isAndroid) {
-    return; // SDK tree and dart_bootstrap not available on the test device.
-  }
-
-  await withTempDir('bare-flag-test', (String tempDir) async {
-    final script = path.join(sdkDir, 'pkg/kernel/bin/dump.dart');
-    final scriptDill = path.join(tempDir, 'kernel_dump.dill');
-
-    // Compile script to Kernel IR.
-    await run(genKernel, <String>[
-      '--aot',
-      '--platform=$platformDill',
-      '-o',
-      scriptDill,
-      script,
-    ]);
-
-    // Run the AOT compiler with/without bare instructions.
-    final scriptBareSnapshot = path.join(tempDir, 'bare.snapshot');
-    final scriptNonBareSnapshot = path.join(tempDir, 'non_bare.snapshot');
-    await Future.wait(<Future>[
-      run(genSnapshot, <String>[
-        '--use-bare-instructions',
-        '--snapshot-kind=app-aot-elf',
-        '--elf=$scriptBareSnapshot',
-        scriptDill,
-      ]),
-      run(genSnapshot, <String>[
-        '--no-use-bare-instructions',
-        '--snapshot-kind=app-aot-elf',
-        '--elf=$scriptNonBareSnapshot',
-        scriptDill,
-      ]),
-    ]);
-
-    // Run the resulting bare-AOT compiled script.
-    final bareOut1 = path.join(tempDir, 'bare-out1.txt');
-    final bareOut2 = path.join(tempDir, 'bare-out2.txt');
-    await Future.wait(<Future>[
-      run(aotRuntime, <String>[
-        '--use-bare-instructions',
-        scriptBareSnapshot,
-        scriptDill,
-        bareOut1,
-      ]),
-      run(aotRuntime, <String>[
-        '--no-use-bare-instructions',
-        scriptBareSnapshot,
-        scriptDill,
-        bareOut2,
-      ]),
-    ]);
-
-    // Run the resulting non-bare-AOT compiled script.
-    final nonBareOut1 = path.join(tempDir, 'non-bare-out1.txt');
-    final nonBareOut2 = path.join(tempDir, 'non-bare-out2.txt');
-    await Future.wait(<Future>[
-      run(aotRuntime, <String>[
-        '--use-bare-instructions',
-        scriptNonBareSnapshot,
-        scriptDill,
-        nonBareOut1,
-      ]),
-      run(aotRuntime, <String>[
-        '--no-use-bare-instructions',
-        scriptNonBareSnapshot,
-        scriptDill,
-        nonBareOut2,
-      ]),
-    ]);
-
-    // Ensure we got 4 times the same result.
-    final output = await readFile(bareOut1);
-    Expect.equals(output, await readFile(bareOut2));
-    Expect.equals(output, await readFile(nonBareOut1));
-    Expect.equals(output, await readFile(nonBareOut2));
-  });
-}
-
-Future<String> readFile(String file) {
-  return new File(file).readAsString();
-}
diff --git a/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart b/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart
index 526c449..26cc7c7 100644
--- a/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart
+++ b/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart
@@ -107,7 +107,6 @@
 
 Future<void> testAOT(String dillPath,
     {bool useAsm = false,
-    bool useBare = true,
     bool forceDrops = false,
     bool useDispatch = true,
     bool stripUtil = false, // Note: forced true if useAsm.
@@ -127,9 +126,6 @@
   }
 
   final descriptionBuilder = StringBuffer()..write(useAsm ? 'assembly' : 'elf');
-  if (!useBare) {
-    descriptionBuilder.write('-nonbare');
-  }
   if (forceDrops) {
     descriptionBuilder.write('-dropped');
   }
@@ -156,7 +152,6 @@
     final snapshotPath = path.join(tempDir, 'test.snap');
     final commonSnapshotArgs = [
       if (stripFlag) '--strip', //  gen_snapshot specific and not a VM flag.
-      useBare ? '--use-bare-instructions' : '--no-use-bare-instructions',
       "--write-v8-snapshot-profile-to=$profilePath",
       if (forceDrops) ...[
         '--dwarf-stack-traces',
@@ -438,24 +433,11 @@
 
     // Test unstripped ELF generation directly.
     await testAOT(aotDillPath);
-    await testAOT(aotDillPath, useBare: false);
     await testAOT(aotDillPath, forceDrops: true);
-    await testAOT(aotDillPath, forceDrops: true, useBare: false);
     await testAOT(aotDillPath, forceDrops: true, useDispatch: false);
-    await testAOT(aotDillPath,
-        forceDrops: true, useDispatch: false, useBare: false);
 
     // Test flag-stripped ELF generation.
     await testAOT(aotDillPath, stripFlag: true);
-    await testAOT(aotDillPath, useBare: false, stripFlag: true);
-
-    // Since we can't force disassembler support after the fact when running
-    // in PRODUCT mode, skip any --disassemble tests. Do these tests last as
-    // they have lots of output and so the log will be truncated.
-    if (!const bool.fromEnvironment('dart.vm.product')) {
-      // Regression test for dartbug.com/41149.
-      await testAOT(aotDillPath, useBare: false, disassemble: true);
-    }
 
     // We neither generate assembly nor have a stripping utility on Windows.
     if (Platform.isWindows) {
@@ -469,7 +451,6 @@
     } else {
       // Test unstripped ELF generation that is then externally stripped.
       await testAOT(aotDillPath, stripUtil: true);
-      await testAOT(aotDillPath, stripUtil: true, useBare: false);
     }
 
     // TODO(sstrickl): Currently we can't assemble for SIMARM64 on MacOSX.
@@ -482,9 +463,7 @@
     }
     // Test unstripped assembly generation that is then externally stripped.
     await testAOT(aotDillPath, useAsm: true);
-    await testAOT(aotDillPath, useAsm: true, useBare: false);
     // Test stripped assembly generation that is then externally stripped.
     await testAOT(aotDillPath, useAsm: true, stripFlag: true);
-    await testAOT(aotDillPath, useAsm: true, stripFlag: true, useBare: false);
   });
 }
diff --git a/runtime/tests/vm/dart_2/aot_prefer_equality_comparison_il_test.dart b/runtime/tests/vm/dart_2/aot_prefer_equality_comparison_il_test.dart
index 9baf000..8447554 100644
--- a/runtime/tests/vm/dart_2/aot_prefer_equality_comparison_il_test.dart
+++ b/runtime/tests/vm/dart_2/aot_prefer_equality_comparison_il_test.dart
@@ -5,14 +5,21 @@
 // Test that we emit EqualityCompare rather than StrictCompare+BoxInt64
 // when comparing non-nullable integer to a Smi.
 
-// MatchIL[AOT]=factorial
-// __ GraphEntry
-// __ FunctionEntry
-// __ CheckStackOverflow
-// __ Branch(EqualityCompare)
+import 'package:vm/testing/il_matchers.dart';
+
 @pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph')
 int factorial(int value) => value == 1 ? value : value * factorial(value - 1);
 
+void matchIL$factorial(FlowGraph graph) {
+  graph.match([
+    match.block('Graph'),
+    match.block('Function', [
+      match.Branch(match.EqualityCompare(match.any, match.any, kind: '==')),
+    ]),
+  ]);
+}
+
 void main() {
   print(factorial(4));
 }
diff --git a/runtime/tests/vm/dart_2/bare_instructions_trampolines_test.dart b/runtime/tests/vm/dart_2/bare_instructions_trampolines_test.dart
index fee9478..9c70a11 100644
--- a/runtime/tests/vm/dart_2/bare_instructions_trampolines_test.dart
+++ b/runtime/tests/vm/dart_2/bare_instructions_trampolines_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-// VMOptions=--always-generate-trampolines-for-testing --use-bare-instructions
+// VMOptions=--always-generate-trampolines-for-testing
 
 // We use a reasonable sized test and run it with the above options.
 import 'hello_fuchsia_test.dart' as test;
diff --git a/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart b/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart
index 228e1b5..d4d9e46 100644
--- a/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart
+++ b/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_lazy_non_symbolic_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 file.
 //
-// VMOptions=--dwarf-stack-traces --save-debugging-info=async_lazy_debug.so --lazy-async-stacks --no-use-bare-instructions
+// VMOptions=--dwarf-stack-traces --save-debugging-info=async_lazy_debug.so --lazy-async-stacks
 
 // @dart = 2.9
 
diff --git a/runtime/tests/vm/dart_2/causal_stacks/utils.dart b/runtime/tests/vm/dart_2/causal_stacks/utils.dart
index cd46b03..a17cade 100644
--- a/runtime/tests/vm/dart_2/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart_2/causal_stacks/utils.dart
@@ -852,7 +852,7 @@
       r'^<asynchronous suspension>$',
       r'^#1      asyncStarThrowAsync \(.*/utils.dart:128(:5)?\)$',
       r'^<asynchronous suspension>$',
-      r'^#2      listenAsyncStarThrowAsync.<anonymous closure> \(.+/utils.dart(:0)?\)$',
+      r'^#2      listenAsyncStarThrowAsync.<anonymous closure> \(.+/utils.dart:134(:56)?\)$',
       r'^<asynchronous suspension>$',
     ];
     await doTestAwait(
diff --git a/runtime/tests/vm/dart_2/deferred_isolate_test.dart b/runtime/tests/vm/dart_2/deferred_isolate_test.dart
index ccfcbba..c6283a7 100644
--- a/runtime/tests/vm/dart_2/deferred_isolate_test.dart
+++ b/runtime/tests/vm/dart_2/deferred_isolate_test.dart
@@ -6,9 +6,6 @@
 
 // Verify deferred library status is per-isolate, not per-isolate-group.
 
-// VMOptions=--enable-isolate-groups
-
-import 'dart:async';
 import 'dart:isolate';
 import 'package:expect/expect.dart';
 
diff --git a/runtime/tests/vm/dart_2/deferred_loading_call_modes_test.dart b/runtime/tests/vm/dart_2/deferred_loading_call_modes_test.dart
index e513770..5efc2bd 100644
--- a/runtime/tests/vm/dart_2/deferred_loading_call_modes_test.dart
+++ b/runtime/tests/vm/dart_2/deferred_loading_call_modes_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--use_bare_instructions=false
-// VMOptions=--use_bare_instructions=true --use_table_dispatch=false
-// VMOptions=--use_bare_instructions=true --use_table_dispatch=true
+// VMOptions=--use_table_dispatch=false
+// VMOptions=--use_table_dispatch=true
 
 import "splay_test.dart" deferred as splay; // Some non-trivial code.
 
diff --git a/runtime/tests/vm/dart_2/flutter_regress_91370_il_test.dart b/runtime/tests/vm/dart_2/flutter_regress_91370_il_test.dart
new file mode 100644
index 0000000..afa6bcf
--- /dev/null
+++ b/runtime/tests/vm/dart_2/flutter_regress_91370_il_test.dart
@@ -0,0 +1,730 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:vm/testing/il_matchers.dart';
+
+bool shouldPrint = false;
+
+@pragma('vm:never-inline')
+void blackhole(Object v) {
+  if (shouldPrint) {
+    print(v);
+  }
+}
+
+class A {}
+
+class A0 extends A {
+  final double x;
+  final String str;
+
+  A0(this.x, this.str);
+
+  // Use [x] to prevent the field from being shaken out. We would like
+  // [x] to occupy the same location that [A1.str] takes so that
+  // type confusion / incorrect LICM would cause a crash when we load
+  // `o.[A1.str].length` on an object of type [A0]
+  String toString() => 'A0($x)';
+}
+
+class A1 extends A {
+  final String str;
+
+  A1(this.str);
+}
+
+class H<T> {
+  final T data;
+  H(this.data);
+}
+
+abstract class B<T extends A> {
+  final T v;
+
+  B(this.v);
+
+  int load(H<T> h);
+  int loadWithNamedParam({required H<T> h});
+
+  @pragma('vm:never-inline')
+  @pragma('vm:testing:print-flow-graph', '*LICM')
+  int testNarrowingThroughThisCallWithPositionalParam(H<T> h) {
+    var result = 0;
+    for (var i = 0; i < 10; i++) {
+      // We will perform polymorphic inlining of `load` because `this`
+      // is known to be either B0 or B1. In both cases we will have
+      // v.str.length loads fully inlined because inlined bodies
+      // have precise type information for v.
+      // Then we will hoist v.str.length out of the loop past
+      // class-id comparisons generated by the inlining leading
+      // to incorrect code which will crash.
+      result += load(h);
+    }
+    return result;
+  }
+
+  @pragma('vm:never-inline')
+  @pragma('vm:testing:print-flow-graph', '*LICM')
+  int testNarrowingThroughThisCallWithNamedParams(H<T> h) {
+    var result = 0;
+    for (var i = 0; i < 10; i++) {
+      // We will perform polymorphic inlining of `load` because `this`
+      // is known to be either B0 or B1. In both cases we will have
+      // v.str.length loads fully inlined because inlined bodies
+      // have precise type information for v.
+      // Then we will hoist v.str.length out of the loop past
+      // class-id comparisons generated by the inlining leading
+      // to incorrect code which will crash.
+      result += loadWithNamedParam(h: h);
+    }
+    return result;
+  }
+}
+
+class BImpl<T extends A> extends B<T> {
+  BImpl(T v) : super(v);
+
+  // These methods do not matter. They can just return 0.
+  int load(H<T> h) => 0;
+  int loadWithNamedParam({required H<T> h}) => 0;
+}
+
+class B0 extends B<A0> {
+  B0(A0 a) : super(a);
+
+  int load(H<A0> h) {
+    return h.data.str.length;
+  }
+
+  int loadWithNamedParam({String? a, required H<A0> h, String? z}) {
+    return h.data.str.length;
+  }
+}
+
+class B1 extends B<A1> {
+  B1(A1 a) : super(a);
+
+  int load(H<A1> h) {
+    return h.data.str.length;
+  }
+
+  int loadWithNamedParam({String? a, required H<A1> h, String? z}) {
+    return h.data.str.length;
+  }
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIsCheckOnSubclass(B b) {
+  int sum = 0;
+  b.v.toString();
+  for (var i = 0; i < 2; i++) {
+    if (b is B1) {
+      sum += b.v.str.length;
+    }
+  }
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIsCheckWithTypeArgPolymorphic(B b) {
+  int sum = 0;
+  final v = b.v;
+  for (var i = 0; i < 2; i++) {
+    if (b is B<A1>) {
+      sum += b.v.str.length;
+    }
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIsCheckWithTypeArgMonomorphic(B b) {
+  int sum = 0;
+  final v = b.v;
+  for (var i = 0; i < 2; i++) {
+    if (b is B<A1>) {
+      sum += b.v.str.length;
+    }
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughAsCheckWithTypeArgPolymorphic(B b) {
+  int sum = 0;
+  final v = b.v;
+  for (var i = 0; i < 2; i++) {
+    // Branch with a side-effect to avoid b as B<A1> hoisting.
+    if (sum == 42) throw '42';
+    sum += (b as B<A1>).v.str.length;
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughPhiOfAsChecksWithTypeArgPolymorphic(B b) {
+  int sum = 0;
+  final v = b.v;
+  for (var i = 0; i < 2; i++) {
+    // Branch with a side-effect to avoid b as B<A1> hoisting.
+    if (sum == 42) throw '42';
+    sum += (sum == 22 ? b as B<A1> : b as B<A1>).v.str.length;
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIndexedLoadFromGrowableArray(List<A> l) {
+  int sum = 0;
+  final v = l[0];
+  for (var i = 0; i < 2; i++) {
+    if (l is List<A1>) {
+      sum += l[0].str.length;
+    }
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIndexedLoadFromFixedArray(List<A> l) {
+  int sum = 0;
+  final v = l[0];
+  for (var i = 0; i < 2; i++) {
+    if (l is List<A1>) {
+      sum += l[0].str.length;
+    }
+  }
+  blackhole(v);
+  return sum;
+}
+
+void main(List<String> args) {
+  shouldPrint = args.contains("shouldPrint");
+
+  // Prevent shaking of BImpl.load and BImpl.loadWithNamed, if these methods
+  // are shaked (because they are not used) that would inhibit polymorphic
+  // inlining at testNarrowingThroughThisCall{,WithNamedParams}
+  BImpl(A1("")).load(H(A1("")));
+  BImpl(A1("")).loadWithNamedParam(h: H(A1("")));
+
+  for (var i = 0; i < 2; i++) {
+    final a1 = A1("$i");
+    final a0 = A0(i.toDouble(), "$i");
+    B1(a1).testNarrowingThroughThisCallWithPositionalParam(H(a1));
+    B0(a0).testNarrowingThroughThisCallWithPositionalParam(H(a0));
+    B1(a1).testNarrowingThroughThisCallWithNamedParams(H(a1));
+    B0(a0).testNarrowingThroughThisCallWithNamedParams(H(a0));
+    testNarrowingThroughIsCheckOnSubclass(B1(a1));
+    testNarrowingThroughIsCheckOnSubclass(B0(a0));
+    testNarrowingThroughIsCheckWithTypeArgPolymorphic(B1(a1));
+    testNarrowingThroughIsCheckWithTypeArgPolymorphic(B0(a0));
+    testNarrowingThroughIsCheckWithTypeArgMonomorphic(BImpl<A1>(a1));
+    testNarrowingThroughIsCheckWithTypeArgMonomorphic(BImpl<A0>(a0));
+    testNarrowingThroughAsCheckWithTypeArgPolymorphic(B1(a1));
+    try {
+      testNarrowingThroughAsCheckWithTypeArgPolymorphic(B0(a0));
+      throw "Should be unreachable";
+    } on TypeError catch (e) {}
+    testNarrowingThroughPhiOfAsChecksWithTypeArgPolymorphic(B1(a1));
+    try {
+      testNarrowingThroughPhiOfAsChecksWithTypeArgPolymorphic(B0(a0));
+      throw "Should be unreachable";
+    } on TypeError catch (e) {}
+    testNarrowingThroughIndexedLoadFromGrowableArray([a1]);
+    testNarrowingThroughIndexedLoadFromGrowableArray([a0]);
+    testNarrowingThroughIndexedLoadFromFixedArray(
+        List<A1>.filled(1, a1, growable: false));
+    testNarrowingThroughIndexedLoadFromFixedArray(
+        List<A0>.filled(1, a0, growable: false));
+  }
+}
+
+void matchIL$testNarrowingThroughThisCallWithPositionalParam(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'h_raw' << match.Parameter(index: 1),
+      'h' << match.AssertAssignable('h_raw', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_cid' << match.LoadClassId('this'),
+          match.Branch(match.StrictCompare('this_cid', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('this'),
+          // This redefinition was inserted by inlining.
+          'h_' << match.Redefinition('h'),
+          'v0' << match.LoadField('h_', slot: 'data'),
+          'v1' << match.LoadField('v0', slot: 'str'),
+          'v2' << match.LoadField('v1', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'h_raw' << match.Parameter(index: 1),
+      'h' << match.AssertAssignable('h_raw', match.any),
+      'this_cid' << match.LoadClassId('this'), // Hoisted.
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.StrictCompare('this_cid', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          // After LICM redefinitions are removed.
+          'v0' << match.LoadField('h', slot: 'data'),
+          'v1' << match.LoadField('v0', slot: 'str'),
+          'v2' << match.LoadField('v1', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughThisCallWithNamedParams(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  // Graph shape is basically the same.
+  matchIL$testNarrowingThroughThisCallWithPositionalParam(
+      beforeLICM, afterLICM);
+}
+
+void matchIL$testNarrowingThroughIsCheckOnSubclass(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'b_cid' << match.LoadClassId('b'),
+          match.Branch(match.StrictCompare('b_cid', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('b'),
+          // This redefinition was inserted by load forwarding.
+          'b.v*' << match.Redefinition('b.v'),
+          'v0' << match.LoadField('b.v*', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      'b_cid' << match.LoadClassId('b'), // Hoisted.
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.StrictCompare('b_cid', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          'v0' << match.LoadField('b.v', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughIsCheckWithTypeArgMonomorphic(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'b_is_B<A1>' << match.InstanceOf('b', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('b_is_B<A1>', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('b'),
+          // This redefinition was inserted by load forwarding.
+          'b.v*' << match.Redefinition('b.v'),
+          'v0' << match.LoadField('b.v*', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'b_is_B<A1>' << match.InstanceOf('b', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('b_is_B<A1>', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          'v0' << match.LoadField('b.v', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughAsCheckWithTypeArgPolymorphic(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B3', ifFalse: 'B4'),
+        ]),
+    'B3' << match.block('Target', [match.Throw(match.any)]),
+    'B4' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          // This redefinition was inserted by load forwarding.
+          'b.v*' << match.Redefinition('b.v'),
+          'v0' << match.LoadField('b.v*', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B3', ifFalse: 'B4'),
+        ]),
+    'B3' << match.block('Target', [match.Throw(match.any)]),
+    'B4' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          'v0' << match.LoadField('b.v', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughPhiOfAsChecksWithTypeArgPolymorphic(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B3', ifFalse: 'B4'),
+        ]),
+    'B3' << match.block('Target', [match.Throw(match.any)]),
+    'B4' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B5', ifFalse: 'B6'),
+        ]),
+    'B5' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          match.Goto('B7'),
+        ]),
+    'B6' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          match.Goto('B7'),
+        ]),
+    'B7' <<
+        match.block('Join', [
+          // This redefinition was inserted by PhiInstr::Canonicalize
+          // which removed Phi of two AssertAssignables above.
+          match.Redefinition('b'),
+          // This redefinition was inserted by load forwarding.
+          'b.v*' << match.Redefinition('b.v'),
+          'v0' << match.LoadField('b.v*', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B3', ifFalse: 'B4'),
+        ]),
+    'B3' << match.block('Target', [match.Throw(match.any)]),
+    'B4' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B5', ifFalse: 'B6'),
+        ]),
+    'B5' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          match.Goto('B7'),
+        ]),
+    'B6' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          match.Goto('B7'),
+        ]),
+    'B7' <<
+        match.block('Join', [
+          'v0' << match.LoadField('b.v', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughIndexedLoadFromGrowableArray(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'a.data' << match.LoadField('this', slot: 'GrowableObjectArray.data'),
+      'a.data[0]' << match.LoadIndexed('a.data', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_is_List' << match.InstanceOf('this', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('this_is_List', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('this'),
+          // This redefinition was inserted by load forwarding.
+          'a.data[0]*' << match.Redefinition('a.data[0]'),
+          if (!beforeLICM.soundNullSafety)
+            'a.data[0]*!' << match.CheckNull('a.data[0]*'),
+          'a.data[0].str' <<
+              match.LoadField(
+                  beforeLICM.soundNullSafety ? 'a.data[0]*' : 'a.data[0]*!',
+                  slot: 'str'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'a.data' << match.LoadField('this', slot: 'GrowableObjectArray.data'),
+      'a.data[0]' << match.LoadIndexed('a.data', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_is_List' << match.InstanceOf('this', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('this_is_List', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          if (!beforeLICM.soundNullSafety)
+            'a.data[0]!' << match.CheckNull('a.data[0]'),
+          'a.data[0].str' <<
+              match.LoadField(
+                  beforeLICM.soundNullSafety ? 'a.data[0]' : 'a.data[0]!',
+                  slot: 'str'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughIsCheckWithTypeArgPolymorphic(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  matchIL$testNarrowingThroughIsCheckWithTypeArgMonomorphic(
+      beforeLICM, afterLICM);
+}
+
+void matchIL$testNarrowingThroughIndexedLoadFromFixedArray(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'a[0]' << match.LoadIndexed('this', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_is_List' << match.InstanceOf('this', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('this_is_List', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('this'),
+          // This redefinition was inserted by load forwarding.
+          'a[0]*' << match.Redefinition('a[0]'),
+          if (!beforeLICM.soundNullSafety) 'a[0]*!' << match.CheckNull('a[0]*'),
+          'a[0].str' <<
+              match.LoadField(beforeLICM.soundNullSafety ? 'a[0]*' : 'a[0]*!',
+                  slot: 'str'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'a[0]' << match.LoadIndexed('this', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_is_List' << match.InstanceOf('this', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('this_is_List', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          if (!beforeLICM.soundNullSafety) 'a[0]!' << match.CheckNull('a[0]'),
+          'a[0].str' <<
+              match.LoadField(beforeLICM.soundNullSafety ? 'a[0]' : 'a[0]!',
+                  slot: 'str'),
+        ]),
+  ], env: env);
+}
diff --git a/runtime/tests/vm/dart_2/isolates/closure_entrypoint_test.dart b/runtime/tests/vm/dart_2/isolates/closure_entrypoint_test.dart
index 4fa05c9..7249cee 100644
--- a/runtime/tests/vm/dart_2/isolates/closure_entrypoint_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/closure_entrypoint_test.dart
@@ -2,10 +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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
+// VMOptions=--no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
+// VMOptions=--enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
 
 // The tests in this file will only succeed when isolate groups are enabled
 // (hence the VMOptions above).
diff --git a/runtime/tests/vm/dart_2/isolates/closures_without_captured_variables_test.dart b/runtime/tests/vm/dart_2/isolates/closures_without_captured_variables_test.dart
index 3f714b6..ebe5474 100644
--- a/runtime/tests/vm/dart_2/isolates/closures_without_captured_variables_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/closures_without_captured_variables_test.dart
@@ -2,8 +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.
 
-// VMOptions=--enable-isolate-groups
-
 // The tests in this file will only succeed when isolate groups are enabled
 // (hence the VMOptions above).
 
diff --git a/runtime/tests/vm/dart_2/isolates/dart_api_create_lightweight_isolate_test.dart b/runtime/tests/vm/dart_2/isolates/dart_api_create_lightweight_isolate_test.dart
index 0a2fd1c..23ffcd0 100644
--- a/runtime/tests/vm/dart_2/isolates/dart_api_create_lightweight_isolate_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/dart_api_create_lightweight_isolate_test.dart
@@ -5,8 +5,7 @@
 // @dart = 2.9
 
 // SharedObjects=ffi_test_functions
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:async';
 import 'dart:ffi';
@@ -19,8 +18,6 @@
 import 'test_utils.dart' show isArtificialReloadMode;
 import '../../../../../tests/ffi/dylib_utils.dart';
 
-final bool isolateGroupsEnabled =
-    Platform.executableArguments.contains('--enable-isolate-groups');
 final bool usesDwarfStackTraces = Platform.executableArguments
     .any((entry) => RegExp('--dwarf[-_]stack[-_]traces').hasMatch(entry));
 final bool hasSymbolicStackTraces = !usesDwarfStackTraces;
@@ -225,25 +222,7 @@
   await testFatalError();
 }
 
-Future testNotSupported() async {
-  dynamic exception;
-  try {
-    FfiBindings.createLightweightIsolate('debug-name', Pointer.fromAddress(0));
-  } catch (e) {
-    exception = e;
-  }
-  Expect.contains(
-      'Lightweight isolates need to be explicitly enabled by passing '
-      '--enable-isolate-groups.',
-      exception.toString());
-}
-
 Future main(args) async {
-  if (!isolateGroupsEnabled) {
-    await testNotSupported();
-    return;
-  }
-
   // This test should not run in hot-reload because of the way it is written
   // (embedder related code written in Dart instead of C)
   if (isArtificialReloadMode) return;
diff --git a/runtime/tests/vm/dart_2/isolates/fast_object_copy2_test.dart b/runtime/tests/vm/dart_2/isolates/fast_object_copy2_test.dart
index 9b8c1f0..99d8e26 100644
--- a/runtime/tests/vm/dart_2/isolates/fast_object_copy2_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/fast_object_copy2_test.dart
@@ -4,10 +4,10 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
+// VMOptions=--no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
+// VMOptions=--enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
 
 // The tests in this file will only succeed when isolate groups are enabled
 // (hence the VMOptions above).
diff --git a/runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart b/runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart
index 1a1512d..09aa46f 100644
--- a/runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart
@@ -4,11 +4,10 @@
 
 // @dart = 2.9
 
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation --verify-store-buffer
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation --verify-store-buffer
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
+// VMOptions=--no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation --verify-store-buffer
+// VMOptions=--enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation --verify-store-buffer
 
 // The tests in this file are particularly for an implementation that tries to
 // allocate the entire graph in BFS order using a fast new space allocation
diff --git a/runtime/tests/vm/dart_2/isolates/fibonacci_call_test.dart b/runtime/tests/vm/dart_2/isolates/fibonacci_call_test.dart
index 7a097a2..97d9b13 100644
--- a/runtime/tests/vm/dart_2/isolates/fibonacci_call_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/fibonacci_call_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:isolate';
 
diff --git a/runtime/tests/vm/dart_2/isolates/limited_active_mutator_test.dart b/runtime/tests/vm/dart_2/isolates/limited_active_mutator_test.dart
index a99e4ee..b01ac77 100644
--- a/runtime/tests/vm/dart_2/isolates/limited_active_mutator_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/limited_active_mutator_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification --disable-thread-pool-limit
+// VMOptions=--disable-heap-verification --disable-thread-pool-limit
 
 import 'dart:async';
 import 'dart:math' as math;
diff --git a/runtime/tests/vm/dart_2/isolates/regress_46539_test.dart b/runtime/tests/vm/dart_2/isolates/regress_46539_test.dart
index 0f16901..6990bd0 100644
--- a/runtime/tests/vm/dart_2/isolates/regress_46539_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/regress_46539_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-// VMOptions=--optimization-filter=foo --enable-isolate-groups --no-use-osr --optimization-counter-threshold=1 --deterministic
+// VMOptions=--optimization-filter=foo --no-use-osr --optimization-counter-threshold=1 --deterministic
 
 // Important: This is a regression test for a concurrency issue, if this test
 // is flaky it is essentially failing!
diff --git a/runtime/tests/vm/dart_2/isolates/reload_utils.dart b/runtime/tests/vm/dart_2/isolates/reload_utils.dart
index f9ba12f..c973017 100644
--- a/runtime/tests/vm/dart_2/isolates/reload_utils.dart
+++ b/runtime/tests/vm/dart_2/isolates/reload_utils.dart
@@ -125,7 +125,6 @@
     '--enable-vm-service:0',
     '--disable-dart-dev',
     '--disable-service-auth-codes',
-    '--enable-isolate-groups',
     file
   ];
   final env = Platform.environment;
diff --git a/runtime/tests/vm/dart_2/isolates/ring_gc_sendAndExit_test.dart b/runtime/tests/vm/dart_2/isolates/ring_gc_sendAndExit_test.dart
index 2c7011c..d12ebf6 100644
--- a/runtime/tests/vm/dart_2/isolates/ring_gc_sendAndExit_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/ring_gc_sendAndExit_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:math' as math;
 
diff --git a/runtime/tests/vm/dart_2/isolates/ring_gc_test.dart b/runtime/tests/vm/dart_2/isolates/ring_gc_test.dart
index 908d1a3..46af3c4 100644
--- a/runtime/tests/vm/dart_2/isolates/ring_gc_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/ring_gc_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:async';
 import 'dart:math' as math;
diff --git a/runtime/tests/vm/dart_2/isolates/spawn_function_test.dart b/runtime/tests/vm/dart_2/isolates/spawn_function_test.dart
index 4474a3f..24977d6 100644
--- a/runtime/tests/vm/dart_2/isolates/spawn_function_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/spawn_function_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import 'dart:async';
 
diff --git a/runtime/tests/vm/dart_2/isolates/sum_recursive_call_test.dart b/runtime/tests/vm/dart_2/isolates/sum_recursive_call_test.dart
index 0aba961..39baabc 100644
--- a/runtime/tests/vm/dart_2/isolates/sum_recursive_call_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/sum_recursive_call_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:isolate';
 
diff --git a/runtime/tests/vm/dart_2/isolates/sum_recursive_tail_call_test.dart b/runtime/tests/vm/dart_2/isolates/sum_recursive_tail_call_test.dart
index 85b6f0e..989e1cd 100644
--- a/runtime/tests/vm/dart_2/isolates/sum_recursive_tail_call_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/sum_recursive_tail_call_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:isolate';
 
diff --git a/runtime/tests/vm/dart_2/isolates/thread_pool_test.dart b/runtime/tests/vm/dart_2/isolates/thread_pool_test.dart
index f54a9ce..667bec3 100644
--- a/runtime/tests/vm/dart_2/isolates/thread_pool_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/thread_pool_test.dart
@@ -5,7 +5,7 @@
 // @dart = 2.9
 
 // SharedObjects=ffi_test_functions
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:async';
 import 'dart:ffi';
diff --git a/runtime/tests/vm/dart_2/issue_31959_31960_test.dart b/runtime/tests/vm/dart_2/issue_31959_31960_test.dart
index 9f79c7c..cc2d8e6 100644
--- a/runtime/tests/vm/dart_2/issue_31959_31960_test.dart
+++ b/runtime/tests/vm/dart_2/issue_31959_31960_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:isolate';
 import 'dart:math';
diff --git a/runtime/tests/vm/dart_2/regress_46878_test.dart b/runtime/tests/vm/dart_2/regress_46878_test.dart
index 6ef37bc..ad59a65 100644
--- a/runtime/tests/vm/dart_2/regress_46878_test.dart
+++ b/runtime/tests/vm/dart_2/regress_46878_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 
 import 'package:expect/expect.dart';
diff --git a/runtime/tests/vm/dart_2/regress_47468_test.dart b/runtime/tests/vm/dart_2/regress_47468_test.dart
deleted file mode 100644
index b1ccb10..0000000
--- a/runtime/tests/vm/dart_2/regress_47468_test.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
-// for 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 https://github.com/dart-lang/sdk/issues/47468.
-// Verifies that the sending empty non-const maps works
-
-// VMOptions=--no-enable-isolate-groups
-
-// @dart = 2.9
-
-import 'dart:isolate';
-
-void main() async {
-  final nonConstMap = <int, Object>{};
-  final receivePort = ReceivePort();
-  final sendPort = receivePort.sendPort;
-  sendPort.send(nonConstMap);
-  await receivePort.first;
-}
diff --git a/runtime/tests/vm/dart_2/regress_47704_test.dart b/runtime/tests/vm/dart_2/regress_47704_test.dart
new file mode 100644
index 0000000..a0c2335
--- /dev/null
+++ b/runtime/tests/vm/dart_2/regress_47704_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 https://github.com/dart-lang/sdk/issues/47704.
+// Verifies that compiler doesn't crash with compressed pointers when
+// generating code involving as 32-bit Smi constant which is not
+// sign-extended to 64 bits.
+
+// VMOptions=--deterministic --optimization_counter_threshold=80
+
+// @dart = 2.9
+
+import 'dart:typed_data';
+import "package:expect/expect.dart";
+
+const int minLevel = -1;
+
+void foo() {
+  // Make sure this method is compiled.
+  for (int i = 0; i < 100; i++) {}
+
+  bool ok = false;
+  try {
+    for (int loc0 in ((Uint16List(40)).sublist(minLevel, 42))) {
+      print(loc0);
+    }
+  } catch (e) {
+    ok = true;
+  }
+  Expect.isTrue(ok);
+}
+
+void main() {
+  foo();
+  foo();
+}
diff --git a/runtime/tests/vm/dart_2/sendandexit_test.dart b/runtime/tests/vm/dart_2/sendandexit_test.dart
index bf2ffe2..f64ac6a 100644
--- a/runtime/tests/vm/dart_2/sendandexit_test.dart
+++ b/runtime/tests/vm/dart_2/sendandexit_test.dart
@@ -2,8 +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.
 //
-// VMOptions=--enable-isolate-groups
-//
 // Validates functionality of Isolate.exit().
 
 // @dart = 2.9
diff --git a/runtime/tests/vm/dart_2/spawn_infinite_loop_test.dart b/runtime/tests/vm/dart_2/spawn_infinite_loop_test.dart
index c87cf77..1d66659 100644
--- a/runtime/tests/vm/dart_2/spawn_infinite_loop_test.dart
+++ b/runtime/tests/vm/dart_2/spawn_infinite_loop_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 
 // This test ensures that the VM can kill the spawned isolate during VM
diff --git a/runtime/tests/vm/dart_2/spawn_shutdown_test.dart b/runtime/tests/vm/dart_2/spawn_shutdown_test.dart
index 4c4eb86..5b30f4f 100644
--- a/runtime/tests/vm/dart_2/spawn_shutdown_test.dart
+++ b/runtime/tests/vm/dart_2/spawn_shutdown_test.dart
@@ -2,8 +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.
 
-// VMOptions=--enable-asserts --enable-isolate-groups
-// VMOptions=--enable-asserts --no-enable-isolate-groups
+// VMOptions=--enable-asserts
 
 // @dart = 2.9
 
diff --git a/runtime/tests/vm/dart_2/split_literals_test.dart b/runtime/tests/vm/dart_2/split_literals_test.dart
index 05fcff2..4fa9c1a 100644
--- a/runtime/tests/vm/dart_2/split_literals_test.dart
+++ b/runtime/tests/vm/dart_2/split_literals_test.dart
@@ -67,8 +67,6 @@
 
     // Compile kernel to ELF.
     await run(genSnapshot, <String>[
-      "--use_bare_instructions=false", //# object: ok
-      "--use_bare_instructions=true", //# bare: ok
       "--snapshot-kind=app-aot-elf",
       "--elf=$snapshot",
       "--loading-unit-manifest=$manifest",
diff --git a/runtime/tests/vm/dart_2/transferable_test.dart b/runtime/tests/vm/dart_2/transferable_test.dart
index e08040e..1a38483 100644
--- a/runtime/tests/vm/dart_2/transferable_test.dart
+++ b/runtime/tests/vm/dart_2/transferable_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test that validates that transferables are faster than regular typed data.
 
 import 'dart:async';
diff --git a/runtime/tests/vm/dart_2/transferable_throws_test.dart b/runtime/tests/vm/dart_2/transferable_throws_test.dart
index 320ec01..d985cbc 100644
--- a/runtime/tests/vm/dart_2/transferable_throws_test.dart
+++ b/runtime/tests/vm/dart_2/transferable_throws_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test that ensures correct exceptions are thrown when misusing
 // [TransferableTypedData].
 
diff --git a/runtime/tests/vm/dart_2/use_bare_instructions_flag_test.dart b/runtime/tests/vm/dart_2/use_bare_instructions_flag_test.dart
deleted file mode 100644
index 52b958f..0000000
--- a/runtime/tests/vm/dart_2/use_bare_instructions_flag_test.dart
+++ /dev/null
@@ -1,105 +0,0 @@
-// 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.
-
-// @dart = 2.9
-
-// This test is ensuring that the flag for --use-bare-instructions given at
-// AOT compile-time will be used at runtime (irrespective if other values were
-// passed to the runtime).
-
-import "dart:async";
-import "dart:io";
-
-import 'package:expect/expect.dart';
-import 'package:path/path.dart' as path;
-
-import 'use_flag_test_helper.dart';
-
-main(List<String> args) async {
-  if (!isAOTRuntime) {
-    return; // Running in JIT: AOT binaries not available.
-  }
-
-  if (Platform.isAndroid) {
-    return; // SDK tree and dart_bootstrap not available on the test device.
-  }
-
-  await withTempDir('bare-flag-test', (String tempDir) async {
-    final script = path.join(sdkDir, 'pkg/kernel/bin/dump.dart');
-    final scriptDill = path.join(tempDir, 'kernel_dump.dill');
-
-    // Compile script to Kernel IR.
-    await run(genKernel, <String>[
-      '--aot',
-      '--platform=$platformDill',
-      '-o',
-      scriptDill,
-      script,
-    ]);
-
-    // Run the AOT compiler with/without bare instructions.
-    final scriptBareSnapshot = path.join(tempDir, 'bare.snapshot');
-    final scriptNonBareSnapshot = path.join(tempDir, 'non_bare.snapshot');
-    await Future.wait(<Future>[
-      run(genSnapshot, <String>[
-        '--use-bare-instructions',
-        '--snapshot-kind=app-aot-elf',
-        '--elf=$scriptBareSnapshot',
-        scriptDill,
-      ]),
-      run(genSnapshot, <String>[
-        '--no-use-bare-instructions',
-        '--snapshot-kind=app-aot-elf',
-        '--elf=$scriptNonBareSnapshot',
-        scriptDill,
-      ]),
-    ]);
-
-    // Run the resulting bare-AOT compiled script.
-    final bareOut1 = path.join(tempDir, 'bare-out1.txt');
-    final bareOut2 = path.join(tempDir, 'bare-out2.txt');
-    await Future.wait(<Future>[
-      run(aotRuntime, <String>[
-        '--use-bare-instructions',
-        scriptBareSnapshot,
-        scriptDill,
-        bareOut1,
-      ]),
-      run(aotRuntime, <String>[
-        '--no-use-bare-instructions',
-        scriptBareSnapshot,
-        scriptDill,
-        bareOut2,
-      ]),
-    ]);
-
-    // Run the resulting non-bare-AOT compiled script.
-    final nonBareOut1 = path.join(tempDir, 'non-bare-out1.txt');
-    final nonBareOut2 = path.join(tempDir, 'non-bare-out2.txt');
-    await Future.wait(<Future>[
-      run(aotRuntime, <String>[
-        '--use-bare-instructions',
-        scriptNonBareSnapshot,
-        scriptDill,
-        nonBareOut1,
-      ]),
-      run(aotRuntime, <String>[
-        '--no-use-bare-instructions',
-        scriptNonBareSnapshot,
-        scriptDill,
-        nonBareOut2,
-      ]),
-    ]);
-
-    // Ensure we got 4 times the same result.
-    final output = await readFile(bareOut1);
-    Expect.equals(output, await readFile(bareOut2));
-    Expect.equals(output, await readFile(nonBareOut1));
-    Expect.equals(output, await readFile(nonBareOut2));
-  });
-}
-
-Future<String> readFile(String file) {
-  return new File(file).readAsString();
-}
diff --git a/runtime/tests/vm/dart_2/v8_snapshot_profile_writer_test.dart b/runtime/tests/vm/dart_2/v8_snapshot_profile_writer_test.dart
index a4d23af..cf3e581 100644
--- a/runtime/tests/vm/dart_2/v8_snapshot_profile_writer_test.dart
+++ b/runtime/tests/vm/dart_2/v8_snapshot_profile_writer_test.dart
@@ -109,7 +109,6 @@
 
 Future<void> testAOT(String dillPath,
     {bool useAsm = false,
-    bool useBare = true,
     bool forceDrops = false,
     bool useDispatch = true,
     bool stripUtil = false, // Note: forced true if useAsm.
@@ -129,9 +128,6 @@
   }
 
   final descriptionBuilder = StringBuffer()..write(useAsm ? 'assembly' : 'elf');
-  if (!useBare) {
-    descriptionBuilder.write('-nonbare');
-  }
   if (forceDrops) {
     descriptionBuilder.write('-dropped');
   }
@@ -158,7 +154,6 @@
     final snapshotPath = path.join(tempDir, 'test.snap');
     final commonSnapshotArgs = [
       if (stripFlag) '--strip', //  gen_snapshot specific and not a VM flag.
-      useBare ? '--use-bare-instructions' : '--no-use-bare-instructions',
       "--write-v8-snapshot-profile-to=$profilePath",
       if (forceDrops) ...[
         '--dwarf-stack-traces',
@@ -432,24 +427,11 @@
 
     // Test unstripped ELF generation directly.
     await testAOT(aotDillPath);
-    await testAOT(aotDillPath, useBare: false);
     await testAOT(aotDillPath, forceDrops: true);
-    await testAOT(aotDillPath, forceDrops: true, useBare: false);
     await testAOT(aotDillPath, forceDrops: true, useDispatch: false);
-    await testAOT(aotDillPath,
-        forceDrops: true, useDispatch: false, useBare: false);
 
     // Test flag-stripped ELF generation.
     await testAOT(aotDillPath, stripFlag: true);
-    await testAOT(aotDillPath, useBare: false, stripFlag: true);
-
-    // Since we can't force disassembler support after the fact when running
-    // in PRODUCT mode, skip any --disassemble tests. Do these tests last as
-    // they have lots of output and so the log will be truncated.
-    if (!const bool.fromEnvironment('dart.vm.product')) {
-      // Regression test for dartbug.com/41149.
-      await testAOT(aotDillPath, useBare: false, disassemble: true);
-    }
 
     // We neither generate assembly nor have a stripping utility on Windows.
     if (Platform.isWindows) {
@@ -463,7 +445,6 @@
     } else {
       // Test unstripped ELF generation that is then externally stripped.
       await testAOT(aotDillPath, stripUtil: true);
-      await testAOT(aotDillPath, stripUtil: true, useBare: false);
     }
 
     // TODO(sstrickl): Currently we can't assemble for SIMARM64 on MacOSX.
@@ -476,9 +457,7 @@
     }
     // Test unstripped assembly generation that is then externally stripped.
     await testAOT(aotDillPath, useAsm: true);
-    await testAOT(aotDillPath, useAsm: true, useBare: false);
     // Test stripped assembly generation that is then externally stripped.
     await testAOT(aotDillPath, useAsm: true, stripFlag: true);
-    await testAOT(aotDillPath, useAsm: true, stripFlag: true, useBare: false);
   });
 }
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 9f7c51c..f4bc06c 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -23,7 +23,6 @@
 dart/slow_path_shared_stub_test: Pass, Slow # Uses --shared-slow-path-triggers-gc flag.
 dart/snapshot_version_test: Skip # This test is a Dart1 test (script snapshot)
 dart/stack_overflow_shared_test: Pass, Slow # Uses --shared-slow-path-triggers-gc flag.
-dart/use_bare_instructions_flag_test: Pass, Slow # Spawns several subprocesses
 dart_2/boxmint_test: Pass, Slow # Uses slow path
 dart_2/byte_array_optimized_test: Pass, Slow
 dart_2/data_uri_import_test/none: SkipByDesign
@@ -36,7 +35,6 @@
 dart_2/slow_path_shared_stub_test: Pass, Slow # Uses --shared-slow-path-triggers-gc flag.
 dart_2/snapshot_version_test: Skip # This test is a Dart1 test (script snapshot)
 dart_2/stack_overflow_shared_test: Pass, Slow # Uses --shared-slow-path-triggers-gc flag.
-dart_2/use_bare_instructions_flag_test: Pass, Slow # Spawns several subprocesses
 
 [ $arch == ia32 ]
 dart/disassemble_aot_test: SkipByDesign # IA32 does not support AOT.
@@ -403,11 +401,9 @@
 dart/emit_aot_size_info_flag_test: SkipByDesign # This test is for VM AOT only and is quite slow (so we don't run it in debug mode).
 dart/split_aot_kernel_generation2_test: SkipByDesign # This test is for VM AOT only and is quite slow (so we don't run it in debug mode).
 dart/split_aot_kernel_generation_test: SkipByDesign # This test is for VM AOT only and is quite slow (so we don't run it in debug mode).
-dart/use_bare_instructions_flag_test: SkipByDesign # This test is for VM AOT only and is quite slow (so we don't run it in debug mode).
 dart_2/emit_aot_size_info_flag_test: SkipByDesign # This test is for VM AOT only and is quite slow (so we don't run it in debug mode).
 dart_2/split_aot_kernel_generation2_test: SkipByDesign # This test is for VM AOT only and is quite slow (so we don't run it in debug mode).
 dart_2/split_aot_kernel_generation_test: SkipByDesign # This test is for VM AOT only and is quite slow (so we don't run it in debug mode).
-dart_2/use_bare_instructions_flag_test: SkipByDesign # This test is for VM AOT only and is quite slow (so we don't run it in debug mode).
 
 [ $mode != debug || $runtime != dart_precompiled ]
 in_memory_elf_test: Skip # Tests a debug-mode flag to dart_precompiled_runtime.
@@ -427,10 +423,6 @@
 dart_2/isolates/send_object_to_spawn_uri_isolate_test: SkipByDesign # uses spawnUri
 dart_2/issue32950_test: SkipByDesign # uses spawnUri.
 
-[ $runtime != dart_precompiled || $system == android ]
-dart/bare_instructions_trampolines_test: SkipByDesign # This test is for VM AOT only (android fails due to listing interfaces).
-dart_2/bare_instructions_trampolines_test: SkipByDesign # This test is for VM AOT only (android fails due to listing interfaces).
-
 [ $hot_reload || $hot_reload_rollback ]
 dart/appjit*: SkipByDesign # Cannot reload with URI pointing to app snapshot.
 dart/disassemble_determinism_test: SkipSlow # Runs expensive fibonacci(32) computation in 2 subprocesses
diff --git a/runtime/tools/dartfuzz/gen_api_table.dart b/runtime/tools/dartfuzz/gen_api_table.dart
index 365a50a..2eb9f52 100644
--- a/runtime/tools/dartfuzz/gen_api_table.dart
+++ b/runtime/tools/dartfuzz/gen_api_table.dart
@@ -346,7 +346,7 @@
 
 Future<void> visitLibraryAtUri(AnalysisSession session, String uri) async {
   final libPath = session.uriConverter.uriToPath(Uri.parse(uri));
-  var result = await session.getResolvedLibrary2(libPath!);
+  var result = await session.getResolvedLibrary(libPath!);
   if (result is ResolvedLibraryResult) {
     visitLibrary(result.element);
   } else {
diff --git a/runtime/tools/dartfuzz/gen_type_table.dart b/runtime/tools/dartfuzz/gen_type_table.dart
index 6bd642e..a8e0868 100644
--- a/runtime/tools/dartfuzz/gen_type_table.dart
+++ b/runtime/tools/dartfuzz/gen_type_table.dart
@@ -1340,7 +1340,7 @@
 Future<void> visitLibraryAtUri(
     AnalysisSession session, String uri, Set<InterfaceType> allTypes) async {
   var libPath = session.uriConverter.uriToPath(Uri.parse(uri));
-  var result = await session.getResolvedLibrary2(libPath!);
+  var result = await session.getResolvedLibrary(libPath!);
   if (result is ResolvedLibraryResult) {
     visitLibrary(result.element, allTypes);
   } else {
diff --git a/runtime/tools/ffi/sdk_lib_ffi_generator.dart b/runtime/tools/ffi/sdk_lib_ffi_generator.dart
index d44c2ec..d32b0a1 100644
--- a/runtime/tools/ffi/sdk_lib_ffi_generator.dart
+++ b/runtime/tools/ffi/sdk_lib_ffi_generator.dart
@@ -223,7 +223,13 @@
       ? ""
       : """
   @patch
-  $typedListType asTypedList(int elements) => _asExternalTypedData(this, elements);
+  $typedListType asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<$nativeType>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, $elementSize);
+    _checkPointerAlignment(address, $elementSize);
+    return _asExternalTypedData$nativeType(this, length);
+  }
 """;
 
   if (container == "Pointer") {
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index 69dfc4b..30f1303 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -56,6 +56,9 @@
     if (!is_android) {
       libs += [ "pthread" ]
     }
+    if (!is_mac && !is_ios) {
+      libs += [ "atomic" ]
+    }
   }
 }
 
diff --git a/runtime/vm/app_snapshot.cc b/runtime/vm/app_snapshot.cc
index 11fe806..7a94ef8 100644
--- a/runtime/vm/app_snapshot.cc
+++ b/runtime/vm/app_snapshot.cc
@@ -1775,7 +1775,7 @@
     // the pool for references to other code objects (which might reside
     // in the current loading unit).
     ObjectPoolPtr pool = code->untag()->object_pool_;
-    if (s->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions) {
+    if (s->kind() == Snapshot::kFullAOT) {
       TracePool(s, pool, /*only_code=*/is_deferred);
     } else {
       if (s->InCurrentLoadingUnitOrRoot(pool)) {
@@ -1824,8 +1824,8 @@
     }
 
     if (Code::IsDiscarded(code)) {
-      ASSERT(s->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions &&
-             FLAG_dwarf_stack_traces_mode && !FLAG_retain_code_objects);
+      ASSERT(s->kind() == Snapshot::kFullAOT && FLAG_dwarf_stack_traces_mode &&
+             !FLAG_retain_code_objects);
       // Only object pool and static call table entries and the compressed
       // stack maps should be pushed.
       return;
@@ -2003,7 +2003,7 @@
     if (FLAG_write_v8_snapshot_profile_to != nullptr) {
       // If we are writing V8 snapshot profile then attribute references going
       // through the object pool and static calls to the code object itself.
-      if (kind == Snapshot::kFullAOT && FLAG_use_bare_instructions &&
+      if (kind == Snapshot::kFullAOT &&
           code->untag()->object_pool_ != ObjectPool::null()) {
         ObjectPoolPtr pool = code->untag()->object_pool_;
         // Non-empty per-code object pools should not be reachable in this mode.
@@ -2026,8 +2026,8 @@
     if (Code::IsDiscarded(code)) {
       // Only write instructions, compressed stackmaps and state bits
       // for the discarded Code objects.
-      ASSERT(kind == Snapshot::kFullAOT && FLAG_use_bare_instructions &&
-             FLAG_dwarf_stack_traces_mode && !FLAG_retain_code_objects);
+      ASSERT(kind == Snapshot::kFullAOT && FLAG_dwarf_stack_traces_mode &&
+             !FLAG_retain_code_objects);
 #if defined(DART_PRECOMPILER)
       if (FLAG_write_v8_snapshot_profile_to != nullptr) {
         // Keep the owner as a (possibly artificial) node for snapshot analysis.
@@ -2042,7 +2042,7 @@
 
     // No need to write object pool out if we are producing full AOT
     // snapshot with bare instructions.
-    if (!(kind == Snapshot::kFullAOT && FLAG_use_bare_instructions)) {
+    if (kind != Snapshot::kFullAOT) {
       if (s->InCurrentLoadingUnitOrRoot(code->untag()->object_pool_)) {
         WriteField(code, object_pool_);
       } else {
@@ -2167,7 +2167,7 @@
 
     // There would be a single global pool if this is a full AOT snapshot
     // with bare instructions.
-    if (!(d->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions)) {
+    if (d->kind() != Snapshot::kFullAOT) {
       code->untag()->object_pool_ = static_cast<ObjectPoolPtr>(d->ReadRef());
     } else {
       code->untag()->object_pool_ = ObjectPool::null();
@@ -2252,9 +2252,7 @@
     ObjectPoolPtr pool = ObjectPool::RawCast(object);
     objects_.Add(pool);
 
-    if (s->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions) {
-      // Treat pool as weak.
-    } else {
+    if (s->kind() != Snapshot::kFullAOT) {
       const intptr_t length = pool->untag()->length_;
       uint8_t* entry_bits = pool->untag()->entry_bits();
       for (intptr_t i = 0; i < length; i++) {
@@ -2280,7 +2278,7 @@
   }
 
   void WriteFill(Serializer* s) {
-    bool weak = s->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions;
+    bool weak = s->kind() == Snapshot::kFullAOT;
 
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
@@ -2387,12 +2385,10 @@
                                ObjectPool::Patchability::kPatchable);
     uword switchable_call_miss_entry_point = 0;
     uword megamorphic_call_entry_point = 0;
-    if (FLAG_use_bare_instructions) {
-      switchable_call_miss_entry_point =
-          StubCode::SwitchableCallMiss().MonomorphicEntryPoint();
-      megamorphic_call_entry_point =
-          StubCode::MegamorphicCall().MonomorphicEntryPoint();
-    }
+    switchable_call_miss_entry_point =
+        StubCode::SwitchableCallMiss().MonomorphicEntryPoint();
+    megamorphic_call_entry_point =
+        StubCode::MegamorphicCall().MonomorphicEntryPoint();
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
@@ -2420,13 +2416,11 @@
           }
 #if defined(DART_PRECOMPILED_RUNTIME)
           case ObjectPool::EntryType::kSwitchableCallMissEntryPoint:
-            ASSERT(FLAG_use_bare_instructions);
             pool->untag()->entry_bits()[j] = immediate_bits;
             entry.raw_value_ =
                 static_cast<intptr_t>(switchable_call_miss_entry_point);
             break;
           case ObjectPool::EntryType::kMegamorphicCallEntryPoint:
-            ASSERT(FLAG_use_bare_instructions);
             pool->untag()->entry_bits()[j] = immediate_bits;
             entry.raw_value_ =
                 static_cast<intptr_t>(megamorphic_call_entry_point);
@@ -4377,7 +4371,7 @@
   void PostLoad(Deserializer* d, const Array& refs, bool primary) {
     // We only cache the entry point in bare instructions mode (as we need
     // to load the function anyway otherwise).
-    if (d->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions) {
+    if (d->kind() == Snapshot::kFullAOT) {
       auto& closure = Closure::Handle(d->zone());
       auto& func = Function::Handle(d->zone());
       for (intptr_t i = start_index_; i < stop_index_; i++) {
@@ -5686,43 +5680,48 @@
 
 class ProgramSerializationRoots : public SerializationRoots {
  public:
+#define RESET_ROOT_LIST(V)                                                     \
+  V(symbol_table, Array, HashTables::New<CanonicalStringSet>(4))               \
+  V(canonical_types, Array, HashTables::New<CanonicalTypeSet>(4))              \
+  V(canonical_function_types, Array,                                           \
+    HashTables::New<CanonicalFunctionTypeSet>(4))                              \
+  V(canonical_type_arguments, Array,                                           \
+    HashTables::New<CanonicalTypeArgumentsSet>(4))                             \
+  V(canonical_type_parameters, Array,                                          \
+    HashTables::New<CanonicalTypeParameterSet>(4))                             \
+  ONLY_IN_PRODUCT(ONLY_IN_AOT(                                                 \
+      V(closure_functions, GrowableObjectArray, GrowableObjectArray::null())))
+
   ProgramSerializationRoots(ZoneGrowableArray<Object*>* base_objects,
                             ObjectStore* object_store,
                             Snapshot::Kind snapshot_kind)
       : base_objects_(base_objects),
         object_store_(object_store),
-        dispatch_table_entries_(Array::Handle()),
-        saved_symbol_table_(Array::Handle()),
-        saved_canonical_types_(Array::Handle()),
-        saved_canonical_function_types_(Array::Handle()),
-        saved_canonical_type_arguments_(Array::Handle()),
-        saved_canonical_type_parameters_(Array::Handle()) {
-    saved_symbol_table_ = object_store->symbol_table();
-    object_store->set_symbol_table(
-        Array::Handle(HashTables::New<CanonicalStringSet>(4)));
-    saved_canonical_types_ = object_store->canonical_types();
-    object_store->set_canonical_types(
-        Array::Handle(HashTables::New<CanonicalTypeSet>(4)));
-    saved_canonical_function_types_ = object_store->canonical_function_types();
-    object_store->set_canonical_function_types(
-        Array::Handle(HashTables::New<CanonicalFunctionTypeSet>(4)));
-    saved_canonical_type_arguments_ = object_store->canonical_type_arguments();
-    object_store->set_canonical_type_arguments(
-        Array::Handle(HashTables::New<CanonicalTypeArgumentsSet>(4)));
-    saved_canonical_type_parameters_ =
-        object_store->canonical_type_parameters();
-    object_store->set_canonical_type_parameters(
-        Array::Handle(HashTables::New<CanonicalTypeParameterSet>(4)));
+        snapshot_kind_(snapshot_kind) {
+#define ONLY_IN_AOT(code)                                                      \
+  if (snapshot_kind_ == Snapshot::kFullAOT) {                                  \
+    code                                                                       \
+  }
+#define SAVE_AND_RESET_ROOT(name, Type, init)                                  \
+  do {                                                                         \
+    saved_##name##_ = object_store->name();                                    \
+    object_store->set_##name(Type::Handle(init));                              \
+  } while (0);
+
+    RESET_ROOT_LIST(SAVE_AND_RESET_ROOT)
+#undef SAVE_AND_RESET_ROOT
+#undef ONLY_IN_AOT
   }
   ~ProgramSerializationRoots() {
-    object_store_->set_symbol_table(saved_symbol_table_);
-    object_store_->set_canonical_types(saved_canonical_types_);
-    object_store_->set_canonical_function_types(
-        saved_canonical_function_types_);
-    object_store_->set_canonical_type_arguments(
-        saved_canonical_type_arguments_);
-    object_store_->set_canonical_type_parameters(
-        saved_canonical_type_parameters_);
+#define ONLY_IN_AOT(code)                                                      \
+  if (snapshot_kind_ == Snapshot::kFullAOT) {                                  \
+    code                                                                       \
+  }
+#define RESTORE_ROOT(name, Type, init)                                         \
+  object_store_->set_##name(saved_##name##_);
+    RESET_ROOT_LIST(RESTORE_ROOT)
+#undef RESTORE_ROOT
+#undef ONLY_IN_AOT
   }
 
   void AddBaseObjects(Serializer* s) {
@@ -5776,14 +5775,16 @@
   }
 
  private:
-  ZoneGrowableArray<Object*>* base_objects_;
-  ObjectStore* object_store_;
-  Array& dispatch_table_entries_;
-  Array& saved_symbol_table_;
-  Array& saved_canonical_types_;
-  Array& saved_canonical_function_types_;
-  Array& saved_canonical_type_arguments_;
-  Array& saved_canonical_type_parameters_;
+  ZoneGrowableArray<Object*>* const base_objects_;
+  ObjectStore* const object_store_;
+  const Snapshot::Kind snapshot_kind_;
+  Array& dispatch_table_entries_ = Array::Handle();
+
+#define ONLY_IN_AOT(code) code
+#define DECLARE_FIELD(name, Type, init) Type& saved_##name##_ = Type::Handle();
+  RESET_ROOT_LIST(DECLARE_FIELD)
+#undef DECLARE_FIELD
+#undef ONLY_IN_AOT
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -5856,20 +5857,16 @@
       const Object* deferred_object = (*unit_->deferred_objects())[i];
       ASSERT(deferred_object->IsCode());
       CodePtr code = static_cast<CodePtr>(deferred_object->ptr());
-      if (FLAG_use_bare_instructions) {
-        ObjectPoolPtr pool = code->untag()->object_pool_;
-        if (pool != ObjectPool::null()) {
-          const intptr_t length = pool->untag()->length_;
-          uint8_t* entry_bits = pool->untag()->entry_bits();
-          for (intptr_t i = 0; i < length; i++) {
-            auto entry_type = ObjectPool::TypeBits::decode(entry_bits[i]);
-            if (entry_type == ObjectPool::EntryType::kTaggedObject) {
-              s->Push(pool->untag()->data()[i].raw_obj_);
-            }
+      ObjectPoolPtr pool = code->untag()->object_pool_;
+      if (pool != ObjectPool::null()) {
+        const intptr_t length = pool->untag()->length_;
+        uint8_t* entry_bits = pool->untag()->entry_bits();
+        for (intptr_t i = 0; i < length; i++) {
+          auto entry_type = ObjectPool::TypeBits::decode(entry_bits[i]);
+          if (entry_type == ObjectPool::EntryType::kTaggedObject) {
+            s->Push(pool->untag()->data()[i].raw_obj_);
           }
         }
-      } else {
-        s->Push(code->untag()->object_pool_);
       }
       s->Push(code->untag()->compressed_stackmaps_);
       s->Push(code->untag()->code_source_map_);
@@ -5894,33 +5891,28 @@
       ASSERT(!Code::IsDiscarded(code));
       s->WriteInstructions(code->untag()->instructions_,
                            code->untag()->unchecked_offset_, code, false);
-      if (!FLAG_use_bare_instructions) {
-        s->WriteRootRef(code->untag()->object_pool_, "deferred-code");
-      }
       s->WriteRootRef(code->untag()->compressed_stackmaps_, "deferred-code");
       s->WriteRootRef(code->untag()->code_source_map_, "deferred-code");
     }
 
-    if (FLAG_use_bare_instructions) {
-      ObjectPoolPtr pool =
-          s->isolate_group()->object_store()->global_object_pool();
-      const intptr_t length = pool->untag()->length_;
-      uint8_t* entry_bits = pool->untag()->entry_bits();
-      intptr_t last_write = 0;
-      for (intptr_t i = 0; i < length; i++) {
-        auto entry_type = ObjectPool::TypeBits::decode(entry_bits[i]);
-        if (entry_type == ObjectPool::EntryType::kTaggedObject) {
-          if (s->IsWritten(pool->untag()->data()[i].raw_obj_)) {
-            intptr_t skip = i - last_write;
-            s->WriteUnsigned(skip);
-            s->WriteRootRef(pool->untag()->data()[i].raw_obj_,
-                            "deferred-literal");
-            last_write = i;
-          }
+    ObjectPoolPtr pool =
+        s->isolate_group()->object_store()->global_object_pool();
+    const intptr_t length = pool->untag()->length_;
+    uint8_t* entry_bits = pool->untag()->entry_bits();
+    intptr_t last_write = 0;
+    for (intptr_t i = 0; i < length; i++) {
+      auto entry_type = ObjectPool::TypeBits::decode(entry_bits[i]);
+      if (entry_type == ObjectPool::EntryType::kTaggedObject) {
+        if (s->IsWritten(pool->untag()->data()[i].raw_obj_)) {
+          intptr_t skip = i - last_write;
+          s->WriteUnsigned(skip);
+          s->WriteRootRef(pool->untag()->data()[i].raw_obj_,
+                          "deferred-literal");
+          last_write = i;
         }
       }
-      s->WriteUnsigned(length - last_write);
     }
+    s->WriteUnsigned(length - last_write);
 #endif
   }
 
@@ -5959,8 +5951,7 @@
         ASSERT(unchecked_entry_point != 0);
         func->untag()->unchecked_entry_point_ = unchecked_entry_point;
 #if defined(DART_PRECOMPILED_RUNTIME)
-        if (FLAG_use_bare_instructions &&
-            func->untag()->data()->IsHeapObject() &&
+        if (func->untag()->data()->IsHeapObject() &&
             func->untag()->data()->IsClosureData()) {
           // For closure functions in bare instructions mode, also update the
           // cache inside the static implicit closure object, if any.
@@ -5973,27 +5964,22 @@
         }
 #endif
       }
-      if (!FLAG_use_bare_instructions) {
-        code->untag()->object_pool_ = static_cast<ObjectPoolPtr>(d->ReadRef());
-      }
       code->untag()->compressed_stackmaps_ =
           static_cast<CompressedStackMapsPtr>(d->ReadRef());
       code->untag()->code_source_map_ =
           static_cast<CodeSourceMapPtr>(d->ReadRef());
     }
 
-    if (FLAG_use_bare_instructions) {
-      ObjectPoolPtr pool =
-          d->isolate_group()->object_store()->global_object_pool();
-      const intptr_t length = pool->untag()->length_;
-      uint8_t* entry_bits = pool->untag()->entry_bits();
-      for (intptr_t i = d->ReadUnsigned(); i < length; i += d->ReadUnsigned()) {
-        auto entry_type = ObjectPool::TypeBits::decode(entry_bits[i]);
-        ASSERT(entry_type == ObjectPool::EntryType::kTaggedObject);
-        // The existing entry will usually be null, but it might also be an
-        // equivalent object that was duplicated in another loading unit.
-        pool->untag()->data()[i].raw_obj_ = d->ReadRef();
-      }
+    ObjectPoolPtr pool =
+        d->isolate_group()->object_store()->global_object_pool();
+    const intptr_t length = pool->untag()->length_;
+    uint8_t* entry_bits = pool->untag()->entry_bits();
+    for (intptr_t i = d->ReadUnsigned(); i < length; i += d->ReadUnsigned()) {
+      auto entry_type = ObjectPool::TypeBits::decode(entry_bits[i]);
+      ASSERT(entry_type == ObjectPool::EntryType::kTaggedObject);
+      // The existing entry will usually be null, but it might also be an
+      // equivalent object that was duplicated in another loading unit.
+      pool->untag()->data()[i].raw_obj_ = d->ReadRef();
     }
 
     // Reinitialize the dispatch table by rereading the table's serialization
@@ -6629,7 +6615,7 @@
   }
 
 #if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32)
-  if ((kind() == Snapshot::kFullAOT) && FLAG_use_bare_instructions) {
+  if (kind() == Snapshot::kFullAOT) {
     // Group the code objects whose instructions are not being deferred in this
     // snapshot unit in the order they will be written: first the code objects
     // encountered for this first time in this unit being written by the
@@ -6683,7 +6669,7 @@
         {offset_space, offset});
   }
 
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     ASSERT(offset != 0);
     RELEASE_ASSERT(offset >= previous_text_offset_);
     const uint32_t delta = offset - previous_text_offset_;
@@ -6999,8 +6985,7 @@
   } else {
     WriteUnsigned(0);
   }
-  ASSERT((instructions_table_len_ == 0) ||
-         (FLAG_precompiled_mode && FLAG_use_bare_instructions));
+  ASSERT((instructions_table_len_ == 0) || FLAG_precompiled_mode);
   WriteUnsigned(instructions_table_len_);
 
   for (SerializationCluster* cluster : clusters) {
@@ -7703,75 +7688,56 @@
   if (deferred) {
     ASSERT(!discarded);
 #if defined(DART_PRECOMPILED_RUNTIME)
-    if (FLAG_use_bare_instructions) {
-      uword entry_point = StubCode::NotLoaded().EntryPoint();
-      code->untag()->entry_point_ = entry_point;
-      code->untag()->unchecked_entry_point_ = entry_point;
-      code->untag()->monomorphic_entry_point_ = entry_point;
-      code->untag()->monomorphic_unchecked_entry_point_ = entry_point;
-      code->untag()->instructions_length_ = 0;
-      return;
-    }
-#endif
-    InstructionsPtr instr = StubCode::NotLoaded().instructions();
-    uint32_t unchecked_offset = 0;
-    code->untag()->instructions_ = instr;
-#if defined(DART_PRECOMPILED_RUNTIME)
-    code->untag()->instructions_length_ = Instructions::Size(instr);
+    uword entry_point = StubCode::NotLoaded().EntryPoint();
+    code->untag()->entry_point_ = entry_point;
+    code->untag()->unchecked_entry_point_ = entry_point;
+    code->untag()->monomorphic_entry_point_ = entry_point;
+    code->untag()->monomorphic_unchecked_entry_point_ = entry_point;
+    code->untag()->instructions_length_ = 0;
+    return;
 #else
-    code->untag()->unchecked_offset_ = unchecked_offset;
+    UNREACHABLE();
 #endif
-    Code::InitializeCachedEntryPointsFrom(code, instr, unchecked_offset);
-    return;
   }
 
 #if defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_use_bare_instructions) {
-    previous_text_offset_ += ReadUnsigned();
-    const uword payload_start =
-        image_reader_->GetBareInstructionsAt(previous_text_offset_);
-    const uint32_t payload_info = ReadUnsigned();
-    const uint32_t unchecked_offset = payload_info >> 1;
-    const bool has_monomorphic_entrypoint = (payload_info & 0x1) == 0x1;
+  previous_text_offset_ += ReadUnsigned();
+  const uword payload_start =
+      image_reader_->GetBareInstructionsAt(previous_text_offset_);
+  const uint32_t payload_info = ReadUnsigned();
+  const uint32_t unchecked_offset = payload_info >> 1;
+  const bool has_monomorphic_entrypoint = (payload_info & 0x1) == 0x1;
 
-    const uword entry_offset = has_monomorphic_entrypoint
-                                   ? Instructions::kPolymorphicEntryOffsetAOT
-                                   : 0;
-    const uword monomorphic_entry_offset =
-        has_monomorphic_entrypoint ? Instructions::kMonomorphicEntryOffsetAOT
-                                   : 0;
+  const uword entry_offset =
+      has_monomorphic_entrypoint ? Instructions::kPolymorphicEntryOffsetAOT : 0;
+  const uword monomorphic_entry_offset =
+      has_monomorphic_entrypoint ? Instructions::kMonomorphicEntryOffsetAOT : 0;
 
-    const uword entry_point = payload_start + entry_offset;
-    const uword monomorphic_entry_point =
-        payload_start + monomorphic_entry_offset;
+  const uword entry_point = payload_start + entry_offset;
+  const uword monomorphic_entry_point =
+      payload_start + monomorphic_entry_offset;
 
-    ObjectPtr code_descriptor = code;
-    if (discarded) {
-      code_descriptor = static_cast<CompressedStackMapsPtr>(ReadRef());
-    }
-
-    instructions_table_.SetEntryAt(instructions_index_++, payload_start,
-                                   has_monomorphic_entrypoint, code_descriptor);
-
-    if (!discarded) {
-      // There are no serialized RawInstructions objects in this mode.
-      code->untag()->instructions_ = Instructions::null();
-      code->untag()->entry_point_ = entry_point;
-      code->untag()->unchecked_entry_point_ = entry_point + unchecked_offset;
-      code->untag()->monomorphic_entry_point_ = monomorphic_entry_point;
-      code->untag()->monomorphic_unchecked_entry_point_ =
-          monomorphic_entry_point + unchecked_offset;
-    }
-    return;
+  ObjectPtr code_descriptor = code;
+  if (discarded) {
+    code_descriptor = static_cast<CompressedStackMapsPtr>(ReadRef());
   }
-#endif
 
+  instructions_table_.SetEntryAt(instructions_index_++, payload_start,
+                                 has_monomorphic_entrypoint, code_descriptor);
+
+  if (!discarded) {
+    // There are no serialized RawInstructions objects in this mode.
+    code->untag()->instructions_ = Instructions::null();
+    code->untag()->entry_point_ = entry_point;
+    code->untag()->unchecked_entry_point_ = entry_point + unchecked_offset;
+    code->untag()->monomorphic_entry_point_ = monomorphic_entry_point;
+    code->untag()->monomorphic_unchecked_entry_point_ =
+        monomorphic_entry_point + unchecked_offset;
+  }
+#else
   InstructionsPtr instr = image_reader_->GetInstructionsAt(Read<uint32_t>());
   uint32_t unchecked_offset = ReadUnsigned();
   code->untag()->instructions_ = instr;
-#if defined(DART_PRECOMPILED_RUNTIME)
-  code->untag()->instructions_length_ = Instructions::Size(instr);
-#else
   code->untag()->unchecked_offset_ = unchecked_offset;
   if (kind() == Snapshot::kFullJIT) {
     const uint32_t active_offset = Read<uint32_t>();
@@ -7779,36 +7745,34 @@
     unchecked_offset = ReadUnsigned();
   }
   code->untag()->active_instructions_ = instr;
-#endif
   Code::InitializeCachedEntryPointsFrom(code, instr, unchecked_offset);
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
 void Deserializer::EndInstructions() {
 #if defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_use_bare_instructions) {
-    uword previous_end = image_reader_->GetBareInstructionsEnd();
-    for (intptr_t i = instructions_index_ - 1; i >= 0; --i) {
-      ObjectPtr descriptor = instructions_table_.DescriptorAt(i);
-      uword start = instructions_table_.PayloadStartAt(i);
-      ASSERT(start <= previous_end);
-      if (descriptor->IsCode()) {
-        CodePtr code = static_cast<CodePtr>(descriptor);
-        code->untag()->instructions_length_ = previous_end - start;
-      }
-      previous_end = start;
+  uword previous_end = image_reader_->GetBareInstructionsEnd();
+  for (intptr_t i = instructions_index_ - 1; i >= 0; --i) {
+    ObjectPtr descriptor = instructions_table_.DescriptorAt(i);
+    uword start = instructions_table_.PayloadStartAt(i);
+    ASSERT(start <= previous_end);
+    if (descriptor->IsCode()) {
+      CodePtr code = static_cast<CodePtr>(descriptor);
+      code->untag()->instructions_length_ = previous_end - start;
     }
+    previous_end = start;
+  }
 
-    ObjectStore* object_store = IsolateGroup::Current()->object_store();
-    GrowableObjectArray& tables =
-        GrowableObjectArray::Handle(zone_, object_store->instructions_tables());
-    if (tables.IsNull()) {
-      tables = GrowableObjectArray::New(Heap::kOld);
-      object_store->set_instructions_tables(tables);
-    }
-    if ((tables.Length() == 0) ||
-        (tables.At(tables.Length() - 1) != instructions_table_.ptr())) {
-      tables.Add(instructions_table_, Heap::kOld);
-    }
+  ObjectStore* object_store = IsolateGroup::Current()->object_store();
+  GrowableObjectArray& tables =
+      GrowableObjectArray::Handle(zone_, object_store->instructions_tables());
+  if (tables.IsNull()) {
+    tables = GrowableObjectArray::New(Heap::kOld);
+    object_store->set_instructions_tables(tables);
+  }
+  if ((tables.Length() == 0) ||
+      (tables.At(tables.Length() - 1) != instructions_table_.ptr())) {
+    tables.Add(instructions_table_, Heap::kOld);
   }
 #endif
 }
@@ -7851,7 +7815,7 @@
 
 #if defined(DART_PRECOMPILED_RUNTIME)
   if (instructions_table_len > 0) {
-    ASSERT(FLAG_precompiled_mode && FLAG_use_bare_instructions);
+    ASSERT(FLAG_precompiled_mode);
     const uword start_pc = image_reader_->GetBareInstructionsAt(0);
     const uword end_pc = image_reader_->GetBareInstructionsEnd();
     instructions_table_ =
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 6f6d67d..adade03 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -160,7 +160,7 @@
   V(DateTime_localTimeZoneAdjustmentInSeconds, 0)                              \
   V(AssertionError_throwNew, 3)                                                \
   V(AssertionError_throwNewSource, 4)                                          \
-  V(Async_rethrow, 2)                                                          \
+  V(Error_throwWithStackTrace, 2)                                              \
   V(StackTrace_current, 0)                                                     \
   V(TypeError_throwNew, 4)                                                     \
   V(FallThroughError_throwNew, 1)                                              \
@@ -400,7 +400,16 @@
   V(Ffi_dl_lookup, 2)                                                          \
   V(Ffi_dl_getHandle, 1)                                                       \
   V(Ffi_dl_providesSymbol, 2)                                                  \
-  V(Ffi_asExternalTypedData, 2)                                                \
+  V(Ffi_asExternalTypedDataInt8, 2)                                            \
+  V(Ffi_asExternalTypedDataInt16, 2)                                           \
+  V(Ffi_asExternalTypedDataInt32, 2)                                           \
+  V(Ffi_asExternalTypedDataInt64, 2)                                           \
+  V(Ffi_asExternalTypedDataUint8, 2)                                           \
+  V(Ffi_asExternalTypedDataUint16, 2)                                          \
+  V(Ffi_asExternalTypedDataUint32, 2)                                          \
+  V(Ffi_asExternalTypedDataUint64, 2)                                          \
+  V(Ffi_asExternalTypedDataFloat, 2)                                           \
+  V(Ffi_asExternalTypedDataDouble, 2)                                          \
   V(Ffi_dl_processLibrary, 0)                                                  \
   V(Ffi_dl_executableLibrary, 0)                                               \
   V(Ffi_GetFfiNativeResolver, 0)                                               \
diff --git a/runtime/vm/class_id.h b/runtime/vm/class_id.h
index bc52316..9b647b3 100644
--- a/runtime/vm/class_id.h
+++ b/runtime/vm/class_id.h
@@ -140,7 +140,7 @@
   V(Int32x4Array)                                                              \
   V(Float64x2Array)
 
-#define CLASS_LIST_FFI_NUMERIC(V)                                              \
+#define CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(V)                                   \
   V(Int8)                                                                      \
   V(Int16)                                                                     \
   V(Int32)                                                                     \
@@ -149,10 +149,13 @@
   V(Uint16)                                                                    \
   V(Uint32)                                                                    \
   V(Uint64)                                                                    \
-  V(IntPtr)                                                                    \
   V(Float)                                                                     \
   V(Double)
 
+#define CLASS_LIST_FFI_NUMERIC(V)                                              \
+  CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(V)                                         \
+  V(IntPtr)
+
 #define CLASS_LIST_FFI_TYPE_MARKER(V)                                          \
   CLASS_LIST_FFI_NUMERIC(V)                                                    \
   V(Void)                                                                      \
diff --git a/runtime/vm/closure_functions_cache.cc b/runtime/vm/closure_functions_cache.cc
index ff62680..49badbb 100644
--- a/runtime/vm/closure_functions_cache.cc
+++ b/runtime/vm/closure_functions_cache.cc
@@ -73,7 +73,9 @@
   return Function::null();
 }
 
-void ClosureFunctionsCache::AddClosureFunctionLocked(const Function& function) {
+void ClosureFunctionsCache::AddClosureFunctionLocked(
+    const Function& function,
+    bool allow_implicit_closure_functions /* = false */) {
   ASSERT(!Compiler::IsBackgroundCompilation());
 
   auto thread = Thread::Current();
@@ -86,7 +88,8 @@
   const auto& closures =
       GrowableObjectArray::Handle(zone, object_store->closure_functions());
   ASSERT(!closures.IsNull());
-  ASSERT(function.IsNonImplicitClosureFunction());
+  ASSERT(allow_implicit_closure_functions ||
+         function.IsNonImplicitClosureFunction());
   closures.Add(function, Heap::kOld);
 }
 
diff --git a/runtime/vm/closure_functions_cache.h b/runtime/vm/closure_functions_cache.h
index 019c12b..c52c2e6 100644
--- a/runtime/vm/closure_functions_cache.h
+++ b/runtime/vm/closure_functions_cache.h
@@ -49,7 +49,13 @@
   static FunctionPtr LookupClosureFunctionLocked(const Function& parent,
                                                  TokenPosition token_pos);
 
-  static void AddClosureFunctionLocked(const Function& function);
+  // Normally implicit closure functions are not added to this cache, however
+  // during AOT compilation we might add those implicit closure functions
+  // that have their original functions shaken to allow ProgramWalker to
+  // discover them.
+  static void AddClosureFunctionLocked(
+      const Function& function,
+      bool allow_implicit_closure_functions = false);
 
   static intptr_t FindClosureIndex(const Function& needle);
   static FunctionPtr ClosureFunctionFromIndex(intptr_t idx);
diff --git a/runtime/vm/code_descriptors.cc b/runtime/vm/code_descriptors.cc
index dd8bc1d..87625f3 100644
--- a/runtime/vm/code_descriptors.cc
+++ b/runtime/vm/code_descriptors.cc
@@ -417,6 +417,14 @@
   }
 }
 
+void CodeSourceMapBuilder::WriteFunctionEntrySourcePosition(
+    const InstructionSource& source) {
+  ASSERT(written_pc_offset_ == 0 && buffered_pc_offset_ == 0);
+  ASSERT(stream_.bytes_written() == 0);
+  WriteChangePosition(source.token_pos);
+  WriteAdvancePC(0);
+}
+
 void CodeSourceMapBuilder::BeginCodeSourceRange(
     int32_t pc_offset,
     const InstructionSource& source) {
diff --git a/runtime/vm/code_descriptors.h b/runtime/vm/code_descriptors.h
index ac29be7..bd0d358 100644
--- a/runtime/vm/code_descriptors.h
+++ b/runtime/vm/code_descriptors.h
@@ -246,6 +246,7 @@
   void NoteNullCheck(int32_t pc_offset,
                      const InstructionSource& source,
                      intptr_t name_index);
+  void WriteFunctionEntrySourcePosition(const InstructionSource& source);
 
   // If source is from an inlined call, returns the token position of the
   // original call in the root function, otherwise the source's token position.
diff --git a/runtime/vm/code_patcher_arm.cc b/runtime/vm/code_patcher_arm.cc
index 2fc5361..11d15ea 100644
--- a/runtime/vm/code_patcher_arm.cc
+++ b/runtime/vm/code_patcher_arm.cc
@@ -96,7 +96,7 @@
     const Code& caller_code,
     const Object& data,
     const Code& target) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     BareSwitchableCallPattern call(return_address);
     call.SetData(data);
     call.SetTarget(target);
@@ -109,7 +109,7 @@
 
 uword CodePatcher::GetSwitchableCallTargetEntryAt(uword return_address,
                                                   const Code& caller_code) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     BareSwitchableCallPattern call(return_address);
     return call.target_entry();
   } else {
@@ -120,7 +120,7 @@
 
 ObjectPtr CodePatcher::GetSwitchableCallDataAt(uword return_address,
                                                const Code& caller_code) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     BareSwitchableCallPattern call(return_address);
     return call.data();
   } else {
diff --git a/runtime/vm/code_patcher_arm64.cc b/runtime/vm/code_patcher_arm64.cc
index c399fd1..e8217b6 100644
--- a/runtime/vm/code_patcher_arm64.cc
+++ b/runtime/vm/code_patcher_arm64.cc
@@ -132,7 +132,7 @@
     const Code& caller_code,
     const Object& data,
     const Code& target) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     BareSwitchableCallPattern call(return_address);
     call.SetData(data);
     call.SetTarget(target);
@@ -145,7 +145,7 @@
 
 uword CodePatcher::GetSwitchableCallTargetEntryAt(uword return_address,
                                                   const Code& caller_code) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     BareSwitchableCallPattern call(return_address);
     return call.target_entry();
   } else {
@@ -156,7 +156,7 @@
 
 ObjectPtr CodePatcher::GetSwitchableCallDataAt(uword return_address,
                                                const Code& caller_code) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     BareSwitchableCallPattern call(return_address);
     return call.data();
   } else {
diff --git a/runtime/vm/code_patcher_x64.cc b/runtime/vm/code_patcher_x64.cc
index ce1d9f2..7a846f4 100644
--- a/runtime/vm/code_patcher_x64.cc
+++ b/runtime/vm/code_patcher_x64.cc
@@ -486,7 +486,7 @@
     const Code& caller_code,
     const Object& data,
     const Code& target) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     BareSwitchableCall call(return_address);
     call.SetData(data);
     call.SetTarget(target);
@@ -499,7 +499,7 @@
 
 uword CodePatcher::GetSwitchableCallTargetEntryAt(uword return_address,
                                                   const Code& caller_code) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     BareSwitchableCall call(return_address);
     return call.target_entry();
   } else {
@@ -510,7 +510,7 @@
 
 ObjectPtr CodePatcher::GetSwitchableCallDataAt(uword return_address,
                                                const Code& caller_code) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     BareSwitchableCall call(return_address);
     return call.data();
   } else {
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 6c373a5..3726ba2 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -141,12 +141,11 @@
   // The object is a function and symbolic stack traces are enabled.
   static constexpr const char* kSymbolicStackTraces =
       "needed for symbolic stack traces";
-  // The object is a function that is only used via its implicit closure
-  // function, into which it was inlined.
-  static constexpr const char* kInlinedIntoICF =
-      "inlined into implicit closure function";
   // The object is a parent function function of a non-inlined local function.
   static constexpr const char* kLocalParent = "parent of a local function";
+  // The object is a main function of the root library.
+  static constexpr const char* kMainFunction =
+      "this is main function of the root library";
   // The object has an entry point pragma that requires it be retained.
   static constexpr const char* kEntryPointPragma = "entry point pragma";
   // The function is a target of FFI callback.
@@ -456,12 +455,10 @@
       retained_reasons_writer_ = &reasons_writer;
     }
 
-    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_builder_.InitializeWithZone(zone_);
-    }
+    // 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_builder_.InitializeWithZone(zone_);
 
     {
       HANDLESCOPE(T);
@@ -482,7 +479,7 @@
       // as well as other type checks.
       HierarchyInfo hierarchy_info(T);
 
-      if (FLAG_use_bare_instructions && FLAG_use_table_dispatch) {
+      if (FLAG_use_table_dispatch) {
         dispatch_table_generator_ = new compiler::DispatchTableGenerator(Z);
         dispatch_table_generator_->Initialize(IG->class_table());
       }
@@ -490,7 +487,7 @@
       // Precompile constructors to compute information such as
       // optimized instruction count (used in inlining heuristics).
       ClassFinalizer::ClearAllCode(
-          /*including_nonchanging_cids=*/FLAG_use_bare_instructions);
+          /*including_nonchanging_cids=*/true);
 
       {
         CompilerState state(thread_, /*is_aot=*/true, /*is_optimizing=*/true);
@@ -498,14 +495,14 @@
       }
 
       ClassFinalizer::ClearAllCode(
-          /*including_nonchanging_cids=*/FLAG_use_bare_instructions);
+          /*including_nonchanging_cids=*/true);
 
       tracer_ = PrecompilerTracer::StartTracingIfRequested(this);
 
       // 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::LazyCompile();
@@ -572,7 +569,7 @@
       // [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.
@@ -724,13 +721,10 @@
 
 void Precompiler::AddRoots() {
   HANDLESCOPE(T);
-  // Note that <rootlibrary>.main is not a root. The appropriate main will be
-  // discovered through _getMainClosure.
-
   AddSelector(Symbols::NoSuchMethod());
-
   AddSelector(Symbols::Call());  // For speed, not correctness.
 
+  // Add main as an entry point.
   const Library& lib = Library::Handle(IG->object_store()->root_library());
   if (lib.IsNull()) {
     const String& msg = String::Handle(
@@ -740,22 +734,26 @@
   }
 
   const String& name = String::Handle(String::New("main"));
-  const Object& main_closure = Object::Handle(lib.GetFunctionClosure(name));
-  if (main_closure.IsClosure()) {
-    if (lib.LookupLocalFunction(name) == Function::null()) {
-      // Check whether the function is in exported namespace of library, in
-      // this case we have to retain the root library caches.
-      if (lib.LookupFunctionAllowPrivate(name) != Function::null() ||
-          lib.LookupReExport(name) != Object::null()) {
-        retain_root_library_caches_ = true;
-      }
+  Function& main = Function::Handle(lib.LookupFunctionAllowPrivate(name));
+  if (main.IsNull()) {
+    const Object& obj = Object::Handle(lib.LookupReExport(name));
+    if (obj.IsFunction()) {
+      main ^= obj.ptr();
     }
-    AddConstObject(Closure::Cast(main_closure));
-  } else if (main_closure.IsError()) {
-    const Error& error = Error::Cast(main_closure);
-    String& msg =
-        String::Handle(Z, String::NewFormatted("Cannot find main closure %s\n",
-                                               error.ToErrorCString()));
+  }
+  if (!main.IsNull()) {
+    if (lib.LookupLocalFunction(name) == Function::null()) {
+      retain_root_library_caches_ = true;
+    }
+    AddRetainReason(main, RetainReasons::kMainFunction);
+    AddTypesOf(main);
+    // Create closure object from main.
+    main = main.ImplicitClosureFunction();
+    AddConstObject(Closure::Handle(main.ImplicitStaticClosure()));
+  } else {
+    String& msg = String::Handle(
+        Z, String::NewFormatted("Cannot find main in library %s\n",
+                                lib.ToCString()));
     Jump(Error::Handle(Z, ApiError::New(msg)));
     UNREACHABLE();
   }
@@ -853,9 +851,7 @@
 
 void Precompiler::ProcessFunction(const Function& function) {
   HANDLESCOPE(T);
-  const intptr_t gop_offset =
-      FLAG_use_bare_instructions ? global_object_pool_builder()->CurrentLength()
-                                 : 0;
+  const intptr_t gop_offset = global_object_pool_builder()->CurrentLength();
   RELEASE_ASSERT(!function.HasCode());
   // Ffi trampoline functions have no signature.
   ASSERT(function.kind() == UntaggedFunction::kFfiTrampoline ||
@@ -949,7 +945,7 @@
   // rather than scanning global object pool - because we want to include
   // *all* outgoing references into the trace. Scanning GOP would exclude
   // references that have been deduplicated.
-  if (FLAG_use_bare_instructions && !is_tracing()) {
+  if (!is_tracing()) {
     for (intptr_t i = gop_offset;
          i < global_object_pool_builder()->CurrentLength(); i++) {
       const auto& wrapper_entry = global_object_pool_builder()->EntryAt(i);
@@ -1442,7 +1438,7 @@
 }
 
 void Precompiler::AddTableSelector(const compiler::TableSelector* selector) {
-  ASSERT(FLAG_use_bare_instructions && FLAG_use_table_dispatch);
+  ASSERT(FLAG_use_table_dispatch);
 
   if (is_tracing()) {
     tracer_->WriteTableSelectorRef(selector->id);
@@ -1455,7 +1451,7 @@
 }
 
 bool Precompiler::IsHitByTableSelector(const Function& function) {
-  if (!(FLAG_use_bare_instructions && FLAG_use_table_dispatch)) {
+  if (!FLAG_use_table_dispatch) {
     return false;
   }
 
@@ -1930,25 +1926,25 @@
       for (intptr_t j = 0; j < functions.Length(); j++) {
         SafepointWriteRwLocker ml(T, T->isolate_group()->program_lock());
         function ^= functions.At(j);
-        bool retain = possibly_retained_functions_.ContainsKey(function);
-        if (!retain && function.HasImplicitClosureFunction()) {
-          // It can happen that all uses of an implicit closure inline their
-          // target function, leaving the target function uncompiled. Keep
-          // the target function anyway so we can enumerate it to bind its
-          // static calls, etc.
-          function2 = function.ImplicitClosureFunction();
-          retain = function2.HasCode();
-          if (retain) {
-            AddRetainReason(function, RetainReasons::kInlinedIntoICF);
-          }
-        }
-        if (retain) {
-          function.DropUncompiledImplicitClosureFunction();
+        function.DropUncompiledImplicitClosureFunction();
+
+        const bool retained =
+            possibly_retained_functions_.ContainsKey(function);
+        if (retained) {
           AddTypesOf(function);
-          if (function.HasImplicitClosureFunction()) {
-            function2 = function.ImplicitClosureFunction();
-            if (possibly_retained_functions_.ContainsKey(function2)) {
-              AddTypesOf(function2);
+        }
+        if (function.HasImplicitClosureFunction()) {
+          function2 = function.ImplicitClosureFunction();
+
+          if (possibly_retained_functions_.ContainsKey(function2)) {
+            AddTypesOf(function2);
+            // If function has @pragma('vm:entry-point', 'get') we need to keep
+            // the function itself around so that runtime could find it and
+            // get to the implicit closure through it.
+            if (!retained &&
+                functions_with_entry_point_pragmas_.ContainsKey(function2)) {
+              AddRetainReason(function, RetainReasons::kEntryPointPragma);
+              AddTypesOf(function);
             }
           }
         }
@@ -2007,7 +2003,7 @@
 
 void Precompiler::FinalizeDispatchTable() {
   PRECOMPILER_TIMER_SCOPE(this, FinalizeDispatchTable);
-  if (!FLAG_use_bare_instructions || !FLAG_use_table_dispatch) return;
+  if (!FLAG_use_table_dispatch) return;
   HANDLESCOPE(T);
   // Build the entries used to serialize the dispatch table before
   // dropping functions, as we may clear references to Code objects.
@@ -2066,11 +2062,8 @@
       // the old references to the CallStaticFunction stub, but it is sufficient
       // for the local pool to include the actual call target.
       compiler::ObjectPoolBuilder builder;
-      bool append_to_pool = FLAG_use_bare_instructions;
-      if (append_to_pool) {
-        pool_ = code.object_pool();
-        pool_.CopyInto(&builder);
-      }
+      pool_ = code.object_pool();
+      pool_.CopyInto(&builder);
 
       for (auto& view : static_calls) {
         kind_and_offset_ = view.Get<Code::kSCallTableKindAndOffset>();
@@ -2093,9 +2086,7 @@
               Code::OffsetField::decode(kind_and_offset_.Value());
           const uword pc = pc_offset + code.PayloadStart();
           CodePatcher::PatchStaticCallAt(pc, code, target_code_);
-          if (append_to_pool) {
-            builder.AddObject(Object::ZoneHandle(target_code_.ptr()));
-          }
+          builder.AddObject(Object::ZoneHandle(target_code_.ptr()));
         }
         if (FLAG_trace_precompiler) {
           THR_Print("Updated static call entry to %s in \"%s\"\n",
@@ -2104,9 +2095,7 @@
         }
       }
 
-      if (append_to_pool) {
-        code.set_object_pool(ObjectPool::NewFromBuilder(builder));
-      }
+      code.set_object_pool(ObjectPool::NewFromBuilder(builder));
     }
 
    private:
@@ -2129,6 +2118,7 @@
   Array& functions = Array::Handle(Z);
   Function& function = Function::Handle(Z);
   Function& target = Function::Handle(Z);
+  Function& implicit_closure = Function::Handle(Z);
   Code& code = Code::Handle(Z);
   Object& owner = Object::Handle(Z);
   GrowableObjectArray& retained_functions = GrowableObjectArray::Handle(Z);
@@ -2207,6 +2197,17 @@
           owner, Smi::Handle(Smi::New(owner.GetClassId())));
       code.set_owner(owner);
     }
+    if (function.HasImplicitClosureFunction()) {
+      // If we are going to drop the function which has a compiled
+      // implicit closure move the closure itself to the list of closures
+      // attached to the object store so that ProgramVisitor could find it.
+      // The list of closures is going to be dropped during PRODUCT snapshotting
+      // so there is no overhead in doing so.
+      implicit_closure = function.ImplicitClosureFunction();
+      RELEASE_ASSERT(functions_to_retain_.ContainsKey(implicit_closure));
+      ClosureFunctionsCache::AddClosureFunctionLocked(
+          implicit_closure, /*allow_implicit_closure_functions=*/true);
+    }
     dropped_function_count_++;
     if (FLAG_trace_precompiler) {
       THR_Print("Dropping function %s\n",
@@ -2289,6 +2290,9 @@
     }
     return true;  // Continue iteration.
   });
+
+  // Note: in PRODUCT mode snapshotter will drop this field when serializing.
+  // This is done in ProgramSerializationRoots.
   IG->object_store()->set_closure_functions(retained_functions);
 }
 
@@ -2887,11 +2891,9 @@
     intptr_t discarded_codes_ = 0;
   };
 
-  // Code objects are stored in stack frames if not use_bare_instructions.
   // Code objects are used by stack traces if not dwarf_stack_traces.
   // Code objects are used by profiler in non-PRODUCT mode.
-  if (!FLAG_use_bare_instructions || !FLAG_dwarf_stack_traces_mode ||
-      FLAG_retain_code_objects) {
+  if (!FLAG_dwarf_stack_traces_mode || FLAG_retain_code_objects) {
     return;
   }
 
@@ -3050,9 +3052,7 @@
       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 auto pool_attachment = FLAG_use_bare_instructions
-                                   ? Code::PoolAttachment::kNotAttachPool
-                                   : Code::PoolAttachment::kAttachPool;
+  const auto pool_attachment = Code::PoolAttachment::kNotAttachPool;
 
   SafepointWriteRwLocker ml(T, T->isolate_group()->program_lock());
   const Code& code = Code::Handle(
@@ -3130,6 +3130,7 @@
 
       CompilerState compiler_state(thread(), /*is_aot=*/true, optimized(),
                                    CompilerState::ShouldTrace(function));
+      compiler_state.set_function(function);
 
       {
         ic_data_array = new (zone) ZoneGrowableArray<const ICData*>();
@@ -3177,19 +3178,17 @@
       ASSERT(pass_state.inline_id_to_function.length() ==
              pass_state.caller_inline_id.length());
 
-      ASSERT(!FLAG_use_bare_instructions || precompiler_ != nullptr);
+      ASSERT(precompiler_ != nullptr);
 
-      if (FLAG_use_bare_instructions) {
-        // When generating code in bare instruction mode all code objects
-        // share the same global object pool. To reduce interleaving of
-        // unrelated object pool entries from different code objects
-        // we attempt to pregenerate stubs referenced by the code
-        // we are going to generate.
-        //
-        // Reducing interleaving means reducing recompilations triggered by
-        // failure to commit object pool into the global object pool.
-        GenerateNecessaryAllocationStubs(flow_graph);
-      }
+      // When generating code in bare instruction mode all code objects
+      // share the same global object pool. To reduce interleaving of
+      // unrelated object pool entries from different code objects
+      // we attempt to pregenerate stubs referenced by the code
+      // we are going to generate.
+      //
+      // Reducing interleaving means reducing recompilations triggered by
+      // failure to commit object pool into the global object pool.
+      GenerateNecessaryAllocationStubs(flow_graph);
 
       // Even in bare instructions mode we don't directly add objects into
       // the global object pool because code generation can bail out
@@ -3204,9 +3203,7 @@
       // some stubs). If this indeed happens we retry the compilation.
       // (See TryCommitToParent invocation below).
       compiler::ObjectPoolBuilder object_pool_builder(
-          FLAG_use_bare_instructions
-              ? precompiler_->global_object_pool_builder()
-              : nullptr);
+          precompiler_->global_object_pool_builder());
       compiler::Assembler assembler(&object_pool_builder, use_far_branches);
 
       CodeStatistics* function_stats = NULL;
@@ -3267,8 +3264,7 @@
       // method will lead to the same IR due to instability of inlining
       // heuristics (under some conditions we might end up inlining
       // more aggressively on the second attempt).
-      if (FLAG_use_bare_instructions &&
-          !object_pool_builder.TryCommitToParent()) {
+      if (!object_pool_builder.TryCommitToParent()) {
         done = false;
         continue;
       }
diff --git a/runtime/vm/compiler/aot/precompiler.h b/runtime/vm/compiler/aot/precompiler.h
index 303fbc4..678905c 100644
--- a/runtime/vm/compiler/aot/precompiler.h
+++ b/runtime/vm/compiler/aot/precompiler.h
@@ -243,12 +243,11 @@
   }
 
   compiler::ObjectPoolBuilder* global_object_pool_builder() {
-    ASSERT(FLAG_use_bare_instructions);
     return &global_object_pool_builder_;
   }
 
   compiler::SelectorMap* selector_map() {
-    ASSERT(FLAG_use_bare_instructions && FLAG_use_table_dispatch);
+    ASSERT(FLAG_use_table_dispatch);
     return dispatch_table_generator_->selector_map();
   }
 
diff --git a/runtime/vm/compiler/aot/precompiler_tracer.cc b/runtime/vm/compiler/aot/precompiler_tracer.cc
index 72fcfdd..d0a2e5f 100644
--- a/runtime/vm/compiler/aot/precompiler_tracer.cc
+++ b/runtime/vm/compiler/aot/precompiler_tracer.cc
@@ -90,7 +90,7 @@
       const auto& fun = Function::Cast(obj);
       cls_ = fun.Owner();
       const intptr_t selector_id =
-          FLAG_use_bare_instructions && FLAG_use_table_dispatch
+          FLAG_use_table_dispatch
               ? precompiler_->selector_map()->SelectorId(fun)
               : -1;
       Write("\"%c\",%" Pd ",%" Pd ",%" Pd "",
diff --git a/runtime/vm/compiler/api/print_filter.cc b/runtime/vm/compiler/api/print_filter.cc
index be9762c..4abe1e9 100644
--- a/runtime/vm/compiler/api/print_filter.cc
+++ b/runtime/vm/compiler/api/print_filter.cc
@@ -7,24 +7,46 @@
 #include "vm/compiler/api/print_filter.h"
 
 #include "vm/flags.h"
+#if !defined(DART_PRECOMPILED_RUNTIME)
+#include "vm/compiler/compiler_pass.h"
 #include "vm/object.h"
+#endif
+#include "vm/symbols.h"
 
 namespace dart {
 
 DEFINE_FLAG(charp,
             print_flow_graph_filter,
-            NULL,
+            nullptr,
             "Print only IR of functions with matching names");
 
 namespace compiler {
 
 // Checks whether function's name matches the given filter, which is
 // a comma-separated list of strings.
-static bool PassesFilter(const char* filter, const Function& function) {
-  if (filter == NULL) {
+static bool PassesFilter(const char* filter,
+                         const Function& function,
+                         uint8_t** compiler_pass_filter) {
+  if (filter == nullptr) {
     return true;
   }
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  if (strcmp(filter, "@pragma") == 0) {
+    Object& pass_filter = Object::Handle();
+    const auto has_pragma =
+        Library::FindPragma(dart::Thread::Current(), /*only_core=*/false,
+                            function, Symbols::vm_testing_print_flow_graph(),
+                            /*multiple=*/false, &pass_filter);
+    if (has_pragma && !pass_filter.IsNull() &&
+        compiler_pass_filter != nullptr) {
+      *compiler_pass_filter = dart::CompilerPass::ParseFiltersFromPragma(
+          String::Cast(pass_filter).ToCString());
+    }
+    return has_pragma;
+  }
+#endif
+
   char* save_ptr;  // Needed for strtok_r.
   const char* scrubbed_name =
       String::Handle(function.QualifiedScrubbedName()).ToCString();
@@ -36,9 +58,9 @@
   strncpy(filter_buffer, filter, len);  // strtok modifies arg 1.
   char* token = strtok_r(filter_buffer, ",", &save_ptr);
   bool found = false;
-  while (token != NULL) {
-    if ((strstr(function_name, token) != NULL) ||
-        (strstr(scrubbed_name, token) != NULL)) {
+  while (token != nullptr) {
+    if ((strstr(function_name, token) != nullptr) ||
+        (strstr(scrubbed_name, token) != nullptr)) {
       found = true;
       break;
     }
@@ -53,15 +75,17 @@
         }
       }
     }
-    token = strtok_r(NULL, ",", &save_ptr);
+    token = strtok_r(nullptr, ",", &save_ptr);
   }
   delete[] filter_buffer;
 
   return found;
 }
 
-bool PrintFilter::ShouldPrint(const Function& function) {
-  return PassesFilter(FLAG_print_flow_graph_filter, function);
+bool PrintFilter::ShouldPrint(const Function& function,
+                              uint8_t** compiler_pass_filter /* = nullptr */) {
+  return PassesFilter(FLAG_print_flow_graph_filter, function,
+                      compiler_pass_filter);
 }
 
 }  // namespace compiler
diff --git a/runtime/vm/compiler/api/print_filter.h b/runtime/vm/compiler/api/print_filter.h
index 604fa9c..95d7a39 100644
--- a/runtime/vm/compiler/api/print_filter.h
+++ b/runtime/vm/compiler/api/print_filter.h
@@ -19,7 +19,8 @@
 
 class PrintFilter : public AllStatic {
  public:
-  static bool ShouldPrint(const Function& function);
+  static bool ShouldPrint(const Function& function,
+                          uint8_t** compiler_pass_filter = nullptr);
 };
 
 }  // namespace compiler
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index c17b697..eee0fb3 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -1620,7 +1620,7 @@
 }
 
 void Assembler::SetupGlobalPoolAndDispatchTable() {
-  ASSERT(FLAG_precompiled_mode && FLAG_use_bare_instructions);
+  ASSERT(FLAG_precompiled_mode);
   ldr(PP, Address(THR, target::Thread::global_object_pool_offset()));
   if (FLAG_use_table_dispatch) {
     ldr(DISPATCH_TABLE_REG,
@@ -3361,7 +3361,7 @@
   COMPILE_ASSERT(CODE_REG < FP);
   COMPILE_ASSERT(FP < LINK_REGISTER.code);
 
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     SPILLS_LR_TO_FRAME(
         EnterFrame((1 << PP) | (1 << CODE_REG) | (1 << FP) | (1 << LR), 0));
 
@@ -3391,7 +3391,7 @@
 }
 
 void Assembler::LeaveDartFrame() {
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     ldr(PP, Address(FP, target::frame_layout.saved_caller_pp_from_fp *
                             target::kWordSize));
   }
@@ -3403,7 +3403,7 @@
 }
 
 void Assembler::LeaveDartFrameAndReturn() {
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     ldr(PP, Address(FP, target::frame_layout.saved_caller_pp_from_fp *
                             target::kWordSize));
   }
@@ -3747,6 +3747,18 @@
   }
 }
 
+void Assembler::LoadStaticFieldAddress(Register address,
+                                       Register field,
+                                       Register scratch) {
+  LoadCompressedFieldFromOffset(
+      scratch, field, target::Field::host_offset_or_field_id_offset());
+  const intptr_t field_table_offset =
+      compiler::target::Thread::field_table_values_offset();
+  LoadMemoryValue(address, THR, static_cast<int32_t>(field_table_offset));
+  add(address, address,
+      Operand(scratch, LSL, target::kWordSizeLog2 - kSmiTagShift));
+}
+
 void Assembler::LoadFieldAddressForRegOffset(Register address,
                                              Register instance,
                                              Register offset_in_words_as_smi) {
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index e98eef8..457b1da 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -1346,6 +1346,10 @@
                                      Register array,
                                      Register index);
 
+  void LoadStaticFieldAddress(Register address,
+                              Register field,
+                              Register scratch);
+
   void LoadCompressedFieldAddressForRegOffset(Register address,
                                               Register instance,
                                               Register offset_in_words_as_smi) {
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index 8aed5c6..3bfb9a8 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -1565,7 +1565,7 @@
 }
 
 void Assembler::SetupGlobalPoolAndDispatchTable() {
-  ASSERT(FLAG_precompiled_mode && FLAG_use_bare_instructions);
+  ASSERT(FLAG_precompiled_mode);
   ldr(PP, Address(THR, target::Thread::global_object_pool_offset()));
   sub(PP, PP, Operand(kHeapObjectTag));  // Pool in PP is untagged!
   if (FLAG_use_table_dispatch) {
@@ -1648,7 +1648,7 @@
   // Setup the frame.
   EnterFrame(0);
 
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     TagAndPushPPAndPcMarker();  // Save PP and PC marker.
 
     // Load the pool pointer.
@@ -1683,7 +1683,7 @@
 }
 
 void Assembler::LeaveDartFrame(RestorePP restore_pp) {
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     if (restore_pp == kRestoreCallerPP) {
       // Restore and untag PP.
       LoadFromOffset(
@@ -1820,7 +1820,7 @@
 void Assembler::EnterCallRuntimeFrame(intptr_t frame_size, bool is_leaf) {
   Comment("EnterCallRuntimeFrame");
   EnterFrame(0);
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     TagAndPushPPAndPcMarker();  // Save PP and PC marker.
   }
 
@@ -2263,6 +2263,18 @@
   }
 }
 
+void Assembler::LoadStaticFieldAddress(Register address,
+                                       Register field,
+                                       Register scratch) {
+  LoadCompressedSmiFieldFromOffset(
+      scratch, field, target::Field::host_offset_or_field_id_offset());
+  const intptr_t field_table_offset =
+      compiler::target::Thread::field_table_values_offset();
+  LoadMemoryValue(address, THR, static_cast<int32_t>(field_table_offset));
+  add(address, address,
+      Operand(scratch, LSL, target::kWordSizeLog2 - kSmiTagShift));
+}
+
 void Assembler::LoadCompressedFieldAddressForRegOffset(
     Register address,
     Register instance,
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index d2432b5..886ab74 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -2212,6 +2212,10 @@
                                         Register array,
                                         Register index);
 
+  void LoadStaticFieldAddress(Register address,
+                              Register field,
+                              Register scratch);
+
   void LoadCompressedFieldAddressForRegOffset(Register address,
                                               Register instance,
                                               Register offset_in_words_as_smi);
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.h b/runtime/vm/compiler/assembler/assembler_ia32.h
index 6bd5f28..e5b2b1a 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.h
+++ b/runtime/vm/compiler/assembler/assembler_ia32.h
@@ -882,6 +882,18 @@
                                            Register index,
                                            intptr_t extra_disp = 0);
 
+  void LoadStaticFieldAddress(Register address,
+                              Register field,
+                              Register scratch) {
+    LoadCompressedFieldFromOffset(
+        scratch, field, target::Field::host_offset_or_field_id_offset());
+    const intptr_t field_table_offset =
+        compiler::target::Thread::field_table_values_offset();
+    LoadMemoryValue(address, THR, static_cast<int32_t>(field_table_offset));
+    static_assert(kSmiTagShift == 1, "adjust scale factor");
+    leal(address, Address(address, scratch, TIMES_HALF_WORD_SIZE, 0));
+  }
+
   void LoadCompressedFieldAddressForRegOffset(Register address,
                                               Register instance,
                                               Register offset_in_words_as_smi) {
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index d2dc30c..0c396e7 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -1845,7 +1845,7 @@
 void Assembler::EnterCallRuntimeFrame(intptr_t frame_space) {
   Comment("EnterCallRuntimeFrame");
   EnterFrame(0);
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     pushq(CODE_REG);
     pushq(PP);
   }
@@ -1939,7 +1939,7 @@
 void Assembler::EnterDartFrame(intptr_t frame_size, Register new_pp) {
   ASSERT(!constant_pool_allowed());
   EnterFrame(0);
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     pushq(CODE_REG);
     pushq(PP);
     if (new_pp == kNoRegister) {
@@ -1956,7 +1956,7 @@
 
 void Assembler::LeaveDartFrame(RestorePP restore_pp) {
   // Restore caller's PP register that was pushed in EnterDartFrame.
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     if (restore_pp == kRestoreCallerPP) {
       movq(PP, Address(RBP, (target::frame_layout.saved_caller_pp_from_fp *
                              target::kWordSize)));
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index 237bd61..5312859 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -1228,6 +1228,19 @@
                                            Register array,
                                            Register index);
 
+  void LoadStaticFieldAddress(Register address,
+                              Register field,
+                              Register scratch) {
+    LoadCompressedSmi(
+        scratch, compiler::FieldAddress(
+                     field, target::Field::host_offset_or_field_id_offset()));
+    const intptr_t field_table_offset =
+        compiler::target::Thread::field_table_values_offset();
+    LoadMemoryValue(address, THR, static_cast<int32_t>(field_table_offset));
+    static_assert(kSmiTagShift == 1, "adjust scale factor");
+    leaq(address, Address(address, scratch, TIMES_HALF_WORD_SIZE, 0));
+  }
+
   void LoadFieldAddressForRegOffset(Register address,
                                     Register instance,
                                     Register offset_in_words_as_smi) {
diff --git a/runtime/vm/compiler/assembler/disassembler.cc b/runtime/vm/compiler/assembler/disassembler.cc
index e950867..e9b082f 100644
--- a/runtime/vm/compiler/assembler/disassembler.cc
+++ b/runtime/vm/compiler/assembler/disassembler.cc
@@ -245,7 +245,7 @@
   ASSERT(code.pointer_offsets_length() == 0);
 #endif
 
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     THR_Print("(No object pool for bare instructions.)\n");
   } else {
     const ObjectPool& object_pool =
@@ -480,7 +480,7 @@
   code.Disassemble(&formatter);
   THR_Print("}\n");
   const ObjectPool& object_pool = ObjectPool::Handle(code.object_pool());
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     THR_Print("(No object pool for bare instructions.)\n");
   } else if (!object_pool.IsNull()) {
     object_pool.DebugPrint();
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index 50418b8..eed551a 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -588,9 +588,17 @@
   const Object& left = left_defn->constant_value();
   const Object& right = right_defn->constant_value();
   if (IsNonConstant(left) || IsNonConstant(right)) {
-    // TODO(vegorov): incorporate nullability information into the lattice.
-    if ((left.IsNull() && instr->right()->Type()->HasDecidableNullability()) ||
-        (right.IsNull() && instr->left()->Type()->HasDecidableNullability())) {
+    if ((left.ptr() == Object::sentinel().ptr() &&
+         !instr->right()->Type()->can_be_sentinel()) ||
+        (right.ptr() == Object::sentinel().ptr() &&
+         !instr->left()->Type()->can_be_sentinel())) {
+      // Handle provably false (EQ_STRICT) or true (NE_STRICT) sentinel checks.
+      SetValue(instr, Bool::Get(instr->kind() != Token::kEQ_STRICT));
+    } else if ((left.IsNull() &&
+                instr->right()->Type()->HasDecidableNullability()) ||
+               (right.IsNull() &&
+                instr->left()->Type()->HasDecidableNullability())) {
+      // TODO(vegorov): incorporate nullability information into the lattice.
       bool result = left.IsNull() ? instr->right()->Type()->IsNull()
                                   : instr->left()->Type()->IsNull();
       if (instr->kind() == Token::kNE_STRICT) {
@@ -845,17 +853,9 @@
 }
 
 void ConstantPropagator::VisitLoadStaticField(LoadStaticFieldInstr* instr) {
-  if (!FLAG_fields_may_be_reset) {
-    const Field& field = instr->field();
-    ASSERT(field.is_static());
-    auto& obj = Object::Handle(Z);
-    if (field.is_final() && instr->IsFieldInitialized(&obj)) {
-      if (obj.IsSmi() || (obj.IsOld() && obj.IsCanonical())) {
-        SetValue(instr, obj);
-        return;
-      }
-    }
-  }
+  // Cannot treat an initialized field as constant because the same code will be
+  // used when the AppAOT or AppJIT starts over with everything uninitialized or
+  // another isolate in the isolate group starts with everything uninitialized.
   SetValue(instr, non_constant_);
 }
 
diff --git a/runtime/vm/compiler/backend/constant_propagator_test.cc b/runtime/vm/compiler/backend/constant_propagator_test.cc
index de14881..1ee3b6d 100644
--- a/runtime/vm/compiler/backend/constant_propagator_test.cc
+++ b/runtime/vm/compiler/backend/constant_propagator_test.cc
@@ -295,4 +295,85 @@
 }
 #endif
 
+void StrictCompareSentinel(Thread* thread,
+                           bool negate,
+                           bool non_sentinel_on_left) {
+  const char* kScript = R"(
+    late final int x = 4;
+  )";
+  Zone* const Z = Thread::Current()->zone();
+  const auto& root_library = Library::CheckedHandle(Z, LoadTestScript(kScript));
+  const auto& toplevel = Class::Handle(Z, root_library.toplevel_class());
+  const auto& field_x = Field::Handle(
+      Z, toplevel.LookupStaticField(String::Handle(Z, String::New("x"))));
+
+  using compiler::BlockBuilder;
+  CompilerState S(thread, /*is_aot=*/false, /*is_optimizing=*/true);
+  FlowGraphBuilderHelper H;
+
+  auto b1 = H.flow_graph()->graph_entry()->normal_entry();
+
+  {
+    BlockBuilder builder(H.flow_graph(), b1);
+    auto v_load = builder.AddDefinition(new LoadStaticFieldInstr(
+        field_x, {},
+        /*calls_initializer=*/true, S.GetNextDeoptId()));
+    auto v_sentinel = H.flow_graph()->GetConstant(Object::sentinel());
+    Value* const left_value =
+        non_sentinel_on_left ? new Value(v_load) : new Value(v_sentinel);
+    Value* const right_value =
+        non_sentinel_on_left ? new Value(v_sentinel) : new Value(v_load);
+    auto v_compare = builder.AddDefinition(new StrictCompareInstr(
+        {}, negate ? Token::kNE_STRICT : Token::kEQ_STRICT, left_value,
+        right_value,
+        /*needs_number_check=*/false, S.GetNextDeoptId()));
+    builder.AddReturn(new Value(v_compare));
+  }
+
+  H.FinishGraph();
+
+  FlowGraphPrinter::PrintGraph("Before TypePropagator", H.flow_graph());
+  FlowGraphTypePropagator::Propagate(H.flow_graph());
+  FlowGraphPrinter::PrintGraph("After TypePropagator", H.flow_graph());
+  GrowableArray<BlockEntryInstr*> ignored;
+  ConstantPropagator::Optimize(H.flow_graph());
+  FlowGraphPrinter::PrintGraph("After ConstantPropagator", H.flow_graph());
+
+  ReturnInstr* ret = nullptr;
+
+  ILMatcher cursor(H.flow_graph(),
+                   H.flow_graph()->graph_entry()->normal_entry(), true);
+  RELEASE_ASSERT(cursor.TryMatch({
+      kMatchAndMoveFunctionEntry,
+      kMatchAndMoveLoadStaticField,
+      // The StrictCompare instruction should be removed.
+      {kMatchReturn, &ret},
+  }));
+
+  EXPECT_PROPERTY(ret, it.value()->BindsToConstant());
+  EXPECT_PROPERTY(&ret->value()->BoundConstant(), it.IsBool());
+  EXPECT_PROPERTY(&ret->value()->BoundConstant(),
+                  Bool::Cast(it).value() == negate);
+}
+
+ISOLATE_UNIT_TEST_CASE(ConstantPropagator_StrictCompareEqualsSentinelLeft) {
+  StrictCompareSentinel(thread, /*negate=*/false,
+                        /*non_sentinel_on_left=*/true);
+}
+
+ISOLATE_UNIT_TEST_CASE(ConstantPropagator_StrictCompareEqualsSentinelRightt) {
+  StrictCompareSentinel(thread, /*negate=*/false,
+                        /*non_sentinel_on_left=*/false);
+}
+
+ISOLATE_UNIT_TEST_CASE(ConstantPropagator_StrictCompareNotEqualsSentinelLeft) {
+  StrictCompareSentinel(thread, /*negate=*/true,
+                        /*non_sentinel_on_left=*/true);
+}
+
+ISOLATE_UNIT_TEST_CASE(ConstantPropagator_StrictCompareNotEqualsSentinelRight) {
+  StrictCompareSentinel(thread, /*negate=*/true,
+                        /*non_sentinel_on_left=*/false);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index 27ab909..1dbf213 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -56,7 +56,10 @@
       loop_invariant_loads_(nullptr),
       captured_parameters_(new (zone()) BitVector(zone(), variable_count())),
       inlining_id_(-1),
-      should_print_(FlowGraphPrinter::ShouldPrint(parsed_function.function())) {
+      should_print_(false) {
+  should_print_ = FlowGraphPrinter::ShouldPrint(parsed_function.function(),
+                                                &compiler_pass_filters_);
+
   direct_parameters_size_ = ParameterOffsetAt(
       function(), num_direct_parameters_, /*last_slot*/ false);
   DiscoverBlocks();
@@ -129,20 +132,6 @@
   }
 }
 
-Representation FlowGraph::UnboxedFieldRepresentationOf(const Field& field) {
-  switch (field.UnboxedFieldCid()) {
-    case kDoubleCid:
-      return kUnboxedDouble;
-    case kFloat32x4Cid:
-      return kUnboxedFloat32x4;
-    case kFloat64x2Cid:
-      return kUnboxedFloat64x2;
-    default:
-      RELEASE_ASSERT(field.is_non_nullable_integer());
-      return kUnboxedInt64;
-  }
-}
-
 void FlowGraph::ReplaceCurrentInstruction(ForwardInstructionIterator* iterator,
                                           Instruction* current,
                                           Instruction* replacement) {
@@ -2880,4 +2869,8 @@
   }
 }
 
+void FlowGraph::Print(const char* phase) {
+  FlowGraphPrinter::PrintGraph(phase, this);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/compiler/backend/flow_graph.h b/runtime/vm/compiler/backend/flow_graph.h
index 5aeec58..2c82c13 100644
--- a/runtime/vm/compiler/backend/flow_graph.h
+++ b/runtime/vm/compiler/backend/flow_graph.h
@@ -119,6 +119,8 @@
   const ParsedFunction& parsed_function() const { return parsed_function_; }
   const Function& function() const { return parsed_function_.function(); }
 
+  void Print(const char* phase = "unknown");
+
   // The number of directly accessable parameters (above the frame pointer).
   // All other parameters can only be indirectly loaded via metadata found in
   // the arguments descriptor.
@@ -155,8 +157,6 @@
 
   static Representation ReturnRepresentationOf(const Function& function);
 
-  static Representation UnboxedFieldRepresentationOf(const Field& field);
-
   // The number of variables (or boxes) inside the functions frame - meaning
   // below the frame pointer.  This does not include the expression stack.
   intptr_t num_stack_locals() const {
@@ -469,6 +469,9 @@
   void RenameUsesDominatedByRedefinitions();
 
   bool should_print() const { return should_print_; }
+  const uint8_t* compiler_pass_filters() const {
+    return compiler_pass_filters_;
+  }
 
   //
   // High-level utilities.
@@ -632,6 +635,7 @@
 
   intptr_t inlining_id_;
   bool should_print_;
+  uint8_t* compiler_pass_filters_ = nullptr;
 
   const Array* coverage_array_ = &Array::empty_array();
 };
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index a421fe8..9e56049 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -203,30 +203,6 @@
   ArchSpecificInitialization();
 }
 
-bool FlowGraphCompiler::IsUnboxedField(const Field& field) {
-  // The `field.is_non_nullable_integer()` is set in the kernel loader and can
-  // only be set if we consume a AOT kernel (annotated with inferred types).
-  ASSERT(!field.is_non_nullable_integer() || FLAG_precompiled_mode);
-  const bool valid_class =
-      ((SupportsUnboxedDoubles() && (field.guarded_cid() == kDoubleCid)) ||
-       (SupportsUnboxedSimd128() && (field.guarded_cid() == kFloat32x4Cid)) ||
-       (SupportsUnboxedSimd128() && (field.guarded_cid() == kFloat64x2Cid)) ||
-       field.is_non_nullable_integer());
-  return field.is_unboxing_candidate() && !field.is_nullable() && valid_class;
-}
-
-bool FlowGraphCompiler::IsPotentialUnboxedField(const Field& field) {
-  if (FLAG_precompiled_mode) {
-    // kernel_loader.cc:ReadInferredType sets the guarded cid for fields based
-    // on inferred types from TFA (if available). The guarded cid is therefore
-    // proven to be correct.
-    return IsUnboxedField(field);
-  }
-  return field.is_unboxing_candidate() &&
-         (FlowGraphCompiler::IsUnboxedField(field) ||
-          (field.guarded_cid() == kIllegalCid));
-}
-
 void FlowGraphCompiler::InitCompiler() {
   compressed_stackmaps_builder_ =
       new (zone()) CompressedStackMapsBuilder(zone());
@@ -584,6 +560,53 @@
   return false;
 }
 
+void FlowGraphCompiler::EmitFunctionEntrySourcePositionDescriptorIfNeeded() {
+  // When unwinding async stacks we might produce frames which correspond
+  // to future listeners which are going to be called when the future completes.
+  // These listeners are not yet called and thus their frame pc_offset is set
+  // to 0 - which does not actually correspond to any call- or yield- site
+  // inside the code object. Nevertheless we would like to be able to
+  // produce proper position information for it when symbolizing the stack.
+  // To achieve that in AOT mode (where we don't actually have
+  // |Function::token_pos| available) we instead emit an artificial descriptor
+  // at the very beginning of the function.
+  if (FLAG_precompiled_mode && flow_graph().function().IsClosureFunction()) {
+    code_source_map_builder_->WriteFunctionEntrySourcePosition(
+        InstructionSource(flow_graph().function().token_pos()));
+  }
+}
+
+void FlowGraphCompiler::CompileGraph() {
+  InitCompiler();
+
+#if !defined(TARGET_ARCH_IA32)
+  // 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.
+  assembler()->set_constant_pool_allowed(true);
+#endif
+
+  EmitFunctionEntrySourcePositionDescriptorIfNeeded();
+  VisitBlocks();
+
+#if defined(DEBUG)
+  assembler()->Breakpoint();
+#endif
+
+  if (!skip_body_compilation()) {
+#if !defined(TARGET_ARCH_IA32)
+    ASSERT(assembler()->constant_pool_allowed());
+#endif
+    GenerateDeferredCode();
+  }
+
+  for (intptr_t i = 0; i < indirect_gotos_.length(); ++i) {
+    indirect_gotos_[i]->ComputeOffsetTable(this);
+  }
+}
+
 void FlowGraphCompiler::VisitBlocks() {
   CompactBlocks();
   if (compiler::Assembler::EmittingComments()) {
@@ -3242,7 +3265,6 @@
 #define __ compiler->assembler()->
 
 void ThrowErrorSlowPathCode::EmitNativeCode(FlowGraphCompiler* compiler) {
-  RELEASE_ASSERT(try_index_ == compiler->CurrentTryIndex());
   if (compiler::Assembler::EmittingComments()) {
     __ Comment("slow path %s operation", name());
   }
@@ -3359,9 +3381,7 @@
 
 void LateInitializationErrorSlowPath::PushArgumentsForRuntimeCall(
     FlowGraphCompiler* compiler) {
-  const Field& original_field = Field::ZoneHandle(
-      instruction()->AsLoadField()->slot().field().Original());
-  __ PushObject(original_field);
+  __ PushObject(Field::ZoneHandle(OriginalField()));
 }
 
 void LateInitializationErrorSlowPath::EmitSharedStubCall(
@@ -3372,9 +3392,8 @@
 #else
   ASSERT(instruction()->locs()->temp(0).reg() ==
          LateInitializationErrorABI::kFieldReg);
-  const Field& original_field = Field::ZoneHandle(
-      instruction()->AsLoadField()->slot().field().Original());
-  __ LoadObject(LateInitializationErrorABI::kFieldReg, original_field);
+  __ LoadObject(LateInitializationErrorABI::kFieldReg,
+                Field::ZoneHandle(OriginalField()));
   auto object_store = compiler->isolate_group()->object_store();
   const auto& stub = Code::ZoneHandle(
       compiler->zone(),
@@ -3641,19 +3660,17 @@
 }
 
 bool FlowGraphCompiler::CanPcRelativeCall(const Function& target) const {
-  return FLAG_precompiled_mode && FLAG_use_bare_instructions &&
+  return FLAG_precompiled_mode &&
          (LoadingUnitOf(zone_, function()) == LoadingUnitOf(zone_, target));
 }
 
 bool FlowGraphCompiler::CanPcRelativeCall(const Code& target) const {
-  return FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-         !target.InVMIsolateHeap() &&
+  return FLAG_precompiled_mode && !target.InVMIsolateHeap() &&
          (LoadingUnitOf(zone_, function()) == LoadingUnitOf(zone_, target));
 }
 
 bool FlowGraphCompiler::CanPcRelativeCall(const AbstractType& target) const {
-  return FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-         !target.InVMIsolateHeap() &&
+  return FLAG_precompiled_mode && !target.InVMIsolateHeap() &&
          (LoadingUnitOf(zone_, function()) == LoadingUnit::kRootId);
 }
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index c6cda87..7bf8100 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -315,11 +315,8 @@
 class ThrowErrorSlowPathCode : public TemplateSlowPathCode<Instruction> {
  public:
   ThrowErrorSlowPathCode(Instruction* instruction,
-                         const RuntimeEntry& runtime_entry,
-                         intptr_t try_index)
-      : TemplateSlowPathCode(instruction),
-        runtime_entry_(runtime_entry),
-        try_index_(try_index) {}
+                         const RuntimeEntry& runtime_entry)
+      : TemplateSlowPathCode(instruction), runtime_entry_(runtime_entry) {}
 
   // This name appears in disassembly.
   virtual const char* name() = 0;
@@ -341,15 +338,14 @@
 
  private:
   const RuntimeEntry& runtime_entry_;
-  const intptr_t try_index_;
 };
 
 class NullErrorSlowPath : public ThrowErrorSlowPathCode {
  public:
-  NullErrorSlowPath(CheckNullInstr* instruction, intptr_t try_index)
+  explicit NullErrorSlowPath(CheckNullInstr* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               GetRuntimeEntry(instruction->exception_type()),
-                               try_index) {}
+                               GetRuntimeEntry(instruction->exception_type())) {
+  }
 
   CheckNullInstr::ExceptionType exception_type() const {
     return instruction()->AsCheckNull()->exception_type();
@@ -376,10 +372,8 @@
 
 class RangeErrorSlowPath : public ThrowErrorSlowPathCode {
  public:
-  RangeErrorSlowPath(GenericCheckBoundInstr* instruction, intptr_t try_index)
-      : ThrowErrorSlowPathCode(instruction,
-                               kRangeErrorRuntimeEntry,
-                               try_index) {}
+  explicit RangeErrorSlowPath(GenericCheckBoundInstr* instruction)
+      : ThrowErrorSlowPathCode(instruction, kRangeErrorRuntimeEntry) {}
   virtual const char* name() { return "check bound"; }
 
   virtual intptr_t GetNumberOfArgumentsForRuntimeCall() {
@@ -394,11 +388,11 @@
 
 class LateInitializationErrorSlowPath : public ThrowErrorSlowPathCode {
  public:
-  LateInitializationErrorSlowPath(LoadFieldInstr* instruction,
-                                  intptr_t try_index)
+  explicit LateInitializationErrorSlowPath(Instruction* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               kLateFieldNotInitializedErrorRuntimeEntry,
-                               try_index) {}
+                               kLateFieldNotInitializedErrorRuntimeEntry) {
+    ASSERT(instruction->IsLoadField() || instruction->IsLoadStaticField());
+  }
   virtual const char* name() { return "late initialization error"; }
 
   virtual intptr_t GetNumberOfArgumentsForRuntimeCall() {
@@ -409,6 +403,13 @@
 
   virtual void EmitSharedStubCall(FlowGraphCompiler* compiler,
                                   bool save_fpu_registers);
+
+ private:
+  FieldPtr OriginalField() const {
+    return instruction()->IsLoadField()
+               ? instruction()->AsLoadField()->slot().field().Original()
+               : instruction()->AsLoadStaticField()->field().Original();
+  }
 };
 
 class FlowGraphCompiler : public ValueObject {
@@ -473,9 +474,6 @@
   static bool SupportsHardwareDivision();
   static bool CanConvertInt64ToDouble();
 
-  static bool IsUnboxedField(const Field& field);
-  static bool IsPotentialUnboxedField(const Field& field);
-
   // Accessors.
   compiler::Assembler* assembler() const { return assembler_; }
   const ParsedFunction& parsed_function() const { return parsed_function_; }
@@ -499,6 +497,9 @@
 
   BlockEntryInstr* current_block() const { return current_block_; }
   void set_current_block(BlockEntryInstr* value) { current_block_ = value; }
+
+  Instruction* current_instruction() const { return current_instruction_; }
+
   static bool CanOptimize();
   bool CanOptimizeFunction() const;
   bool CanOSRFunction() const;
@@ -570,6 +571,8 @@
 
   void VisitBlocks();
 
+  void EmitFunctionEntrySourcePositionDescriptorIfNeeded();
+
   // Bail out of the flow graph compiler. Does not return to the caller.
   void Bailout(const char* reason);
 
@@ -1152,8 +1155,6 @@
     current_instruction_ = current_instruction;
   }
 
-  Instruction* current_instruction() { return current_instruction_; }
-
   void CompactBlock(BlockEntryInstr* block);
   void CompactBlocks();
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index fbe3e61..3402cb2 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -29,7 +29,7 @@
 DECLARE_FLAG(bool, enable_simd_inline);
 
 void FlowGraphCompiler::ArchSpecificInitialization() {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     auto object_store = isolate_group()->object_store();
 
     const auto& stub =
@@ -286,7 +286,7 @@
 
   // R1 = extracted function
   // R4 = offset of type argument vector (or 0 if class is not generic)
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     kPoolReg = PP;
   } else {
     __ LoadFieldFromOffset(kPoolReg, CODE_REG,
@@ -340,7 +340,7 @@
       ASSERT(StackSize() >= 0);
       __ EnterDartFrame(StackSize() * compiler::target::kWordSize);
     }
-  } else if (FLAG_use_bare_instructions) {
+  } else if (FLAG_precompiled_mode) {
     assembler()->set_constant_pool_allowed(true);
   }
 }
@@ -382,38 +382,6 @@
   EndCodeSourceRange(PrologueSource());
 }
 
-// Input parameters:
-//   LR: return address.
-//   SP: address of last argument.
-//   FP: caller's frame pointer.
-//   PP: caller's pool pointer.
-//   R4: arguments descriptor array.
-void FlowGraphCompiler::CompileGraph() {
-  InitCompiler();
-
-  // 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();
-
-#if defined(DEBUG)
-  __ bkpt(0);
-#endif
-
-  if (!skip_body_compilation()) {
-    ASSERT(assembler()->constant_pool_allowed());
-    GenerateDeferredCode();
-  }
-
-  for (intptr_t i = 0; i < indirect_gotos_.length(); ++i) {
-    indirect_gotos_[i]->ComputeOffsetTable(this);
-  }
-}
-
 void FlowGraphCompiler::EmitCallToStub(const Code& stub) {
   ASSERT(!stub.IsNull());
   if (CanPcRelativeCall(stub)) {
@@ -580,20 +548,11 @@
                     (args_desc.Count() - 1) * compiler::target::kWordSize);
   // Use same code pattern as instance call so it can be parsed by code patcher.
   if (FLAG_precompiled_mode) {
-    if (FLAG_use_bare_instructions) {
-      // The AOT runtime will replace the slot in the object pool with the
-      // entrypoint address - see app_snapshot.cc.
-      CLOBBERS_LR(__ LoadUniqueObject(LR, StubCode::MegamorphicCall()));
-    } else {
-      __ LoadUniqueObject(CODE_REG, StubCode::MegamorphicCall());
-      CLOBBERS_LR(
-          __ ldr(LR, compiler::FieldAddress(
-                         CODE_REG, compiler::target::Code::entry_point_offset(
-                                       Code::EntryKind::kMonomorphic))));
-    }
+    // The AOT runtime will replace the slot in the object pool with the
+    // entrypoint address - see app_snapshot.cc.
+    CLOBBERS_LR(__ LoadUniqueObject(LR, StubCode::MegamorphicCall()));
     __ LoadUniqueObject(R9, cache);
     CLOBBERS_LR(__ blx(LR));
-
   } else {
     __ LoadUniqueObject(R9, cache);
     __ LoadUniqueObject(CODE_REG, StubCode::MegamorphicCall());
@@ -641,7 +600,7 @@
   __ LoadFromOffset(
       R0, SP,
       (ic_data.SizeWithoutTypeArgs() - 1) * compiler::target::kWordSize);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     // The AOT runtime will replace the slot in the object pool with the
     // entrypoint address - see app_snapshot.cc.
     CLOBBERS_LR(__ LoadUniqueObject(LR, initial_stub));
@@ -693,7 +652,7 @@
   if (function.HasOptionalParameters() || function.IsGeneric()) {
     __ LoadObject(R4, arguments_descriptor);
   } else {
-    if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+    if (!FLAG_precompiled_mode) {
       __ LoadImmediate(R4, 0);  // GC safe smi zero because of stub.
     }
   }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index da37d86..d7e4d14 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -28,7 +28,7 @@
 DECLARE_FLAG(bool, enable_simd_inline);
 
 void FlowGraphCompiler::ArchSpecificInitialization() {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     auto object_store = isolate_group()->object_store();
 
     const auto& stub =
@@ -278,7 +278,7 @@
   // R1 = extracted function
   // R4 = offset of type argument vector (or 0 if class is not generic)
   intptr_t pp_offset = 0;
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     // PP is not tagged on arm64.
     kPoolReg = PP;
     pp_offset = kHeapObjectTag;
@@ -332,7 +332,7 @@
       ASSERT(StackSize() >= 0);
       __ EnterDartFrame(StackSize() * kWordSize);
     }
-  } else if (FLAG_use_bare_instructions) {
+  } else if (FLAG_precompiled_mode) {
     assembler()->set_constant_pool_allowed(true);
   }
 }
@@ -360,13 +360,11 @@
     }
 
     __ Comment("Initialize spill slots");
-    if (num_locals > 1 || (num_locals == 1 && args_desc_slot == -1)) {
-      __ LoadObject(R0, Object::null_object());
-    }
     for (intptr_t i = 0; i < num_locals; ++i) {
       const intptr_t slot_index =
           compiler::target::frame_layout.FrameSlotForVariableIndex(-i);
-      Register value_reg = slot_index == args_desc_slot ? ARGS_DESC_REG : R0;
+      Register value_reg =
+          slot_index == args_desc_slot ? ARGS_DESC_REG : NULL_REG;
       __ StoreToOffset(value_reg, FP, slot_index * kWordSize);
     }
   }
@@ -374,38 +372,6 @@
   EndCodeSourceRange(PrologueSource());
 }
 
-// Input parameters:
-//   LR: return address.
-//   SP: address of last argument.
-//   FP: caller's frame pointer.
-//   PP: caller's pool pointer.
-//   R4: arguments descriptor array.
-void FlowGraphCompiler::CompileGraph() {
-  InitCompiler();
-
-  // 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();
-
-#if defined(DEBUG)
-  __ brk(0);
-#endif
-
-  if (!skip_body_compilation()) {
-    ASSERT(assembler()->constant_pool_allowed());
-    GenerateDeferredCode();
-  }
-
-  for (intptr_t i = 0; i < indirect_gotos_.length(); ++i) {
-    indirect_gotos_[i]->ComputeOffsetTable(this);
-  }
-}
-
 void FlowGraphCompiler::EmitCallToStub(const Code& stub) {
   ASSERT(!stub.IsNull());
   if (CanPcRelativeCall(stub)) {
@@ -576,7 +542,7 @@
   const intptr_t stub_index = op.AddObject(
       StubCode::MegamorphicCall(), ObjectPool::Patchability::kPatchable);
   ASSERT((data_index + 1) == stub_index);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     // The AOT runtime will replace the slot in the object pool with the
     // entrypoint address - see app_snapshot.cc.
     CLOBBERS_LR(__ LoadDoubleWordFromPoolIndex(R5, LR, data_index));
@@ -636,7 +602,7 @@
       op.AddObject(initial_stub, ObjectPool::Patchability::kPatchable);
   ASSERT((data_index + 1) == initial_stub_index);
 
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     // The AOT runtime will replace the slot in the object pool with the
     // entrypoint address - see app_snapshot.cc.
     CLOBBERS_LR(__ LoadDoubleWordFromPoolIndex(R5, LR, data_index));
@@ -687,7 +653,7 @@
   if (function.HasOptionalParameters() || function.IsGeneric()) {
     __ LoadObject(R4, arguments_descriptor);
   } else {
-    if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+    if (!FLAG_precompiled_mode) {
       __ LoadImmediate(R4, 0);  // GC safe smi zero because of stub.
     }
   }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
index 0b232dd..d613572 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
@@ -459,24 +459,6 @@
   EndCodeSourceRange(PrologueSource());
 }
 
-void FlowGraphCompiler::CompileGraph() {
-  InitCompiler();
-
-  ASSERT(!block_order().is_empty());
-  VisitBlocks();
-
-  if (!skip_body_compilation()) {
-#if defined(DEBUG)
-    __ int3();
-#endif
-    GenerateDeferredCode();
-  }
-
-  for (intptr_t i = 0; i < indirect_gotos_.length(); ++i) {
-    indirect_gotos_[i]->ComputeOffsetTable(this);
-  }
-}
-
 void FlowGraphCompiler::EmitCallToStub(const Code& stub) {
   if (stub.InVMIsolateHeap()) {
     __ CallVmStub(stub);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index 573add6..03922aa 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -28,7 +28,7 @@
 DECLARE_FLAG(bool, enable_simd_inline);
 
 void FlowGraphCompiler::ArchSpecificInitialization() {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     auto object_store = isolate_group()->object_store();
 
     const auto& stub =
@@ -282,7 +282,7 @@
 
   // RBX = extracted function
   // RDX = offset of type argument vector (or 0 if class is not generic)
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     kPoolReg = PP;
   } else {
     __ movq(kPoolReg,
@@ -301,7 +301,7 @@
 // needs to be updated to match.
 void FlowGraphCompiler::EmitFrameEntry() {
   if (!flow_graph().graph_entry()->NeedsFrame()) {
-    if (FLAG_use_bare_instructions) {
+    if (FLAG_precompiled_mode) {
       assembler()->set_constant_pool_allowed(true);
     }
     return;
@@ -378,33 +378,6 @@
   EndCodeSourceRange(PrologueSource());
 }
 
-void FlowGraphCompiler::CompileGraph() {
-  InitCompiler();
-
-  // 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();
-
-#if defined(DEBUG)
-  __ int3();
-#endif
-
-  if (!skip_body_compilation()) {
-    ASSERT(assembler()->constant_pool_allowed());
-    GenerateDeferredCode();
-  }
-
-  for (intptr_t i = 0; i < indirect_gotos_.length(); ++i) {
-    indirect_gotos_[i]->ComputeOffsetTable(this);
-  }
-}
-
 void FlowGraphCompiler::EmitCallToStub(const Code& stub) {
   ASSERT(!stub.IsNull());
   if (CanPcRelativeCall(stub)) {
@@ -579,16 +552,9 @@
 
   // Use same code pattern as instance call so it can be parsed by code patcher.
   if (FLAG_precompiled_mode) {
-    if (FLAG_use_bare_instructions) {
-      // The AOT runtime will replace the slot in the object pool with the
-      // entrypoint address - see app_snapshot.cc.
-      __ LoadUniqueObject(RCX, StubCode::MegamorphicCall());
-    } else {
-      __ LoadUniqueObject(CODE_REG, StubCode::MegamorphicCall());
-      __ movq(RCX, compiler::FieldAddress(CODE_REG,
-                                          Code::entry_point_offset(
-                                              Code::EntryKind::kMonomorphic)));
-    }
+    // The AOT runtime will replace the slot in the object pool with the
+    // entrypoint address - see app_snapshot.cc.
+    __ LoadUniqueObject(RCX, StubCode::MegamorphicCall());
     __ LoadUniqueObject(RBX, cache);
     __ call(RCX);
   } else {
@@ -637,7 +603,7 @@
   __ Comment("InstanceCallAOT (%s)", switchable_call_mode);
   __ movq(RDX, compiler::Address(
                    RSP, (ic_data.SizeWithoutTypeArgs() - 1) * kWordSize));
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     // The AOT runtime will replace the slot in the object pool with the
     // entrypoint address - see app_snapshot.cc.
     __ LoadUniqueObject(RCX, initial_stub);
@@ -670,7 +636,7 @@
   if (function.HasOptionalParameters() || function.IsGeneric()) {
     __ LoadObject(R10, arguments_descriptor);
   } else {
-    if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+    if (!FLAG_precompiled_mode) {
       __ xorl(R10, R10);  // GC safe smi zero because of stub.
     }
   }
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 8e7e24d..c3683d0 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -894,17 +894,17 @@
 
 bool LoadFieldInstr::IsUnboxedDartFieldLoad() const {
   return slot().representation() == kTagged && slot().IsDartField() &&
-         FlowGraphCompiler::IsUnboxedField(slot().field());
+         slot().IsUnboxed();
 }
 
 bool LoadFieldInstr::IsPotentialUnboxedDartFieldLoad() const {
   return slot().representation() == kTagged && slot().IsDartField() &&
-         FlowGraphCompiler::IsPotentialUnboxedField(slot().field());
+         slot().IsPotentialUnboxed();
 }
 
 Representation LoadFieldInstr::representation() const {
   if (IsUnboxedDartFieldLoad() && CompilerState::Current().is_optimizing()) {
-    return FlowGraph::UnboxedFieldRepresentationOf(slot().field());
+    return slot().UnboxedRepresentation();
   }
   return slot().representation();
 }
@@ -963,12 +963,12 @@
 
 bool StoreInstanceFieldInstr::IsUnboxedDartFieldStore() const {
   return slot().representation() == kTagged && slot().IsDartField() &&
-         FlowGraphCompiler::IsUnboxedField(slot().field());
+         slot().IsUnboxed();
 }
 
 bool StoreInstanceFieldInstr::IsPotentialUnboxedDartFieldStore() const {
   return slot().representation() == kTagged && slot().IsDartField() &&
-         FlowGraphCompiler::IsPotentialUnboxedField(slot().field());
+         slot().IsPotentialUnboxed();
 }
 
 Representation StoreInstanceFieldInstr::RequiredInputRepresentation(
@@ -979,7 +979,7 @@
     return kTagged;
   }
   if (IsUnboxedDartFieldStore() && CompilerState::Current().is_optimizing()) {
-    return FlowGraph::UnboxedFieldRepresentationOf(slot().field());
+    return slot().UnboxedRepresentation();
   }
   return slot().representation();
 }
@@ -1077,45 +1077,6 @@
   return field().ptr() == other.AsLoadStaticField()->field().ptr();
 }
 
-bool LoadStaticFieldInstr::IsFieldInitialized(Object* field_value) const {
-  if (FLAG_fields_may_be_reset) {
-    return false;
-  }
-
-  // Since new isolates will be spawned, the JITed code cannot depend on whether
-  // global field was initialized when running with --enable-isolate-groups.
-  if (FLAG_enable_isolate_groups) return false;
-
-  const Field& field = this->field();
-  Isolate* only_isolate = IsolateGroup::Current()->FirstIsolate();
-  if (only_isolate == nullptr) {
-    // This can happen if background compiler executes this code but the mutator
-    // is being shutdown and the isolate was already unregistered from the group
-    // (and is trying to stop this BG compiler).
-    if (field_value != nullptr) {
-      *field_value = Object::sentinel().ptr();
-    }
-    return false;
-  }
-  if (field_value == nullptr) {
-    field_value = &Object::Handle();
-  }
-  *field_value = only_isolate->field_table()->At(field.field_id());
-  return (field_value->ptr() != Object::sentinel().ptr()) &&
-         (field_value->ptr() != Object::transition_sentinel().ptr());
-}
-
-Definition* LoadStaticFieldInstr::Canonicalize(FlowGraph* flow_graph) {
-  // When precompiling, the fact that a field is currently initialized does not
-  // make it safe to omit code that checks if the field needs initialization
-  // because the field will be reset so it starts uninitialized in the process
-  // running the precompiled code. We must be prepared to reinitialize fields.
-  if (calls_initializer() && IsFieldInitialized()) {
-    set_calls_initializer(false);
-  }
-  return this;
-}
-
 ConstantInstr::ConstantInstr(const Object& value,
                              const InstructionSource& source)
     : TemplateDefinition(source), value_(value), token_pos_(source.token_pos) {
@@ -1174,18 +1135,18 @@
 
 // Returns true if the value represents a constant.
 bool Value::BindsToConstant() const {
-  return definition()->IsConstant();
+  return definition()->OriginalDefinition()->IsConstant();
 }
 
 // Returns true if the value represents constant null.
 bool Value::BindsToConstantNull() const {
-  ConstantInstr* constant = definition()->AsConstant();
+  ConstantInstr* constant = definition()->OriginalDefinition()->AsConstant();
   return (constant != NULL) && constant->value().IsNull();
 }
 
 const Object& Value::BoundConstant() const {
   ASSERT(BindsToConstant());
-  ConstantInstr* constant = definition()->AsConstant();
+  ConstantInstr* constant = definition()->OriginalDefinition()->AsConstant();
   ASSERT(constant != NULL);
   return constant->value();
 }
@@ -1246,7 +1207,7 @@
 // ==== Support for visiting flow graphs.
 
 #define DEFINE_ACCEPT(ShortName, Attrs)                                        \
-  void ShortName##Instr::Accept(FlowGraphVisitor* visitor) {                   \
+  void ShortName##Instr::Accept(InstructionVisitor* visitor) {                 \
     visitor->Visit##ShortName(this);                                           \
   }
 
@@ -2584,7 +2545,8 @@
   if (!HasUses() && !flow_graph->is_licm_allowed()) {
     return NULL;
   }
-  if ((constrained_type() != nullptr) && Type()->IsEqualTo(value()->Type())) {
+  if (constrained_type() != nullptr &&
+      constrained_type()->IsEqualTo(value()->Type())) {
     return value()->definition();
   }
   return this;
@@ -4178,10 +4140,25 @@
 LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
-  const intptr_t kNumTemps = 0;
+  const bool use_shared_stub = UseSharedSlowPathStub(opt);
+  const intptr_t kNumTemps = calls_initializer() &&
+                                     throw_exception_on_initialization() &&
+                                     use_shared_stub
+                                 ? 1
+                                 : 0;
   LocationSummary* locs = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps,
-      calls_initializer() ? LocationSummary::kCall : LocationSummary::kNoCall);
+      calls_initializer()
+          ? (throw_exception_on_initialization()
+                 ? (use_shared_stub ? LocationSummary::kCallOnSharedSlowPath
+                                    : LocationSummary::kCallOnSlowPath)
+                 : LocationSummary::kCall)
+          : LocationSummary::kNoCall);
+  if (calls_initializer() && throw_exception_on_initialization() &&
+      use_shared_stub) {
+    locs->set_temp(
+        0, Location::RegisterLocation(LateInitializationErrorABI::kFieldReg));
+  }
   locs->set_out(0, calls_initializer() ? Location::RegisterLocation(
                                              InitStaticFieldABI::kResultReg)
                                        : Location::RequiresRegister());
@@ -4202,26 +4179,50 @@
   __ LoadMemoryValue(result, result, static_cast<int32_t>(field_offset));
 
   if (calls_initializer()) {
-    compiler::Label call_runtime, no_call;
-    __ CompareObject(result, Object::sentinel());
+    if (throw_exception_on_initialization()) {
+      ThrowErrorSlowPathCode* slow_path =
+          new LateInitializationErrorSlowPath(this);
+      compiler->AddSlowPathCode(slow_path);
 
+      __ CompareObject(result, Object::sentinel());
+      __ BranchIf(EQUAL, slow_path->entry_label());
+      return;
+    }
+    ASSERT(field().has_initializer());
+    auto object_store = compiler->isolate_group()->object_store();
+    const Field& original_field = Field::ZoneHandle(field().Original());
+
+    compiler::Label no_call, call_initializer;
+    __ CompareObject(result, Object::sentinel());
     if (!field().is_late()) {
-      __ BranchIf(EQUAL, &call_runtime);
+      __ BranchIf(EQUAL, &call_initializer);
       __ CompareObject(result, Object::transition_sentinel());
     }
-
     __ BranchIf(NOT_EQUAL, &no_call);
 
-    __ Bind(&call_runtime);
-    __ LoadObject(InitStaticFieldABI::kFieldReg,
-                  Field::ZoneHandle(field().Original()));
+    auto& stub = Code::ZoneHandle(compiler->zone());
+    __ Bind(&call_initializer);
+    if (field().needs_load_guard()) {
+      stub = object_store->init_static_field_stub();
+    } else if (field().is_late()) {
+      // The stubs below call the initializer function directly, so make sure
+      // one is created.
+      original_field.EnsureInitializerFunction();
+      stub = field().is_final()
+                 ? object_store->init_late_final_static_field_stub()
+                 : object_store->init_late_static_field_stub();
+    } else {
+      // We call to runtime for non-late fields because the stub would need to
+      // catch any exception generated by the initialization function to change
+      // the value of the static field from the transition sentinel to null.
+      stub = object_store->init_static_field_stub();
+    }
 
-    auto object_store = compiler->isolate_group()->object_store();
-    const auto& init_static_field_stub = Code::ZoneHandle(
-        compiler->zone(), object_store->init_static_field_stub());
-    compiler->GenerateStubCall(source(), init_static_field_stub,
+    __ LoadObject(InitStaticFieldABI::kFieldReg, original_field);
+    compiler->GenerateStubCall(source(), stub,
                                /*kind=*/UntaggedPcDescriptors::kOther, locs(),
                                deopt_id(), env());
+
     __ Bind(&no_call);
   }
 }
@@ -4232,7 +4233,7 @@
 
   if (throw_exception_on_initialization()) {
     ThrowErrorSlowPathCode* slow_path =
-        new LateInitializationErrorSlowPath(this, compiler->CurrentTryIndex());
+        new LateInitializationErrorSlowPath(this);
     compiler->AddSlowPathCode(slow_path);
 
     const Register result_reg = locs()->out(0).reg();
@@ -5521,8 +5522,7 @@
   ASSERT(representation() == RequiredInputRepresentation(kIndexPos));
   ASSERT(representation() == RequiredInputRepresentation(kLengthPos));
 
-  RangeErrorSlowPath* slow_path =
-      new RangeErrorSlowPath(this, compiler->CurrentTryIndex());
+  RangeErrorSlowPath* slow_path = new RangeErrorSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
   Location length_loc = locs()->in(kLengthPos);
   Location index_loc = locs()->in(kIndexPos);
@@ -5959,8 +5959,43 @@
   }
 }
 
+static bool AllInputsAreRedefinitions(PhiInstr* phi) {
+  for (intptr_t i = 0; i < phi->InputCount(); i++) {
+    if (phi->InputAt(i)->definition()->RedefinedValue() == nullptr) {
+      return false;
+    }
+  }
+  return true;
+}
+
 Definition* PhiInstr::Canonicalize(FlowGraph* flow_graph) {
   Definition* replacement = GetReplacementForRedundantPhi();
+  if (replacement != nullptr && flow_graph->is_licm_allowed() &&
+      AllInputsAreRedefinitions(this)) {
+    // If we are replacing a Phi which has redefinitions as all of its inputs
+    // then to maintain the redefinition chain we are going to insert a
+    // redefinition. If any input is *not* a redefinition that means that
+    // whatever properties were infered for a Phi also hold on a path
+    // that does not pass through any redefinitions so there is no need
+    // to redefine this value.
+    auto zone = flow_graph->zone();
+    auto redef = new (zone) RedefinitionInstr(new (zone) Value(replacement));
+    flow_graph->InsertAfter(block(), redef, /*env=*/nullptr, FlowGraph::kValue);
+
+    // Redefinition is not going to dominate the block entry itself, so we
+    // have to handle environment uses at the block entry specially.
+    Value* next_use;
+    for (Value* use = env_use_list(); use != nullptr; use = next_use) {
+      next_use = use->next_use();
+      if (use->instruction() == block()) {
+        use->RemoveFromUseList();
+        use->set_definition(replacement);
+        replacement->AddEnvUse(use);
+      }
+    }
+    return redef;
+  }
+
   return (replacement != nullptr) ? replacement : this;
 }
 
@@ -6185,7 +6220,7 @@
 }
 
 bool Utf8ScanInstr::IsScanFlagsUnboxed() const {
-  return FlowGraphCompiler::IsUnboxedField(scan_flags_field_.field());
+  return scan_flags_field_.IsUnboxed();
 }
 
 InvokeMathCFunctionInstr::InvokeMathCFunctionInstr(
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 745412a..3ef43cc 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -11,6 +11,7 @@
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
 #include <memory>
+#include <tuple>
 #include <utility>
 
 #include "vm/allocation.h"
@@ -54,6 +55,7 @@
 class FlowGraphVisitor;
 class ForwardInstructionIterator;
 class Instruction;
+class InstructionVisitor;
 class LocalVariable;
 class LoopInfo;
 class ParsedFunction;
@@ -235,6 +237,10 @@
     return cid_start == kIllegalCid && cid_end == kIllegalCid;
   }
 
+  bool Equals(const CidRangeValue& other) const {
+    return cid_start == other.cid_start && cid_end == other.cid_end;
+  }
+
   intptr_t cid_start;
   intptr_t cid_end;
 };
@@ -537,7 +543,7 @@
 // Functions required in all concrete instruction classes.
 #define DECLARE_INSTRUCTION_NO_BACKEND(type)                                   \
   virtual Tag tag() const { return k##type; }                                  \
-  virtual void Accept(FlowGraphVisitor* visitor);                              \
+  virtual void Accept(InstructionVisitor* visitor);                            \
   DEFINE_INSTRUCTION_TYPE_CHECK(type)
 
 #define DECLARE_INSTRUCTION_BACKEND()                                          \
@@ -564,9 +570,13 @@
 #define PRINT_TO_SUPPORT virtual void PrintTo(BaseTextBuffer* f) const;
 #define PRINT_OPERANDS_TO_SUPPORT                                              \
   virtual void PrintOperandsTo(BaseTextBuffer* f) const;
+#define DECLARE_ATTRIBUTES(...)                                                \
+  auto GetAttributes() const { return std::make_tuple(__VA_ARGS__); }          \
+  static auto GetAttributeNames() { return std::make_tuple(#__VA_ARGS__); }
 #else
 #define PRINT_TO_SUPPORT
 #define PRINT_OPERANDS_TO_SUPPORT
+#define DECLARE_ATTRIBUTES(...)
 #endif  // defined(INCLUDE_IL_PRINTER)
 
 // Together with CidRange, this represents a mapping from a range of class-ids
@@ -867,7 +877,7 @@
   }
 
   // Visiting support.
-  virtual void Accept(FlowGraphVisitor* visitor) = 0;
+  virtual void Accept(InstructionVisitor* visitor) = 0;
 
   Instruction* previous() const { return previous_; }
   void set_previous(Instruction* instr) {
@@ -953,6 +963,11 @@
     return static_cast<T*>(this);
   }
 
+  template <typename T>
+  const T* Cast() const {
+    return static_cast<const T*>(this);
+  }
+
   // Returns structure describing location constraints required
   // to emit native code for this instruction.
   LocationSummary* locs() {
@@ -2566,6 +2581,7 @@
         block_(block) {}
 
   DECLARE_INSTRUCTION(Parameter)
+  DECLARE_ATTRIBUTES(index())
 
   intptr_t index() const { return index_; }
   intptr_t param_offset() const { return param_offset_; }
@@ -3254,6 +3270,7 @@
 
   virtual TokenPosition token_pos() const { return token_pos_; }
   Token::Kind kind() const { return kind_; }
+  DECLARE_ATTRIBUTES(kind())
 
   virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right) = 0;
 
@@ -3762,6 +3779,8 @@
 
   virtual Value* RedefinedValue() const;
 
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
+
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
@@ -4098,6 +4117,9 @@
   Code::EntryKind entry_kind() const { return entry_kind_; }
   void set_entry_kind(Code::EntryKind value) { entry_kind_ = value; }
 
+  void mark_as_call_on_this() { is_call_on_this_ = true; }
+  bool is_call_on_this() const { return is_call_on_this_; }
+
   DEFINE_INSTRUCTION_TYPE_CHECK(InstanceCallBase);
 
   bool receiver_is_not_smi() const { return receiver_is_not_smi_; }
@@ -4144,6 +4166,7 @@
   bool has_unique_selector_;
   Code::EntryKind entry_kind_ = Code::EntryKind::kNormal;
   bool receiver_is_not_smi_ = false;
+  bool is_call_on_this_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(InstanceCallBaseInstr);
 };
@@ -4254,6 +4277,9 @@
     new_call->set_result_type(call->result_type());
     new_call->set_entry_kind(call->entry_kind());
     new_call->set_has_unique_selector(call->has_unique_selector());
+    if (call->is_call_on_this()) {
+      new_call->mark_as_call_on_this();
+    }
     return new_call;
   }
 
@@ -5559,28 +5585,82 @@
   DISALLOW_COPY_AND_ASSIGN(GuardFieldTypeInstr);
 };
 
-class LoadStaticFieldInstr : public TemplateDefinition<0, Throws> {
+template <intptr_t N>
+class TemplateLoadField : public TemplateDefinition<N, Throws> {
+  using Base = TemplateDefinition<N, Throws>;
+
+ public:
+  TemplateLoadField(const InstructionSource& source,
+                    bool calls_initializer = false,
+                    intptr_t deopt_id = DeoptId::kNone,
+                    const Field* field = nullptr)
+      : Base(source, deopt_id),
+        token_pos_(source.token_pos),
+        calls_initializer_(calls_initializer),
+        throw_exception_on_initialization_(false) {
+    ASSERT(!calls_initializer || (deopt_id != DeoptId::kNone));
+    if (calls_initializer_) {
+      ASSERT(field != nullptr);
+      throw_exception_on_initialization_ = !field->needs_load_guard() &&
+                                           field->is_late() &&
+                                           !field->has_initializer();
+    }
+  }
+
+  virtual TokenPosition token_pos() const { return token_pos_; }
+  bool calls_initializer() const { return calls_initializer_; }
+  void set_calls_initializer(bool value) { calls_initializer_ = value; }
+
+  bool throw_exception_on_initialization() const {
+    return throw_exception_on_initialization_;
+  }
+
+  // Slow path is used if load throws exception on initialization.
+  virtual bool UseSharedSlowPathStub(bool is_optimizing) const {
+    return Base::SlowPathSharingSupported(is_optimizing);
+  }
+
+  virtual intptr_t DeoptimizationTarget() const { return Base::GetDeoptId(); }
+  virtual bool ComputeCanDeoptimize() const { return false; }
+  virtual bool ComputeCanDeoptimizeAfterCall() const {
+    return calls_initializer() && !CompilerState::Current().is_aot();
+  }
+  virtual intptr_t NumberOfInputsConsumedBeforeCall() const {
+    return Base::InputCount();
+  }
+
+  virtual bool HasUnknownSideEffects() const {
+    return calls_initializer() && !throw_exception_on_initialization();
+  }
+
+  virtual bool CanCallDart() const {
+    return calls_initializer() && !throw_exception_on_initialization();
+  }
+  virtual bool CanTriggerGC() const { return calls_initializer(); }
+  virtual bool MayThrow() const { return calls_initializer(); }
+
+ private:
+  const TokenPosition token_pos_;
+  bool calls_initializer_;
+  bool throw_exception_on_initialization_;
+
+  DISALLOW_COPY_AND_ASSIGN(TemplateLoadField);
+};
+
+class LoadStaticFieldInstr : public TemplateLoadField<0> {
  public:
   LoadStaticFieldInstr(const Field& field,
                        const InstructionSource& source,
                        bool calls_initializer = false,
                        intptr_t deopt_id = DeoptId::kNone)
-      : TemplateDefinition(source, deopt_id),
-        field_(field),
-        token_pos_(source.token_pos),
-        calls_initializer_(calls_initializer) {
-    ASSERT(!calls_initializer || (deopt_id != DeoptId::kNone));
-  }
+      : TemplateLoadField<0>(source, calls_initializer, deopt_id, &field),
+        field_(field) {}
 
   DECLARE_INSTRUCTION(LoadStaticField)
 
   virtual CompileType ComputeType() const;
 
   const Field& field() const { return field_; }
-  bool IsFieldInitialized(Object* field_value = nullptr) const;
-
-  bool calls_initializer() const { return calls_initializer_; }
-  void set_calls_initializer(bool value) { calls_initializer_ = value; }
 
   virtual bool AllowsCSE() const {
     // If two loads of a static-final-late field call the initializer and one
@@ -5594,25 +5674,12 @@
            (!field().is_late() || field().has_initializer());
   }
 
-  virtual bool ComputeCanDeoptimize() const {
-    return calls_initializer() && !CompilerState::Current().is_aot();
-  }
-  virtual bool HasUnknownSideEffects() const { return calls_initializer(); }
-  virtual bool CanTriggerGC() const { return calls_initializer(); }
-  virtual bool MayThrow() const { return calls_initializer(); }
-
-  virtual Definition* Canonicalize(FlowGraph* flow_graph);
-
   virtual bool AttributesEqual(const Instruction& other) const;
 
-  virtual TokenPosition token_pos() const { return token_pos_; }
-
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
   const Field& field_;
-  const TokenPosition token_pos_;
-  bool calls_initializer_;
 
   DISALLOW_COPY_AND_ASSIGN(LoadStaticFieldInstr);
 };
@@ -6625,46 +6692,24 @@
 // 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, Throws> {
+class LoadFieldInstr : public TemplateLoadField<1> {
  public:
   LoadFieldInstr(Value* instance,
                  const Slot& slot,
                  const InstructionSource& source,
                  bool calls_initializer = false,
                  intptr_t deopt_id = DeoptId::kNone)
-      : TemplateDefinition(source, deopt_id),
-        slot_(slot),
-        token_pos_(source.token_pos),
-        calls_initializer_(calls_initializer),
-        throw_exception_on_initialization_(false) {
-    ASSERT(!calls_initializer || (deopt_id != DeoptId::kNone));
-    ASSERT(!calls_initializer || slot.IsDartField());
+      : TemplateLoadField(source,
+                          calls_initializer,
+                          deopt_id,
+                          slot.IsDartField() ? &slot.field() : nullptr),
+        slot_(slot) {
     SetInputAt(0, instance);
-    if (calls_initializer_) {
-      const Field& field = slot.field();
-      throw_exception_on_initialization_ = !field.needs_load_guard() &&
-                                           field.is_late() &&
-                                           !field.has_initializer();
-    }
   }
 
   Value* instance() const { return inputs_[0]; }
   const Slot& slot() const { return slot_; }
 
-  virtual TokenPosition token_pos() const { return token_pos_; }
-
-  bool calls_initializer() const { return calls_initializer_; }
-  void set_calls_initializer(bool value) { calls_initializer_ = value; }
-
-  bool throw_exception_on_initialization() const {
-    return throw_exception_on_initialization_;
-  }
-
-  // Slow path is used if load throws exception on initialization.
-  virtual bool UseSharedSlowPathStub(bool is_optimizing) const {
-    return SlowPathSharingSupported(is_optimizing);
-  }
-
   virtual Representation representation() const;
 
   // Returns whether this instruction is an unboxed load from a _boxed_ Dart
@@ -6677,27 +6722,10 @@
   bool IsPotentialUnboxedDartFieldLoad() const;
 
   DECLARE_INSTRUCTION(LoadField)
+  DECLARE_ATTRIBUTES(&slot())
+
   virtual CompileType ComputeType() const;
 
-  virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
-  virtual bool ComputeCanDeoptimize() const { return false; }
-  virtual bool ComputeCanDeoptimizeAfterCall() const {
-    return calls_initializer() && !CompilerState::Current().is_aot();
-  }
-  virtual intptr_t NumberOfInputsConsumedBeforeCall() const {
-    return InputCount();
-  }
-
-  virtual bool HasUnknownSideEffects() const {
-    return calls_initializer() && !throw_exception_on_initialization();
-  }
-
-  virtual bool CanCallDart() const {
-    return calls_initializer() && !throw_exception_on_initialization();
-  }
-  virtual bool CanTriggerGC() const { return calls_initializer(); }
-  virtual bool MayThrow() const { return calls_initializer(); }
-
   virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
   bool IsImmutableLengthLoad() const { return slot().IsImmutableLengthSlot(); }
@@ -6736,9 +6764,6 @@
   void EmitNativeCodeForInitializerCall(FlowGraphCompiler* compiler);
 
   const Slot& slot_;
-  const TokenPosition token_pos_;
-  bool calls_initializer_;
-  bool throw_exception_on_initialization_;
 
   DISALLOW_COPY_AND_ASSIGN(LoadFieldInstr);
 };
@@ -8877,7 +8902,9 @@
   virtual bool AllowsCSE() const { return true; }
   virtual bool HasUnknownSideEffects() const { return false; }
 
-  virtual bool AttributesEqual(const Instruction& other) const { return true; }
+  virtual bool AttributesEqual(const Instruction& other) const {
+    return other.Cast<CheckClassIdInstr>()->cids().Equals(cids_);
+  }
 
   PRINT_OPERANDS_TO_SUPPORT
 
@@ -9667,9 +9694,27 @@
   DISALLOW_COPY_AND_ASSIGN(Environment);
 };
 
+class InstructionVisitor : public ValueObject {
+ public:
+  InstructionVisitor() {}
+  virtual ~InstructionVisitor() {}
+
+// Visit functions for instruction classes, with an empty default
+// implementation.
+#define DECLARE_VISIT_INSTRUCTION(ShortName, Attrs)                            \
+  virtual void Visit##ShortName(ShortName##Instr* instr) {}
+
+  FOR_EACH_INSTRUCTION(DECLARE_VISIT_INSTRUCTION)
+
+#undef DECLARE_VISIT_INSTRUCTION
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(InstructionVisitor);
+};
+
 // Visitor base class to visit each instruction and computation in a flow
 // graph as defined by a reversed list of basic blocks.
-class FlowGraphVisitor : public ValueObject {
+class FlowGraphVisitor : public InstructionVisitor {
  public:
   explicit FlowGraphVisitor(const GrowableArray<BlockEntryInstr*>& block_order)
       : current_iterator_(NULL), block_order_(&block_order) {}
@@ -9683,15 +9728,6 @@
   // instructions in order from the block entry to exit.
   virtual void VisitBlocks();
 
-// Visit functions for instruction classes, with an empty default
-// implementation.
-#define DECLARE_VISIT_INSTRUCTION(ShortName, Attrs)                            \
-  virtual void Visit##ShortName(ShortName##Instr* instr) {}
-
-  FOR_EACH_INSTRUCTION(DECLARE_VISIT_INSTRUCTION)
-
-#undef DECLARE_VISIT_INSTRUCTION
-
  protected:
   void set_block_order(const GrowableArray<BlockEntryInstr*>& block_order) {
     block_order_ = &block_order;
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 30015fa..3e956fe 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -599,7 +599,7 @@
   __ LoadObject(R4, arguments_descriptor);
 
   ASSERT(locs()->in(0).reg() == R0);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     // R0: Closure with a cached entry point.
     __ ldr(R2, compiler::FieldAddress(
                    R0, compiler::target::Closure::entry_point_offset()));
@@ -1448,7 +1448,23 @@
   }
 
   if (is_leaf_) {
+#if !defined(PRODUCT)
+    // Set the thread object's top_exit_frame_info and VMTag to enable the
+    // profiler to determine that thread is no longer executing Dart code.
+    __ StoreToOffset(FPREG, THR,
+                     compiler::target::Thread::top_exit_frame_info_offset());
+    __ StoreToOffset(branch, THR, compiler::target::Thread::vm_tag_offset());
+#endif
+
     __ blx(branch);
+
+#if !defined(PRODUCT)
+    __ LoadImmediate(temp1, compiler::target::Thread::vm_tag_dart_id());
+    __ StoreToOffset(temp1, THR, compiler::target::Thread::vm_tag_offset());
+    __ LoadImmediate(temp1, 0);
+    __ StoreToOffset(temp1, THR,
+                     compiler::target::Thread::top_exit_frame_info_offset());
+#endif
   } else {
     // We need to copy the return address up into the dummy stack frame so the
     // stack walker will know which safepoint to use.
@@ -1493,7 +1509,7 @@
 
     // 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) {
+    if (FLAG_precompiled_mode) {
       __ SetupGlobalPoolAndDispatchTable();
     }
   }
@@ -1660,7 +1676,7 @@
   // Put the code object in the reserved slot.
   __ StoreToOffset(CODE_REG, FPREG,
                    kPcMarkerSlotFromFp * compiler::target::kWordSize);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
   } else {
     __ LoadImmediate(PP, 0);  // GC safe value into PP.
@@ -4768,7 +4784,7 @@
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
   // Shared slow path is used in BoxInt64Instr::EmitNativeCode in
-  // FLAG_use_bare_instructions mode and only after VM isolate stubs where
+  // precompiled mode and only after VM isolate stubs where
   // replaced with isolate-specific stubs.
   auto object_store = IsolateGroup::Current()->object_store();
   const bool stubs_in_vm_isolate =
@@ -4779,7 +4795,6 @@
           ->untag()
           ->InVMIsolateHeap();
   const bool shared_slow_path_call = SlowPathSharingSupported(opt) &&
-                                     FLAG_use_bare_instructions &&
                                      !stubs_in_vm_isolate;
   LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps,
@@ -6388,8 +6403,7 @@
     return;
   }
 
-  ThrowErrorSlowPathCode* slow_path =
-      new NullErrorSlowPath(this, compiler->CurrentTryIndex());
+  ThrowErrorSlowPathCode* slow_path = new NullErrorSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
 
   __ BranchIf(EQUAL, slow_path->entry_label());
@@ -6724,10 +6738,9 @@
 
 class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
+  explicit ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               kArgumentErrorUnboxedInt64RuntimeEntry,
-                               try_index) {}
+                               kArgumentErrorUnboxedInt64RuntimeEntry) {}
 
   const char* name() override { return "int64 shift"; }
 
@@ -6818,8 +6831,7 @@
     // Jump to a slow path if shift is larger than 63 or less than 0.
     ShiftInt64OpSlowPath* slow_path = NULL;
     if (!IsShiftCountInRange()) {
-      slow_path =
-          new (Z) ShiftInt64OpSlowPath(this, compiler->CurrentTryIndex());
+      slow_path = new (Z) ShiftInt64OpSlowPath(this);
       compiler->AddSlowPathCode(slow_path);
       __ CompareImmediate(right_hi, 0);
       __ b(slow_path->entry_label(), NE);
@@ -6885,10 +6897,9 @@
 
 class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
+  explicit ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               kArgumentErrorUnboxedInt64RuntimeEntry,
-                               try_index) {}
+                               kArgumentErrorUnboxedInt64RuntimeEntry) {}
 
   const char* name() override { return "uint32 shift"; }
 
@@ -6954,8 +6965,7 @@
     // Jump to a slow path if shift count is > 31 or negative.
     ShiftUint32OpSlowPath* slow_path = NULL;
     if (!IsShiftCountInRange(kUint32ShiftCountLimit)) {
-      slow_path =
-          new (Z) ShiftUint32OpSlowPath(this, compiler->CurrentTryIndex());
+      slow_path = new (Z) ShiftUint32OpSlowPath(this);
       compiler->AddSlowPathCode(slow_path);
 
       __ CompareImmediate(right_hi, 0);
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index ce64f09..1c5673c 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -523,7 +523,7 @@
   __ LoadObject(R4, arguments_descriptor);
 
   ASSERT(locs()->in(0).reg() == R0);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     // R0: Closure with a cached entry point.
     __ LoadFieldFromOffset(R2, R0,
                            compiler::target::Closure::entry_point_offset());
@@ -1071,7 +1071,7 @@
   Location right = locs()->in(1);
   if (right.IsConstant()) {
     ASSERT(right.constant().IsSmi());
-    const int64_t imm = static_cast<int64_t>(right.constant().ptr());
+    const int64_t imm = Smi::RawValue(Smi::Cast(right.constant()).Value());
     __ TestImmediate(left, imm, compiler::kObjectBytes);
   } else {
     __ tst(left, compiler::Operand(right.reg()), compiler::kObjectBytes);
@@ -1270,6 +1270,14 @@
   }
 
   if (is_leaf_) {
+#if !defined(PRODUCT)
+    // Set the thread object's top_exit_frame_info and VMTag to enable the
+    // profiler to determine that thread is no longer executing Dart code.
+    __ StoreToOffset(FPREG, THR,
+                     compiler::target::Thread::top_exit_frame_info_offset());
+    __ StoreToOffset(branch, THR, compiler::target::Thread::vm_tag_offset());
+#endif
+
     // We are entering runtime code, so the C stack pointer must be restored
     // from the stack limit to the top of the stack.
     __ mov(R25, CSP);
@@ -1280,6 +1288,13 @@
     // Restore the Dart stack pointer.
     __ mov(SP, CSP);
     __ mov(CSP, R25);
+
+#if !defined(PRODUCT)
+    __ LoadImmediate(temp1, compiler::target::Thread::vm_tag_dart_id());
+    __ StoreToOffset(temp1, THR, compiler::target::Thread::vm_tag_offset());
+    __ StoreToOffset(ZR, THR,
+                     compiler::target::Thread::top_exit_frame_info_offset());
+#endif
   } else {
     // We need to copy a dummy return address up into the dummy stack frame so
     // the stack walker will know which safepoint to use.
@@ -1343,7 +1358,7 @@
 
     // 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) {
+    if (FLAG_precompiled_mode) {
       __ SetupGlobalPoolAndDispatchTable();
     }
 
@@ -1506,7 +1521,7 @@
   // Put the code object in the reserved slot.
   __ StoreToOffset(CODE_REG, FPREG,
                    kPcMarkerSlotFromFp * compiler::target::kWordSize);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
   } else {
     // We now load the pool pointer (PP) with a GC safe value as we are about to
@@ -2300,7 +2315,7 @@
            compiler::FieldAddress(
                field_reg, Field::guarded_list_length_in_object_offset_offset()),
            compiler::kByte);
-    __ LoadCompressed(
+    __ LoadCompressedSmi(
         length_reg,
         compiler::FieldAddress(field_reg, Field::guarded_list_length_offset()));
 
@@ -2311,7 +2326,7 @@
     // value's class matches guarded class id of the field.
     // offset_reg contains offset already corrected by -kHeapObjectTag that is
     // why we use Address instead of FieldAddress.
-    __ ldr(TMP, compiler::Address(value_reg, offset_reg));
+    __ LoadCompressedSmi(TMP, compiler::Address(value_reg, offset_reg));
     __ CompareObjectRegisters(length_reg, TMP);
 
     if (deopt == NULL) {
@@ -2705,10 +2720,8 @@
   // R3: new object end address.
   // R8: iterator which initially points to the start of the variable
   // data area to be initialized.
-  // R6: null
   if (num_elements > 0) {
     const intptr_t array_size = instance_size - sizeof(UntaggedArray);
-    __ LoadObject(R6, Object::null_object());
     __ AddImmediate(R8, AllocateArrayABI::kResultReg,
                     sizeof(UntaggedArray) - kHeapObjectTag);
     if (array_size < (kInlineArraySize * kCompressedWordSize)) {
@@ -2718,7 +2731,7 @@
             AllocateArrayABI::kResultReg,
             compiler::Address(R8, current_offset, compiler::Address::Offset,
                               compiler::kObjectBytes),
-            R6);
+            NULL_REG);
         current_offset += kCompressedWordSize;
       }
     } else {
@@ -2730,7 +2743,7 @@
           AllocateArrayABI::kResultReg,
           compiler::Address(R8, 0, compiler::Address::Offset,
                             compiler::kObjectBytes),
-          R6);
+          NULL_REG);
       __ AddImmediate(R8, kCompressedWordSize);
       __ b(&init_loop);
       __ Bind(&end_loop);
@@ -3440,7 +3453,7 @@
   if (locs()->in(1).IsConstant()) {
     const Object& constant = locs()->in(1).constant();
     ASSERT(constant.IsSmi());
-    const int64_t imm = static_cast<int64_t>(constant.ptr());
+    const int64_t imm = Smi::RawValue(Smi::Cast(constant).Value());
     switch (op_kind()) {
       case Token::kADD: {
         if (deopt == NULL) {
@@ -3996,7 +4009,7 @@
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
   // Shared slow path is used in BoxInt64Instr::EmitNativeCode in
-  // FLAG_use_bare_instructions mode and only after VM isolate stubs where
+  // precompiled mode and only after VM isolate stubs where
   // replaced with isolate-specific stubs.
   auto object_store = IsolateGroup::Current()->object_store();
   const bool stubs_in_vm_isolate =
@@ -4007,7 +4020,6 @@
           ->untag()
           ->InVMIsolateHeap();
   const bool shared_slow_path_call = SlowPathSharingSupported(opt) &&
-                                     FLAG_use_bare_instructions &&
                                      !stubs_in_vm_isolate;
   LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps,
@@ -5408,8 +5420,7 @@
 }
 
 void CheckNullInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ThrowErrorSlowPathCode* slow_path =
-      new NullErrorSlowPath(this, compiler->CurrentTryIndex());
+  ThrowErrorSlowPathCode* slow_path = new NullErrorSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
 
   Register value_reg = locs()->in(0).reg();
@@ -5492,11 +5503,9 @@
                       Register divisor,
                       Range* divisor_range,
                       Register tmp,
-                      Register out,
-                      intptr_t try_index)
+                      Register out)
       : ThrowErrorSlowPathCode(instruction,
-                               kIntegerDivisionByZeroExceptionRuntimeEntry,
-                               try_index),
+                               kIntegerDivisionByZeroExceptionRuntimeEntry),
         is_mod_(instruction->op_kind() == Token::kMOD),
         divisor_(divisor),
         divisor_range_(divisor_range),
@@ -5620,8 +5629,8 @@
 
   // Prepare a slow path.
   Range* right_range = instruction->right()->definition()->range();
-  Int64DivideSlowPath* slow_path = new (Z) Int64DivideSlowPath(
-      instruction, right, right_range, tmp, out, compiler->CurrentTryIndex());
+  Int64DivideSlowPath* slow_path =
+      new (Z) Int64DivideSlowPath(instruction, right, right_range, tmp, out);
 
   // Handle modulo/division by zero exception on slow path.
   if (slow_path->has_divide_by_zero()) {
@@ -5850,10 +5859,9 @@
 
 class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
+  explicit ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               kArgumentErrorUnboxedInt64RuntimeEntry,
-                               try_index) {}
+                               kArgumentErrorUnboxedInt64RuntimeEntry) {}
 
   const char* name() override { return "int64 shift"; }
 
@@ -5920,8 +5928,7 @@
     // Jump to a slow path if shift is larger than 63 or less than 0.
     ShiftInt64OpSlowPath* slow_path = NULL;
     if (!IsShiftCountInRange()) {
-      slow_path =
-          new (Z) ShiftInt64OpSlowPath(this, compiler->CurrentTryIndex());
+      slow_path = new (Z) ShiftInt64OpSlowPath(this);
       compiler->AddSlowPathCode(slow_path);
       __ CompareImmediate(shift, kShiftCountLimit);
       __ b(slow_path->entry_label(), HI);
@@ -5980,10 +5987,9 @@
 
 class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
+  explicit ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               kArgumentErrorUnboxedInt64RuntimeEntry,
-                               try_index) {}
+                               kArgumentErrorUnboxedInt64RuntimeEntry) {}
 
   const char* name() override { return "uint32 shift"; }
 
@@ -6029,8 +6035,7 @@
 
     // Jump to a slow path if shift count is negative.
     if (!shift_count_in_range) {
-      ShiftUint32OpSlowPath* slow_path =
-          new (Z) ShiftUint32OpSlowPath(this, compiler->CurrentTryIndex());
+      ShiftUint32OpSlowPath* slow_path = new (Z) ShiftUint32OpSlowPath(this);
       compiler->AddSlowPathCode(slow_path);
 
       __ tbnz(slow_path->entry_label(), right, kBitsPerWord - 1);
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index 198e2d4..60dd46e 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -1052,7 +1052,24 @@
   }
 
   if (is_leaf_) {
+#if !defined(PRODUCT)
+    // Set the thread object's top_exit_frame_info and VMTag to enable the
+    // profiler to determine that thread is no longer executing Dart code.
+    __ movl(compiler::Address(
+                THR, compiler::target::Thread::top_exit_frame_info_offset()),
+            FPREG);
+    __ movl(compiler::Assembler::VMTagAddress(), branch);
+#endif
+
     __ call(branch);
+
+#if !defined(PRODUCT)
+    __ movl(compiler::Assembler::VMTagAddress(),
+            compiler::Immediate(compiler::target::Thread::vm_tag_dart_id()));
+    __ movl(compiler::Address(
+                THR, compiler::target::Thread::top_exit_frame_info_offset()),
+            compiler::Immediate(0));
+#endif
   } else {
     // We need to copy a dummy return address up into the dummy stack frame so
     // the stack walker will know which safepoint to use. Unlike X64, there's no
@@ -5534,8 +5551,7 @@
 }
 
 void CheckNullInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ThrowErrorSlowPathCode* slow_path =
-      new NullErrorSlowPath(this, compiler->CurrentTryIndex());
+  ThrowErrorSlowPathCode* slow_path = new NullErrorSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
 
   Register value_reg = locs()->in(0).reg();
@@ -5906,10 +5922,9 @@
 
 class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
+  explicit ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               kArgumentErrorUnboxedInt64RuntimeEntry,
-                               try_index) {}
+                               kArgumentErrorUnboxedInt64RuntimeEntry) {}
 
   const char* name() override { return "int64 shift"; }
 
@@ -6005,8 +6020,7 @@
     // Jump to a slow path if shift count is > 63 or negative.
     ShiftInt64OpSlowPath* slow_path = NULL;
     if (!IsShiftCountInRange()) {
-      slow_path =
-          new (Z) ShiftInt64OpSlowPath(this, compiler->CurrentTryIndex());
+      slow_path = new (Z) ShiftInt64OpSlowPath(this);
       compiler->AddSlowPathCode(slow_path);
       __ testl(right_hi, right_hi);
       __ j(NOT_ZERO, slow_path->entry_label());
@@ -6069,10 +6083,9 @@
 
 class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
+  explicit ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               kArgumentErrorUnboxedInt64RuntimeEntry,
-                               try_index) {}
+                               kArgumentErrorUnboxedInt64RuntimeEntry) {}
 
   const char* name() override { return "uint32 shift"; }
 
@@ -6140,8 +6153,7 @@
     // Jump to a slow path if shift count is > 31 or negative.
     ShiftUint32OpSlowPath* slow_path = NULL;
     if (!IsShiftCountInRange(kUint32ShiftCountLimit)) {
-      slow_path =
-          new (Z) ShiftUint32OpSlowPath(this, compiler->CurrentTryIndex());
+      slow_path = new (Z) ShiftUint32OpSlowPath(this);
       compiler->AddSlowPathCode(slow_path);
 
       __ testl(right_hi, right_hi);
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index 1c8b3f8..cc6770b 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -4,6 +4,8 @@
 
 #include "vm/compiler/backend/il_printer.h"
 
+#include <tuple>
+
 #include "vm/compiler/api/print_filter.h"
 #include "vm/compiler/backend/il.h"
 #include "vm/compiler/backend/linearscan.h"
@@ -20,19 +22,198 @@
             false,
             "Calls display a unary, sorted-by count form of ICData");
 DEFINE_FLAG(bool, print_environments, false, "Print SSA environments.");
+DEFINE_FLAG(bool,
+            print_flow_graph_as_json,
+            false,
+            "Use machine readable output when printing IL graphs.");
 
 DECLARE_FLAG(bool, trace_inlining_intervals);
 
-bool FlowGraphPrinter::ShouldPrint(const Function& function) {
-  return compiler::PrintFilter::ShouldPrint(function);
+class IlTestPrinter : public AllStatic {
+ public:
+  static void PrintGraph(const char* phase, FlowGraph* flow_graph) {
+    JSONWriter writer;
+    writer.OpenObject();
+    writer.PrintProperty("p", phase);
+    writer.PrintProperty("f", flow_graph->function().ToFullyQualifiedCString());
+    writer.OpenArray("b");
+    for (auto block : flow_graph->reverse_postorder()) {
+      PrintBlock(&writer, block);
+    }
+    writer.CloseArray();
+    writer.OpenObject("desc");
+    AttributesSerializer(&writer).WriteDescriptors();
+    writer.CloseObject();
+    writer.OpenObject("flags");
+    writer.PrintPropertyBool("nnbd", IsolateGroup::Current()->null_safety());
+    writer.CloseObject();
+    writer.CloseObject();
+    THR_Print("%s\n", writer.ToCString());
+  }
+
+  static void PrintBlock(JSONWriter* writer, BlockEntryInstr* block) {
+    writer->OpenObject();
+    writer->PrintProperty64("b", block->block_id());
+    writer->PrintProperty("o", block->DebugName());
+    if (auto block_with_defs = block->AsBlockEntryWithInitialDefs()) {
+      if (block_with_defs->initial_definitions() != nullptr &&
+          block_with_defs->initial_definitions()->length() > 0) {
+        writer->OpenArray("d");
+        for (auto defn : *block_with_defs->initial_definitions()) {
+          if (defn->IsConstant() && !defn->HasUses()) continue;
+          PrintInstruction(writer, defn);
+        }
+        writer->CloseArray();
+      }
+    }
+    writer->OpenArray("is");
+    if (auto join = block->AsJoinEntry()) {
+      for (PhiIterator it(join); !it.Done(); it.Advance()) {
+        PrintInstruction(writer, it.Current());
+      }
+    }
+    for (auto instr : block->instructions()) {
+      PrintInstruction(writer, instr);
+    }
+    writer->CloseArray();
+    writer->CloseObject();
+  }
+
+  static void PrintInstruction(JSONWriter* writer,
+                               Instruction* instr,
+                               const char* name = nullptr) {
+    writer->OpenObject(name);
+    if (auto defn = instr->AsDefinition()) {
+      if (defn->ssa_temp_index() != -1) {
+        writer->PrintProperty("v", defn->ssa_temp_index());
+      }
+    }
+    writer->PrintProperty("o", instr->DebugName());
+    if (auto branch = instr->AsBranch()) {
+      PrintInstruction(writer, branch->comparison(), "cc");
+    } else {
+      if (instr->InputCount() != 0) {
+        writer->OpenArray("i");
+        for (intptr_t i = 0; i < instr->InputCount(); i++) {
+          writer->PrintValue(instr->InputAt(i)->definition()->ssa_temp_index());
+        }
+        writer->CloseArray();
+      } else if (instr->ArgumentCount() != 0 &&
+                 instr->GetPushArguments() != nullptr) {
+        writer->OpenArray("i");
+        for (intptr_t i = 0; i < instr->ArgumentCount(); i++) {
+          writer->PrintValue(
+              instr->ArgumentValueAt(i)->definition()->ssa_temp_index());
+        }
+        writer->CloseArray();
+      }
+      AttributesSerializer serializer(writer);
+      instr->Accept(&serializer);
+    }
+    if (instr->SuccessorCount() > 0) {
+      writer->OpenArray("s");
+      for (auto succ : instr->successors()) {
+        writer->PrintValue(succ->block_id());
+      }
+      writer->CloseArray();
+    }
+    writer->CloseObject();
+  }
+
+  template <typename T>
+  class HasGetAttributes {
+    template <typename U>
+    static std::true_type test(decltype(&U::GetAttributes));
+    template <typename U>
+    static std::false_type test(...);
+
+   public:
+    static constexpr bool value = decltype(test<T>(0))::value;
+  };
+
+  class AttributesSerializer : public InstructionVisitor {
+   public:
+    explicit AttributesSerializer(JSONWriter* writer) : writer_(writer) {}
+
+    void WriteDescriptors() {
+#define DECLARE_VISIT_INSTRUCTION(ShortName, Attrs)                            \
+  WriteDescriptor<ShortName##Instr>(#ShortName);
+
+      FOR_EACH_INSTRUCTION(DECLARE_VISIT_INSTRUCTION)
+
+#undef DECLARE_VISIT_INSTRUCTION
+    }
+
+#define DECLARE_VISIT_INSTRUCTION(ShortName, Attrs)                            \
+  virtual void Visit##ShortName(ShortName##Instr* instr) { Write(instr); }
+
+    FOR_EACH_INSTRUCTION(DECLARE_VISIT_INSTRUCTION)
+
+#undef DECLARE_VISIT_INSTRUCTION
+
+   private:
+    void WriteAttribute(const char* value) { writer_->PrintValue(value); }
+
+    void WriteAttribute(intptr_t value) { writer_->PrintValue(value); }
+
+    void WriteAttribute(Token::Kind kind) {
+      writer_->PrintValue(Token::Str(kind));
+    }
+
+    void WriteAttribute(const Slot* slot) { writer_->PrintValue(slot->Name()); }
+
+    template <typename... Ts>
+    void WriteTuple(const std::tuple<Ts...>& tuple) {
+      std::apply([&](Ts const&... elements) { WriteAttribute(elements...); },
+                 tuple);
+    }
+
+    template <typename T,
+              typename = typename std::enable_if_t<HasGetAttributes<T>::value>>
+    void Write(T* instr) {
+      writer_->OpenArray("d");
+      WriteTuple(instr->GetAttributes());
+      writer_->CloseArray();
+    }
+
+    void Write(Instruction* instr) {
+      // Default, do nothing.
+    }
+
+    template <typename T>
+    void WriteDescriptor(
+        const char* name,
+        typename std::enable_if_t<HasGetAttributes<T>::value>* = 0) {
+      writer_->OpenArray(name);
+      WriteTuple(T::GetAttributeNames());
+      writer_->CloseArray();
+    }
+
+    template <typename T>
+    void WriteDescriptor(
+        const char* name,
+        typename std::enable_if_t<!HasGetAttributes<T>::value>* = 0) {}
+
+    JSONWriter* writer_;
+  };
+};
+
+bool FlowGraphPrinter::ShouldPrint(
+    const Function& function,
+    uint8_t** compiler_pass_filter /* = nullptr */) {
+  return compiler::PrintFilter::ShouldPrint(function, compiler_pass_filter);
 }
 
 void FlowGraphPrinter::PrintGraph(const char* phase, FlowGraph* flow_graph) {
   LogBlock lb;
-  THR_Print("*** BEGIN CFG\n%s\n", phase);
-  FlowGraphPrinter printer(*flow_graph);
-  printer.PrintBlocks();
-  THR_Print("*** END CFG\n");
+  if (FLAG_print_flow_graph_as_json) {
+    IlTestPrinter::PrintGraph(phase, flow_graph);
+  } else {
+    THR_Print("*** BEGIN CFG\n%s\n", phase);
+    FlowGraphPrinter printer(*flow_graph);
+    printer.PrintBlocks();
+    THR_Print("*** END CFG\n");
+  }
   fflush(stdout);
 }
 
@@ -475,7 +656,7 @@
 }
 
 void ClosureCallInstr::PrintOperandsTo(BaseTextBuffer* f) const {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     f->AddString(" closure=");
   } else {
     f->AddString(" function=");
@@ -1286,7 +1467,9 @@
   UNREACHABLE();
 }
 
-bool FlowGraphPrinter::ShouldPrint(const Function& function) {
+bool FlowGraphPrinter::ShouldPrint(
+    const Function& function,
+    uint8_t** compiler_pass_filter /* = nullptr */) {
   return false;
 }
 
diff --git a/runtime/vm/compiler/backend/il_printer.h b/runtime/vm/compiler/backend/il_printer.h
index 96268c8..3784083 100644
--- a/runtime/vm/compiler/backend/il_printer.h
+++ b/runtime/vm/compiler/backend/il_printer.h
@@ -56,7 +56,8 @@
   static void PrintCidRangeData(const CallTargets& ic_data,
                                 intptr_t num_checks_to_print = kPrintAll);
 
-  static bool ShouldPrint(const Function& function);
+  static bool ShouldPrint(const Function& function,
+                          uint8_t** compiler_pass_filter = nullptr);
 
  private:
   const Function& function_;
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 2ad4305..c770204 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -1037,7 +1037,7 @@
   Location right = locs()->in(1);
   if (right.IsConstant()) {
     ASSERT(right.constant().IsSmi());
-    const int64_t imm = static_cast<int64_t>(right.constant().ptr());
+    const int64_t imm = Smi::RawValue(Smi::Cast(right.constant()).Value());
     __ TestImmediate(left_reg, compiler::Immediate(imm),
                      compiler::kObjectBytes);
   } else {
@@ -1240,7 +1240,24 @@
   }
 
   if (is_leaf_) {
+#if !defined(PRODUCT)
+    // Set the thread object's top_exit_frame_info and VMTag to enable the
+    // profiler to determine that thread is no longer executing Dart code.
+    __ movq(compiler::Address(
+                THR, compiler::target::Thread::top_exit_frame_info_offset()),
+            FPREG);
+    __ movq(compiler::Assembler::VMTagAddress(), target_address);
+#endif
+
     __ CallCFunction(target_address, /*restore_rsp=*/true);
+
+#if !defined(PRODUCT)
+    __ movq(compiler::Assembler::VMTagAddress(),
+            compiler::Immediate(compiler::target::Thread::vm_tag_dart_id()));
+    __ movq(compiler::Address(
+                THR, compiler::target::Thread::top_exit_frame_info_offset()),
+            compiler::Immediate(0));
+#endif
   } else {
     // We need to copy a dummy return address up into the dummy stack frame so
     // the stack walker will know which safepoint to use. RIP points to the
@@ -1292,7 +1309,7 @@
     __ LeaveDartFrame(compiler::kRestoreCallerPP);
     // 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) {
+    if (FLAG_precompiled_mode) {
       __ movq(PP, compiler::Address(THR, Thread::global_object_pool_offset()));
     }
     __ set_constant_pool_allowed(true);
@@ -1401,7 +1418,7 @@
                             kPcMarkerSlotFromFp * compiler::target::kWordSize),
           CODE_REG);
 
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ movq(PP,
             compiler::Address(
                 THR, compiler::target::Thread::global_object_pool_offset()));
@@ -2288,7 +2305,7 @@
         offset_reg,
         compiler::FieldAddress(
             field_reg, Field::guarded_list_length_in_object_offset_offset()));
-    __ LoadCompressed(
+    __ LoadCompressedSmi(
         length_reg,
         compiler::FieldAddress(field_reg, Field::guarded_list_length_offset()));
 
@@ -3487,7 +3504,8 @@
 
 static bool CanBeImmediate(const Object& constant) {
   return constant.IsSmi() &&
-         compiler::Immediate(static_cast<int64_t>(constant.ptr())).is_int32();
+         compiler::Immediate(Smi::RawValue(Smi::Cast(constant).Value()))
+             .is_int32();
 }
 
 static bool IsSmiValue(const Object& constant, intptr_t value) {
@@ -3620,7 +3638,7 @@
   if (locs()->in(1).IsConstant()) {
     const Object& constant = locs()->in(1).constant();
     ASSERT(constant.IsSmi());
-    const int64_t imm = static_cast<int64_t>(constant.ptr());
+    const int64_t imm = Smi::RawValue(Smi::Cast(constant).Value());
     switch (op_kind()) {
       case Token::kADD: {
         __ AddImmediate(left, compiler::Immediate(imm), compiler::kObjectBytes);
@@ -4395,7 +4413,7 @@
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
   // Shared slow path is used in BoxInt64Instr::EmitNativeCode in
-  // FLAG_use_bare_instructions mode and only after VM isolate stubs where
+  // precompiled mode and only after VM isolate stubs where
   // replaced with isolate-specific stubs.
   auto object_store = IsolateGroup::Current()->object_store();
   const bool stubs_in_vm_isolate =
@@ -4406,7 +4424,6 @@
           ->untag()
           ->InVMIsolateHeap();
   const bool shared_slow_path_call = SlowPathSharingSupported(opt) &&
-                                     FLAG_use_bare_instructions &&
                                      !stubs_in_vm_isolate;
   LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps,
@@ -5823,8 +5840,7 @@
 }
 
 void CheckNullInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ThrowErrorSlowPathCode* slow_path =
-      new NullErrorSlowPath(this, compiler->CurrentTryIndex());
+  ThrowErrorSlowPathCode* slow_path = new NullErrorSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
 
   Register value_reg = locs()->in(0).reg();
@@ -5944,11 +5960,9 @@
  public:
   Int64DivideSlowPath(BinaryInt64OpInstr* instruction,
                       Register divisor,
-                      Range* divisor_range,
-                      intptr_t try_index)
+                      Range* divisor_range)
       : ThrowErrorSlowPathCode(instruction,
-                               kIntegerDivisionByZeroExceptionRuntimeEntry,
-                               try_index),
+                               kIntegerDivisionByZeroExceptionRuntimeEntry),
         is_mod_(instruction->op_kind() == Token::kMOD),
         divisor_(divisor),
         divisor_range_(divisor_range),
@@ -6105,8 +6119,8 @@
 
   // Prepare a slow path.
   Range* right_range = instruction->right()->definition()->range();
-  Int64DivideSlowPath* slow_path = new (Z) Int64DivideSlowPath(
-      instruction, right, right_range, compiler->CurrentTryIndex());
+  Int64DivideSlowPath* slow_path =
+      new (Z) Int64DivideSlowPath(instruction, right, right_range);
 
   // Handle modulo/division by zero exception on slow path.
   if (slow_path->has_divide_by_zero()) {
@@ -6372,10 +6386,9 @@
 
 class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
+  explicit ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               kArgumentErrorUnboxedInt64RuntimeEntry,
-                               try_index) {}
+                               kArgumentErrorUnboxedInt64RuntimeEntry) {}
 
   const char* name() override { return "int64 shift"; }
 
@@ -6442,8 +6455,7 @@
     // Jump to a slow path if shift count is > 63 or negative.
     ShiftInt64OpSlowPath* slow_path = NULL;
     if (!IsShiftCountInRange()) {
-      slow_path =
-          new (Z) ShiftInt64OpSlowPath(this, compiler->CurrentTryIndex());
+      slow_path = new (Z) ShiftInt64OpSlowPath(this);
       compiler->AddSlowPathCode(slow_path);
 
       __ cmpq(RCX, compiler::Immediate(kShiftCountLimit));
@@ -6500,10 +6512,9 @@
 
 class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
+  explicit ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               kArgumentErrorUnboxedInt64RuntimeEntry,
-                               try_index) {}
+                               kArgumentErrorUnboxedInt64RuntimeEntry) {}
 
   const char* name() override { return "uint32 shift"; }
 
@@ -6559,8 +6570,7 @@
     // Jump to a slow path if shift count is > 31 or negative.
     ShiftUint32OpSlowPath* slow_path = NULL;
     if (!IsShiftCountInRange(kUint32ShiftCountLimit)) {
-      slow_path =
-          new (Z) ShiftUint32OpSlowPath(this, compiler->CurrentTryIndex());
+      slow_path = new (Z) ShiftUint32OpSlowPath(this);
       compiler->AddSlowPathCode(slow_path);
 
       __ cmpq(RCX, compiler::Immediate(kUint32ShiftCountLimit));
@@ -6924,7 +6934,7 @@
   __ LoadObject(R10, arguments_descriptor);
 
   ASSERT(locs()->in(0).reg() == RAX);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     // RAX: Closure with cached entry point.
     __ movq(RCX, compiler::FieldAddress(
                      RAX, compiler::target::Closure::entry_point_offset()));
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index 2523166..38de868 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -629,18 +629,128 @@
   const Function& caller_function_;
 };
 
+static bool IsAThisCallThroughAnUncheckedEntryPoint(Definition* call) {
+  if (auto instance_call = call->AsInstanceCallBase()) {
+    return (instance_call->entry_kind() == Code::EntryKind::kUnchecked) &&
+           instance_call->is_call_on_this();
+  }
+  return false;
+}
+
+// Helper which returns true if callee potentially has a more specific
+// parameter type and thus a redefinition needs to be inserted.
+static bool CalleeParameterTypeMightBeMoreSpecific(
+    BitVector* is_generic_covariant_impl,
+    const FunctionType& interface_target_signature,
+    const FunctionType& callee_signature,
+    intptr_t first_arg_index,
+    intptr_t arg_index) {
+  if (arg_index > first_arg_index && is_generic_covariant_impl != nullptr &&
+      is_generic_covariant_impl->Contains(arg_index - first_arg_index)) {
+    const intptr_t param_index = arg_index - first_arg_index;
+    const intptr_t num_named_params =
+        callee_signature.NumOptionalNamedParameters();
+    const intptr_t num_params = callee_signature.NumParameters();
+    if (num_named_params == 0 &&
+        param_index >= interface_target_signature.NumParameters()) {
+      // An optional positional parameter which was added in the callee but
+      // not present in the interface target.
+      return false;
+    }
+
+    // Check if this argument corresponds to a named parameter. In this case
+    // we need to find correct index based on the name.
+    intptr_t interface_target_param_index = param_index;
+    if (num_named_params > 0 &&
+        (num_params - num_named_params) <= param_index) {
+      // This is a named parameter.
+      const String& name =
+          String::Handle(callee_signature.ParameterNameAt(param_index));
+      interface_target_param_index = -1;
+      for (intptr_t i = interface_target_signature.NumParameters() -
+                        interface_target_signature.NumOptionalNamedParameters(),
+                    n = interface_target_signature.NumParameters();
+           i < n; i++) {
+        if (interface_target_signature.ParameterNameAt(i) == name.ptr()) {
+          interface_target_param_index = i;
+          break;
+        }
+      }
+
+      // This is a named parameter which was added in the callee.
+      if (interface_target_param_index == -1) {
+        return false;
+      }
+    }
+    const AbstractType& callee_parameter_type =
+        AbstractType::Handle(callee_signature.ParameterTypeAt(param_index));
+    const AbstractType& interface_target_parameter_type =
+        AbstractType::Handle(interface_target_signature.ParameterTypeAt(
+            interface_target_param_index));
+    if (interface_target_parameter_type.ptr() != callee_parameter_type.ptr()) {
+      // This a conservative approximation.
+      return true;
+    }
+  }
+  return false;
+}
+
 static void ReplaceParameterStubs(Zone* zone,
                                   FlowGraph* caller_graph,
                                   InlinedCallData* call_data,
                                   const TargetInfo* target_info) {
   const bool is_polymorphic = call_data->call->IsPolymorphicInstanceCall();
+  const bool no_checks =
+      IsAThisCallThroughAnUncheckedEntryPoint(call_data->call);
   ASSERT(is_polymorphic == (target_info != NULL));
   FlowGraph* callee_graph = call_data->callee_graph;
   auto callee_entry = callee_graph->graph_entry()->normal_entry();
+  const Function& callee = callee_graph->function();
+
+  FunctionType& interface_target_signature = FunctionType::Handle();
+  FunctionType& callee_signature = FunctionType::Handle(callee.signature());
+
+  // If we are inlining a call on this and we are going to skip parameter checks
+  // then a situation can arise when parameter type in the callee has a narrower
+  // type than what interface target specifies, e.g.
+  //
+  //    class A<T> {
+  //      void f(T v);
+  //      void g(T v) { f(v); }
+  //    }
+  //    class B extends A<X> { void f(X v) { ... } }
+  //
+  // Conside when B.f is inlined into a callsite in A.g (e.g. due to polymorphic
+  // inlining). v is known to be X within the body of B.f, but not guaranteed to
+  // be X outside of it. Thus we must ensure that all operations with v that
+  // depend on its type being X are pinned to stay within the inlined body.
+  //
+  // We achieve that by inserting redefinitions for parameters which potentially
+  // have narrower types in callee compared to those in the interface target of
+  // the call.
+  BitVector* is_generic_covariant_impl = nullptr;
+  if (no_checks && callee.IsRegularFunction()) {
+    const Function& interface_target =
+        call_data->call->AsInstanceCallBase()->interface_target();
+
+    callee_signature = callee.signature();
+    interface_target_signature = interface_target.signature();
+
+    // If signatures match then there is nothing to do.
+    if (interface_target.signature() != callee.signature()) {
+      const intptr_t num_params = callee.NumParameters();
+      BitVector is_covariant(zone, num_params);
+      is_generic_covariant_impl = new (zone) BitVector(zone, num_params);
+
+      kernel::ReadParameterCovariance(callee_graph->function(), &is_covariant,
+                                      is_generic_covariant_impl);
+    }
+  }
 
   // Replace each stub with the actual argument or the caller's constant.
   // Nulls denote optional parameters for which no actual was given.
   const intptr_t first_arg_index = call_data->first_arg_index;
+
   // When first_arg_index > 0, the stub and actual argument processed in the
   // first loop iteration represent a passed-in type argument vector.
   GrowableArray<Value*>* arguments = call_data->arguments;
@@ -654,17 +764,29 @@
   }
   for (intptr_t i = 0; i < arguments->length(); ++i) {
     Value* actual = (*arguments)[i];
-    Definition* defn = NULL;
-    if (is_polymorphic && (i == first_arg_index)) {
-      // Replace the receiver argument with a redefinition to prevent code from
-      // the inlined body from being hoisted above the inlined entry.
+    Definition* defn = nullptr;
+
+    // Replace the receiver argument with a redefinition to prevent code from
+    // the inlined body from being hoisted above the inlined entry.
+    const bool is_polymorphic_receiver =
+        (is_polymorphic && (i == first_arg_index));
+
+    if (actual == nullptr) {
+      ASSERT(!is_polymorphic_receiver);
+      continue;
+    }
+
+    if (is_polymorphic_receiver ||
+        CalleeParameterTypeMightBeMoreSpecific(
+            is_generic_covariant_impl, interface_target_signature,
+            callee_signature, first_arg_index, i)) {
       RedefinitionInstr* redefinition =
           new (zone) RedefinitionInstr(actual->Copy(zone));
       redefinition->set_ssa_temp_index(caller_graph->alloc_ssa_temp_index());
       if (FlowGraph::NeedsPairLocation(redefinition->representation())) {
         caller_graph->alloc_ssa_temp_index();
       }
-      if (target_info->IsSingleCid()) {
+      if (is_polymorphic_receiver && target_info->IsSingleCid()) {
         redefinition->UpdateType(CompileType::FromCid(target_info->cid_start));
       }
       redefinition->InsertAfter(callee_entry);
@@ -674,13 +796,12 @@
       callee_entry->ReplaceInEnvironment(
           call_data->parameter_stubs->At(first_arg_stub_index + i),
           actual->definition());
-    } else if (actual != NULL) {
+    } else {
       defn = actual->definition();
     }
-    if (defn != NULL) {
-      call_data->parameter_stubs->At(first_arg_stub_index + i)
-          ->ReplaceUsesWith(defn);
-    }
+
+    call_data->parameter_stubs->At(first_arg_stub_index + i)
+        ->ReplaceUsesWith(defn);
   }
 
   // Replace remaining constants with uses by constants in the caller's
@@ -688,7 +809,7 @@
   auto defns = callee_graph->graph_entry()->initial_definitions();
   for (intptr_t i = 0; i < defns->length(); ++i) {
     ConstantInstr* constant = (*defns)[i]->AsConstant();
-    if (constant != NULL && constant->HasUses()) {
+    if (constant != nullptr && constant->HasUses()) {
       constant->ReplaceUsesWith(caller_graph->GetConstant(constant->value()));
     }
   }
@@ -696,12 +817,12 @@
   defns = callee_graph->graph_entry()->normal_entry()->initial_definitions();
   for (intptr_t i = 0; i < defns->length(); ++i) {
     ConstantInstr* constant = (*defns)[i]->AsConstant();
-    if (constant != NULL && constant->HasUses()) {
+    if (constant != nullptr && constant->HasUses()) {
       constant->ReplaceUsesWith(caller_graph->GetConstant(constant->value()));
     }
 
     SpecialParameterInstr* param = (*defns)[i]->AsSpecialParameter();
-    if (param != NULL && param->HasUses()) {
+    if (param != nullptr && param->HasUses()) {
       switch (param->kind()) {
         case SpecialParameterInstr::kContext: {
           ASSERT(!is_polymorphic);
@@ -1422,9 +1543,8 @@
     // Plug result in the caller graph.
     InlineExitCollector* exit_collector = call_data->exit_collector;
     exit_collector->PrepareGraphs(callee_graph);
-    exit_collector->ReplaceCall(callee_function_entry);
-
     ReplaceParameterStubs(zone(), caller_graph_, call_data, NULL);
+    exit_collector->ReplaceCall(callee_function_entry);
 
     ASSERT(!call_data->call->HasPushArguments());
   }
diff --git a/runtime/vm/compiler/backend/inliner_test.cc b/runtime/vm/compiler/backend/inliner_test.cc
index f5c59aa..4760a70 100644
--- a/runtime/vm/compiler/backend/inliner_test.cc
+++ b/runtime/vm/compiler/backend/inliner_test.cc
@@ -188,7 +188,8 @@
       {kMatchAndMoveStoreIndexed, &store_instr},
   }));
 
-  RELEASE_ASSERT(unbox_instr->InputAt(0)->definition() == value_param);
+  RELEASE_ASSERT(unbox_instr->InputAt(0)->definition()->OriginalDefinition() ==
+                 value_param);
   RELEASE_ASSERT(store_instr->InputAt(0)->definition() == list_param);
   RELEASE_ASSERT(store_instr->InputAt(2)->definition() == unbox_instr);
   RELEASE_ASSERT(unbox_instr->is_truncating());
diff --git a/runtime/vm/compiler/backend/linearscan.cc b/runtime/vm/compiler/backend/linearscan.cc
index d923216..c6767a5 100644
--- a/runtime/vm/compiler/backend/linearscan.cc
+++ b/runtime/vm/compiler/backend/linearscan.cc
@@ -3053,7 +3053,7 @@
   // frameless functions. Outside of bare instructions mode we need to preserve
   // caller PP - so all functions need a frame if they have their own pool which
   // is hard to determine at this stage.
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     return;
   }
 
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index 74a7257..7d02f87 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -3091,7 +3091,22 @@
   }
 }
 
+void AssertAssignableInstr::InferRange(RangeAnalysis* analysis, Range* range) {
+  const Range* value_range = value()->definition()->range();
+  if (!Range::IsUnknown(value_range)) {
+    *range = *value_range;
+  } else {
+    *range = Range::Full(RangeBoundary::kRangeBoundaryInt64);
+  }
+}
+
 static bool IsRedundantBasedOnRangeInformation(Value* index, Value* length) {
+  if (index->BindsToSmiConstant() && length->BindsToSmiConstant()) {
+    const auto index_val = index->BoundSmiConstant();
+    const auto length_val = length->BoundSmiConstant();
+    return (0 <= index_val && index_val < length_val);
+  }
+
   // Range of the index is unknown can't decide if the check is redundant.
   Range* index_range = index->definition()->range();
   if (index_range == nullptr) {
diff --git a/runtime/vm/compiler/backend/redundancy_elimination.cc b/runtime/vm/compiler/backend/redundancy_elimination.cc
index 6f13e1f..e356875 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination.cc
@@ -29,10 +29,15 @@
 // Quick access to the current zone.
 #define Z (zone())
 
-class CSEInstructionMap : public ValueObject {
+// A set of Instructions used by CSE pass.
+//
+// Instructions are compared as if all redefinitions were removed from the
+// graph, with the exception of LoadField instruction which gets special
+// treatment.
+class CSEInstructionSet : public ValueObject {
  public:
-  CSEInstructionMap() : map_() {}
-  explicit CSEInstructionMap(const CSEInstructionMap& other)
+  CSEInstructionSet() : map_() {}
+  explicit CSEInstructionSet(const CSEInstructionSet& other)
       : ValueObject(), map_(other.map_) {}
 
   Instruction* Lookup(Instruction* other) const {
@@ -46,7 +51,59 @@
   }
 
  private:
-  PointerSet<Instruction> map_;
+  static Definition* OriginalDefinition(Value* value) {
+    return value->definition()->OriginalDefinition();
+  }
+
+  static bool EqualsIgnoringRedefinitions(const Instruction& a,
+                                          const Instruction& b) {
+    const auto tag = a.tag();
+    if (tag != b.tag()) return false;
+    const auto input_count = a.InputCount();
+    if (input_count != b.InputCount()) return false;
+
+    // We would like to avoid replacing a load from a redefinition with a
+    // load from an original definition because that breaks the dependency
+    // on the redefinition and enables potentially incorrect code motion.
+    if (tag != Instruction::kLoadField) {
+      for (intptr_t i = 0; i < input_count; ++i) {
+        if (OriginalDefinition(a.InputAt(i)) !=
+            OriginalDefinition(b.InputAt(i))) {
+          return false;
+        }
+      }
+    } else {
+      for (intptr_t i = 0; i < input_count; ++i) {
+        if (!a.InputAt(i)->Equals(*b.InputAt(i))) return false;
+      }
+    }
+    return a.AttributesEqual(b);
+  }
+
+  class Trait {
+   public:
+    typedef Instruction* Value;
+    typedef Instruction* Key;
+    typedef Instruction* Pair;
+
+    static Key KeyOf(Pair kv) { return kv; }
+    static Value ValueOf(Pair kv) { return kv; }
+
+    static inline uword Hash(Key key) {
+      uword result = key->tag();
+      for (intptr_t i = 0; i < key->InputCount(); ++i) {
+        result = CombineHashes(
+            result, OriginalDefinition(key->InputAt(i))->ssa_temp_index());
+      }
+      return FinalizeHash(result, kBitsPerInt32 - 1);
+    }
+
+    static inline bool IsKeyEqual(Pair kv, Key key) {
+      return EqualsIgnoringRedefinitions(*kv, *key);
+    }
+  };
+
+  DirectChainedHashMap<Trait> map_;
 };
 
 // Place describes an abstract location (e.g. field) that IR can load
@@ -432,8 +489,6 @@
     switch (kind()) {
       case kInstanceField:
         return instance_field().is_immutable();
-      case kStaticField:
-        return static_field().is_final() && !FLAG_fields_may_be_reset;
       default:
         return false;
     }
@@ -1542,7 +1597,7 @@
         // we should not move them around unless the field is initialized.
         // Otherwise we might move load past the initialization.
         if (LoadStaticFieldInstr* load = current->AsLoadStaticField()) {
-          if (load->AllowsCSE() && !load->IsFieldInitialized()) {
+          if (load->AllowsCSE()) {
             seen_visible_effect = true;
             continue;
           }
@@ -1923,6 +1978,72 @@
             (array_store->class_id() == kTypedDataFloat32x4ArrayCid));
   }
 
+  static bool AlreadyPinnedByRedefinition(Definition* replacement,
+                                          Definition* redefinition) {
+    Definition* defn = replacement;
+    if (auto load_field = replacement->AsLoadField()) {
+      defn = load_field->instance()->definition();
+    } else if (auto load_indexed = replacement->AsLoadIndexed()) {
+      defn = load_indexed->array()->definition();
+    }
+
+    Value* unwrapped;
+    while ((unwrapped = defn->RedefinedValue()) != nullptr) {
+      if (defn == redefinition) {
+        return true;
+      }
+      defn = unwrapped->definition();
+    }
+
+    return false;
+  }
+
+  Definition* ReplaceLoad(Definition* load, Definition* replacement) {
+    // When replacing a load from a generic field or from an array element
+    // check if instance we are loading from is redefined. If it is then
+    // we need to ensure that replacement is not going to break the
+    // dependency chain.
+    Definition* redef = nullptr;
+    if (auto load_field = load->AsLoadField()) {
+      auto instance = load_field->instance()->definition();
+      if (instance->RedefinedValue() != nullptr) {
+        if ((load_field->slot().kind() ==
+                 Slot::Kind::kGrowableObjectArray_data ||
+             (load_field->slot().IsDartField() &&
+              !AbstractType::Handle(load_field->slot().field().type())
+                   .IsInstantiated()))) {
+          redef = instance;
+        }
+      }
+    } else if (auto load_indexed = load->AsLoadIndexed()) {
+      if (load_indexed->class_id() == kArrayCid ||
+          load_indexed->class_id() == kImmutableArrayCid) {
+        auto instance = load_indexed->array()->definition();
+        if (instance->RedefinedValue() != nullptr) {
+          redef = instance;
+        }
+      }
+    }
+    if (redef != nullptr && !AlreadyPinnedByRedefinition(replacement, redef)) {
+      // Original load had a redefined instance and replacement does not
+      // depend on the same redefinition. Create a redefinition
+      // of the replacement to keep the dependency chain.
+      auto replacement_redefinition =
+          new (zone()) RedefinitionInstr(new (zone()) Value(replacement));
+      if (redef->IsDominatedBy(replacement)) {
+        graph_->InsertAfter(redef, replacement_redefinition, /*env=*/nullptr,
+                            FlowGraph::kValue);
+      } else {
+        graph_->InsertBefore(load, replacement_redefinition, /*env=*/nullptr,
+                             FlowGraph::kValue);
+      }
+      replacement = replacement_redefinition;
+    }
+
+    load->ReplaceUsesWith(replacement);
+    return replacement;
+  }
+
   // Compute sets of loads generated and killed by each block.
   // Additionally compute upwards exposed and generated loads for each block.
   // Exposed loads are those that can be replaced if a corresponding
@@ -2144,7 +2265,7 @@
                       defn->ssa_temp_index(), replacement->ssa_temp_index());
           }
 
-          defn->ReplaceUsesWith(replacement);
+          ReplaceLoad(defn, replacement);
           instr_it.RemoveCurrentFromGraph();
           forwarded_ = true;
           continue;
@@ -2517,7 +2638,7 @@
                       load->ssa_temp_index(), replacement->ssa_temp_index());
           }
 
-          load->ReplaceUsesWith(replacement);
+          replacement = ReplaceLoad(load, replacement);
           load->RemoveFromGraph();
           load->SetReplacement(replacement);
           forwarded_ = true;
@@ -2806,13 +2927,14 @@
   DISALLOW_COPY_AND_ASSIGN(LoadOptimizer);
 };
 
-bool DominatorBasedCSE::Optimize(FlowGraph* graph) {
+bool DominatorBasedCSE::Optimize(FlowGraph* graph,
+                                 bool run_load_optimization /* = true */) {
   bool changed = false;
-  if (FLAG_load_cse) {
+  if (FLAG_load_cse && run_load_optimization) {
     changed = LoadOptimizer::OptimizeGraph(graph) || changed;
   }
 
-  CSEInstructionMap map;
+  CSEInstructionSet map;
   changed = OptimizeRecursive(graph, graph->graph_entry(), &map) || changed;
 
   return changed;
@@ -2820,7 +2942,7 @@
 
 bool DominatorBasedCSE::OptimizeRecursive(FlowGraph* graph,
                                           BlockEntryInstr* block,
-                                          CSEInstructionMap* map) {
+                                          CSEInstructionSet* map) {
   bool changed = false;
   for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
     Instruction* current = it.Current();
@@ -2848,7 +2970,7 @@
     BlockEntryInstr* child = block->dominated_blocks()[i];
     if (i < num_children - 1) {
       // Copy map.
-      CSEInstructionMap child_map(*map);
+      CSEInstructionSet child_map(*map);
       changed = OptimizeRecursive(graph, child, &child_map) || changed;
     } else {
       // Reuse map for the last child.
diff --git a/runtime/vm/compiler/backend/redundancy_elimination.h b/runtime/vm/compiler/backend/redundancy_elimination.h
index 877223b..6042147 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination.h
+++ b/runtime/vm/compiler/backend/redundancy_elimination.h
@@ -14,7 +14,7 @@
 
 namespace dart {
 
-class CSEInstructionMap;
+class CSEInstructionSet;
 
 class AllocationSinking : public ZoneAllocated {
  public:
@@ -88,12 +88,12 @@
  public:
   // Return true, if the optimization changed the flow graph.
   // False, if nothing changed.
-  static bool Optimize(FlowGraph* graph);
+  static bool Optimize(FlowGraph* graph, bool run_load_optimization = true);
 
  private:
   static bool OptimizeRecursive(FlowGraph* graph,
                                 BlockEntryInstr* entry,
-                                CSEInstructionMap* map);
+                                CSEInstructionSet* map);
 };
 
 class DeadStoreElimination : public AllStatic {
diff --git a/runtime/vm/compiler/backend/redundancy_elimination_test.cc b/runtime/vm/compiler/backend/redundancy_elimination_test.cc
index 4e0a257..1dd76e6 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination_test.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination_test.cc
@@ -930,10 +930,6 @@
     }
   )";
 
-  // Make sure static field initialization is not removed because
-  // field is already initialized.
-  SetFlagScope<bool> sfs(&FLAG_fields_may_be_reset, true);
-
   const auto& root_library = Library::Handle(LoadTestScript(kScript));
   Invoke(root_library, "main");
   const auto& function = Function::Handle(GetFunction(root_library, "foo"));
@@ -979,10 +975,6 @@
     }
   )";
 
-  // Make sure static field initialization is not removed because
-  // field is already initialized.
-  SetFlagScope<bool> sfs(&FLAG_fields_may_be_reset, true);
-
   const auto& root_library = Library::Handle(LoadTestScript(kScript));
   Invoke(root_library, "main");
   const auto& function = Function::Handle(GetFunction(root_library, "foo"));
@@ -1360,6 +1352,116 @@
   }
 }
 
+// This test checks that CSE unwraps redefinitions when comparing all
+// instructions except loads, which are handled specially.
+ISOLATE_UNIT_TEST_CASE(CSE_Redefinitions) {
+  const char* script_chars = R"(
+    @pragma("vm:external-name", "BlackholeNative")
+    external dynamic blackhole([a, b, c, d, e, f]);
+    class K<T> {
+      final T field;
+      K(this.field);
+    }
+  )";
+  const Library& lib =
+      Library::Handle(LoadTestScript(script_chars, NoopNativeLookup));
+
+  const Class& cls = Class::ZoneHandle(
+      lib.LookupLocalClass(String::Handle(Symbols::New(thread, "K"))));
+  const Error& err = Error::Handle(cls.EnsureIsFinalized(thread));
+  EXPECT(err.IsNull());
+
+  const Field& original_field = Field::Handle(
+      cls.LookupField(String::Handle(Symbols::New(thread, "field"))));
+  EXPECT(!original_field.IsNull());
+  const Field& field = Field::Handle(original_field.CloneFromOriginal());
+
+  const Function& blackhole =
+      Function::ZoneHandle(GetFunction(lib, "blackhole"));
+
+  using compiler::BlockBuilder;
+  CompilerState S(thread, /*is_aot=*/false, /*is_optimizing=*/true);
+  FlowGraphBuilderHelper H;
+
+  auto b1 = H.flow_graph()->graph_entry()->normal_entry();
+
+  BoxInstr* box0;
+  BoxInstr* box1;
+  LoadFieldInstr* load0;
+  LoadFieldInstr* load1;
+  LoadFieldInstr* load2;
+  StaticCallInstr* call;
+  ReturnInstr* ret;
+
+  {
+    BlockBuilder builder(H.flow_graph(), b1);
+    auto& slot = Slot::Get(field, &H.flow_graph()->parsed_function());
+    auto param0 =
+        builder.AddParameter(0, 0, /*with_frame=*/true, kUnboxedDouble);
+    auto param1 = builder.AddParameter(1, 2, /*with_frame=*/true, kTagged);
+    auto redef0 =
+        builder.AddDefinition(new RedefinitionInstr(new Value(param0)));
+    auto redef1 =
+        builder.AddDefinition(new RedefinitionInstr(new Value(param0)));
+    box0 = builder.AddDefinition(
+        BoxInstr::Create(kUnboxedDouble, new Value(redef0)));
+    box1 = builder.AddDefinition(
+        BoxInstr::Create(kUnboxedDouble, new Value(redef1)));
+
+    auto redef2 =
+        builder.AddDefinition(new RedefinitionInstr(new Value(param1)));
+    auto redef3 =
+        builder.AddDefinition(new RedefinitionInstr(new Value(param1)));
+    load0 = builder.AddDefinition(
+        new LoadFieldInstr(new Value(redef2), slot, InstructionSource()));
+    load1 = builder.AddDefinition(
+        new LoadFieldInstr(new Value(redef3), slot, InstructionSource()));
+    load2 = builder.AddDefinition(
+        new LoadFieldInstr(new Value(redef3), slot, InstructionSource()));
+
+    auto args = new InputsArray(3);
+    args->Add(new Value(load0));
+    args->Add(new Value(load1));
+    args->Add(new Value(load2));
+    call = builder.AddInstruction(new StaticCallInstr(
+        InstructionSource(), blackhole, 0, Array::empty_array(), args,
+        S.GetNextDeoptId(), 0, ICData::RebindRule::kStatic));
+
+    ret = builder.AddReturn(new Value(box1));
+  }
+  H.FinishGraph();
+
+  // Running CSE without load optimization should eliminate redundant boxing
+  // but keep loads intact if they don't  have exactly matching inputs.
+  DominatorBasedCSE::Optimize(H.flow_graph(), /*run_load_optimization=*/false);
+
+  EXPECT_PROPERTY(box1, it.WasEliminated());
+  EXPECT_PROPERTY(ret, it.value()->definition() == box0);
+
+  EXPECT_PROPERTY(load0, !it.WasEliminated());
+  EXPECT_PROPERTY(load1, !it.WasEliminated());
+  EXPECT_PROPERTY(load2, it.WasEliminated());
+
+  EXPECT_PROPERTY(call, it.ArgumentAt(0) == load0);
+  EXPECT_PROPERTY(call, it.ArgumentAt(1) == load1);
+  EXPECT_PROPERTY(call, it.ArgumentAt(2) == load1);
+
+  // Running load optimization pass should remove the second load but
+  // insert a redefinition to prevent code motion because the field
+  // has a generic type.
+  DominatorBasedCSE::Optimize(H.flow_graph(), /*run_load_optimization=*/true);
+
+  EXPECT_PROPERTY(load0, !it.WasEliminated());
+  EXPECT_PROPERTY(load1, it.WasEliminated());
+  EXPECT_PROPERTY(load2, it.WasEliminated());
+
+  EXPECT_PROPERTY(call, it.ArgumentAt(0) == load0);
+  EXPECT_PROPERTY(call, it.ArgumentAt(1)->IsRedefinition() &&
+                            it.ArgumentAt(1)->OriginalDefinition() == load0);
+  EXPECT_PROPERTY(call, it.ArgumentAt(2)->IsRedefinition() &&
+                            it.ArgumentAt(2)->OriginalDefinition() == load0);
+}
+
 #endif  // !defined(TARGET_ARCH_IA32)
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/backend/slot.cc b/runtime/vm/compiler/backend/slot.cc
index b4b9920..75afb9a 100644
--- a/runtime/vm/compiler/backend/slot.cc
+++ b/runtime/vm/compiler/backend/slot.cc
@@ -331,6 +331,58 @@
   return SlotCache::Instance(thread).Canonicalize(slot);
 }
 
+FieldGuardState::FieldGuardState(const Field& field)
+    : state_(GuardedCidBits::encode(field.guarded_cid()) |
+             IsNonNullableIntegerBit::encode(field.is_non_nullable_integer()) |
+             IsUnboxingCandidateBit::encode(field.is_unboxing_candidate()) |
+             IsNullableBit::encode(field.is_nullable())) {}
+
+bool FieldGuardState::IsUnboxed() const {
+  ASSERT(!is_non_nullable_integer() || FLAG_precompiled_mode);
+  const bool valid_class = ((FlowGraphCompiler::SupportsUnboxedDoubles() &&
+                             (guarded_cid() == kDoubleCid)) ||
+                            (FlowGraphCompiler::SupportsUnboxedSimd128() &&
+                             (guarded_cid() == kFloat32x4Cid)) ||
+                            (FlowGraphCompiler::SupportsUnboxedSimd128() &&
+                             (guarded_cid() == kFloat64x2Cid)) ||
+                            is_non_nullable_integer());
+  return is_unboxing_candidate() && !is_nullable() && valid_class;
+}
+
+bool FieldGuardState::IsPotentialUnboxed() const {
+  if (FLAG_precompiled_mode) {
+    // kernel_loader.cc:ReadInferredType sets the guarded cid for fields based
+    // on inferred types from TFA (if available). The guarded cid is therefore
+    // proven to be correct.
+    return IsUnboxed();
+  }
+
+  return is_unboxing_candidate() &&
+         (IsUnboxed() || (guarded_cid() == kIllegalCid));
+}
+
+bool Slot::IsUnboxed() const {
+  return field_guard_state().IsUnboxed();
+}
+
+bool Slot::IsPotentialUnboxed() const {
+  return field_guard_state().IsPotentialUnboxed();
+}
+
+Representation Slot::UnboxedRepresentation() const {
+  switch (field_guard_state().guarded_cid()) {
+    case kDoubleCid:
+      return kUnboxedDouble;
+    case kFloat32x4Cid:
+      return kUnboxedFloat32x4;
+    case kFloat64x2Cid:
+      return kUnboxedFloat64x2;
+    default:
+      RELEASE_ASSERT(field_guard_state().is_non_nullable_integer());
+      return kUnboxedInt64;
+  }
+}
+
 const Slot& Slot::Get(const Field& field,
                       const ParsedFunction* parsed_function) {
   Thread* thread = Thread::Current();
@@ -354,16 +406,18 @@
     is_nullable = false;
   }
 
+  FieldGuardState field_guard_state(field);
+
   bool used_guarded_state = false;
-  if (field.guarded_cid() != kIllegalCid &&
-      field.guarded_cid() != kDynamicCid) {
+  if (field_guard_state.guarded_cid() != kIllegalCid &&
+      field_guard_state.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();
+      nullable_cid = field_guard_state.guarded_cid();
       used_guarded_state = true;
     }
 
-    if (is_nullable && !field.is_nullable()) {
+    if (is_nullable && !field_guard_state.is_nullable()) {
       is_nullable = false;
       used_guarded_state = true;
     }
@@ -377,10 +431,10 @@
     used_guarded_state = false;
   }
 
-  if (field.is_non_nullable_integer()) {
+  if (field_guard_state.is_non_nullable_integer()) {
     ASSERT(FLAG_precompiled_mode);
     is_nullable = false;
-    if (FlowGraphCompiler::IsUnboxedField(field)) {
+    if (field_guard_state.IsUnboxed()) {
       rep = kUnboxedInt64;
     }
   }
@@ -397,7 +451,7 @@
           IsSentinelVisibleBit::encode(field.is_late() && field.is_final() &&
                                        !field.has_initializer()),
       nullable_cid, compiler::target::Field::OffsetOf(field), &field, &type,
-      rep));
+      rep, field_guard_state));
 
   // 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
diff --git a/runtime/vm/compiler/backend/slot.h b/runtime/vm/compiler/backend/slot.h
index a31e9a9..88c1dd8 100644
--- a/runtime/vm/compiler/backend/slot.h
+++ b/runtime/vm/compiler/backend/slot.h
@@ -166,6 +166,35 @@
   NONNULLABLE_BOXED_NATIVE_SLOTS_LIST(V)                                       \
   UNBOXED_NATIVE_SLOTS_LIST(V)
 
+class FieldGuardState {
+ public:
+  FieldGuardState() : state_(0) {}
+  explicit FieldGuardState(const Field& field);
+
+  intptr_t guarded_cid() const { return GuardedCidBits::decode(state_); }
+  bool is_non_nullable_integer() const {
+    return IsNonNullableIntegerBit::decode(state_);
+  }
+  bool is_unboxing_candidate() const {
+    return IsUnboxingCandidateBit::decode(state_);
+  }
+  bool is_nullable() const { return IsNullableBit::decode(state_); }
+
+  bool IsUnboxed() const;
+  bool IsPotentialUnboxed() const;
+
+ private:
+  using GuardedCidBits = BitField<int32_t, ClassIdTagType, 0, 16>;
+  using IsNonNullableIntegerBit =
+      BitField<int32_t, bool, GuardedCidBits::kNextBit, 1>;
+  using IsUnboxingCandidateBit =
+      BitField<int32_t, bool, IsNonNullableIntegerBit::kNextBit, 1>;
+  using IsNullableBit =
+      BitField<int32_t, bool, IsUnboxingCandidateBit::kNextBit, 1>;
+
+  const int32_t state_;
+};
+
 // Slot is an abstraction that describes an readable (and possibly writeable)
 // location within an object.
 //
@@ -298,6 +327,10 @@
     return kind() == Kind::kCapturedVariable || kind() == Kind::kContext_parent;
   }
 
+  bool IsUnboxed() const;
+  bool IsPotentialUnboxed() const;
+  Representation UnboxedRepresentation() const;
+
  private:
   friend class FlowGraphDeserializer;  // For GetNativeSlot.
 
@@ -307,12 +340,14 @@
        intptr_t offset_in_bytes,
        const void* data,
        const AbstractType* static_type,
-       Representation representation)
+       Representation representation,
+       const FieldGuardState& field_guard_state = FieldGuardState())
       : kind_(kind),
         flags_(bits),
         cid_(cid),
         offset_in_bytes_(offset_in_bytes),
         representation_(representation),
+        field_guard_state_(field_guard_state),
         data_(data),
         static_type_(static_type) {}
 
@@ -323,7 +358,8 @@
              other.offset_in_bytes_,
              other.data_,
              other.static_type_,
-             other.representation_) {}
+             other.representation_,
+             other.field_guard_state_) {}
 
   using IsImmutableBit = BitField<int8_t, bool, 0, 1>;
   using IsNullableBit = BitField<int8_t, bool, IsImmutableBit::kNextBit, 1>;
@@ -342,6 +378,10 @@
   static AcqRelAtomic<Slot*> native_fields_;
   static const Slot& GetNativeSlot(Kind kind);
 
+  const FieldGuardState& field_guard_state() const {
+    return field_guard_state_;
+  }
+
   const Kind kind_;
   const int8_t flags_;        // is_immutable, is_nullable
   const ClassIdTagType cid_;  // Concrete cid of a value or kDynamicCid.
@@ -349,6 +389,8 @@
   const intptr_t offset_in_bytes_;
   const Representation representation_;
 
+  const FieldGuardState field_guard_state_;
+
   // Kind dependent data:
   //   - name as a Dart String object for local variables;
   //   - name as a C string for native slots;
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 2faa89c..859fa3f 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -366,9 +366,14 @@
 }
 
 void FlowGraphTypePropagator::VisitAssertAssignable(
-    AssertAssignableInstr* instr) {
-  SetTypeOf(instr->value()->definition(),
-            new (zone()) CompileType(instr->ComputeType()));
+    AssertAssignableInstr* check) {
+  auto defn = check->value()->definition();
+  SetTypeOf(defn, new (zone()) CompileType(check->ComputeType()));
+  if (check->ssa_temp_index() == -1) {
+    flow_graph_->AllocateSSAIndexes(check);
+    GrowTypes(check->ssa_temp_index() + 1);
+  }
+  FlowGraph::RenameDominatedUses(defn, check, check);
 }
 
 void FlowGraphTypePropagator::VisitAssertBoolean(AssertBooleanInstr* instr) {
@@ -1020,6 +1025,7 @@
     // If either type is non-nullable, the resulting type is non-nullable.
     const bool is_nullable =
         value()->Type()->is_nullable() && constrained_type_->is_nullable();
+    // The resulting type can be the sentinel value only if both types can be.
     const bool can_be_sentinel = value()->Type()->can_be_sentinel() &&
                                  constrained_type_->can_be_sentinel();
 
@@ -1032,13 +1038,18 @@
       return CompileType(is_nullable, can_be_sentinel,
                          constrained_type_->ToNullableCid(), nullptr);
     }
-    if (value()->Type()->IsSubtypeOf(*constrained_type_->ToAbstractType())) {
-      return is_nullable ? *value()->Type()
-                         : value()->Type()->CopyNonNullable();
-    } else {
-      return is_nullable ? *constrained_type_
-                         : constrained_type_->CopyNonNullable();
+
+    CompileType result(
+        value()->Type()->IsSubtypeOf(*constrained_type_->ToAbstractType())
+            ? *value()->Type()
+            : *constrained_type_);
+    if (!is_nullable) {
+      result = result.CopyNonNullable();
     }
+    if (!can_be_sentinel) {
+      result = result.CopyNonSentinel();
+    }
+    return result;
   }
   return *value()->Type();
 }
@@ -1541,16 +1552,6 @@
     is_nullable = false;
   }
 
-  auto& obj = Object::Handle();
-  const bool is_initialized = IsFieldInitialized(&obj);
-  if (field.is_final() && is_initialized) {
-    if (!obj.IsNull()) {
-      is_nullable = false;
-      cid = obj.GetClassId();
-      abstract_type = nullptr;  // Cid is known, calculate abstract type lazily.
-    }
-  }
-
   if ((field.guarded_cid() != kIllegalCid) &&
       (field.guarded_cid() != kDynamicCid)) {
     cid = field.guarded_cid();
diff --git a/runtime/vm/compiler/backend/type_propagator_test.cc b/runtime/vm/compiler/backend/type_propagator_test.cc
index 96c3ac0..2f18be4 100644
--- a/runtime/vm/compiler/backend/type_propagator_test.cc
+++ b/runtime/vm/compiler/backend/type_propagator_test.cc
@@ -590,6 +590,127 @@
   EXPECT_PROPERTY(load->AsLoadStaticField()->Type(), !it.is_nullable());
 }
 
+ISOLATE_UNIT_TEST_CASE(TypePropagator_RedefineCanBeSentinelWithCannotBe) {
+  const char* kScript = R"(
+    late final int x;
+  )";
+  Zone* const Z = Thread::Current()->zone();
+  const auto& root_library = Library::CheckedHandle(Z, LoadTestScript(kScript));
+  const auto& toplevel = Class::Handle(Z, root_library.toplevel_class());
+  const auto& field_x = Field::Handle(
+      Z, toplevel.LookupStaticField(String::Handle(Z, String::New("x"))));
+
+  using compiler::BlockBuilder;
+  CompilerState S(thread, /*is_aot=*/false, /*is_optimizing=*/true);
+  FlowGraphBuilderHelper H;
+
+  // We are going to build the following graph:
+  //
+  // B0[graph]:0 {
+  //     v2 <- Constant(#3)
+  // }
+  // B1[function entry]:2
+  //     v3 <- LoadStaticField:10(x, ThrowIfSentinel)
+  //     v5 <- Constant(#sentinel)
+  //     Branch if StrictCompare:12(===, v3, v5) goto (2, 3)
+  // B2[target]:4
+  //     goto:16 B4
+  // B3[target]:6
+  //     v7 <- Redefinition(v3 ^ T{int?})
+  //     goto:18 B4
+  // B4[join]:8 pred(B2, B3) {
+  //       v9 <- phi(v2, v7) alive
+  // }
+  //     Return:20(v9)
+
+  Definition* v2 = H.IntConstant(3);
+  Definition* v3;
+  Definition* v7;
+  PhiInstr* v9;
+  auto b1 = H.flow_graph()->graph_entry()->normal_entry();
+  auto b2 = H.TargetEntry();
+  auto b3 = H.TargetEntry();
+  auto b4 = H.JoinEntry();
+
+  {
+    BlockBuilder builder(H.flow_graph(), b1);
+    v3 = builder.AddDefinition(new LoadStaticFieldInstr(
+        field_x, {},
+        /*calls_initializer=*/false, S.GetNextDeoptId()));
+    auto v5 = builder.AddDefinition(new ConstantInstr(Object::sentinel()));
+    builder.AddBranch(new StrictCompareInstr(
+                          {}, Token::kEQ_STRICT, new Value(v3), new Value(v5),
+                          /*needs_number_check=*/false, S.GetNextDeoptId()),
+                      b2, b3);
+  }
+
+  {
+    BlockBuilder builder(H.flow_graph(), b2);
+    builder.AddInstruction(new GotoInstr(b4, S.GetNextDeoptId()));
+  }
+
+  {
+    BlockBuilder builder(H.flow_graph(), b3);
+    v7 = builder.AddDefinition(new RedefinitionInstr(new Value(v3)));
+    CompileType int_type = CompileType::FromAbstractType(
+        Type::Handle(Type::IntType()),
+        /*can_be_null=*/
+        !IsolateGroup::Current()->use_strict_null_safety_checks(),
+        /*can_be_sentinel=*/false);
+    v7->AsRedefinition()->set_constrained_type(new CompileType(int_type));
+    builder.AddInstruction(new GotoInstr(b4, S.GetNextDeoptId()));
+  }
+
+  {
+    BlockBuilder builder(H.flow_graph(), b4);
+    v9 = H.Phi(b4, {{b2, v2}, {b3, v7}});
+    builder.AddPhi(v9);
+    builder.AddReturn(new Value(v9));
+  }
+
+  H.FinishGraph();
+
+  FlowGraphPrinter::PrintGraph("Before TypePropagator", H.flow_graph());
+  FlowGraphTypePropagator::Propagate(H.flow_graph());
+  FlowGraphPrinter::PrintGraph("After TypePropagator", H.flow_graph());
+
+  auto& blocks = H.flow_graph()->reverse_postorder();
+  EXPECT_EQ(5, blocks.length());
+  EXPECT_PROPERTY(blocks[0], it.IsGraphEntry());
+
+  // We expect the following types:
+  //
+  // B1[function entry]:2
+  //     v3 <- LoadStaticField:10(x) T{int?~}  // T{int~} in null safe mode
+  //     v5 <- Constant(#sentinel) T{Sentinel~}
+  //     Branch if StrictCompare:12(===, v3, v5) goto (2, 3)
+
+  EXPECT_PROPERTY(blocks[1], it.IsFunctionEntry());
+  EXPECT_PROPERTY(blocks[1]->next(), it.IsLoadStaticField());
+  EXPECT_PROPERTY(blocks[1]->next()->AsLoadStaticField(), it.HasType());
+  EXPECT_PROPERTY(blocks[1]->next()->AsLoadStaticField()->Type(),
+                  it.can_be_sentinel());
+
+  // B3[target]:6
+  //     v7 <- Redefinition(v3 ^ T{int?}) T{int?}  // T{int} in null safe mode
+  //     goto:18 B4
+  EXPECT_PROPERTY(blocks[3], it.IsTargetEntry());
+  EXPECT_PROPERTY(blocks[3]->next(), it.IsRedefinition());
+  EXPECT_PROPERTY(blocks[3]->next()->AsRedefinition(), it.HasType());
+  EXPECT_PROPERTY(blocks[3]->next()->AsRedefinition()->Type(),
+                  !it.can_be_sentinel());
+
+  // B4[join]:8 pred(B2, B3) {
+  //       v9 <- phi(v2, v7) alive T{int?}  // T{int} in null safe mode
+  // }
+  //     Return:20(v9)
+  EXPECT_PROPERTY(blocks[4], it.IsJoinEntry());
+  EXPECT_PROPERTY(blocks[4], it.AsJoinEntry()->phis() != nullptr);
+  EXPECT_PROPERTY(blocks[4]->AsJoinEntry()->phis()->At(0), it.HasType());
+  EXPECT_PROPERTY(blocks[4]->AsJoinEntry()->phis()->At(0)->Type(),
+                  !it.can_be_sentinel());
+}
+
 #endif  // defined(DART_PRECOMPILER)
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/compiler_pass.cc b/runtime/vm/compiler/compiler_pass.cc
index d6071ee..0f9e5ea 100644
--- a/runtime/vm/compiler/compiler_pass.cc
+++ b/runtime/vm/compiler/compiler_pass.cc
@@ -8,6 +8,7 @@
 #include "vm/compiler/backend/branch_optimizer.h"
 #include "vm/compiler/backend/constant_propagator.h"
 #include "vm/compiler/backend/flow_graph_checker.h"
+#include "vm/compiler/backend/flow_graph_compiler.h"
 #include "vm/compiler/backend/il_printer.h"
 #include "vm/compiler/backend/inliner.h"
 #include "vm/compiler/backend/linearscan.h"
@@ -74,8 +75,9 @@
 }
 
 CompilerPass* CompilerPass::passes_[CompilerPass::kNumPasses] = {NULL};
+uint8_t CompilerPass::flags_[CompilerPass::kNumPasses] = {0};
 
-DEFINE_OPTION_HANDLER(CompilerPass::ParseFilters,
+DEFINE_OPTION_HANDLER(CompilerPass::ParseFiltersFromFlag,
                       compiler_passes,
                       "List of comma separated compilation passes flags. "
                       "Use -Name to disable a pass, Name to print IL after it. "
@@ -109,7 +111,18 @@
     "\n"
     "List of compiler passes:\n";
 
-void CompilerPass::ParseFilters(const char* filter) {
+void CompilerPass::ParseFiltersFromFlag(const char* filter) {
+  ParseFilters(filter, flags_);
+}
+
+uint8_t* CompilerPass::ParseFiltersFromPragma(const char* filter) {
+  auto flags =
+      ThreadState::Current()->zone()->Alloc<uint8_t>(CompilerPass::kNumPasses);
+  ParseFilters(filter, flags);
+  return flags;
+}
+
+void CompilerPass::ParseFilters(const char* filter, uint8_t* pass_flags) {
   if (filter == NULL || *filter == 0) {
     return;
   }
@@ -125,11 +138,7 @@
   }
 
   // Clear all flags.
-  for (intptr_t i = 0; i < kNumPasses; i++) {
-    if (passes_[i] != NULL) {
-      passes_[i]->flags_ = 0;
-    }
-  }
+  memset(pass_flags, 0, CompilerPass::kNumPasses);
 
   for (const char *start = filter, *end = filter; *end != 0;
        start = (end + 1)) {
@@ -143,54 +152,58 @@
       continue;
     }
 
-    uint8_t flags = 0;
-    if (*start == '-') {
-      flags = kDisabled;
-    } else if (*start == ']') {
-      flags = kTraceAfter;
-    } else if (*start == '[') {
-      flags = kTraceBefore;
-    } else if (*start == '*') {
-      flags = kTraceBeforeOrAfter;
+    ParseOneFilter(start, end, pass_flags);
+  }
+}
+
+void CompilerPass::ParseOneFilter(const char* start,
+                                  const char* end,
+                                  uint8_t* pass_flags) {
+  uint8_t flags = 0;
+  if (*start == '-') {
+    flags = kDisabled;
+  } else if (*start == ']') {
+    flags = kTraceAfter;
+  } else if (*start == '[') {
+    flags = kTraceBefore;
+  } else if (*start == '*') {
+    flags = kTraceBeforeOrAfter;
+  }
+  if (flags == 0) {
+    flags |= kTraceAfter;
+  } else {
+    start++;  // Skip the modifier
+  }
+
+  size_t suffix = 0;
+  if (end[-1] == '+') {
+    if (start == (end - 1)) {
+      OS::PrintErr("Sticky modifier '+' should follow pass name\n");
+      return;
     }
-    if (flags == 0) {
-      flags |= kTraceAfter;
+    flags |= kSticky;
+    suffix = 1;
+  }
+
+  size_t length = (end - start) - suffix;
+  if (length != 0) {
+    char* pass_name = Utils::StrNDup(start, length);
+    CompilerPass* pass = FindPassByName(pass_name);
+    if (pass != NULL) {
+      pass_flags[pass->id()] |= flags;
     } else {
-      start++;  // Skip the modifier
+      OS::PrintErr("Unknown compiler pass: %s\n", pass_name);
     }
-
-    size_t suffix = 0;
-    if (end[-1] == '+') {
-      if (start == (end - 1)) {
-        OS::PrintErr("Sticky modifier '+' should follow pass name\n");
-        continue;
-      }
-      flags |= kSticky;
-      suffix = 1;
-    }
-
-    size_t length = (end - start) - suffix;
-    if (length != 0) {
-      char* pass_name = Utils::StrNDup(start, length);
-      CompilerPass* pass = FindPassByName(pass_name);
-      if (pass != NULL) {
-        pass->flags_ |= flags;
-      } else {
-        OS::PrintErr("Unknown compiler pass: %s\n", pass_name);
-      }
-      free(pass_name);
-    } else if (flags == kTraceBeforeOrAfter) {
-      for (intptr_t i = 0; i < kNumPasses; i++) {
-        if (passes_[i] != NULL) {
-          passes_[i]->flags_ = kTraceAfter;
-        }
-      }
+    free(pass_name);
+  } else if (flags == kTraceBeforeOrAfter) {
+    for (intptr_t i = 0; i < kNumPasses; i++) {
+      pass_flags[i] = kTraceAfter;
     }
   }
 }
 
 void CompilerPass::Run(CompilerPassState* state) const {
-  if (IsFlagSet(kDisabled)) {
+  if ((flags() & kDisabled) != 0) {
     return;
   }
 
@@ -206,6 +219,7 @@
       Get(kCanonicalize)->Run(state);
     }
 
+    CompilerState::Current().set_current_pass(this, state);
     PrintGraph(state, kTraceBefore, round);
     {
       TIMELINE_DURATION(thread, CompilerVerbose, name());
@@ -217,17 +231,23 @@
     }
     PrintGraph(state, kTraceAfter, round);
 #if defined(DEBUG)
-    FlowGraphChecker(state->flow_graph(), state->inline_id_to_function)
-        .Check(name());
+    if (CompilerState::Current().is_optimizing()) {
+      FlowGraphChecker(state->flow_graph(), state->inline_id_to_function)
+          .Check(name());
+    }
 #endif
+    CompilerState::Current().set_current_pass(nullptr, nullptr);
   }
 }
 
 void CompilerPass::PrintGraph(CompilerPassState* state,
                               Flag mask,
                               intptr_t round) const {
-  const intptr_t current_flags = flags() | state->sticky_flags;
   FlowGraph* flow_graph = state->flow_graph();
+  const uint8_t* graph_flags = flow_graph->compiler_pass_filters();
+  const uint8_t current_flags =
+      (graph_flags != nullptr ? graph_flags[id()] : flags()) |
+      state->sticky_flags;
 
   if ((FLAG_print_flow_graph || FLAG_print_flow_graph_optimized) &&
       flow_graph->should_print() && ((current_flags & mask) != 0)) {
@@ -337,6 +357,7 @@
   INVOKE_PASS(WidenSmiToInt32);
   INVOKE_PASS(SelectRepresentations);
   INVOKE_PASS(CSE);
+  INVOKE_PASS(Canonicalize);
   INVOKE_PASS(LICM);
   INVOKE_PASS(TryOptimizePatterns);
   INVOKE_PASS(DSE);
@@ -367,6 +388,7 @@
   INVOKE_PASS(AllocationSinking_DetachMaterializations);
   INVOKE_PASS(EliminateWriteBarriers);
   INVOKE_PASS(FinalizeGraph);
+  INVOKE_PASS(Canonicalize);
   INVOKE_PASS(AllocateRegisters);
   INVOKE_PASS(ReorderBlocks);
   return pass_state->flow_graph();
@@ -448,7 +470,7 @@
 });
 
 COMPILER_PASS(UseTableDispatch, {
-  if (FLAG_use_bare_instructions && FLAG_use_table_dispatch) {
+  if (FLAG_use_table_dispatch) {
     state->call_specializer->ReplaceInstanceCallsWithDispatchTableCalls();
   }
 });
@@ -555,4 +577,6 @@
   flow_graph->RemoveRedefinitions();
 });
 
+COMPILER_PASS(GenerateCode, { state->graph_compiler->CompileGraph(); });
+
 }  // namespace dart
diff --git a/runtime/vm/compiler/compiler_pass.h b/runtime/vm/compiler/compiler_pass.h
index 1438db8..01a7194 100644
--- a/runtime/vm/compiler/compiler_pass.h
+++ b/runtime/vm/compiler/compiler_pass.h
@@ -52,12 +52,14 @@
   V(TypePropagation)                                                           \
   V(UseTableDispatch)                                                          \
   V(WidenSmiToInt32)                                                           \
-  V(EliminateWriteBarriers)
+  V(EliminateWriteBarriers)                                                    \
+  V(GenerateCode)
 
 class AllocationSinking;
 class BlockScheduler;
 class CallSpecializer;
 class FlowGraph;
+class FlowGraphCompiler;
 class Function;
 class Precompiler;
 class SpeculativeInliningPolicy;
@@ -95,6 +97,8 @@
 
   intptr_t sticky_flags;
 
+  FlowGraphCompiler* graph_compiler = nullptr;
+
  private:
   FlowGraph* flow_graph_;
 };
@@ -111,13 +115,15 @@
   static constexpr intptr_t kNumPasses = 0 COMPILER_PASS_LIST(ADD_ONE);
 #undef ADD_ONE
 
-  CompilerPass(Id id, const char* name) : id_(id), name_(name), flags_(0) {
+  CompilerPass(Id id, const char* name) : id_(id), name_(name) {
     ASSERT(passes_[id] == NULL);
     passes_[id] = this;
 
     // By default print the final flow-graph after the register allocation.
     if (id == kAllocateRegisters) {
-      flags_ = kTraceAfter;
+      flags_[id] = kTraceAfter;
+    } else {
+      flags_[id] = 0;
     }
   }
   virtual ~CompilerPass() {}
@@ -132,18 +138,25 @@
 
   void Run(CompilerPassState* state) const;
 
-  intptr_t flags() const { return flags_; }
+  uint8_t flags() const { return flags_[id()]; }
   const char* name() const { return name_; }
   Id id() const { return id_; }
 
-  bool IsFlagSet(Flag flag) const { return (flags() & flag) != 0; }
-
   static CompilerPass* Get(Id id) { return passes_[id]; }
 
-  static void ParseFilters(const char* filter);
+  static void ParseFiltersFromFlag(const char* filter);
+  static uint8_t* ParseFiltersFromPragma(const char* filter);
+  static void ParseFilters(const char* filter, uint8_t* flags);
+  static void ParseOneFilter(const char* start,
+                             const char* end,
+                             uint8_t* flags);
 
   enum PipelineMode { kJIT, kAOT };
 
+  static void GenerateCode(CompilerPassState* state) {
+    CompilerPass::Get(CompilerPass::kGenerateCode)->Run(state);
+  }
+
   static void RunGraphIntrinsicPipeline(CompilerPassState* state);
 
   static void RunInliningPipeline(PipelineMode mode, CompilerPassState* state);
@@ -188,10 +201,10 @@
   void PrintGraph(CompilerPassState* state, Flag mask, intptr_t round) const;
 
   static CompilerPass* passes_[];
+  static uint8_t flags_[];
 
   Id id_;
   const char* name_;
-  intptr_t flags_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/compiler_state.cc b/runtime/vm/compiler/compiler_state.cc
index b886b6f..dde29ec 100644
--- a/runtime/vm/compiler/compiler_state.cc
+++ b/runtime/vm/compiler/compiler_state.cc
@@ -7,6 +7,7 @@
 #include <functional>
 
 #include "vm/compiler/aot/precompiler.h"
+#include "vm/compiler/backend/flow_graph_compiler.h"
 #include "vm/compiler/backend/il_printer.h"
 #include "vm/compiler/backend/slot.h"
 #include "vm/growable_array.h"
@@ -128,4 +129,30 @@
   return *interpolate_;
 }
 
+void CompilerState::ReportCrash() {
+  OS::PrintErr("=== Crash occured when compiling %s in %s mode in %s pass\n",
+               function() != nullptr ? function()->ToFullyQualifiedCString()
+                                     : "unknown function",
+               is_aot()          ? "AOT"
+               : is_optimizing() ? "optimizing JIT"
+                                 : "unoptimized JIT",
+               pass() != nullptr ? pass()->name() : "unknown");
+  if (pass_state() != nullptr && pass()->id() == CompilerPass::kGenerateCode) {
+    if (pass_state()->graph_compiler->current_block() != nullptr) {
+      OS::PrintErr("=== When compiling block %s\n",
+                   pass_state()->graph_compiler->current_block()->ToCString());
+    }
+    if (pass_state()->graph_compiler->current_instruction() != nullptr) {
+      OS::PrintErr(
+          "=== When compiling instruction %s\n",
+          pass_state()->graph_compiler->current_instruction()->ToCString());
+    }
+  }
+  if (pass_state() != nullptr && pass_state()->flow_graph() != nullptr) {
+    pass_state()->flow_graph()->Print(pass()->name());
+  } else {
+    OS::PrintErr("=== Flow Graph not available\n");
+  }
+}
+
 }  // namespace dart
diff --git a/runtime/vm/compiler/compiler_state.h b/runtime/vm/compiler/compiler_state.h
index 1520b40..ff3ac87 100644
--- a/runtime/vm/compiler/compiler_state.h
+++ b/runtime/vm/compiler/compiler_state.h
@@ -17,6 +17,8 @@
 
 namespace dart {
 
+class CompilerPass;
+struct CompilerPassState;
 class Function;
 class LocalScope;
 class LocalVariable;
@@ -105,6 +107,20 @@
   // Returns _StringBase._interpolateSingle
   const Function& StringBaseInterpolateSingle();
 
+  const Function* function() const { return function_; }
+
+  void set_function(const Function& function) { function_ = &function; }
+  void set_current_pass(const CompilerPass* pass,
+                        const CompilerPassState* pass_state) {
+    pass_ = pass;
+    pass_state_ = pass_state;
+  }
+
+  const CompilerPass* pass() const { return pass_; }
+  const CompilerPassState* pass_state() const { return pass_state_; }
+
+  void ReportCrash();
+
  private:
   CHA cha_;
   intptr_t deopt_id_ = 0;
@@ -127,6 +143,10 @@
   const Function* interpolate_ = nullptr;
   const Function* interpolate_single_ = nullptr;
 
+  const Function* function_ = nullptr;
+  const CompilerPass* pass_ = nullptr;
+  const CompilerPassState* pass_state_ = nullptr;
+
   CompilerState* previous_;
 };
 
diff --git a/runtime/vm/compiler/ffi/abi.cc b/runtime/vm/compiler/ffi/abi.cc
index d71ad34..25900e4 100644
--- a/runtime/vm/compiler/ffi/abi.cc
+++ b/runtime/vm/compiler/ffi/abi.cc
@@ -12,7 +12,7 @@
 
 namespace ffi {
 
-// See pkg/vm/lib/transformations/ffi.dart, which makes these assumptions.
+// See pkg/vm/lib/transformations/ffi/abi.dart, which makes these assumptions.
 struct AbiAlignmentDouble {
   int8_t use_one_byte;
   double d;
@@ -45,20 +45,42 @@
 #error "Unknown platform. Please add alignment requirements for ABI."
 #endif
 
-Abi TargetAbi() {
-#if defined(TARGET_ARCH_X64) || defined(TARGET_ARCH_ARM64)
-  return Abi::kWordSize64;
-#elif (defined(TARGET_ARCH_IA32) && /* NOLINT(whitespace/parens) */            \
-       (defined(DART_TARGET_OS_LINUX) || defined(DART_TARGET_OS_MACOS) ||      \
-        defined(DART_TARGET_OS_ANDROID))) ||                                   \
-    (defined(TARGET_ARCH_ARM) && defined(DART_TARGET_OS_MACOS_IOS))
-  return Abi::kWordSize32Align32;
-#elif defined(TARGET_ARCH_IA32) && defined(DART_TARGET_OS_WINDOWS) ||          \
-    defined(TARGET_ARCH_ARM)
-  return Abi::kWordSize32Align64;
+#if defined(DART_TARGET_OS_ANDROID)
+#define DART_TARGET_OS_NAME Android
+#elif defined(DART_TARGET_OS_FUCHSIA)
+#define DART_TARGET_OS_NAME Fuchsia
+#elif defined(DART_TARGET_OS_LINUX)
+#define DART_TARGET_OS_NAME Linux
+#elif defined(DART_TARGET_OS_MACOS)
+#if DART_TARGET_OS_MACOS_IOS
+#define DART_TARGET_OS_NAME IOS
 #else
-#error "Unknown platform. Please add alignment requirements for ABI."
+#define DART_TARGET_OS_NAME MacOS
 #endif
+#elif defined(DART_TARGET_OS_WINDOWS)
+#define DART_TARGET_OS_NAME Windows
+#else
+#error Unknown OS
+#endif
+
+#if defined(TARGET_ARCH_IA32)
+#define TARGET_ARCH_NAME IA32
+#elif defined(TARGET_ARCH_X64)
+#define TARGET_ARCH_NAME X64
+#elif defined(TARGET_ARCH_ARM)
+#define TARGET_ARCH_NAME Arm
+#elif defined(TARGET_ARCH_ARM64)
+#define TARGET_ARCH_NAME Arm64
+#else
+#error Unknown arch
+#endif
+
+#define ABI_NAME1(os, arch) k##os##arch
+#define ABI_NAME2(os, arch) ABI_NAME1(os, arch)
+#define ABI_NAME3 ABI_NAME2(DART_TARGET_OS_NAME, TARGET_ARCH_NAME)
+
+Abi TargetAbi() {
+  return Abi::ABI_NAME3;
 }
 
 }  // namespace ffi
diff --git a/runtime/vm/compiler/ffi/abi.h b/runtime/vm/compiler/ffi/abi.h
index fb6f937..118054f 100644
--- a/runtime/vm/compiler/ffi/abi.h
+++ b/runtime/vm/compiler/ffi/abi.h
@@ -17,12 +17,34 @@
 
 namespace ffi {
 
-// These ABIs should be kept in sync with pkg/vm/lib/transformations/ffi.dart.
+// These ABIs should be kept in sync with
+// pkg/vm/lib/transformations/ffi/abi.dart.
 enum class Abi {
-  kWordSize64 = 0,
-  kWordSize32Align32 = 1,
-  kWordSize32Align64 = 2
+  kAndroidArm,
+  kAndroidArm64,
+  kAndroidIA32,
+  kAndroidX64,
+  kFuchsiaArm64,
+  kFuchsiaX64,
+  kIOSArm,
+  kIOSArm64,
+  kIOSX64,
+  kLinuxArm,
+  kLinuxArm64,
+  kLinuxIA32,
+  kLinuxX64,
+  kMacOSArm64,
+  kMacOSX64,
+  kWindowsArm64,
+  kWindowsIA32,
+  kWindowsX64,
 };
+// We use the integer values of this enum in
+// runtime/vm/compiler/frontend/kernel_to_il.cc
+static_assert(static_cast<int64_t>(Abi::kAndroidArm) == 0,
+              "Enum value unexpected.");
+static_assert(static_cast<int64_t>(Abi::kWindowsX64) == 17,
+              "Enum value unexpected.");
 
 // The target ABI. Defines sizes and alignment of native types.
 Abi TargetAbi();
diff --git a/runtime/vm/compiler/ffi/marshaller.cc b/runtime/vm/compiler/ffi/marshaller.cc
index dbaff91..6cf5ece 100644
--- a/runtime/vm/compiler/ffi/marshaller.cc
+++ b/runtime/vm/compiler/ffi/marshaller.cc
@@ -25,9 +25,10 @@
 const intptr_t kNativeParamsStartAt = 1;
 
 // Representations of the arguments and return value of a C signature function.
-static const NativeFunctionType& NativeFunctionSignature(
+const NativeFunctionType* NativeFunctionTypeFromFunctionType(
     Zone* zone,
-    const FunctionType& c_signature) {
+    const FunctionType& c_signature,
+    const char** error) {
   ASSERT(c_signature.NumOptionalParameters() == 0);
   ASSERT(c_signature.NumOptionalPositionalParameters() == 0);
 
@@ -38,29 +39,41 @@
   for (intptr_t i = 0; i < num_arguments; i++) {
     AbstractType& arg_type = AbstractType::Handle(
         zone, c_signature.ParameterTypeAt(i + kNativeParamsStartAt));
-    const auto& rep = NativeType::FromAbstractType(zone, arg_type);
-    argument_representations.Add(&rep);
+    const auto rep = NativeType::FromAbstractType(zone, arg_type, error);
+    if (*error != nullptr) {
+      return nullptr;
+    }
+    argument_representations.Add(rep);
   }
 
   const auto& result_type =
       AbstractType::Handle(zone, c_signature.result_type());
-  const auto& result_representation =
-      NativeType::FromAbstractType(zone, result_type);
+  const auto result_representation =
+      NativeType::FromAbstractType(zone, result_type, error);
+  if (*error != nullptr) {
+    return nullptr;
+  }
 
-  const auto& result = *new (zone) NativeFunctionType(argument_representations,
-                                                      result_representation);
+  const auto result = new (zone)
+      NativeFunctionType(argument_representations, *result_representation);
   return result;
 }
 
-BaseMarshaller::BaseMarshaller(Zone* zone, const Function& dart_signature)
-    : zone_(zone),
-      dart_signature_(dart_signature),
-      c_signature_(
-          FunctionType::ZoneHandle(zone, dart_signature.FfiCSignature())),
-      native_calling_convention_(NativeCallingConvention::FromSignature(
-          zone,
-          NativeFunctionSignature(zone_, c_signature_))) {
-  ASSERT(dart_signature_.IsZoneHandle());
+CallMarshaller* CallMarshaller::FromFunction(Zone* zone,
+                                             const Function& function,
+                                             const char** error) {
+  ASSERT(function.IsZoneHandle());
+  const auto& c_signature =
+      FunctionType::ZoneHandle(zone, function.FfiCSignature());
+  const auto native_function_signature =
+      NativeFunctionTypeFromFunctionType(zone, c_signature, error);
+  if (*error != nullptr) {
+    return nullptr;
+  }
+  const auto& native_calling_convention =
+      NativeCallingConvention::FromSignature(zone, *native_function_signature);
+  return new (zone)
+      CallMarshaller(zone, function, c_signature, native_calling_convention);
 }
 
 AbstractTypePtr BaseMarshaller::CType(intptr_t arg_index) const {
@@ -72,6 +85,27 @@
   return c_signature_.ParameterTypeAt(arg_index + kNativeParamsStartAt);
 }
 
+// Keep consistent with Function::FfiCSignatureReturnsStruct.
+bool BaseMarshaller::IsCompound(intptr_t arg_index) const {
+  const auto& type = AbstractType::Handle(zone_, CType(arg_index));
+  if (IsFfiTypeClassId(type.type_class_id())) {
+    return false;
+  }
+#ifdef DEBUG
+  const auto& cls = Class::Handle(this->zone_, type.type_class());
+  const auto& superClass = Class::Handle(this->zone_, cls.SuperClass());
+  // TODO(http://dartbug.com/42563): Implement AbiSpecificInt.
+  const bool is_struct =
+      String::Handle(this->zone_, superClass.UserVisibleName())
+          .Equals(Symbols::Struct());
+  const bool is_union =
+      String::Handle(this->zone_, superClass.UserVisibleName())
+          .Equals(Symbols::Union());
+  RELEASE_ASSERT(is_struct || is_union);
+#endif
+  return true;
+}
+
 bool BaseMarshaller::ContainsHandles() const {
   return dart_signature_.FfiCSignatureContainsHandles();
 }
@@ -574,13 +608,26 @@
   intptr_t argument_slots_required_ = 0;
 };
 
-CallbackMarshaller::CallbackMarshaller(Zone* zone,
-                                       const Function& dart_signature)
-    : BaseMarshaller(zone, dart_signature),
-      callback_locs_(CallbackArgumentTranslator::TranslateArgumentLocations(
-          zone_,
-          native_calling_convention_.argument_locations(),
-          native_calling_convention_.return_location())) {}
+CallbackMarshaller* CallbackMarshaller::FromFunction(Zone* zone,
+                                                     const Function& function,
+                                                     const char** error) {
+  ASSERT(function.IsZoneHandle());
+  const auto& c_signature =
+      FunctionType::ZoneHandle(zone, function.FfiCSignature());
+  const auto native_function_signature =
+      NativeFunctionTypeFromFunctionType(zone, c_signature, error);
+  if (*error != nullptr) {
+    return nullptr;
+  }
+  const auto& native_calling_convention =
+      NativeCallingConvention::FromSignature(zone, *native_function_signature);
+  const auto& callback_locs =
+      CallbackArgumentTranslator::TranslateArgumentLocations(
+          zone, native_calling_convention.argument_locations(),
+          native_calling_convention.return_location());
+  return new (zone) CallbackMarshaller(
+      zone, function, c_signature, native_calling_convention, callback_locs);
+}
 
 const NativeLocation& CallbackMarshaller::NativeLocationOfNativeParameter(
     intptr_t def_index) const {
diff --git a/runtime/vm/compiler/ffi/marshaller.h b/runtime/vm/compiler/ffi/marshaller.h
index fc29f67..b7607e9 100644
--- a/runtime/vm/compiler/ffi/marshaller.h
+++ b/runtime/vm/compiler/ffi/marshaller.h
@@ -28,6 +28,13 @@
 // Values below 0 index result (result might be multiple if composite).
 const intptr_t kResultIndex = -1;
 
+// Inspects the function signature and transitively any class and field
+// definitions and annotations.
+const NativeFunctionType* NativeFunctionTypeFromFunctionType(
+    Zone* zone,
+    const FunctionType& c_signature,
+    const char** error);
+
 // Provides the mapping from the native calling convention to the Dart calling
 // convention.
 //
@@ -114,11 +121,7 @@
            kFfiBoolCid;
   }
 
-  bool IsCompound(intptr_t arg_index) const {
-    const auto& type = AbstractType::Handle(zone_, CType(arg_index));
-    const bool predefined = IsFfiTypeClassId(type.type_class_id());
-    return !predefined;
-  }
+  bool IsCompound(intptr_t arg_index) const;
 
   // Treated as a null constant in Dart.
   bool IsVoid(intptr_t arg_index) const {
@@ -131,7 +134,14 @@
   StringPtr function_name() const { return dart_signature_.name(); }
 
  protected:
-  BaseMarshaller(Zone* zone, const Function& dart_signature);
+  BaseMarshaller(Zone* zone,
+                 const Function& dart_signature,
+                 const FunctionType& c_signature,
+                 const NativeCallingConvention& native_calling_convention)
+      : zone_(zone),
+        dart_signature_(dart_signature),
+        c_signature_(c_signature),
+        native_calling_convention_(native_calling_convention) {}
 
   ~BaseMarshaller() {}
 
@@ -145,8 +155,18 @@
 
 class CallMarshaller : public BaseMarshaller {
  public:
-  CallMarshaller(Zone* zone, const Function& dart_signature)
-      : BaseMarshaller(zone, dart_signature) {}
+  static CallMarshaller* FromFunction(Zone* zone,
+                                      const Function& function,
+                                      const char** error);
+
+  CallMarshaller(Zone* zone,
+                 const Function& dart_signature,
+                 const FunctionType& c_signature,
+                 const NativeCallingConvention& native_calling_convention)
+      : BaseMarshaller(zone,
+                       dart_signature,
+                       c_signature,
+                       native_calling_convention) {}
 
   virtual Representation RepInFfiCall(intptr_t def_index_global) const;
 
@@ -173,7 +193,20 @@
 
 class CallbackMarshaller : public BaseMarshaller {
  public:
-  CallbackMarshaller(Zone* zone, const Function& dart_signature);
+  static CallbackMarshaller* FromFunction(Zone* zone,
+                                          const Function& function,
+                                          const char** error);
+
+  CallbackMarshaller(Zone* zone,
+                     const Function& dart_signature,
+                     const FunctionType& c_signature,
+                     const NativeCallingConvention& native_calling_convention,
+                     const NativeLocations& callback_locs)
+      : BaseMarshaller(zone,
+                       dart_signature,
+                       c_signature,
+                       native_calling_convention),
+        callback_locs_(callback_locs) {}
 
   virtual Representation RepInFfiCall(intptr_t def_index_global) const;
 
diff --git a/runtime/vm/compiler/ffi/native_type.cc b/runtime/vm/compiler/ffi/native_type.cc
index 6dfaeb7..bf4d452a 100644
--- a/runtime/vm/compiler/ffi/native_type.cc
+++ b/runtime/vm/compiler/ffi/native_type.cc
@@ -7,6 +7,7 @@
 #include "platform/assert.h"
 #include "platform/globals.h"
 #include "vm/class_id.h"
+#include "vm/compiler/ffi/abi.h"
 #include "vm/constants.h"
 #include "vm/zone_text_buffer.h"
 
@@ -386,53 +387,22 @@
   }
 }
 
-NativeType& NativeType::FromTypedDataClassId(Zone* zone, classid_t class_id) {
+const NativeType& NativeType::FromTypedDataClassId(Zone* zone,
+                                                   classid_t class_id) {
   ASSERT(IsFfiPredefinedClassId(class_id));
   const auto fundamental_rep = TypeRepresentation(class_id);
   return *new (zone) NativePrimitiveType(fundamental_rep);
 }
 
 #if !defined(FFI_UNIT_TESTS)
-NativeType& NativeType::FromAbstractType(Zone* zone, const AbstractType& type) {
-  const classid_t class_id = type.type_class_id();
-  if (IsFfiPredefinedClassId(class_id)) {
-    return NativeType::FromTypedDataClassId(zone, class_id);
-  }
-
-  // User-defined structs.
-  const auto& cls = Class::Handle(zone, type.type_class());
-  const auto& superClass = Class::Handle(zone, cls.SuperClass());
-  const bool is_struct = String::Handle(zone, superClass.UserVisibleName())
-                             .Equals(Symbols::Struct());
-  ASSERT(is_struct || String::Handle(zone, superClass.UserVisibleName())
-                          .Equals(Symbols::Union()));
-
-  auto& pragmas = Object::Handle(zone);
-  Library::FindPragma(dart::Thread::Current(), /*only_core=*/false, cls,
-                      Symbols::vm_ffi_struct_fields(), /*multiple=*/true,
-                      &pragmas);
-  ASSERT(!pragmas.IsNull());
-  ASSERT(pragmas.IsGrowableObjectArray());
-  const auto& pragmas_array = GrowableObjectArray::Cast(pragmas);
-  auto& pragma = Instance::Handle(zone);
-  auto& clazz = Class::Handle(zone);
-  auto& library = Library::Handle(zone);
-  for (intptr_t i = 0; i < pragmas_array.Length(); i++) {
-    pragma ^= pragmas_array.At(i);
-    clazz ^= pragma.clazz();
-    library ^= clazz.library();
-    if (String::Handle(zone, clazz.UserVisibleName())
-            .Equals(Symbols::FfiStructLayout()) &&
-        String::Handle(zone, library.url()).Equals(Symbols::DartFfi())) {
-      break;
-    }
-  }
-
+static const NativeType* CompoundFromPragma(Zone* zone,
+                                            const Instance& pragma,
+                                            bool is_struct,
+                                            const char** error) {
   const auto& struct_layout = pragma;
-  const auto& struct_layout_class = clazz;
-  ASSERT(String::Handle(zone, struct_layout_class.UserVisibleName())
+  const auto& clazz = Class::Handle(zone, struct_layout.clazz());
+  ASSERT(String::Handle(zone, clazz.UserVisibleName())
              .Equals(Symbols::FfiStructLayout()));
-  ASSERT(String::Handle(zone, library.url()).Equals(Symbols::DartFfi()));
   const auto& struct_layout_fields = Array::Handle(zone, clazz.fields());
   ASSERT(struct_layout_fields.Length() == 2);
   const auto& types_field =
@@ -460,8 +430,11 @@
       // Subtype of NativeType: Struct, native integer or native float.
       field_type ^= field_types.At(i);
       const auto& field_native_type =
-          NativeType::FromAbstractType(zone, field_type);
-      field_native_types.Add(&field_native_type);
+          NativeType::FromAbstractType(zone, field_type, error);
+      if (*error != nullptr) {
+        return nullptr;
+      }
+      field_native_types.Add(field_native_type);
     } else {
       // Inline array.
       const auto& struct_layout_array_class =
@@ -482,20 +455,67 @@
                  .Equals(Symbols::Length()));
       const auto& length = Smi::Handle(
           zone, Smi::RawCast(field_instance.GetField(length_field)));
-      const auto& element_type = NativeType::FromAbstractType(zone, field_type);
-      const auto& field_native_type =
-          *new (zone) NativeArrayType(element_type, length.AsInt64Value());
-      field_native_types.Add(&field_native_type);
+      const auto element_type =
+          NativeType::FromAbstractType(zone, field_type, error);
+      if (*error != nullptr) {
+        return nullptr;
+      }
+      const auto field_native_type =
+          new (zone) NativeArrayType(*element_type, length.AsInt64Value());
+      field_native_types.Add(field_native_type);
     }
   }
 
   if (is_struct) {
-    return NativeStructType::FromNativeTypes(zone, field_native_types,
-                                             member_packing);
+    return &NativeStructType::FromNativeTypes(zone, field_native_types,
+                                              member_packing);
   } else {
-    return NativeUnionType::FromNativeTypes(zone, field_native_types);
+    return &NativeUnionType::FromNativeTypes(zone, field_native_types);
   }
 }
+
+// TODO(http://dartbug.com/42563): Implement AbiSpecificInt.
+const NativeType* NativeType::FromAbstractType(Zone* zone,
+                                               const AbstractType& type,
+                                               const char** error) {
+  const classid_t class_id = type.type_class_id();
+  if (IsFfiPredefinedClassId(class_id)) {
+    return &NativeType::FromTypedDataClassId(zone, class_id);
+  }
+
+  // User-defined structs or unions.
+  const auto& cls = Class::Handle(zone, type.type_class());
+  const auto& superClass = Class::Handle(zone, cls.SuperClass());
+  const bool is_struct = String::Handle(zone, superClass.UserVisibleName())
+                             .Equals(Symbols::Struct());
+  const bool is_union = String::Handle(zone, superClass.UserVisibleName())
+                            .Equals(Symbols::Union());
+  RELEASE_ASSERT(is_struct || is_union);
+
+  auto& pragmas = Object::Handle(zone);
+  String& pragma_name = String::Handle(zone);
+  pragma_name = Symbols::vm_ffi_struct_fields().ptr();
+  Library::FindPragma(dart::Thread::Current(), /*only_core=*/false, cls,
+                      pragma_name, /*multiple=*/true, &pragmas);
+  ASSERT(!pragmas.IsNull());
+  ASSERT(pragmas.IsGrowableObjectArray());
+  const auto& pragmas_array = GrowableObjectArray::Cast(pragmas);
+  auto& pragma = Instance::Handle(zone);
+  auto& clazz = Class::Handle(zone);
+  auto& library = Library::Handle(zone);
+  const String& class_symbol = Symbols::FfiStructLayout();
+  for (intptr_t i = 0; i < pragmas_array.Length(); i++) {
+    pragma ^= pragmas_array.At(i);
+    clazz ^= pragma.clazz();
+    library ^= clazz.library();
+    if (String::Handle(zone, clazz.UserVisibleName()).Equals(class_symbol) &&
+        String::Handle(zone, library.url()).Equals(Symbols::DartFfi())) {
+      break;
+    }
+  }
+
+  return CompoundFromPragma(zone, pragma, is_struct, error);
+}
 #endif
 
 #if !defined(DART_PRECOMPILED_RUNTIME) && !defined(FFI_UNIT_TESTS)
diff --git a/runtime/vm/compiler/ffi/native_type.h b/runtime/vm/compiler/ffi/native_type.h
index 2ee284a..f60fea6 100644
--- a/runtime/vm/compiler/ffi/native_type.h
+++ b/runtime/vm/compiler/ffi/native_type.h
@@ -57,9 +57,11 @@
 class NativeType : public ZoneAllocated {
  public:
 #if !defined(FFI_UNIT_TESTS)
-  static NativeType& FromAbstractType(Zone* zone, const AbstractType& type);
+  static const NativeType* FromAbstractType(Zone* zone,
+                                            const AbstractType& type,
+                                            const char** error);
 #endif
-  static NativeType& FromTypedDataClassId(Zone* zone, classid_t class_id);
+  static const NativeType& FromTypedDataClassId(Zone* zone, classid_t class_id);
 
 #if !defined(DART_PRECOMPILED_RUNTIME) && !defined(FFI_UNIT_TESTS)
   static NativePrimitiveType& FromUnboxedRepresentation(Zone* zone,
diff --git a/runtime/vm/compiler/ffi/native_type_vm_test.cc b/runtime/vm/compiler/ffi/native_type_vm_test.cc
index 196ae4c..50a1e07 100644
--- a/runtime/vm/compiler/ffi/native_type_vm_test.cc
+++ b/runtime/vm/compiler/ffi/native_type_vm_test.cc
@@ -17,7 +17,9 @@
   const auto& ffi_library = Library::Handle(Library::FfiLibrary());
   const auto& int8_class = Class::Handle(GetClass(ffi_library, "Int8"));
   const auto& int8_type = Type::Handle(int8_class.DeclarationType());
-  const auto& native_type = NativeType::FromAbstractType(Z, int8_type);
+  const char* error = nullptr;
+  const auto& native_type = *NativeType::FromAbstractType(Z, int8_type, &error);
+  EXPECT_NULLPTR(error);
 
   EXPECT_EQ(1, native_type.SizeInBytes());
   EXPECT_STREQ("int8", native_type.ToCString());
@@ -36,7 +38,10 @@
   const auto& ffi_library = Library::Handle(Library::FfiLibrary());
   const auto& bool_class = Class::Handle(GetClass(ffi_library, "Bool"));
   const auto& bool_type = Type::Handle(bool_class.DeclarationType());
-  const auto& bool_native_type = NativeType::FromAbstractType(Z, bool_type);
+  const char* error = nullptr;
+  const auto& bool_native_type =
+      *NativeType::FromAbstractType(Z, bool_type, &error);
+  EXPECT_NULLPTR(error);
 
   const auto& uint8_native_type = *new (Z) NativePrimitiveType(kUint8);
 
@@ -67,8 +72,10 @@
   const auto& struct_class = Class::Handle(GetClass(root_library, "MyStruct"));
   const auto& struct_type = Type::Handle(struct_class.DeclarationType());
 
+  const char* error = nullptr;
   const auto& native_type =
-      NativeType::FromAbstractType(Z, struct_type).AsCompound();
+      NativeType::FromAbstractType(Z, struct_type, &error)->AsCompound();
+  EXPECT_NULLPTR(error);
 
   EXPECT_EQ(2, native_type.members().length());
 
diff --git a/runtime/vm/compiler/ffi/recognized_method.cc b/runtime/vm/compiler/ffi/recognized_method.cc
index fa93dd3..f2fd7b6 100644
--- a/runtime/vm/compiler/ffi/recognized_method.cc
+++ b/runtime/vm/compiler/ffi/recognized_method.cc
@@ -45,6 +45,33 @@
   }
 }
 
+classid_t ElementExternalTypedDataCid(classid_t class_id) {
+  switch (class_id) {
+    case kFfiInt8Cid:
+      return kExternalTypedDataInt8ArrayCid;
+    case kFfiUint8Cid:
+      return kExternalTypedDataUint8ArrayCid;
+    case kFfiInt16Cid:
+      return kExternalTypedDataInt16ArrayCid;
+    case kFfiUint16Cid:
+      return kExternalTypedDataUint16ArrayCid;
+    case kFfiInt32Cid:
+      return kExternalTypedDataInt32ArrayCid;
+    case kFfiUint32Cid:
+      return kExternalTypedDataUint32ArrayCid;
+    case kFfiInt64Cid:
+      return kExternalTypedDataInt64ArrayCid;
+    case kFfiUint64Cid:
+      return kExternalTypedDataUint64ArrayCid;
+    case kFfiFloatCid:
+      return kExternalTypedDataFloat32ArrayCid;
+    case kFfiDoubleCid:
+      return kExternalTypedDataFloat64ArrayCid;
+    default:
+      UNREACHABLE();
+  }
+}
+
 classid_t RecognizedMethodTypeArgCid(MethodRecognizer::Kind kind) {
   switch (kind) {
 #define LOAD_STORE(type)                                                       \
@@ -62,6 +89,11 @@
     case MethodRecognizer::kFfiLoadPointer:
     case MethodRecognizer::kFfiStorePointer:
       return kPointerCid;
+#define AS_EXTERNAL_TYPED_DATA(type)                                           \
+  case MethodRecognizer::kFfiAsExternalTypedData##type:                        \
+    return kFfi##type##Cid;
+    CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(AS_EXTERNAL_TYPED_DATA)
+#undef AS_EXTERNAL_TYPED_DATA
     default:
       UNREACHABLE();
   }
diff --git a/runtime/vm/compiler/ffi/recognized_method.h b/runtime/vm/compiler/ffi/recognized_method.h
index 993306e..98f4a31 100644
--- a/runtime/vm/compiler/ffi/recognized_method.h
+++ b/runtime/vm/compiler/ffi/recognized_method.h
@@ -23,6 +23,10 @@
 // TypedData class id for a NativeType type, except for Void and NativeFunction.
 classid_t ElementTypedDataCid(classid_t class_id);
 
+// ExternalTypedData class id for a NativeType type, except for Void,
+// NativeFunction, IntPtr and Pointer.
+classid_t ElementExternalTypedDataCid(classid_t class_id);
+
 // Returns the kFFi<type>Cid for the recognized load/store method [kind].
 classid_t RecognizedMethodTypeArgCid(MethodRecognizer::Kind kind);
 
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
index 7b9bac9..b37c682 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
@@ -19,6 +19,14 @@
 #define Z (zone_)
 #define IG (thread_->isolate_group())
 
+static bool SupportsCoverage() {
+#if defined(PRODUCT)
+  return false;
+#else
+  return !CompilerState::Current().is_aot();
+#endif
+}
+
 Fragment& Fragment::operator+=(const Fragment& other) {
   if (entry == NULL) {
     entry = other.entry;
@@ -1125,7 +1133,7 @@
   call_hook += Constant(closure);
   call_hook += Constant(function_name);
   call_hook += LoadLocal(entry_point_num);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     call_hook += Constant(closure);
   } else {
     call_hook += Constant(Function::ZoneHandle(Z, closure.function()));
@@ -1138,25 +1146,11 @@
   return call_hook;
 }
 
-static bool SupportsCoverage() {
-#if defined(PRODUCT)
-  return false;
-#else
-  return !CompilerState::Current().is_aot();
-#endif
-}
-
 Fragment BaseFlowGraphBuilder::ClosureCall(TokenPosition position,
                                            intptr_t type_args_len,
                                            intptr_t argument_count,
                                            const Array& argument_names) {
-  Fragment result;
-
-  if (SupportsCoverage()) {
-    const intptr_t coverage_index = GetCoverageIndexFor(position);
-    result <<= new (Z) RecordCoverageInstr(coverage_array(), coverage_index,
-                                           InstructionSource(position));
-  }
+  Fragment result = RecordCoverage(position);
   const intptr_t total_count =
       (type_args_len > 0 ? 1 : 0) + argument_count +
       /*closure (bare instructions) or function (otherwise)*/ 1;
@@ -1249,6 +1243,16 @@
   return Fragment(instr);
 }
 
+Fragment BaseFlowGraphBuilder::RecordCoverage(TokenPosition position) {
+  Fragment instructions;
+  if (SupportsCoverage()) {
+    const intptr_t coverage_index = GetCoverageIndexFor(position);
+    instructions <<= new (Z) RecordCoverageInstr(
+        coverage_array(), coverage_index, InstructionSource(position));
+  }
+  return instructions;
+}
+
 intptr_t BaseFlowGraphBuilder::GetCoverageIndexFor(TokenPosition token_pos) {
   if (coverage_array_.IsNull()) {
     // We have not yet created coverage_array, this is the first time
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.h b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
index ee7e7ce..b0597b8 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.h
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
@@ -471,6 +471,9 @@
   // Pops double value and applies unary math operation.
   Fragment MathUnary(MathUnaryInstr::MathUnaryKind kind);
 
+  // Records coverage for this position, if the current VM mode supports it.
+  Fragment RecordCoverage(TokenPosition position);
+
   // Returns whether this function has a saved arguments descriptor array.
   bool has_saved_args_desc_array() {
     return function_.HasSavedArgumentsDescriptor();
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 6bf2d87..ccdc992 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -1627,11 +1627,13 @@
     const InferredTypeMetadata* result_type,
     bool use_unchecked_entry,
     const CallSiteAttributesMetadata* call_site_attrs,
-    bool receiver_is_not_smi) {
+    bool receiver_is_not_smi,
+    bool is_call_on_this) {
   return flow_graph_builder_->InstanceCall(
       position, name, kind, type_args_len, argument_count, argument_names,
       checked_argument_count, interface_target, tearoff_interface_target,
-      result_type, use_unchecked_entry, call_site_attrs, receiver_is_not_smi);
+      result_type, use_unchecked_entry, call_site_attrs, receiver_is_not_smi,
+      is_call_on_this);
 }
 
 Fragment StreamingFlowGraphBuilder::ThrowException(TokenPosition position) {
@@ -1870,6 +1872,10 @@
       type, variable->name(), AssertAssignableInstr::kParameterCheck);
 }
 
+Fragment StreamingFlowGraphBuilder::RecordCoverage(TokenPosition position) {
+  return flow_graph_builder_->RecordCoverage(position);
+}
+
 Fragment StreamingFlowGraphBuilder::EnterScope(
     intptr_t kernel_offset,
     const LocalScope** scope /* = nullptr */) {
@@ -2416,7 +2422,8 @@
   const TokenPosition position = ReadPosition();  // read position.
   if (p != nullptr) *p = position;
 
-  if (PeekTag() == kThisExpression) {
+  const bool is_call_on_this = PeekTag() == kThisExpression;
+  if (is_call_on_this) {
     is_unchecked_call = true;
   }
   instructions += BuildExpression();  // read receiver.
@@ -2460,7 +2467,8 @@
         Array::null_array(), kNumArgsChecked, interface_target,
         Function::null_function(),
         /*result_type=*/nullptr,
-        /*use_unchecked_entry=*/is_unchecked_call, &call_site_attributes);
+        /*use_unchecked_entry=*/is_unchecked_call, &call_site_attributes,
+        /*receiver_not_smi=*/false, is_call_on_this);
   }
 
   instructions += Drop();  // Drop result of the setter invocation.
@@ -2924,7 +2932,8 @@
 
   // Take note of whether the invocation is against the receiver of the current
   // function: in this case, we may skip some type checks in the callee.
-  if ((PeekTag() == kThisExpression) && !is_dynamic) {
+  const bool is_call_on_this = (PeekTag() == kThisExpression) && !is_dynamic;
+  if (is_call_on_this) {
     is_unchecked_call = true;
   }
   instructions += BuildExpression();  // read receiver.
@@ -3031,12 +3040,12 @@
                    argument_names, ICData::kNoRebind, &result_type,
                    type_args_len, /*use_unchecked_entry=*/is_unchecked_call);
   } else {
-    instructions +=
-        InstanceCall(position, *mangled_name, token_kind, type_args_len,
-                     argument_count, argument_names, checked_argument_count,
-                     *interface_target, Function::null_function(), &result_type,
-                     /*use_unchecked_entry=*/is_unchecked_call,
-                     &call_site_attributes, result_type.ReceiverNotInt());
+    instructions += InstanceCall(
+        position, *mangled_name, token_kind, type_args_len, argument_count,
+        argument_names, checked_argument_count, *interface_target,
+        Function::null_function(), &result_type,
+        /*use_unchecked_entry=*/is_unchecked_call, &call_site_attributes,
+        result_type.ReceiverNotInt(), is_call_on_this);
   }
 
   // Drop temporaries preserving result on the top of the stack.
@@ -3101,7 +3110,7 @@
 
   // Lookup the function in the closure.
   instructions += LoadLocal(variable);
-  if (!FLAG_precompiled_mode || !FLAG_use_bare_instructions) {
+  if (!FLAG_precompiled_mode) {
     instructions += LoadNativeField(Slot::Closure_function());
   }
   if (parsed_function()->function().is_debuggable()) {
@@ -3164,7 +3173,7 @@
                               /*clear_temp=*/false);
     // Lookup the function in the closure.
     instructions += LoadLocal(receiver_temp);
-    if (!FLAG_precompiled_mode || !FLAG_use_bare_instructions) {
+    if (!FLAG_precompiled_mode) {
       instructions += LoadNativeField(Slot::Closure_function());
     }
     if (parsed_function()->function().is_debuggable()) {
@@ -3876,12 +3885,10 @@
     // We do not care whether the 'as' cast as implicitly added by the frontend
     // or explicitly written by the user, in both cases we use an assert
     // assignable.
-    instructions += LoadLocal(MakeTemporary());
     instructions += B->AssertAssignableLoadTypeArguments(
         position, type,
         is_type_error ? Symbols::Empty() : Symbols::InTypeCast(),
         AssertAssignableInstr::kInsertedByFrontend);
-    instructions += Drop();
   }
   return instructions;
 }
@@ -4338,6 +4345,7 @@
       ReadPosition();  // read condition end offset.
 
   instructions += EvaluateAssertion();
+  instructions += RecordCoverage(condition_start_offset);
   instructions += CheckBoolean(condition_start_offset);
   instructions += Constant(Bool::True());
   instructions += BranchIfEqual(&then, &otherwise, false);
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 3cd6257..47ed58b 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -199,7 +199,8 @@
       const InferredTypeMetadata* result_type = nullptr,
       bool use_unchecked_entry = false,
       const CallSiteAttributesMetadata* call_site_attrs = nullptr,
-      bool receiver_is_not_smi = false);
+      bool receiver_is_not_smi = false,
+      bool is_call_on_this = false);
 
   Fragment ThrowException(TokenPosition position);
   Fragment BooleanNegate();
@@ -254,6 +255,7 @@
   Fragment BuildImplicitClosureCreation(const Function& target);
   Fragment CheckBoolean(TokenPosition position);
   Fragment CheckArgumentType(LocalVariable* variable, const AbstractType& type);
+  Fragment RecordCoverage(TokenPosition position);
   Fragment EnterScope(intptr_t kernel_offset,
                       const LocalScope** scope = nullptr);
   Fragment ExitScope(intptr_t kernel_offset);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index efd2f8e..2b7346a 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -347,7 +347,8 @@
     const InferredTypeMetadata* result_type,
     bool use_unchecked_entry,
     const CallSiteAttributesMetadata* call_site_attrs,
-    bool receiver_is_not_smi) {
+    bool receiver_is_not_smi,
+    bool is_call_on_this) {
   const intptr_t total_count = argument_count + (type_args_len > 0 ? 1 : 0);
   InputsArray* arguments = GetArguments(total_count);
   InstanceCallInstr* call = new (Z) InstanceCallInstr(
@@ -360,6 +361,9 @@
   if (use_unchecked_entry) {
     call->set_entry_kind(Code::EntryKind::kUnchecked);
   }
+  if (is_call_on_this) {
+    call->mark_as_call_on_this();
+  }
   if (call_site_attrs != nullptr && call_site_attrs->receiver_type != nullptr &&
       call_site_attrs->receiver_type->IsInstantiated()) {
     call->set_receivers_static_type(call_site_attrs->receiver_type);
@@ -864,6 +868,16 @@
     case MethodRecognizer::kFfiStorePointer:
     case MethodRecognizer::kFfiFromAddress:
     case MethodRecognizer::kFfiGetAddress:
+    case MethodRecognizer::kFfiAsExternalTypedDataInt8:
+    case MethodRecognizer::kFfiAsExternalTypedDataInt16:
+    case MethodRecognizer::kFfiAsExternalTypedDataInt32:
+    case MethodRecognizer::kFfiAsExternalTypedDataInt64:
+    case MethodRecognizer::kFfiAsExternalTypedDataUint8:
+    case MethodRecognizer::kFfiAsExternalTypedDataUint16:
+    case MethodRecognizer::kFfiAsExternalTypedDataUint32:
+    case MethodRecognizer::kFfiAsExternalTypedDataUint64:
+    case MethodRecognizer::kFfiAsExternalTypedDataFloat:
+    case MethodRecognizer::kFfiAsExternalTypedDataDouble:
     case MethodRecognizer::kGetNativeField:
     case MethodRecognizer::kObjectEquals:
     case MethodRecognizer::kStringBaseLength:
@@ -1545,6 +1559,50 @@
       body += Constant(Bool::False());
 #endif  // defined(ARCH_IS_64_BIT)
     } break;
+    case MethodRecognizer::kFfiAsExternalTypedDataInt8:
+    case MethodRecognizer::kFfiAsExternalTypedDataInt16:
+    case MethodRecognizer::kFfiAsExternalTypedDataInt32:
+    case MethodRecognizer::kFfiAsExternalTypedDataInt64:
+    case MethodRecognizer::kFfiAsExternalTypedDataUint8:
+    case MethodRecognizer::kFfiAsExternalTypedDataUint16:
+    case MethodRecognizer::kFfiAsExternalTypedDataUint32:
+    case MethodRecognizer::kFfiAsExternalTypedDataUint64:
+    case MethodRecognizer::kFfiAsExternalTypedDataFloat:
+    case MethodRecognizer::kFfiAsExternalTypedDataDouble: {
+      const classid_t ffi_type_arg_cid =
+          compiler::ffi::RecognizedMethodTypeArgCid(kind);
+      const classid_t external_typed_data_cid =
+          compiler::ffi::ElementExternalTypedDataCid(ffi_type_arg_cid);
+
+      auto class_table = thread_->isolate_group()->class_table();
+      ASSERT(class_table->HasValidClassAt(external_typed_data_cid));
+      const auto& typed_data_class =
+          Class::ZoneHandle(H.zone(), class_table->At(external_typed_data_cid));
+
+      // We assume that the caller has checked that the arguments are non-null
+      // and length is in the range [0, kSmiMax/elementSize].
+      ASSERT_EQUAL(function.NumParameters(), 2);
+      LocalVariable* arg_pointer = parsed_function_->RawParameterVariable(0);
+      LocalVariable* arg_length = parsed_function_->RawParameterVariable(1);
+
+      body += AllocateObject(TokenPosition::kNoSource, typed_data_class, 0);
+      LocalVariable* typed_data_object = MakeTemporary();
+
+      // Initialize the result's length field.
+      body += LoadLocal(typed_data_object);
+      body += LoadLocal(arg_length);
+      body += StoreNativeField(Slot::TypedDataBase_length(),
+                               StoreInstanceFieldInstr::Kind::kInitializing,
+                               kNoStoreBarrier);
+
+      // Initialize the result's data pointer field.
+      body += LoadLocal(typed_data_object);
+      body += LoadLocal(arg_pointer);
+      body += LoadNativeField(Slot::Pointer_data_field());
+      body += StoreNativeField(Slot::TypedDataBase_data_field(),
+                               StoreInstanceFieldInstr::Kind::kInitializing,
+                               kNoStoreBarrier);
+    } break;
     case MethodRecognizer::kGetNativeField: {
       auto& name = String::ZoneHandle(Z, function.name());
       // Note: This method is force optimized so we can push untagged, etc.
@@ -1769,7 +1827,7 @@
   if (auto const alloc = definition->AsAllocateClosure()) {
     return !alloc->known_function().IsNull();
   }
-  return definition->IsLoadLocal();
+  return definition->IsLoadLocal() || definition->IsAssertAssignable();
 }
 
 Fragment FlowGraphBuilder::EvaluateAssertion() {
@@ -3083,7 +3141,7 @@
 
   if (is_closure_call) {
     body += LoadLocal(closure);
-    if (!FLAG_precompiled_mode || !FLAG_use_bare_instructions) {
+    if (!FLAG_precompiled_mode) {
       // Lookup the function in the closure.
       body += LoadNativeField(Slot::Closure_function());
     }
@@ -4430,7 +4488,12 @@
   Fragment function_body(instruction_cursor);
   function_body += CheckStackOverflowInPrologue(function.token_pos());
 
-  const auto& marshaller = *new (Z) compiler::ffi::CallMarshaller(Z, function);
+  const char* error = nullptr;
+  const auto marshaller_ptr =
+      compiler::ffi::CallMarshaller::FromFunction(Z, function, &error);
+  RELEASE_ASSERT(error == nullptr);
+  RELEASE_ASSERT(marshaller_ptr != nullptr);
+  const auto& marshaller = *marshaller_ptr;
 
   const bool signature_contains_handles = marshaller.ContainsHandles();
 
@@ -4576,8 +4639,12 @@
 }
 
 FlowGraph* FlowGraphBuilder::BuildGraphOfFfiCallback(const Function& function) {
-  const auto& marshaller =
-      *new (Z) compiler::ffi::CallbackMarshaller(Z, function);
+  const char* error = nullptr;
+  const auto marshaller_ptr =
+      compiler::ffi::CallbackMarshaller::FromFunction(Z, function, &error);
+  RELEASE_ASSERT(error == nullptr);
+  RELEASE_ASSERT(marshaller_ptr != nullptr);
+  const auto& marshaller = *marshaller_ptr;
 
   graph_entry_ =
       new (Z) GraphEntryInstr(*parsed_function_, Compiler::kNoOSRDeoptId);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 6dfc141..42573d0 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -191,7 +191,8 @@
       const InferredTypeMetadata* result_type = nullptr,
       bool use_unchecked_entry = false,
       const CallSiteAttributesMetadata* call_site_attrs = nullptr,
-      bool receiver_is_not_smi = false);
+      bool receiver_is_not_smi = false,
+      bool is_call_on_this = false);
 
   Fragment FfiCall(const compiler::ffi::CallMarshaller& marshaller);
 
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 378ea73..86b49ff 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -3639,7 +3639,7 @@
   // TODO(dartbug.com/32292): accept unboxed parameters and return value
   // when FLAG_use_table_dispatch == false.
   if (FLAG_precompiled_mode && unboxing_info != nullptr &&
-      FLAG_use_table_dispatch && FLAG_use_bare_instructions) {
+      FLAG_use_table_dispatch) {
     for (intptr_t i = 0; i < unboxing_info->unboxed_args_info.length(); i++) {
       SetupUnboxingInfoOfParameter(function, i, unboxing_info);
     }
@@ -3658,7 +3658,7 @@
   // TODO(dartbug.com/32292): accept unboxed parameters and return value
   // when FLAG_use_table_dispatch == false.
   if (FLAG_precompiled_mode && unboxing_info != nullptr &&
-      FLAG_use_table_dispatch && FLAG_use_bare_instructions) {
+      FLAG_use_table_dispatch) {
     if (field_accessor.IsImplicitSetterFunction()) {
       for (intptr_t i = 0; i < unboxing_info->unboxed_args_info.length(); i++) {
         SetupUnboxingInfoOfParameter(field_accessor, i, unboxing_info);
diff --git a/runtime/vm/compiler/graph_intrinsifier.cc b/runtime/vm/compiler/graph_intrinsifier.cc
index 85ed2b5..a0da87b 100644
--- a/runtime/vm/compiler/graph_intrinsifier.cc
+++ b/runtime/vm/compiler/graph_intrinsifier.cc
@@ -1050,7 +1050,8 @@
   // [Intrinsifier::CanIntrinsifyFieldAccessor])
   auto zone = flow_graph->zone();
   const auto& function = flow_graph->function();
-  ASSERT(Intrinsifier::CanIntrinsifyFieldAccessor(function));
+  ASSERT(
+      Intrinsifier::CanIntrinsifyFieldAccessor(flow_graph->parsed_function()));
 
   auto& field = Field::Handle(zone, function.accessor_field());
   if (CompilerState::Current().should_clone_fields()) {
@@ -1072,12 +1073,10 @@
 
   // We only support cases where we do not have to create a box (whose
   // allocation could fail).
-  ASSERT(function.HasUnboxedReturnValue() ||
-         !FlowGraphCompiler::IsUnboxedField(field));
+  ASSERT(function.HasUnboxedReturnValue() || !slot.IsUnboxed());
 
   // We might need to unbox the field value before returning.
-  if (function.HasUnboxedReturnValue() &&
-      !FlowGraphCompiler::IsUnboxedField(field)) {
+  if (function.HasUnboxedReturnValue() && !slot.IsUnboxed()) {
     ASSERT(FLAG_precompiled_mode);
     field_value = builder.AddUnboxInstr(
         FlowGraph::ReturnRepresentationOf(flow_graph->function()),
@@ -1093,21 +1092,19 @@
   // [Intrinsifier::CanIntrinsifyFieldAccessor])
   auto zone = flow_graph->zone();
   const auto& function = flow_graph->function();
-  ASSERT(Intrinsifier::CanIntrinsifyFieldAccessor(function));
+  ASSERT(
+      Intrinsifier::CanIntrinsifyFieldAccessor(flow_graph->parsed_function()));
 
   auto& field = Field::Handle(zone, function.accessor_field());
   if (CompilerState::Current().should_clone_fields()) {
     field = field.CloneFromOriginal();
   }
   ASSERT(field.is_instance() && !field.is_final());
-  ASSERT(!function.HasUnboxedParameters() ||
-         FlowGraphCompiler::IsUnboxedField(field));
-
   const auto& slot = Slot::Get(field, &flow_graph->parsed_function());
+  ASSERT(!function.HasUnboxedParameters() || slot.IsUnboxed());
 
-  const auto barrier_mode = FlowGraphCompiler::IsUnboxedField(field)
-                                ? kNoStoreBarrier
-                                : kEmitStoreBarrier;
+  const auto barrier_mode =
+      slot.IsUnboxed() ? kNoStoreBarrier : kEmitStoreBarrier;
 
   flow_graph->CreateCommonConstants();
   GraphEntryInstr* graph_entry = flow_graph->graph_entry();
@@ -1118,14 +1115,13 @@
   auto value = builder.AddParameter(1, /*with_frame=*/false);
   VerifyParameterIsBoxed(&builder, 0);
 
-  if (!function.HasUnboxedParameters() &&
-      FlowGraphCompiler::IsUnboxedField(field)) {
+  if (!function.HasUnboxedParameters() && slot.IsUnboxed()) {
     // We do not support storing to possibly guarded fields in JIT in graph
     // intrinsics.
     ASSERT(FLAG_precompiled_mode);
-    value = builder.AddUnboxInstr(
-        FlowGraph::UnboxedFieldRepresentationOf(field), new Value(value),
-        /*is_checked=*/true);
+    value =
+        builder.AddUnboxInstr(slot.UnboxedRepresentation(), new Value(value),
+                              /*is_checked=*/true);
   }
 
   builder.AddInstruction(new (zone) StoreInstanceFieldInstr(
diff --git a/runtime/vm/compiler/intrinsifier.cc b/runtime/vm/compiler/intrinsifier.cc
index f343f73..4ba80d9f 100644
--- a/runtime/vm/compiler/intrinsifier.cc
+++ b/runtime/vm/compiler/intrinsifier.cc
@@ -25,7 +25,9 @@
 
 namespace compiler {
 
-bool Intrinsifier::CanIntrinsify(const Function& function) {
+bool Intrinsifier::CanIntrinsify(const ParsedFunction& parsed_function) {
+  const Function& function = parsed_function.function();
+
   if (FLAG_trace_intrinsifier) {
     THR_Print("CanIntrinsify %s ->", function.ToQualifiedCString());
   }
@@ -45,7 +47,8 @@
     }
     return false;
   }
-  if (!function.is_intrinsic() && !CanIntrinsifyFieldAccessor(function)) {
+  if (!function.is_intrinsic() &&
+      !CanIntrinsifyFieldAccessor(parsed_function)) {
     if (FLAG_trace_intrinsifier) {
       THR_Print("No, not intrinsic function.\n");
     }
@@ -73,7 +76,10 @@
   return true;
 }
 
-bool Intrinsifier::CanIntrinsifyFieldAccessor(const Function& function) {
+bool Intrinsifier::CanIntrinsifyFieldAccessor(
+    const ParsedFunction& parsed_function) {
+  const Function& function = parsed_function.function();
+
   const bool is_getter = function.IsImplicitGetterFunction();
   const bool is_setter = function.IsImplicitSetterFunction();
   if (!is_getter && !is_setter) return false;
@@ -97,11 +103,13 @@
   // We only graph intrinsify implicit instance getters/setter for now.
   if (!field.is_instance()) return false;
 
+  const auto& slot = Slot::Get(field, &parsed_function);
+
   if (is_getter) {
     // We don't support complex getter cases.
     if (field.is_late() || field.needs_load_guard()) return false;
 
-    if (FlowGraphCompiler::IsPotentialUnboxedField(field)) {
+    if (slot.IsPotentialUnboxed()) {
       if (function.HasUnboxedReturnValue()) {
         // In AOT mode: Unboxed fields contain the unboxed value and can be
         // returned in unboxed form.
@@ -136,7 +144,7 @@
     // avoid the need for boxing (which we cannot do in the intrinsic).
     if (function.HasUnboxedParameters()) {
       ASSERT(FLAG_precompiled_mode);
-      if (!FlowGraphCompiler::IsUnboxedField(field)) {
+      if (!slot.IsUnboxed()) {
         return false;
       }
     }
@@ -253,8 +261,7 @@
 // Returns true if fall-through code can be omitted.
 bool Intrinsifier::Intrinsify(const ParsedFunction& parsed_function,
                               FlowGraphCompiler* compiler) {
-  const Function& function = parsed_function.function();
-  if (!CanIntrinsify(function)) {
+  if (!CanIntrinsify(parsed_function)) {
     return false;
   }
 
@@ -262,6 +269,7 @@
     return compiler->intrinsic_slow_path_label()->IsUnused();
   }
 
+  const Function& function = parsed_function.function();
 #if !defined(HASH_IN_OBJECT_HEADER)
   // These two are more complicated on 32 bit platforms, where the
   // identity hash is not stored in the header of the object.  We
diff --git a/runtime/vm/compiler/intrinsifier.h b/runtime/vm/compiler/intrinsifier.h
index 835f73f..681b606 100644
--- a/runtime/vm/compiler/intrinsifier.h
+++ b/runtime/vm/compiler/intrinsifier.h
@@ -35,8 +35,8 @@
 
  private:
   friend class GraphIntrinsifier;  // For CanIntrinsifyFieldAccessor.
-  static bool CanIntrinsify(const Function& function);
-  static bool CanIntrinsifyFieldAccessor(const Function& function);
+  static bool CanIntrinsify(const ParsedFunction& parsed_function);
+  static bool CanIntrinsifyFieldAccessor(const ParsedFunction& parsed_function);
 };
 
 }  // namespace compiler
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index acdb7c6..ff96abb 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -94,7 +94,6 @@
 
     FLAG_background_compilation = false;
     FLAG_enable_mirrors = false;
-    FLAG_fields_may_be_reset = true;
     FLAG_interpret_irregexp = true;
     FLAG_lazy_dispatchers = false;
     FLAG_link_natives_lazily = true;
@@ -212,7 +211,7 @@
   ASSERT(thread->IsMutatorThread());
   const Function& function = Function::CheckedHandle(zone, arguments.ArgAt(0));
 
-  if (FLAG_enable_isolate_groups) {
+  {
     // Another isolate's mutator thread may have created [function] and
     // published it via an ICData, MegamorphicCache etc. Entering the lock below
     // is an acquire operation that pairs with the release operation when the
@@ -221,12 +220,6 @@
     SafepointReadRwLocker ml(thread, thread->isolate_group()->program_lock());
   }
 
-  // In single-isolate scenarios the lazy compile stub is only invoked if
-  // there's no existing code. In multi-isolate scenarios with shared JITed code
-  // we can end up in the lazy compile runtime entry here with code being
-  // installed.
-  ASSERT(!function.HasCode() || FLAG_enable_isolate_groups);
-
   // Will throw if compilation failed (e.g. with compile-time error).
   function.EnsureHasCode();
 }
@@ -511,6 +504,7 @@
 
       CompilerState compiler_state(thread(), /*is_aot=*/false, optimized(),
                                    CompilerState::ShouldTrace(function));
+      compiler_state.set_function(function);
 
       {
         // Extract type feedback before the graph is built, as the graph
@@ -584,10 +578,9 @@
           &speculative_policy, pass_state.inline_id_to_function,
           pass_state.inline_id_to_token_pos, pass_state.caller_inline_id,
           ic_data_array);
-      {
-        TIMELINE_DURATION(thread(), CompilerVerbose, "CompileGraph");
-        graph_compiler.CompileGraph();
-      }
+      pass_state.graph_compiler = &graph_compiler;
+      CompilerPass::GenerateCode(&pass_state);
+
       {
         TIMELINE_DURATION(thread(), CompilerVerbose, "FinalizeCompilation");
 
diff --git a/runtime/vm/compiler/jit/jit_call_specializer.cc b/runtime/vm/compiler/jit/jit_call_specializer.cc
index 191e6bb..3afc611 100644
--- a/runtime/vm/compiler/jit/jit_call_specializer.cc
+++ b/runtime/vm/compiler/jit/jit_call_specializer.cc
@@ -162,57 +162,6 @@
   }
 }
 
-void JitCallSpecializer::VisitStoreInstanceField(
-    StoreInstanceFieldInstr* instr) {
-  if (instr->IsUnboxedDartFieldStore()) {
-    // Determine if this field should be unboxed based on the usage of getter
-    // and setter functions: The heuristic requires that the setter has a
-    // 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->slot().field();
-    const String& field_name = String::Handle(Z, field.name());
-    const Class& owner = Class::Handle(Z, field.Owner());
-    const Function& getter =
-        Function::Handle(Z, owner.LookupGetterFunction(field_name));
-    const Function& setter =
-        Function::Handle(Z, owner.LookupSetterFunction(field_name));
-    bool unboxed_field = false;
-    if (!getter.IsNull() && !setter.IsNull()) {
-      if (field.is_double_initialized()) {
-        unboxed_field = true;
-      } else if ((setter.usage_counter() > 0) &&
-                 ((FLAG_getter_setter_ratio * setter.usage_counter()) >=
-                  getter.usage_counter())) {
-        unboxed_field = true;
-      }
-    }
-    if (!unboxed_field) {
-      if (FLAG_trace_optimization || FLAG_trace_field_guards) {
-        THR_Print("Disabling unboxing of %s\n", field.ToCString());
-        if (!setter.IsNull()) {
-          THR_Print("  setter usage count: %" Pd "\n", setter.usage_counter());
-        }
-        if (!getter.IsNull()) {
-          THR_Print("  getter usage count: %" Pd "\n", getter.usage_counter());
-        }
-      }
-      // We determined it's not beneficial for performance to unbox the
-      // field, therefore we mark it as boxed here.
-      //
-      // Calling `DisableFieldUnboxing` will cause transition the field to
-      // boxed and deoptimize dependent code.
-      //
-      // NOTE: It will also, as a side-effect, change our field clone's
-      // `is_unboxing_candidate()` bit. So we assume the compiler has so far
-      // not relied on this bit.
-      field.DisableFieldUnboxing();
-    } else {
-      flow_graph()->parsed_function().AddToGuardedFields(&field);
-    }
-  }
-}
-
 // Replace generic context allocation or cloning with a sequence of inlined
 // allocation and explicit initializing stores.
 // If context_value is not NULL then newly allocated context is a populated
diff --git a/runtime/vm/compiler/jit/jit_call_specializer.h b/runtime/vm/compiler/jit/jit_call_specializer.h
index 8c743ed..ecbee73 100644
--- a/runtime/vm/compiler/jit/jit_call_specializer.h
+++ b/runtime/vm/compiler/jit/jit_call_specializer.h
@@ -27,7 +27,6 @@
   // Find a better place for them.
   virtual void VisitAllocateContext(AllocateContextInstr* instr);
   virtual void VisitCloneContext(CloneContextInstr* instr);
-  virtual void VisitStoreInstanceField(StoreInstanceFieldInstr* instr);
 
  private:
   virtual bool IsAllowedForInlining(intptr_t deopt_id) const;
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h
index 3ed3608..2d60271 100644
--- a/runtime/vm/compiler/recognized_methods_list.h
+++ b/runtime/vm/compiler/recognized_methods_list.h
@@ -221,6 +221,16 @@
   V(::, _storePointer, FfiStorePointer, 0xea6b7751)                            \
   V(::, _fromAddress, FfiFromAddress, 0xfd8cb1cc)                              \
   V(Pointer, get:address, FfiGetAddress, 0x7cde87be)                           \
+  V(::, _asExternalTypedDataInt8, FfiAsExternalTypedDataInt8, 0x768a0698)      \
+  V(::, _asExternalTypedDataInt16, FfiAsExternalTypedDataInt16, 0xd09cf9c6)    \
+  V(::, _asExternalTypedDataInt32, FfiAsExternalTypedDataInt32, 0x38248946)    \
+  V(::, _asExternalTypedDataInt64, FfiAsExternalTypedDataInt64, 0xafaa47fb)    \
+  V(::, _asExternalTypedDataUint8, FfiAsExternalTypedDataUint8, 0x35228834)    \
+  V(::, _asExternalTypedDataUint16, FfiAsExternalTypedDataUint16, 0x89a51e3a)  \
+  V(::, _asExternalTypedDataUint32, FfiAsExternalTypedDataUint32, 0xd272dc41)  \
+  V(::, _asExternalTypedDataUint64, FfiAsExternalTypedDataUint64, 0x06be71c5)  \
+  V(::, _asExternalTypedDataFloat, FfiAsExternalTypedDataFloat, 0x6f465e0c)    \
+  V(::, _asExternalTypedDataDouble, FfiAsExternalTypedDataDouble, 0x40cdd9e1)  \
   V(::, _getNativeField, GetNativeField, 0xa0139b85)                           \
   V(::, reachabilityFence, ReachabilityFence, 0x619235c1)                      \
   V(_Utf8Decoder, _scan, Utf8DecoderScan, 0x1dcaf73d)                          \
diff --git a/runtime/vm/compiler/relocation.cc b/runtime/vm/compiler/relocation.cc
index 428a84f..08641a0 100644
--- a/runtime/vm/compiler/relocation.cc
+++ b/runtime/vm/compiler/relocation.cc
@@ -549,7 +549,7 @@
 }
 
 intptr_t CodeRelocator::AdjustPayloadOffset(intptr_t payload_offset) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     return payload_offset;
   }
   return compiler::target::Instructions::HeaderSize() + payload_offset;
diff --git a/runtime/vm/compiler/relocation_test.cc b/runtime/vm/compiler/relocation_test.cc
index b698830..f361bd8 100644
--- a/runtime/vm/compiler/relocation_test.cc
+++ b/runtime/vm/compiler/relocation_test.cc
@@ -43,13 +43,11 @@
         safepoint_and_growth_scope(thread, SafepointLevel::kGC) {
     // So the relocator uses the correct instruction size layout.
     FLAG_precompiled_mode = true;
-    FLAG_use_bare_instructions = true;
 
     FLAG_lower_pc_relative_call_distance = -128;
     FLAG_upper_pc_relative_call_distance = 128;
   }
   ~RelocatorTestHelper() {
-    FLAG_use_bare_instructions = false;
     FLAG_precompiled_mode = false;
   }
 
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index 3210c35..b1943f6 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -793,7 +793,7 @@
 // Used for InstructionsSection and Instructions methods, since we don't
 // serialize Instructions objects in bare instructions mode, just payloads.
 DART_FORCE_INLINE static bool BareInstructionsPayloads() {
-  return FLAG_precompiled_mode && FLAG_use_bare_instructions;
+  return FLAG_precompiled_mode;
 }
 
 word InstructionsSection::HeaderSize() {
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index 494a811..4ade729 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -467,11 +467,9 @@
     UnhandledException_stacktrace_offset = 8;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 8;
+    MonomorphicSmiableCall_expected_cid_offset = 4;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 12;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 4;
+    MonomorphicSmiableCall_entrypoint_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 4;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 8;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
@@ -528,7 +526,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 16;
+    MonomorphicSmiableCall_InstanceSize = 12;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 20;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 16;
 static constexpr dart::compiler::target::word Number_InstanceSize = 4;
@@ -1025,11 +1023,9 @@
     UnhandledException_stacktrace_offset = 16;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 16;
+    MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 8;
+    MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 16;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
@@ -1087,7 +1083,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 32;
+    MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 40;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 32;
 static constexpr dart::compiler::target::word Number_InstanceSize = 8;
@@ -1576,11 +1572,9 @@
     UnhandledException_stacktrace_offset = 8;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 8;
+    MonomorphicSmiableCall_expected_cid_offset = 4;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 12;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 4;
+    MonomorphicSmiableCall_entrypoint_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 4;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 8;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
@@ -1634,7 +1628,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 16;
+    MonomorphicSmiableCall_InstanceSize = 12;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 20;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 16;
 static constexpr dart::compiler::target::word Number_InstanceSize = 4;
@@ -2131,11 +2125,9 @@
     UnhandledException_stacktrace_offset = 16;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 16;
+    MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 8;
+    MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 16;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
@@ -2194,7 +2186,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 32;
+    MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 40;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 32;
 static constexpr dart::compiler::target::word Number_InstanceSize = 8;
@@ -2689,11 +2681,9 @@
     UnhandledException_stacktrace_offset = 12;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 16;
+    MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 8;
+    MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 12;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
@@ -2751,7 +2741,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 32;
+    MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 24;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 32;
 static constexpr dart::compiler::target::word Number_InstanceSize = 8;
@@ -3246,11 +3236,9 @@
     UnhandledException_stacktrace_offset = 12;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 16;
+    MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 8;
+    MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 12;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
@@ -3309,7 +3297,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 32;
+    MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 24;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 32;
 static constexpr dart::compiler::target::word Number_InstanceSize = 8;
@@ -3794,11 +3782,9 @@
     UnhandledException_stacktrace_offset = 8;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 8;
+    MonomorphicSmiableCall_expected_cid_offset = 4;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 12;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 4;
+    MonomorphicSmiableCall_entrypoint_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 4;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 8;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
@@ -3855,7 +3841,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 16;
+    MonomorphicSmiableCall_InstanceSize = 12;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 20;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 16;
 static constexpr dart::compiler::target::word Number_InstanceSize = 4;
@@ -4346,11 +4332,9 @@
     UnhandledException_stacktrace_offset = 16;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 16;
+    MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 8;
+    MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 16;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
@@ -4408,7 +4392,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 32;
+    MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 40;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 32;
 static constexpr dart::compiler::target::word Number_InstanceSize = 8;
@@ -4891,11 +4875,9 @@
     UnhandledException_stacktrace_offset = 8;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 8;
+    MonomorphicSmiableCall_expected_cid_offset = 4;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 12;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 4;
+    MonomorphicSmiableCall_entrypoint_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 4;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 8;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
@@ -4949,7 +4931,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 16;
+    MonomorphicSmiableCall_InstanceSize = 12;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 20;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 16;
 static constexpr dart::compiler::target::word Number_InstanceSize = 4;
@@ -5440,11 +5422,9 @@
     UnhandledException_stacktrace_offset = 16;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 16;
+    MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 8;
+    MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 16;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
@@ -5503,7 +5483,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 32;
+    MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 40;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 32;
 static constexpr dart::compiler::target::word Number_InstanceSize = 8;
@@ -5992,11 +5972,9 @@
     UnhandledException_stacktrace_offset = 12;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 16;
+    MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 8;
+    MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 12;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
@@ -6054,7 +6032,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 32;
+    MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 24;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 32;
 static constexpr dart::compiler::target::word Number_InstanceSize = 8;
@@ -6543,11 +6521,9 @@
     UnhandledException_stacktrace_offset = 12;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 16;
+    MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 8;
+    MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 12;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
@@ -6606,7 +6582,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 32;
+    MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 24;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 32;
 static constexpr dart::compiler::target::word Number_InstanceSize = 8;
@@ -7151,11 +7127,9 @@
     AOT_UnhandledException_stacktrace_offset = 8;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 4;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 12;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 4;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 4;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset = 8;
 static constexpr dart::compiler::target::word AOT_Code_entry_point_offset[] = {
@@ -7219,7 +7193,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 16;
+    AOT_MonomorphicSmiableCall_InstanceSize = 12;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 20;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     16;
@@ -7769,11 +7743,9 @@
     AOT_UnhandledException_stacktrace_offset = 16;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 16;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 8;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset =
     16;
@@ -7839,7 +7811,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 32;
+    AOT_MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     32;
@@ -8392,11 +8364,9 @@
     AOT_UnhandledException_stacktrace_offset = 16;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 16;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 8;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset =
     16;
@@ -8463,7 +8433,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 32;
+    AOT_MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     32;
@@ -9012,11 +8982,9 @@
     AOT_UnhandledException_stacktrace_offset = 12;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 16;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 8;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset =
     12;
@@ -9082,7 +9050,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 32;
+    AOT_MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     32;
@@ -9631,11 +9599,9 @@
     AOT_UnhandledException_stacktrace_offset = 12;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 16;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 8;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset =
     12;
@@ -9702,7 +9668,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 32;
+    AOT_MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     32;
@@ -10245,11 +10211,9 @@
     AOT_UnhandledException_stacktrace_offset = 8;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 4;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 12;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 4;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 4;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset = 8;
 static constexpr dart::compiler::target::word AOT_Code_entry_point_offset[] = {
@@ -10313,7 +10277,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 16;
+    AOT_MonomorphicSmiableCall_InstanceSize = 12;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 20;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     16;
@@ -10856,11 +10820,9 @@
     AOT_UnhandledException_stacktrace_offset = 16;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 16;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 8;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset =
     16;
@@ -10926,7 +10888,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 32;
+    AOT_MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     32;
@@ -11472,11 +11434,9 @@
     AOT_UnhandledException_stacktrace_offset = 16;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 16;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 8;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset =
     16;
@@ -11543,7 +11503,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 32;
+    AOT_MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     32;
@@ -12085,11 +12045,9 @@
     AOT_UnhandledException_stacktrace_offset = 12;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 16;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 8;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset =
     12;
@@ -12155,7 +12113,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 32;
+    AOT_MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     32;
@@ -12697,11 +12655,9 @@
     AOT_UnhandledException_stacktrace_offset = 12;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 16;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 8;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset =
     12;
@@ -12768,7 +12724,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 32;
+    AOT_MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     32;
diff --git a/runtime/vm/compiler/runtime_offsets_list.h b/runtime/vm/compiler/runtime_offsets_list.h
index 88ab5b2..0d22eca 100644
--- a/runtime/vm/compiler/runtime_offsets_list.h
+++ b/runtime/vm/compiler/runtime_offsets_list.h
@@ -323,7 +323,6 @@
   FIELD(UserTag, tag_offset)                                                   \
   FIELD(MonomorphicSmiableCall, expected_cid_offset)                           \
   FIELD(MonomorphicSmiableCall, entrypoint_offset)                             \
-  FIELD(MonomorphicSmiableCall, target_offset)                                 \
   FIELD(WeakProperty, key_offset)                                              \
   FIELD(WeakProperty, value_offset)                                            \
   RANGE(Code, entry_point_offset, CodeEntryKind, CodeEntryKind::kNormal,       \
diff --git a/runtime/vm/compiler/stub_code_compiler.cc b/runtime/vm/compiler/stub_code_compiler.cc
index 210001c..a4c8a57 100644
--- a/runtime/vm/compiler/stub_code_compiler.cc
+++ b/runtime/vm/compiler/stub_code_compiler.cc
@@ -48,6 +48,68 @@
   __ Ret();
 }
 
+void StubCodeCompiler::GenerateInitLateStaticFieldStub(Assembler* assembler,
+                                                       bool is_final) {
+  const Register kResultReg = InitStaticFieldABI::kResultReg;
+  const Register kFunctionReg = InitLateStaticFieldInternalRegs::kFunctionReg;
+  const Register kFieldReg = InitStaticFieldABI::kFieldReg;
+  const Register kAddressReg = InitLateStaticFieldInternalRegs::kAddressReg;
+  const Register kScratchReg = InitLateStaticFieldInternalRegs::kScratchReg;
+
+  __ EnterStubFrame();
+
+  __ Comment("Calling initializer function");
+  __ PushRegister(kFieldReg);
+  __ LoadCompressedFieldFromOffset(
+      kFunctionReg, InitInstanceFieldABI::kFieldReg,
+      target::Field::initializer_function_offset());
+  if (!FLAG_precompiled_mode) {
+    __ LoadCompressedFieldFromOffset(CODE_REG, kFunctionReg,
+                                     target::Function::code_offset());
+    // Load a GC-safe value for the arguments descriptor (unused but tagged).
+    __ LoadImmediate(ARGS_DESC_REG, 0);
+  }
+  __ Call(FieldAddress(kFunctionReg, target::Function::entry_point_offset()));
+  __ MoveRegister(kResultReg, CallingConventions::kReturnReg);
+  __ PopRegister(kFieldReg);
+  __ LoadStaticFieldAddress(kAddressReg, kFieldReg, kScratchReg);
+
+  Label throw_exception;
+  if (is_final) {
+    __ Comment("Checking that initializer did not set late final field");
+    __ LoadFromOffset(kScratchReg, kAddressReg, 0);
+    __ CompareObject(kScratchReg, SentinelObject());
+    __ BranchIf(NOT_EQUAL, &throw_exception);
+  }
+
+  __ StoreToOffset(kResultReg, kAddressReg, 0);
+  __ LeaveStubFrame();
+  __ Ret();
+
+  if (is_final) {
+#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64)
+    // We are jumping over LeaveStubFrame so restore LR state to match one
+    // at the jump point.
+    __ set_lr_state(compiler::LRState::OnEntry().EnterFrame());
+#endif  // defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64)
+    __ Bind(&throw_exception);
+    __ PushObject(NullObject());  // Make room for (unused) result.
+    __ PushRegister(kFieldReg);
+    __ CallRuntime(kLateFieldAssignedDuringInitializationErrorRuntimeEntry,
+                   /*argument_count=*/1);
+    __ Breakpoint();
+  }
+}
+
+void StubCodeCompiler::GenerateInitLateStaticFieldStub(Assembler* assembler) {
+  GenerateInitLateStaticFieldStub(assembler, /*is_final=*/false);
+}
+
+void StubCodeCompiler::GenerateInitLateFinalStaticFieldStub(
+    Assembler* assembler) {
+  GenerateInitLateStaticFieldStub(assembler, /*is_final=*/true);
+}
+
 void StubCodeCompiler::GenerateInitInstanceFieldStub(Assembler* assembler) {
   __ EnterStubFrame();
   __ PushObject(NullObject());  // Make room for result.
@@ -82,7 +144,7 @@
   __ LoadCompressedFieldFromOffset(
       kFunctionReg, InitInstanceFieldABI::kFieldReg,
       target::Field::initializer_function_offset());
-  if (!FLAG_precompiled_mode || !FLAG_use_bare_instructions) {
+  if (!FLAG_precompiled_mode) {
     __ LoadCompressedFieldFromOffset(CODE_REG, kFunctionReg,
                                      target::Function::code_offset());
     // Load a GC-safe value for the arguments descriptor (unused but tagged).
@@ -675,7 +737,7 @@
 void StubCodeCompiler::GenerateSlowTypeTestStub(Assembler* assembler) {
   Label done, call_runtime;
 
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     __ LoadFromOffset(CODE_REG, THR,
                       target::Thread::slow_type_test_stub_offset());
   }
@@ -807,13 +869,9 @@
       // entry point in bare instructions mode or to 0 otherwise (to catch
       // misuse). This overwrites the scratch register, but there are no more
       // boxed fields.
-      if (FLAG_use_bare_instructions) {
-        __ LoadFromSlot(AllocateClosureABI::kScratchReg,
-                        AllocateClosureABI::kFunctionReg,
-                        Slot::Function_entry_point());
-      } else {
-        __ LoadImmediate(AllocateClosureABI::kScratchReg, 0);
-      }
+      __ LoadFromSlot(AllocateClosureABI::kScratchReg,
+                      AllocateClosureABI::kFunctionReg,
+                      Slot::Function_entry_point());
       __ StoreToSlotNoBarrier(AllocateClosureABI::kScratchReg,
                               AllocateClosureABI::kResultReg,
                               Slot::Closure_entry_point());
diff --git a/runtime/vm/compiler/stub_code_compiler.h b/runtime/vm/compiler/stub_code_compiler.h
index 58f52ce..fc28901 100644
--- a/runtime/vm/compiler/stub_code_compiler.h
+++ b/runtime/vm/compiler/stub_code_compiler.h
@@ -151,6 +151,11 @@
   static intptr_t WordOffsetFromFpToCpuRegister(Register cpu_register);
 
  private:
+  // Common function for generating InitLateStaticField and
+  // InitLateFinalStaticField stubs.
+  static void GenerateInitLateStaticFieldStub(Assembler* assembler,
+                                              bool is_final);
+
   // Common function for generating InitLateInstanceField and
   // InitLateFinalInstanceField stubs.
   static void GenerateInitLateInstanceFieldStub(Assembler* assembler,
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index eefb057..859643a 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -140,7 +140,7 @@
 
   // 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) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
   }
 
@@ -604,7 +604,7 @@
 
   // 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) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
   }
 
@@ -1278,7 +1278,7 @@
   __ Bind(&done_push_arguments);
 
   // Call the Dart code entrypoint.
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
     __ LoadImmediate(CODE_REG, 0);  // GC safe value into CODE_REG.
   } else {
@@ -1845,7 +1845,7 @@
   const Register kClsReg = R1;
   const Register kTagsReg = R2;
 
-  if (!FLAG_use_bare_instructions) {
+  if (!FLAG_precompiled_mode) {
     __ ldr(CODE_REG,
            Address(THR, target::Thread::call_to_runtime_stub_offset()));
   }
@@ -2659,8 +2659,7 @@
   // the corresponding slot in the current cache entry.
 
   // NOTFP must be preserved for bare payloads, otherwise CODE_REG.
-  const bool use_bare_payloads =
-      FLAG_precompiled_mode && FLAG_use_bare_instructions;
+  const bool use_bare_payloads = FLAG_precompiled_mode;
   // For this, we choose the register that need not be preserved of the pair.
   const Register kNullReg = use_bare_payloads ? CODE_REG : NOTFP;
   __ LoadObject(kNullReg, NullObject());
@@ -2926,7 +2925,7 @@
   __ StoreToOffset(R2, THR, target::Thread::top_exit_frame_info_offset());
   // Restore the pool pointer.
   __ RestoreCodePointer();
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
     __ set_constant_pool_allowed(true);
   } else {
@@ -3150,7 +3149,7 @@
   // 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 + target::kWordSize));
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     __ ldr(CODE_REG, FieldAddress(R0, target::Function::code_offset()));
   }
   __ ldr(ARGS_DESC_REG,
@@ -3196,7 +3195,7 @@
   __ b(&loop);
 
   __ Bind(&found);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     const intptr_t entry_offset =
         target::ICData::EntryPointIndexFor(1) * target::kWordSize;
     __ LoadCompressed(R0, Address(R8, entry_offset));
@@ -3225,34 +3224,20 @@
     Assembler* assembler) {
   __ LoadClassIdMayBeSmi(IP, R0);
 
-  // expected_cid_ should come right after target_
-  ASSERT(target::MonomorphicSmiableCall::expected_cid_offset() ==
-         target::MonomorphicSmiableCall::target_offset() + target::kWordSize);
   // entrypoint_ should come right after expected_cid_
   ASSERT(target::MonomorphicSmiableCall::entrypoint_offset() ==
          target::MonomorphicSmiableCall::expected_cid_offset() +
              target::kWordSize);
 
-  if (FLAG_use_bare_instructions) {
-    // Simultaneously load the expected cid into R2 and the entrypoint into R3.
-    __ ldrd(
-        R2, R3, R9,
-        target::MonomorphicSmiableCall::expected_cid_offset() - kHeapObjectTag);
-    __ cmp(R2, Operand(IP));
-    __ Branch(Address(THR, target::Thread::switchable_call_miss_entry_offset()),
-              NE);
-    __ bx(R3);
-  } else {
-    // Simultaneously load the target into R2 and the expected cid into R3.
-    __ ldrd(R2, R3, R9,
-            target::MonomorphicSmiableCall::target_offset() - kHeapObjectTag);
-    __ mov(CODE_REG, Operand(R2));
-    __ cmp(R3, Operand(IP));
-    __ Branch(Address(THR, target::Thread::switchable_call_miss_entry_offset()),
-              NE);
-    __ LoadField(IP, FieldAddress(R2, target::Code::entry_point_offset()));
-    __ bx(IP);
-  }
+  // Note: this stub is only used in AOT mode, hence the direct (bare) call.
+  // Simultaneously load the expected cid into R2 and the entrypoint into R3.
+  __ ldrd(
+      R2, R3, R9,
+      target::MonomorphicSmiableCall::expected_cid_offset() - kHeapObjectTag);
+  __ cmp(R2, Operand(IP));
+  __ Branch(Address(THR, target::Thread::switchable_call_miss_entry_offset()),
+            NE);
+  __ bx(R3);
 }
 
 static void CallSwitchableCallMissRuntimeEntry(Assembler* assembler,
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 54196b7..af8d3c5 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -150,15 +150,14 @@
   __ StoreToOffset(R2, THR, target::Thread::vm_tag_offset());
 
   // Mark that the thread has not exited generated Dart code.
-  __ LoadImmediate(R2, 0);
-  __ StoreToOffset(R2, THR, target::Thread::exit_through_ffi_offset());
+  __ StoreToOffset(ZR, THR, target::Thread::exit_through_ffi_offset());
 
   // Reset exit frame information in Isolate's mutator thread structure.
   __ StoreToOffset(ZR, THR, target::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) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
   }
 
@@ -722,15 +721,14 @@
   __ StoreToOffset(R2, THR, target::Thread::vm_tag_offset());
 
   // Mark that the thread has not exited generated Dart code.
-  __ LoadImmediate(R2, 0);
-  __ StoreToOffset(R2, THR, target::Thread::exit_through_ffi_offset());
+  __ StoreToOffset(ZR, THR, target::Thread::exit_through_ffi_offset());
 
   // Reset exit frame information in Isolate's mutator thread structure.
   __ StoreToOffset(ZR, THR, target::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) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
   }
 
@@ -1389,8 +1387,7 @@
 
   __ LoadFromOffset(R6, THR, target::Thread::exit_through_ffi_offset());
   __ Push(R6);
-  __ LoadImmediate(R6, 0);
-  __ StoreToOffset(R6, THR, target::Thread::exit_through_ffi_offset());
+  __ StoreToOffset(ZR, THR, target::Thread::exit_through_ffi_offset());
 
   __ LoadFromOffset(R6, THR, target::Thread::top_exit_frame_info_offset());
   __ StoreToOffset(ZR, THR, target::Thread::top_exit_frame_info_offset());
@@ -1440,7 +1437,7 @@
   __ b(&push_arguments, LT);
   __ Bind(&done_push_arguments);
 
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
     __ mov(CODE_REG, ZR);  // GC-safe value into CODE_REG.
   } else {
@@ -2006,7 +2003,7 @@
 void StubCodeCompiler::GenerateAllocateObjectSlowStub(Assembler* assembler) {
   const Register kTagsToClsIdReg = R2;
 
-  if (!FLAG_use_bare_instructions) {
+  if (!FLAG_precompiled_mode) {
     __ ldr(CODE_REG,
            Address(THR, target::Thread::call_to_runtime_stub_offset()));
   }
@@ -3113,7 +3110,7 @@
   __ StoreToOffset(ZR, THR, target::Thread::top_exit_frame_info_offset());
   // Restore the pool pointer.
   __ RestoreCodePointer();
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
   } else {
     __ LoadPoolPointer();
@@ -3224,8 +3221,8 @@
 
   __ Bind(&reference_compare);
   __ CompareObjectRegisters(left, right);
-  // None of the branches above go directly here to avoid generating a conditional 
-  // branch to a ret instruction.
+  // None of the branches above go directly here to avoid generating a
+  // conditional branch to a ret instruction.
   // This is an attempt to work-around a possible CPU on Exynos 2100 SoC.
   // See https://github.com/flutter/flutter/issues/88261
   __ ret();
@@ -3335,7 +3332,7 @@
   __ ldr(R1, FieldAddress(R0, target::Function::entry_point_offset()));
   __ ldr(ARGS_DESC_REG,
          FieldAddress(R5, target::CallSiteData::arguments_descriptor_offset()));
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     __ LoadCompressed(CODE_REG,
                       FieldAddress(R0, target::Function::code_offset()));
   }
@@ -3388,7 +3385,7 @@
   __ b(&loop);
 
   __ Bind(&found);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     const intptr_t entry_offset =
         target::ICData::EntryPointIndexFor(1) * target::kCompressedWordSize;
     __ LoadCompressed(R1,
@@ -3422,30 +3419,16 @@
   Label miss;
   __ LoadClassIdMayBeSmi(IP0, R0);
 
-  if (FLAG_use_bare_instructions) {
-    __ LoadField(
-        IP1, FieldAddress(
-                 R5, target::MonomorphicSmiableCall::expected_cid_offset()));
-    __ LoadField(
-        R1,
-        FieldAddress(R5, target::MonomorphicSmiableCall::entrypoint_offset()));
-    __ cmp(IP0, Operand(IP1));
-    __ b(&miss, NE);
-    __ br(R1);
-  } else {
-    __ LoadField(
-        IP1, FieldAddress(
-                 R5, target::MonomorphicSmiableCall::expected_cid_offset()));
-    __ LoadField(
-        CODE_REG,
-        FieldAddress(R5, target::MonomorphicSmiableCall::target_offset()));
-    __ LoadField(
-        R1,
-        FieldAddress(R5, target::MonomorphicSmiableCall::entrypoint_offset()));
-    __ cmp(IP0, Operand(IP1));
-    __ b(&miss, NE);
-    __ br(R1);
-  }
+  // Note: this stub is only used in AOT mode, hence the direct (bare) call.
+  __ LoadField(
+      IP1,
+      FieldAddress(R5, target::MonomorphicSmiableCall::expected_cid_offset()));
+  __ LoadField(
+      R1,
+      FieldAddress(R5, target::MonomorphicSmiableCall::entrypoint_offset()));
+  __ cmp(IP0, Operand(IP1));
+  __ b(&miss, NE);
+  __ br(R1);
 
   __ Bind(&miss);
   __ ldr(IP0,
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index 12079e9..07f9c00 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -141,7 +141,7 @@
 
   // 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) {
+  if (FLAG_precompiled_mode) {
     __ movq(PP, Address(THR, target::Thread::global_object_pool_offset()));
   }
 
@@ -645,7 +645,7 @@
 
   // 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) {
+  if (FLAG_precompiled_mode) {
     __ movq(PP, Address(THR, target::Thread::global_object_pool_offset()));
   }
 
@@ -1366,7 +1366,7 @@
   __ Bind(&done_push_arguments);
 
   // Call the Dart code entrypoint.
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ movq(PP, Address(THR, target::Thread::global_object_pool_offset()));
     __ xorq(CODE_REG, CODE_REG);  // GC-safe value into CODE_REG.
   } else {
@@ -1935,7 +1935,7 @@
 void StubCodeCompiler::GenerateAllocateObjectSlowStub(Assembler* assembler) {
   const Register kTagsToClsIdReg = R8;
 
-  if (!FLAG_use_bare_instructions) {
+  if (!FLAG_precompiled_mode) {
     __ movq(CODE_REG,
             Address(THR, target::Thread::call_to_runtime_stub_offset()));
   }
@@ -3052,7 +3052,7 @@
           Immediate(0));
   // Restore the pool pointer.
   __ RestoreCodePointer();
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ movq(PP, Address(THR, target::Thread::global_object_pool_offset()));
   } else {
     __ LoadPoolPointer(PP);
@@ -3274,7 +3274,7 @@
   __ movq(R10, FieldAddress(
                    RBX, target::CallSiteData::arguments_descriptor_offset()));
   __ movq(RCX, FieldAddress(RAX, target::Function::entry_point_offset()));
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     __ LoadCompressed(CODE_REG,
                       FieldAddress(RAX, target::Function::code_offset()));
   }
@@ -3329,7 +3329,7 @@
   __ jmp(&loop);
 
   __ Bind(&found);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     const intptr_t entry_offset =
         target::ICData::EntryPointIndexFor(1) * target::kCompressedWordSize;
     __ LoadCompressed(RCX, Address(R13, entry_offset));
@@ -3362,14 +3362,9 @@
   __ Bind(&have_cid);
   __ cmpq(RAX, RCX);
   __ j(NOT_EQUAL, &miss, Assembler::kNearJump);
-  if (FLAG_use_bare_instructions) {
-    __ jmp(
-        FieldAddress(RBX, target::MonomorphicSmiableCall::entrypoint_offset()));
-  } else {
-    __ movq(CODE_REG,
-            FieldAddress(RBX, target::MonomorphicSmiableCall::target_offset()));
-    __ jmp(FieldAddress(CODE_REG, target::Code::entry_point_offset()));
-  }
+  // Note: this stub is only used in AOT mode, hence the direct (bare) call.
+  __ jmp(
+      FieldAddress(RBX, target::MonomorphicSmiableCall::entrypoint_offset()));
 
   __ Bind(&miss);
   __ jmp(Address(THR, target::Thread::switchable_call_miss_entry_offset()));
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index 6adbe81..c774203 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -412,10 +412,17 @@
 
 // ABI for InitStaticFieldStub.
 struct InitStaticFieldABI {
-  static const Register kFieldReg = R0;
+  static const Register kFieldReg = R2;
   static const Register kResultReg = R0;
 };
 
+// Registers used inside the implementation of InitLateStaticFieldStub.
+struct InitLateStaticFieldInternalRegs {
+  static const Register kFunctionReg = R0;
+  static const Register kAddressReg = R3;
+  static const Register kScratchReg = R4;
+};
+
 // ABI for InitInstanceFieldStub.
 struct InitInstanceFieldABI {
   static const Register kInstanceReg = R1;
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index 28ac726..7947a60 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -251,10 +251,17 @@
 
 // ABI for InitStaticFieldStub.
 struct InitStaticFieldABI {
-  static const Register kFieldReg = R0;
+  static const Register kFieldReg = R2;
   static const Register kResultReg = R0;
 };
 
+// Registers used inside the implementation of InitLateStaticFieldStub.
+struct InitLateStaticFieldInternalRegs {
+  static const Register kFunctionReg = R0;
+  static const Register kAddressReg = R3;
+  static const Register kScratchReg = R4;
+};
+
 // ABI for InitInstanceFieldStub.
 struct InitInstanceFieldABI {
   static const Register kInstanceReg = R1;
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 5f9c331..4a497730 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -148,10 +148,17 @@
 
 // ABI for InitStaticFieldStub.
 struct InitStaticFieldABI {
-  static const Register kFieldReg = EAX;
+  static const Register kFieldReg = EDX;
   static const Register kResultReg = EAX;
 };
 
+// Registers used inside the implementation of InitLateStaticFieldStub.
+struct InitLateStaticFieldInternalRegs {
+  static const Register kFunctionReg = EAX;
+  static const Register kAddressReg = ECX;
+  static const Register kScratchReg = EDI;
+};
+
 // ABI for InitInstanceFieldStub.
 struct InitInstanceFieldABI {
   static const Register kInstanceReg = EBX;
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index eb24c81..3e7f3c5 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -223,10 +223,17 @@
 
 // ABI for InitStaticFieldStub.
 struct InitStaticFieldABI {
-  static const Register kFieldReg = RAX;
+  static const Register kFieldReg = RDX;
   static const Register kResultReg = RAX;
 };
 
+// Registers used inside the implementation of InitLateStaticFieldStub.
+struct InitLateStaticFieldInternalRegs {
+  static const Register kFunctionReg = RAX;
+  static const Register kAddressReg = RCX;
+  static const Register kScratchReg = RSI;
+};
+
 // ABI for InitInstanceFieldStub.
 struct InitInstanceFieldABI {
   static const Register kInstanceReg = RBX;
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index ced30ca..e18e2a3 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -7,6 +7,7 @@
 
 #include "vm/dart.h"
 
+#include "platform/thread_sanitizer.h"
 #include "vm/app_snapshot.h"
 #include "vm/code_observers.h"
 #include "vm/compiler/runtime_offsets_extracted.h"
@@ -15,6 +16,9 @@
 #include "vm/dart_api_state.h"
 #include "vm/dart_entry.h"
 #include "vm/debugger.h"
+#if defined(DART_PRECOMPILED_RUNTIME) && defined(DART_TARGET_OS_LINUX)
+#include "vm/elf.h"
+#endif
 #include "vm/flags.h"
 #include "vm/handles.h"
 #include "vm/heap/become.h"
@@ -46,6 +50,13 @@
 #include "vm/virtual_memory.h"
 #include "vm/zone.h"
 
+#if defined(USING_THREAD_SANITIZER)
+// TODO(https://github.com/dart-lang/sdk/issues/46699): Remove.
+// TODO(https://bugs.fuchsia.dev/p/fuchsia/issues/detail?id=83298): Remove.
+#include "unicode/uchar.h"
+#include "unicode/uniset.h"
+#endif
+
 namespace dart {
 
 DECLARE_FLAG(bool, print_class_table);
@@ -66,6 +77,8 @@
 Dart_FileCloseCallback Dart::file_close_callback_ = NULL;
 Dart_EntropySource Dart::entropy_source_callback_ = NULL;
 Dart_GCEventCallback Dart::gc_event_callback_ = nullptr;
+Dart_PostTaskCallback Dart::post_task_callback_ = nullptr;
+void* Dart::post_task_data_ = nullptr;
 
 // Structure for managing read-only global handles allocation used for
 // creating global read-only handles that are pre created and initialized
@@ -256,7 +269,16 @@
                      Dart_EntropySource entropy_source,
                      Dart_GetVMServiceAssetsArchive get_service_assets,
                      bool start_kernel_isolate,
-                     Dart_CodeObserver* observer) {
+                     Dart_CodeObserver* observer,
+                     Dart_PostTaskCallback post_task,
+                     void* post_task_data) {
+#if defined(USING_THREAD_SANITIZER)
+  // Trigger lazy initialization in ICU to avoid spurious TSAN warning.
+  // TODO(https://github.com/dart-lang/sdk/issues/46699): Remove.
+  // TODO(https://bugs.fuchsia.dev/p/fuchsia/issues/detail?id=83298): Remove.
+  u_getPropertyValueEnum(UCHAR_SCRIPT, "foo");
+#endif
+
   CheckOffsets();
 
   if (!Flags::Initialized()) {
@@ -291,6 +313,8 @@
   set_thread_exit_callback(thread_exit);
   SetFileCallbacks(file_open, file_read, file_write, file_close);
   set_entropy_source_callback(entropy_source);
+  set_post_task_callback(post_task);
+  set_post_task_data(post_task_data);
   OS::Init();
   NOT_IN_PRODUCT(CodeObservers::Init());
   if (observer != nullptr) {
@@ -298,6 +322,16 @@
   }
   start_time_micros_ = OS::GetCurrentMonotonicMicros();
   VirtualMemory::Init();
+
+#if defined(DART_PRECOMPILED_RUNTIME) && defined(DART_TARGET_OS_LINUX)
+  if (VirtualMemory::PageSize() > kElfPageSize) {
+    return Utils::SCreate(
+        "Incompatible page size for AOT compiled ELF: expected at most %" Pd
+        ", got %" Pd "",
+        kElfPageSize, VirtualMemory::PageSize());
+  }
+#endif
+
   OSThread::Init();
   Zone::Init();
 #if defined(SUPPORT_TIMELINE)
@@ -518,18 +552,21 @@
                  Dart_EntropySource entropy_source,
                  Dart_GetVMServiceAssetsArchive get_service_assets,
                  bool start_kernel_isolate,
-                 Dart_CodeObserver* observer) {
+                 Dart_CodeObserver* observer,
+                 Dart_PostTaskCallback post_task,
+                 void* post_task_data) {
   if (!init_state_.SetInitializing()) {
     return Utils::StrDup(
         "Bad VM initialization state, "
         "already initialized or "
         "multiple threads initializing the VM.");
   }
-  char* retval = DartInit(vm_isolate_snapshot, instructions_snapshot,
-                          create_group, initialize_isolate, shutdown, cleanup,
-                          cleanup_group, thread_exit, file_open, file_read,
-                          file_write, file_close, entropy_source,
-                          get_service_assets, start_kernel_isolate, observer);
+  char* retval =
+      DartInit(vm_isolate_snapshot, instructions_snapshot, create_group,
+               initialize_isolate, shutdown, cleanup, cleanup_group,
+               thread_exit, file_open, file_read, file_write, file_close,
+               entropy_source, get_service_assets, start_kernel_isolate,
+               observer, post_task, post_task_data);
   if (retval != NULL) {
     init_state_.ResetInitializing();
     return retval;
@@ -582,6 +619,14 @@
 
 // This waits until only the VM isolate remains in the list.
 void Dart::WaitForIsolateShutdown() {
+  int64_t start_time = 0;
+  if (FLAG_trace_shutdown) {
+    start_time = UptimeMillis();
+    OS::PrintErr("[+%" Pd64
+                 "ms] SHUTDOWN: Waiting for service "
+                 "and kernel isolates to shutdown\n",
+                 start_time);
+  }
   ASSERT(!Isolate::creation_enabled_);
   MonitorLocker ml(Isolate::isolate_creation_monitor_);
   intptr_t num_attempts = 0;
@@ -592,6 +637,25 @@
       if (num_attempts > 10) {
         DumpAliveIsolates(num_attempts, /*only_application_isolates=*/false);
       }
+      if (FLAG_trace_shutdown) {
+        OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: %" Pd
+                     " time out waiting for "
+                     "service and kernel isolates to shutdown\n",
+                     UptimeMillis(), num_attempts);
+      }
+    }
+  }
+  if (FLAG_trace_shutdown) {
+    int64_t stop_time = UptimeMillis();
+    OS::PrintErr("[+%" Pd64
+                 "ms] SHUTDOWN: Done waiting for service "
+                 "and kernel isolates to shutdown\n",
+                 stop_time);
+    if ((stop_time - start_time) > 500) {
+      OS::PrintErr("[+%" Pd64
+                   "ms] SHUTDOWN: waited too long for service "
+                   "and kernel isolates to shutdown\n",
+                   (stop_time - start_time));
     }
   }
 
@@ -642,6 +706,10 @@
                    UptimeMillis());
     }
     WaitForApplicationIsolateShutdown();
+    if (FLAG_trace_shutdown) {
+      OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Done shutting down app isolates\n",
+                   UptimeMillis());
+    }
   }
 
   // Shutdown the kernel isolate.
@@ -658,12 +726,8 @@
   }
   ServiceIsolate::Shutdown();
 
-  // Wait for the remaining isolate (service isolate) to shutdown
+  // Wait for the remaining isolate (service/kernel isolate) to shutdown
   // before shutting down the thread pool.
-  if (FLAG_trace_shutdown) {
-    OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Waiting for isolate shutdown\n",
-                 UptimeMillis());
-  }
   WaitForIsolateShutdown();
 
 #if !defined(PRODUCT)
@@ -696,6 +760,10 @@
   thread_pool_->Shutdown();
   delete thread_pool_;
   thread_pool_ = NULL;
+  if (FLAG_trace_shutdown) {
+    OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Done deleting thread pool\n",
+                 UptimeMillis());
+  }
 
   Api::Cleanup();
   delete predefined_handles_;
@@ -779,6 +847,8 @@
   Service::SetEmbedderStreamCallbacks(NULL, NULL);
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
   VirtualMemory::Cleanup();
+  post_task_callback_ = nullptr;
+  post_task_data_ = nullptr;
   return NULL;
 }
 
diff --git a/runtime/vm/dart.h b/runtime/vm/dart.h
index 9d0cdf1..a8c4a56 100644
--- a/runtime/vm/dart.h
+++ b/runtime/vm/dart.h
@@ -44,7 +44,9 @@
                     Dart_EntropySource entropy_source,
                     Dart_GetVMServiceAssetsArchive get_service_assets,
                     bool start_kernel_isolate,
-                    Dart_CodeObserver* observer);
+                    Dart_CodeObserver* observer,
+                    Dart_PostTaskCallback post_task,
+                    void* post_task_data);
 
   // Returns null if cleanup succeeds, otherwise returns an error message
   // (caller owns error message and has to free it).
@@ -123,6 +125,14 @@
   static void set_thread_exit_callback(Dart_ThreadExitCallback cback) {
     thread_exit_callback_ = cback;
   }
+  static Dart_PostTaskCallback post_task_callback() {
+    return post_task_callback_;
+  }
+  static void set_post_task_callback(Dart_PostTaskCallback cback) {
+    post_task_callback_ = cback;
+  }
+  static void* post_task_data() { return post_task_data_; }
+  static void set_post_task_data(void* data) { post_task_data_ = data; }
   static void SetFileCallbacks(Dart_FileOpenCallback file_open,
                                Dart_FileReadCallback file_read,
                                Dart_FileWriteCallback file_write,
@@ -174,7 +184,9 @@
                         Dart_EntropySource entropy_source,
                         Dart_GetVMServiceAssetsArchive get_service_assets,
                         bool start_kernel_isolate,
-                        Dart_CodeObserver* observer);
+                        Dart_CodeObserver* observer,
+                        Dart_PostTaskCallback post_task,
+                        void* post_task_data);
 
   static constexpr const char* kVmIsolateName = "vm-isolate";
 
@@ -194,6 +206,8 @@
   static Dart_FileCloseCallback file_close_callback_;
   static Dart_EntropySource entropy_source_callback_;
   static Dart_GCEventCallback gc_event_callback_;
+  static Dart_PostTaskCallback post_task_callback_;
+  static void* post_task_data_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 1c7026a..fe7dcc4 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1211,14 +1211,14 @@
         "Invalid Dart_InitializeParams version.");
   }
 
-  return Dart::Init(params->vm_snapshot_data, params->vm_snapshot_instructions,
-                    params->create_group, params->initialize_isolate,
-                    params->shutdown_isolate, params->cleanup_isolate,
-                    params->cleanup_group, params->thread_exit,
-                    params->file_open, params->file_read, params->file_write,
-                    params->file_close, params->entropy_source,
-                    params->get_service_assets, params->start_kernel_isolate,
-                    params->code_observer);
+  return Dart::Init(
+      params->vm_snapshot_data, params->vm_snapshot_instructions,
+      params->create_group, params->initialize_isolate,
+      params->shutdown_isolate, params->cleanup_isolate, params->cleanup_group,
+      params->thread_exit, params->file_open, params->file_read,
+      params->file_write, params->file_close, params->entropy_source,
+      params->get_service_assets, params->start_kernel_isolate,
+      params->code_observer, params->post_task, params->post_task_data);
 }
 
 DART_EXPORT char* Dart_Cleanup() {
@@ -1463,13 +1463,6 @@
 
   *error = nullptr;
 
-  if (!FLAG_enable_isolate_groups) {
-    *error = Utils::StrDup(
-        "Lightweight isolates need to be explicitly enabled by passing "
-        "--enable-isolate-groups.");
-    return nullptr;
-  }
-
   Isolate* isolate;
   isolate = CreateWithinExistingIsolateGroup(member->group(), name, error);
   if (isolate != nullptr) {
@@ -2070,6 +2063,16 @@
   return true;
 }
 
+DART_EXPORT void Dart_RunTask(Dart_Task task) {
+  Thread* T = Thread::Current();
+  Isolate* I = T == nullptr ? nullptr : T->isolate();
+  CHECK_NO_ISOLATE(I);
+  API_TIMELINE_BEGIN_END(T);
+  ThreadPool::Task* task_impl = reinterpret_cast<ThreadPool::Task*>(task);
+  task_impl->Run();
+  delete task_impl;
+}
+
 DART_EXPORT Dart_Handle Dart_HandleMessage() {
   Thread* T = Thread::Current();
   Isolate* I = T->isolate();
@@ -6202,14 +6205,6 @@
 #endif
 }
 
-DART_EXPORT void Dart_SetNativeServiceStreamCallback(
-    Dart_NativeStreamConsumer consumer,
-    const char* stream_id) {
-#if !defined(PRODUCT)
-  Service::SetNativeServiceStreamCallback(consumer, stream_id);
-#endif
-}
-
 DART_EXPORT char* Dart_ServiceSendDataEvent(const char* stream_id,
                                             const char* event_kind,
                                             const uint8_t* bytes,
@@ -6279,6 +6274,20 @@
 #endif
 }
 
+DART_EXPORT bool Dart_SetEnabledTimelineCategory(const char* categories) {
+#if defined(SUPPORT_TIMELINE)
+  bool result = false;
+  if (categories != nullptr) {
+    char* carray = Utils::SCreate("[%s]", categories);
+    result = Service::EnableTimelineStreams(carray);
+    free(carray);
+  }
+  return result;
+#else
+  return false;
+#endif
+}
+
 DART_EXPORT int64_t Dart_TimelineGetMicros() {
   return OS::GetCurrentMonotonicMicros();
 }
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 7074ded..5a9050a 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -9323,6 +9323,84 @@
   EXPECT_EQ(frequency1, frequency2);
 }
 
+TEST_CASE(DartAPI_TimelineCategories) {
+  bool result;
+  {
+    result = Dart_SetEnabledTimelineCategory("all");
+    EXPECT_EQ(true, result);
+    JSONStream js;
+    JSONObject obj(&js);
+    JSONArray jstream(&obj, "available");
+    Timeline::PrintFlagsToJSONArray(&jstream);
+    const char* js_str = js.ToCString();
+#define TIMELINE_STREAM_CHECK(name, fuchsia_name)                              \
+  EXPECT_SUBSTRING(#name, js_str);
+    TIMELINE_STREAM_LIST(TIMELINE_STREAM_CHECK)
+#undef TIMELINE_STREAM_CHECK
+  }
+
+  {
+    result = Dart_SetEnabledTimelineCategory(nullptr);
+    EXPECT_EQ(false, result);
+    result = Dart_SetEnabledTimelineCategory("GC,api,compiler");
+    EXPECT_EQ(false, result);
+  }
+
+  {
+    result = Dart_SetEnabledTimelineCategory("GC,API,Compiler");
+    EXPECT_EQ(true, result);
+    JSONStream js;
+    JSONObject obj(&js);
+    JSONArray jstream(&obj, "available");
+    Timeline::PrintFlagsToJSONArray(&jstream);
+    const char* js_str = js.ToCString();
+    EXPECT_SUBSTRING("GC", js_str);
+    EXPECT_SUBSTRING("API", js_str);
+    EXPECT_SUBSTRING("Compiler", js_str);
+    EXPECT_NOTSUBSTRING("CompilerVerbose", js_str);
+    EXPECT_NOTSUBSTRING("Debugger", js_str);
+    EXPECT_NOTSUBSTRING("Embedder", js_str);
+    EXPECT_NOTSUBSTRING("Isolate", js_str);
+    EXPECT_NOTSUBSTRING("VM", js_str);
+  }
+
+  {
+    result = Dart_SetEnabledTimelineCategory("Isolate");
+    EXPECT_EQ(true, result);
+    JSONStream js;
+    JSONObject obj(&js);
+    JSONArray jstream(&obj, "available");
+    Timeline::PrintFlagsToJSONArray(&jstream);
+    const char* js_str = js.ToCString();
+    EXPECT_NOTSUBSTRING("GC", js_str);
+    EXPECT_NOTSUBSTRING("API", js_str);
+    EXPECT_NOTSUBSTRING("Compiler", js_str);
+    EXPECT_NOTSUBSTRING("CompilerVerbose", js_str);
+    EXPECT_NOTSUBSTRING("Debugger", js_str);
+    EXPECT_NOTSUBSTRING("Embedder", js_str);
+    EXPECT_SUBSTRING("Isolate", js_str);
+    EXPECT_NOTSUBSTRING("VM", js_str);
+  }
+
+  {
+    result = Dart_SetEnabledTimelineCategory("");
+    EXPECT_EQ(true, result);
+    JSONStream js;
+    JSONObject obj(&js);
+    JSONArray jstream(&obj, "available");
+    Timeline::PrintFlagsToJSONArray(&jstream);
+    const char* js_str = js.ToCString();
+    EXPECT_NOTSUBSTRING("GC", js_str);
+    EXPECT_NOTSUBSTRING("API", js_str);
+    EXPECT_NOTSUBSTRING("Compiler", js_str);
+    EXPECT_NOTSUBSTRING("CompilerVerbose", js_str);
+    EXPECT_NOTSUBSTRING("Debugger", js_str);
+    EXPECT_NOTSUBSTRING("Embedder", js_str);
+    EXPECT_NOTSUBSTRING("Isolate", js_str);
+    EXPECT_NOTSUBSTRING("VM", js_str);
+  }
+}
+
 static void HintFreedNative(Dart_NativeArguments args) {
   int64_t size = 0;
   EXPECT_VALID(Dart_GetNativeIntegerArgument(args, 0, &size));
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 650cbd2..7041084 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -107,16 +107,14 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
 #else
-    if (FLAG_use_bare_instructions) {
-      Thread* thread = Thread::Current();
-      thread->set_global_object_pool(
-          thread->isolate_group()->object_store()->global_object_pool());
-      const DispatchTable* dispatch_table = thread->isolate()->dispatch_table();
-      if (dispatch_table != nullptr) {
-        thread->set_dispatch_table_array(dispatch_table->ArrayOrigin());
-      }
-      ASSERT(thread->global_object_pool() != Object::null());
+    Thread* thread = Thread::Current();
+    thread->set_global_object_pool(
+        thread->isolate_group()->object_store()->global_object_pool());
+    const DispatchTable* dispatch_table = thread->isolate()->dispatch_table();
+    if (dispatch_table != nullptr) {
+      thread->set_dispatch_table_array(dispatch_table->ArrayOrigin());
     }
+    ASSERT(thread->global_object_pool() != Object::null());
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
   }
 
@@ -179,14 +177,13 @@
 #if defined(USING_SIMULATOR)
   return bit_copy<ObjectPtr, int64_t>(Simulator::Current()->Call(
       static_cast<intptr_t>(stub),
-      ((FLAG_precompiled_mode && FLAG_use_bare_instructions)
-           ? static_cast<intptr_t>(entry_point)
-           : reinterpret_cast<intptr_t>(&code)),
+      FLAG_precompiled_mode ? static_cast<intptr_t>(entry_point)
+                            : reinterpret_cast<intptr_t>(&code),
       reinterpret_cast<intptr_t>(&arguments_descriptor),
       reinterpret_cast<intptr_t>(&arguments),
       reinterpret_cast<intptr_t>(thread)));
 #else
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     return static_cast<ObjectPtr>(
         (reinterpret_cast<invokestub_bare_instructions>(stub))(
             entry_point, arguments_descriptor, arguments, thread));
diff --git a/runtime/vm/dwarf.cc b/runtime/vm/dwarf.cc
index 4f98848..d661bd7 100644
--- a/runtime/vm/dwarf.cc
+++ b/runtime/vm/dwarf.cc
@@ -717,6 +717,26 @@
     function_stack.Clear();
     token_positions.Clear();
 
+    // CodeSourceMap might start in the following way:
+    //
+    //   ChangePosition function.token_pos()
+    //   AdvancePC 0
+    //   ChangePosition x
+    //   AdvancePC y
+    //
+    // This entry is emitted to ensure correct symbolization of
+    // function listener frames produced by async unwinding.
+    // (See EmitFunctionEntrySourcePositionDescriptorIfNeeded).
+    // Directly interpreting this sequence would cause us to emit
+    // multiple with the same pc into line number table and different
+    // position information. To avoid this will make an adjustment for
+    // the second record we emit: if position x is a synthetic one we will
+    // simply drop the second record, if position x is real then we will
+    // emit row with a slightly adjusted PC (by 1 byte). This would not
+    // affect symbolization (you can't have a call that is 1 byte long)
+    // but will avoid line number table entries with the same PC.
+    bool function_entry_position_was_emitted = false;
+
     int32_t current_pc_offset = 0;
     function_stack.Add(&root_function);
     token_positions.Add(kNoDwarfPositionInfo);
@@ -740,9 +760,30 @@
           const intptr_t file = LookupScript(script);
           const intptr_t line = token_positions.Last().line();
           const intptr_t column = token_positions.Last().column();
-          writer->EmitRow(file, line, column, asm_name, current_pc_offset);
+          intptr_t pc_offset_adjustment = 0;
+          bool should_emit = true;
+
+          // If we are at the function entry and have already emitted a row
+          // then adjust current_pc_offset to avoid duplicated entries.
+          // See the comment below which explains why this code is here.
+          if (current_pc_offset == 0 && function_entry_position_was_emitted) {
+            pc_offset_adjustment = 1;
+            // Ignore synthetic positions. Function entry position gives
+            // more information anyway.
+            should_emit = !(line == 0 && column == 0);
+          }
+
+          if (should_emit) {
+            writer->EmitRow(file, line, column, asm_name,
+                            current_pc_offset + pc_offset_adjustment);
+          }
 
           current_pc_offset += arg1;
+          if (arg1 == 0) {  // Special case of AdvancePC 0.
+            ASSERT(current_pc_offset == 0);
+            ASSERT(!function_entry_position_was_emitted);
+            function_entry_position_was_emitted = true;
+          }
           break;
         }
         case CodeSourceMapOps::kPushFunction: {
diff --git a/runtime/vm/elf.h b/runtime/vm/elf.h
index 579c49f..3bf980d 100644
--- a/runtime/vm/elf.h
+++ b/runtime/vm/elf.h
@@ -5,14 +5,30 @@
 #ifndef RUNTIME_VM_ELF_H_
 #define RUNTIME_VM_ELF_H_
 
+#include "platform/globals.h"
+
+#if defined(DART_PRECOMPILER)
 #include "vm/allocation.h"
 #include "vm/compiler/runtime_api.h"
 #include "vm/datastream.h"
 #include "vm/growable_array.h"
 #include "vm/zone.h"
+#endif
 
 namespace dart {
 
+// The max page size on all supported architectures. Used to determine
+// the alignment of load segments, so that they are guaranteed page-aligned,
+// and no ELF section or segment should have a larger alignment.
+#if defined(DART_TARGET_OS_LINUX) && defined(TARGET_ARCH_ARM64)
+// Some Linux distributions on ARM64 select 64 KB page size.
+// Follow LLVM (https://reviews.llvm.org/D25079) and set maximum page size
+// to 64 KB for ARM64 Linux builds.
+static constexpr intptr_t kElfPageSize = 64 * KB;
+#else
+static constexpr intptr_t kElfPageSize = 16 * KB;
+#endif
+
 #if defined(DART_PRECOMPILER)
 
 class Dwarf;
@@ -33,10 +49,7 @@
 
   Elf(Zone* zone, BaseWriteStream* stream, Type type, Dwarf* dwarf = nullptr);
 
-  // The max page size on all supported architectures. Used to determine
-  // the alignment of load segments, so that they are guaranteed page-aligned,
-  // and no ELF section or segment should have a larger alignment.
-  static constexpr intptr_t kPageSize = 16 * KB;
+  static constexpr intptr_t kPageSize = kElfPageSize;
 
   bool IsStripped() const { return dwarf_ == nullptr; }
 
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 2ea7550..95787d7 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -696,8 +696,9 @@
   if (exception.IsNull()) {
     exception ^=
         Exceptions::Create(Exceptions::kNullThrown, Object::empty_array());
-  } else if (exception.ptr() == object_store->out_of_memory() ||
-             exception.ptr() == object_store->stack_overflow()) {
+  } else if (existing_stacktrace.IsNull() &&
+             (exception.ptr() == object_store->out_of_memory() ||
+              exception.ptr() == object_store->stack_overflow())) {
     use_preallocated_stacktrace = true;
   }
   // Find the exception handler and determine if the handler needs a
@@ -729,11 +730,17 @@
     }
   } else {
     if (!existing_stacktrace.IsNull()) {
-      // If we have an existing stack trace then this better be a rethrow. The
-      // reverse is not necessarily true (e.g. Dart_PropagateError can cause
-      // a rethrow being called without an existing stacktrace.)
-      ASSERT(is_rethrow);
       stacktrace = existing_stacktrace.ptr();
+      // If this is not a rethrow, it's a "throw with stacktrace".
+      // Set an Error object's stackTrace field if needed.
+      if (!is_rethrow) {
+        const Field& stacktrace_field =
+            Field::Handle(zone, LookupStackTraceField(exception));
+        if (!stacktrace_field.IsNull() &&
+            (exception.GetField(stacktrace_field) == Object::null())) {
+          exception.SetField(stacktrace_field, stacktrace);
+        }
+      }
     } else {
       // Get stacktrace field of class Error to determine whether we have a
       // subclass of Error which carries around its stack trace.
@@ -917,6 +924,13 @@
   ThrowExceptionHelper(thread, exception, stacktrace, true);
 }
 
+void Exceptions::ThrowWithStackTrace(Thread* thread,
+                                     const Instance& exception,
+                                     const Instance& stacktrace) {
+  // Null object is a valid exception object.
+  ThrowExceptionHelper(thread, exception, stacktrace, false);
+}
+
 void Exceptions::PropagateError(const Error& error) {
   ASSERT(!error.IsNull());
   Thread* thread = Thread::Current();
diff --git a/runtime/vm/exceptions.h b/runtime/vm/exceptions.h
index 090615c..89090a6 100644
--- a/runtime/vm/exceptions.h
+++ b/runtime/vm/exceptions.h
@@ -32,6 +32,9 @@
   DART_NORETURN static void ReThrow(Thread* thread,
                                     const Instance& exception,
                                     const Instance& stacktrace);
+  DART_NORETURN static void ThrowWithStackTrace(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.
diff --git a/runtime/vm/experimental_features.cc b/runtime/vm/experimental_features.cc
index c907f0c..f272686 100644
--- a/runtime/vm/experimental_features.cc
+++ b/runtime/vm/experimental_features.cc
@@ -6,7 +6,7 @@
 // Instead modify 'tools/experimental_features.yaml' and run
 // 'dart tools/generate_experimental_flags.dart' to update.
 //
-// Current version: 2.15.0
+// Current version: 2.16.0
 
 #include "vm/experimental_features.h"
 
diff --git a/runtime/vm/experimental_features.h b/runtime/vm/experimental_features.h
index c1db176..020ba59 100644
--- a/runtime/vm/experimental_features.h
+++ b/runtime/vm/experimental_features.h
@@ -6,7 +6,7 @@
 // Instead modify 'tools/experimental_features.yaml' and run
 // 'dart tools/generate_experimental_flags.dart' to update.
 //
-// Current version: 2.15.0
+// Current version: 2.16.0
 
 #ifndef RUNTIME_VM_EXPERIMENTAL_FEATURES_H_
 #define RUNTIME_VM_EXPERIMENTAL_FEATURES_H_
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index a9628b4..edf42f7 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -66,7 +66,6 @@
     "Use --[no-]dwarf-stack-traces instead.")                                  \
   P(lazy_async_stacks, bool, true, "Reconstruct async stacks from listeners")  \
   P(lazy_dispatchers, bool, true, "Generate dispatchers lazily")               \
-  P(use_bare_instructions, bool, true, "Enable bare instructions mode.")       \
   R(dedup_instructions, true, bool, false,                                     \
     "Canonicalize instructions when precompiling.")
 
@@ -124,12 +123,8 @@
   P(enable_mirrors, bool, true,                                                \
     "Disable to make importing dart:mirrors an error.")                        \
   P(enable_ffi, bool, true, "Disable to make importing dart:ffi an error.")    \
-  P(fields_may_be_reset, bool, false,                                          \
-    "Don't optimize away static field initialization")                         \
   P(force_clone_compiler_objects, bool, false,                                 \
     "Force cloning of objects needed in compiler (ICData and Field).")         \
-  P(getter_setter_ratio, int, 13,                                              \
-    "Ratio of getter/setter usage used for double field unboxing heuristics")  \
   P(guess_icdata_cid, bool, true,                                              \
     "Artificially create type feedback for arithmetic etc. operations")        \
   P(huge_method_cutoff_in_tokens, int, 20000,                                  \
@@ -196,7 +191,6 @@
   P(retain_code_objects, bool, true,                                           \
     "Serialize all code objects even if not otherwise "                        \
     "needed in the precompiled runtime.")                                      \
-  P(enable_isolate_groups, bool, true, "Enable isolate group support.")        \
   P(show_invisible_frames, bool, false,                                        \
     "Show invisible frames in stack traces.")                                  \
   D(trace_cha, bool, false, "Trace CHA operations")                            \
diff --git a/runtime/vm/flags.cc b/runtime/vm/flags.cc
index 49dadd2..d35d1e5 100644
--- a/runtime/vm/flags.cc
+++ b/runtime/vm/flags.cc
@@ -466,20 +466,6 @@
     PrintFlags();
   }
 
-  // TODO(dartbug.com/36097): Support for isolate groups in JIT mode is
-  // in-development. We will start with very conservative settings. As we make
-  // more of our compiler, runtime as well as generated code re-entrant we'll
-  // graudally remove those restrictions.
-
-#if !defined(DART_PRCOMPILED_RUNTIME)
-  if (!FLAG_precompiled_mode && FLAG_enable_isolate_groups) {
-    // Our compiler should not make rely on a global field being initialized at
-    // compile-time, since that compiled code might be re-used in another
-    // isolate that has not yet initialized the global field.
-    FLAG_fields_may_be_reset = true;
-  }
-#endif  // !defined(DART_PRCOMPILED_RUNTIME)
-
   initialized_ = true;
   return NULL;
 }
diff --git a/runtime/vm/globals.h b/runtime/vm/globals.h
index 2e63f76..46cd706 100644
--- a/runtime/vm/globals.h
+++ b/runtime/vm/globals.h
@@ -73,8 +73,10 @@
 
 #if defined(PRODUCT)
 #define NOT_IN_PRODUCT(code)
+#define ONLY_IN_PRODUCT(code) code
 #else  // defined(PRODUCT)
 #define NOT_IN_PRODUCT(code) code
+#define ONLY_IN_PRODUCT(code)
 #endif  // defined(PRODUCT)
 
 #if defined(DART_PRECOMPILED_RUNTIME) && defined(DART_PRECOMPILER)
@@ -87,13 +89,9 @@
 
 #if defined(DART_PRECOMPILED_RUNTIME)
 #define NOT_IN_PRECOMPILED(code)
-#else
-#define NOT_IN_PRECOMPILED(code) code
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-
-#if defined(DART_PRECOMPILED_RUNTIME)
 #define ONLY_IN_PRECOMPILED(code) code
 #else
+#define NOT_IN_PRECOMPILED(code) code
 #define ONLY_IN_PRECOMPILED(code)
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
diff --git a/runtime/vm/hash_map.h b/runtime/vm/hash_map.h
index 2c816a6..aacbf87 100644
--- a/runtime/vm/hash_map.h
+++ b/runtime/vm/hash_map.h
@@ -310,7 +310,7 @@
             ASSERT_NOTNULL(zone),
             initial_size) {}
 
-  // There is a current use of the copy constructor in CSEInstructionMap
+  // There is a current use of the copy constructor in CSEInstructionSet
   // (compiler/backend/redundancy_elimination.cc), so work is needed if we
   // want to disallow it.
   DirectChainedHashMap(const DirectChainedHashMap& other)
diff --git a/runtime/vm/heap/compactor.cc b/runtime/vm/heap/compactor.cc
index a4bd219..2051b0c 100644
--- a/runtime/vm/heap/compactor.cc
+++ b/runtime/vm/heap/compactor.cc
@@ -117,21 +117,30 @@
   forwarding_page_ = reinterpret_cast<ForwardingPage*>(object_end_);
 }
 
+struct Partition {
+  OldPage* head;
+  OldPage* tail;
+};
+
 class CompactorTask : public ThreadPool::Task {
  public:
   CompactorTask(IsolateGroup* isolate_group,
                 GCCompactor* compactor,
                 ThreadBarrier* barrier,
+                RelaxedAtomic<intptr_t>* next_planning_task,
+                RelaxedAtomic<intptr_t>* next_sliding_task,
                 RelaxedAtomic<intptr_t>* next_forwarding_task,
-                OldPage* head,
-                OldPage** tail,
+                intptr_t num_tasks,
+                Partition* partitions,
                 FreeList* freelist)
       : isolate_group_(isolate_group),
         compactor_(compactor),
         barrier_(barrier),
+        next_planning_task_(next_planning_task),
+        next_sliding_task_(next_sliding_task),
         next_forwarding_task_(next_forwarding_task),
-        head_(head),
-        tail_(tail),
+        num_tasks_(num_tasks),
+        partitions_(partitions),
         freelist_(freelist),
         free_page_(NULL),
         free_current_(0),
@@ -150,9 +159,11 @@
   IsolateGroup* isolate_group_;
   GCCompactor* compactor_;
   ThreadBarrier* barrier_;
+  RelaxedAtomic<intptr_t>* next_planning_task_;
+  RelaxedAtomic<intptr_t>* next_sliding_task_;
   RelaxedAtomic<intptr_t>* next_forwarding_task_;
-  OldPage* head_;
-  OldPage** tail_;
+  intptr_t num_tasks_;
+  Partition* partitions_;
   FreeList* freelist_;
   OldPage* free_page_;
   uword free_current_;
@@ -184,8 +195,8 @@
   if (num_pages < num_tasks) {
     num_tasks = num_pages;
   }
-  OldPage** heads = new OldPage*[num_tasks];
-  OldPage** tails = new OldPage*[num_tasks];
+
+  Partition* partitions = new Partition[num_tasks];
 
   {
     const intptr_t pages_per_task = num_pages / num_tasks;
@@ -195,8 +206,8 @@
     OldPage* prev = NULL;
     while (task_index < num_tasks) {
       if (page_index % pages_per_task == 0) {
-        heads[task_index] = page;
-        tails[task_index] = NULL;
+        partitions[task_index].head = page;
+        partitions[task_index].tail = NULL;
         if (prev != NULL) {
           prev->set_next(NULL);
         }
@@ -232,29 +243,34 @@
                                    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;
+        page->set_next(partitions[task_index].head);
+        partitions[task_index].head = page;
       }
     }
   }
 
   {
-    ThreadBarrier barrier(num_tasks, heap_->barrier(), heap_->barrier_done());
+    ThreadBarrier* barrier = new ThreadBarrier(num_tasks, 1);
+    RelaxedAtomic<intptr_t> next_planning_task = {0};
+    RelaxedAtomic<intptr_t> next_sliding_task = {0};
     RelaxedAtomic<intptr_t> next_forwarding_task = {0};
 
     for (intptr_t task_index = 0; task_index < num_tasks; task_index++) {
       if (task_index < (num_tasks - 1)) {
         // Begin compacting on a helper thread.
         Dart::thread_pool()->Run<CompactorTask>(
-            thread()->isolate_group(), this, &barrier, &next_forwarding_task,
-            heads[task_index], &tails[task_index], freelist);
+            thread()->isolate_group(), this, barrier, &next_planning_task,
+            &next_sliding_task, &next_forwarding_task, num_tasks, partitions,
+            freelist);
       } else {
         // Last worker is the main thread.
-        CompactorTask task(thread()->isolate_group(), this, &barrier,
-                           &next_forwarding_task, heads[task_index],
-                           &tails[task_index], freelist);
+        CompactorTask task(thread()->isolate_group(), this, barrier,
+                           &next_planning_task, &next_sliding_task,
+                           &next_forwarding_task, num_tasks, partitions,
+                           freelist);
         task.RunEnteredIsolateGroup();
-        barrier.Exit();
+        barrier->Sync();
+        barrier->Release();
       }
     }
   }
@@ -289,7 +305,7 @@
   }
 
   for (intptr_t task_index = 0; task_index < num_tasks; task_index++) {
-    ASSERT(tails[task_index] != NULL);
+    ASSERT(partitions[task_index].tail != NULL);
   }
 
   {
@@ -304,7 +320,7 @@
 
     // Free empty pages.
     for (intptr_t task_index = 0; task_index < num_tasks; task_index++) {
-      OldPage* page = tails[task_index]->next();
+      OldPage* page = partitions[task_index].tail->next();
       while (page != NULL) {
         OldPage* next = page->next();
         heap_->old_space()->IncreaseCapacityInWordsLocked(
@@ -316,18 +332,22 @@
 
     // Re-join the heap.
     for (intptr_t task_index = 0; task_index < num_tasks - 1; task_index++) {
-      tails[task_index]->set_next(heads[task_index + 1]);
+      partitions[task_index].tail->set_next(partitions[task_index + 1].head);
     }
-    tails[num_tasks - 1]->set_next(NULL);
-    heap_->old_space()->pages_ = pages = heads[0];
-    heap_->old_space()->pages_tail_ = tails[num_tasks - 1];
+    partitions[num_tasks - 1].tail->set_next(NULL);
+    heap_->old_space()->pages_ = pages = partitions[0].head;
+    heap_->old_space()->pages_tail_ = partitions[num_tasks - 1].tail;
 
-    delete[] heads;
-    delete[] tails;
+    delete[] partitions;
   }
 }
 
 void CompactorTask::Run() {
+  if (!barrier_->TryEnter()) {
+    barrier_->Release();
+    return;
+  }
+
   bool result =
       Thread::EnterIsolateGroupAsHelper(isolate_group_, Thread::kCompactorTask,
                                         /*bypass_safepoint=*/true);
@@ -338,7 +358,8 @@
   Thread::ExitIsolateGroupAsHelper(/*bypass_safepoint=*/true);
 
   // This task is done. Notify the original thread.
-  barrier_->Exit();
+  barrier_->Sync();
+  barrier_->Release();
 }
 
 void CompactorTask::RunEnteredIsolateGroup() {
@@ -346,26 +367,34 @@
   Thread* thread = Thread::Current();
 #endif
   {
-    {
-      TIMELINE_FUNCTION_GC_DURATION(thread, "Plan");
-      free_page_ = head_;
-      free_current_ = free_page_->object_start();
-      free_end_ = free_page_->object_end();
+    while (true) {
+      intptr_t planning_task = next_planning_task_->fetch_add(1u);
+      if (planning_task >= num_tasks_) break;
 
-      for (OldPage* page = head_; page != NULL; page = page->next()) {
+      TIMELINE_FUNCTION_GC_DURATION(thread, "Plan");
+      OldPage* head = partitions_[planning_task].head;
+      free_page_ = head;
+      free_current_ = head->object_start();
+      free_end_ = head->object_end();
+
+      for (OldPage* page = head; page != NULL; page = page->next()) {
         PlanPage(page);
       }
     }
 
     barrier_->Sync();
 
-    {
-      TIMELINE_FUNCTION_GC_DURATION(thread, "Slide");
-      free_page_ = head_;
-      free_current_ = free_page_->object_start();
-      free_end_ = free_page_->object_end();
+    while (true) {
+      intptr_t sliding_task = next_sliding_task_->fetch_add(1u);
+      if (sliding_task >= num_tasks_) break;
 
-      for (OldPage* page = head_; page != NULL; page = page->next()) {
+      TIMELINE_FUNCTION_GC_DURATION(thread, "Slide");
+      OldPage* head = partitions_[sliding_task].head;
+      free_page_ = head;
+      free_current_ = head->object_start();
+      free_end_ = head->object_end();
+
+      for (OldPage* page = head; page != NULL; page = page->next()) {
         SlidePage(page);
       }
 
@@ -377,7 +406,7 @@
       }
 
       ASSERT(free_page_ != NULL);
-      *tail_ = free_page_;  // Last live page.
+      partitions_[sliding_task].tail = free_page_;  // Last live page.
     }
 
     // Heap: Regular pages already visited during sliding. Code and image pages
@@ -434,8 +463,6 @@
           more_forwarding_tasks = false;
       }
     }
-
-    barrier_->Sync();
   }
 }
 
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 9c8269b..fe3956d 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -48,8 +48,6 @@
       is_vm_isolate_(is_vm_isolate),
       new_space_(this, max_new_gen_semi_words),
       old_space_(this, max_old_gen_words),
-      barrier_(),
-      barrier_done_(),
       read_only_(false),
       last_gc_was_old_space_(false),
       assume_scavenge_will_fail_(false),
diff --git a/runtime/vm/heap/heap.h b/runtime/vm/heap/heap.h
index 04e8a62..2360700 100644
--- a/runtime/vm/heap/heap.h
+++ b/runtime/vm/heap/heap.h
@@ -288,9 +288,6 @@
   IsolateGroup* isolate_group() const { return isolate_group_; }
   bool is_vm_isolate() const { return is_vm_isolate_; }
 
-  Monitor* barrier() const { return &barrier_; }
-  Monitor* barrier_done() const { return &barrier_done_; }
-
   void SetupImagePage(void* pointer, uword size, bool is_executable) {
     old_space_.SetupImagePage(pointer, size, is_executable);
   }
@@ -379,9 +376,6 @@
   WeakTable* new_weak_tables_[kNumWeakSelectors];
   WeakTable* old_weak_tables_[kNumWeakSelectors];
 
-  mutable Monitor barrier_;
-  mutable Monitor barrier_done_;
-
   // GC stats collection.
   GCStats stats_;
 
diff --git a/runtime/vm/heap/heap_test.cc b/runtime/vm/heap/heap_test.cc
index b30bf66..c45765c 100644
--- a/runtime/vm/heap/heap_test.cc
+++ b/runtime/vm/heap/heap_test.cc
@@ -574,9 +574,6 @@
 };
 
 VM_UNIT_TEST_CASE(CleanupBequestNeverReceived) {
-  // This test uses features from isolate groups
-  FLAG_enable_isolate_groups = true;
-
   const char* TEST_MESSAGE = "hello, world";
   Dart_Isolate parent = TestCase::CreateTestIsolate("parent");
   EXPECT_EQ(parent, Dart_CurrentIsolate());
@@ -608,9 +605,6 @@
 }
 
 VM_UNIT_TEST_CASE(ReceivesSendAndExitMessage) {
-  // This test uses features from isolate groups
-  FLAG_enable_isolate_groups = true;
-
   const char* TEST_MESSAGE = "hello, world";
   Dart_Isolate parent = TestCase::CreateTestIsolate("parent");
   EXPECT_EQ(parent, Dart_CurrentIsolate());
diff --git a/runtime/vm/heap/marker.cc b/runtime/vm/heap/marker.cc
index a2f7477..43b4c62 100644
--- a/runtime/vm/heap/marker.cc
+++ b/runtime/vm/heap/marker.cc
@@ -35,6 +35,7 @@
         work_list_(marking_stack),
         deferred_work_list_(deferred_marking_stack),
         delayed_weak_properties_(WeakProperty::null()),
+        tail_(WeakProperty::null()),
         marked_bytes_(0),
         marked_micros_(0) {
     ASSERT(thread_->isolate_group() == isolate_group);
@@ -50,7 +51,7 @@
   bool ProcessPendingWeakProperties() {
     bool more_to_mark = false;
     WeakPropertyPtr cur_weak = delayed_weak_properties_;
-    delayed_weak_properties_ = WeakProperty::null();
+    tail_ = delayed_weak_properties_ = WeakProperty::null();
     while (cur_weak != WeakProperty::null()) {
       WeakPropertyPtr next_weak =
           cur_weak->untag()->next_.Decompress(cur_weak->heap_base());
@@ -154,6 +155,9 @@
     ASSERT(raw_weak->untag()->next_ ==
            CompressedWeakPropertyPtr(WeakProperty::null()));
     raw_weak->untag()->next_ = delayed_weak_properties_;
+    if (delayed_weak_properties_ == WeakProperty::null()) {
+      tail_ = raw_weak;
+    }
     delayed_weak_properties_ = raw_weak;
   }
 
@@ -228,6 +232,26 @@
     return work_list_.WaitForWork(num_busy);
   }
 
+  void Flush(WeakPropertyPtr* head, WeakPropertyPtr* tail) {
+    work_list_.Flush();
+    deferred_work_list_.Flush();
+    if (*head == WeakProperty::null()) {
+      *head = delayed_weak_properties_;
+      *tail = tail_;
+    } else {
+      (*tail)->untag()->next_ = delayed_weak_properties_;
+      *tail = tail_;
+    }
+    tail_ = delayed_weak_properties_ = WeakProperty::null();
+  }
+
+  void Adopt(WeakPropertyPtr head, WeakPropertyPtr tail) {
+    ASSERT(delayed_weak_properties_ == WeakProperty::null());
+    ASSERT(tail_ == WeakProperty::null());
+    delayed_weak_properties_ = head;
+    tail_ = tail;
+  }
+
   void AbandonWork() {
     work_list_.AbandonWork();
     deferred_work_list_.AbandonWork();
@@ -302,6 +326,7 @@
   MarkerWorkList work_list_;
   MarkerWorkList deferred_work_list_;
   WeakPropertyPtr delayed_weak_properties_;
+  WeakPropertyPtr tail_;
   uintptr_t marked_bytes_;
   int64_t marked_micros_;
 
@@ -542,6 +567,11 @@
         num_busy_(num_busy) {}
 
   virtual void Run() {
+    if (!barrier_->TryEnter()) {
+      barrier_->Release();
+      return;
+    }
+
     bool result = Thread::EnterIsolateGroupAsHelper(
         isolate_group_, Thread::kMarkerTask, /*bypass_safepoint=*/true);
     ASSERT(result);
@@ -550,8 +580,8 @@
 
     Thread::ExitIsolateGroupAsHelper(/*bypass_safepoint=*/true);
 
-    // This task is done. Notify the original thread.
-    barrier_->Exit();
+    barrier_->Sync();
+    barrier_->Release();
   }
 
   void RunEnteredIsolateGroup() {
@@ -561,6 +591,7 @@
       int64_t start = OS::GetCurrentMonotonicMicros();
 
       // Phase 1: Iterate over roots and drain marking stack in tasks.
+      num_busy_->fetch_add(1u);
       marker_->IterateRoots(visitor_);
 
       visitor_->ProcessDeferredMarking();
@@ -603,7 +634,6 @@
 
       // Phase 2: deferred marking.
       visitor_->ProcessDeferredMarking();
-      visitor_->FinalizeMarking();
       barrier_->Sync();
 
       // Phase 3: Weak processing and statistics.
@@ -615,7 +645,6 @@
         THR_Print("Task marked %" Pd " bytes in %" Pd64 " micros.\n",
                   visitor_->marked_bytes(), visitor_->marked_micros());
       }
-      barrier_->Sync();
     }
   }
 
@@ -754,13 +783,31 @@
   ResetSlices();
   for (intptr_t i = 0; i < num_tasks; i++) {
     ASSERT(visitors_[i] == NULL);
-    visitors_[i] = new SyncMarkingVisitor(
+    SyncMarkingVisitor* visitor = new SyncMarkingVisitor(
         isolate_group_, page_space, &marking_stack_, &deferred_marking_stack_);
+    visitors_[i] = visitor;
 
-    // Begin marking on a helper thread.
-    bool result = Dart::thread_pool()->Run<ConcurrentMarkTask>(
-        this, isolate_group_, page_space, visitors_[i]);
-    ASSERT(result);
+    if (i < (num_tasks - 1)) {
+      // Begin marking on a helper thread.
+      bool result = Dart::thread_pool()->Run<ConcurrentMarkTask>(
+          this, isolate_group_, page_space, visitor);
+      ASSERT(result);
+    } else {
+      // Last worker is the main thread, which will only mark roots.
+      TIMELINE_FUNCTION_GC_DURATION(Thread::Current(), "ConcurrentMark");
+      int64_t start = OS::GetCurrentMonotonicMicros();
+      IterateRoots(visitor);
+      int64_t stop = OS::GetCurrentMonotonicMicros();
+      visitor->AddMicros(stop - start);
+      if (FLAG_log_marker_tasks) {
+        THR_Print("Task marked %" Pd " bytes in %" Pd64 " micros.\n",
+                  visitor->marked_bytes(), visitor->marked_micros());
+      }
+      // Continue non-root marking concurrently.
+      bool result = Dart::thread_pool()->Run<ConcurrentMarkTask>(
+          this, isolate_group_, page_space, visitor);
+      ASSERT(result);
+    }
   }
 
   isolate_group_->DeferredMarkLiveTemporaries();
@@ -801,11 +848,16 @@
       marked_bytes_ += visitor.marked_bytes();
       marked_micros_ += visitor.marked_micros();
     } else {
-      ThreadBarrier barrier(num_tasks, heap_->barrier(), heap_->barrier_done());
+      ThreadBarrier* barrier = new ThreadBarrier(num_tasks, 1);
+
       ResetSlices();
       // Used to coordinate draining among tasks; all start out as 'busy'.
-      RelaxedAtomic<uintptr_t> num_busy(num_tasks);
+      RelaxedAtomic<uintptr_t> num_busy = 0;
       // Phase 1: Iterate over roots and drain marking stack in tasks.
+
+      WeakPropertyPtr head = WeakProperty::null();
+      WeakPropertyPtr tail = WeakProperty::null();
+
       for (intptr_t i = 0; i < num_tasks; ++i) {
         SyncMarkingVisitor* visitor = visitors_[i];
         // Visitors may or may not have already been created depending on
@@ -816,23 +868,33 @@
                                      &marking_stack_, &deferred_marking_stack_);
           visitors_[i] = visitor;
         }
+        // Move all work from local blocks to the global list. Any given
+        // visitor might not get to run if it fails to reach TryEnter soon
+        // enough, and we must fail to visit objects but they're sitting in
+        // such a visitor's local blocks.
+        visitor->Flush(&head, &tail);
+        // Need to move weak property list too.
+
         if (i < (num_tasks - 1)) {
           // Begin marking on a helper thread.
           bool result = Dart::thread_pool()->Run<ParallelMarkTask>(
-              this, isolate_group_, &marking_stack_, &barrier, visitor,
+              this, isolate_group_, &marking_stack_, barrier, visitor,
               &num_busy);
           ASSERT(result);
         } else {
           // Last worker is the main thread.
-          ParallelMarkTask task(this, isolate_group_, &marking_stack_, &barrier,
+          visitor->Adopt(head, tail);
+          ParallelMarkTask task(this, isolate_group_, &marking_stack_, barrier,
                                 visitor, &num_busy);
           task.RunEnteredIsolateGroup();
-          barrier.Exit();
+          barrier->Sync();
+          barrier->Release();
         }
       }
 
       for (intptr_t i = 0; i < num_tasks; i++) {
         SyncMarkingVisitor* visitor = visitors_[i];
+        visitor->FinalizeMarking();
         marked_bytes_ += visitor->marked_bytes();
         marked_micros_ += visitor->marked_micros();
         delete visitor;
diff --git a/runtime/vm/heap/pointer_block.h b/runtime/vm/heap/pointer_block.h
index 5ef6dc2..fb10fa6 100644
--- a/runtime/vm/heap/pointer_block.h
+++ b/runtime/vm/heap/pointer_block.h
@@ -195,6 +195,17 @@
     local_output_->Push(raw_obj);
   }
 
+  void Flush() {
+    if (!local_output_->IsEmpty()) {
+      stack_->PushBlock(local_output_);
+      local_output_ = stack_->PopEmptyBlock();
+    }
+    if (!local_input_->IsEmpty()) {
+      stack_->PushBlock(local_input_);
+      local_input_ = stack_->PopEmptyBlock();
+    }
+  }
+
   bool WaitForWork(RelaxedAtomic<uintptr_t>* num_busy) {
     ASSERT(local_input_->IsEmpty());
     Block* new_work = stack_->WaitForWork(num_busy);
diff --git a/runtime/vm/heap/safepoint.h b/runtime/vm/heap/safepoint.h
index d002189..42fd7d4c 100644
--- a/runtime/vm/heap/safepoint.h
+++ b/runtime/vm/heap/safepoint.h
@@ -76,6 +76,7 @@
   void BlockForSafepoint(Thread* T);
 
   bool IsOwnedByTheThread(Thread* thread) {
+    MonitorLocker ml(threads_lock());
     for (intptr_t level = 0; level < SafepointLevel::kNumLevels; ++level) {
       if (handlers_[level]->owner_ == thread) {
         return true;
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index 592627b..cac516f 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -276,10 +276,7 @@
   }
 
   void Finalize() {
-    if (scavenger_->abort_) {
-      promoted_list_.AbandonWork();
-      delayed_weak_properties_ = WeakProperty::null();
-    } else {
+    if (!scavenger_->abort_) {
       ASSERT(!HasWork());
 
       for (NewPage* page = head_; page != nullptr; page = page->next()) {
@@ -287,14 +284,19 @@
         page->RecordSurvivors();
       }
 
-      promoted_list_.Finalize();
-
       MournWeakProperties();
     }
     page_space_->ReleaseLock(freelist_);
     thread_ = nullptr;
   }
 
+  void FinalizePromotion() { promoted_list_.Finalize(); }
+
+  void AbandonWork() {
+    promoted_list_.AbandonWork();
+    delayed_weak_properties_ = WeakProperty::null();
+  }
+
   NewPage* head() const { return head_; }
   NewPage* tail() const { return tail_; }
 
@@ -557,6 +559,11 @@
         num_busy_(num_busy) {}
 
   virtual void Run() {
+    if (!barrier_->TryEnter()) {
+      barrier_->Release();
+      return;
+    }
+
     bool result = Thread::EnterIsolateGroupAsHelper(
         isolate_group_, Thread::kScavengerTask, /*bypass_safepoint=*/true);
     ASSERT(result);
@@ -565,13 +572,14 @@
 
     Thread::ExitIsolateGroupAsHelper(/*bypass_safepoint=*/true);
 
-    // This task is done. Notify the original thread.
-    barrier_->Exit();
+    barrier_->Sync();
+    barrier_->Release();
   }
 
   void RunEnteredIsolateGroup() {
     TIMELINE_FUNCTION_GC_DURATION(Thread::Current(), "ParallelScavenge");
 
+    num_busy_->fetch_add(1u);
     visitor_->ProcessRoots();
 
     // Phase 1: Copying.
@@ -612,9 +620,10 @@
       barrier_->Sync();
     } while (more_to_scavenge);
 
+    ASSERT(!visitor_->HasWork());
+
     // Phase 2: Weak processing, statistics.
     visitor_->Finalize();
-    barrier_->Sync();
   }
 
  private:
@@ -1671,6 +1680,7 @@
   }
   visitor.Finalize();
 
+  visitor.FinalizePromotion();
   to_->AddList(visitor.head(), visitor.tail());
   return visitor.bytes_promoted();
 }
@@ -1680,8 +1690,8 @@
   const intptr_t num_tasks = FLAG_scavenger_tasks;
   ASSERT(num_tasks > 0);
 
-  ThreadBarrier barrier(num_tasks, heap_->barrier(), heap_->barrier_done());
-  RelaxedAtomic<uintptr_t> num_busy = num_tasks;
+  ThreadBarrier* barrier = new ThreadBarrier(num_tasks, 1);
+  RelaxedAtomic<uintptr_t> num_busy = 0;
 
   ParallelScavengerVisitor** visitors =
       new ParallelScavengerVisitor*[num_tasks];
@@ -1692,21 +1702,28 @@
     if (i < (num_tasks - 1)) {
       // Begin scavenging on a helper thread.
       bool result = Dart::thread_pool()->Run<ParallelScavengerTask>(
-          heap_->isolate_group(), &barrier, visitors[i], &num_busy);
+          heap_->isolate_group(), barrier, visitors[i], &num_busy);
       ASSERT(result);
     } else {
       // Last worker is the main thread.
-      ParallelScavengerTask task(heap_->isolate_group(), &barrier, visitors[i],
+      ParallelScavengerTask task(heap_->isolate_group(), barrier, visitors[i],
                                  &num_busy);
       task.RunEnteredIsolateGroup();
-      barrier.Exit();
+      barrier->Sync();
+      barrier->Release();
     }
   }
 
   for (intptr_t i = 0; i < num_tasks; i++) {
-    to_->AddList(visitors[i]->head(), visitors[i]->tail());
-    bytes_promoted += visitors[i]->bytes_promoted();
-    delete visitors[i];
+    ParallelScavengerVisitor* visitor = visitors[i];
+    if (abort_) {
+      visitor->AbandonWork();
+    } else {
+      visitor->FinalizePromotion();
+    }
+    to_->AddList(visitor->head(), visitor->tail());
+    bytes_promoted += visitor->bytes_promoted();
+    delete visitor;
   }
 
   delete[] visitors;
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index 3d97c84..f77d389 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -56,7 +56,6 @@
     // (unless splitting into multiple outputs and there are no Code objects
     // in this particular output), but is guaranteed empty otherwise (the
     // instructions follow the InstructionsSection object instead).
-    ASSERT(FLAG_use_bare_instructions || layout->payload_length_ == 0);
     ASSERT(raw_value <=
            size - InstructionsSection::InstanceSize(layout->payload_length_));
     return layout;
@@ -599,8 +598,7 @@
 }
 
 void ImageWriter::WriteText(bool vm) {
-  const bool bare_instruction_payloads =
-      FLAG_precompiled_mode && FLAG_use_bare_instructions;
+  const bool bare_instruction_payloads = FLAG_precompiled_mode;
 
   // Start snapshot at page boundary.
   if (!EnterSection(ProgramSection::Text, vm, ImageWriter::kTextAlignment)) {
@@ -1568,20 +1566,18 @@
 
 #if defined(DART_PRECOMPILED_RUNTIME)
 uword ImageReader::GetBareInstructionsAt(uint32_t offset) const {
-  ASSERT(FLAG_use_bare_instructions);
   ASSERT(Utils::IsAligned(offset, Instructions::kBarePayloadAlignment));
   return reinterpret_cast<uword>(instructions_image_) + offset;
 }
 
 uword ImageReader::GetBareInstructionsEnd() const {
-  ASSERT(FLAG_use_bare_instructions);
   Image image(instructions_image_);
   return reinterpret_cast<uword>(image.object_start()) + image.object_size();
 }
 #endif
 
 InstructionsPtr ImageReader::GetInstructionsAt(uint32_t offset) const {
-  ASSERT(!FLAG_precompiled_mode || !FLAG_use_bare_instructions);
+  ASSERT(!FLAG_precompiled_mode);
   ASSERT(Utils::IsAligned(offset, kObjectAlignment));
 
   ObjectPtr result = UntaggedObject::FromAddr(
diff --git a/runtime/vm/image_snapshot.h b/runtime/vm/image_snapshot.h
index fc2bbdd..7100d3b 100644
--- a/runtime/vm/image_snapshot.h
+++ b/runtime/vm/image_snapshot.h
@@ -251,13 +251,8 @@
     if (FLAG_precompiled_mode) {
       // We reserve space for the initial InstructionsSection object. It is
       // manually serialized since it includes offsets to other snapshot parts.
-      // In bare instructions mode, it contains all the payloads and so we
-      // start after the header, whereas in non-bare mode, it contains no
-      // payload and Instructions start after it.
-      next_text_offset_ +=
-          FLAG_use_bare_instructions
-              ? compiler::target::InstructionsSection::HeaderSize()
-              : compiler::target::InstructionsSection::InstanceSize(0);
+      // It contains all the payloads which start directly after the header.
+      next_text_offset_ += compiler::target::InstructionsSection::HeaderSize();
     }
 #endif
     objects_.Clear();
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 9103b35..11a73d3 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -62,6 +62,7 @@
 
 DECLARE_FLAG(bool, print_metrics);
 DECLARE_FLAG(bool, trace_service);
+DECLARE_FLAG(bool, trace_shutdown);
 DECLARE_FLAG(bool, warn_on_pause_with_no_debugger);
 
 // Reload flags.
@@ -488,6 +489,19 @@
 }
 
 void IsolateGroup::Shutdown() {
+  char* name;
+  // We retrieve the flag value once to avoid the compiler complaining about the
+  // possibly uninitialized value of name, as the compiler is unaware that when
+  // the flag variable is non-const, it is set once during VM initialization and
+  // never changed after, and that modification never runs concurrently with
+  // this method.
+  const bool trace_shutdown = FLAG_trace_shutdown;
+
+  if (trace_shutdown) {
+    name = Utils::StrDup(source()->name);
+    OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Shutdown starting for group %s\n",
+                 Dart::UptimeMillis(), name);
+  }
   // Ensure to join all threads before waiting for pending GC tasks (the thread
   // pool can trigger idle notification, which can start new GC tasks).
   //
@@ -529,11 +543,28 @@
   // After this isolate group has died we might need to notify a pending
   // `Dart_Cleanup()` call.
   {
+    if (trace_shutdown) {
+      OS::PrintErr("[+%" Pd64
+                   "ms] SHUTDOWN: Notifying "
+                   "isolate group shutdown (%s)\n",
+                   Dart::UptimeMillis(), name);
+    }
     MonitorLocker ml(Isolate::isolate_creation_monitor_);
     if (!Isolate::creation_enabled_ &&
         !IsolateGroup::HasApplicationIsolateGroups()) {
       ml.Notify();
     }
+    if (trace_shutdown) {
+      OS::PrintErr("[+%" Pd64
+                   "ms] SHUTDOWN: Done Notifying "
+                   "isolate group shutdown (%s)\n",
+                   Dart::UptimeMillis(), name);
+    }
+  }
+  if (trace_shutdown) {
+    OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Done shutdown for group %s\n",
+                 Dart::UptimeMillis(), name);
+    free(name);
   }
 }
 
@@ -1390,9 +1421,6 @@
     } else if (msg_handler.IsNull()) {
       // If the port has been closed then the message will be dropped at this
       // point. Make sure to post to the delivery failure port in that case.
-      if (message->RedirectToDeliveryFailurePort()) {
-        PortMap::PostMessage(std::move(message));
-      }
     } else {
       // The handler closure which was used to successfully handle the message.
     }
@@ -2646,14 +2674,16 @@
       // The current thread is running on the isolate group's thread pool.
       // So we cannot safely delete the isolate group (and it's pool).
       // Instead we will destroy the isolate group on the VM-global pool.
+      if (FLAG_trace_shutdown) {
+        OS::PrintErr("[+%" Pd64 "ms] : Scheduling shutdown on VM pool %s\n",
+                     Dart::UptimeMillis(), isolate_group->source()->name);
+      }
       Dart::thread_pool()->Run<ShutdownGroupTask>(isolate_group);
     }
   } else {
-    if (FLAG_enable_isolate_groups) {
-      // TODO(dartbug.com/36097): An isolate just died. A significant amount of
-      // memory might have become unreachable. We should evaluate how to best
-      // inform the GC about this situation.
-    }
+    // TODO(dartbug.com/36097): An isolate just died. A significant amount of
+    // memory might have become unreachable. We should evaluate how to best
+    // inform the GC about this situation.
   }
 }  // namespace dart
 
@@ -2818,11 +2848,6 @@
   auto thread = Thread::Current();
   StoppedMutatorsScope stopped_mutators_scope(thread);
 
-  if (thread->IsMutatorThread() && !FLAG_enable_isolate_groups) {
-    single_current_mutator->Call();
-    return;
-  }
-
   if (thread->IsAtSafepoint()) {
     RELEASE_ASSERT(safepoint_handler()->IsOwnedByTheThread(thread));
     single_current_mutator->Call();
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 5d2f636..2c531f0 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -482,6 +482,11 @@
         ShouldLoadVmServiceBit::update(value, isolate_group_flags_);
   }
 
+  void set_asserts(bool value) {
+    isolate_group_flags_ =
+        EnableAssertsBit::update(value, isolate_group_flags_);
+  }
+
 #if !defined(PRODUCT)
 #if !defined(DART_PRECOMPILED_RUNTIME)
   bool HasAttemptedReload() const {
diff --git a/runtime/vm/isolate_test.cc b/runtime/vm/isolate_test.cc
index 2003591..2b8afac 100644
--- a/runtime/vm/isolate_test.cc
+++ b/runtime/vm/isolate_test.cc
@@ -104,7 +104,8 @@
       barrier_->Sync();
     }
     Thread::ExitIsolateAsHelper();
-    barrier_->Exit();
+    barrier_->Sync();
+    barrier_->Release();
   }
 
  private:
@@ -125,24 +126,24 @@
 // compiler and/or CPU could reorder operations to make the tasks observe the
 // round update *before* the interrupt is set.
 TEST_CASE(StackLimitInterrupts) {
-  auto heap = thread->isolate_group()->heap();
-  ThreadBarrier barrier(InterruptChecker::kTaskCount + 1, heap->barrier(),
-                        heap->barrier_done());
+  ThreadBarrier* barrier = new ThreadBarrier(InterruptChecker::kTaskCount + 1,
+                                             InterruptChecker::kTaskCount + 1);
   // Start all tasks. They will busy-wait until interrupted in the first round.
   for (intptr_t task = 0; task < InterruptChecker::kTaskCount; task++) {
-    Dart::thread_pool()->Run<InterruptChecker>(thread, &barrier);
+    Dart::thread_pool()->Run<InterruptChecker>(thread, barrier);
   }
   // Wait for all tasks to get ready for the first round.
-  barrier.Sync();
+  barrier->Sync();
   for (intptr_t i = 0; i < InterruptChecker::kIterations; ++i) {
     thread->ScheduleInterrupts(Thread::kVMInterrupt);
     // Wait for all tasks to observe the interrupt.
-    barrier.Sync();
+    barrier->Sync();
     // Continue with next round.
     uword interrupts = thread->GetAndClearInterrupts();
     EXPECT((interrupts & Thread::kVMInterrupt) != 0);
   }
-  barrier.Exit();
+  barrier->Sync();
+  barrier->Release();
 }
 
 }  // namespace dart
diff --git a/runtime/vm/message.cc b/runtime/vm/message.cc
index e4430e6..0f2d2e4 100644
--- a/runtime/vm/message.cc
+++ b/runtime/vm/message.cc
@@ -20,49 +20,32 @@
                  uint8_t* snapshot,
                  intptr_t snapshot_length,
                  MessageFinalizableData* finalizable_data,
-                 Priority priority,
-                 Dart_Port delivery_failure_port)
+                 Priority priority)
     : dest_port_(dest_port),
-      delivery_failure_port_(delivery_failure_port),
       payload_(snapshot),
       snapshot_length_(snapshot_length),
       finalizable_data_(finalizable_data),
       priority_(priority) {
-  ASSERT((priority == kNormalPriority) ||
-         (delivery_failure_port == kIllegalPort));
   ASSERT(IsSnapshot());
 }
 
-Message::Message(Dart_Port dest_port,
-                 ObjectPtr raw_obj,
-                 Priority priority,
-                 Dart_Port delivery_failure_port)
-    : dest_port_(dest_port),
-      delivery_failure_port_(delivery_failure_port),
-      payload_(raw_obj),
-      priority_(priority) {
+Message::Message(Dart_Port dest_port, ObjectPtr raw_obj, Priority priority)
+    : dest_port_(dest_port), payload_(raw_obj), priority_(priority) {
   ASSERT(!raw_obj->IsHeapObject() || raw_obj->untag()->InVMIsolateHeap());
-  ASSERT((priority == kNormalPriority) ||
-         (delivery_failure_port == kIllegalPort));
   ASSERT(IsRaw());
 }
 
 Message::Message(Dart_Port dest_port,
                  PersistentHandle* handle,
-                 Priority priority,
-                 Dart_Port delivery_failure_port)
+                 Priority priority)
     : dest_port_(dest_port),
-      delivery_failure_port_(delivery_failure_port),
       payload_(handle),
       snapshot_length_(kPersistentHandleSnapshotLen),
       priority_(priority) {
-  ASSERT((priority == kNormalPriority) ||
-         (delivery_failure_port == kIllegalPort));
   ASSERT(IsPersistentHandle());
 }
 
 Message::~Message() {
-  ASSERT(delivery_failure_port_ == kIllegalPort);
   if (IsSnapshot()) {
     free(payload_.snapshot_);
   }
@@ -74,15 +57,6 @@
   }
 }
 
-bool Message::RedirectToDeliveryFailurePort() {
-  if (delivery_failure_port_ == kIllegalPort) {
-    return false;
-  }
-  dest_port_ = delivery_failure_port_;
-  delivery_failure_port_ = kIllegalPort;
-  return true;
-}
-
 intptr_t Message::Id() const {
   // Messages are allocated on the C heap. Use the raw address as the id.
   return reinterpret_cast<intptr_t>(this);
@@ -179,9 +153,6 @@
   tail_ = nullptr;
   while (cur != nullptr) {
     std::unique_ptr<Message> next(cur->next_);
-    if (cur->RedirectToDeliveryFailurePort()) {
-      PortMap::PostMessage(std::move(cur));
-    }
     cur = std::move(next);
   }
 }
diff --git a/runtime/vm/message.h b/runtime/vm/message.h
index bbdf5f9..4c82bdf 100644
--- a/runtime/vm/message.h
+++ b/runtime/vm/message.h
@@ -56,20 +56,13 @@
           uint8_t* snapshot,
           intptr_t snapshot_length,
           MessageFinalizableData* finalizable_data,
-          Priority priority,
-          Dart_Port delivery_failure_port = kIllegalPort);
+          Priority priority);
 
   // Message objects can also carry RawObject pointers for Smis and objects in
   // the VM heap. This is indicated by setting the len_ field to 0.
-  Message(Dart_Port dest_port,
-          ObjectPtr raw_obj,
-          Priority priority,
-          Dart_Port delivery_failure_port = kIllegalPort);
+  Message(Dart_Port dest_port, ObjectPtr raw_obj, Priority priority);
 
-  Message(Dart_Port dest_port,
-          PersistentHandle* handle,
-          Priority priority,
-          Dart_Port delivery_failure_port = kIllegalPort);
+  Message(Dart_Port dest_port, PersistentHandle* handle, Priority priority);
 
   ~Message();
 
@@ -119,8 +112,6 @@
     return snapshot_length_ == kPersistentHandleSnapshotLen;
   }
 
-  bool RedirectToDeliveryFailurePort();
-
   void DropFinalizers() {
     if (finalizable_data_ != nullptr) {
       finalizable_data_->DropFinalizers();
@@ -138,7 +129,6 @@
 
   Message* next_ = nullptr;
   Dart_Port dest_port_;
-  Dart_Port delivery_failure_port_;
   union Payload {
     Payload(uint8_t* snapshot) : snapshot_(snapshot) {}
     Payload(ObjectPtr raw_obj) : raw_obj_(raw_obj) {}
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index e272c5c..df10c58 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -7483,7 +7483,7 @@
 
 FunctionPtr Function::implicit_closure_function() const {
   if (IsClosureFunction() || IsDispatcherOrImplicitAccessor() ||
-      IsFieldInitializer() || IsFfiTrampoline()) {
+      IsFieldInitializer() || IsFfiTrampoline() || IsMethodExtractor()) {
     return Function::null();
   }
   const Object& obj = Object::Handle(data());
@@ -7553,12 +7553,26 @@
          kFfiHandleCid;
 }
 
+// Keep consistent with BaseMarshaller::IsCompound.
 bool Function::FfiCSignatureReturnsStruct() const {
   ASSERT(IsFfiTrampoline());
-  const FunctionType& c_signature = FunctionType::Handle(FfiCSignature());
-  const auto& return_type = AbstractType::Handle(c_signature.result_type());
-  const bool predefined = IsFfiTypeClassId(return_type.type_class_id());
-  return !predefined;
+  Zone* zone = Thread::Current()->zone();
+  const auto& c_signature = FunctionType::Handle(zone, FfiCSignature());
+  const auto& type = AbstractType::Handle(zone, c_signature.result_type());
+  if (IsFfiTypeClassId(type.type_class_id())) {
+    return false;
+  }
+  // TODO(http://dartbug.com/42563): Implement AbiSpecificInt.
+#ifdef DEBUG
+  const auto& cls = Class::Handle(zone, type.type_class());
+  const auto& superClass = Class::Handle(zone, cls.SuperClass());
+  const bool is_struct = String::Handle(zone, superClass.UserVisibleName())
+                             .Equals(Symbols::Struct());
+  const bool is_union = String::Handle(zone, superClass.UserVisibleName())
+                            .Equals(Symbols::Union());
+  RELEASE_ASSERT(is_struct || is_union);
+#endif
+  return true;
 }
 
 int32_t Function::FfiCallbackId() const {
@@ -9600,6 +9614,10 @@
   return true;
 }
 
+bool Function::IsPrivate() const {
+  return Library::IsPrivate(String::Handle(name()));
+}
+
 ClassPtr Function::Owner() const {
   ASSERT(untag()->owner() != Object::null());
   if (untag()->owner()->IsClass()) {
@@ -10144,8 +10162,7 @@
   }
 
   // If table dispatch is disabled, all instance calls use switchable calls.
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-        FLAG_use_table_dispatch)) {
+  if (!(FLAG_precompiled_mode && FLAG_use_table_dispatch)) {
     return true;
   }
 
@@ -15527,7 +15544,6 @@
   result ^= Object::Allocate(
       MonomorphicSmiableCall::kClassId, MonomorphicSmiableCall::InstanceSize(),
       Heap::kOld, MonomorphicSmiableCall::ContainsCompressedPointers());
-  result.untag()->set_target(target.ptr());
   result.StoreNonPointer(&result.untag()->expected_cid_, expected_cid);
   result.StoreNonPointer(&result.untag()->entrypoint_, target.EntryPoint());
   return result.ptr();
@@ -16902,7 +16918,7 @@
 
 ObjectPoolPtr Code::GetObjectPool() const {
 #if defined(DART_PRECOMPILER) || defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     return IsolateGroup::Current()->object_store()->global_object_pool();
   }
 #endif
@@ -25510,8 +25526,7 @@
     result.untag()->set_function(function.ptr());
     result.untag()->set_context(context.ptr());
 #if defined(DART_PRECOMPILED_RUNTIME)
-    result.set_entry_point(FLAG_use_bare_instructions ? function.entry_point()
-                                                      : 0);
+    result.set_entry_point(function.entry_point());
 #endif
   }
   return result.ptr();
@@ -25851,6 +25866,15 @@
       // A visible frame ends any gap we might be in.
       in_gap = false;
 
+      // Zero pc_offset can only occur in the frame produced by the async
+      // unwinding and it corresponds to the next future listener in the
+      // chain. This function is not yet called (it will be called when
+      // the future completes) hence pc_offset is set to 0. This frame
+      // is very different from other frames which have pc_offsets
+      // corresponding to call- or yield-sites in the generated code and
+      // should be handled specially.
+      const bool is_future_listener = pc_offset == 0;
+
 #if defined(DART_PRECOMPILED_RUNTIME)
       // When printing non-symbolic frames, we normally print call
       // addresses, not return addresses, by subtracting one from the PC to
@@ -25861,7 +25885,6 @@
       // is invoked with the value of the resolved future. Thus, we must
       // report the return address, as returning a value before the closure
       // payload will cause failures to decode the frame using DWARF info.
-      const bool is_future_listener = pc_offset == 0;
       const uword call_addr = is_future_listener ? pc : pc - 1;
 
       if (FLAG_dwarf_stack_traces_mode) {
@@ -25887,7 +25910,11 @@
       }
 #endif
 
-      if (code.is_optimized() && stack_trace.expand_inlined()) {
+      if (code.is_optimized() && stack_trace.expand_inlined() &&
+          (FLAG_precompiled_mode || !is_future_listener)) {
+        // Note: In AOT mode EmitFunctionEntrySourcePositionDescriptorIfNeeded
+        // will take care of emitting a descriptor that would allow us to
+        // symbolize stack frame with 0 offset.
         code.GetInlinedFunctionsAtReturnAddress(pc_offset, &inlined_functions,
                                                 &inlined_token_positions);
         ASSERT(inlined_functions.length() >= 1);
@@ -25901,7 +25928,8 @@
         continue;
       }
 
-      auto const pos = code.GetTokenIndexOfPC(pc);
+      auto const pos = is_future_listener ? function.token_pos()
+                                          : code.GetTokenIndexOfPC(pc);
       PrintSymbolicStackFrame(zone, &buffer, function, pos, frame_index);
       frame_index++;
     }
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index df0932e..d1fe844 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2014,7 +2014,6 @@
 
 class MonomorphicSmiableCall : public Object {
  public:
-  CodePtr target() const { return untag()->target(); }
   classid_t expected_cid() const { return untag()->expected_cid_; }
 
   static intptr_t InstanceSize() {
@@ -2028,10 +2027,6 @@
     return OFFSET_OF(UntaggedMonomorphicSmiableCall, expected_cid_);
   }
 
-  static intptr_t target_offset() {
-    return OFFSET_OF(UntaggedMonomorphicSmiableCall, target_);
-  }
-
   static intptr_t entrypoint_offset() {
     return OFFSET_OF(UntaggedMonomorphicSmiableCall, entrypoint_);
   }
@@ -2709,6 +2704,8 @@
                                 intptr_t num_free_fun_type_params = kAllFree,
                                 TrailPtr trail = nullptr) const;
 
+  bool IsPrivate() const;
+
   ClassPtr Owner() const;
   void set_owner(const Object& value) const;
   ClassPtr origin() const;
@@ -3180,8 +3177,8 @@
   // run.
   bool ForceOptimize() const {
     return IsFfiFromAddress() || IsFfiGetAddress() || IsFfiLoad() ||
-           IsFfiStore() || IsFfiTrampoline() || IsTypedDataViewFactory() ||
-           IsUtf8Scan() || IsGetNativeField();
+           IsFfiStore() || IsFfiTrampoline() || IsFfiAsExternalTypedData() ||
+           IsTypedDataViewFactory() || IsUtf8Scan() || IsGetNativeField();
   }
 
   bool CanBeInlined() const;
@@ -3513,6 +3510,12 @@
     return kind == MethodRecognizer::kFfiGetAddress;
   }
 
+  bool IsFfiAsExternalTypedData() const {
+    const auto kind = recognized_kind();
+    return MethodRecognizer::kFfiAsExternalTypedDataInt8 <= kind &&
+           kind <= MethodRecognizer::kFfiAsExternalTypedDataDouble;
+  }
+
   bool IsGetNativeField() const {
     const auto kind = recognized_kind();
     return kind == MethodRecognizer::kGetNativeField;
@@ -3700,6 +3703,9 @@
   //   element 2 * i + 1 is coverage hit (zero meaning code was not hit)
   ArrayPtr GetCoverageArray() const;
 
+  // Outputs this function's service ID to the provided JSON object.
+  void AddFunctionServiceId(const JSONObject& obj) const;
+
   // Sets deopt reason in all ICData-s with given deopt_id.
   void SetDeoptReasonForAll(intptr_t deopt_id, ICData::DeoptReasonId reason);
 
@@ -5445,7 +5451,8 @@
   // _not_ at the start of the payload.
   static const intptr_t kBarePayloadAlignment = 4;
 
-  // In non-bare mode, we align the payloads on word boundaries.
+  // When instructions reside in the heap we align the payloads on word
+  // boundaries.
   static const intptr_t kNonBarePayloadAlignment = kWordSize;
 
   // In the precompiled runtime when running in bare instructions mode,
@@ -5454,9 +5461,7 @@
 
   static intptr_t HeaderSize() {
 #if defined(DART_PRECOMPILED_RUNTIME)
-    if (FLAG_use_bare_instructions) {
-      UNREACHABLE();
-    }
+    UNREACHABLE();
 #endif
     return Utils::RoundUp(sizeof(UntaggedInstructions),
                           kNonBarePayloadAlignment);
@@ -5470,18 +5475,14 @@
 
   static intptr_t InstanceSize(intptr_t size) {
 #if defined(DART_PRECOMPILED_RUNTIME)
-    if (FLAG_use_bare_instructions) {
-      UNREACHABLE();
-    }
+    UNREACHABLE();
 #endif
     return RoundedAllocationSize(HeaderSize() + size);
   }
 
   static InstructionsPtr FromPayloadStart(uword payload_start) {
 #if defined(DART_PRECOMPILED_RUNTIME)
-    if (FLAG_use_bare_instructions) {
-      UNREACHABLE();
-    }
+    UNREACHABLE();
 #endif
     return static_cast<InstructionsPtr>(payload_start - HeaderSize() +
                                         kHeapObjectTag);
@@ -5492,9 +5493,19 @@
   }
 
   static bool Equals(InstructionsPtr a, InstructionsPtr b) {
-    if (Size(a) != Size(b)) return false;
+    // This method should only be called on non-null Instructions objects.
+    ASSERT_EQUAL(a->GetClassId(), kInstructionsCid);
+    ASSERT_EQUAL(b->GetClassId(), kInstructionsCid);
+    // Don't include the object header tags wholesale in the comparison,
+    // because the GC tags may differ in JIT mode. In fact, we can skip checking
+    // the object header entirely, as we're guaranteed that the cids match,
+    // because there are no subclasses for the Instructions class, and the sizes
+    // should match if the content size encoded in size_and_flags_ matches.
+    if (a->untag()->size_and_flags_ != b->untag()->size_and_flags_) {
+      return false;
+    }
     NoSafepointScope no_safepoint;
-    return memcmp(a->untag(), b->untag(), InstanceSize(Size(a))) == 0;
+    return memcmp(a->untag()->data(), b->untag()->data(), Size(a)) == 0;
   }
 
   uint32_t Hash() const {
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index f7fe7fe..d24df33 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -248,22 +248,36 @@
   Object::PrintJSONImpl(stream, ref);
 }
 
-static void AddFunctionServiceId(const JSONObject& jsobj,
-                                 const Function& f,
-                                 const Class& cls) {
-  ASSERT(!cls.IsNull());
+void Function::AddFunctionServiceId(const JSONObject& jsobj) const {
+  Class& cls = Class::Handle(Owner());
   // Special kinds of functions use indices in their respective lists.
   intptr_t id = -1;
   const char* selector = NULL;
-  if (f.IsNonImplicitClosureFunction()) {
-    id = ClosureFunctionsCache::FindClosureIndex(f);
+  // Regular functions known to their owner use their name (percent-encoded).
+  String& name = String::Handle(this->name());
+
+  if (IsNonImplicitClosureFunction()) {
+    id = ClosureFunctionsCache::FindClosureIndex(*this);
     selector = "closures";
-  } else if (f.IsImplicitClosureFunction()) {
-    id = cls.FindImplicitClosureFunctionIndex(f);
+  } else if (IsImplicitClosureFunction()) {
+    id = cls.FindImplicitClosureFunctionIndex(*this);
     selector = "implicit_closures";
-  } else if (f.IsNoSuchMethodDispatcher() || f.IsInvokeFieldDispatcher()) {
-    id = cls.FindInvocationDispatcherFunctionIndex(f);
+  } else if (IsNoSuchMethodDispatcher() || IsInvokeFieldDispatcher()) {
+    id = cls.FindInvocationDispatcherFunctionIndex(*this);
     selector = "dispatchers";
+  } else if (IsFieldInitializer()) {
+    name ^= Field::NameFromInit(name);
+    const char* encoded_field_name = String::EncodeIRI(name);
+    if (cls.IsTopLevel()) {
+      const auto& library = Library::Handle(cls.library());
+      const auto& private_key = String::Handle(library.private_key());
+      jsobj.AddFixedServiceId("libraries/%s/field_inits/%s",
+                              private_key.ToCString(), encoded_field_name);
+    } else {
+      jsobj.AddFixedServiceId("classes/%" Pd "/field_inits/%s", cls.id(),
+                              encoded_field_name);
+    }
+    return;
   }
   if (id != -1) {
     ASSERT(selector != NULL);
@@ -278,10 +292,8 @@
     }
     return;
   }
-  // Regular functions known to their owner use their name (percent-encoded).
-  String& name = String::Handle(f.name());
   Thread* thread = Thread::Current();
-  if (Resolver::ResolveFunction(thread->zone(), cls, name) == f.ptr()) {
+  if (Resolver::ResolveFunction(thread->zone(), cls, name) == ptr()) {
     const char* encoded_name = String::EncodeIRI(name);
     if (cls.IsTopLevel()) {
       const auto& library = Library::Handle(cls.library());
@@ -297,7 +309,7 @@
   // Oddball functions (not known to their owner) fall back to use the object
   // id ring. Current known examples are signature functions of closures
   // and stubs like 'megamorphic_call_miss'.
-  jsobj.AddServiceId(f);
+  jsobj.AddServiceId(*this);
 }
 
 void Function::PrintJSONImpl(JSONStream* stream, bool ref) const {
@@ -308,7 +320,7 @@
   ASSERT(err.IsNull());
   JSONObject jsobj(stream);
   AddCommonObjectProperties(&jsobj, "Function", ref);
-  AddFunctionServiceId(jsobj, *this, cls);
+  AddFunctionServiceId(jsobj);
   const char* user_name = UserVisibleNameCString();
   const String& vm_name = String::Handle(name());
   AddNameProperties(&jsobj, user_name, vm_name.ToCString());
@@ -825,7 +837,6 @@
   if (ref) {
     return;
   }
-  jsobj.AddProperty("_target", Code::Handle(target()));
 }
 
 void CallSiteData::PrintJSONImpl(JSONStream* stream, bool ref) const {
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index 33bede3..9fc1c99 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -103,8 +103,8 @@
                               EMIT_FIELD_INIT,
                               EMIT_FIELD_INIT)
 #undef EMIT_FIELD_INIT
-          unused_field_(0)  // Just to prevent a trailing comma.
-{
+      // Just to prevent a trailing comma.
+      unused_field_(0) {
   for (ObjectPtr* current = from(); current <= to(); current++) {
     *current = Object::null();
   }
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 3b308c6..03125b2 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -215,6 +215,8 @@
   RW(Code, assert_boolean_stub)                                                \
   RW(Code, instance_of_stub)                                                   \
   RW(Code, init_static_field_stub)                                             \
+  RW(Code, init_late_static_field_stub)                                        \
+  RW(Code, init_late_final_static_field_stub)                                  \
   RW(Code, init_instance_field_stub)                                           \
   RW(Code, init_late_instance_field_stub)                                      \
   RW(Code, init_late_final_instance_field_stub)                                \
@@ -296,6 +298,8 @@
   DO(re_throw_stub, ReThrow)                                                   \
   DO(assert_boolean_stub, AssertBoolean)                                       \
   DO(init_static_field_stub, InitStaticField)                                  \
+  DO(init_late_static_field_stub, InitLateStaticField)                         \
+  DO(init_late_final_static_field_stub, InitLateFinalStaticField)              \
   DO(init_instance_field_stub, InitInstanceField)                              \
   DO(init_late_instance_field_stub, InitLateInstanceField)                     \
   DO(init_late_final_instance_field_stub, InitLateFinalInstanceField)          \
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index aab5dec..f1f721b 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -9,6 +9,9 @@
 #include "platform/atomic.h"
 #include "vm/allocation.h"
 #include "vm/code_patcher.h"
+#if !defined(DART_PRECOMPILED_RUNTIME)
+#include "vm/compiler/compiler_state.h"
+#endif
 #include "vm/debugger.h"
 #include "vm/instructions.h"
 #include "vm/isolate.h"
@@ -247,7 +250,6 @@
 ProcessedSampleBuffer* SampleBlockListProcessor::BuildProcessedSampleBuffer(
     SampleFilter* filter,
     ProcessedSampleBuffer* buffer) {
-  ASSERT(filter != NULL);
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
 
@@ -264,7 +266,6 @@
 ProcessedSampleBuffer* SampleBlockBuffer::BuildProcessedSampleBuffer(
     SampleFilter* filter,
     ProcessedSampleBuffer* buffer) {
-  ASSERT(filter != NULL);
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
 
@@ -1263,6 +1264,11 @@
       StackFrame::DumpCurrentTrace();
     } else if (thread->execution_state() == Thread::kThreadInVM) {
       StackFrame::DumpCurrentTrace();
+#if !defined(DART_PRECOMPILED_RUNTIME)
+      if (thread->HasCompilerState()) {
+        thread->compiler_state().ReportCrash();
+      }
+#endif
     }
   }
 }
diff --git a/runtime/vm/profiler_service.cc b/runtime/vm/profiler_service.cc
index c82c0f9..1ae3a46 100644
--- a/runtime/vm/profiler_service.cc
+++ b/runtime/vm/profiler_service.cc
@@ -170,7 +170,19 @@
   func->AddProperty("_kind", KindToCString(kind()));
 }
 
-void ProfileFunction::PrintToJSONArray(JSONArray* functions) {
+void ProfileFunction::PrintToJSONArray(JSONArray* functions,
+                                       bool print_only_ids) {
+  if (print_only_ids) {
+    JSONObject obj(functions);
+    if (kind() == kDartFunction) {
+      ASSERT(!function_.IsNull());
+      obj.AddProperty("type", "@Object");
+      function_.AddFunctionServiceId(obj);
+    } else {
+      PrintToJSONObject(&obj);
+    }
+    return;
+  }
   JSONObject obj(functions);
   obj.AddProperty("type", "ProfileFunction");
   obj.AddProperty("kind", KindToCString(kind()));
@@ -1728,10 +1740,16 @@
   PrintProfileJSON(&obj, include_code_samples);
 }
 
-void Profile::PrintProfileJSON(JSONObject* obj, bool include_code_samples) {
+void Profile::PrintProfileJSON(JSONObject* obj,
+                               bool include_code_samples,
+                               bool is_event) {
   ScopeTimer sw("Profile::PrintProfileJSON", FLAG_trace_profiler);
   Thread* thread = Thread::Current();
-  obj->AddProperty("type", "CpuSamples");
+  if (is_event) {
+    obj->AddProperty("type", "CpuSamplesEvent");
+  } else {
+    obj->AddProperty("type", "CpuSamples");
+  }
   PrintHeaderJSON(obj);
   if (include_code_samples) {
     JSONArray codes(obj, "_codes");
@@ -1760,7 +1778,7 @@
     for (intptr_t i = 0; i < functions_->length(); i++) {
       ProfileFunction* function = functions_->At(i);
       ASSERT(function != NULL);
-      function->PrintToJSONArray(&functions);
+      function->PrintToJSONArray(&functions, is_event);
       thread->CheckForSafepoint();
     }
   }
diff --git a/runtime/vm/profiler_service.h b/runtime/vm/profiler_service.h
index a9df89b..13a29fa 100644
--- a/runtime/vm/profiler_service.h
+++ b/runtime/vm/profiler_service.h
@@ -171,7 +171,7 @@
 
   static const char* KindToCString(Kind kind);
 
-  void PrintToJSONArray(JSONArray* functions);
+  void PrintToJSONArray(JSONArray* functions, bool print_only_ids = false);
 
   // Returns true if the call was successful and |pfsp| is set.
   bool GetSinglePosition(ProfileFunctionSourcePosition* pfsp);
@@ -385,7 +385,9 @@
   ProfileCode* GetCodeFromPC(uword pc, int64_t timestamp);
 
   void PrintProfileJSON(JSONStream* stream, bool include_code_samples);
-  void PrintProfileJSON(JSONObject* obj, bool include_code_samples);
+  void PrintProfileJSON(JSONObject* obj,
+                        bool include_code_samples,
+                        bool is_event = false);
 
   ProfileFunction* FindFunction(const Function& function);
 
diff --git a/runtime/vm/program_visitor.cc b/runtime/vm/program_visitor.cc
index 02a5657..918f7d7 100644
--- a/runtime/vm/program_visitor.cc
+++ b/runtime/vm/program_visitor.cc
@@ -897,7 +897,7 @@
           pool_(ObjectPool::Handle(zone)) {
       auto& gop = ObjectPool::Handle(
           zone, isolate_group->object_store()->global_object_pool());
-      ASSERT_EQUAL(!gop.IsNull(), FLAG_use_bare_instructions);
+      ASSERT(!gop.IsNull());
       DedupPool(gop);
     }
 
@@ -935,8 +935,7 @@
   // objects and other objects in the snapshots (these references are otherwise
   // implicit and go through global object pool). This information is needed
   // to produce more informative snapshot profile.
-  if (!FLAG_use_bare_instructions ||
-      FLAG_write_v8_snapshot_profile_to != nullptr ||
+  if (FLAG_write_v8_snapshot_profile_to != nullptr ||
       FLAG_trace_precompiler_to != nullptr) {
     WalkProgram(thread->zone(), thread->isolate_group(), &visitor);
   }
@@ -1160,14 +1159,11 @@
 // The instruction deduplication naturally causes us to have a one-to-many
 // relationship between Instructions and Code objects.
 //
-// In AOT bare instructions mode frames only have PCs. However, the runtime
-// needs e.g. stack maps from the [Code] to scan such a frame. So we ensure that
-// instructions of code objects are only deduplicated if the metadata in the
-// code is the same. The runtime can then pick any code object corresponding to
-// the PC in the frame and use the metadata.
-//
-// In AOT non-bare instructions mode frames are expanded, like in JIT, and
-// contain the unique code object.
+// In AOT frames only have PCs. However, the runtime needs e.g. stack maps from
+// the [Code] to scan such a frame. So we ensure that instructions of code
+// objects are only deduplicated if the metadata in the code is the same.
+// The runtime can then pick any code object corresponding to the PC in the
+// frame and use the metadata.
 #if defined(DART_PRECOMPILER)
 class CodeKeyValueTrait {
  public:
@@ -1300,7 +1296,7 @@
     Instructions& instructions_;
   };
 
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     StackZone stack_zone(thread);
     DedupInstructionsWithSameMetadataVisitor visitor(thread->zone());
     WalkProgram(thread->zone(), thread->isolate_group(), &visitor);
@@ -1329,25 +1325,6 @@
 
   // Reduces binary size but obfuscates profiler results.
   if (FLAG_dedup_instructions) {
-    // In non-bare mode (unused atm) dedupping instructions would cause us to
-    // loose the ability to uniquely map a PC to a given UnlinkedCall object,
-    // since two code objects might point to the same deduped instructions
-    // object but might have two different UnlinkedCall objects in their pool.
-    //
-    // In bare mode this cannot happen because different UnlinkedCall objects
-    // would get different indices into the (global) object pool, therefore
-    // making the instructions different.
-    //
-    // (When transitioning the switchable call site we loose track of the args
-    // descriptor. Since we need it for further transitions we currently save it
-    // via a PC -> UnlinkedCall mapping).
-    //
-    // We therfore disable the instruction deduplication in product-non-bare
-    // mode (which is unused atm).
-#if defined(PRODUCT)
-    if (FLAG_precompiled_mode && !FLAG_use_bare_instructions) return;
-#endif
-
     DedupInstructions(thread);
   }
 }
@@ -1389,10 +1366,6 @@
     MergeAssignment(obj_, id);
     obj_ = code.compressed_stackmaps();
     MergeAssignment(obj_, id);
-    if (!FLAG_use_bare_instructions) {
-      obj_ = code.object_pool();
-      MergeAssignment(obj_, id);
-    }
   }
 
   void MergeAssignment(const Object& obj, intptr_t id) {
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 2deada7..de93e86 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -540,7 +540,7 @@
 COMPRESSED_VISITOR(LibraryPrefix)
 REGULAR_VISITOR(SingleTargetCache)
 REGULAR_VISITOR(UnlinkedCall)
-REGULAR_VISITOR(MonomorphicSmiableCall)
+NULL_VISITOR(MonomorphicSmiableCall)
 REGULAR_VISITOR(ICData)
 REGULAR_VISITOR(MegamorphicCache)
 COMPRESSED_VISITOR(ApiError)
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 986cb2d..6a182bb 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -2273,13 +2273,10 @@
 
 class UntaggedMonomorphicSmiableCall : public UntaggedObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(MonomorphicSmiableCall);
-  POINTER_FIELD(CodePtr,
-                target);  // Entrypoint PC in bare mode, Code in non-bare mode.
-  VISIT_FROM(target)
-  VISIT_TO(target)
+  VISIT_NOTHING();
+
   uword expected_cid_;
   uword entrypoint_;
-  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
 // Abstract base class for RawICData/RawMegamorphicCache
diff --git a/runtime/vm/raw_object_fields.cc b/runtime/vm/raw_object_fields.cc
index 186f510..1099528 100644
--- a/runtime/vm/raw_object_fields.cc
+++ b/runtime/vm/raw_object_fields.cc
@@ -97,7 +97,7 @@
   F(UnlinkedCall, target_name_)                                                \
   F(UnlinkedCall, args_descriptor_)                                            \
   F(MonomorphicSmiableCall, expected_cid_)                                     \
-  F(MonomorphicSmiableCall, target_)                                           \
+  F(MonomorphicSmiableCall, entrypoint_)                                       \
   F(CallSiteData, target_name_)                                                \
   F(CallSiteData, args_descriptor_)                                            \
   F(ICData, target_name_)                                                      \
diff --git a/runtime/vm/reverse_pc_lookup_cache.cc b/runtime/vm/reverse_pc_lookup_cache.cc
index dc7390a..97bf223 100644
--- a/runtime/vm/reverse_pc_lookup_cache.cc
+++ b/runtime/vm/reverse_pc_lookup_cache.cc
@@ -47,7 +47,7 @@
                                         uword pc,
                                         bool is_return_address,
                                         uword* code_start) {
-  ASSERT(FLAG_precompiled_mode && FLAG_use_bare_instructions);
+  ASSERT(FLAG_precompiled_mode);
   NoSafepointScope no_safepoint;
 
   ObjectPtr code_descriptor =
@@ -62,7 +62,7 @@
 CodePtr ReversePc::Lookup(IsolateGroup* group,
                           uword pc,
                           bool is_return_address) {
-  ASSERT(FLAG_precompiled_mode && FLAG_use_bare_instructions);
+  ASSERT(FLAG_precompiled_mode);
   NoSafepointScope no_safepoint;
 
   uword code_start;
@@ -85,7 +85,7 @@
     uword pc,
     bool is_return_address,
     uword* code_start) {
-  ASSERT(FLAG_precompiled_mode && FLAG_use_bare_instructions);
+  ASSERT(FLAG_precompiled_mode);
   NoSafepointScope no_safepoint;
 
   ObjectPtr code_descriptor =
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 549dd9b..c693c02 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -869,9 +869,6 @@
         new_cache.WriteEntryToBuffer(zone, &buffer, colliding_index, "      ");
         THR_Print("%s\n", buffer.buffer());
       }
-      if (!FLAG_enable_isolate_groups) {
-        FATAL("Duplicate subtype test cache entry");
-      }
       if (old_result.ptr() != result.ptr()) {
         FATAL("Existing subtype test cache entry has result %s, not %s",
               old_result.ToCString(), result.ToCString());
@@ -1246,9 +1243,6 @@
   const Code& target_code = Code::Handle(zone, target_function.EnsureHasCode());
   // Before patching verify that we are not repeatedly patching to the same
   // target.
-  ASSERT(FLAG_enable_isolate_groups ||
-         target_code.ptr() != CodePatcher::GetStaticCallTargetAt(
-                                  caller_frame->pc(), caller_code));
   if (target_code.ptr() !=
       CodePatcher::GetStaticCallTargetAt(caller_frame->pc(), caller_code)) {
     GcSafepointOperationScope safepoint(thread);
@@ -3018,10 +3012,6 @@
         current_target_code.EntryPoint(),
         current_target_code.is_optimized() ? "optimized" : "unoptimized");
   }
-  // With isolate groups enabled, it is possible that the target code
-  // has been deactivated just now(as a result of re-optimizatin for example),
-  // which will result in another run through FixCallersTarget.
-  ASSERT(!current_target_code.IsDisabled() || FLAG_enable_isolate_groups);
   arguments.SetReturn(current_target_code);
 #else
   UNREACHABLE();
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index a75737e..50238aa 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -72,6 +72,231 @@
             "Print a message when an isolate is paused but there is no "
             "debugger attached.");
 
+static void PrintInvalidParamError(JSONStream* js, const char* param) {
+#if !defined(PRODUCT)
+  js->PrintError(kInvalidParams, "%s: invalid '%s' parameter: %s", js->method(),
+                 param, js->LookupParam(param));
+#endif
+}
+
+// TODO(johnmccutchan): Split into separate file and write unit tests.
+class MethodParameter {
+ public:
+  MethodParameter(const char* name, bool required)
+      : name_(name), required_(required) {}
+
+  virtual ~MethodParameter() {}
+
+  virtual bool Validate(const char* value) const { return true; }
+
+  virtual bool ValidateObject(const Object& value) const { return true; }
+
+  const char* name() const { return name_; }
+
+  bool required() const { return required_; }
+
+  virtual void PrintError(const char* name,
+                          const char* value,
+                          JSONStream* js) const {
+    PrintInvalidParamError(js, name);
+  }
+
+  virtual void PrintErrorObject(const char* name,
+                                const Object& value,
+                                JSONStream* js) const {
+    PrintInvalidParamError(js, name);
+  }
+
+ private:
+  const char* name_;
+  bool required_;
+};
+
+class NoSuchParameter : public MethodParameter {
+ public:
+  explicit NoSuchParameter(const char* name) : MethodParameter(name, false) {}
+
+  virtual bool Validate(const char* value) const { return (value == NULL); }
+
+  virtual bool ValidateObject(const Object& value) const {
+    return value.IsNull();
+  }
+};
+
+#define ISOLATE_PARAMETER new IdParameter("isolateId", true)
+#define ISOLATE_GROUP_PARAMETER new IdParameter("isolateGroupId", true)
+#define NO_ISOLATE_PARAMETER new NoSuchParameter("isolateId")
+#define RUNNABLE_ISOLATE_PARAMETER new RunnableIsolateParameter("isolateId")
+
+class EnumListParameter : public MethodParameter {
+ public:
+  EnumListParameter(const char* name, bool required, const char* const* enums)
+      : MethodParameter(name, required), enums_(enums) {}
+
+  virtual bool Validate(const char* value) const {
+    return ElementCount(value) >= 0;
+  }
+
+  const char** Parse(char* value) const {
+    const char* kJsonChars = " \t\r\n[,]";
+
+    // Make a writeable copy of the value.
+    intptr_t element_count = ElementCount(value);
+    if (element_count < 0) {
+      return nullptr;
+    }
+    intptr_t element_pos = 0;
+
+    // Allocate our element array.  +1 for NULL terminator.
+    // The caller is reponsible for deleting this memory.
+    char** elements = new char*[element_count + 1];
+    elements[element_count] = NULL;
+
+    // Parse the string destructively.  Build the list of elements.
+    while (element_pos < element_count) {
+      // Skip to the next element.
+      value += strspn(value, kJsonChars);
+
+      intptr_t len = strcspn(value, kJsonChars);
+      ASSERT(len > 0);  // We rely on the parameter being validated already.
+      value[len] = '\0';
+      elements[element_pos++] = value;
+
+      // Advance.  +1 for null terminator.
+      value += (len + 1);
+    }
+    return const_cast<const char**>(elements);
+  }
+
+ private:
+  // For now observatory enums are ascii letters plus underscore.
+  static bool IsEnumChar(char c) {
+    return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) ||
+            (c == '_'));
+  }
+
+  // Returns number of elements in the list.  -1 on parse error.
+  intptr_t ElementCount(const char* value) const {
+    const char* kJsonWhitespaceChars = " \t\r\n";
+    if (value == NULL) {
+      return -1;
+    }
+    const char* cp = value;
+    cp += strspn(cp, kJsonWhitespaceChars);
+    if (*cp++ != '[') {
+      // Missing initial [.
+      return -1;
+    }
+    bool closed = false;
+    bool element_allowed = true;
+    intptr_t element_count = 0;
+    while (true) {
+      // Skip json whitespace.
+      cp += strspn(cp, kJsonWhitespaceChars);
+      switch (*cp) {
+        case '\0':
+          return closed ? element_count : -1;
+        case ']':
+          closed = true;
+          cp++;
+          break;
+        case ',':
+          if (element_allowed) {
+            return -1;
+          }
+          element_allowed = true;
+          cp++;
+          break;
+        default:
+          if (!element_allowed) {
+            return -1;
+          }
+          bool valid_enum = false;
+          const char* id_start = cp;
+          while (IsEnumChar(*cp)) {
+            cp++;
+          }
+          if (cp == id_start) {
+            // Empty identifier, something like this [,].
+            return -1;
+          }
+          intptr_t id_len = cp - id_start;
+          if (enums_ != NULL) {
+            for (intptr_t i = 0; enums_[i] != NULL; i++) {
+              intptr_t len = strlen(enums_[i]);
+              if (len == id_len && strncmp(id_start, enums_[i], len) == 0) {
+                element_count++;
+                valid_enum = true;
+                element_allowed = false;  // we need a comma first.
+                break;
+              }
+            }
+          }
+          if (!valid_enum) {
+            return -1;
+          }
+          break;
+      }
+    }
+  }
+
+  const char* const* enums_;
+};
+
+#if defined(SUPPORT_TIMELINE)
+static const char* const timeline_streams_enum_names[] = {
+    "all",
+#define DEFINE_NAME(name, unused) #name,
+    TIMELINE_STREAM_LIST(DEFINE_NAME)
+#undef DEFINE_NAME
+        NULL};
+
+static const MethodParameter* const set_vm_timeline_flags_params[] = {
+    NO_ISOLATE_PARAMETER,
+    new EnumListParameter("recordedStreams",
+                          false,
+                          timeline_streams_enum_names),
+    NULL,
+};
+
+static bool HasStream(const char** recorded_streams, const char* stream) {
+  while (*recorded_streams != NULL) {
+    if ((strstr(*recorded_streams, "all") != NULL) ||
+        (strstr(*recorded_streams, stream) != NULL)) {
+      return true;
+    }
+    recorded_streams++;
+  }
+  return false;
+}
+
+bool Service::EnableTimelineStreams(char* categories_list) {
+  const EnumListParameter* recorded_streams_param =
+      static_cast<const EnumListParameter*>(set_vm_timeline_flags_params[1]);
+  const char** streams = recorded_streams_param->Parse(categories_list);
+  if (streams == nullptr) {
+    return false;
+  }
+
+#define SET_ENABLE_STREAM(name, unused)                                        \
+  Timeline::SetStream##name##Enabled(HasStream(streams, #name));
+  TIMELINE_STREAM_LIST(SET_ENABLE_STREAM);
+#undef SET_ENABLE_STREAM
+
+  delete[] streams;
+
+#if !defined(PRODUCT)
+  // Notify clients that the set of subscribed streams has been updated.
+  if (Service::timeline_stream.enabled()) {
+    ServiceEvent event(ServiceEvent::kTimelineStreamSubscriptionsUpdate);
+    Service::HandleEvent(&event);
+  }
+#endif
+
+  return true;
+}
+#endif  // defined(SUPPORT_TIMELINE)
+
 #ifndef PRODUCT
 // The name of this of this vm as reported by the VM service protocol.
 static char* vm_name = NULL;
@@ -220,20 +445,6 @@
   return object.ptr();
 }
 
-static void PrintMissingParamError(JSONStream* js, const char* param) {
-  js->PrintError(kInvalidParams, "%s expects the '%s' parameter", js->method(),
-                 param);
-}
-
-static void PrintInvalidParamError(JSONStream* js, const char* param) {
-  js->PrintError(kInvalidParams, "%s: invalid '%s' parameter: %s", js->method(),
-                 param, js->LookupParam(param));
-}
-
-static void PrintUnrecognizedMethodError(JSONStream* js) {
-  js->PrintError(kMethodNotFound, NULL);
-}
-
 static void PrintSuccess(JSONStream* js) {
   JSONObject jsobj(js);
   jsobj.AddProperty("type", "Success");
@@ -430,39 +641,6 @@
   return class_table->At(cid);
 }
 
-// TODO(johnmccutchan): Split into separate file and write unit tests.
-class MethodParameter {
- public:
-  MethodParameter(const char* name, bool required)
-      : name_(name), required_(required) {}
-
-  virtual ~MethodParameter() {}
-
-  virtual bool Validate(const char* value) const { return true; }
-
-  virtual bool ValidateObject(const Object& value) const { return true; }
-
-  const char* name() const { return name_; }
-
-  bool required() const { return required_; }
-
-  virtual void PrintError(const char* name,
-                          const char* value,
-                          JSONStream* js) const {
-    PrintInvalidParamError(js, name);
-  }
-
-  virtual void PrintErrorObject(const char* name,
-                                const Object& value,
-                                JSONStream* js) const {
-    PrintInvalidParamError(js, name);
-  }
-
- private:
-  const char* name_;
-  bool required_;
-};
-
 class DartStringParameter : public MethodParameter {
  public:
   DartStringParameter(const char* name, bool required)
@@ -483,17 +661,6 @@
   }
 };
 
-class NoSuchParameter : public MethodParameter {
- public:
-  explicit NoSuchParameter(const char* name) : MethodParameter(name, false) {}
-
-  virtual bool Validate(const char* value) const { return (value == NULL); }
-
-  virtual bool ValidateObject(const Object& value) const {
-    return value.IsNull();
-  }
-};
-
 class BoolParameter : public MethodParameter {
  public:
   BoolParameter(const char* name, bool required)
@@ -632,11 +799,6 @@
   }
 };
 
-#define ISOLATE_PARAMETER new IdParameter("isolateId", true)
-#define ISOLATE_GROUP_PARAMETER new IdParameter("isolateGroupId", true)
-#define NO_ISOLATE_PARAMETER new NoSuchParameter("isolateId")
-#define RUNNABLE_ISOLATE_PARAMETER new RunnableIsolateParameter("isolateId")
-
 class EnumParameter : public MethodParameter {
  public:
   EnumParameter(const char* name, bool required, const char* const* enums)
@@ -673,118 +835,6 @@
   return values[i];
 }
 
-class EnumListParameter : public MethodParameter {
- public:
-  EnumListParameter(const char* name, bool required, const char* const* enums)
-      : MethodParameter(name, required), enums_(enums) {}
-
-  virtual bool Validate(const char* value) const {
-    return ElementCount(value) >= 0;
-  }
-
-  const char** Parse(Zone* zone, const char* value_in) const {
-    const char* kJsonChars = " \t\r\n[,]";
-
-    // Make a writeable copy of the value.
-    char* value = zone->MakeCopyOfString(value_in);
-    intptr_t element_count = ElementCount(value);
-    intptr_t element_pos = 0;
-
-    // Allocate our element array.  +1 for NULL terminator.
-    char** elements = zone->Alloc<char*>(element_count + 1);
-    elements[element_count] = NULL;
-
-    // Parse the string destructively.  Build the list of elements.
-    while (element_pos < element_count) {
-      // Skip to the next element.
-      value += strspn(value, kJsonChars);
-
-      intptr_t len = strcspn(value, kJsonChars);
-      ASSERT(len > 0);  // We rely on the parameter being validated already.
-      value[len] = '\0';
-      elements[element_pos++] = value;
-
-      // Advance.  +1 for null terminator.
-      value += (len + 1);
-    }
-    return const_cast<const char**>(elements);
-  }
-
- private:
-  // For now observatory enums are ascii letters plus underscore.
-  static bool IsEnumChar(char c) {
-    return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) ||
-            (c == '_'));
-  }
-
-  // Returns number of elements in the list.  -1 on parse error.
-  intptr_t ElementCount(const char* value) const {
-    const char* kJsonWhitespaceChars = " \t\r\n";
-    if (value == NULL) {
-      return -1;
-    }
-    const char* cp = value;
-    cp += strspn(cp, kJsonWhitespaceChars);
-    if (*cp++ != '[') {
-      // Missing initial [.
-      return -1;
-    }
-    bool closed = false;
-    bool element_allowed = true;
-    intptr_t element_count = 0;
-    while (true) {
-      // Skip json whitespace.
-      cp += strspn(cp, kJsonWhitespaceChars);
-      switch (*cp) {
-        case '\0':
-          return closed ? element_count : -1;
-        case ']':
-          closed = true;
-          cp++;
-          break;
-        case ',':
-          if (element_allowed) {
-            return -1;
-          }
-          element_allowed = true;
-          cp++;
-          break;
-        default:
-          if (!element_allowed) {
-            return -1;
-          }
-          bool valid_enum = false;
-          const char* id_start = cp;
-          while (IsEnumChar(*cp)) {
-            cp++;
-          }
-          if (cp == id_start) {
-            // Empty identifier, something like this [,].
-            return -1;
-          }
-          intptr_t id_len = cp - id_start;
-          if (enums_ != NULL) {
-            for (intptr_t i = 0; enums_[i] != NULL; i++) {
-              intptr_t len = strlen(enums_[i]);
-              if (len == id_len && strncmp(id_start, enums_[i], len) == 0) {
-                element_count++;
-                valid_enum = true;
-                element_allowed = false;  // we need a comma first.
-                break;
-              }
-            }
-          }
-          if (!valid_enum) {
-            return -1;
-          }
-          break;
-      }
-    }
-  }
-
-  const char* const* enums_;
-};
-
 typedef void (*ServiceMethodEntry)(Thread* thread, JSONStream* js);
 
 struct ServiceMethodDescriptor {
@@ -793,6 +843,15 @@
   const MethodParameter* const* parameters;
 };
 
+static void PrintMissingParamError(JSONStream* js, const char* param) {
+  js->PrintError(kInvalidParams, "%s expects the '%s' parameter", js->method(),
+                 param);
+}
+
+static void PrintUnrecognizedMethodError(JSONStream* js) {
+  js->PrintError(kMethodNotFound, NULL);
+}
+
 // TODO(johnmccutchan): Do we reject unexpected parameters?
 static bool ValidateParameters(const MethodParameter* const* parameters,
                                JSONStream* js) {
@@ -1133,14 +1192,6 @@
   }
   PostEvent(event->isolate(), stream_id, event->KindAsCString(), &js,
             enter_safepoint);
-
-  // 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()->buffer()), length);
-  }
 }
 
 void Service::PostEvent(Isolate* isolate,
@@ -1328,17 +1379,6 @@
   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;
@@ -1751,6 +1791,18 @@
     }
     return field.ptr();
   }
+  if (strcmp(parts[2], "field_inits") == 0) {
+    // Field initializer ids look like: "classes/17/field_inits/name"
+    const auto& field = Field::Handle(klass.LookupField(id));
+    if (field.IsNull() || (field.is_late() && !field.has_initializer())) {
+      return Object::sentinel().ptr();
+    }
+    const auto& function = Function::Handle(field.EnsureInitializerFunction());
+    if (function.IsNull()) {
+      return Object::sentinel().ptr();
+    }
+    return function.ptr();
+  }
   if (strcmp(parts[2], "functions") == 0) {
     // Function ids look like: "classes/17/functions/name"
 
@@ -1843,6 +1895,10 @@
     // Library field ids look like: "libraries/17/fields/name"
     return LookupClassMembers(Thread::Current(), klass, parts, num_parts);
   }
+  if (strcmp(parts[2], "field_inits") == 0) {
+    // Library field ids look like: "libraries/17/field_inits/name"
+    return LookupClassMembers(Thread::Current(), klass, parts, num_parts);
+  }
   if (strcmp(parts[2], "functions") == 0) {
     // Library function ids look like: "libraries/17/functions/name"
     return LookupClassMembers(Thread::Current(), klass, parts, num_parts);
@@ -1912,6 +1968,9 @@
   if (strcmp(parts[2], "closures") == 0) {
     // Closure ids look like: "classes/17/closures/11"
     return LookupClassMembers(thread, cls, parts, num_parts);
+  } else if (strcmp(parts[2], "field_inits") == 0) {
+    // Field initializer ids look like: "classes/17/field_inits/name"
+    return LookupClassMembers(thread, cls, parts, num_parts);
   } else if (strcmp(parts[2], "fields") == 0) {
     // Field ids look like: "classes/17/fields/name"
     return LookupClassMembers(thread, cls, parts, num_parts);
@@ -3349,23 +3408,28 @@
     return;
   }
 
-  const char* reports_str = js->LookupParam("reports");
+  char* reports_str = Utils::StrDup(js->LookupParam("reports"));
   const EnumListParameter* reports_parameter =
       static_cast<const EnumListParameter*>(get_source_report_params[1]);
-  const char** reports = reports_parameter->Parse(thread->zone(), reports_str);
+  const char** reports = reports_parameter->Parse(reports_str);
+  const char** riter = reports;
   intptr_t report_set = 0;
-  while (*reports != NULL) {
-    if (strcmp(*reports, SourceReport::kCallSitesStr) == 0) {
+  while (*riter != NULL) {
+    if (strcmp(*riter, SourceReport::kCallSitesStr) == 0) {
       report_set |= SourceReport::kCallSites;
-    } else if (strcmp(*reports, SourceReport::kCoverageStr) == 0) {
+    } else if (strcmp(*riter, SourceReport::kCoverageStr) == 0) {
       report_set |= SourceReport::kCoverage;
-    } else if (strcmp(*reports, SourceReport::kPossibleBreakpointsStr) == 0) {
+    } else if (strcmp(*riter, SourceReport::kPossibleBreakpointsStr) == 0) {
       report_set |= SourceReport::kPossibleBreakpoints;
-    } else if (strcmp(*reports, SourceReport::kProfileStr) == 0) {
+    } else if (strcmp(*riter, SourceReport::kProfileStr) == 0) {
       report_set |= SourceReport::kProfile;
     }
-    reports++;
+    riter++;
   }
+  if (reports != nullptr) {
+    delete[] reports;
+  }
+  free(reports_str);
 
   SourceReport::CompileMode compile_mode = SourceReport::kNoCompile;
   if (BoolParameter::Parse(js->LookupParam("forceCompile"), false)) {
@@ -3803,34 +3867,6 @@
   }
 }
 
-static const char* const timeline_streams_enum_names[] = {
-    "all",
-#define DEFINE_NAME(name, unused) #name,
-    TIMELINE_STREAM_LIST(DEFINE_NAME)
-#undef DEFINE_NAME
-        NULL};
-
-static const MethodParameter* const set_vm_timeline_flags_params[] = {
-    NO_ISOLATE_PARAMETER,
-    new EnumListParameter("recordedStreams",
-                          false,
-                          timeline_streams_enum_names),
-    NULL,
-};
-
-#if defined(SUPPORT_TIMELINE)
-static bool HasStream(const char** recorded_streams, const char* stream) {
-  while (*recorded_streams != NULL) {
-    if ((strstr(*recorded_streams, "all") != NULL) ||
-        (strstr(*recorded_streams, stream) != NULL)) {
-      return true;
-    }
-    recorded_streams++;
-  }
-  return false;
-}
-#endif
-
 static void SetVMTimelineFlags(Thread* thread, JSONStream* js) {
 #if !defined(SUPPORT_TIMELINE)
   PrintSuccess(js);
@@ -3839,23 +3875,9 @@
   ASSERT(isolate != NULL);
   StackZone zone(thread);
 
-  const EnumListParameter* recorded_streams_param =
-      static_cast<const EnumListParameter*>(set_vm_timeline_flags_params[1]);
-
-  const char* recorded_streams_str = js->LookupParam("recordedStreams");
-  const char** recorded_streams =
-      recorded_streams_param->Parse(thread->zone(), recorded_streams_str);
-
-#define SET_ENABLE_STREAM(name, unused)                                        \
-  Timeline::SetStream##name##Enabled(HasStream(recorded_streams, #name));
-  TIMELINE_STREAM_LIST(SET_ENABLE_STREAM);
-#undef SET_ENABLE_STREAM
-
-  // Notify clients that the set of subscribed streams has been updated.
-  if (Service::timeline_stream.enabled()) {
-    ServiceEvent event(ServiceEvent::kTimelineStreamSubscriptionsUpdate);
-    Service::HandleEvent(&event);
-  }
+  char* recorded_streams = Utils::StrDup(js->LookupParam("recordedStreams"));
+  Service::EnableTimelineStreams(recorded_streams);
+  free(recorded_streams);
 
   PrintSuccess(js);
 #endif
@@ -4501,7 +4523,7 @@
   event.set_embedder_kind(event_kind);
   event.set_embedder_stream_id(stream_id);
   event.set_bytes(bytes, bytes_len);
-  Service::HandleEvent(&event);
+  Service::HandleEvent(&event, /*enter_safepoint=*/false);
 }
 
 void Service::SendLogEvent(Isolate* isolate,
@@ -5142,6 +5164,44 @@
   PrintSuccess(js);
 }
 
+static const MethodParameter* const set_isolate_pause_mode_params[] = {
+    ISOLATE_PARAMETER,
+    new EnumParameter("exceptionPauseMode", false, exception_pause_mode_names),
+    new BoolParameter("shouldPauseOnExit", false),
+    nullptr,
+};
+
+static void SetIsolatePauseMode(Thread* thread, JSONStream* js) {
+  bool state_changed = false;
+  const char* exception_pause_mode = js->LookupParam("exceptionPauseMode");
+  if (exception_pause_mode != nullptr) {
+    Dart_ExceptionPauseInfo info =
+        EnumMapper(exception_pause_mode, exception_pause_mode_names,
+                   exception_pause_mode_values);
+    if (info == kInvalidExceptionPauseInfo) {
+      PrintInvalidParamError(js, "exceptionPauseMode");
+      return;
+    }
+    Isolate* isolate = thread->isolate();
+    isolate->debugger()->SetExceptionPauseInfo(info);
+    state_changed = true;
+  }
+
+  const char* pause_isolate_on_exit = js->LookupParam("shouldPauseOnExit");
+  if (pause_isolate_on_exit != nullptr) {
+    bool enable = BoolParameter::Parse(pause_isolate_on_exit, false);
+    thread->isolate()->message_handler()->set_should_pause_on_exit(enable);
+    state_changed = true;
+  }
+
+  if (state_changed && Service::debug_stream.enabled()) {
+    ServiceEvent event(thread->isolate(),
+                       ServiceEvent::kDebuggerSettingsUpdate);
+    Service::HandleEvent(&event);
+  }
+  PrintSuccess(js);
+}
+
 static const MethodParameter* const set_breakpoint_state_params[] = {
     ISOLATE_PARAMETER,
     new IdParameter("breakpointId", true),
@@ -5558,6 +5618,8 @@
     set_breakpoint_state_params },
   { "setExceptionPauseMode", SetExceptionPauseMode,
     set_exception_pause_mode_params },
+  { "setIsolatePauseMode", SetIsolatePauseMode,
+    set_isolate_pause_mode_params },
   { "setFlag", SetFlag,
     set_flags_params },
   { "setLibraryDebuggable", SetLibraryDebuggable,
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index c3fe1f2..c31b191 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 52
+#define SERVICE_PROTOCOL_MINOR_VERSION 54
 
 class Array;
 class EmbedderServiceHandler;
@@ -75,15 +75,9 @@
   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 {
@@ -116,9 +110,6 @@
       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);
 
@@ -161,6 +152,10 @@
                         const Instance& id,
                         const Error& error);
 
+  // Enable/Disable timeline categories.
+  // Returns True if the categories were successfully enabled, False otherwise.
+  static bool EnableTimelineStreams(char* categories_list);
+
   // Well-known streams.
   static StreamInfo vm_stream;
   static StreamInfo isolate_stream;
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index ba4add1..6a04228 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.52
+# Dart VM Service Protocol 3.54
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.52_ of the Dart VM Service Protocol. This
+This document describes of _version 3.54_ 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.
@@ -1378,6 +1378,7 @@
 ### setExceptionPauseMode
 
 ```
+@deprecated('Use setIsolatePauseMode instead')
 Success|Sentinel setExceptionPauseMode(string isolateId,
                                        ExceptionPauseMode mode)
 ```
@@ -1394,6 +1395,31 @@
 If _isolateId_ refers to an isolate which has exited, then the
 _Collected_ [Sentinel](#sentinel) is returned.
 
+### setIsolatePauseMode
+
+```
+Success|Sentinel setIsolatePauseMode(string isolateId,
+                                     ExceptionPauseMode exceptionPauseMode [optional],
+                                     bool shouldPauseOnExit [optional])
+```
+
+The _setIsolatePauseMode_ RPC is used to control if or when an isolate will
+pause due to a change in execution state.
+
+The _shouldPauseOnExit_ parameter specify whether the target isolate should pause on exit.
+
+The _setExceptionPauseMode_ RPC is used to control if an isolate pauses when
+an exception is thrown.
+
+mode | meaning
+---- | -------
+None | Do not pause isolate on thrown exceptions
+Unhandled | Pause isolate on unhandled exceptions
+All  | Pause isolate on all thrown exceptions
+
+If _isolateId_ refers to an isolate which has exited, then the
+_Collected_ [Sentinel](#sentinel) is returned.
+
 ### setFlag
 
 ```
@@ -1420,6 +1446,7 @@
    provided value. If set to false when the profiler is already running, the
    profiler will be stopped but may not free its sample buffer depending on
    platform limitations.
+ * Isolate pause settings will only be applied to newly spawned isolates.
 
 See [Success](#success).
 
@@ -1960,6 +1987,46 @@
 
 See [getCpuSamples](#getcpusamples) and [CpuSample](#cpusample).
 
+### CpuSamplesEvent
+
+```
+class CpuSamplesEvent {
+  // The sampling rate for the profiler in microseconds.
+  int samplePeriod;
+
+  // The maximum possible stack depth for samples.
+  int maxStackDepth;
+
+  // The number of samples returned.
+  int sampleCount;
+
+  // The timespan the set of returned samples covers, in microseconds (deprecated).
+  //
+  // Note: this property is deprecated and will always return -1. Use `timeExtentMicros`
+  // instead.
+  int timeSpan;
+
+  // The start of the period of time in which the returned samples were
+  // collected.
+  int timeOriginMicros;
+
+  // The duration of time covered by the returned samples.
+  int timeExtentMicros;
+
+  // The process ID for the VM.
+  int pid;
+
+  // A list of references to functions seen in the relevant samples. These references can
+  // be looked up using the indicies provided in a `CpuSample` `stack` to determine
+  // which function was on the stack.
+  (@Object|NativeFunction)[] functions;
+
+  // A list of samples collected in the range
+  // `[timeOriginMicros, timeOriginMicros + timeExtentMicros]`
+  CpuSample[] samples;
+}
+```
+
 ### CpuSample
 
 ```
@@ -2224,7 +2291,7 @@
   string previousTag [optional];
 
   // A CPU profile containing recent samples.
-  CpuSamples cpuSamples [optional];
+  CpuSamplesEvent cpuSamples [optional];
 }
 ```
 
@@ -4235,4 +4302,7 @@
 3.50 | Added `returnType`, `parameters`, and `typeParameters` to `@Instance`, and `implicit` to `@Function`. Added `Parameter` type.
 3.51 | Added optional `reportLines` parameter to `getSourceReport` RPC.
 3.52 | Added `lookupResolvedPackageUris` and `lookupPackageUris` RPCs and `UriList` type.
+3.53 | Added `setIsolatePauseMode` RPC.
+3.54 | Added `CpuSamplesEvent`, updated `cpuSamples` property on `Event` to have type `CpuSamplesEvent`.
+
 [discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
diff --git a/runtime/vm/service_event.cc b/runtime/vm/service_event.cc
index 85740cf..120a1dc 100644
--- a/runtime/vm/service_event.cc
+++ b/runtime/vm/service_event.cc
@@ -20,7 +20,9 @@
     : ServiceEvent(isolate_group, nullptr, event_kind) {}
 
 ServiceEvent::ServiceEvent(Isolate* isolate, EventKind event_kind)
-    : ServiceEvent(isolate->group(), isolate, event_kind) {}
+    : ServiceEvent(isolate != nullptr ? isolate->group() : nullptr,
+                   isolate,
+                   event_kind) {}
 
 ServiceEvent::ServiceEvent(IsolateGroup* isolate_group,
                            Isolate* isolate,
@@ -307,7 +309,8 @@
 
   if (kind() == kCpuSamples) {
     JSONObject cpu_profile(&jsobj, "cpuSamples");
-    cpu_profile_->PrintProfileJSON(&cpu_profile, false);
+    cpu_profile_->PrintProfileJSON(&cpu_profile, /*include_code_samples=*/false,
+                                   /*is_event=*/true);
   }
 }
 
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index d17cb92..6b52eae 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -3696,14 +3696,14 @@
   // Restore pool pointer.
   int32_t code =
       *reinterpret_cast<int32_t*>(fp + kPcMarkerSlotFromFp * kWordSize);
-  int32_t pp = (FLAG_precompiled_mode && FLAG_use_bare_instructions)
+  int32_t pp = FLAG_precompiled_mode
                    ? static_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);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     set_register(DISPATCH_TABLE_REG,
                  reinterpret_cast<int32_t>(thread->dispatch_table_array()));
   }
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index b3c53a8..056678d 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -3741,7 +3741,7 @@
   // Restore pool pointer.
   int64_t code =
       *reinterpret_cast<int64_t*>(fp + kPcMarkerSlotFromFp * kWordSize);
-  int64_t pp = (FLAG_precompiled_mode && FLAG_use_bare_instructions)
+  int64_t pp = FLAG_precompiled_mode
                    ? static_cast<int64_t>(thread->global_object_pool())
                    : *reinterpret_cast<int64_t*>(
                          code + Code::object_pool_offset() - kHeapObjectTag);
@@ -3752,7 +3752,7 @@
       NULL, HEAP_BITS,
       (thread->write_barrier_mask() << 32) | (thread->heap_base() >> 32));
   set_register(NULL, NULL_REG, static_cast<int64_t>(Object::null()));
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     set_register(NULL, DISPATCH_TABLE_REG,
                  reinterpret_cast<int64_t>(thread->dispatch_table_array()));
   }
diff --git a/runtime/vm/source_report.cc b/runtime/vm/source_report.cc
index ede8d64..ebb4788 100644
--- a/runtime/vm/source_report.cc
+++ b/runtime/vm/source_report.cc
@@ -115,6 +115,36 @@
     // function failed to compile.
     return true;
   }
+
+  // There is an idiom where static utility classes are given a private
+  // constructor to prevent the the class from being instantiated. Ignore these
+  // constructors so that they don't lower the coverage rate. See #47021.
+  SafepointReadRwLocker ml(thread_, thread_->isolate_group()->program_lock());
+  if (func.kind() == UntaggedFunction::kConstructor &&
+      func.NumParameters() == func.NumImplicitParameters() &&
+      func.IsPrivate()) {
+    // Check that the class has no non-static members and no subclasses.
+    Class& cls = Class::Handle(func.Owner());
+    GrowableObjectArray& subclasses =
+        GrowableObjectArray::Handle(cls.direct_subclasses());
+    if (cls.is_abstract() && !cls.HasInstanceFields() &&
+        (subclasses.IsNull() || subclasses.Length() == 0)) {
+      // Check that the constructor is the only non-static function.
+      Array& clsFuncs = Array::Handle(cls.functions());
+      Function& otherFunc = Function::Handle();
+      intptr_t numNonStaticFunctions = 0;
+      for (intptr_t i = 0; i < clsFuncs.Length(); ++i) {
+        otherFunc ^= clsFuncs.At(i);
+        if (!otherFunc.IsStaticFunction()) {
+          ++numNonStaticFunctions;
+        }
+      }
+      if (numNonStaticFunctions == 1) {
+        return true;
+      }
+    }
+  }
+
   return false;
 }
 
@@ -232,6 +262,27 @@
   return line;
 }
 
+bool SourceReport::ShouldCoverageSkipCallSite(const ICData* ic_data) {
+  if (ic_data == NULL) return true;
+  if (!ic_data->is_static_call()) return false;
+  Function& func = Function::Handle(ic_data->GetTargetAt(0));
+
+  // Ignore calls to the LateError functions. These are used to throw errors to
+  // do with late variables. These errors shouldn't be hit in working code, so
+  // shouldn't count against the coverage total.
+  // See https://github.com/dart-lang/coverage/issues/341
+  if (late_error_class_id_ == ClassId::kIllegalCid) {
+    const Class& lateErrorClass =
+        Class::Handle(Library::LookupCoreClass(Symbols::LateError()));
+    late_error_class_id_ = lateErrorClass.id();
+  }
+  Class& cls = Class::Handle(func.Owner());
+  if (late_error_class_id_ == cls.id()) {
+    return true;
+  }
+  return false;
+}
+
 void SourceReport::PrintCoverageData(JSONObject* jsobj,
                                      const Function& function,
                                      const Code& code) {
@@ -285,7 +336,7 @@
     HANDLESCOPE(thread());
     ASSERT(iter.DeoptId() < ic_data_array->length());
     const ICData* ic_data = (*ic_data_array)[iter.DeoptId()];
-    if (ic_data != NULL) {
+    if (!ShouldCoverageSkipCallSite(ic_data)) {
       const TokenPosition& token_pos = iter.TokenPos();
       update_coverage(token_pos, ic_data->AggregateCount() > 0);
     }
diff --git a/runtime/vm/source_report.h b/runtime/vm/source_report.h
index 070ca0a..874f682 100644
--- a/runtime/vm/source_report.h
+++ b/runtime/vm/source_report.h
@@ -66,6 +66,7 @@
   bool IsReportRequested(ReportKind report_kind);
   bool ShouldSkipFunction(const Function& func);
   bool ShouldSkipField(const Field& field);
+  bool ShouldCoverageSkipCallSite(const ICData* ic_data);
   intptr_t GetScriptIndex(const Script& script);
   bool ScriptIsLoadedByLibrary(const Script& script, const Library& lib);
   intptr_t GetTokenPosOrLine(const Script& script,
@@ -139,6 +140,7 @@
   GrowableArray<ScriptTableEntry*> script_table_entries_;
   DirectChainedHashMap<ScriptTableTrait> script_table_;
   intptr_t next_script_index_;
+  intptr_t late_error_class_id_ = ClassId::kIllegalCid;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/source_report_test.cc b/runtime/vm/source_report_test.cc
index 00c4c2e..b21c588 100644
--- a/runtime/vm/source_report_test.cc
+++ b/runtime/vm/source_report_test.cc
@@ -819,6 +819,252 @@
       buffer);
 }
 
+ISOLATE_UNIT_TEST_CASE(SourceReport_Coverage_Issue47017_Assert) {
+  // WARNING: This MUST be big enough for the serialised JSON string.
+  const int kBufferSize = 1024;
+  char buffer[kBufferSize];
+  const char* kScript =
+      "void foo(Object? bar) {\n"
+      "  assert(bar == null);\n"
+      "}\n"
+      "void main() {\n"
+      "  foo(null);\n"
+      "}\n";
+
+  Library& lib = Library::Handle();
+  const bool old_asserts = IsolateGroup::Current()->asserts();
+  IsolateGroup::Current()->set_asserts(true);
+  lib ^= ExecuteScript(kScript);
+  IsolateGroup::Current()->set_asserts(old_asserts);
+  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);
+  const char* json_str = js.ToCString();
+  ASSERT(strlen(json_str) < kBufferSize);
+  ElideJSONSubstring("classes", json_str, buffer);
+  ElideJSONSubstring("libraries", buffer, buffer);
+  EXPECT_STREQ(
+      "{\"type\":\"SourceReport\",\"ranges\":["
+
+      // Foo is hit, and the assert is hit.
+      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":47,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[0,33],\"misses\":[]}},"
+
+      // Main is hit.
+      "{\"scriptIndex\":0,\"startPos\":49,\"endPos\":76,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[49,65],\"misses\":[]}}],"
+
+      // Only one script in the script table.
+      "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
+      buffer);
+}
+
+ISOLATE_UNIT_TEST_CASE(SourceReport_Coverage_Issue47021_StaticOnlyClasses) {
+  // WARNING: This MUST be big enough for the serialised JSON string.
+  const int kBufferSize = 2048;
+  char buffer[kBufferSize];
+  const char* kScript =
+      "abstract class AllStatic {\n"
+      "  AllStatic._();\n"
+      "  static int test() => 123;\n"
+      "  static int foo = 456;\n"
+      "}\n"
+      "class NotAbstract {\n"
+      "  NotAbstract._();\n"
+      "  static int test() => 123;\n"
+      "  static int foo = 456;\n"
+      "}\n"
+      "abstract class NotConstructor {\n"
+      "  void _() {}\n"
+      "  static int test() => 123;\n"
+      "}\n"
+      "abstract class NotPrivate {\n"
+      "  NotPrivate();\n"
+      "  static int test() => 123;\n"
+      "}\n"
+      "abstract class HasParams {\n"
+      "  HasParams._(int i);\n"
+      "  static int test() => 123;\n"
+      "}\n"
+      "abstract class HasFields {\n"
+      "  HasFields._();\n"
+      "  static int test() => 123;\n"
+      "  int foo = 0;\n"
+      "}\n"
+      "abstract class HasNonStaticFunction {\n"
+      "  HasNonStaticFunction._();\n"
+      "  static int test() => 123;\n"
+      "  int foo() => 456;\n"
+      "}\n"
+      "abstract class HasSubclass {\n"
+      "  HasSubclass._();\n"
+      "  static int test() => 123;\n"
+      "  static int foo = 456;\n"
+      "}\n"
+      "abstract class Subclass extends HasSubclass {\n"
+      "  Subclass() : super._();\n"
+      "}\n"
+      "void main() {\n"
+      "  AllStatic.test();\n"
+      "  NotAbstract.test();\n"
+      "  NotConstructor.test();\n"
+      "  NotPrivate.test();\n"
+      "  HasParams.test();\n"
+      "  HasFields.test();\n"
+      "  HasNonStaticFunction.test();\n"
+      "  HasSubclass.test();\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);
+  const char* json_str = js.ToCString();
+  ASSERT(strlen(json_str) < kBufferSize);
+  ElideJSONSubstring("classes", json_str, buffer);
+  ElideJSONSubstring("libraries", buffer, buffer);
+  EXPECT_STREQ(
+      "{\"type\":\"SourceReport\",\"ranges\":["
+
+      // Subclass() is missed.
+      "{\"scriptIndex\":0,\"startPos\":775,\"endPos\":797,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[775,794]}},"
+
+      // AllStatic.test() is hit. AllStatic._() is ignored (would be pos: 29).
+      "{\"scriptIndex\":0,\"startPos\":46,\"endPos\":70,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[46],\"misses\":[]}},"
+
+      // HasSubclass._() is missed, not ignored.
+      "{\"scriptIndex\":0,\"startPos\":656,\"endPos\":671,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[656]}},"
+
+      // HasSubclass.test() is hit.
+      "{\"scriptIndex\":0,\"startPos\":675,\"endPos\":699,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[675],\"misses\":[]}},"
+
+      // HasParams._(int i) is missed, not ignored.
+      "{\"scriptIndex\":0,\"startPos\":370,\"endPos\":388,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[370]}},"
+
+      // HasParams.test() is hit.
+      "{\"scriptIndex\":0,\"startPos\":392,\"endPos\":416,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[392],\"misses\":[]}},"
+
+      // NotAbstract._() is missed, not ignored.
+      "{\"scriptIndex\":0,\"startPos\":120,\"endPos\":135,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[120]}},"
+
+      // NotAbstract.test() is hit.
+      "{\"scriptIndex\":0,\"startPos\":139,\"endPos\":163,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[139],\"misses\":[]}},"
+
+      // HasFields._() is missed, not ignored.
+      "{\"scriptIndex\":0,\"startPos\":449,\"endPos\":462,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[449]}},"
+
+      // HasFields.test() is hit.
+      "{\"scriptIndex\":0,\"startPos\":466,\"endPos\":490,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[466],\"misses\":[]}},"
+
+      // NotPrivate() is missed, not ignored.
+      "{\"scriptIndex\":0,\"startPos\":297,\"endPos\":309,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[297]}},"
+
+      // NotPrivate.test() is hit.
+      "{\"scriptIndex\":0,\"startPos\":313,\"endPos\":337,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[313],\"misses\":[]}},"
+
+      // HasNonStaticFunction._() is missed, not ignored.
+      "{\"scriptIndex\":0,\"startPos\":549,\"endPos\":573,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[549]}},"
+
+      // HasNonStaticFunction.test() is hit.
+      "{\"scriptIndex\":0,\"startPos\":577,\"endPos\":601,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[577],\"misses\":[]}},"
+
+      // HasNonStaticFunction.foo() is missed.
+      "{\"scriptIndex\":0,\"startPos\":605,\"endPos\":621,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[605]}},"
+
+      // NotConstructor._() is missed, not ignored.
+      "{\"scriptIndex\":0,\"startPos\":225,\"endPos\":235,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[225]}},"
+
+      // NotConstructor.test() is hit.
+      "{\"scriptIndex\":0,\"startPos\":239,\"endPos\":263,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[239],\"misses\":[]}},"
+
+      // Main is hit.
+      "{\"scriptIndex\":0,\"startPos\":801,\"endPos\":996,\"compiled\":true,"
+      "\"coverage\":{\"hits\":"
+      "[801,827,849,874,895,915,935,966,988],\"misses\":[]}}],"
+
+      // Only one script in the script table.
+      "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
+      buffer);
+}
+
+ISOLATE_UNIT_TEST_CASE(SourceReport_Coverage_IssueCov341_LateFinalVars) {
+  // https://github.com/dart-lang/coverage/issues/341
+  // WARNING: This MUST be big enough for the serialised JSON string.
+  const int kBufferSize = 1024;
+  char buffer[kBufferSize];
+  const char* kScript =
+      "int foo(bool bar) {\n"
+      "  late final int baz;\n"
+      "  if (bar) {\n"
+      "    baz = 123;\n"
+      "  } else {\n"
+      "    baz = 456;\n"
+      "  }\n"
+      "  return baz;\n"
+      "}\n"
+      "main() {\n"
+      "  foo(true);\n"
+      "  foo(false);\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);
+  const char* json_str = js.ToCString();
+  ASSERT(strlen(json_str) < kBufferSize);
+  ElideJSONSubstring("classes", json_str, buffer);
+  ElideJSONSubstring("libraries", buffer, buffer);
+  EXPECT_STREQ(
+      "{\"type\":\"SourceReport\",\"ranges\":["
+
+      // foo is hit, but the late variable sets and gets are ignored.
+      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":114,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[0],\"misses\":[]}},"
+
+      // Main is hit.
+      "{\"scriptIndex\":0,\"startPos\":116,\"endPos\":152,\"compiled\":true,\""
+      "coverage\":{\"hits\":[116,127,140],\"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 2e35cce..e1fe0b4 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -93,11 +93,11 @@
   compiler::target::frame_layout = default_frame_layout;
   runtime_frame_layout = default_frame_layout;
 
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     compiler::target::frame_layout = bare_instructions_frame_layout;
   }
 #if defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     compiler::target::frame_layout = invalid_frame_layout;
     runtime_frame_layout = bare_instructions_frame_layout;
   }
@@ -105,7 +105,7 @@
 }
 
 bool StackFrame::IsBareInstructionsDartFrame() const {
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     return false;
   }
   NoSafepointScope no_safepoint;
@@ -123,7 +123,7 @@
 }
 
 bool StackFrame::IsBareInstructionsStubFrame() const {
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     return false;
   }
   NoSafepointScope no_safepoint;
@@ -141,7 +141,7 @@
 }
 
 bool StackFrame::IsStubFrame() const {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     return IsBareInstructionsStubFrame();
   }
 
@@ -208,7 +208,7 @@
   CompressedStackMaps maps;
   uword code_start;
 
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     maps = ReversePc::FindCompressedStackMaps(isolate_group(), pc(),
                                               /*is_return_address=*/true,
                                               &code_start);
@@ -290,7 +290,7 @@
     // to an osr function. In each of these cases, all stack slots contain
     // tagged pointers, so fall through.
 #if defined(DEBUG)
-    if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    if (FLAG_precompiled_mode) {
       ASSERT(IsStubFrame());
     } else {
       ASSERT(!code.is_optimized() ||
@@ -337,7 +337,7 @@
 
 CodePtr StackFrame::GetCodeObject() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     NoSafepointScope no_safepoint;
     CodePtr code = ReversePc::Lookup(isolate_group(), pc(),
                                      /*is_return_address=*/true);
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 1cb2a07..6303447 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -195,20 +195,18 @@
     Precompiler* precompiler = Precompiler::Instance();
 
     compiler::ObjectPoolBuilder* wrapper =
-        FLAG_use_bare_instructions && precompiler != NULL
-            ? precompiler->global_object_pool_builder()
-            : &object_pool_builder;
+        precompiler != NULL ? precompiler->global_object_pool_builder()
+                            : &object_pool_builder;
 
-    const auto pool_attachment =
-        FLAG_precompiled_mode && FLAG_use_bare_instructions
-            ? Code::PoolAttachment::kNotAttachPool
-            : Code::PoolAttachment::kAttachPool;
+    const auto pool_attachment = FLAG_precompiled_mode
+                                     ? Code::PoolAttachment::kNotAttachPool
+                                     : Code::PoolAttachment::kAttachPool;
 
     auto zone = thread->zone();
     auto object_store = thread->isolate_group()->object_store();
     auto& allocate_object_stub = Code::ZoneHandle(zone);
     auto& allocate_object_parametrized_stub = Code::ZoneHandle(zone);
-    if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    if (FLAG_precompiled_mode) {
       allocate_object_stub = object_store->allocate_object_stub();
       allocate_object_parametrized_stub =
           object_store->allocate_object_parametrized_stub();
diff --git a/runtime/vm/stub_code_list.h b/runtime/vm/stub_code_list.h
index 64b36a9..fa7b06b 100644
--- a/runtime/vm/stub_code_list.h
+++ b/runtime/vm/stub_code_list.h
@@ -127,6 +127,8 @@
   V(ExitSafepoint)                                                             \
   V(CallNativeThroughSafepoint)                                                \
   V(InitStaticField)                                                           \
+  V(InitLateStaticField)                                                       \
+  V(InitLateFinalStaticField)                                                  \
   V(InitInstanceField)                                                         \
   V(InitLateInstanceField)                                                     \
   V(InitLateFinalInstanceField)                                                \
diff --git a/runtime/vm/symbols.cc b/runtime/vm/symbols.cc
index 673f26e..a60edfa 100644
--- a/runtime/vm/symbols.cc
+++ b/runtime/vm/symbols.cc
@@ -401,11 +401,6 @@
     // cases.
     if (thread->IsAtSafepoint()) {
       RELEASE_ASSERT(group->safepoint_handler()->IsOwnedByTheThread(thread));
-      // In DEBUG mode the snapshot writer also calls this method inside a
-      // safepoint.
-#if !defined(DEBUG)
-      RELEASE_ASSERT(FLAG_enable_isolate_groups || !USING_PRODUCT);
-#endif
       data = object_store->symbol_table();
       CanonicalStringSet table(&key, &value, &data);
       symbol ^= table.GetOrNull(str);
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index ee81b99..50640ad 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -470,7 +470,8 @@
   V(vm_trace_entrypoints, "vm:testing.unsafe.trace-entrypoints-fn")            \
   V(vm_ffi_struct_fields, "vm:ffi:struct-fields")                              \
   V(vm_unsafe_no_interrupts, "vm:unsafe:no-interrupts")                        \
-  V(vm_external_name, "vm:external-name")
+  V(vm_external_name, "vm:external-name")                                      \
+  V(vm_testing_print_flow_graph, "vm:testing:print-flow-graph")
 
 // Contains a list of frequently used strings in a canonicalized form. This
 // list is kept in the vm_isolate in order to share the copy across isolates
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 6824dd8..1eb3222 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -474,8 +474,10 @@
   // Has |this| exited Dart code?
   bool HasExitedDartCode() const;
 
+  bool HasCompilerState() const { return compiler_state_ != nullptr; }
+
   CompilerState& compiler_state() {
-    ASSERT(compiler_state_ != nullptr);
+    ASSERT(HasCompilerState());
     return *compiler_state_;
   }
 
diff --git a/runtime/vm/thread_barrier.h b/runtime/vm/thread_barrier.h
index 0b422f7..810a711 100644
--- a/runtime/vm/thread_barrier.h
+++ b/runtime/vm/thread_barrier.h
@@ -46,71 +46,55 @@
 //
 class ThreadBarrier {
  public:
-  explicit ThreadBarrier(intptr_t num_threads,
-                         Monitor* monitor,
-                         Monitor* done_monitor)
-      : num_threads_(num_threads),
-        monitor_(monitor),
-        remaining_(num_threads),
-        parity_(false),
-        done_monitor_(done_monitor),
-        done_(false) {
-    ASSERT(remaining_ > 0);
+  explicit ThreadBarrier(intptr_t num_threads, intptr_t initial = 0)
+      : ref_count_(num_threads),
+        monitor_(),
+        participating_(initial),
+        remaining_(initial),
+        generation_(0) {}
+
+  bool TryEnter() {
+    MonitorLocker ml(&monitor_);
+    if (generation_ != 0) {
+      return false;
+    }
+    remaining_++;
+    participating_++;
+    return true;
   }
 
   void Sync() {
-    MonitorLocker ml(monitor_);
-    ASSERT(remaining_ > 0);
-    if (--remaining_ > 0) {
-      // I'm not last to arrive; wait until next round.
-      bool old_parity = parity_;
-      while (parity_ == old_parity) {
+    MonitorLocker ml(&monitor_);
+    const intptr_t g = generation_;
+    remaining_--;
+    if (remaining_ == 0) {
+      // I'm last, advance to the next generation and wake the others.
+      generation_++;
+      remaining_ = participating_;
+      ml.NotifyAll();
+    } else {
+      // Waiting for others.
+      while (g == generation_) {
         ml.Wait();
       }
-    } else {
-      // Last one to arrive initiates the next round.
-      remaining_ = num_threads_;
-      parity_ = !parity_;
-      // Tell everyone else about the new round.
-      ml.NotifyAll();
     }
   }
 
-  void Exit() {
-    bool last = false;
-    {
-      MonitorLocker ml(monitor_);
-      ASSERT(remaining_ > 0);
-      last = (--remaining_ == 0);
+  void Release() {
+    intptr_t old = ref_count_.fetch_sub(1, std::memory_order_acq_rel);
+    ASSERT(old > 0);
+    if (old == 1) {
+      delete this;
     }
-    if (last) {
-      // Last one to exit sets done_.
-      MonitorLocker ml(done_monitor_);
-      ASSERT(!done_);
-      done_ = true;
-      // Tell the destructor in case it's already waiting.
-      ml.Notify();
-    }
-  }
-
-  ~ThreadBarrier() {
-    MonitorLocker ml(done_monitor_);
-    // Wait for everyone to exit before destroying the monitors.
-    while (!done_) {
-      ml.Wait();
-    }
-    ASSERT(remaining_ == 0);
   }
 
  private:
-  const intptr_t num_threads_;
+  std::atomic<intptr_t> ref_count_;
 
-  Monitor* monitor_;
+  Monitor monitor_;
+  intptr_t participating_;
   intptr_t remaining_;
-  bool parity_;
-
-  Monitor* done_monitor_;  // TODO(koda): Try to optimize this away.
-  bool done_;
+  intptr_t generation_;
 
   DISALLOW_COPY_AND_ASSIGN(ThreadBarrier);
 };
diff --git a/runtime/vm/thread_barrier_test.cc b/runtime/vm/thread_barrier_test.cc
index c937eeb2..48e4020 100644
--- a/runtime/vm/thread_barrier_test.cc
+++ b/runtime/vm/thread_barrier_test.cc
@@ -20,7 +20,7 @@
       RandomSleep();
       barrier_->Sync();
     }
-    barrier_->Exit();
+    barrier_->Release();
   }
 
  private:
@@ -40,21 +40,14 @@
   static const intptr_t kNumTasks = 5;
   static const intptr_t kNumRounds = 500;
 
-  Monitor* monitor = new Monitor();
-  Monitor* monitor_done = new Monitor();
-  {
-    ThreadBarrier barrier(kNumTasks + 1, monitor, monitor_done);
-    for (intptr_t i = 0; i < kNumTasks; ++i) {
-      Dart::thread_pool()->Run<FuzzTask>(kNumRounds, &barrier, i + 1);
-    }
-    for (intptr_t i = 0; i < kNumRounds; ++i) {
-      barrier.Sync();
-    }
-    barrier.Exit();
+  ThreadBarrier* barrier = new ThreadBarrier(kNumTasks + 1, kNumTasks + 1);
+  for (intptr_t i = 0; i < kNumTasks; ++i) {
+    Dart::thread_pool()->Run<FuzzTask>(kNumRounds, barrier, i + 1);
   }
-
-  delete monitor_done;
-  delete monitor;
+  for (intptr_t i = 0; i < kNumRounds; ++i) {
+    barrier->Sync();
+  }
+  barrier->Release();
 }
 
 }  // namespace dart
diff --git a/runtime/vm/thread_pool.cc b/runtime/vm/thread_pool.cc
index 93df2ff..f450555 100644
--- a/runtime/vm/thread_pool.cc
+++ b/runtime/vm/thread_pool.cc
@@ -82,6 +82,22 @@
 }
 
 bool ThreadPool::RunImpl(std::unique_ptr<Task> task) {
+  Dart_PostTaskCallback post_task = Dart::post_task_callback();
+  if (post_task != nullptr) {
+    {
+      MonitorLocker ml(&pool_monitor_);
+      if (shutting_down_) {
+        return false;
+      }
+    }
+    Dart_TaskData data;
+    data.priority = Dart_TaskPriority_Default;
+    data.time_point = 0;
+    post_task(Dart::post_task_data(),
+              reinterpret_cast<Dart_Task>(task.release()), data);
+    return true;
+  }
+
   Worker* new_worker = nullptr;
   {
     MonitorLocker ml(&pool_monitor_);
diff --git a/runtime/vm/timeline.cc b/runtime/vm/timeline.cc
index ab0d62a..386178e 100644
--- a/runtime/vm/timeline.cc
+++ b/runtime/vm/timeline.cc
@@ -1441,7 +1441,9 @@
   JSONArray events(js);
   for (intptr_t i = 0; i < length(); i++) {
     const TimelineEvent* event = At(i);
-    events.AddValue(event);
+    if (event->IsValid()) {
+      events.AddValue(event);
+    }
   }
 }
 #endif
diff --git a/runtime/vm/type_testing_stubs.cc b/runtime/vm/type_testing_stubs.cc
index 6b1780f..785e536 100644
--- a/runtime/vm/type_testing_stubs.cc
+++ b/runtime/vm/type_testing_stubs.cc
@@ -255,7 +255,7 @@
   ASSERT(!type_class.IsNull());
 
   auto& slow_tts_stub = Code::ZoneHandle(zone);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     slow_tts_stub = thread->isolate_group()->object_store()->slow_tts_stub();
   }
 
@@ -273,9 +273,8 @@
 
             const char* name = namer_.StubNameForType(type);
             const auto pool_attachment =
-                FLAG_use_bare_instructions
-                    ? Code::PoolAttachment::kNotAttachPool
-                    : Code::PoolAttachment::kAttachPool;
+                FLAG_precompiled_mode ? Code::PoolAttachment::kNotAttachPool
+                                      : Code::PoolAttachment::kAttachPool;
 
             Code& code = Code::Handle(thread->zone());
             auto install_code_fun = [&]() {
diff --git a/sdk/bin/dartanalyzer b/sdk/bin/dartanalyzer
index 0574603..6525627 100755
--- a/sdk/bin/dartanalyzer
+++ b/sdk/bin/dartanalyzer
@@ -6,6 +6,8 @@
 # Run dartanalyzer.dart on the Dart VM. This script assumes the Dart repo's
 # directory structure.
 
+echo "Warning: 'dartanalyzer' is deprecated. Please use 'dart analyze'." 1>&2
+
 function follow_links() {
   file="$1"
   while [ -h "$file" ]; do
diff --git a/sdk/bin/dartanalyzer.bat b/sdk/bin/dartanalyzer.bat
index efa3a6a..122e9b3 100644
--- a/sdk/bin/dartanalyzer.bat
+++ b/sdk/bin/dartanalyzer.bat
@@ -3,6 +3,8 @@
 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.
 
+echo Warning: 'dartanalyzer' is deprecated. Please use 'dart analyze'. 1>&2
+
 setlocal
 rem Handle the case where dart-sdk/bin has been symlinked to.
 set DIR_NAME_WITH_SLASH=%~dp0
diff --git a/sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart b/sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart
index 2a991c9..b9cf805 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart
@@ -195,11 +195,6 @@
   }
 }
 
-@patch
-void _rethrow(Object error, StackTrace stackTrace) {
-  JS('', 'throw #', dart.createErrorWithStack(error, stackTrace));
-}
-
 /// Used by the compiler to implement `async*` functions.
 ///
 /// This is inspired by _AsyncStarStreamController in dart-lang/sdk's
diff --git a/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart b/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
index e07844b..6b133cb 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
@@ -282,6 +282,12 @@
 
   @patch
   StackTrace? get stackTrace => dart.stackTraceForError(this);
+
+  @patch
+  static Never _throw(Object error, StackTrace stackTrace) {
+    JS("", "throw #", dart.createErrorWithStack(error, stackTrace));
+    throw "unreachable";
+  }
 }
 
 @patch
@@ -592,9 +598,7 @@
   }
 
   static String _stringFromJSArray(
-      /*=JSArray<int>*/ list,
-      int start,
-      int? endOrNull) {
+      /*=JSArray<int>*/ list, int start, int? endOrNull) {
     int len = list.length;
     int end = RangeError.checkValidRange(start, endOrNull, len);
     if (start > 0 || end < len) {
@@ -2901,7 +2905,7 @@
    * The [radix] argument must be an integer in the range 2 to 36.
    */
   String toRadixString(int radix) {
-    if (radix > 36) throw RangeError.range(radix, 2, 36);
+    if (radix < 2 || radix > 36) throw RangeError.range(radix, 2, 36);
 
     if (_used == 0) return "0";
 
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/runtime.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/runtime.dart
index 6ff9de7..c5881ab 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/runtime.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/runtime.dart
@@ -17,7 +17,6 @@
     show
         AssertionErrorImpl,
         BooleanConversionAssertionError,
-        CastErrorImpl,
         DartIterator,
         DeferredNotLoadedError,
         TypeErrorImpl,
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
index c32af9b..3fc8f51 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
@@ -699,15 +699,6 @@
   String toString() => _message;
 }
 
-/// Thrown by the 'as' operator if the cast isn't valid.
-class CastErrorImpl extends Error implements CastError, TypeError {
-  final String _message;
-
-  CastErrorImpl(this._message);
-
-  String toString() => _message;
-}
-
 class FallThroughErrorImplementation extends FallThroughError {
   String toString() => "Switch case fall-through.";
 }
diff --git a/sdk/lib/_internal/js_runtime/lib/async_patch.dart b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
index 293a271..4888baf 100644
--- a/sdk/lib/_internal/js_runtime/lib/async_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
@@ -704,10 +704,3 @@
   Iterator<T> get iterator =>
       new _SyncStarIterator<T>(JS('', '#()', _outerHelper));
 }
-
-@patch
-void _rethrow(Object error, StackTrace stackTrace) {
-  error = wrapException(error);
-  JS('void', '#.stack = #', error, stackTrace.toString());
-  JS('void', 'throw #', error);
-}
diff --git a/sdk/lib/_internal/js_runtime/lib/core_patch.dart b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
index 5726f96..6d4d129 100644
--- a/sdk/lib/_internal/js_runtime/lib/core_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
@@ -22,7 +22,8 @@
         Primitives,
         quoteStringForRegExp,
         getTraceFromException,
-        RuntimeError;
+        RuntimeError,
+        wrapException;
 
 import 'dart:_foreign_helper' show JS;
 import 'dart:_native_typed_data' show NativeUint8List;
@@ -187,6 +188,14 @@
 
   @patch
   StackTrace? get stackTrace => Primitives.extractStackTrace(this);
+
+  @patch
+  static Never _throw(Object error, StackTrace stackTrace) {
+    error = wrapException(error);
+    JS('void', '#.stack = #', error, stackTrace.toString());
+    JS('', 'throw #', error);
+    throw "unreachable";
+  }
 }
 
 @patch
@@ -2807,7 +2816,7 @@
   ///
   /// 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);
+    if (radix < 2 || radix > 36) throw RangeError.range(radix, 2, 36);
 
     if (_used == 0) return "0";
 
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index ff38ff8..a7f3ca8 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -262,15 +262,35 @@
 }
 
 class Primitives {
+  static Object? _identityHashCodeProperty;
+
   static int objectHashCode(object) {
-    int? hash = JS('int|Null', r'#.$identityHash', object);
+    Object property =
+        _identityHashCodeProperty ??= _computeIdentityHashCodeProperty();
+    int? hash = JS('int|Null', r'#[#]', object, property);
     if (hash == null) {
       hash = JS('int', '(Math.random() * 0x3fffffff) | 0');
-      JS('void', r'#.$identityHash = #', object, hash);
+      JS('void', r'#[#] = #', object, property, hash);
     }
     return JS('int', '#', hash);
   }
 
+  static Object _computeIdentityHashCodeProperty() =>
+      JS_GET_FLAG('LEGACY_JAVASCRIPT')
+          ? _computeIdentityHashCodePropertyLegacy()
+          : _computeIdentityHashCodePropertyModern();
+
+  static Object _computeIdentityHashCodePropertyLegacy() {
+    if (JS<bool>('bool', 'typeof Symbol == "function"') ||
+        JS<bool>('bool', 'typeof Symbol() == "symbol"')) {
+      return _computeIdentityHashCodePropertyModern();
+    }
+    return r'$identityHashCode';
+  }
+
+  static Object _computeIdentityHashCodePropertyModern() =>
+      JS('', 'Symbol("identityHashCode")');
+
   static int? parseInt(String source, int? radix) {
     checkString(source);
     var re = JS('', r'/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i');
diff --git a/sdk/lib/_internal/vm/bin/socket_patch.dart b/sdk/lib/_internal/vm/bin/socket_patch.dart
index 8ce0776..8812068 100644
--- a/sdk/lib/_internal/vm/bin/socket_patch.dart
+++ b/sdk/lib/_internal/vm/bin/socket_patch.dart
@@ -1396,7 +1396,8 @@
 
         if (i == errorEvent) {
           if (!isClosing) {
-            reportError(nativeGetError(), null, "");
+            final err = nativeGetError();
+            reportError(err, null, err.message);
           }
         } else if (!isClosed) {
           // If the connection is closed right after it's accepted, there's a
diff --git a/sdk/lib/_internal/vm/bin/vmservice_io.dart b/sdk/lib/_internal/vm/bin/vmservice_io.dart
index fbedb80..3df0e4c 100644
--- a/sdk/lib/_internal/vm/bin/vmservice_io.dart
+++ b/sdk/lib/_internal/vm/bin/vmservice_io.dart
@@ -123,10 +123,11 @@
         stderrSub.cancel();
         completer.complete();
       } else {
+        final error = result['error'] ?? event;
+        final stacktrace = result['stacktrace'] ?? '';
         stderrSub.cancel();
         completer.completeError(
-          'Could not start Observatory HTTP server',
-        );
+            'Could not start Observatory HTTP server:\n$error\n$stacktrace\n');
       }
     });
     try {
diff --git a/sdk/lib/_internal/vm/lib/async_patch.dart b/sdk/lib/_internal/vm/lib/async_patch.dart
index 4e56a79..363ae71 100644
--- a/sdk/lib/_internal/vm/lib/async_patch.dart
+++ b/sdk/lib/_internal/vm/lib/async_patch.dart
@@ -245,10 +245,6 @@
 }
 
 @patch
-@pragma("vm:external-name", "Async_rethrow")
-external void _rethrow(Object error, StackTrace stackTrace);
-
-@patch
 class _StreamImpl<T> {
   /// The closure implementing the async-generator body that is creating events
   /// for this stream.
diff --git a/sdk/lib/_internal/vm/lib/bigint_patch.dart b/sdk/lib/_internal/vm/lib/bigint_patch.dart
index f040c45..9ab2e2f 100644
--- a/sdk/lib/_internal/vm/lib/bigint_patch.dart
+++ b/sdk/lib/_internal/vm/lib/bigint_patch.dart
@@ -2493,7 +2493,7 @@
    * 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);
+    if (radix < 2 || radix > 36) throw new RangeError.range(radix, 2, 36);
 
     if (_used == 0) return "0";
 
diff --git a/sdk/lib/_internal/vm/lib/errors_patch.dart b/sdk/lib/_internal/vm/lib/errors_patch.dart
index 0e3a676..aaaf11f 100644
--- a/sdk/lib/_internal/vm/lib/errors_patch.dart
+++ b/sdk/lib/_internal/vm/lib/errors_patch.dart
@@ -21,6 +21,10 @@
 
   @pragma("vm:entry-point")
   StackTrace? _stackTrace;
+
+  @patch
+  @pragma("vm:external-name", "Error_throwWithStackTrace")
+  external static Never _throw(Object error, StackTrace stackTrace);
 }
 
 class _AssertionError extends Error implements AssertionError {
diff --git a/sdk/lib/_internal/vm/lib/ffi_patch.dart b/sdk/lib/_internal/vm/lib/ffi_patch.dart
index 3f7276b..3af29c3 100644
--- a/sdk/lib/_internal/vm/lib/ffi_patch.dart
+++ b/sdk/lib/_internal/vm/lib/ffi_patch.dart
@@ -4,7 +4,7 @@
 
 // All imports must be in all FFI patch files to not depend on the order
 // the patches are applied.
-import "dart:_internal" show patch;
+import "dart:_internal" show patch, has63BitSmis;
 import 'dart:typed_data';
 import 'dart:isolate';
 
@@ -21,8 +21,51 @@
   Double: 8,
 };
 
+// Keep consistent with pkg/vm/lib/transformations/ffi/abi.dart.
 @pragma("vm:prefer-inline")
-int get _intPtrSize => (const [8, 4, 4])[_abi()];
+int get _intPtrSize => (const [
+      4, // androidArm,
+      8, // androidArm64,
+      4, // androidIA32,
+      8, // androidX64,
+      8, // fuchsiaArm64,
+      8, // fuchsiaX64,
+      4, // iosArm,
+      8, // iosArm64,
+      8, // iosX64,
+      4, // linuxArm,
+      8, // linuxArm64,
+      4, // linuxIA32,
+      8, // linuxX64,
+      8, // macosArm64,
+      8, // macosX64,
+      8, // windowsArm64,
+      4, // windowsIA32,
+      8, // windowsX64,
+    ])[_abi()];
+
+@pragma("vm:prefer-inline")
+int get _smiMax {
+  // See runtime/vm/globals.h for how smiMax is calculated.
+  final smiBits = has63BitSmis ? 62 : 30;
+  return (1 << smiBits) - 1;
+}
+
+@pragma("vm:prefer-inline")
+void _checkExternalTypedDataLength(int length, int elementSize) {
+  final maxElements = _smiMax ~/ elementSize;
+  if (length < 0 || length > maxElements) {
+    throw ArgumentError("length must be in the range [0, $maxElements].");
+  }
+}
+
+@pragma("vm:prefer-inline")
+void _checkPointerAlignment(int address, int elementSize) {
+  if (address & (elementSize - 1) != 0) {
+    throw ArgumentError("Pointer address must be aligned to a multiple of "
+        "the element size ($elementSize).");
+  }
+}
 
 @patch
 int sizeOf<T extends NativeType>() {
@@ -42,8 +85,46 @@
 external DS _asFunctionInternal<DS extends Function, NS extends Function>(
     Pointer<NativeFunction<NS>> ptr, bool isLeaf);
 
-@pragma("vm:external-name", "Ffi_asExternalTypedData")
-external dynamic _asExternalTypedData(Pointer ptr, int count);
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataInt8")
+external Int8List _asExternalTypedDataInt8(Pointer<Int8> ptr, int length);
+
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataInt16")
+external Int16List _asExternalTypedDataInt16(Pointer<Int16> ptr, int length);
+
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataInt32")
+external Int32List _asExternalTypedDataInt32(Pointer<Int32> ptr, int length);
+
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataInt64")
+external Int64List _asExternalTypedDataInt64(Pointer<Int64> ptr, int length);
+
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataUint8")
+external Uint8List _asExternalTypedDataUint8(Pointer<Uint8> ptr, int length);
+
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataUint16")
+external Uint16List _asExternalTypedDataUint16(Pointer<Uint16> ptr, int length);
+
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataUint32")
+external Uint32List _asExternalTypedDataUint32(Pointer<Uint32> ptr, int length);
+
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataUint64")
+external Uint64List _asExternalTypedDataUint64(Pointer<Uint64> ptr, int length);
+
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataFloat")
+external Float32List _asExternalTypedDataFloat(Pointer<Float> ptr, int length);
+
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataDouble")
+external Float64List _asExternalTypedDataDouble(
+    Pointer<Double> ptr, int length);
 
 // Returns a Function object for a native callback.
 //
@@ -147,6 +228,14 @@
     "Recognized method: IR graph is built in the flow graph builder.")
 external int _abi();
 
+@patch
+@pragma("vm:entry-point")
+class Abi {
+  @patch
+  @pragma("vm:prefer-inline")
+  factory Abi.current() => values[_abi()];
+}
+
 /// Copies data byte-wise from [source] to [target].
 ///
 /// [source] and [target] should either be [Pointer] or [TypedData].
@@ -359,6 +448,16 @@
         Pointer<Pointer<S>> pointer, int index) =>
     Pointer.fromAddress(pointer.address + _intPtrSize * index);
 
+@pragma("vm:prefer-inline")
+@pragma("vm:entry-point")
+T _checkAbiSpecificIntegerMapping<T>(T? object) {
+  if (object == null) {
+    throw ArgumentError(
+        'AbiSpecificInteger is missing mapping for "${Abi.current()}".');
+  }
+  return object;
+}
+
 extension NativeFunctionPointer<NF extends Function>
     on Pointer<NativeFunction<NF>> {
   @patch
@@ -386,7 +485,13 @@
   operator []=(int index, int value) => _storeInt8(this, index, value);
 
   @patch
-  Int8List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Int8List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Int8>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 1);
+    _checkPointerAlignment(address, 1);
+    return _asExternalTypedDataInt8(this, length);
+  }
 }
 
 extension Int16Pointer on Pointer<Int16> {
@@ -403,7 +508,13 @@
   operator []=(int index, int value) => _storeInt16(this, 2 * index, value);
 
   @patch
-  Int16List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Int16List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Int16>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 2);
+    _checkPointerAlignment(address, 2);
+    return _asExternalTypedDataInt16(this, length);
+  }
 }
 
 extension Int32Pointer on Pointer<Int32> {
@@ -420,7 +531,13 @@
   operator []=(int index, int value) => _storeInt32(this, 4 * index, value);
 
   @patch
-  Int32List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Int32List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Int32>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 4);
+    _checkPointerAlignment(address, 4);
+    return _asExternalTypedDataInt32(this, length);
+  }
 }
 
 extension Int64Pointer on Pointer<Int64> {
@@ -437,7 +554,13 @@
   operator []=(int index, int value) => _storeInt64(this, 8 * index, value);
 
   @patch
-  Int64List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Int64List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Int64>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 8);
+    _checkPointerAlignment(address, 8);
+    return _asExternalTypedDataInt64(this, length);
+  }
 }
 
 extension Uint8Pointer on Pointer<Uint8> {
@@ -454,7 +577,13 @@
   operator []=(int index, int value) => _storeUint8(this, index, value);
 
   @patch
-  Uint8List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Uint8List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Uint8>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 1);
+    _checkPointerAlignment(address, 1);
+    return _asExternalTypedDataUint8(this, length);
+  }
 }
 
 extension Uint16Pointer on Pointer<Uint16> {
@@ -471,7 +600,13 @@
   operator []=(int index, int value) => _storeUint16(this, 2 * index, value);
 
   @patch
-  Uint16List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Uint16List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Uint16>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 2);
+    _checkPointerAlignment(address, 2);
+    return _asExternalTypedDataUint16(this, length);
+  }
 }
 
 extension Uint32Pointer on Pointer<Uint32> {
@@ -488,7 +623,13 @@
   operator []=(int index, int value) => _storeUint32(this, 4 * index, value);
 
   @patch
-  Uint32List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Uint32List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Uint32>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 4);
+    _checkPointerAlignment(address, 4);
+    return _asExternalTypedDataUint32(this, length);
+  }
 }
 
 extension Uint64Pointer on Pointer<Uint64> {
@@ -505,7 +646,13 @@
   operator []=(int index, int value) => _storeUint64(this, 8 * index, value);
 
   @patch
-  Uint64List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Uint64List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Uint64>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 8);
+    _checkPointerAlignment(address, 8);
+    return _asExternalTypedDataUint64(this, length);
+  }
 }
 
 extension IntPtrPointer on Pointer<IntPtr> {
@@ -537,7 +684,13 @@
   operator []=(int index, double value) => _storeFloat(this, 4 * index, value);
 
   @patch
-  Float32List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Float32List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Float>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 4);
+    _checkPointerAlignment(address, 4);
+    return _asExternalTypedDataFloat(this, length);
+  }
 }
 
 extension DoublePointer on Pointer<Double> {
@@ -554,7 +707,13 @@
   operator []=(int index, double value) => _storeDouble(this, 8 * index, value);
 
   @patch
-  Float64List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Float64List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Double>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 8);
+    _checkPointerAlignment(address, 8);
+    return _asExternalTypedDataDouble(this, length);
+  }
 }
 
 extension BoolPointer on Pointer<Bool> {
@@ -802,14 +961,14 @@
   @patch
   T operator [](int index) {
     throw ArgumentError(
-        "S ($T) should be a subtype of Struct at compile-time.");
+        "T ($T) should be a subtype of Struct at compile-time.");
   }
 }
 
 extension UnionArray<T extends Union> on Array<T> {
   @patch
   T operator [](int index) {
-    throw ArgumentError("S ($T) should be a subtype of Union at compile-time.");
+    throw ArgumentError("T ($T) should be a subtype of Union at compile-time.");
   }
 }
 
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index e206152..43e377a 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -797,7 +797,7 @@
 
   /// Registers the given callback in this zone.
   ///
-  /// Similar to [registerCallback] but with a unary callback.
+  /// Similar to [registerCallback] but with a binary callback.
   ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>(
       R callback(T1 arg1, T2 arg2));
 
@@ -1410,12 +1410,10 @@
 
 void _rootHandleError(Object error, StackTrace stackTrace) {
   _schedulePriorityAsyncCallback(() {
-    _rethrow(error, stackTrace);
+    Error.throwWithStackTrace(error, stackTrace);
   });
 }
 
-external void _rethrow(Object error, StackTrace stackTrace);
-
 R _rootRun<R>(Zone? self, ZoneDelegate? parent, Zone zone, R f()) {
   if (identical(Zone._current, zone)) return f();
 
@@ -1669,7 +1667,7 @@
   // Methods that can be customized by the zone specification.
 
   void handleUncaughtError(Object error, StackTrace stackTrace) {
-    _rootHandleUncaughtError(null, null, this, error, stackTrace);
+    _rootHandleError(error, stackTrace);
   }
 
   Zone fork(
diff --git a/sdk/lib/collection/hash_map.dart b/sdk/lib/collection/hash_map.dart
index 5aa9504..e8a5a9b 100644
--- a/sdk/lib/collection/hash_map.dart
+++ b/sdk/lib/collection/hash_map.dart
@@ -18,6 +18,8 @@
 
 /// A hash-table based implementation of [Map].
 ///
+/// The [HashMap] is unordered (the order of iteration is not guaranteed).
+///
 /// The keys of a `HashMap` must have consistent [Object.==]
 /// and [Object.hashCode] implementations. This means that the `==` operator
 /// must define a stable equivalence relation on the keys (reflexive,
@@ -25,11 +27,94 @@
 /// must be the same for objects that are considered equal by `==`.
 ///
 /// Iterating the map's keys, values or entries (through [forEach])
-/// may happen in any order.
-/// The iteration order only changes when the map is modified.
-/// Values are iterated in the same order as their associated keys,
+/// may happen in any order. The iteration order only changes when the map is
+/// modified. Values are iterated in the same order as their associated keys,
 /// so iterating the [keys] and [values] in parallel
 /// will give matching key and value pairs.
+///
+/// **Notice:**
+/// Do not modify a map (add or remove keys) while an operation
+/// is being performed on that map, for example in functions
+/// called during a [forEach] or [putIfAbsent] call,
+/// or while iterating the map ([keys], [values] or [entries]).
+///
+/// Example:
+/// ```dart
+/// final Map<int, String> planets = HashMap(); // Is a HashMap
+/// ```
+/// To add data to a map, use [operator[]=], [addAll] or [addEntries].
+/// ```dart continued
+/// planets[3] = 'Earth';
+/// planets.addAll({4: 'Mars'});
+/// final gasGiants = {6: 'Jupiter', 5: 'Saturn'};
+/// planets.addEntries(gasGiants.entries);
+/// print(planets); // fx {5: Saturn, 6: Jupiter, 3: Earth, 4: Mars}
+/// ```
+/// To check if the map is empty, use [isEmpty] or [isNotEmpty].
+/// To find the number of map entries, use [length].
+/// ```dart continued
+/// final isEmpty = planets.isEmpty; // false
+/// final length = planets.length; // 4
+/// ```
+/// The [forEach] iterates through all entries of a map.
+/// ```dart continued
+/// planets.forEach((key, value) {
+///   print('$key \t $value');
+///   // 5        Saturn
+///   // 4        Mars
+///   // 3        Earth
+///   // 6        Jupiter
+/// });
+/// ```
+/// To check whether the map has an entry with a specific key, use [containsKey].
+/// ```dart continued
+/// final keyOneExists = planets.containsKey(4); // true
+/// final keyFiveExists = planets.containsKey(1); // false
+/// ```dart continued
+/// To check whether the map has an entry with a specific value,
+/// use [containsValue].
+/// ```dart continued
+/// final marsExists = planets.containsValue('Mars'); // true
+/// final venusExists = planets.containsValue('Venus'); // false
+/// ```
+/// To remove an entry with a specific key, use [remove].
+/// ```dart continued
+/// final removeValue = planets.remove(5);
+/// print(removeValue); // Jupiter
+/// print(planets); // fx {4: Mars, 3: Earth, 5: Saturn}
+/// ```
+/// To remove multiple entries at the same time, based on their keys and values,
+/// use [removeWhere].
+/// ```dart continued
+/// planets.removeWhere((key, value) => key == 5);
+/// print(planets); // fx {3: Earth, 4: Mars}
+/// ```
+/// To conditionally add or modify a value for a specific key, depending on
+/// whether there already is an entry with that key,
+/// use [putIfAbsent] or [update].
+/// ```dart continued
+/// planets.update(4, (v) => 'Saturn');
+/// planets.update(8, (v) => '', ifAbsent: () => 'Neptune');
+/// planets.putIfAbsent(4, () => 'Another Saturn');
+/// print(planets); // fx {4: Saturn, 8: Neptune, 3: Earth}
+/// ```
+/// To update the values of all keys, based on the existing key and value,
+/// use [updateAll].
+/// ```dart continued
+/// planets.updateAll((key, value) => 'X');
+/// print(planets); // fx {8: X, 3: X, 4: X}
+/// ```
+/// To remove all entries and empty the map, use [clear].
+/// ```dart continued
+/// planets.clear();
+/// print(planets); // {}
+/// print(planets.isEmpty); // true
+/// ```
+///
+/// **See also:**
+/// * [Map], the general interface of key/value pair collections.
+/// * [LinkedHashMap] iterates in key insertion order.
+/// * [SplayTreeMap] iterates the keys in sorted order.
 abstract class HashMap<K, V> implements Map<K, V> {
   /// Creates an unordered hash-table based [Map].
   ///
@@ -37,21 +122,32 @@
   /// values, the iteration order is unspecified except that it will stay the
   /// same as long as the map isn't changed.
   ///
-  /// If [equals] is provided, it is used to compare the keys in the table with
+  /// If [equals] is provided, it is used to compare the keys in the map with
   /// new keys. If [equals] is omitted, the key's own [Object.==] is used
   /// instead.
   ///
-  /// Similar, if [hashCode] is provided, it is used to produce a hash value
-  /// for keys in order to place them in the hash table. If it is omitted, the
-  /// key's own [Object.hashCode] is used.
+  /// Similarly, if [hashCode] is provided, it is used to produce a hash value
+  /// for keys in order to place them in the map. If [hashCode] is omitted,
+  /// the key's own [Object.hashCode] is used.
   ///
-  /// If using methods like [operator []], [remove] and [containsKey] together
-  /// with a custom equality and hashcode, an extra `isValidKey` function
-  /// can be supplied. This function is called before calling [equals] or
-  /// [hashCode] with an argument that may not be a [K] instance, and if the
-  /// call returns false, the key is assumed to not be in the set.
-  /// The [isValidKey] function defaults to just testing if the object is a
-  /// [K] instance.
+  /// The used `equals` and `hashCode` method should always be consistent,
+  /// so that if `equals(a, b)`, then `hashCode(a) == hashCode(b)`. The hash
+  /// of an object, or what it compares equal to, should not change while the
+  /// object is a key in the map. If it does change, the result is
+  /// unpredictable.
+  ///
+  /// If you supply one of [equals] and [hashCode],
+  /// you should generally also supply the other.
+  ///
+  /// Some [equals] or [hashCode] functions might not work for all objects.
+  /// If [isValidKey] is supplied, it's used to check a potential key
+  /// which is not necessarily an instance of [K], like the arguments to
+  /// [operator []], [remove] and [containsKey], which are typed as `Object?`.
+  /// If [isValidKey] returns `false`, for an object, the [equals] and
+  /// [hashCode] functions are not called, and no key equal to that object
+  /// is assumed to be in the map.
+  /// The [isValidKey] function defaults to just testing if the object is an
+  /// instance of [K].
   ///
   /// Example:
   /// ```dart template:expression
@@ -59,27 +155,18 @@
   ///                  hashCode: (int e) => e % 5)
   /// ```
   /// This example map does not need an `isValidKey` function to be passed.
-  /// The default function accepts only `int` values, which can safely be
+  /// The default function accepts precisely `int` values, which can safely be
   /// passed to both the `equals` and `hashCode` functions.
   ///
   /// If neither `equals`, `hashCode`, nor `isValidKey` is provided,
   /// the default `isValidKey` instead accepts all keys.
-  /// The default equality and hashcode operations are assumed to work on all
+  /// The default equality and hashcode operations are known to work on all
   /// objects.
   ///
   /// Likewise, if `equals` is [identical], `hashCode` is [identityHashCode]
   /// and `isValidKey` is omitted, the resulting map is identity based,
   /// and the `isValidKey` defaults to accepting all keys.
   /// Such a map can be created directly using [HashMap.identity].
-  ///
-  /// The used `equals` and `hashCode` method should always be consistent,
-  /// so that if `equals(a, b)` then `hashCode(a) == hashCode(b)`. The hash
-  /// of an object, or what it compares equal to, should not change while the
-  /// object is a key in the map. If it does change, the result is
-  /// unpredictable.
-  ///
-  /// If you supply one of [equals] and [hashCode],
-  /// you should generally also to supply the other.
   external factory HashMap(
       {bool Function(K, K)? equals,
       int Function(K)? hashCode,
@@ -87,7 +174,10 @@
 
   /// Creates an unordered identity-based map.
   ///
-  /// Effectively a shorthand for:
+  /// Keys of this map are considered equal only to the same object,
+  /// and do not use [Object.==] at all.
+  ///
+  /// Effectively shorthand for:
   /// ```dart
   /// HashMap<K, V>(equals: identical, hashCode: identityHashCode)
   /// ```
@@ -97,6 +187,11 @@
   ///
   /// The keys must all be instances of [K] and the values of [V].
   /// The [other] map itself can have any type.
+  /// ```dart
+  /// final baseMap = {1: 'A', 2: 'B', 3: 'C'};
+  /// final fromBaseMap = HashMap<int, String>.from(baseMap);
+  /// print(fromBaseMap); // {1: A, 2: B, 3: C}
+  /// ```
   factory HashMap.from(Map<dynamic, dynamic> other) {
     HashMap<K, V> result = HashMap<K, V>();
     other.forEach((dynamic k, dynamic v) {
@@ -106,6 +201,12 @@
   }
 
   /// Creates a [HashMap] that contains all key/value pairs of [other].
+  /// Example:
+  /// ```dart
+  /// final baseMap = <int, String>{1: 'A', 2: 'B', 3: 'C'};
+  /// final mapOf = HashMap<num, Object>.of(baseMap);
+  /// print(mapOf); // {1: A, 2: B, 3: C}
+  /// ```
   factory HashMap.of(Map<K, V> other) => HashMap<K, V>()..addAll(other);
 
   /// Creates a [HashMap] where the keys and values are computed from the
@@ -117,8 +218,15 @@
   /// The keys of the key/value pairs do not need to be unique. The last
   /// occurrence of a key will simply overwrite any previous value.
   ///
-  /// If no values are specified for [key] and [value] the default is the
+  /// If no values are specified for [key] and [value], the default is the
   /// identity function.
+  /// Example:
+  /// ```dart
+  /// final numbers = [11, 12, 13, 14];
+  /// final mapFromIterable = HashMap<int, int>.fromIterable(numbers,
+  ///     key: (i) => i, value: (i) => i * i);
+  /// print(mapFromIterable); // {11: 121, 12: 144, 13: 169, 14: 196}
+  /// ```
   factory HashMap.fromIterable(Iterable iterable,
       {K Function(dynamic element)? key, V Function(dynamic element)? value}) {
     HashMap<K, V> map = HashMap<K, V>();
@@ -135,6 +243,14 @@
   /// overwrites the previous value.
   ///
   /// It is an error if the two [Iterable]s don't have the same length.
+  /// Example:
+  /// ```dart
+  /// final keys = ['Mercury', 'Venus', 'Earth', 'Mars'];
+  /// final values = [0.06, 0.81, 1, 0.11];
+  /// final mapFromIterables = HashMap.fromIterables(keys, values);
+  /// print(mapFromIterables);
+  /// // {Earth: 1, Mercury: 0.06, Mars: 0.11, Venus: 0.81}
+  /// ```
   factory HashMap.fromIterables(Iterable<K> keys, Iterable<V> values) {
     HashMap<K, V> map = HashMap<K, V>();
     MapBase._fillMapWithIterables(map, keys, values);
@@ -148,6 +264,13 @@
   ///
   /// If multiple [entries] have the same key,
   /// later occurrences overwrite the earlier ones.
+  ///
+  /// Example:
+  /// ```dart
+  /// final numbers = [11, 12, 13, 14];
+  /// final map = HashMap.fromEntries(numbers.map((i) => MapEntry(i, i * i)));
+  /// print(map); // {11: 121, 12: 144, 13: 169, 14: 196}
+  /// ```
   @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 ee8fed0..bd8860c 100644
--- a/sdk/lib/collection/hash_set.dart
+++ b/sdk/lib/collection/hash_set.dart
@@ -10,46 +10,117 @@
 /// and hashCode implementations. This means that the equals operation
 /// must define a stable equivalence relation on the elements (reflexive,
 /// symmetric, transitive, and consistent over time), and that the hashCode
-/// must consistent with equality, so that the same for objects that are
+/// must be consistent with equality, so that it's the same for objects that are
 /// considered equal.
 ///
 /// Most simple operations on `HashSet` are done in (potentially amortized)
 /// constant time: [add], [contains], [remove], and [length], provided the hash
 /// codes of objects are well distributed.
 ///
-/// The iteration order of the set is not specified and depends on
-/// the hashcodes of the provided elements. However, the order is stable:
+/// **The iteration order of the set is not specified and depends on
+/// the hashcodes of the provided elements.** However, the order is stable:
 /// multiple iterations over the same set produce the same order, as long as
 /// the set is not modified.
+///
+/// **Note:**
+/// Do not modify a set (add or remove elements) while an operation
+/// is being performed on that set, for example in functions
+/// called during a [forEach] or [containsAll] call,
+/// or while iterating the set.
+///
+/// Do not modify elements in a way which changes their equality (and thus their
+/// hash code) while they are in the set. Some specialized kinds of sets may be
+/// more permissive with regards to equality, in which case they should document
+/// their different behavior and restrictions.
+///
+/// Example:
+/// ```dart
+/// final letters = HashSet<String>();
+/// ```
+/// To add data to a set, use  [add] or [addAll].
+/// ```dart continued
+/// letters.add('A');
+/// letters.addAll({'B', 'C', 'D'});
+/// ```
+/// To check if the set is empty, use [isEmpty] or [isNotEmpty].
+/// To find the number of elements in the set, use [length].
+/// ```dart continued
+/// print(letters.isEmpty); // false
+/// print(letters.length); // 4
+/// print(letters); // fx {A, D, C, B}
+/// ```
+/// To check whether the set has an element with a specific value,
+/// use [contains].
+/// ```dart continued
+/// final bExists = letters.contains('B'); // true
+/// ```
+/// The [forEach] method calls a function with each element of the set.
+/// ```dart continued
+/// letters.forEach(print);
+/// // A
+/// // D
+/// // C
+/// // B
+/// ```
+/// To make a copy of the set, use [toSet].
+/// ```dart continued
+/// final anotherSet = letters.toSet();
+/// print(anotherSet); // fx {A, C, D, B}
+/// ```
+/// To remove an element, use [remove].
+/// ```dart continued
+/// final removedValue = letters.remove('A'); // true
+/// print(letters); // fx {B, C, D}
+/// ```
+/// To remove multiple elements at the same time, use [removeWhere] or
+/// [removeAll].
+/// ```dart continued
+/// letters.removeWhere((element) => element.startsWith('B'));
+/// print(letters); // fx {D, C}
+/// ```
+/// To removes all elements in this set that do not meet a condition,
+/// use [retainWhere].
+/// ```dart continued
+/// letters.retainWhere((element) => element.contains('C'));
+/// print(letters); // {C}
+/// ```
+/// To remove all elements and empty the set, use [clear].
+/// ```dart continued
+/// letters.clear();
+/// print(letters.isEmpty); // true
+/// print(letters); // {}
+/// ```
+/// **See also:**
+/// * [Set] is the general interface of collection where each object can
+/// occur only once.
+/// * [LinkedHashSet] objects stored based on insertion order.
+/// * [SplayTreeSet] iterates the objects in sorted order.
 abstract class HashSet<E> implements Set<E> {
   /// Create a hash set using the provided [equals] as equality.
   ///
   /// The provided [equals] must define a stable equivalence relation, and
-  /// [hashCode] must be consistent with [equals]. If the [equals] or [hashCode]
-  /// methods won't work on all objects, but only on some instances of E, the
-  /// [isValidKey] predicate can be used to restrict the keys that the functions
-  /// are applied to.
-  /// Any key for which [isValidKey] returns false is automatically assumed
-  /// to not be in the set when asking `contains`.
+  /// [hashCode] must be consistent with [equals].
   ///
   /// If [equals] or [hashCode] are omitted, the set uses
   /// the elements' intrinsic [Object.==] and [Object.hashCode].
   ///
   /// If you supply one of [equals] and [hashCode],
-  /// you should generally also to supply the other.
+  /// you should generally also supply the other.
   ///
-  /// If the supplied `equals` or `hashCode` functions won't work on all [E]
-  /// objects, and the map will be used in a setting where a non-`E` object
-  /// is passed to, e.g., `contains`, then the [isValidKey] function should
-  /// also be supplied.
-  ///
-  /// If [isValidKey] is omitted, it defaults to testing if the object is an
-  /// [E] instance. That means that:
+  /// Some [equals] or [hashCode] functions might not work for all objects.
+  /// If [isValidKey] is supplied, it's used to check a potential element
+  /// which is not necessarily an instance of [E], like the argument to
+  /// [contains] which is typed as `Object?`.
+  /// If [isValidKey] returns `false`, for an object, the [equals] and
+  /// [hashCode] functions are not called, and no key equal to that object
+  /// is assumed to be in the map.
+  /// The [isValidKey] function defaults to just testing if the object is an
+  /// instance of [E], which means that:
   /// ```dart template:expression
   /// HashSet<int>(equals: (int e1, int e2) => (e1 - e2) % 5 == 0,
   ///              hashCode: (int e) => e % 5)
   /// ```
-  /// does not need an `isValidKey` argument, because it defaults to only
+  /// does not need an `isValidKey` argument because it defaults to only
   /// accepting `int` values which are accepted by both `equals` and `hashCode`.
   ///
   /// If neither `equals`, `hashCode`, nor `isValidKey` is provided,
@@ -68,7 +139,7 @@
 
   /// Creates an unordered identity-based set.
   ///
-  /// Effectively a shorthand for:
+  /// Effectively shorthand for:
   /// ```dart
   /// HashSet<E>(equals: identical, hashCode: identityHashCode)
   /// ```
@@ -89,6 +160,12 @@
   /// Set<SubType> subSet =
   ///     HashSet<SubType>.from(superSet.whereType<SubType>());
   /// ```
+  /// Example:
+  /// ```dart
+  /// final numbers = <num>[10, 20, 30];
+  /// final hashSetFrom = HashSet<int>.from(numbers);
+  /// print(hashSetFrom); // fx {20, 10, 30}
+  /// ```
   factory HashSet.from(Iterable<dynamic> elements) {
     HashSet<E> result = HashSet<E>();
     for (final e in elements) {
@@ -99,15 +176,21 @@
 
   /// Create a hash set containing all [elements].
   ///
-  /// Creates a hash set as by `new HashSet<E>()` and adds all given [elements]
+  /// Creates a hash set as by `HashSet<E>()` and adds all given [elements]
   /// to the set. The elements are added in order. If [elements] contains
   /// two entries that are equal, but not identical, then the first one is
   /// the one in the resulting set.
+  /// Example:
+  /// ```dart
+  /// final baseSet = <int>{1, 2, 3};
+  /// final hashSetOf = HashSet<num>.of(baseSet);
+  /// print(hashSetOf); // fx {3, 1, 2}
+  /// ```
   factory HashSet.of(Iterable<E> elements) => HashSet<E>()..addAll(elements);
 
   /// Provides an iterator that iterates over the elements of this set.
   ///
   /// The order of iteration is unspecified,
-  /// but consistent between changes to the set.
+  /// but is consistent between changes to the set.
   Iterator<E> get iterator;
 }
diff --git a/sdk/lib/collection/linked_hash_map.dart b/sdk/lib/collection/linked_hash_map.dart
index cfab8f3..9ee9d30 100644
--- a/sdk/lib/collection/linked_hash_map.dart
+++ b/sdk/lib/collection/linked_hash_map.dart
@@ -4,21 +4,112 @@
 
 part of dart.collection;
 
-/// A hash-table based implementation of [Map].
+/// An insertion-ordered [Map] with expected constant-time lookup.
+///
+/// A non-constant map literal, like `{"a": 42, "b": 7}`, is a `LinkedHashMap`.
+///
+/// The [keys], [values] and [entries] are iterated in key insertion order.
+///
+/// The map uses a hash-table to look up entries, so keys must have
+/// suitable implementations of [Object.operator==] and [Object.hashCode].
+/// If the hash codes are not well-distributed, the performance of map
+/// operations may suffer.
 ///
 /// The insertion order of keys is remembered,
 /// and keys are iterated in the order they were inserted into the map.
-/// Values are iterated in their corresponding key's order.
+/// Values and entries are iterated in their corresponding key's order.
 /// Changing a key's value, when the key is already in the map,
 /// does not change the iteration order,
 /// but removing the key and adding it again
 /// will make it be last in the iteration order.
 ///
+/// **Notice:**
+/// Do not modify a map (add or remove keys) while an operation
+/// is being performed on that map, for example in functions
+/// called during a [forEach] or [putIfAbsent] call,
+/// or while iterating the map ([keys], [values] or [entries]).
+///
 /// The keys of a `LinkedHashMap` must have consistent [Object.==]
 /// and [Object.hashCode] implementations. This means that the `==` operator
 /// must define a stable equivalence relation on the keys (reflexive,
 /// symmetric, transitive, and consistent over time), and that `hashCode`
 /// must be the same for objects that are considered equal by `==`.
+///
+/// Example:
+///
+/// ```dart
+/// final planetsByDiameter = {0.949: 'Venus'}; // A new LinkedHashMap
+/// ```
+/// To add data to a map, use [operator[]=], [addAll] or [addEntries].
+/// ```dart continued
+/// planetsByDiameter[1] = 'Earth';
+/// planetsByDiameter.addAll({0.532: 'Mars', 11.209: 'Jupiter'});
+/// ```
+/// To check if the map is empty, use [isEmpty] or [isNotEmpty].
+/// To find the number of map entries, use [length].
+/// ```dart continued
+/// print(planetsByDiameter.isEmpty); // false
+/// print(planetsByDiameter.length); // 4
+/// print(planetsByDiameter);
+/// // {0.949: Venus, 1.0: Earth, 0.532: Mars, 11.209: Jupiter}
+/// ```
+/// The [forEach] method calls a function for each key/value entry of the map.
+/// ```dart continued
+/// planetsByDiameter.forEach((key, value) {
+///   print('$key \t $value');
+///   // 0.949    Venus
+///   // 1.0      Earth
+///   // 0.532    Mars
+///   // 11.209   Jupiter
+/// });
+/// ```
+/// To check whether the map has an entry with a specific key, use [containsKey].
+/// ```dart continued
+/// final keyOneExists = planetsByDiameter.containsKey(1); // true
+/// final keyFiveExists = planetsByDiameter.containsKey(5); // false
+/// ```
+/// To check whether the map has an entry with a specific value,
+/// use [containsValue].
+/// ```dart continued
+/// final earthExists = planetsByDiameter.containsValue('Earth'); // true
+/// final saturnExists =  planetsByDiameter.containsValue('Saturn'); // false
+/// ```
+/// To remove an entry with a specific key, use [remove].
+/// ```dart continued
+/// final removedValue = planetsByDiameter.remove(1);
+/// print(removedValue); // Earth
+/// print(planetsByDiameter); // {0.949: Venus, 0.532: Mars, 11.209: Jupiter}
+/// ```
+/// To remove multiple entries at the same time, based on their keys and values,
+/// use [removeWhere].
+/// ```dart continued
+/// planetsByDiameter.removeWhere((key, value) => key == 0.949);
+/// print(planetsByDiameter); // {0.532: Mars, 11.209: Jupiter}
+/// ```
+/// To conditionally add or modify a value for a specific key, depending on
+/// whether there already is an entry with that key,
+/// use [putIfAbsent] or [update].
+/// ```dart continued
+/// planetsByDiameter.update(0.949, (v) => 'Venus', ifAbsent: () => 'Venus');
+/// planetsByDiameter.putIfAbsent(0.532, () => "Another Mars if needed");
+/// print(planetsByDiameter); // {0.532: Mars, 11.209: Jupiter, 0.949: Venus}
+/// ```
+/// To update the values of all keys, based on the existing key and value,
+/// use [updateAll].
+/// ```dart continued
+/// planetsByDiameter.updateAll((key, value) => 'X');
+/// print(planetsByDiameter); // {0.532: X, 11.209: X, 0.949: X}
+/// ```
+/// To remove all entries and empty the map, use [clear].
+/// ```dart continued
+/// planetsByDiameter.clear();
+/// print(planetsByDiameter); // {}
+/// print(planetsByDiameter.isEmpty); // true
+/// ```
+/// **See also:**
+/// * [Map], the general interface of key/value pair collections.
+/// * [HashMap] is unordered (the order of iteration is not guaranteed).
+/// * [SplayTreeMap] iterates the keys in sorted order.
 abstract class LinkedHashMap<K, V> implements Map<K, V> {
   /// Creates an insertion-ordered hash-table based [Map].
   ///
@@ -26,25 +117,35 @@
   /// new keys. If [equals] is omitted, the key's own [Object.==] is used
   /// instead.
   ///
-  /// Similar, if [hashCode] is provided, it is used to produce a hash value
+  /// Similarly, if [hashCode] is provided, it is used to produce a hash value
   /// for keys in order to place them in the hash table. If it is omitted, the
   /// key's own [Object.hashCode] is used.
   ///
-  /// If using methods like [operator []], [remove] and [containsKey] together
-  /// with a custom equality and hashcode, an extra `isValidKey` function
-  /// can be supplied. This function is called before calling [equals] or
-  /// [hashCode] with an argument that may not be a [K] instance, and if the
-  /// call returns false, the key is assumed to not be in the set.
-  /// The [isValidKey] function defaults to just testing if the object is a
-  /// [K] instance.
+  /// The used `equals` and `hashCode` method should always be consistent,
+  /// so that if `equals(a, b)` then `hashCode(a) == hashCode(b)`. The hash
+  /// of an object, or what it compares equal to, should not change while the
+  /// object is in the table. If it does change, the result is unpredictable.
+  ///
+  /// If you supply one of [equals] or [hashCode],
+  /// you should generally also supply the other.
+  ///
+  /// Some [equals] or [hashCode] functions might not work for all objects.
+  /// If [isValidKey] is supplied, it's used to check a potential key
+  /// which is not necessarily an instance of [K], like the arguments to
+  /// [operator []], [remove] and [containsKey], which are typed as `Object?`.
+  /// If [isValidKey] returns `false`, for an object, the [equals] and
+  /// [hashCode] functions are not called, and no key equal to that object
+  /// is assumed to be in the map.
+  /// The [isValidKey] function defaults to just testing if the object is an
+  /// instance of [K].
   ///
   /// Example:
   /// ```dart template:expression
-  /// LinkedHashMap<int,int>(equals: (int a, int b) => (b - a) % 5 == 0,
-  ///                        hashCode: (int e) => e % 5)
+  /// LikedHashMap<int,int>(equals: (int a, int b) => (b - a) % 5 == 0,
+  ///                       hashCode: (int e) => e % 5)
   /// ```
   /// This example map does not need an `isValidKey` function to be passed.
-  /// The default function accepts only `int` values, which can safely be
+  /// The default function accepts precisely `int` values, which can safely be
   /// passed to both the `equals` and `hashCode` functions.
   ///
   /// If neither `equals`, `hashCode`, nor `isValidKey` is provided,
@@ -56,14 +157,6 @@
   /// and `isValidKey` is omitted, the resulting map is identity based,
   /// and the `isValidKey` defaults to accepting all keys.
   /// Such a map can be created directly using [LinkedHashMap.identity].
-  ///
-  /// The used `equals` and `hashCode` method should always be consistent,
-  /// so that if `equals(a, b)` then `hashCode(a) == hashCode(b)`. The hash
-  /// of an object, or what it compares equal to, should not change while the
-  /// object is in the table. If it does change, the result is unpredictable.
-  ///
-  /// If you supply one of [equals] and [hashCode],
-  /// you should generally also to supply the other.
   external factory LinkedHashMap(
       {bool Function(K, K)? equals,
       int Function(K)? hashCode,
@@ -71,7 +164,7 @@
 
   /// Creates an insertion-ordered identity-based map.
   ///
-  /// Effectively a shorthand for:
+  /// Effectively shorthand for:
   /// ```dart template:expression
   /// LinkedHashMap<K, V>(equals: identical,
   ///                     hashCode: identityHashCode)
@@ -82,6 +175,12 @@
   ///
   /// The keys must all be instances of [K] and the values to [V].
   /// The [other] map itself can have any type.
+  /// Example:
+  /// ```dart
+  /// final baseMap = <num, Object>{1: 'A', 2: 'B', 3: 'C'};
+  /// final fromBaseMap = LinkedHashMap<int, String>.from(baseMap);
+  /// print(fromBaseMap); // {1: A, 2: B, 3: C}
+  /// ```
   factory LinkedHashMap.from(Map<dynamic, dynamic> other) {
     LinkedHashMap<K, V> result = LinkedHashMap<K, V>();
     other.forEach((dynamic k, dynamic v) {
@@ -91,20 +190,33 @@
   }
 
   /// Creates a [LinkedHashMap] that contains all key value pairs of [other].
+  /// Example:
+  /// ```dart
+  /// final baseMap = <int, String> {3: 'A', 2: 'B', 1: 'C', 4: 'D'};
+  /// final mapOf = LinkedHashMap<num, Object>.of(baseMap);
+  /// print(mapOf); // {3: A, 2: B, 1: C, 4: D}
+  /// ```
   factory LinkedHashMap.of(Map<K, V> other) =>
       LinkedHashMap<K, V>()..addAll(other);
 
   /// Creates a [LinkedHashMap] where the keys and values are computed from the
   /// [iterable].
   ///
-  /// For each element of the [iterable] this constructor computes a key/value
-  /// pair, by applying [key] and [value] respectively.
+  /// For each element of the [iterable], this constructor computes a key/value
+  /// pair by applying [key] and [value] respectively.
   ///
   /// The keys of the key/value pairs do not need to be unique. The last
   /// occurrence of a key will simply overwrite any previous value.
   ///
-  /// If no values are specified for [key] and [value] the default is the
-  /// identity function.
+  /// If no values are specified for [key] and [value], the default is the
+  /// both default to the identity function.
+  /// Example:
+  /// ```dart
+  /// final numbers = [11, 12, 13, 14];
+  /// final mapFromIterable =
+  ///     LinkedHashMap.fromIterable(numbers, key: (i) => i, value: (i) => i * i);
+  /// print(mapFromIterable); // {11: 121, 12: 144, 13: 169, 14: 196}
+  /// ```
   factory LinkedHashMap.fromIterable(Iterable iterable,
       {K Function(dynamic element)? key, V Function(dynamic element)? value}) {
     LinkedHashMap<K, V> map = LinkedHashMap<K, V>();
@@ -121,6 +233,14 @@
   /// overwrites the previous value.
   ///
   /// It is an error if the two [Iterable]s don't have the same length.
+  /// Example:
+  /// ```dart
+  /// final values = [0.06, 0.81, 1, 0.11];
+  /// final keys = ['Mercury', 'Venus', 'Earth', 'Mars'];
+  /// final mapFromIterables = LinkedHashMap.fromIterables(keys, values);
+  /// print(mapFromIterables);
+  /// // {Mercury: 0.06, Venus: 0.81, Earth: 1, Mars: 0.11}
+  /// ```
   factory LinkedHashMap.fromIterables(Iterable<K> keys, Iterable<V> values) {
     LinkedHashMap<K, V> map = LinkedHashMap<K, V>();
     MapBase._fillMapWithIterables(map, keys, values);
@@ -134,6 +254,12 @@
   ///
   /// If multiple [entries] have the same key,
   /// later occurrences overwrite the earlier ones.
+  /// Example:
+  /// ```dart
+  /// final numbers = [11, 12, 13, 14];
+  /// final map = LinkedHashMap.fromEntries(numbers.map((i) => MapEntry(i, i * i)));
+  /// print(map); // {11: 121, 12: 144, 13: 169, 14: 196}
+  /// ```
   @Since("2.1")
   factory LinkedHashMap.fromEntries(Iterable<MapEntry<K, V>> entries) =>
       LinkedHashMap<K, V>()..addEntries(entries);
diff --git a/sdk/lib/collection/linked_hash_set.dart b/sdk/lib/collection/linked_hash_set.dart
index 43d9a52..fd21777 100644
--- a/sdk/lib/collection/linked_hash_set.dart
+++ b/sdk/lib/collection/linked_hash_set.dart
@@ -6,7 +6,9 @@
 
 /// A [LinkedHashSet] is a hash-table based [Set] implementation.
 ///
-/// The `LinkedHashSet` also keep track of the order that elements were inserted
+/// The default implementation of [Set] is [LinkedHashSet].
+///
+/// The `LinkedHashSet` also keeps track of the order that elements were inserted
 /// in, and iteration happens in first-to-last insertion order.
 ///
 /// The elements of a `LinkedHashSet` must have consistent [Object.==]
@@ -19,47 +21,115 @@
 /// An element that was added after another will occur later in the iteration.
 /// Adding an element that is already in the set
 /// does not change its position in the iteration order,
-/// but removing an element and adding it again,
+/// but removing an element and adding it again
 /// will make it the last element of an iteration.
 ///
 /// Most simple operations on `HashSet` are done in (potentially amortized)
 /// constant time: [add], [contains], [remove], and [length], provided the hash
-/// codes of objects are well distributed..
+/// codes of objects are well distributed.
+///
+/// **Note:**
+/// Do not modify a set (add or remove elements) while an operation
+/// is being performed on that set, for example in functions
+/// called during a [forEach] or [containsAll] call,
+/// or while iterating the set.
+///
+/// Do not modify elements in a way which changes their equality (and thus their
+/// hash code) while they are in the set. Some specialized kinds of sets may be
+/// more permissive with regards to equality, in which case they should document
+/// their different behavior and restrictions.
+///
+/// Example:
+/// ```dart
+/// final planets = <String>{}; // LinkedHashSet
+/// ```
+/// To add data to a set, use [add] or [addAll].
+/// ```dart continued
+/// final uranusAdded = planets.add('Uranus'); // true
+/// planets.addAll({'Venus', 'Mars', 'Earth', 'Jupiter'});
+/// print(planets); // {Uranus, Venus, Mars, Earth, Jupiter}
+/// ```
+/// To check if the set is empty, use [isEmpty] or [isNotEmpty].
+/// To find the number of elements in the set, use [length].
+/// ```dart continued
+/// print(planets.isEmpty); // false
+/// print(planets.length); // 5
+/// ```
+/// To check whether the set has an element with a specific value,
+/// use [contains].
+/// ```dart continued
+/// final marsExists = planets.contains('Mars'); // true
+/// ```
+/// The [forEach] method calls a function with each element of the set.
+/// ```dart continued
+/// planets.forEach(print);
+/// // Uranus
+/// // Venus
+/// // Mars
+/// // Earth
+/// // Jupiter
+/// ```
+///
+/// To make a copy of the set, use [toSet].
+/// ```dart continued
+/// final copySet = planets.toSet();
+/// print(copySet); // {Uranus, Venus, Mars, Earth, Jupiter}
+/// ```
+/// To remove an element, use [remove].
+/// ```dart continued
+/// final removedValue = planets.remove('Mars'); // Mars
+/// print(planets); // {Uranus, Venus, Earth, Jupiter}
+/// ```
+/// To remove multiple elements at the same time, use [removeWhere] or
+/// [removeAll].
+/// ```dart continued
+/// planets.removeWhere((element) => element.startsWith('E'));
+/// print(planets); // {Uranus, Venus, Jupiter}
+/// ```
+/// To removes all elements in this set that do not meet a condition,
+/// use [retainWhere].
+/// ```dart continued
+/// planets.retainWhere((element) => element.contains('Jupiter'));
+/// print(planets); // {Jupiter}
+/// ```dart continued
+/// To remove all elements and empty the set, use [clear].
+/// ```dart continued
+/// planets.clear();
+/// print(planets.isEmpty); // true
+/// print(planets); // {}
+/// ```
+/// **See also:**
+/// * [Set] is the general interface of collection where each object can
+/// occur only once.
+/// * [HashSet] the order of the objects in the iteration is not guaranteed.
+/// * [SplayTreeSet] iterates the objects in sorted order.
 abstract class LinkedHashSet<E> implements Set<E> {
   /// Create an insertion-ordered hash set using the provided
   /// [equals] and [hashCode].
   ///
   /// The provided [equals] must define a stable equivalence relation, and
-  /// [hashCode] must be consistent with [equals]. If the [equals] or [hashCode]
-  /// methods won't work on all objects, but only on some instances of E, the
-  /// [isValidKey] predicate can be used to restrict the keys that the functions
-  /// are applied to.
-  /// Any key for which [isValidKey] returns false is automatically assumed
-  /// to not be in the set when asking `contains`.
-  ///
-  /// If [equals] or [hashCode] are omitted, the set uses
-  /// the elements' intrinsic [Object.==] and [Object.hashCode],
-  /// and [isValidKey] is ignored since these operations are assumed
-  /// to work on all objects.
+  /// [hashCode] must be consistent with [equals].
   ///
   /// If you supply one of [equals] and [hashCode],
-  /// you should generally also to supply the other.
+  /// you should generally also supply the other.
   ///
-  /// If the supplied `equals` or `hashCode` functions won't work on all [E]
-  /// objects, and the map will be used in a setting where a non-`E` object
-  /// is passed to, e.g., `contains`, then the [isValidKey] function should
-  /// also be supplied.
-  ///
-  /// If [isValidKey] is omitted, it defaults to testing if the object is an
-  /// [E] instance. That means that:
+  /// Some [equals] or [hashCode] functions might not work for all objects.
+  /// If [isValidKey] is supplied, it's used to check a potential element
+  /// which is not necessarily an instance of [E], like the argument to
+  /// [contains] which is typed as `Object?`.
+  /// If [isValidKey] returns `false`, for an object, the [equals] and
+  /// [hashCode] functions are not called, and no key equal to that object
+  /// is assumed to be in the map.
+  /// The [isValidKey] function defaults to just testing if the object is an
+  /// instance of [E], which means that:
   /// ```dart template:expression
   /// LinkedHashSet<int>(equals: (int e1, int e2) => (e1 - e2) % 5 == 0,
-  ///                    hashCode: (int e) => e % 5)
+  ///                    hashCode: (int e) => e % 5);
   /// ```
   /// does not need an `isValidKey` argument, because it defaults to only
   /// accepting `int` values which are accepted by both `equals` and `hashCode`.
   ///
-  /// If neither `equals`, `hashCode`, nor `isValidKey` is provided,
+  /// If neither `equals`, `hashCode`, nor `isValidKey` are provided,
   /// the default `isValidKey` instead accepts all values.
   /// The default equality and hashcode operations are assumed to work on all
   /// objects.
@@ -75,7 +145,7 @@
 
   /// Creates an insertion-ordered identity-based set.
   ///
-  /// Effectively a shorthand for:
+  /// Effectively shorthand for:
   /// ```dart
   /// LinkedHashSet<E>(equals: identical, hashCode: identityHashCode)
   /// ```
@@ -83,7 +153,7 @@
 
   /// Create a linked hash set containing all [elements].
   ///
-  /// Creates a linked hash set as by `new LinkedHashSet<E>()` and adds each
+  /// Creates a linked hash set as by `LinkedHashSet<E>()` and adds each
   /// element of `elements` to this set in the order they are iterated.
   ///
   /// All the [elements] should be instances of [E].
@@ -94,6 +164,12 @@
   /// Iterable<SuperType> tmp = superSet.where((e) => e is SubType);
   /// Set<SubType> subSet = LinkedHashSet<SubType>.from(tmp);
   /// ```
+  /// Example:
+  /// ```dart
+  /// final numbers = <num>[10, 20, 30];
+  /// final setFrom = LinkedHashSet<int>.from(numbers);
+  /// print(setFrom); // {10, 20, 30}
+  /// ```
   factory LinkedHashSet.from(Iterable<dynamic> elements) {
     LinkedHashSet<E> result = LinkedHashSet<E>();
     for (final element in elements) {
@@ -104,8 +180,14 @@
 
   /// Create a linked hash set from [elements].
   ///
-  /// Creates a linked hash set as by `new LinkedHashSet<E>()` and adds each
+  /// Creates a linked hash set as by `LinkedHashSet<E>()` and adds each
   /// element of `elements` to this set in the order they are iterated.
+  /// Example:
+  /// ```dart
+  /// final baseSet = <int>{1, 2, 3};
+  /// final setOf = LinkedHashSet<num>.of(baseSet);
+  /// print(setOf); // {1, 2, 3}
+  /// ```
   factory LinkedHashSet.of(Iterable<E> elements) =>
       LinkedHashSet<E>()..addAll(elements);
 
diff --git a/sdk/lib/collection/linked_list.dart b/sdk/lib/collection/linked_list.dart
index 3e77646..516deee 100644
--- a/sdk/lib/collection/linked_list.dart
+++ b/sdk/lib/collection/linked_list.dart
@@ -28,6 +28,56 @@
 ///
 /// A `LinkedList` also allows constant time adding and removing at either end,
 /// and a constant time length getter.
+///
+/// Example:
+/// ```dart
+/// class EntryItem extends LinkedListEntry<EntryItem> {
+///   final int id;
+///   final String text;
+///   EntryItem(this.id, this.text);
+///
+///   @override
+///   String toString() {
+///     return '$id : $text';
+///   }
+/// }
+///
+/// void main(){
+///   final linkedList = LinkedList<EntryItem>();
+///   linkedList.addAll(
+///       [EntryItem(1, 'A'), EntryItem(2, 'B'), EntryItem(3, 'C')]);
+///   print(linkedList.first); // 1 : A
+///   print(linkedList.last); // 3 : C
+///
+///   // Add new item after first item.
+///   linkedList.first.insertAfter(EntryItem(15, 'E'));
+///   // Add new item before last item.
+///   linkedList.last.insertBefore(EntryItem(10, 'D'));
+///   // Iterate items.
+///   for (var entry in linkedList) {
+///     print(entry);
+///     // 1 : A
+///     // 15 : E
+///     // 2 : B
+///     // 10 : D
+///     // 3 : C
+///   }
+///
+///   // Remove item using index from list.
+///   linkedList.elementAt(2).unlink();
+///   print(linkedList); // (1 : A, 15 : E, 10 : D, 3 : C)
+///   // Remove first item.
+///   linkedList.first.unlink();
+///   print(linkedList); // (15 : E, 10 : D, 3 : C)
+///   // Remove last item from list.
+///   linkedList.remove(linkedList.last);
+///   print(linkedList); // (15 : E, 10 : D)
+///   // Remove all items.
+///   linkedList.clear();
+///   print(linkedList.length); // 0
+///   print(linkedList.isEmpty); // true
+/// }
+/// ```
 class LinkedList<E extends LinkedListEntry<E>> extends Iterable<E> {
   int _modificationCount = 0;
   int _length = 0;
@@ -47,7 +97,7 @@
     _insertBefore(_first, entry, updateFirst: false);
   }
 
-  /// Add [entries] to the end of the linked list.
+  /// Adds [entries] to the end of the linked list.
   void addAll(Iterable<E> entries) {
     entries.forEach(add);
   }
@@ -239,7 +289,7 @@
 
   /// The successor of this element in its linked list.
   ///
-  /// The value is  `null` if there is no successor in the linked list,
+  /// The value is `null` if there is no successor in the linked list,
   /// or if this entry is not currently in any list.
   E? get next {
     if (_list == null || identical(_list!.first, _next)) return null;
diff --git a/sdk/lib/collection/queue.dart b/sdk/lib/collection/queue.dart
index dcdecb4..fa8b785 100644
--- a/sdk/lib/collection/queue.dart
+++ b/sdk/lib/collection/queue.dart
@@ -9,12 +9,29 @@
 /// an [Iterator].
 ///
 /// It is generally not allowed to modify the queue (add or remove entries)
-/// while an operation on the queue is being performed, for example during a
+/// while an operation in the queue is being performed, for example during a
 /// call to [forEach].
 /// Modifying the queue while it is being iterated will most likely break the
 /// iteration.
 /// This goes both for using the [iterator] directly, or for iterating an
 /// `Iterable` returned by a method like [map] or [where].
+///
+/// Example:
+/// ```dart
+/// final queue = Queue<int>(); // ListQueue() by default
+/// print(queue.runtimeType); // ListQueue
+///
+/// // Adding items to queue
+/// queue.addAll([1, 2, 3]);
+/// queue.addFirst(0);
+/// queue.addLast(10);
+/// print(queue); // {0, 1, 2, 3, 10}
+///
+/// // Removing items from queue
+/// queue.removeFirst();
+/// queue.removeLast();
+/// print(queue); // {1, 2, 3}
+/// ```
 abstract class Queue<E> implements EfficientLengthIterable<E> {
   /// Creates a queue.
   factory Queue() = ListQueue<E>;
@@ -45,16 +62,16 @@
   /// Any time the queue would produce an element that is not a [T],
   /// the element access will throw.
   ///
-  /// Any time a [T] value is attempted stored into the adapted queue,
-  /// the store will throw unless the value is also an instance of [S].
+  /// When a [T] value is stored into the adapted queue,
+  /// the operation will throw unless the value is also an instance of [S].
   ///
   /// If all accessed elements of [source] are actually instances of [T],
-  /// and if all elements stored into the returned queue are actually instance
+  /// and if all elements stored into the returned queue are actually instances
   /// of [S],
   /// then the returned queue can be used as a `Queue<T>`.
   ///
   /// Methods which accept `Object?` as argument, like [contains] and [remove],
-  /// will pass the argument directly to the this queue's method
+  /// will pass the argument directly to this queue's method
   /// without any checks.
   static Queue<T> castFrom<S, T>(Queue<S> source) => CastQueue<S, T>(source);
 
@@ -65,8 +82,8 @@
   /// that is not an instance of [R], the access will throw instead.
   ///
   /// Elements added to the queue (e.g., by using [addFirst] or [addAll])
-  /// must be instance of [R] to be valid arguments to the adding function,
-  /// and they must be instances of [E] as well to be accepted by
+  /// must be instances of [R] to be valid arguments to the adding function,
+  /// and they must also be instances of [E] to be accepted by
   /// this queue as well.
   ///
   /// Methods which accept `Object?` as argument, like [contains] and [remove],
@@ -95,7 +112,7 @@
   /// Adds [value] at the end of the queue.
   void add(E value);
 
-  /// Remove a single instance of [value] from the queue.
+  /// Removes a single instance of [value] from the queue.
   ///
   /// Returns `true` if a value was removed, or `false` if the queue
   /// contained no element equal to [value].
@@ -437,7 +454,7 @@
   /// [DoubleLinkedQueueEntry.previousEntry()].
   ///
   /// The [action] function can use methods on [DoubleLinkedQueueEntry] to
-  /// remove the entry or it can insert elements before or after then entry.
+  /// remove the entry or it can insert elements before or after the entry.
   /// If the current entry is removed, iteration continues with the entry that
   /// was following the current entry when [action] was called. Any elements
   /// inserted after the current element before it is removed will not be
@@ -509,6 +526,63 @@
 /// amortized constant time add operations.
 ///
 /// The structure is efficient for any queue or stack usage.
+///
+/// Example:
+/// ```dart
+/// final queue = ListQueue<int>();
+/// ```
+/// To add objects to a queue, use [add], [addAll], [addFirst] or[addLast].
+/// ```dart continued
+/// queue.add(5);
+/// queue.addFirst(0);
+/// queue.addLast(10);
+/// queue.addAll([1, 2, 3]);
+/// print(queue); // {0, 5, 10, 1, 2, 3}
+/// ```
+/// To check if the queue is empty, use [isEmpty] or [isNotEmpty].
+/// To find the number of queue entries, use [length].
+/// ```dart continued
+/// final isEmpty = queue.isEmpty; // false
+/// final queueSize = queue.length; // 6
+/// ```
+/// To get first or last item from queue, use [first] or [last].
+/// ```dart continued
+/// final first = queue.first; // 0
+/// final last = queue.last; // 3
+/// ```
+/// To get item value using index, use [elementAt].
+/// ```dart continued
+/// final itemAt = queue.elementAt(2); // 10
+/// ```
+/// To convert queue to list, call [toList].
+/// ```dart continued
+/// final numbers = queue.toList();
+/// print(numbers); // [0, 5, 10, 1, 2, 3]
+/// ```
+/// To remove item from queue, call [remove], [removeFirst] or [removeLast].
+/// ```dart continued
+/// queue.remove(10);
+/// queue.removeFirst();
+/// queue.removeLast();
+/// print(queue); // {5, 1, 2}
+/// ```
+/// To remove multiple elements at the same time, use [removeWhere].
+/// ```dart continued
+/// queue.removeWhere((element) => element == 1);
+/// print(queue); // {5, 2}
+/// ```
+/// To remove all elements in this queue that do not meet a condition,
+/// use [retainWhere].
+/// ```dart continued
+/// queue.retainWhere((element) => element < 4);
+/// print(queue); // {2}
+/// ```
+/// To remove all items and empty the set, use [clear].
+/// ```dart continued
+/// queue.clear();
+/// print(queue.isEmpty); // true
+/// print(queue); // {}
+/// ```
 class ListQueue<E> extends ListIterable<E> implements Queue<E> {
   static const int _INITIAL_CAPACITY = 8;
   List<E?> _table;
@@ -548,6 +622,12 @@
   /// Queue<SubType> subQueue =
   ///     ListQueue<SubType>.from(superQueue.whereType<SubType>());
   /// ```
+  /// Example:
+  /// ```dart
+  /// final numbers = <num>[10, 20, 30];
+  /// final queue = ListQueue<int>.from(numbers);
+  /// print(queue); // {10, 20, 30}
+  /// ```
   factory ListQueue.from(Iterable<dynamic> elements) {
     if (elements is List<dynamic>) {
       int length = elements.length;
@@ -575,6 +655,12 @@
   ///
   /// The elements are added to the queue, as by [addLast], in the order given
   /// by `elements.iterator`.
+  /// Example:
+  /// ```dart
+  /// final baseQueue = ListQueue.of([1.0, 2.0, 3.0]); // A ListQueue<double>
+  /// final numQueue = ListQueue<num>.of(baseQueue);
+  /// print(numQueue); // {1.0, 2.0, 3.0}
+  /// ```
   factory ListQueue.of(Iterable<E> elements) =>
       ListQueue<E>()..addAll(elements);
 
diff --git a/sdk/lib/collection/splay_tree.dart b/sdk/lib/collection/splay_tree.dart
index 5770c5b..1ab21db 100644
--- a/sdk/lib/collection/splay_tree.dart
+++ b/sdk/lib/collection/splay_tree.dart
@@ -54,7 +54,7 @@
   // Number of elements in the splay tree.
   int _count = 0;
 
-  /// Counter incremented whenever the keys in the map changes.
+  /// Counter incremented whenever the keys in the map change.
   ///
   /// Used to detect concurrent modifications.
   int _modificationCount = 0;
@@ -310,6 +310,86 @@
 /// using the `compare` function on an argument value that may not be a [K]
 /// value. If omitted, the `isValidKey` function defaults to testing if the
 /// value is a [K].
+///
+/// **Notice:**
+/// Do not modify a map (add or remove keys) while an operation
+/// is being performed on that map, for example in functions
+/// called during a [forEach] or [putIfAbsent] call,
+/// or while iterating the map ([keys], [values] or [entries]).
+///
+/// Example:
+/// ```dart
+/// final planetsByMass = SplayTreeMap<double, String>((a, b) => a.compareTo(b));
+/// ```
+/// To add data to a map, use [operator[]=], [addAll] or [addEntries].
+/// ```
+/// planetsByMass[0.06] = 'Mercury';
+/// planetsByMass
+///     .addAll({0.81: 'Venus', 1.0: 'Earth', 0.11: 'Mars', 317.83: 'Jupiter'});
+/// ```
+/// To check if the map is empty, use [isEmpty] or [isNotEmpty].
+/// To find the number of map entries, use [length].
+/// ```
+/// print(planetsByMass.isEmpty); // false
+/// print(planetsByMass.length); // 5
+/// ```
+/// The [forEach] method calls a function for each key/value entry of the map.
+/// ```
+/// planetsByMass.forEach((key, value) {
+///   print('$key \t $value');
+///   // 0.06    Mercury
+///   // 0.11    Mars
+///   // 0.81    Venus
+///   // 1.0     Earth
+///   // 317.83  Jupiter
+/// });
+/// ```
+/// To check whether the map has an entry with a specific key, use [containsKey].
+/// ```
+/// final keyOneExists = planetsByMass.containsKey(1.0); // true
+/// final keyFiveExists = planetsByMass.containsKey(5); // false
+/// ```
+/// To check whether the map has an entry with a specific value,
+/// use [containsValue].
+/// ```
+/// final earthExists = planetsByMass.containsValue('Earth'); // true
+/// final plutoExists = planetsByMass.containsValue('Pluto'); // false
+/// ```
+/// To remove an entry with a specific key, use [remove].
+/// ```
+/// final removedValue = planetsByMass.remove(1.0);
+/// print(removedValue); // Earth
+/// ```
+/// To remove multiple entries at the same time, based on their keys and values,
+/// use [removeWhere].
+/// ```
+/// planetsByMass.removeWhere((key, value) => key <= 1);
+/// print(planetsByMass); // {317.83: Jupiter}
+/// ```
+/// To conditionally add or modify a value for a specific key, depending on
+/// whether there already is an entry with that key,
+/// use [putIfAbsent] or [update].
+/// ```
+/// planetsByMass.update(1, (v) => '', ifAbsent: () => 'Earth');
+/// planetsByMass.putIfAbsent(317.83, () => 'Another Jupiter');
+/// print(planetsByMass); // {1.0: Earth, 317.83: Jupiter}
+/// ```
+/// To update the values of all keys, based on the existing key and value,
+/// use [updateAll].
+/// ```
+/// planetsByMass.updateAll((key, value) => 'X');
+/// print(planetsByMass); // {1.0: X, 317.83: X}
+/// ```
+/// To remove all entries and empty the map, use [clear].
+/// ```
+/// planetsByMass.clear();
+/// print(planetsByMass.isEmpty); // false
+/// print(planetsByMass); // {}
+/// ```
+/// **See also:**
+/// * [Map], the general interface of key/value pair collections.
+/// * [HashMap] is unordered (the order of iteration is not guaranteed).
+/// * [LinkedHashMap] iterates in key insertion order.
 class SplayTreeMap<K, V> extends _SplayTree<K, _SplayTreeMapNode<K, V>>
     with MapMixin<K, V> {
   _SplayTreeMapNode<K, V>? _root;
@@ -327,6 +407,12 @@
   ///
   /// The keys must all be instances of [K] and the values of [V].
   /// The [other] map itself can have any type.
+  /// Example:
+  /// ```dart
+  /// final baseMap = <int, Object>{3: 'C', 1: 'A', 2: 'B'};
+  /// final fromBaseMap = SplayTreeMap<int, String>.from(baseMap);
+  /// print(fromBaseMap); // {1: A, 2: B, 3: C}
+  /// ```
   factory SplayTreeMap.from(Map<dynamic, dynamic> other,
       [int Function(K key1, K key2)? compare,
       bool Function(dynamic potentialKey)? isValidKey]) {
@@ -341,6 +427,12 @@
   }
 
   /// Creates a [SplayTreeMap] that contains all key/value pairs of [other].
+  /// Example:
+  /// ```dart
+  /// final baseMap = <int, String>{3: 'A', 2: 'B', 1: 'C', 4: 'D'};
+  /// final mapOf = SplayTreeMap<num, Object>.of(baseMap);
+  /// print(mapOf); // {1: C, 2: B, 3: A, 4: D}
+  /// ```
   factory SplayTreeMap.of(Map<K, V> other,
           [int Function(K key1, K key2)? compare,
           bool Function(dynamic potentialKey)? isValidKey]) =>
@@ -355,8 +447,16 @@
   /// The keys of the key/value pairs do not need to be unique. The last
   /// occurrence of a key will simply overwrite any previous value.
   ///
-  /// If no functions are specified for [key] and [value] the default is to
+  /// If no functions are specified for [key] and [value], the default is to
   /// use the iterable value itself.
+  /// Example:
+  /// ```dart
+  /// final numbers = [12, 11, 14, 13];
+  /// final mapFromIterable =
+  ///     SplayTreeMap<int, int>.fromIterable(numbers,
+  ///         key: (i) => i, value: (i) => i * i);
+  /// print(mapFromIterable); // {11: 121, 12: 144, 13: 169, 14: 196}
+  /// ```
   factory SplayTreeMap.fromIterable(Iterable iterable,
       {K Function(dynamic element)? key,
       V Function(dynamic element)? value,
@@ -376,6 +476,13 @@
   /// overwrites the previous value.
   ///
   /// It is an error if the two [Iterable]s don't have the same length.
+  /// Example:
+  /// ```dart
+  /// final keys = ['1', '2', '3', '4'];
+  /// final values = ['A', 'B', 'C', 'D'];
+  /// final mapFromIterables = SplayTreeMap.fromIterables(keys, values);
+  /// print(mapFromIterables); // {1: A, 2: B, 3: C, 4: D}
+  /// ```
   factory SplayTreeMap.fromIterables(Iterable<K> keys, Iterable<V> values,
       [int Function(K key1, K key2)? compare,
       bool Function(dynamic potentialKey)? isValidKey]) {
@@ -772,6 +879,74 @@
 /// [Comparable], and are compared using their [Comparable.compareTo] method.
 /// Non-comparable objects (including `null`) will not work as an element
 /// in that case.
+///
+/// **Note:**
+/// Do not modify a set (add or remove elements) while an operation
+/// is being performed on that set, for example in functions
+/// called during a [forEach] or [containsAll] call,
+/// or while iterating the set.
+///
+/// Do not modify elements in a way which changes their equality (and thus their
+/// hash code) while they are in the set. Some specialized kinds of sets may be
+/// more permissive with regards to equality, in which case they should document
+/// their different behavior and restrictions.
+///
+/// Example:
+/// ```dart
+/// final planets = SplayTreeSet<String>((a, b) => a.compareTo(b));
+/// ```
+/// To add data to a set, use [add] or [addAll].
+/// ```
+/// planets.add('Neptune');
+/// planets.addAll({'Venus', 'Mars', 'Earth', 'Jupiter'});
+/// print(planets); // {Earth, Jupiter, Mars, Neptune, Venus}
+/// ```
+/// To check if the set is empty, use [isEmpty] or [isNotEmpty].
+/// To find the number of elements in the set, use [length].
+/// ```
+/// final isEmpty = planets.isEmpty; // false
+/// final length = planets.length; // 5
+/// ```
+/// To check whether the set contains a specific element, use [contains].
+/// ```
+/// final marsExists = planets.contains('Mars'); // true
+/// ```
+/// To get element value using index, use [elementAt].
+/// ```
+/// final elementAt = planets.elementAt(1);
+/// print(elementAt); // Jupiter
+/// ```
+/// To make a copy of set, use [toSet].
+/// ```
+/// final copySet = planets.toSet(); // a `SplayTreeSet` with the same ordering.
+/// print(copySet); // {Earth, Jupiter, Mars, Neptune, Venus}
+/// ```
+/// To remove an element, use [remove].
+/// ```
+/// final removedValue = planets.remove('Mars'); // true
+/// print(planets); // {Earth, Jupiter, Neptune, Venus}
+/// ```
+/// To remove multiple elements at the same time, use [removeWhere].
+/// ```
+/// planets.removeWhere((element) => element.startsWith('J'));
+/// print(planets); // {Earth, Neptune, Venus}
+/// ```
+/// To removes all elements in this set that do not meet a condition,
+/// use [retainWhere].
+/// ```
+/// planets.retainWhere((element) => element.contains('Earth'));
+/// print(planets); // {Earth}
+/// ```
+/// To remove all elements and empty the set, use [clear].
+/// ```
+/// planets.clear();
+/// print(planets.isEmpty); // true
+/// print(planets); // {}
+/// ```
+/// **See also:**
+/// * [Set] is a base-class for collection of objects.
+/// * [HashSet] the order of the objects in the iterations is not guaranteed.
+/// * [LinkedHashSet] objects stored based on insertion order.
 class SplayTreeSet<E> extends _SplayTree<E, _SplayTreeSetNode<E>>
     with IterableMixin<E>, SetMixin<E> {
   _SplayTreeSetNode<E>? _root;
@@ -788,7 +963,7 @@
   /// work on all `E` instances.
   ///
   /// For operations that add elements to the set, the user is supposed to not
-  /// pass in objects that doesn't work with the compare function.
+  /// pass in objects that don't work with the compare function.
   ///
   /// The methods [contains], [remove], [lookup], [removeAll] or [retainAll]
   /// are typed to accept any object(s), and the [isValidKey] test can used to
@@ -809,7 +984,7 @@
 
   /// Creates a [SplayTreeSet] that contains all [elements].
   ///
-  /// The set works as if created by `new SplayTreeSet<E>(compare, isValidKey)`.
+  /// The set works as if created by `SplayTreeSet<E>(compare, isValidKey)`.
   ///
   /// All the [elements] should be instances of [E] and valid arguments to
   /// [compare].
@@ -820,6 +995,12 @@
   /// Set<SubType> subSet =
   ///     SplayTreeSet<SubType>.from(superSet.whereType<SubType>());
   /// ```
+  /// Example:
+  /// ```dart
+  /// final numbers = <num>[20, 30, 10];
+  /// final setFrom = SplayTreeSet<int>.from(numbers);
+  /// print(setFrom); // {10, 20, 30}
+  /// ```
   factory SplayTreeSet.from(Iterable elements,
       [int Function(E key1, E key2)? compare,
       bool Function(dynamic potentialKey)? isValidKey]) {
@@ -838,6 +1019,12 @@
   /// The set works as if created by `new SplayTreeSet<E>(compare, isValidKey)`.
   ///
   /// All the [elements] should be valid as arguments to the [compare] function.
+  /// Example:
+  /// ```dart
+  /// final baseSet = <int>{1, 2, 3};
+  /// final setOf = SplayTreeSet<num>.of(baseSet);
+  /// print(setOf); // {1, 2, 3}
+  /// ```
   factory SplayTreeSet.of(Iterable<E> elements,
           [int Function(E key1, E key2)? compare,
           bool Function(dynamic potentialKey)? isValidKey]) =>
diff --git a/sdk/lib/convert/ascii.dart b/sdk/lib/convert/ascii.dart
index 9f62c2d..30a9599 100644
--- a/sdk/lib/convert/ascii.dart
+++ b/sdk/lib/convert/ascii.dart
@@ -35,7 +35,7 @@
   /// Encoders will not accept invalid (non ASCII) characters.
   const AsciiCodec({bool allowInvalid = false}) : _allowInvalid = allowInvalid;
 
-  /// The name of this codec, "us-ascii".
+  /// The name of this codec is "us-ascii".
   String get name => "us-ascii";
 
   Uint8List encode(String source) => encoder.convert(source);
@@ -103,7 +103,15 @@
   Stream<List<int>> bind(Stream<String> stream) => super.bind(stream);
 }
 
-/// This class converts strings of only ASCII characters to bytes.
+/// Converts strings of only ASCII characters to bytes.
+///
+/// Example:
+/// ```dart import:typed_data
+/// const asciiEncoder = AsciiEncoder();
+/// const sample = 'Dart';
+/// final asciiValues = asciiEncoder.convert(sample);
+/// print(asciiValues); // [68, 97, 114, 116]
+/// ```
 class AsciiEncoder extends _UnicodeSubsetEncoder {
   const AsciiEncoder() : super(_asciiMask);
 }
@@ -195,6 +203,29 @@
   Stream<String> bind(Stream<List<int>> stream) => super.bind(stream);
 }
 
+/// Converts ASCII bytes to string.
+///
+/// Example:
+/// ```dart
+/// const asciiDecoder = AsciiDecoder();
+/// final asciiValues = [68, 97, 114, 116];
+/// final result = asciiDecoder.convert(asciiValues);
+/// print(result); // Dart
+/// ```
+/// Throws a [FormatException] if [bytes] contains values that are not
+/// in the range 0 .. 127, and [allowInvalid] is `false` (the default).
+///
+/// If [allowInvalid] is `true`, any byte outside the range 0..127 is replaced
+/// by the Unicode replacement character, U+FFFD ('�').
+///
+/// Example with `allowInvalid` set to true:
+/// ```dart
+/// const asciiDecoder = AsciiDecoder(allowInvalid: true);
+/// final asciiValues = [68, 97, 114, 116, 20, 0xFF];
+/// final result = asciiDecoder.convert(asciiValues);
+/// print(result); // Dart �
+/// print(result.codeUnits.last.toRadixString(16)); // fffd
+/// ```
 class AsciiDecoder extends _UnicodeSubsetDecoder {
   const AsciiDecoder({bool allowInvalid = false})
       : super(allowInvalid, _asciiMask);
diff --git a/sdk/lib/convert/base64.dart b/sdk/lib/convert/base64.dart
index c4420c6..23fa301 100644
--- a/sdk/lib/convert/base64.dart
+++ b/sdk/lib/convert/base64.dart
@@ -223,6 +223,14 @@
 /// Encodes lists of bytes using base64 or base64url encoding.
 ///
 /// The results are ASCII strings using a restricted alphabet.
+///
+/// Example:
+/// ```dart
+/// final base64Encoder = base64.encoder;
+/// const sample = 'Dart is open source';
+/// final encodedSample = base64Encoder.convert(sample.codeUnits);
+/// print(encodedSample); // RGFydCBpcyBvcGVuIHNvdXJjZQ==
+/// ```
 class Base64Encoder extends Converter<List<int>, String> {
   final bool _urlSafe;
 
@@ -295,7 +303,7 @@
   /// 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
+  /// is 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.
@@ -469,6 +477,20 @@
 /// This decoder accepts both base64 and base64url ("url-safe") encodings.
 ///
 /// The encoding is required to be properly padded.
+///
+/// Throws a [FormatException] if the input is not valid base64 data.
+///
+/// Example:
+/// ```dart
+/// final base64Decoder = base64.decoder;
+/// const base64Bytes = 'RGFydCBpcyBvcGVuIHNvdXJjZQ==';
+/// final decodedBytes = base64Decoder.convert(base64Bytes);
+/// // decodedBytes: [68, 97, 114, 116, 32, 105, 115, 32, 111, 112, 101, 110,
+/// // 32, 115, 111, 117, 114, 99, 101]
+///
+/// // Print as string using UTF-8 decoder
+/// print(utf8.decode(decodedBytes)); // Dart is open source
+/// ```
 class Base64Decoder extends Converter<String, List<int>> {
   const Base64Decoder();
 
@@ -726,7 +748,7 @@
   /// 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
+  /// Never count more than two padding sequences as 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) {
@@ -777,7 +799,7 @@
   /// 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
+  /// a `%` character and expect 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.
diff --git a/sdk/lib/convert/html_escape.dart b/sdk/lib/convert/html_escape.dart
index 69b63a0..ced0a4a7 100644
--- a/sdk/lib/convert/html_escape.dart
+++ b/sdk/lib/convert/html_escape.dart
@@ -26,7 +26,7 @@
 
 /// HTML escape modes.
 ///
-/// Allows specifying a mode for HTML escaping that depend on the context
+/// Allows specifying a mode for HTML escaping that depends on the context
 /// where the escaped result is going to be used.
 /// The relevant contexts are:
 ///
@@ -38,6 +38,38 @@
 ///
 /// Custom escape modes can be created using the [HtmlEscapeMode.HtmlEscapeMode]
 /// constructor.
+///
+/// Example:
+/// ```dart
+/// const htmlEscapeMode = HtmlEscapeMode(
+///   name: 'custom',
+///   escapeLtGt: true,
+///   escapeQuot: false,
+///   escapeApos: false,
+///   escapeSlash: false,
+///  );
+///
+/// const HtmlEscape htmlEscape = HtmlEscape(htmlEscapeMode);
+/// String unescaped = 'Text & subject';
+/// String escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // Text &amp; subject
+///
+/// unescaped = '10 > 1 and 1 < 10';
+/// escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // 10 &gt; 1 and 1 &lt; 10
+///
+/// unescaped = "Single-quoted: 'text'";
+/// escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // Single-quoted: 'text'
+///
+/// unescaped = 'Double-quoted: "text"';
+/// escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // Double-quoted: "text"
+///
+/// unescaped = 'Path: /system/';
+/// escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // Path: /system/
+/// ```
 class HtmlEscapeMode {
   final String _name;
 
@@ -56,13 +88,13 @@
   /// [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.
+  /// Default escaping mode, which escapes 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,
+  /// and not, for example, for script or style element content,
   /// which require escapes matching their particular content syntax.
   static const HtmlEscapeMode unknown =
       HtmlEscapeMode._('unknown', true, true, true, true);
@@ -85,14 +117,14 @@
   ///
   /// Escapes single quotes (`'`) but not double quotes (`"`),
   /// and escapes `<` and `>` characters because they are not allowed
-  /// in strict XHTML attributes
+  /// in strict XHTML attributes.
   static const HtmlEscapeMode sqAttribute =
       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,
+  /// and not, for example, for script or style element content,
   /// which require escapes matching their particular content syntax.
   ///
   /// Escapes `<` and `>` characters.
@@ -120,13 +152,13 @@
 
 /// Converter which escapes characters with special meaning in HTML.
 ///
-/// The converter finds characters that are significant in HTML source and
+/// The converter finds characters that are significant in the 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.
+/// * `&` (ampersand) always needs 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
@@ -137,6 +169,30 @@
 /// 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.
+///
+/// Example:
+/// ```dart
+/// const HtmlEscape htmlEscape = HtmlEscape();
+/// String unescaped = 'Text & subject';
+/// String escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // Text &amp; subject
+///
+/// unescaped = '10 > 1 and 1 < 10';
+/// escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // 10 &gt; 1 and 1 &lt; 10
+///
+/// unescaped = "Single-quoted: 'text'";
+/// escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // Single-quoted: &#39;text&#39;
+///
+/// unescaped = 'Double-quoted: "text"';
+/// escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // Double-quoted: &quot;text&quot;
+///
+/// unescaped = 'Path: /system/';
+/// escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // Path: &#47;system&#47;
+/// ```
 class HtmlEscape extends Converter<String, String> {
   /// The [HtmlEscapeMode] used by the converter.
   final HtmlEscapeMode mode;
@@ -145,7 +201,7 @@
   ///
   /// If [mode] is provided as either [HtmlEscapeMode.attribute] or
   /// [HtmlEscapeMode.element], only the corresponding subset of HTML
-  /// characters are escaped.
+  /// characters is escaped.
   /// The default is to escape all HTML characters.
   const HtmlEscape([this.mode = HtmlEscapeMode.unknown]);
 
diff --git a/sdk/lib/convert/json.dart b/sdk/lib/convert/json.dart
index a4aeb6a..cc9afdc 100644
--- a/sdk/lib/convert/json.dart
+++ b/sdk/lib/convert/json.dart
@@ -76,6 +76,39 @@
 ///
 /// Shorthand for `json.encode`. Useful if a local variable shadows the global
 /// [json] constant.
+///
+/// Example:
+/// ```dart
+/// const data = {'text': 'foo', 'value': 2, 'status': false, 'extra': null};
+/// final String jsonString = jsonEncode(data);
+/// print(jsonString); // {"text":"foo","value":2,"status":false,"extra":null}
+/// ```
+///
+/// Example of converting an otherwise unsupported object to a
+/// custom JSON format:
+///
+/// ```dart
+/// class CustomClass {
+///   final String text;
+///   final int value;
+///   CustomClass({required this.text, required this.value});
+///   CustomClass.fromJson(Map<String, dynamic> json)
+///       : text = json['text'],
+///         value = json['value'];
+///
+///   static Map<String, dynamic> toJson(CustomClass value) =>
+///       {'text': value.text, 'value': value.value};
+/// }
+///
+/// void main() {
+///   final CustomClass cc = CustomClass(text: 'Dart', value: 123);
+///   final jsonText = jsonEncode({'cc': cc},
+///       toEncodable: (Object? value) => value is CustomClass
+///           ? CustomClass.toJson(value)
+///           : throw UnsupportedError('Cannot convert to JSON: $value'));
+///   print(jsonText); // {"cc":{"text":"Dart","value":123}}
+/// }
+/// ```
 String jsonEncode(Object? object,
         {Object? toEncodable(Object? nonEncodable)?}) =>
     json.encode(object, toEncodable: toEncodable);
@@ -91,6 +124,32 @@
 ///
 /// Shorthand for `json.decode`. Useful if a local variable shadows the global
 /// [json] constant.
+///
+/// Example:
+/// ```dart
+/// const jsonString =
+///     '{"text": "foo", "value": 1, "status": false, "extra": null}';
+///
+/// final data = jsonDecode(jsonString);
+/// print(data['text']); // foo
+/// print(data['value']); // 1
+/// print(data['status']); // false
+/// print(data['extra']); // null
+///
+/// const jsonArray = '''
+///   [{"text": "foo", "value": 1, "status": true},
+///    {"text": "bar", "value": 2, "status": false}]
+/// ''';
+///
+/// final List<dynamic> dataList = jsonDecode(jsonArray);
+/// print(dataList[0]); // {text: foo, value: 1, status: true}
+/// print(dataList[1]); // {text: bar, value: 2, status: false}
+///
+/// final item = dataList[0];
+/// print(item['text']); // foo
+/// print(item['value']); // 1
+/// print(item['status']); // false
+/// ```
 dynamic jsonDecode(String source,
         {Object? reviver(Object? key, Object? value)?}) =>
     json.decode(source, reviver: reviver);
@@ -185,6 +244,30 @@
 }
 
 /// This class converts JSON objects to strings.
+///
+/// Example:
+///
+/// ```dart
+/// const JsonEncoder encoder = JsonEncoder();
+/// const data = {'text': 'foo', 'value': '2'};
+///
+/// final String jsonString = encoder.convert(data);
+/// print(jsonString); // {"text":"foo","value":"2"}
+/// ```
+///
+/// Example of pretty-printed output:
+///
+/// ```dart
+/// const JsonEncoder encoder = JsonEncoder.withIndent('  ');
+///
+/// const data = {'text': 'foo', 'value': '2'};
+/// final String jsonString = encoder.convert(data);
+/// print(jsonString);
+/// // {
+/// //   "text": "foo",
+/// //   "value": "2"
+/// // }
+/// ```
 class JsonEncoder extends Converter<Object?, String> {
   /// The string used for indention.
   ///
@@ -478,6 +561,29 @@
 /// A JSON input must be the JSON encoding of a single JSON value,
 /// which can be a list or map containing other values.
 ///
+/// Throws [FormatException] if the input is not valid JSON text.
+///
+/// Example:
+/// ```dart
+/// const JsonDecoder decoder = JsonDecoder();
+///
+/// const String jsonString = '''
+///   {
+///     "data": [{"text": "foo", "value": 1 },
+///              {"text": "bar", "value": 2 }],
+///     "text": "Dart"
+///   }
+/// ''';
+///
+/// final Map<String, dynamic> object = decoder.convert(jsonString);
+///
+/// final item = object['data'][0];
+/// print(item['text']); // foo
+/// print(item['value']); // 1
+///
+/// print(object['text']); // Dart
+/// ```
+///
 /// When used as a [StreamTransformer], the input stream may emit
 /// multiple strings. The concatenation of all of these strings must
 /// be a valid JSON encoding of a single JSON value.
diff --git a/sdk/lib/convert/latin1.dart b/sdk/lib/convert/latin1.dart
index f396682..76b2dbd 100644
--- a/sdk/lib/convert/latin1.dart
+++ b/sdk/lib/convert/latin1.dart
@@ -63,12 +63,48 @@
 }
 
 /// This class converts strings of only ISO Latin-1 characters to bytes.
+///
+/// Example:
+/// ```dart
+/// final latin1Encoder = latin1.encoder;
+///
+/// const sample = 'àáâãäå';
+/// final encoded = latin1Encoder.convert(sample);
+/// print(encoded); // [224, 225, 226, 227, 228, 229]
+/// ```
 class Latin1Encoder extends _UnicodeSubsetEncoder {
   const Latin1Encoder() : super(_latin1Mask);
 }
 
 /// This class converts Latin-1 bytes (lists of unsigned 8-bit integers)
 /// to a string.
+///
+/// Example:
+/// ```dart
+/// final latin1Decoder = latin1.decoder;
+///
+/// const encodedBytes = [224, 225, 226, 227, 228, 229];
+/// final decoded = latin1Decoder.convert(encodedBytes);
+/// print(decoded); // àáâãäå
+///
+/// // Hexadecimal values as source
+/// const hexBytes = [0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5];
+/// final decodedHexBytes = latin1Decoder.convert(hexBytes);
+/// print(decodedHexBytes); // àáâãäå
+/// ```
+/// Throws a [FormatException] if the encoded input contains values that are
+/// not in the range 0 .. 255 and [allowInvalid] is false ( the default ).
+///
+/// If [allowInvalid] is true, invalid bytes are converted
+/// to Unicode Replacement character U+FFFD (�).
+///
+/// Example with `allowInvalid` set to true:
+/// ```dart
+/// const latin1Decoder = Latin1Decoder(allowInvalid: true);
+/// const encodedBytes = [300];
+/// final decoded = latin1Decoder.convert(encodedBytes);
+/// print(decoded); // �
+/// ```
 class Latin1Decoder extends _UnicodeSubsetDecoder {
   /// Instantiates a new [Latin1Decoder].
   ///
diff --git a/sdk/lib/convert/line_splitter.dart b/sdk/lib/convert/line_splitter.dart
index 85f0ab6..2e01ae6 100644
--- a/sdk/lib/convert/line_splitter.dart
+++ b/sdk/lib/convert/line_splitter.dart
@@ -10,12 +10,31 @@
 
 /// 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.
+/// A line is terminated by either:
+/// * a CR, carriage return: U+000D ('\r')
+/// * a LF, line feed (Unix line break): U+000A ('\n') or
+/// * a CR+LF sequence (DOS/Windows line break), and
+/// * a final non-empty line can be ended by the end of the input.
 ///
-/// The returned lines do not contain the line terminators.
-
+/// The resulting lines do not contain the line terminators.
+///
+/// Example:
+/// ```dart
+/// const splitter = LineSplitter();
+/// const sampleText =
+///     'Dart is: \r an object-oriented \n class-based \n garbage-collected '
+///     '\r\n language with C-style syntax \r\n';
+///
+/// final sampleTextLines = splitter.convert(sampleText);
+/// for (var i = 0; i < sampleTextLines.length; i++) {
+///   print('$i: ${sampleTextLines[i]}');
+/// }
+/// // 0: Dart is:
+/// // 1:  an object-oriented
+/// // 2:  class-based
+/// // 3:  garbage-collected
+/// // 4:  language with C-style syntax
+/// ```
 class LineSplitter extends StreamTransformerBase<String, String> {
   const LineSplitter();
 
diff --git a/sdk/lib/convert/utf.dart b/sdk/lib/convert/utf.dart
index 57a2dac..47f2647 100644
--- a/sdk/lib/convert/utf.dart
+++ b/sdk/lib/convert/utf.dart
@@ -40,7 +40,7 @@
   const Utf8Codec({bool allowMalformed = false})
       : _allowMalformed = allowMalformed;
 
-  /// The name of this codec, "utf-8".
+  /// The name of this codec is "utf-8".
   String get name => "utf-8";
 
   /// Decodes the UTF-8 [codeUnits] (a list of unsigned 8-bit integers) to the
@@ -49,7 +49,7 @@
   /// If the [codeUnits] start with the encoding of a
   /// [unicodeBomCharacterRune], that character is discarded.
   ///
-  /// If [allowMalformed] is `true` the decoder replaces invalid (or
+  /// If [allowMalformed] is `true`, the decoder replaces invalid (or
   /// unterminated) character sequences with the Unicode Replacement character
   /// `U+FFFD` (�). Otherwise it throws a [FormatException].
   ///
@@ -74,6 +74,14 @@
 
 /// This class converts strings to their UTF-8 code units (a list of
 /// unsigned 8-bit integers).
+///
+/// Example:
+/// ```dart
+/// final utf8Encoder = utf8.encoder;
+/// const sample = 'Îñţérñåţîöñåļîžåţîờñ';
+/// final encodedSample = utf8Encoder.convert(sample);
+/// print(encodedSample);
+/// ```
 class Utf8Encoder extends Converter<String, List<int>> {
   const Utf8Encoder();
 
@@ -148,10 +156,10 @@
   /// writes it to [_buffer].
   ///
   /// Returns true if the [nextCodeUnit] was combined with the
-  /// [leadingSurrogate]. If it wasn't then nextCodeUnit was not a trailing
+  /// [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 a replacement
+  /// It is safe to pass 0 for [nextCodeUnit], in which case a replacement
   /// character is written to represent the unpaired lead surrogate.
   bool _writeSurrogate(int leadingSurrogate, int nextCodeUnit) {
     if (_isTailSurrogate(nextCodeUnit)) {
@@ -285,6 +293,31 @@
 
 /// This class converts UTF-8 code units (lists of unsigned 8-bit integers)
 /// to a string.
+///
+/// Example:
+/// ```dart
+/// final utf8Decoder = utf8.decoder;
+/// const encodedBytes = [
+///   195, 142, 195, 177, 197, 163, 195, 169, 114, 195, 177, 195, 165, 197,
+///   163, 195, 174, 195, 182, 195, 177, 195, 165, 196, 188, 195, 174, 197,
+///   190, 195, 165, 197, 163, 195, 174, 225, 187, 157, 195, 177];
+///
+/// final decodedBytes = utf8Decoder.convert(encodedBytes);
+/// print(decodedBytes); // Îñţérñåţîöñåļîžåţîờñ
+/// ```
+/// Throws a [FormatException] if the encoded input contains
+/// invalid UTF-8 byte sequences and [allowMalformed] is `false` (the default).
+///
+/// If [allowMalformed] is `true`, invalid byte sequences are converted into
+/// one or more Unicode replacement characters, U+FFFD ('�').
+///
+/// Example with `allowMalformed` set to true:
+/// ```dart
+/// const utf8Decoder = Utf8Decoder(allowMalformed: true);
+/// const encodedBytes = [0xFF];
+/// final decodedBytes = utf8Decoder.convert(encodedBytes);
+/// print(decodedBytes); // �
+/// ```
 class Utf8Decoder extends Converter<List<int>, String> {
   final bool _allowMalformed;
 
@@ -293,7 +326,7 @@
   /// The optional [allowMalformed] argument defines how [convert] deals
   /// with invalid or unterminated character sequences.
   ///
-  /// If it is `true` [convert] replaces invalid (or unterminated) character
+  /// 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})
@@ -302,7 +335,7 @@
   /// 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].
+  /// Uses the code units from [start] to, but not including, [end].
   /// If [end] is omitted, it defaults to `codeUnits.length`.
   ///
   /// If the [codeUnits] start with the encoding of a
diff --git a/sdk/lib/core/annotations.dart b/sdk/lib/core/annotations.dart
index 4b7140b..1c2a416 100644
--- a/sdk/lib/core/annotations.dart
+++ b/sdk/lib/core/annotations.dart
@@ -159,7 +159,7 @@
 ///
 /// For example:
 ///
-/// ```dart template:none
+/// ```dart template:top
 /// @pragma('Tool:pragma-name', [param1, param2, ...])
 /// class Foo { }
 ///
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index 3770a2b..6190c83 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -92,6 +92,23 @@
   /// trace filled in the first time they are thrown by a `throw`
   /// expression.
   external StackTrace? get stackTrace;
+
+  /// Throws [error] with associated stack trace [stackTrace].
+  ///
+  /// If [error] extends [Error] and has not yet been thrown,
+  /// its [stackTrace] is set as well, just as if it was thrown by a `throw`.
+  /// The actual stack trace captured along with the [error],
+  /// or set on [error] if it is an [Error],
+  /// may not be the [stackTrace] object itself,
+  /// but will be a stack trace with the same content.
+  @Since("2.16")
+  static Never throwWithStackTrace(Object error, StackTrace stackTrace) {
+    checkNotNullable(error, "error");
+    checkNotNullable(stackTrace, "stackTrace");
+    _throw(error, stackTrace);
+  }
+
+  external static Never _throw(Object error, StackTrace stackTrace);
 }
 
 /// Error thrown by the runtime system when an assert statement fails.
diff --git a/sdk/lib/core/set.dart b/sdk/lib/core/set.dart
index d94a58f..9880ea6 100644
--- a/sdk/lib/core/set.dart
+++ b/sdk/lib/core/set.dart
@@ -13,8 +13,8 @@
 /// elements are treated as being the same for any operation on the set.
 ///
 /// The default [Set] implementation, [LinkedHashSet], considers objects
-/// indistinguishable if they are equal with regard to
-/// operator [Object.==].
+/// indistinguishable if they are equal with regard to [Object.==] and
+/// [Object.hashCode].
 ///
 /// Iterating over elements of a set may be either unordered
 /// or ordered in some way. Examples:
@@ -57,7 +57,7 @@
   /// All the [elements] should be instances of [E].
   /// The `elements` iterable itself can have any type,
   /// so this constructor can be used to down-cast a `Set`, for example as:
-  /// ```dart
+  /// ```
   /// Set<SuperType> superSet = ...;
   /// Set<SubType> subSet =
   ///     Set<SubType>.from(superSet.where((e) => e is SubType));
@@ -68,6 +68,11 @@
   ///
   /// The set is equivalent to one created by
   /// `LinkedHashSet<E>.from(elements)`.
+  /// ```dart
+  /// final numbers = <num>{10, 20, 30};
+  /// final setFrom = Set<int>.from(numbers);
+  /// print(setFrom); // {10, 20, 30}
+  /// ```
   factory Set.from(Iterable elements) = LinkedHashSet<E>.from;
 
   /// Creates a [Set] from [elements].
@@ -78,12 +83,21 @@
   ///
   /// The set is equivalent to one created by
   /// `LinkedHashSet<E>.of(elements)`.
+  /// ```dart
+  /// final baseSet = <int>{1, 2, 3};
+  /// final setOf = Set<num>.of(baseSet);
+  /// print(setOf); // {1, 2, 3}
+  /// ```
   factory Set.of(Iterable<E> elements) = LinkedHashSet<E>.of;
 
   /// Creates an unmodifiable [Set] from [elements].
   ///
   /// The new set behaves like the result of [Set.of],
   /// except that the set returned by this constructor is not modifiable.
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// final unmodifiableSet = Set.unmodifiable(characters);
+  /// ```
   @Since("2.12")
   factory Set.unmodifiable(Iterable<E> elements) =>
       UnmodifiableSetView<E>(<E>{...elements});
@@ -103,7 +117,7 @@
   /// the store will throw unless the value is also an instance of [S].
   ///
   /// If all accessed elements of [source] are actually instances of [T],
-  /// and if all elements added to the returned set are actually instance
+  /// and if all elements added to the returned set are actually instances
   /// of [S],
   /// then the returned set can be used as a `Set<T>`.
   ///
@@ -121,7 +135,7 @@
   /// that is not an instance of [R], the access will throw instead.
   ///
   /// Elements added to the set (e.g., by using [add] or [addAll])
-  /// must be instance of [R] to be valid arguments to the adding function,
+  /// must be instances of [R] to be valid arguments to the adding function,
   /// and they must be instances of [E] as well to be accepted by
   /// this set as well.
   ///
@@ -140,6 +154,11 @@
   Iterator<E> get iterator;
 
   /// Whether [value] is in the set.
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// final containsB = characters.contains('B'); // true
+  /// final containsD = characters.contains('D'); // false
+  /// ```
   bool contains(Object? value);
 
   /// Adds [value] to the set.
@@ -149,18 +168,23 @@
   ///
   /// Example:
   /// ```dart
-  /// var set = Set();
-  /// var time1 = DateTime.fromMillisecondsSinceEpoch(0);
-  /// var time2 = DateTime.fromMillisecondsSinceEpoch(0);
+  /// final dateTimes = <DateTime>{};
+  /// final time1 = DateTime.fromMillisecondsSinceEpoch(0);
+  /// final time2 = DateTime.fromMillisecondsSinceEpoch(0);
   /// // time1 and time2 are equal, but not identical.
   /// assert(time1 == time2);
   /// assert(!identical(time1, time2));
-  /// set.add(time1);  // => true.
+  /// final time1Added = dateTimes.add(time1);
+  /// print(time1Added); // true
   /// // A value equal to time2 exists already in the set, and the call to
   /// // add doesn't change the set.
-  /// set.add(time2);  // => false.
-  /// assert(set.length == 1);
-  /// assert(identical(time1, set.first));
+  /// final time2Added = dateTimes.add(time2);
+  /// print(time2Added); // false
+  ///
+  /// print(dateTimes); // {1970-01-01 02:00:00.000}
+  /// assert(dateTimes.length == 1);
+  /// assert(identical(time1, dateTimes.first));
+  /// print(dateTimes.length);
   /// ```
   bool add(E value);
 
@@ -168,12 +192,23 @@
   ///
   /// Equivalent to adding each element in [elements] using [add],
   /// but some collections may be able to optimize it.
+  /// ```dart
+  /// final characters = <String>{'A', 'B'};
+  /// characters.addAll({'A', 'B', 'C'});
+  /// print(characters); // {A, B, C}
+  /// ```
   void addAll(Iterable<E> elements);
 
   /// Removes [value] from the set.
   ///
   /// Returns `true` if [value] was in the set, and `false` if not.
   /// The method has no effect if [value] was not in the set.
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// final didRemoveB = characters.remove('B'); // true
+  /// final didRemoveD = characters.remove('D'); // false
+  /// print(characters); // {A, C}
+  /// ```
   bool remove(Object? value);
 
   /// If an object equal to [object] is in the set, return it.
@@ -188,9 +223,21 @@
   /// rather than being based on an actual object instance,
   /// then there may not be a specific object instance representing the
   /// set element.
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// final containsB = characters.lookup('B');
+  /// print(containsB); // B
+  /// final containsD = characters.lookup('D');
+  /// print(containsD); // null
+  /// ```
   E? lookup(Object? object);
 
   /// Removes each element of [elements] from this set.
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// characters.removeAll({'A', 'B', 'X'});
+  /// print(characters); // {C}
+  /// ```
   void removeAll(Iterable<Object?> elements);
 
   /// Removes all elements of this set that are not elements in [elements].
@@ -199,36 +246,85 @@
   /// set that is equal to it (according to `this.contains`), and if so, the
   /// equal element in this set is retained, and elements that are not equal
   /// to any element in [elements] are removed.
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// characters.retainAll({'A', 'B', 'X'});
+  /// print(characters); // {A, B}
+  /// ```
   void retainAll(Iterable<Object?> elements);
 
   /// Removes all elements of this set that satisfy [test].
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// characters.removeWhere((element) => element.startsWith('B'));
+  /// print(characters); // {A, C}
+  /// ```
   void removeWhere(bool test(E element));
 
   /// Removes all elements of this set that fail to satisfy [test].
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// characters.retainWhere(
+  ///     (element) => element.startsWith('B') || element.startsWith('C'));
+  /// print(characters); // {B, C}
+  /// ```
   void retainWhere(bool test(E element));
 
   /// Whether this set contains all the elements of [other].
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// final containsAB = characters.containsAll({'A', 'B'});
+  /// print(containsAB); // true
+  /// final containsAD = characters.containsAll({'A', 'D'});
+  /// print(containsAD); // false
+  /// ```
   bool containsAll(Iterable<Object?> other);
 
   /// Creates a new set which is the intersection between this set and [other].
   ///
   /// That is, the returned set contains all the elements of this [Set] that
   /// are also elements of [other] according to `other.contains`.
+  /// ```dart
+  /// final characters1 = <String>{'A', 'B', 'C'};
+  /// final characters2 = <String>{'A', 'E', 'F'};
+  /// final unionSet = characters1.intersection(characters2);
+  /// print(unionSet); // {A}
+  /// ```
   Set<E> intersection(Set<Object?> other);
 
   /// Creates a new set which contains all the elements of this set and [other].
   ///
   /// That is, the returned set contains all the elements of this [Set] and
   /// all the elements of [other].
+  /// ```dart
+  /// final characters1 = <String>{'A', 'B', 'C'};
+  /// final characters2 = <String>{'A', 'E', 'F'};
+  /// final unionSet1 = characters1.union(characters2);
+  /// print(unionSet1); // {A, B, C, E, F}
+  /// final unionSet2 = characters2.union(characters1);
+  /// print(unionSet2); // {A, E, F, B, C}
+  /// ```
   Set<E> union(Set<E> other);
 
   /// Creates a new set with the elements of this that are not in [other].
   ///
   /// That is, the returned set contains all the elements of this [Set] that
   /// are not elements of [other] according to `other.contains`.
+  /// ```dart
+  /// final characters1 = <String>{'A', 'B', 'C'};
+  /// final characters2 = <String>{'A', 'E', 'F'};
+  /// final differenceSet1 = characters1.difference(characters2);
+  /// print(differenceSet1); // {B, C}
+  /// final differenceSet2 = characters2.difference(characters1);
+  /// print(differenceSet2); // {E, F}
+  /// ```
   Set<E> difference(Set<Object?> other);
 
   /// Removes all elements from the set.
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// characters.clear(); // {}
+  /// ```
   void clear();
 
   /// Creates a [Set] with the same elements and behavior as this `Set`.
diff --git a/sdk/lib/core/stopwatch.dart b/sdk/lib/core/stopwatch.dart
index 45da67e..959fcbe 100644
--- a/sdk/lib/core/stopwatch.dart
+++ b/sdk/lib/core/stopwatch.dart
@@ -4,7 +4,47 @@
 
 part of dart.core;
 
-/// A simple stopwatch interface to measure elapsed time.
+/// A stopwatch which measures time while it's running.
+///
+/// A stopwatch is either running or stopped.
+/// It measures the elapsed time that passes while the stopwatch is running.
+///
+/// When a stopwatch is initially created, it is stopped and has measured no
+/// elapsed time.
+///
+/// The elapsed time can be accessed in various formats using
+/// [elapsed], [elapsedMilliseconds], [elapsedMicroseconds] or [elapsedTicks].
+///
+/// The stopwatch is started by calling [start].
+///
+/// Example:
+/// ```dart
+/// final stopwatch = Stopwatch();
+/// print(stopwatch.elapsedMilliseconds); // 0
+/// print(stopwatch.isRunning); // false
+/// stopwatch.start();
+/// print(stopwatch.isRunning); // true
+/// ```
+/// To stop or pause the stopwatch, use [stop].
+/// Use [start] to continue again when only pausing temporarily.
+/// ```
+/// stopwatch.stop();
+/// print(stopwatch.isRunning); // false
+/// Duration elapsed = stopwatch.elapsed;
+/// await Future.delayed(const Duration(seconds: 1));
+/// assert(stopwatch.elapsed == elapsed); // No measured time elapsed.
+/// stopwatch.start(); // Continue measuring.
+/// ```
+/// The [reset] method sets the elapsed time back to zero.
+/// It can be called whether the stopwatch is running or not,
+/// and doesn't change whether it's running.
+/// ```
+/// // Do some work.
+/// stopwatch.stop();
+/// print(stopwatch.elapsedMilliseconds); // Likely > 0.
+/// stopwatch.reset();
+/// print(stopwatch.elapsedMilliseconds); // 0
+/// ```
 class Stopwatch {
   /// Cached frequency of the system in Hz (ticks per second).
   ///
@@ -22,7 +62,7 @@
   /// The following example shows how to start a [Stopwatch]
   /// immediately after allocation.
   /// ```dart
-  /// var stopwatch = Stopwatch()..start();
+  /// final stopwatch = Stopwatch()..start();
   /// ```
   Stopwatch() {
     _frequency; // Ensures initialization before using any method.
@@ -33,7 +73,7 @@
 
   /// Starts the [Stopwatch].
   ///
-  /// The [elapsed] count is increasing monotonically. If the [Stopwatch] has
+  /// The [elapsed] count increases monotonically. If the [Stopwatch] has
   /// been stopped, then calling start again restarts it without resetting the
   /// [elapsed] count.
   ///
diff --git a/sdk/lib/ffi/abi.dart b/sdk/lib/ffi/abi.dart
new file mode 100644
index 0000000..f5cba04
--- /dev/null
+++ b/sdk/lib/ffi/abi.dart
@@ -0,0 +1,160 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 dart.ffi;
+
+/// An application binary interface (ABI).
+///
+/// An ABI defines the memory layout of data
+/// and the function call protocol for native code.
+/// It is usually defined by the an operating system for each
+/// architecture that operating system runs on.
+///
+/// The Dart VM can run on a variety of operating systems and architectures.
+/// Supported ABIs are represented by `Abi` objects.
+/// See [values] for all the supported ABIs.
+class Abi {
+  /// The application binary interface for Android on the Arm architecture.
+  static const androidArm = _androidArm;
+
+  /// The application binary interface for Android on the Arm64 architecture.
+  static const androidArm64 = _androidArm64;
+
+  /// The application binary interface for Android on the IA32 architecture.
+  static const androidIA32 = _androidIA32;
+
+  /// The application binary interface for android on the X64 architecture.
+  static const androidX64 = _androidX64;
+
+  /// The application binary interface for Fuchsia on the Arm64 architecture.
+  static const fuchsiaArm64 = _fuchsiaArm64;
+
+  /// The application binary interface for Fuchsia on the X64 architecture.
+  static const fuchsiaX64 = _fuchsiaX64;
+
+  /// The application binary interface for iOS on the Arm architecture.
+  static const iosArm = _iosArm;
+
+  /// The application binary interface for iOS on the Arm64 architecture.
+  static const iosArm64 = _iosArm64;
+
+  /// The application binary interface for iOS on the X64 architecture.
+  static const iosX64 = _iosX64;
+
+  /// The application binary interface for Linux on the Arm architecture.
+  ///
+  /// Does not distinguish between hard and soft fp. Currently, no uses of Abi
+  /// require this distinction.
+  static const linuxArm = _linuxArm;
+
+  /// The application binary interface for linux on the Arm64 architecture.
+  static const linuxArm64 = _linuxArm64;
+
+  /// The application binary interface for linux on the IA32 architecture.
+  static const linuxIA32 = _linuxIA32;
+
+  /// The application binary interface for linux on the X64 architecture.
+  static const linuxX64 = _linuxX64;
+
+  /// The application binary interface for MacOS on the Arm64 architecture.
+  static const macosArm64 = _macosArm64;
+
+  /// The application binary interface for MacOS on the X64 architecture.
+  static const macosX64 = _macosX64;
+
+  /// The application binary interface for Windows on the Arm64 architecture.
+  static const windowsArm64 = _windowsArm64;
+
+  /// The application binary interface for Windows on the IA32 architecture.
+  static const windowsIA32 = _windowsIA32;
+
+  /// The application binary interface for Windows on the X64 architecture.
+  static const windowsX64 = _windowsX64;
+
+  /// The ABIs that the DartVM can run on.
+  ///
+  /// Does not contain a `macosIA32`. We have stopped supporting 32-bit MacOS.
+  ///
+  /// Includes [windowsArm64], even though it is currently not supported.
+  /// Support has been requested for Flutter.
+  /// https://github.com/flutter/flutter/issues/53120
+  // TODO(http://dartbug.com/47824): Remove the above comment when supported.
+  static const values = [
+    androidArm,
+    androidArm64,
+    androidIA32,
+    androidX64,
+    fuchsiaArm64,
+    fuchsiaX64,
+    iosArm,
+    iosArm64,
+    iosX64,
+    linuxArm,
+    linuxArm64,
+    linuxIA32,
+    linuxX64,
+    macosArm64,
+    macosX64,
+    windowsArm64,
+    windowsIA32,
+    windowsX64,
+  ];
+
+  /// The ABI the Dart VM is currently running on.
+  external factory Abi.current();
+
+  /// A string representation of this ABI.
+  ///
+  /// The string is equal to the 'on' part from `Platform.version` and
+  /// `dart --version`.
+  @override
+  String toString() => '${_os.name}_${_architecture.name}';
+
+  /// The operating system of this [Abi].
+  final _OS _os;
+
+  /// The architecture of this [Abi].
+  final _Architecture _architecture;
+
+  /// The constructor is private so that we can use [Abi.values] as opaque
+  /// tokens.
+  const Abi._(this._architecture, this._os);
+
+  static const _androidArm = Abi._(_Architecture.arm, _OS.android);
+  static const _androidArm64 = Abi._(_Architecture.arm64, _OS.android);
+  static const _androidIA32 = Abi._(_Architecture.ia32, _OS.android);
+  static const _androidX64 = Abi._(_Architecture.x64, _OS.android);
+  static const _fuchsiaArm64 = Abi._(_Architecture.arm64, _OS.fuchsia);
+  static const _fuchsiaX64 = Abi._(_Architecture.x64, _OS.fuchsia);
+  static const _iosArm = Abi._(_Architecture.arm, _OS.ios);
+  static const _iosArm64 = Abi._(_Architecture.arm64, _OS.ios);
+  static const _iosX64 = Abi._(_Architecture.x64, _OS.ios);
+  static const _linuxArm = Abi._(_Architecture.arm, _OS.linux);
+  static const _linuxArm64 = Abi._(_Architecture.arm64, _OS.linux);
+  static const _linuxIA32 = Abi._(_Architecture.ia32, _OS.linux);
+  static const _linuxX64 = Abi._(_Architecture.x64, _OS.linux);
+  static const _macosArm64 = Abi._(_Architecture.arm64, _OS.macos);
+  static const _macosX64 = Abi._(_Architecture.x64, _OS.macos);
+  static const _windowsArm64 = Abi._(_Architecture.arm64, _OS.windows);
+  static const _windowsIA32 = Abi._(_Architecture.ia32, _OS.windows);
+  static const _windowsX64 = Abi._(_Architecture.x64, _OS.windows);
+}
+
+/// The hardware architectures the Dart VM runs on.
+enum _Architecture {
+  arm,
+  arm64,
+  ia32,
+  x64,
+}
+
+/// The operating systems the Dart VM runs on.
+enum _OS {
+  android,
+  fuchsia,
+  ios,
+  linux,
+  macos,
+  windows,
+}
diff --git a/sdk/lib/ffi/ffi.dart b/sdk/lib/ffi/ffi.dart
index fa98c88..00eee44 100644
--- a/sdk/lib/ffi/ffi.dart
+++ b/sdk/lib/ffi/ffi.dart
@@ -15,12 +15,13 @@
 import 'dart:isolate';
 import 'dart:typed_data';
 
-part "native_type.dart";
-part "allocation.dart";
-part "annotations.dart";
-part "dynamic_library.dart";
-part "struct.dart";
-part "union.dart";
+part 'abi.dart';
+part 'native_type.dart';
+part 'allocation.dart';
+part 'annotations.dart';
+part 'dynamic_library.dart';
+part 'struct.dart';
+part 'union.dart';
 
 /// Number of bytes used by native type T.
 ///
@@ -29,12 +30,12 @@
 /// This function must be invoked with a compile-time constant [T].
 external int sizeOf<T extends NativeType>();
 
-/// Represents a pointer into the native C memory corresponding to "NULL", e.g.
+/// Represents a pointer into the native C memory corresponding to 'NULL', e.g.
 /// a pointer with address 0.
 final Pointer<Never> nullptr = Pointer.fromAddress(0);
 
 /// Represents a pointer into the native C memory. Cannot be extended.
-@pragma("vm:entry-point")
+@pragma('vm:entry-point')
 class Pointer<T extends NativeType> extends NativeType {
   /// Construction from raw integer.
   external factory Pointer.fromAddress(int ptr);
@@ -56,7 +57,7 @@
   /// Does not accept dynamic invocations -- where the type of the receiver is
   /// [dynamic].
   external static Pointer<NativeFunction<T>> fromFunction<T extends Function>(
-      @DartRepresentationOf("T") Function f,
+      @DartRepresentationOf('T') Function f,
       [Object? exceptionalReturn]);
 
   /// Access to the raw pointer value.
@@ -150,7 +151,7 @@
     on Pointer<NativeFunction<NF>> {
   /// Convert to Dart function, automatically marshalling the arguments
   /// and return value.
-  external DF asFunction<@DartRepresentationOf("NF") DF extends Function>(
+  external DF asFunction<@DartRepresentationOf('NF') DF extends Function>(
       {bool isLeaf: false});
 }
 
@@ -826,8 +827,8 @@
 /// Annotation to be used for marking an external function as FFI native.
 ///
 /// Example:
-///```dart template:none
-/// @FfiNative<Int64 Function(Int64, Int64)>("FfiNative_Sum", isLeaf:true)
+///```dart template:top
+/// @FfiNative<Int64 Function(Int64, Int64)>('FfiNative_Sum', isLeaf:true)
 /// external int sum(int a, int b);
 ///```
 /// Calling such functions will throw an exception if no resolver
@@ -844,7 +845,7 @@
 
 // Bootstrapping native for getting the FFI native C function pointer to look
 // up the FFI resolver.
-@pragma("vm:external-name", "Ffi_GetFfiNativeResolver")
+@pragma('vm:external-name', 'Ffi_GetFfiNativeResolver')
 external Pointer<NativeFunction<IntPtr Function(Handle, Handle, IntPtr)>>
     _get_ffi_native_resolver<T extends NativeFunction>();
 
diff --git a/sdk/lib/ffi/ffi_sources.gni b/sdk/lib/ffi/ffi_sources.gni
index 4152f91..f7b2838 100644
--- a/sdk/lib/ffi/ffi_sources.gni
+++ b/sdk/lib/ffi/ffi_sources.gni
@@ -6,6 +6,7 @@
   "ffi.dart",
 
   # The above file needs to be first as it lists the parts below.
+  "abi.dart",
   "allocation.dart",
   "annotations.dart",
   "dynamic_library.dart",
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 0a3a46e..cc93c1e 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -13099,13 +13099,9 @@
   /**
    * Allows access to all custom data attributes (data-*) set on this element.
    *
-   * The keys for the map must follow these rules:
-   *
-   * * The name must not begin with 'xml'.
-   * * The name cannot contain a semi-colon (';').
-   * * The name cannot contain any capital letters.
-   *
-   * Any keys from markup will be converted to camel-cased keys in the map.
+   * Any data attributes in the markup will be converted to camel-cased keys
+   * in the map based on [these conversion
+   * rules](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset).
    *
    * For example, HTML specified as:
    *
@@ -13117,6 +13113,8 @@
    *
    * See also:
    *
+   * * [HTML data-* attributes naming
+       restrictions](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/data-*)
    * * [Custom data
    *   attributes](http://dev.w3.org/html5/spec-preview/global-attributes.html#custom-data-attribute)
    */
@@ -23223,13 +23221,13 @@
   }
 
   /**
-   * Inserts all of the nodes into this node directly before refChild.
+   * Inserts all of the nodes into this node directly before child.
    *
    * See also:
    *
    * * [insertBefore]
    */
-  void insertAllBefore(Iterable<Node> newNodes, Node refChild) {
+  void insertAllBefore(Iterable<Node> newNodes, Node child) {
     if (newNodes is _ChildNodeListLazy) {
       _ChildNodeListLazy otherList = newNodes;
       if (identical(otherList._this, this)) {
@@ -23238,11 +23236,11 @@
 
       // Optimized route for copying between nodes.
       for (var i = 0, len = otherList.length; i < len; ++i) {
-        this.insertBefore(otherList._this.firstChild!, refChild);
+        this.insertBefore(otherList._this.firstChild!, child);
       }
     } else {
       for (var node in newNodes) {
-        this.insertBefore(node, refChild);
+        this.insertBefore(node, child);
       }
     }
   }
@@ -23525,7 +23523,9 @@
   bool hasChildNodes() native;
 
   /**
-   * Inserts all of the nodes into this node directly before refChild.
+   * Inserts the given node into this node directly before child.
+   * If child is `null`, then the given node is inserted at the end
+   * of this node's child nodes.
    *
    * ## Other resources
    *
diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart
index fbe663b..5d38bd8 100644
--- a/sdk/lib/internal/internal.dart
+++ b/sdk/lib/internal/internal.dart
@@ -644,7 +644,7 @@
 ///
 /// Example:
 ///
-/// ```dart template:none
+/// ```dart template:top
 /// class Two<A, B> {}
 ///
 /// print(extractTypeArguments<List>(<int>[], <T>() => new Set<T>()));
@@ -658,7 +658,7 @@
 /// The type argument T is important to choose which specific type parameter
 /// list in [instance]'s type hierarchy is being extracted. Consider:
 ///
-/// ```dart template:none
+/// ```dart template:top
 /// class A<T> {}
 /// class B<T> {}
 ///
diff --git a/sdk/lib/io/directory.dart b/sdk/lib/io/directory.dart
index 7fb3ed5..cbda1c3 100644
--- a/sdk/lib/io/directory.dart
+++ b/sdk/lib/io/directory.dart
@@ -233,20 +233,28 @@
   /// Returns a `Future<Directory>` that completes
   /// with a [Directory] for the renamed directory.
   ///
-  /// If [newPath] identifies an existing directory, that directory is
-  /// removed first.
+  /// If [newPath] identifies an existing directory, then the behavior is
+  /// platform-specific. On all platforms, the future completes with an
+  /// [FileSystemException] if the existing directory is not empty. On POSIX
+  /// systems, if [newPath] identifies an existing empty directory then that
+  /// directory is deleted before this directory is renamed.
+  ///
   /// If [newPath] identifies an existing file, the operation
-  /// fails and the future completes with an exception.
+  /// fails and the future completes with a [FileSystemException].
   Future<Directory> rename(String newPath);
 
   /// Synchronously renames this directory.
   ///
   /// Returns a [Directory] for the renamed directory.
   ///
-  /// If [newPath] identifies an existing directory, that directory is
-  /// removed first.
+  /// If [newPath] identifies an existing directory, then the behavior is
+  /// platform-specific. On all platforms, a [FileSystemException] is thrown
+  /// if the existing directory is not empty. On POSIX systems, if [newPath]
+  /// identifies an existing empty directory then that directory is deleted
+  /// before this directory is renamed.
+  ///
   /// If [newPath] identifies an existing file the operation
-  /// fails and an exception is thrown.
+  /// fails and a [FileSystemException] is thrown.
   Directory renameSync(String newPath);
 
   /// A [Directory] whose path is the absolute path of [this].
diff --git a/sdk/lib/io/file_system_entity.dart b/sdk/lib/io/file_system_entity.dart
index 4eedcf8..ca14f1f 100644
--- a/sdk/lib/io/file_system_entity.dart
+++ b/sdk/lib/io/file_system_entity.dart
@@ -93,6 +93,9 @@
 
   /// Calls the operating system's `stat()` function (or equivalent) on [path].
   ///
+  /// If [path] is a symbolic link then it is resolved and results for the
+  /// resulting file are returned.
+  ///
   /// Returns a [FileStat] object containing the data returned by `stat()`.
   /// If the call fails, returns a [FileStat] object with [FileStat.type] set to
   /// [FileSystemEntityType.notFound] and the other fields invalid.
@@ -123,6 +126,9 @@
   /// Asynchronously calls the operating system's `stat()` function (or
   /// equivalent) on [path].
   ///
+  /// If [path] is a symbolic link then it is resolved and results for the
+  /// resulting file are returned.
+  ///
   /// Returns a [Future] which completes with the same results as [statSync].
   static Future<FileStat> stat(String path) {
     final IOOverrides? overrides = IOOverrides.current;
@@ -356,6 +362,9 @@
   /// Returns a `Future<FileStat>` object containing the data returned by
   /// `stat()`.
   ///
+  /// If [path] is a symbolic link then it is resolved and results for the
+  /// resulting file are returned.
+  ///
   /// If the call fails, completes the future with a [FileStat] object
   /// with `.type` set to [FileSystemEntityType.notFound] and the other fields
   /// invalid.
@@ -367,6 +376,9 @@
   ///
   /// Returns a [FileStat] object containing the data returned by `stat()`.
   ///
+  /// If [path] is a symbolic link then it is resolved and results for the
+  /// resulting file are returned.
+  ///
   /// If the call fails, returns a [FileStat] object with `.type` set to
   /// [FileSystemEntityType.notFound] and the other fields invalid.
   FileStat statSync() => FileStat.statSync(path);
diff --git a/sdk/lib/io/overrides.dart b/sdk/lib/io/overrides.dart
index 65e7acf..c97e84d 100644
--- a/sdk/lib/io/overrides.dart
+++ b/sdk/lib/io/overrides.dart
@@ -90,7 +90,12 @@
       // ServerSocket
       Future<ServerSocket> Function(dynamic, int,
               {int backlog, bool v6Only, bool shared})?
-          serverSocketBind}) {
+          serverSocketBind,
+
+      // Standard Streams
+      Stdin Function()? stdin,
+      Stdout Function()? stdout,
+      Stdout Function()? stderr}) {
     IOOverrides overrides = new _IOOverridesScope(
       // Directory
       createDirectory,
@@ -124,6 +129,11 @@
 
       // ServerSocket
       serverSocketBind,
+
+      // Standard streams
+      stdin,
+      stdout,
+      stderr,
     );
     return _asyncRunZoned<R>(body, zoneValues: {_ioOverridesToken: overrides});
   }
@@ -286,6 +296,32 @@
     return ServerSocket._bind(address, port,
         backlog: backlog, v6Only: v6Only, shared: shared);
   }
+
+  // Standard streams
+
+  /// The standard input stream of data read by this program.
+  ///
+  /// When this override is installed, this getter overrides the behavior of
+  /// the top-level `stdin` getter.
+  Stdin get stdin {
+    return _stdin;
+  }
+
+  /// The standard output stream of data written by this program.
+  ///
+  /// When this override is installed, this getter overrides the behavior of
+  /// the top-level `stdout` getter.
+  Stdout get stdout {
+    return _stdout;
+  }
+
+  /// The standard output stream of errors written by this program.
+  ///
+  /// When this override is installed, this getter overrides the behavior of
+  /// the top-level `stderr` getter.
+  Stdout get stderr {
+    return _stderr;
+  }
 }
 
 class _IOOverridesScope extends IOOverrides {
@@ -327,6 +363,11 @@
   Future<ServerSocket> Function(dynamic, int,
       {int backlog, bool v6Only, bool shared})? _serverSocketBind;
 
+  // Standard streams
+  Stdin Function()? _stdin;
+  Stdout Function()? _stdout;
+  Stdout Function()? _stderr;
+
   _IOOverridesScope(
     // Directory
     this._createDirectory,
@@ -360,6 +401,11 @@
 
     // ServerSocket
     this._serverSocketBind,
+
+    // Standard streams
+    this._stdin,
+    this._stdout,
+    this._stderr,
   );
 
   // Directory
@@ -514,4 +560,21 @@
     return super.serverSocketBind(address, port,
         backlog: backlog, v6Only: v6Only, shared: shared);
   }
+
+  // Standard streams
+
+  @override
+  Stdin get stdin {
+    return _stdin?.call() ?? _previous?.stdin ?? super.stdin;
+  }
+
+  @override
+  Stdout get stdout {
+    return _stdout?.call() ?? _previous?.stdout ?? super.stdout;
+  }
+
+  @override
+  Stdout get stderr {
+    return _stderr?.call() ?? _previous?.stderr ?? super.stderr;
+  }
 }
diff --git a/sdk/lib/io/platform.dart b/sdk/lib/io/platform.dart
index 06dd98f..296456f 100644
--- a/sdk/lib/io/platform.dart
+++ b/sdk/lib/io/platform.dart
@@ -75,9 +75,12 @@
 
   /// Get the name of the current locale.
   ///
-  /// The result should include a language and country code
-  /// (e.g. "en_US", "de_AT") and may include a character set
-  /// (e.g. "en_US.UTF-8").
+  /// The result usually consists of
+  ///  - a language (e.g., "en"), or
+  ///  - a language and country code (e.g. "en_US", "de_AT"), or
+  ///  - a language, country code and character set (e.g. "en_US.UTF-8").
+  ///
+  /// On macOS and iOS, the locale is taken from CFLocaleGetIdentifier.
   ///
   /// On Linux and Fushia, the locale is taken from the "LANG" environment
   /// variable, which may be set to any value. For example:
diff --git a/sdk/lib/io/stdio.dart b/sdk/lib/io/stdio.dart
index 0ea8448..42b7bc2 100644
--- a/sdk/lib/io/stdio.dart
+++ b/sdk/lib/io/stdio.dart
@@ -362,9 +362,9 @@
   String toString() => "StdioType: $name";
 }
 
-Stdin? _stdin;
-Stdout? _stdout;
-Stdout? _stderr;
+final Stdin _stdin = _StdIOUtils._getStdioInputStream(_stdinFD);
+final Stdout _stdout = _StdIOUtils._getStdioOutputStream(_stdoutFD);
+final Stdout _stderr = _StdIOUtils._getStdioOutputStream(_stderrFD);
 
 // These may be set to different values by the embedder by calling
 // _setStdioFDs when initializing dart:io.
@@ -381,7 +381,7 @@
 
 /// The standard input stream of data read by this program.
 Stdin get stdin {
-  return _stdin ??= _StdIOUtils._getStdioInputStream(_stdinFD);
+  return IOOverrides.current?.stdin ?? _stdin;
 }
 
 /// The standard output stream of data written by this program.
@@ -390,7 +390,7 @@
 /// result in an unhandled asynchronous error unless there is an error handler
 /// on `done`.
 Stdout get stdout {
-  return _stdout ??= _StdIOUtils._getStdioOutputStream(_stdoutFD);
+  return IOOverrides.current?.stdout ?? _stdout;
 }
 
 /// The standard output stream of errors written by this program.
@@ -399,7 +399,7 @@
 /// result in an unhandled asynchronous error unless there is an error handler
 /// on `done`.
 Stdout get stderr {
-  return _stderr ??= _StdIOUtils._getStdioOutputStream(_stderrFD);
+  return IOOverrides.current?.stderr ?? _stderr;
 }
 
 /// Whether a stream is attached to a file, pipe, terminal, or
diff --git a/sdk/lib/js_util/js_util.dart b/sdk/lib/js_util/js_util.dart
index 7842a32..fcd668c 100644
--- a/sdk/lib/js_util/js_util.dart
+++ b/sdk/lib/js_util/js_util.dart
@@ -245,7 +245,7 @@
 
 /// Converts a JavaScript Promise to a Dart [Future].
 ///
-/// ```dart template:none
+/// ```dart template:top
 /// @JS()
 /// external Promise<num> get threePromise; // Resolves to 3
 ///
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 94cd7c1..2073134 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -24,6 +24,7 @@
 Language/Libraries_and_Scripts/Scripts/top_level_syntax_t01: SkipByDesign # Non-JS-interop external members are not supported
 Language/Libraries_and_Scripts/top_level_syntax_t01: SkipByDesign # Non-JS-interop external members are not supported
 Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t08: SkipByDesign # binary '~' produces different results in JavaScript and Dart
+Language/Types/Interface_Types/subtype_t27: Skip # https://github.com/dart-lang/sdk/issues/42641
 LanguageFeatures/Abstract-external-fields/static_analysis_external_A01_t01: SkipByDesign # Non-JS-interop external members are not supported
 LanguageFeatures/Abstract-external-fields/static_analysis_external_A01_t02: SkipByDesign # Non-JS-interop external members are not supported
 LanguageFeatures/Abstract-external-fields/static_analysis_external_A01_t03: SkipByDesign # Non-JS-interop external members are not supported
diff --git a/tests/co19_2/co19_2-dart2js.status b/tests/co19_2/co19_2-dart2js.status
index c5d8002..a63fb39 100644
--- a/tests/co19_2/co19_2-dart2js.status
+++ b/tests/co19_2/co19_2-dart2js.status
@@ -20,6 +20,7 @@
 Language/Libraries_and_Scripts/Scripts/top_level_syntax_t01: SkipByDesign # Non-JS-interop external members are not supported
 Language/Libraries_and_Scripts/top_level_syntax_t01: SkipByDesign # Non-JS-interop external members are not supported
 Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t08: SkipByDesign # binary '~' produces different results in JavaScript and Dart
+Language/Types/Interface_Types/subtype_t27: Skip # https://github.com/dart-lang/sdk/issues/42641
 LibTest/core/DateTime/DateTime.fromMicrosecondsSinceEpoch_A01_t01: SkipByDesign # microseconds are not supported in JavaScript
 LibTest/core/DateTime/microsecond_A01_t01: SkipByDesign # microseconds are not supported in JavaScript
 LibTest/core/DateTime/microsecondsSinceEpoch_A01_t01: SkipByDesign # microseconds are not supported in JavaScript
diff --git a/tests/corelib/bigint_test.dart b/tests/corelib/bigint_test.dart
index 93b6c16..39b8cdd 100644
--- a/tests/corelib/bigint_test.dart
+++ b/tests/corelib/bigint_test.dart
@@ -228,8 +228,10 @@
   var m = BigInt.parse(
       "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
       radix: 16);
-  var r = BigInt.parse("95929095851002583825372225918533539673793386278"
-                       "360575987103577151530201707061", radix: 10);
+  var r = BigInt.parse(
+      "95929095851002583825372225918533539673793386278"
+      "360575987103577151530201707061",
+      radix: 10);
   test(x, m, r);
 }
 
@@ -830,18 +832,10 @@
     }
   }
 
-  var illegalRadices = [-1, 0, 1, 37];
-  for (var radix in illegalRadices) {
-    try {
-      new BigInt.from(42).toRadixString(radix);
-      Expect.fail("Exception expected");
-    } on ArgumentError catch (e) {
-      // Nothing to do.
-    }
-  }
-
   // Try large numbers (regression test for issue 15316).
   var bignums = [
+    BigInt.parse("0x8"),
+    BigInt.parse("0x80"),
     BigInt.parse("0x80000000"),
     BigInt.parse("0x100000000"),
     BigInt.parse("0x10000000000000"),
@@ -871,6 +865,18 @@
           bignum, result, "${bignum.toRadixString(16)} -> $digits/$radix");
     }
   }
+
+  const illegalRadices = [-2, -1, 0, 1, 37];
+  for (final bignum in bignums) {
+    for (final radix in illegalRadices) {
+      try {
+        bignum.toRadixString(radix);
+        Expect.fail("Exception expected for .toRadixString($radix)");
+      } on ArgumentError catch (e) {
+        // Nothing to do.
+      }
+    }
+  }
 }
 
 testToString() {
diff --git a/tests/corelib/error_throw_with_stacktrace_test.dart b/tests/corelib/error_throw_with_stacktrace_test.dart
new file mode 100644
index 0000000..e74c80c
--- /dev/null
+++ b/tests/corelib/error_throw_with_stacktrace_test.dart
@@ -0,0 +1,210 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. 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";
+
+// Test of Error.throwWithStackTrace.
+
+main() {
+  // Ensure `systemStack` is different from any other stack tracek.
+  var systemStack = (() => StackTrace.current)();
+
+  // Test that an error can be thrown with a system stack trace..
+  {
+    var error = ArgumentError("e1");
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+      Expect.fail("Didn't throw: e1.1");
+    } on Error catch (e, s) {
+      Expect.identical(error, e, "e1.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$systemStack", "$s", "e1.3");
+      Expect.isNotNull(error.stackTrace, "e1.4");
+      Expect.equals("$systemStack", "${error.stackTrace}", "e1.5");
+    }
+  }
+
+  // Test that an error can be thrown with a user-created stack trace..
+  {
+    var stringStack = StackTrace.fromString("Nonce");
+    var error = ArgumentError("e2");
+    try {
+      Error.throwWithStackTrace(error, stringStack);
+      Expect.fail("Didn't throw: e2.1");
+    } on Error catch (e, s) {
+      Expect.identical(error, e, "e2.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$stringStack", "$s", "e2.3");
+      Expect.isNotNull(error.stackTrace, "e2.4");
+      Expect.equals("$stringStack", "${error.stackTrace}", "e2.5");
+    }
+  }
+
+  // Test that a non-error object can be thrown too.
+  {
+    var exception = FormatException("e3");
+    try {
+      Error.throwWithStackTrace(exception, systemStack);
+      Expect.fail("Didn't throw: e3.1");
+    } on Exception catch (e, s) {
+      Expect.identical(exception, e, "e3.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$systemStack", "$s", "e3.3");
+    }
+  }
+
+  // Test that an [Error] not extending {Error} can be thrown,
+  // but doesn't (and cannot) set the stack trace.
+  {
+    var error = CustomError("e4");
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+      Expect.fail("Didn't throw: e4.1");
+    } on Error catch (e, s) {
+      Expect.identical(error, e, "e4.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$systemStack", "$s", "e4.3");
+      Expect.isNull(error.stackTrace, "e4.4");
+    }
+  }
+
+  // Test that an already set stack trace isn't changed.
+  {
+    var error = ArgumentError("e5");
+    StackTrace? originalStack;
+    try {
+      throw error;
+    } on Error catch (e) {
+      originalStack = e.stackTrace;
+    }
+    Expect.isNotNull(originalStack);
+    Expect.notIdentical(originalStack, systemStack);
+    Expect.notEquals("$originalStack", "");
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+      Expect.fail("Didn't throw: e5.1");
+    } on Error catch (e, s) {
+      Expect.identical(error, e, "e5.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$systemStack", "$s", "e5.3");
+      // Expect the already-set stack trace to stay.
+      Expect.isNotNull(error.stackTrace, "e5.4");
+      Expect.equals("$originalStack", "${error.stackTrace}", "e5.5");
+    }
+  }
+
+  // Works with OutOfMemoryError.
+  {
+    var error = const OutOfMemoryError();
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+    } on Error catch (e, s) {
+      Expect.identical(error, e);
+      Expect.equals("$systemStack", "$s");
+    }
+  }
+
+  // Works with StackOverflowError.
+  {
+    var error = const StackOverflowError();
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+    } on Error catch (e, s) {
+      Expect.identical(error, e);
+      Expect.equals("$systemStack", "$s");
+    }
+  }
+
+  // Also for live, captured, StackOverflowError.
+  {
+    Object error;
+    Never foo() => foo() + 1;
+    try {
+      foo(); // Force stack overflow.
+    } catch (e, s) {
+      error = e;
+    }
+    // Some platforms might use another error than StackOverflowError.
+    // Should work with whichever object gets here.
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+    } catch (e, s) {
+      Expect.identical(error, e);
+      Expect.equals("$systemStack", "$s");
+    }
+  }
+
+  asyncTest(() async {
+    var theFuture = Future.value(null);
+
+    // Test that throwing inside an asynchronous context can be caught.
+    {
+      var error = ArgumentError("e6");
+      try {
+        await theFuture;
+        Error.throwWithStackTrace(error, systemStack);
+        Expect.fail("Didn't throw: e6.1");
+        await theFuture;
+      } on Error catch (e, s) {
+        Expect.identical(error, e, "e6.2");
+        // No not expect *identical* stack trace objects.
+        Expect.equals("$systemStack", "$s", "e6.3");
+        Expect.isNotNull(error.stackTrace, "e6.4");
+        Expect.equals("$systemStack", "${error.stackTrace}", "e6.5");
+      }
+    }
+
+    // Test that throwing in asynchronous context can be locally uncaught.
+    {
+      asyncStart();
+      var error = ArgumentError("e7");
+      var future = () async {
+        await theFuture;
+        Error.throwWithStackTrace(error, systemStack);
+        Expect.fail("Didn't throw: e7.1");
+        await theFuture;
+        return null; // Force future type to Future<dynamic>
+      }();
+      future.catchError((e, s) {
+        Expect.identical(error, e, "e7.2");
+        // No not expect *identical* stack trace objects.
+        Expect.equals("$systemStack", "$s", "e7.3");
+        Expect.isNotNull(error.stackTrace, "e7.4");
+        Expect.equals("$systemStack", "${error.stackTrace}", "e7.5");
+        asyncEnd();
+      });
+    }
+
+    // Test throwing an uncaught async error caught by the Zone.
+    {
+      asyncStart();
+      var error = ArgumentError("e8");
+      await runZonedGuarded(() {
+        // Make an uncaught asynchronous error.
+        (() async {
+          await theFuture;
+          Error.throwWithStackTrace(error, systemStack);
+          Expect.fail("Didn't throw: e8.1");
+          await theFuture;
+        }());
+      }, (e, s) {
+        Expect.identical(error, e, "e8.2");
+        // No not expect *identical* stack trace objects.
+        Expect.equals("$systemStack", "$s", "e8.3");
+        Expect.isNotNull(error.stackTrace, "e8.4");
+        Expect.equals("$systemStack", "${error.stackTrace}", "e8.5");
+        asyncEnd();
+      });
+    }
+  });
+}
+
+class CustomError implements Error {
+  final String message;
+  CustomError(this.message);
+  StackTrace? get stackTrace => null;
+  String toString() => "CustomError: $message";
+}
diff --git a/tests/corelib_2/bigint_test.dart b/tests/corelib_2/bigint_test.dart
index 053ddea..24b7ebd 100644
--- a/tests/corelib_2/bigint_test.dart
+++ b/tests/corelib_2/bigint_test.dart
@@ -230,8 +230,10 @@
   var m = BigInt.parse(
       "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
       radix: 16);
-  var r = BigInt.parse("95929095851002583825372225918533539673793386278"
-                       "360575987103577151530201707061", radix: 10);
+  var r = BigInt.parse(
+      "95929095851002583825372225918533539673793386278"
+      "360575987103577151530201707061",
+      radix: 10);
   test(x, m, r);
 }
 
@@ -832,18 +834,10 @@
     }
   }
 
-  var illegalRadices = [-1, 0, 1, 37];
-  for (var radix in illegalRadices) {
-    try {
-      new BigInt.from(42).toRadixString(radix);
-      Expect.fail("Exception expected");
-    } on ArgumentError catch (e) {
-      // Nothing to do.
-    }
-  }
-
   // Try large numbers (regression test for issue 15316).
   var bignums = [
+    BigInt.parse("0x8"),
+    BigInt.parse("0x80"),
     BigInt.parse("0x80000000"),
     BigInt.parse("0x100000000"),
     BigInt.parse("0x10000000000000"),
@@ -873,6 +867,18 @@
           bignum, result, "${bignum.toRadixString(16)} -> $digits/$radix");
     }
   }
+
+  const illegalRadices = [-2, -1, 0, 1, 37];
+  for (final bignum in bignums) {
+    for (final radix in illegalRadices) {
+      try {
+        bignum.toRadixString(radix);
+        Expect.fail("Exception expected for .toRadixString($radix)");
+      } on ArgumentError catch (e) {
+        // Nothing to do.
+      }
+    }
+  }
 }
 
 testToString() {
diff --git a/tests/corelib_2/error_throw_with_stacktrace_test.dart b/tests/corelib_2/error_throw_with_stacktrace_test.dart
new file mode 100644
index 0000000..d6c3b59
--- /dev/null
+++ b/tests/corelib_2/error_throw_with_stacktrace_test.dart
@@ -0,0 +1,211 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+// Test of Error.throwWithStackTrace.
+main() {
+  // Ensure `systemStack` is different from any other stack tracek.
+  var systemStack = (() => StackTrace.current)();
+
+  // Test that an error can be thrown with a system stack trace..
+  {
+    var error = ArgumentError("e1");
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+      Expect.fail("Didn't throw: e1.1");
+    } on Error catch (e, s) {
+      Expect.identical(error, e, "e1.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$systemStack", "$s", "e1.3");
+      Expect.isNotNull(error.stackTrace, "e1.4");
+      Expect.equals("$systemStack", "${error.stackTrace}", "e1.5");
+    }
+  }
+
+  // Test that an error can be thrown with a user-created stack trace..
+  {
+    var stringStack = StackTrace.fromString("Nonce");
+    var error = ArgumentError("e2");
+    try {
+      Error.throwWithStackTrace(error, stringStack);
+      Expect.fail("Didn't throw: e2.1");
+    } on Error catch (e, s) {
+      Expect.identical(error, e, "e2.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$stringStack", "$s", "e2.3");
+      Expect.isNotNull(error.stackTrace, "e2.4");
+      Expect.equals("$stringStack", "${error.stackTrace}", "e2.5");
+    }
+  }
+
+  // Test that a non-error object can be thrown too.
+  {
+    var exception = FormatException("e3");
+    try {
+      Error.throwWithStackTrace(exception, systemStack);
+      Expect.fail("Didn't throw: e3.1");
+    } on Exception catch (e, s) {
+      Expect.identical(exception, e, "e3.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$systemStack", "$s", "e3.3");
+    }
+  }
+
+  // Test that an [Error] not extending {Error} can be thrown,
+  // but doesn't (and cannot) set the stack trace.
+  {
+    var error = CustomError("e4");
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+      Expect.fail("Didn't throw: e4.1");
+    } on Error catch (e, s) {
+      Expect.identical(error, e, "e4.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$systemStack", "$s", "e4.3");
+      Expect.isNull(error.stackTrace, "e4.4");
+    }
+  }
+
+  // Test that an already set stack trace isn't changed.
+  {
+    var error = ArgumentError("e5");
+    StackTrace originalStack;
+    try {
+      throw error;
+    } on Error catch (e) {
+      originalStack = e.stackTrace;
+    }
+    Expect.isNotNull(originalStack);
+    Expect.notIdentical(originalStack, systemStack);
+    Expect.notEquals("$originalStack", "");
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+      Expect.fail("Didn't throw: e5.1");
+    } on Error catch (e, s) {
+      Expect.identical(error, e, "e5.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$systemStack", "$s", "e5.3");
+      // Expect the already-set stack trace to stay.
+      Expect.isNotNull(error.stackTrace, "e5.4");
+      Expect.equals("$originalStack", "${error.stackTrace}", "e5.5");
+    }
+  }
+
+  // Works with OutOfMemoryError.
+  {
+    var error = const OutOfMemoryError();
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+    } on Error catch (e, s) {
+      Expect.identical(error, e);
+      Expect.equals("$systemStack", "$s");
+    }
+  }
+
+  // Works with StackOverflowError.
+  {
+    var error = const StackOverflowError();
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+    } on Error catch (e, s) {
+      Expect.identical(error, e);
+      Expect.equals("$systemStack", "$s");
+    }
+  }
+
+  // Also for live, captured, StackOverflowError.
+  {
+    Object error;
+    int foo() => foo() + 1;
+    try {
+      foo(); // Force stack overflow.
+    } catch (e, s) {
+      error = e;
+    }
+    // Some platforms might use another error than StackOverflowError.
+    // Should work with whichever object gets here.
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+    } catch (e, s) {
+      Expect.identical(error, e);
+      Expect.equals("$systemStack", "$s");
+    }
+  }
+
+  asyncTest(() async {
+    var theFuture = Future.value(null);
+
+    // Test that throwing inside an asynchronous context can be caught.
+    {
+      var error = ArgumentError("e6");
+      try {
+        await theFuture;
+        Error.throwWithStackTrace(error, systemStack);
+        Expect.fail("Didn't throw: e6.1");
+        await theFuture;
+      } on Error catch (e, s) {
+        Expect.identical(error, e, "e6.2");
+        // No not expect *identical* stack trace objects.
+        Expect.equals("$systemStack", "$s", "e6.3");
+        Expect.isNotNull(error.stackTrace, "e6.4");
+        Expect.equals("$systemStack", "${error.stackTrace}", "e6.5");
+      }
+    }
+
+    // Test that throwing in asynchronous context can be locally uncaught.
+    {
+      asyncStart();
+      var error = ArgumentError("e7");
+      var future = () async {
+        await theFuture;
+        Error.throwWithStackTrace(error, systemStack);
+        Expect.fail("Didn't throw: e7.1");
+        await theFuture;
+        return null; // Force future type to Future<dynamic>
+      }();
+      future.catchError((e, s) {
+        Expect.identical(error, e, "e7.2");
+        // No not expect *identical* stack trace objects.
+        Expect.equals("$systemStack", "$s", "e7.3");
+        Expect.isNotNull(error.stackTrace, "e7.4");
+        Expect.equals("$systemStack", "${error.stackTrace}", "e7.5");
+        asyncEnd();
+      });
+    }
+
+    // Test throwing an uncaught async error caught by the Zone.
+    {
+      asyncStart();
+      var error = ArgumentError("e8");
+      await runZonedGuarded(() {
+        // Make an uncaught asynchronous error.
+        (() async {
+          await theFuture;
+          Error.throwWithStackTrace(error, systemStack);
+          Expect.fail("Didn't throw: e8.1");
+          await theFuture;
+        }());
+      }, (e, s) {
+        Expect.identical(error, e, "e8.2");
+        // No not expect *identical* stack trace objects.
+        Expect.equals("$systemStack", "$s", "e8.3");
+        Expect.isNotNull(error.stackTrace, "e8.4");
+        Expect.equals("$systemStack", "${error.stackTrace}", "e8.5");
+        asyncEnd();
+      });
+    }
+  });
+}
+
+class CustomError implements Error {
+  final String message;
+  CustomError(this.message);
+  StackTrace get stackTrace => null;
+  String toString() => "CustomError: $message";
+}
diff --git a/tests/ffi/abi_test.dart b/tests/ffi/abi_test.dart
new file mode 100644
index 0000000..15c6776
--- /dev/null
+++ b/tests/ffi/abi_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. 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:ffi';
+import 'dart:io';
+
+import 'package:expect/expect.dart';
+
+void main() {
+  testCurrent();
+  testPlatformVersionCompatibility();
+}
+
+void testCurrent() {
+  final currentAbi = Abi.current();
+  Expect.isTrue(Abi.values.contains(currentAbi));
+}
+
+void testPlatformVersionCompatibility() {
+  final abiStringFromPlatformVersion = Platform.version.split('"')[1];
+  final abiStringFromCurrent = Abi.current().toString();
+  Expect.equals(abiStringFromPlatformVersion, abiStringFromCurrent);
+}
diff --git a/tests/ffi/ffi.status b/tests/ffi/ffi.status
index 5335837..82ef75c 100644
--- a/tests/ffi/ffi.status
+++ b/tests/ffi/ffi.status
@@ -14,8 +14,15 @@
 [ $mode == debug ]
 function_callbacks_structs_by_value_generated_test: Pass, Slow
 
+[ $mode == product ]
+regress_47594_test: Skip # Profiler is not available in Product.
+
 [ $system == android ]
 *: Pass, Slow # https://github.com/dart-lang/sdk/issues/38489
+regress_47594_test: Skip # DartDev is not available on Android.
+
+[ $system == windows ]
+regress_47594_test: Skip # DynamicLibrary.process() is not available on Windows.
 
 [ $compiler != dart2analyzer && $compiler != fasta && $runtime != dart_precompiled && $runtime != vm ]
 *: SkipByDesign # FFI is a VM-only feature. (This test suite is part of the default set.)
diff --git a/tests/ffi/function_callbacks_test.dart b/tests/ffi/function_callbacks_test.dart
index a2caaeb..27b4d44 100644
--- a/tests/ffi/function_callbacks_test.dart
+++ b/tests/ffi/function_callbacks_test.dart
@@ -11,7 +11,6 @@
 // VMOptions=--use-slow-path --stacktrace-every=100
 // VMOptions=--use-slow-path --write-protect-code --no-dual-map-code
 // VMOptions=--use-slow-path --write-protect-code --no-dual-map-code --stacktrace-every=100
-// VMOptions=--use-bare-instructions=false
 // VMOptions=--dwarf_stack_traces --no-retain_function_objects --no-retain_code_objects
 // SharedObjects=ffi_test_functions
 
diff --git a/tests/ffi/regress_47594_test.dart b/tests/ffi/regress_47594_test.dart
new file mode 100644
index 0000000..abd6628
--- /dev/null
+++ b/tests/ffi/regress_47594_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 http://dartbug.com/47594.
+// FFI leaf calls did not mark the thread for the transition and would cause
+// the stack walker to segfault when it was unable to interpret the frame.
+//
+// VMOptions=--deterministic --enable-vm-service --profiler
+
+import 'dart:ffi';
+
+import 'package:ffi/ffi.dart';
+
+final strerror = DynamicLibrary.process()
+    .lookupFunction<Pointer<Utf8> Function(Int32), Pointer<Utf8> Function(int)>(
+        'strerror',
+        isLeaf: true);
+
+void main() {
+  for (var i = 0; i < 10000; i++) strerror(0).toDartString();
+}
diff --git a/tests/ffi/regress_47673_2_test.dart b/tests/ffi/regress_47673_2_test.dart
new file mode 100644
index 0000000..9048521
--- /dev/null
+++ b/tests/ffi/regress_47673_2_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// SharedObjects=ffi_test_functions
+
+import 'dart:ffi';
+
+class A extends Struct {
+  @Array.multi([16])
+  external Array<Int8> a;
+
+  // This should not crash the FFI transform.
+  @Array.multi([16]) //# 1: compile-time error
+  external Array<Unknown> b; //# 1: compile-time error
+}
+
+main() {}
diff --git a/tests/ffi/regress_47673_test.dart b/tests/ffi/regress_47673_test.dart
new file mode 100644
index 0000000..b372e09
--- /dev/null
+++ b/tests/ffi/regress_47673_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// SharedObjects=ffi_test_functions
+
+import 'dart:ffi';
+
+typedef T = Int64;
+
+class A extends Struct {
+  @Array.multi([16])
+  external Array<T> b;
+}
+
+main() {}
diff --git a/tests/ffi/snapshot_test.dart b/tests/ffi/snapshot_test.dart
index b27b88b..29a870d 100644
--- a/tests/ffi/snapshot_test.dart
+++ b/tests/ffi/snapshot_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Checks that the VM throws an appropriate exception when FFI objects are
 // passed between isolates.
 
diff --git a/tests/ffi/vmspecific_function_callbacks_test.dart b/tests/ffi/vmspecific_function_callbacks_test.dart
index 6d192a9..0e70e23 100644
--- a/tests/ffi/vmspecific_function_callbacks_test.dart
+++ b/tests/ffi/vmspecific_function_callbacks_test.dart
@@ -5,8 +5,6 @@
 //
 // Dart test program for testing dart:ffi function pointers with callbacks.
 //
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
 // VMOptions=--stacktrace-every=100
 // VMOptions=--write-protect-code --no-dual-map-code
 // VMOptions=--write-protect-code --no-dual-map-code --stacktrace-every=100
diff --git a/tests/ffi_2/abi_test.dart b/tests/ffi_2/abi_test.dart
new file mode 100644
index 0000000..d9c152e
--- /dev/null
+++ b/tests/ffi_2/abi_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:expect/expect.dart';
+
+void main() {
+  testCurrent();
+  testPlatformVersionCompatibility();
+}
+
+void testCurrent() {
+  final currentAbi = Abi.current();
+  Expect.isTrue(Abi.values.contains(currentAbi));
+}
+
+void testPlatformVersionCompatibility() {
+  final abiStringFromPlatformVersion = Platform.version.split('"')[1];
+  final abiStringFromCurrent = Abi.current().toString();
+  Expect.equals(abiStringFromPlatformVersion, abiStringFromCurrent);
+}
diff --git a/tests/ffi_2/ffi_2.status b/tests/ffi_2/ffi_2.status
index 5335837..82ef75c 100644
--- a/tests/ffi_2/ffi_2.status
+++ b/tests/ffi_2/ffi_2.status
@@ -14,8 +14,15 @@
 [ $mode == debug ]
 function_callbacks_structs_by_value_generated_test: Pass, Slow
 
+[ $mode == product ]
+regress_47594_test: Skip # Profiler is not available in Product.
+
 [ $system == android ]
 *: Pass, Slow # https://github.com/dart-lang/sdk/issues/38489
+regress_47594_test: Skip # DartDev is not available on Android.
+
+[ $system == windows ]
+regress_47594_test: Skip # DynamicLibrary.process() is not available on Windows.
 
 [ $compiler != dart2analyzer && $compiler != fasta && $runtime != dart_precompiled && $runtime != vm ]
 *: SkipByDesign # FFI is a VM-only feature. (This test suite is part of the default set.)
diff --git a/tests/ffi_2/function_callbacks_test.dart b/tests/ffi_2/function_callbacks_test.dart
index cb1b055..cd1d793 100644
--- a/tests/ffi_2/function_callbacks_test.dart
+++ b/tests/ffi_2/function_callbacks_test.dart
@@ -13,7 +13,6 @@
 // VMOptions=--use-slow-path --stacktrace-every=100
 // VMOptions=--use-slow-path --write-protect-code --no-dual-map-code
 // VMOptions=--use-slow-path --write-protect-code --no-dual-map-code --stacktrace-every=100
-// VMOptions=--use-bare-instructions=false
 // VMOptions=--dwarf_stack_traces --no-retain_function_objects --no-retain_code_objects
 // SharedObjects=ffi_test_functions
 
diff --git a/tests/ffi_2/regress_47594_test.dart b/tests/ffi_2/regress_47594_test.dart
new file mode 100644
index 0000000..abd6628
--- /dev/null
+++ b/tests/ffi_2/regress_47594_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for 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 http://dartbug.com/47594.
+// FFI leaf calls did not mark the thread for the transition and would cause
+// the stack walker to segfault when it was unable to interpret the frame.
+//
+// VMOptions=--deterministic --enable-vm-service --profiler
+
+import 'dart:ffi';
+
+import 'package:ffi/ffi.dart';
+
+final strerror = DynamicLibrary.process()
+    .lookupFunction<Pointer<Utf8> Function(Int32), Pointer<Utf8> Function(int)>(
+        'strerror',
+        isLeaf: true);
+
+void main() {
+  for (var i = 0; i < 10000; i++) strerror(0).toDartString();
+}
diff --git a/tests/ffi_2/regress_47673_2_test.dart b/tests/ffi_2/regress_47673_2_test.dart
new file mode 100644
index 0000000..2258af8
--- /dev/null
+++ b/tests/ffi_2/regress_47673_2_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// SharedObjects=ffi_test_functions
+
+// @dart=2.9
+
+import 'dart:ffi';
+
+class A extends Struct {
+  @Array.multi([16])
+  Array<Int8> a;
+
+  // This should not crash the FFI transform.
+  @Array.multi([16]) //# 1: compile-time error
+  Array<Unknown> b; //# 1: compile-time error
+}
+
+main() {}
diff --git a/tests/ffi_2/regress_47673_test.dart b/tests/ffi_2/regress_47673_test.dart
new file mode 100644
index 0000000..9044ed5
--- /dev/null
+++ b/tests/ffi_2/regress_47673_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// SharedObjects=ffi_test_functions
+
+// @dart=2.9
+
+import 'dart:ffi';
+
+typedef T = Int64; //# 1: compile-time error
+
+class A extends Struct {
+  @Array.multi([16])
+  Array<Int8> a;
+
+  // In language version 2.12 we do not support non-function typedefs.
+  // This should not crash the FFI transform.
+  @Array.multi([16]) //# 1: compile-time error
+  Array<T> b; //# 1: compile-time error
+}
+
+main() {}
diff --git a/tests/ffi_2/snapshot_test.dart b/tests/ffi_2/snapshot_test.dart
index 7574cea..0452b5b 100644
--- a/tests/ffi_2/snapshot_test.dart
+++ b/tests/ffi_2/snapshot_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Checks that the VM throws an appropriate exception when FFI objects are
 // passed between isolates.
 
diff --git a/tests/ffi_2/vmspecific_function_callbacks_test.dart b/tests/ffi_2/vmspecific_function_callbacks_test.dart
index e86bb95..63bcc67 100644
--- a/tests/ffi_2/vmspecific_function_callbacks_test.dart
+++ b/tests/ffi_2/vmspecific_function_callbacks_test.dart
@@ -7,8 +7,6 @@
 // Dart test program for testing dart:ffi function pointers with callbacks.
 //
 // SharedObjects=ffi_test_functions
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
 // VMOptions=--stacktrace-every=100
 // VMOptions=--use-slow-path
 // VMOptions=--use-slow-path --stacktrace-every=100
diff --git a/tests/language/deferred/split_constants_canonicalization_test.dart b/tests/language/deferred/split_constants_canonicalization_test.dart
index 02d5c6e..8617f03 100644
--- a/tests/language/deferred/split_constants_canonicalization_test.dart
+++ b/tests/language/deferred/split_constants_canonicalization_test.dart
@@ -2,9 +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.
 
-// VMOptions=--use_bare_instructions=false
-// VMOptions=--use_bare_instructions=true
-
 import "package:expect/expect.dart";
 import "split_constants_canonicalization_a.dart" deferred as a;
 import "split_constants_canonicalization_b.dart" deferred as b;
diff --git a/tests/language/generic/typedef_test.dart b/tests/language/generic/typedef_test.dart
index 09dce80..d97bf8f 100644
--- a/tests/language/generic/typedef_test.dart
+++ b/tests/language/generic/typedef_test.dart
@@ -38,23 +38,23 @@
 main() {
   dynamic d = (int x, int y) => x + y;
   Expect.isTrue(d is A<int>);
-  Expect.equals((d as A<int>)(1, 2), 3);
+  Expect.equals((d as A<int>)(1, 2), 3); // Promotes `d` to `A<int>`.
 
   Expect.isFalse(d is B);
   Expect.throws(() => d as B);
 
-  d = <S>(S x, S y) => x is String ? x : y;
-  Expect.isFalse(d is A);
+  d = <S>(S x, S y) => x is String ? x : y; // Instantiates function literal.
+  Expect.isFalse(d is A); // `A<int>` is not a subtype of `A<dynamic>`.
   Expect.throws(() => d as A);
 
+  d = (<S>(S x, S y) => x is String ? x : y) as dynamic; // No instantiation.
   Expect.isTrue(d is B);
-  // TODO(jmesserly): Analyzer incorrectly rejects this form:
-  // Expect.equals((d as B)<int>(1, 2), 2);
+  Expect.equals((d as B)<int>(1, 2), 2);
+
   B b = d;
   Expect.equals(b<int>(1, 2), 2);
   Expect.equals(b<String>('a', 'b'), 'a');
 
-
   new G<int, String>().test();
   new G<String, String>().test();
 }
diff --git a/tests/language/regress/regress23244_test.dart b/tests/language/regress/regress23244_test.dart
index 6a25b57..24a1d9b 100644
--- a/tests/language/regress/regress23244_test.dart
+++ b/tests/language/regress/regress23244_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Regression test case for http://dartbug.com/23244
 import 'dart:async';
 import 'dart:isolate';
diff --git a/tests/language/super/regress47698_test.dart b/tests/language/super/regress47698_test.dart
new file mode 100644
index 0000000..bce31aa
--- /dev/null
+++ b/tests/language/super/regress47698_test.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All 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";
+
+// Regression test for https://github.com/dart-lang/sdk/issues/47698.
+
+// Exposes a class field.
+class A {
+  int i;
+  A(this.i);
+}
+
+// Exposes a getter/setter pair.
+class B {
+  int _j;
+  int get j => _j;
+  set j(int x) => _j = x;
+  B(this._j);
+}
+
+// A super class field used in constructor as getter and setter.
+class C extends A {
+  C(int val) : super(val) {
+    var x = super.i + 10; // Getter is used first.
+    super.i = x + 100; // Boom! Missing setter.
+  }
+}
+
+class D extends A {
+  D(int val) : super(val) {
+    super.i = 100; // Setter is used first.
+    super.i = super.i + 10 + val; // Boom! Missing getter.
+  }
+}
+
+// Actual super getter and setter used in constructor
+class E extends B {
+  E(int val) : super(val) {
+    var x = super.j + 10; // Getter is used first.
+    super.j = x + 100; // Boom! Missing setter.
+  }
+}
+
+class F extends B {
+  F(int val) : super(val) {
+    super.j = 100; // Setter is used first.
+    super.j = super.j + 10 + val; // Boom! Missing getter.
+  }
+}
+
+void main() {
+  var c = C(1);
+  Expect.equals(c.i, 111);
+  var d = D(1);
+  Expect.equals(d.i, 111);
+  var e = E(1);
+  Expect.equals(e.j, 111);
+  var f = F(1);
+  Expect.equals(f.j, 111);
+}
diff --git a/tests/language/variable/initializer_super_last_test.dart b/tests/language/variable/initializer_super_last_test.dart
index 7e2b0b8..6bb1022 100644
--- a/tests/language/variable/initializer_super_last_test.dart
+++ b/tests/language/variable/initializer_super_last_test.dart
@@ -40,7 +40,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x;
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -48,7 +48,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x;
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -56,7 +56,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -64,7 +64,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -72,7 +72,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x,
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -83,7 +83,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x,
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -94,7 +94,7 @@
       : x = x,
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -102,7 +102,7 @@
       : x = x,
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -133,7 +133,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x;
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -141,7 +141,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x;
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -149,7 +149,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -157,7 +157,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -165,7 +165,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x,
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -176,7 +176,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x,
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -187,7 +187,7 @@
       : x = x,
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -195,7 +195,7 @@
       : x = x,
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
diff --git a/tests/language/vm/optimized_guarded_field_isolates_test.dart b/tests/language/vm/optimized_guarded_field_isolates_test.dart
index 9278ea9..facc699 100644
--- a/tests/language/vm/optimized_guarded_field_isolates_test.dart
+++ b/tests/language/vm/optimized_guarded_field_isolates_test.dart
@@ -2,8 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
 // VMOptions=--optimization_counter_threshold=100 --no-background_compilation
 
 // Test field type tracking and field list-length tracking in the presence of
diff --git a/tests/language/vm/regress_flutter_89584_test.dart b/tests/language/vm/regress_flutter_89584_test.dart
index 7fa3a2e..2dd0e3e 100644
--- a/tests/language/vm/regress_flutter_89584_test.dart
+++ b/tests/language/vm/regress_flutter_89584_test.dart
@@ -6,9 +6,6 @@
 // https://github.com/flutter/flutter/issues/89584.
 // Verifies a Field::RecordStore is not done before all fields populated.
 
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups
-
 import 'dart:isolate';
 import 'dart:typed_data';
 
diff --git a/tests/language_2/deferred/split_constants_canonicalization_test.dart b/tests/language_2/deferred/split_constants_canonicalization_test.dart
index d3df883..a13d2ff 100644
--- a/tests/language_2/deferred/split_constants_canonicalization_test.dart
+++ b/tests/language_2/deferred/split_constants_canonicalization_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--use_bare_instructions=false
-// VMOptions=--use_bare_instructions=true
-
 import "package:expect/expect.dart";
 import "split_constants_canonicalization_a.dart" deferred as a;
 import "split_constants_canonicalization_b.dart" deferred as b;
diff --git a/tests/language_2/regress/regress23244_test.dart b/tests/language_2/regress/regress23244_test.dart
index 1fb8a80..e3669e7 100644
--- a/tests/language_2/regress/regress23244_test.dart
+++ b/tests/language_2/regress/regress23244_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Regression test case for http://dartbug.com/23244
 import 'dart:async';
 import 'dart:isolate';
diff --git a/tests/language_2/super/regress47698_test.dart b/tests/language_2/super/regress47698_test.dart
new file mode 100644
index 0000000..770878e
--- /dev/null
+++ b/tests/language_2/super/regress47698_test.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+import "package:expect/expect.dart";
+
+// Regression test for https://github.com/dart-lang/sdk/issues/47698.
+
+// Exposes a class field.
+class A {
+  int i;
+  A(this.i);
+}
+
+// Exposes a getter/setter pair.
+class B {
+  int _j;
+  int get j => _j;
+  set j(int x) => _j = x;
+  B(this._j);
+}
+
+// A super class field used in constructor as getter and setter.
+class C extends A {
+  C(int val) : super(val) {
+    var x = super.i + 10; // Getter is used first.
+    super.i = x + 100; // Boom! Missing setter.
+  }
+}
+
+class D extends A {
+  D(int val) : super(val) {
+    super.i = 100; // Setter is used first.
+    super.i = super.i + 10 + val; // Boom! Missing getter.
+  }
+}
+
+// Actual super getter and setter used in constructor
+class E extends B {
+  E(int val) : super(val) {
+    var x = super.j + 10; // Getter is used first.
+    super.j = x + 100; // Boom! Missing setter.
+  }
+}
+
+class F extends B {
+  F(int val) : super(val) {
+    super.j = 100; // Setter is used first.
+    super.j = super.j + 10 + val; // Boom! Missing getter.
+  }
+}
+
+void main() {
+  var c = C(1);
+  Expect.equals(c.i, 111);
+  var d = D(1);
+  Expect.equals(d.i, 111);
+  var e = E(1);
+  Expect.equals(e.j, 111);
+  var f = F(1);
+  Expect.equals(f.j, 111);
+}
diff --git a/tests/language_2/variable/initializer_super_last_test.dart b/tests/language_2/variable/initializer_super_last_test.dart
index a466562..bdc36e7 100644
--- a/tests/language_2/variable/initializer_super_last_test.dart
+++ b/tests/language_2/variable/initializer_super_last_test.dart
@@ -42,7 +42,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x;
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -50,7 +50,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x;
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -58,7 +58,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -66,7 +66,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -74,7 +74,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x,
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -85,7 +85,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x,
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -96,7 +96,7 @@
       : x = x,
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -104,7 +104,7 @@
       : x = x,
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -135,7 +135,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x;
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -143,7 +143,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x;
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -151,7 +151,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -159,7 +159,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -167,7 +167,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x,
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -178,7 +178,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x,
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -189,7 +189,7 @@
       : x = x,
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -197,7 +197,7 @@
       : x = x,
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
diff --git a/tests/language_2/vm/optimized_guarded_field_isolates_test.dart b/tests/language_2/vm/optimized_guarded_field_isolates_test.dart
index be65d88..6a505bb 100644
--- a/tests/language_2/vm/optimized_guarded_field_isolates_test.dart
+++ b/tests/language_2/vm/optimized_guarded_field_isolates_test.dart
@@ -4,8 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
 // VMOptions=--optimization_counter_threshold=100 --no-background_compilation
 
 // Test field type tracking and field list-length tracking in the presence of
diff --git a/tests/language_2/vm/regress_flutter_89584_test.dart b/tests/language_2/vm/regress_flutter_89584_test.dart
index be08ce9..1fa00e7 100644
--- a/tests/language_2/vm/regress_flutter_89584_test.dart
+++ b/tests/language_2/vm/regress_flutter_89584_test.dart
@@ -8,9 +8,6 @@
 // https://github.com/flutter/flutter/issues/89584.
 // Verifies a Field::RecordStore is not done before all fields populated.
 
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups
-
 import 'dart:isolate';
 import 'dart:typed_data';
 
diff --git a/tests/lib/isolate/bool_from_environment_default_value_test.dart b/tests/lib/isolate/bool_from_environment_default_value_test.dart
index fb9d49b..42975ed 100644
--- a/tests/lib/isolate/bool_from_environment_default_value_test.dart
+++ b/tests/lib/isolate/bool_from_environment_default_value_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 
 import "package:expect/expect.dart";
diff --git a/tests/lib/isolate/capability_test.dart b/tests/lib/isolate/capability_test.dart
index fd6c4d3..589c5c6 100644
--- a/tests/lib/isolate/capability_test.dart
+++ b/tests/lib/isolate/capability_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
diff --git a/tests/lib/isolate/compile_time_error_test.dart b/tests/lib/isolate/compile_time_error_test.dart
index 21197fa..3eeb36f 100644
--- a/tests/lib/isolate/compile_time_error_test.dart
+++ b/tests/lib/isolate/compile_time_error_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that errors thrown from isolates are
 // processed correctly and don't result in crashes.
 
@@ -16,9 +13,9 @@
 
 class TestClass {
   TestClass.named(num this.fld1)
-  // Should cause a compilation error (for the spawned isolate). It is a
-  // runtime error for the test.
-    : fld2 = this.fld1 // //# 01: compile-time error
+      // Should cause a compilation error (for the spawned isolate). It is a
+      // runtime error for the test.
+      : fld2 = this.fld1 // //# 01: compile-time error
   ;
   late num fld1;
   late num fld2;
diff --git a/tests/lib/isolate/count_test.dart b/tests/lib/isolate/count_test.dart
index cc96b3f..8c82091 100644
--- a/tests/lib/isolate/count_test.dart
+++ b/tests/lib/isolate/count_test.dart
@@ -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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 library CountTest;
 
diff --git a/tests/lib/isolate/cross_isolate_message_test.dart b/tests/lib/isolate/cross_isolate_message_test.dart
index ede3792..b9ba881 100644
--- a/tests/lib/isolate/cross_isolate_message_test.dart
+++ b/tests/lib/isolate/cross_isolate_message_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that isolates can communicate to isolates
 // other than the main isolate.
 
diff --git a/tests/lib/isolate/deferred_in_isolate2_test.dart b/tests/lib/isolate/deferred_in_isolate2_test.dart
index 52e5428..e63ce8f 100644
--- a/tests/lib/isolate/deferred_in_isolate2_test.dart
+++ b/tests/lib/isolate/deferred_in_isolate2_test.dart
@@ -2,13 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library deferred_in_isolate2_test;
 
 import 'dart:isolate';
-import 'dart:async';
 import 'package:async_helper/async_minitest.dart';
 
 import 'deferred_in_isolate2_lib.dart' deferred as lib;
diff --git a/tests/lib/isolate/deferred_in_isolate_test.dart b/tests/lib/isolate/deferred_in_isolate_test.dart
index d44f075..496b064 100644
--- a/tests/lib/isolate/deferred_in_isolate_test.dart
+++ b/tests/lib/isolate/deferred_in_isolate_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test that deferred libraries are supported from isolates other than the root
 // isolate.
 
diff --git a/tests/lib/isolate/enum_const_test.dart b/tests/lib/isolate/enum_const_test.dart
index 0a57f13..292ba89 100644
--- a/tests/lib/isolate/enum_const_test.dart
+++ b/tests/lib/isolate/enum_const_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib/isolate/error_at_spawn_test.dart b/tests/lib/isolate/error_at_spawn_test.dart
index c22f41e..4f5b373 100644
--- a/tests/lib/isolate/error_at_spawn_test.dart
+++ b/tests/lib/isolate/error_at_spawn_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library error_at_spawn;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/error_at_spawnuri_test.dart b/tests/lib/isolate/error_at_spawnuri_test.dart
index 6d0e073..f74c881 100644
--- a/tests/lib/isolate/error_at_spawnuri_test.dart
+++ b/tests/lib/isolate/error_at_spawnuri_test.dart
@@ -2,13 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library error_at_spawnuri;
 
 import "dart:isolate";
-import "dart:async";
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib/isolate/error_exit_at_spawn_test.dart b/tests/lib/isolate/error_exit_at_spawn_test.dart
index 9543025..603bcb6 100644
--- a/tests/lib/isolate/error_exit_at_spawn_test.dart
+++ b/tests/lib/isolate/error_exit_at_spawn_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library error_exit_at_spawn;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/error_exit_at_spawnuri_test.dart b/tests/lib/isolate/error_exit_at_spawnuri_test.dart
index cf32b98..6e9a5a8 100644
--- a/tests/lib/isolate/error_exit_at_spawnuri_test.dart
+++ b/tests/lib/isolate/error_exit_at_spawnuri_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library error_exit_at_spawnuri;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/exit_at_spawn_test.dart b/tests/lib/isolate/exit_at_spawn_test.dart
index 4a2574e..119ca7e 100644
--- a/tests/lib/isolate/exit_at_spawn_test.dart
+++ b/tests/lib/isolate/exit_at_spawn_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library exit_at_spawn;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/exit_at_spawnuri_test.dart b/tests/lib/isolate/exit_at_spawnuri_test.dart
index 5bb9ed8..f415c66 100644
--- a/tests/lib/isolate/exit_at_spawnuri_test.dart
+++ b/tests/lib/isolate/exit_at_spawnuri_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library exit_at_spawn;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/fast_copy_during_initial_message_test.dart b/tests/lib/isolate/fast_copy_during_initial_message_test.dart
index 375de09..4741fd7 100644
--- a/tests/lib/isolate/fast_copy_during_initial_message_test.dart
+++ b/tests/lib/isolate/fast_copy_during_initial_message_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 file.
 
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:isolate";
 
diff --git a/tests/lib/isolate/function_send1_test.dart b/tests/lib/isolate/function_send1_test.dart
index 1955c96..5743aa1 100644
--- a/tests/lib/isolate/function_send1_test.dart
+++ b/tests/lib/isolate/function_send1_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib/isolate/function_send_test.dart b/tests/lib/isolate/function_send_test.dart
index cd5ee40..ad90779 100644
--- a/tests/lib/isolate/function_send_test.dart
+++ b/tests/lib/isolate/function_send_test.dart
@@ -2,20 +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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:isolate";
-import "dart:io";
 import "dart:async";
 
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 
-final bool isolateGroupsEnabled =
-    Platform.executableArguments.contains('--enable-isolate-groups');
-
 void toplevel(port, message) {
   port.send("toplevel:$message");
 }
@@ -65,38 +60,17 @@
   // Sendables are top-level functions and static functions only.
   testSendable("toplevel", toplevel);
   testSendable("static", C.staticFunc);
-  // Unsendables are any closure - instance methods or function expression.
-  var c = new C();
-  testUnsendable("instance method", c.instanceMethod);
-  testUnsendable("static context expression", createFuncToplevel());
-  testUnsendable("static context expression", C.createFuncStatic());
-  testUnsendable("initializer context expression", c.initializer);
-  testUnsendable("constructor context expression", c.body);
-  testUnsendable("instance method context expression", c.createFuncMember());
 
   // The result of `toplevel.call` and `staticFunc.call` may or may not be
   // identical to `toplevel` and `staticFunc` respectively. If they are not
   // equal, they may or may not be considered toplevel/static functions anyway,
   // and therefore sendable. The VM and dart2js currently disagree on whether
   // `toplevel` and `toplevel.call` are identical, both allow them to be sent.
-  // If this is ever specified to something else, use:
-  //     testUnsendable("toplevel.call", toplevel.call);
-  //     testUnsendable("static.call", C.staticFunc.call);
-  // instead.
   // These two tests should be considered canaries for accidental behavior
   // change rather than requirements.
   testSendable("toplevel", toplevel.call);
   testSendable("static", C.staticFunc.call);
 
-  // Callable objects are sendable if general objects are (VM yes, dart2js no).
-  // It's unspecified whether arbitrary objects can be sent. If it is specified,
-  // add a test that `new Callable()` is either sendable or unsendable.
-
-  // The call method of a callable object is a closure holding the object,
-  // not a top-level or static function, so it should be blocked, just as
-  // a normal method.
-  testUnsendable("callable object", new Callable().call);
-
   asyncEnd();
   return;
 }
@@ -179,51 +153,6 @@
   initPort.send(singleMessagePort(callFunc));
 }
 
-void testUnsendable(name, func) {
-  // Isolate group support does allow sending closures.
-  if (isolateGroupsEnabled) return;
-
-  asyncStart();
-  Isolate.spawn(nop, func).then<void>((v) => throw "allowed spawn direct?",
-      onError: (e, s) {
-    asyncEnd();
-  });
-  asyncStart();
-  Isolate.spawn(nop, [func]).then<void>((v) => throw "allowed spawn wrapped?",
-      onError: (e, s) {
-    asyncEnd();
-  });
-
-  asyncStart();
-  var noReply = new RawReceivePort((_) {
-    throw "Unexpected message: $_";
-  });
-  Expect.throws(() {
-    noReply.sendPort.send(func);
-  }, (_) => true, "send direct");
-  Expect.throws(() {
-    noReply.sendPort.send([func]);
-  }, (_) => true, "send wrapped");
-  scheduleMicrotask(() {
-    noReply.close();
-    asyncEnd();
-  });
-
-  // Try sending through other isolate.
-  asyncStart();
-  echoPort((v) {
-    Expect.equals(0, v);
-  }).then((p) {
-    try {
-      p.send(func);
-    } finally {
-      p.send(0); //   Closes echo port.
-    }
-  }).then<void>((p) => throw "unreachable 2", onError: (e, s) {
-    asyncEnd();
-  });
-}
-
 void nop(_) {}
 
 void callFunc(message) {
diff --git a/tests/lib/isolate/handle_error2_test.dart b/tests/lib/isolate/handle_error2_test.dart
index 8e36364..22d86f9 100644
--- a/tests/lib/isolate/handle_error2_test.dart
+++ b/tests/lib/isolate/handle_error2_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library handle_error_test;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/handle_error3_test.dart b/tests/lib/isolate/handle_error3_test.dart
index 170f130..743b1c8 100644
--- a/tests/lib/isolate/handle_error3_test.dart
+++ b/tests/lib/isolate/handle_error3_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library handle_error_test;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/handle_error_test.dart b/tests/lib/isolate/handle_error_test.dart
index a453072..c2298b3 100644
--- a/tests/lib/isolate/handle_error_test.dart
+++ b/tests/lib/isolate/handle_error_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library handle_error_test;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/illegal_msg_function_test.dart b/tests/lib/isolate/illegal_msg_function_test.dart
deleted file mode 100644
index 62cbe70..0000000
--- a/tests/lib/isolate/illegal_msg_function_test.dart
+++ /dev/null
@@ -1,43 +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.
-
-// VMOptions=--no-enable-isolate-groups
-
-library illegal_msg_function_test;
-
-import "dart:isolate";
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-
-echo(sendPort) {
-  var port = new ReceivePort();
-  sendPort.send(port.sendPort);
-  port.listen((msg) {
-    sendPort.send("echoing ${msg(1)}}");
-  });
-}
-
-void main() {
-  asyncStart();
-
-  final port = new ReceivePort();
-
-  // Ignore returned Future.
-  Isolate.spawn(echo, port.sendPort);
-
-  port.first.then((_snd) {
-    SendPort snd = _snd;
-    int function(x) => x + 2;
-    try {
-      snd.send(function);
-    } catch (e) {
-      // Expected behavior.
-      port.close();
-      asyncEnd();
-      return;
-    }
-    Expect.fail("Should not be reached. Message sending didn't throw.");
-  });
-}
diff --git a/tests/lib/isolate/illegal_msg_mirror_test.dart b/tests/lib/isolate/illegal_msg_mirror_test.dart
index a15572d..fdc4ffb 100644
--- a/tests/lib/isolate/illegal_msg_mirror_test.dart
+++ b/tests/lib/isolate/illegal_msg_mirror_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library illegal_msg_mirror_test;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/int32_length_overflow_test.dart b/tests/lib/isolate/int32_length_overflow_test.dart
index 85e2bd7..3502ce9 100644
--- a/tests/lib/isolate/int32_length_overflow_test.dart
+++ b/tests/lib/isolate/int32_length_overflow_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:isolate";
 import "dart:typed_data";
diff --git a/tests/lib/isolate/int_from_environment_default_value_test.dart b/tests/lib/isolate/int_from_environment_default_value_test.dart
index af7ccac..cb598ee 100644
--- a/tests/lib/isolate/int_from_environment_default_value_test.dart
+++ b/tests/lib/isolate/int_from_environment_default_value_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 
 import "package:async_helper/async_helper.dart";
diff --git a/tests/lib/isolate/isolate_complex_messages_test.dart b/tests/lib/isolate/isolate_complex_messages_test.dart
index bbf728d..74a3a1a 100644
--- a/tests/lib/isolate/isolate_complex_messages_test.dart
+++ b/tests/lib/isolate/isolate_complex_messages_test.dart
@@ -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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Dart test program for testing isolate communication with
 // complex messages.
diff --git a/tests/lib/isolate/isolate_current_test.dart b/tests/lib/isolate/isolate_current_test.dart
index 1c2f1bb..3701fdd 100644
--- a/tests/lib/isolate/isolate_current_test.dart
+++ b/tests/lib/isolate/isolate_current_test.dart
@@ -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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 library isolate_current_test;
 
diff --git a/tests/lib/isolate/isolate_import_test.dart b/tests/lib/isolate/isolate_import_test.dart
index 781e13c..d286c89 100644
--- a/tests/lib/isolate/isolate_import_test.dart
+++ b/tests/lib/isolate/isolate_import_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library IsolateImportNegativeTest;
 
 // Omitting the following import is an error:
diff --git a/tests/lib/isolate/issue_21398_parent_isolate1_test.dart b/tests/lib/isolate/issue_21398_parent_isolate1_test.dart
index 6a0b458..1b15b8b 100644
--- a/tests/lib/isolate/issue_21398_parent_isolate1_test.dart
+++ b/tests/lib/isolate/issue_21398_parent_isolate1_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import "package:expect/expect.dart";
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/lib/isolate/issue_21398_parent_isolate2_test.dart b/tests/lib/isolate/issue_21398_parent_isolate2_test.dart
index feee51b..0fe1043 100644
--- a/tests/lib/isolate/issue_21398_parent_isolate2_test.dart
+++ b/tests/lib/isolate/issue_21398_parent_isolate2_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import "package:expect/expect.dart";
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/lib/isolate/issue_21398_parent_isolate_test.dart b/tests/lib/isolate/issue_21398_parent_isolate_test.dart
index 5264827..891ccf8 100644
--- a/tests/lib/isolate/issue_21398_parent_isolate_test.dart
+++ b/tests/lib/isolate/issue_21398_parent_isolate_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import "package:expect/expect.dart";
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/lib/isolate/issue_22778_test.dart b/tests/lib/isolate/issue_22778_test.dart
index 28107cc..51f5a19 100644
--- a/tests/lib/isolate/issue_22778_test.dart
+++ b/tests/lib/isolate/issue_22778_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib/isolate/issue_24243_parent_isolate_test.dart b/tests/lib/isolate/issue_24243_parent_isolate_test.dart
index c38e5e4..84b2201 100644
--- a/tests/lib/isolate/issue_24243_parent_isolate_test.dart
+++ b/tests/lib/isolate/issue_24243_parent_isolate_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:collection';
 import 'dart:isolate';
 
diff --git a/tests/lib/isolate/issue_35626_test.dart b/tests/lib/isolate/issue_35626_test.dart
index 2b392ad..e943c54 100644
--- a/tests/lib/isolate/issue_35626_test.dart
+++ b/tests/lib/isolate/issue_35626_test.dart
@@ -2,16 +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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Tests that sets of enums can be set through ports.
 // https://github.com/dart-lang/sdk/issues/35626
 
 library spawn_tests;
 
-import "dart:io";
 import "dart:isolate";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib/isolate/issue_6610_test.dart b/tests/lib/isolate/issue_6610_test.dart
index 962955e..96cc5e8f 100644
--- a/tests/lib/isolate/issue_6610_test.dart
+++ b/tests/lib/isolate/issue_6610_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // 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
diff --git a/tests/lib/isolate/kill2_test.dart b/tests/lib/isolate/kill2_test.dart
index 9391fc8..53e5c10 100644
--- a/tests/lib/isolate/kill2_test.dart
+++ b/tests/lib/isolate/kill2_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib/isolate/kill_infinite_loop_in_initializer_test.dart b/tests/lib/isolate/kill_infinite_loop_in_initializer_test.dart
index 1d41541..41f4dce 100644
--- a/tests/lib/isolate/kill_infinite_loop_in_initializer_test.dart
+++ b/tests/lib/isolate/kill_infinite_loop_in_initializer_test.dart
@@ -2,15 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Regression test against out-of-band messages being blocked during lazy
 // static field initialization.
 
 import "dart:isolate";
-import "dart:async";
-import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 
 dynamic staticFieldWithBadInitializer = badInitializer();
diff --git a/tests/lib/isolate/kill_self_synchronously_test.dart b/tests/lib/isolate/kill_self_synchronously_test.dart
index 19f3a2e..b405d30 100644
--- a/tests/lib/isolate/kill_self_synchronously_test.dart
+++ b/tests/lib/isolate/kill_self_synchronously_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:io";
 
diff --git a/tests/lib/isolate/kill_self_test.dart b/tests/lib/isolate/kill_self_test.dart
index 157b30f..c482439 100644
--- a/tests/lib/isolate/kill_self_test.dart
+++ b/tests/lib/isolate/kill_self_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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
-import "package:expect/expect.dart";
+
 import "package:async_helper/async_helper.dart";
 
 isomain1(replyPort) {
diff --git a/tests/lib/isolate/kill_test.dart b/tests/lib/isolate/kill_test.dart
index 07e0dfe8..5b65c04 100644
--- a/tests/lib/isolate/kill_test.dart
+++ b/tests/lib/isolate/kill_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib/isolate/large_byte_data_leak_test.dart b/tests/lib/isolate/large_byte_data_leak_test.dart
index 9797a54..ee19255 100644
--- a/tests/lib/isolate/large_byte_data_leak_test.dart
+++ b/tests/lib/isolate/large_byte_data_leak_test.dart
@@ -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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:async";
 import "dart:developer" show UserTag;
diff --git a/tests/lib/isolate/large_byte_data_test.dart b/tests/lib/isolate/large_byte_data_test.dart
index 8a78238..d9e3d24 100644
--- a/tests/lib/isolate/large_byte_data_test.dart
+++ b/tests/lib/isolate/large_byte_data_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:isolate";
 import "dart:typed_data";
diff --git a/tests/lib/isolate/mandel_isolate_test.dart b/tests/lib/isolate/mandel_isolate_test.dart
index 50d564a..9aa5d5e 100644
--- a/tests/lib/isolate/mandel_isolate_test.dart
+++ b/tests/lib/isolate/mandel_isolate_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library MandelIsolateTest;
 
 import 'dart:async';
diff --git a/tests/lib/isolate/message2_test.dart b/tests/lib/isolate/message2_test.dart
index fd7550c..1c15990 100644
--- a/tests/lib/isolate/message2_test.dart
+++ b/tests/lib/isolate/message2_test.dart
@@ -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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Dart test program for testing serialization of messages.
 // VMOptions=--enable_type_checks --enable_asserts
diff --git a/tests/lib/isolate/message3_test.dart b/tests/lib/isolate/message3_test.dart
index 6809c95..a40ece1 100644
--- a/tests/lib/isolate/message3_test.dart
+++ b/tests/lib/isolate/message3_test.dart
@@ -2,13 +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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Dart test program for testing serialization of messages.
-// VMOptions=--enable_type_checks --enable_asserts --enable-isolate-groups
-// VMOptions=--enable_type_checks --enable_asserts --no-enable-isolate-groups
+// VMOptions=--enable_type_checks --enable_asserts
 
 library MessageTest;
 
@@ -21,9 +19,6 @@
 import 'package:expect/expect.dart';
 import 'dart:typed_data';
 
-final bool isolateGroupsEnabled =
-    Platform.executableArguments.contains('--enable-isolate-groups');
-
 void echoMain(msg) {
   SendPort replyTo = msg[0];
   SendPort pong = msg[1];
@@ -414,14 +409,10 @@
     Expect.equals(42, x.fun()); //     //# fun: continued
   }); //                               //# fun: continued
 
-  if (isolateGroupsEnabled) {
-    ping.send(new E(new E(E.fooFun).instanceFun));
-    checks.add((x) {
-      Expect.equals(1234, (x as E).fun());
-    });
-  } else {
-    Expect.throws(() => ping.send(new E(new E(E.fooFun).instanceFun)));
-  }
+  ping.send(new E(new E(E.fooFun).instanceFun));
+  checks.add((x) {
+    Expect.equals(1234, (x as E).fun());
+  });
 
   F nonConstF = new F();
   ping.send(nonConstF);
diff --git a/tests/lib/isolate/message4_test.dart b/tests/lib/isolate/message4_test.dart
index 4644ddb..b593770 100644
--- a/tests/lib/isolate/message4_test.dart
+++ b/tests/lib/isolate/message4_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing serialization of messages with static
 // native functions.
 
diff --git a/tests/lib/isolate/message_const_type_arguments_1_test.dart b/tests/lib/isolate/message_const_type_arguments_1_test.dart
index e5133aa..b31c5e7 100644
--- a/tests/lib/isolate/message_const_type_arguments_1_test.dart
+++ b/tests/lib/isolate/message_const_type_arguments_1_test.dart
@@ -2,14 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // https://github.com/dart-lang/sdk/issues/35778
 
 import "dart:async";
 import "dart:isolate";
-import "dart:typed_data";
+
 import "package:expect/expect.dart";
 
 void child(replyPort) {
diff --git a/tests/lib/isolate/message_const_type_arguments_2_test.dart b/tests/lib/isolate/message_const_type_arguments_2_test.dart
index 002aa6e..382cbeb 100644
--- a/tests/lib/isolate/message_const_type_arguments_2_test.dart
+++ b/tests/lib/isolate/message_const_type_arguments_2_test.dart
@@ -2,14 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // https://github.com/dart-lang/sdk/issues/35778
 
 import "dart:async";
 import "dart:isolate";
-import "dart:typed_data";
+
 import "package:expect/expect.dart";
 
 void child(replyPort) {
diff --git a/tests/lib/isolate/message_enum_test.dart b/tests/lib/isolate/message_enum_test.dart
index 801afd4d..6f5a145 100644
--- a/tests/lib/isolate/message_enum_test.dart
+++ b/tests/lib/isolate/message_enum_test.dart
@@ -2,12 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
+import "dart:isolate";
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import "dart:isolate";
 
 enum Foo { BAR, BAZ }
 
diff --git a/tests/lib/isolate/message_test.dart b/tests/lib/isolate/message_test.dart
index 8a7ec69..0f5ba46 100644
--- a/tests/lib/isolate/message_test.dart
+++ b/tests/lib/isolate/message_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing serialization of messages.
 // VMOptions=--enable_type_checks --enable_asserts
 
diff --git a/tests/lib/isolate/mint_maker_test.dart b/tests/lib/isolate/mint_maker_test.dart
index c4b25ec..59eb9b0 100644
--- a/tests/lib/isolate/mint_maker_test.dart
+++ b/tests/lib/isolate/mint_maker_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library MintMakerTest;
 
 import 'dart:async';
diff --git a/tests/lib/isolate/native_wrapper_message_test.dart b/tests/lib/isolate/native_wrapper_message_test.dart
index 366a84b..bc9ed01 100644
--- a/tests/lib/isolate/native_wrapper_message_test.dart
+++ b/tests/lib/isolate/native_wrapper_message_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import 'dart:nativewrappers';
 import 'package:expect/expect.dart';
diff --git a/tests/lib/isolate/nested_spawn2_test.dart b/tests/lib/isolate/nested_spawn2_test.dart
index d335909..c4a4f57 100644
--- a/tests/lib/isolate/nested_spawn2_test.dart
+++ b/tests/lib/isolate/nested_spawn2_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that isolates can spawn other isolates and
 // that the nested isolates can communicate with the main once the spawner has
 // disappeared.
diff --git a/tests/lib/isolate/nested_spawn_test.dart b/tests/lib/isolate/nested_spawn_test.dart
index 0bc8c77..0074c5f 100644
--- a/tests/lib/isolate/nested_spawn_test.dart
+++ b/tests/lib/isolate/nested_spawn_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that isolates can spawn other isolates.
 
 library NestedSpawnTest;
diff --git a/tests/lib/isolate/non_fatal_exception_in_timer_callback_test.dart b/tests/lib/isolate/non_fatal_exception_in_timer_callback_test.dart
index b361171..4568afe 100644
--- a/tests/lib/isolate/non_fatal_exception_in_timer_callback_test.dart
+++ b/tests/lib/isolate/non_fatal_exception_in_timer_callback_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:isolate';
 import 'dart:io';
diff --git a/tests/lib/isolate/object_leak_test.dart b/tests/lib/isolate/object_leak_test.dart
index b8b94b4..4fd195d 100644
--- a/tests/lib/isolate/object_leak_test.dart
+++ b/tests/lib/isolate/object_leak_test.dart
@@ -2,17 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Regression test for http://dartbug.com/18942
 
 library LeakTest;
 
+import 'dart:isolate';
+
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import 'dart:isolate';
-import 'dart:async';
 
 class A {
   var x = 0;
diff --git a/tests/lib/isolate/ondone_test.dart b/tests/lib/isolate/ondone_test.dart
index f378855..ddcb49e 100644
--- a/tests/lib/isolate/ondone_test.dart
+++ b/tests/lib/isolate/ondone_test.dart
@@ -2,11 +2,9 @@
 // for details. All rights reserved. Use of this source is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
+
 import "package:async_helper/async_helper.dart";
 
 void isomain(SendPort replyPort) {
diff --git a/tests/lib/isolate/package_config_test.dart b/tests/lib/isolate/package_config_test.dart
index a2cfece..faffc35 100644
--- a/tests/lib/isolate/package_config_test.dart
+++ b/tests/lib/isolate/package_config_test.dart
@@ -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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
 // VMOptions=--trace_shutdown
+
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/lib/isolate/package_resolve_test.dart b/tests/lib/isolate/package_resolve_test.dart
index 50686a3..3199de7 100644
--- a/tests/lib/isolate/package_resolve_test.dart
+++ b/tests/lib/isolate/package_resolve_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/lib/isolate/package_root_test.dart b/tests/lib/isolate/package_root_test.dart
index 390df69..7d6e7b6 100644
--- a/tests/lib/isolate/package_root_test.dart
+++ b/tests/lib/isolate/package_root_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/lib/isolate/pause_test.dart b/tests/lib/isolate/pause_test.dart
index 1e97f00a..f8c64ec 100644
--- a/tests/lib/isolate/pause_test.dart
+++ b/tests/lib/isolate/pause_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:async_helper/async_helper.dart";
diff --git a/tests/lib/isolate/ping_pause_test.dart b/tests/lib/isolate/ping_pause_test.dart
index 48ad135..c29e594 100644
--- a/tests/lib/isolate/ping_pause_test.dart
+++ b/tests/lib/isolate/ping_pause_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib/isolate/ping_test.dart b/tests/lib/isolate/ping_test.dart
index 4371a4c0..fe92a57 100644
--- a/tests/lib/isolate/ping_test.dart
+++ b/tests/lib/isolate/ping_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib/isolate/port_test.dart b/tests/lib/isolate/port_test.dart
index 937d75e..a0ec0f5 100644
--- a/tests/lib/isolate/port_test.dart
+++ b/tests/lib/isolate/port_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test properties of ports.
 
 library PortTest;
diff --git a/tests/lib/isolate/raw_port_test.dart b/tests/lib/isolate/raw_port_test.dart
index 6f24212..51ccdc0 100644
--- a/tests/lib/isolate/raw_port_test.dart
+++ b/tests/lib/isolate/raw_port_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test RawReceivePort.
 
 library raw_port_test;
diff --git a/tests/lib/isolate/regress_34752_test.dart b/tests/lib/isolate/regress_34752_test.dart
index ed870a6..e96cf8d 100644
--- a/tests/lib/isolate/regress_34752_test.dart
+++ b/tests/lib/isolate/regress_34752_test.dart
@@ -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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Verifies that large BigInt can be passed through a message port and
 // simple arithmetic operations still work after that.
diff --git a/tests/lib/isolate/regress_flutter_22796_test.dart b/tests/lib/isolate/regress_flutter_22796_test.dart
index 1cab5f1..1e6fc13 100644
--- a/tests/lib/isolate/regress_flutter_22796_test.dart
+++ b/tests/lib/isolate/regress_flutter_22796_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Verifies that large typed data can be passed in a field through message port.
 // This is a regression test for
 // https://github.com/flutter/flutter/issues/22796.
diff --git a/tests/lib/isolate/request_reply_test.dart b/tests/lib/isolate/request_reply_test.dart
index 54d4d7c..4d910b4 100644
--- a/tests/lib/isolate/request_reply_test.dart
+++ b/tests/lib/isolate/request_reply_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library RequestReplyTest;
 
 import 'dart:isolate';
diff --git a/tests/lib/isolate/resolve_package_uri_test.dart b/tests/lib/isolate/resolve_package_uri_test.dart
index 9ea1d03..00d9ddb 100644
--- a/tests/lib/isolate/resolve_package_uri_test.dart
+++ b/tests/lib/isolate/resolve_package_uri_test.dart
@@ -2,13 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Regression test for faulty encoding of `Isolate.resolvePackageUri` by
 // dart2js.
 
-import 'dart:async';
 import 'dart:isolate';
 
 main() {
diff --git a/tests/lib/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart b/tests/lib/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart
index 50686a3..3199de7 100644
--- a/tests/lib/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart
+++ b/tests/lib/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/lib/isolate/send_private_test.dart b/tests/lib/isolate/send_private_test.dart
index 8ed717f..57df312 100644
--- a/tests/lib/isolate/send_private_test.dart
+++ b/tests/lib/isolate/send_private_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib/isolate/simple_message_test.dart b/tests/lib/isolate/simple_message_test.dart
index f0310af..2ca65cb 100644
--- a/tests/lib/isolate/simple_message_test.dart
+++ b/tests/lib/isolate/simple_message_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that isolates are spawned.
 
 library IsolateNegativeTest;
diff --git a/tests/lib/isolate/spawn_function_custom_class_test.dart b/tests/lib/isolate/spawn_function_custom_class_test.dart
index 0046cef..0fa9156 100644
--- a/tests/lib/isolate/spawn_function_custom_class_test.dart
+++ b/tests/lib/isolate/spawn_function_custom_class_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Create a user-defined class in a new isolate.
 //
 // Regression test for vm bug 2235: We were forgetting to finalize
diff --git a/tests/lib/isolate/spawn_function_test.dart b/tests/lib/isolate/spawn_function_test.dart
index bd8d1c1..3f1d3c0 100644
--- a/tests/lib/isolate/spawn_function_test.dart
+++ b/tests/lib/isolate/spawn_function_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Example of spawning an isolate from a function.
 library spawn_tests;
 
diff --git a/tests/lib/isolate/spawn_generic_test.dart b/tests/lib/isolate/spawn_generic_test.dart
index 109f2a8..3f5f88f 100644
--- a/tests/lib/isolate/spawn_generic_test.dart
+++ b/tests/lib/isolate/spawn_generic_test.dart
@@ -2,16 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Check that Isolate.spawn is generic.
 library spawn_generic;
 
 import "dart:isolate";
 import "dart:async";
+
 import "package:async_helper/async_helper.dart";
-import "package:expect/expect.dart";
 
 void isomain(num args) {
   print(args);
diff --git a/tests/lib/isolate/spawn_uri_exported_main_test.dart b/tests/lib/isolate/spawn_uri_exported_main_test.dart
index 837486e..1c3efe6 100644
--- a/tests/lib/isolate/spawn_uri_exported_main_test.dart
+++ b/tests/lib/isolate/spawn_uri_exported_main_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:isolate";
 import "package:expect/expect.dart";
diff --git a/tests/lib/isolate/spawn_uri_fail_test.dart b/tests/lib/isolate/spawn_uri_fail_test.dart
index 6c9dc98..8d46548 100644
--- a/tests/lib/isolate/spawn_uri_fail_test.dart
+++ b/tests/lib/isolate/spawn_uri_fail_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:io";
 import "dart:isolate";
 import "package:expect/expect.dart";
diff --git a/tests/lib/isolate/spawn_uri_missing_from_isolate_test.dart b/tests/lib/isolate/spawn_uri_missing_from_isolate_test.dart
index 02521b6..445edc1 100644
--- a/tests/lib/isolate/spawn_uri_missing_from_isolate_test.dart
+++ b/tests/lib/isolate/spawn_uri_missing_from_isolate_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 /// Tests that Isolate.spawnUri completes with an error when the given URI
 /// doesn't resolve to an existing resource.
 ///
diff --git a/tests/lib/isolate/spawn_uri_missing_test.dart b/tests/lib/isolate/spawn_uri_missing_test.dart
index 19344ba..42f2c78 100644
--- a/tests/lib/isolate/spawn_uri_missing_test.dart
+++ b/tests/lib/isolate/spawn_uri_missing_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 /// Tests that Isolate.spanUri completes with an error when the given URI
 /// doesn't resolve to an existing resource.
 library test.isolate.spawn_uri_missing_test;
diff --git a/tests/lib/isolate/spawn_uri_multi_test.dart b/tests/lib/isolate/spawn_uri_multi_test.dart
index d5fdc46..2984fca 100644
--- a/tests/lib/isolate/spawn_uri_multi_test.dart
+++ b/tests/lib/isolate/spawn_uri_multi_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Negative test to make sure that we are reaching all assertions.
 library spawn_tests;
 
diff --git a/tests/lib/isolate/spawn_uri_nested_vm_test.dart b/tests/lib/isolate/spawn_uri_nested_vm_test.dart
index 0847cf6..8a1b6d5 100644
--- a/tests/lib/isolate/spawn_uri_nested_vm_test.dart
+++ b/tests/lib/isolate/spawn_uri_nested_vm_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Example of nested spawning of isolates from a URI
 library NestedSpawnUriLibrary;
 
diff --git a/tests/lib/isolate/spawn_uri_test.dart b/tests/lib/isolate/spawn_uri_test.dart
index 28d7bce..2df4a52 100644
--- a/tests/lib/isolate/spawn_uri_test.dart
+++ b/tests/lib/isolate/spawn_uri_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Example of spawning an isolate from a URI
 library spawn_tests;
 
diff --git a/tests/lib/isolate/spawn_uri_vm_test.dart b/tests/lib/isolate/spawn_uri_vm_test.dart
index 3832b42..a3b8f61 100644
--- a/tests/lib/isolate/spawn_uri_vm_test.dart
+++ b/tests/lib/isolate/spawn_uri_vm_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Example of spawning an isolate from a URI
 library spawn_tests;
 
diff --git a/tests/lib/isolate/start_paused_test.dart b/tests/lib/isolate/start_paused_test.dart
index c9b2b57..e7a0b84 100644
--- a/tests/lib/isolate/start_paused_test.dart
+++ b/tests/lib/isolate/start_paused_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library start_paused_test;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/static_function_test.dart b/tests/lib/isolate/static_function_test.dart
index 0708dc3..aa60edd 100644
--- a/tests/lib/isolate/static_function_test.dart
+++ b/tests/lib/isolate/static_function_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test starting isolate with static functions (and toplevel ones, for sanity).
 
 library static_function_test;
@@ -116,9 +113,6 @@
 }
 
 void main([args, port]) {
-  final bool isolateGroupsEnabled =
-      Platform.executableArguments.contains('--enable-isolate-groups');
-
   asyncStart();
   // Sanity check.
   spawnTest("function", function, "TOP");
@@ -138,31 +132,17 @@
   spawnTest("lib._class._function", lib.privateClassFunction, "_LIB");
   spawnTest("lib._class._function", lib.privateClassAndFunction, "_LIBPRIVATE");
 
-  if (isolateGroupsEnabled) {
-    spawnTest("static closure", staticClosure, "WHAT?");
-    spawnTest("dynamic closure", dynamicClosure, "WHAT??");
-    spawnTest("named dynamic closure", namedDynamicClosure, "WHAT FOO??");
-    spawnTest("instance closure", new C().instanceClosure, "C WHAT?");
-    spawnTest(
-        "initializer closure", new C().constructorInitializerClosure, "Init?");
-    spawnTest(
-        "constructor closure", new C().constructorBodyClosure, "bodyClosure?");
-    spawnTest("named constructor closure", new C().namedConstructorBodyClosure,
-        "namedBodyClosure?");
-    spawnTest("instance method", new C().instanceMethod, "INSTANCE WHAT?");
-  } else {
-    // Negative tests
-    functionFailTest("static closure", staticClosure);
-    functionFailTest("dynamic closure", dynamicClosure);
-    functionFailTest("named dynamic closure", namedDynamicClosure);
-    functionFailTest("instance closure", new C().instanceClosure);
-    functionFailTest(
-        "initializer closure", new C().constructorInitializerClosure);
-    functionFailTest("constructor closure", new C().constructorBodyClosure);
-    functionFailTest(
-        "named constructor closure", new C().namedConstructorBodyClosure);
-    functionFailTest("instance method", new C().instanceMethod);
-  }
+  spawnTest("static closure", staticClosure, "WHAT?");
+  spawnTest("dynamic closure", dynamicClosure, "WHAT??");
+  spawnTest("named dynamic closure", namedDynamicClosure, "WHAT FOO??");
+  spawnTest("instance closure", new C().instanceClosure, "C WHAT?");
+  spawnTest(
+      "initializer closure", new C().constructorInitializerClosure, "Init?");
+  spawnTest(
+      "constructor closure", new C().constructorBodyClosure, "bodyClosure?");
+  spawnTest("named constructor closure", new C().namedConstructorBodyClosure,
+      "namedBodyClosure?");
+  spawnTest("instance method", new C().instanceMethod, "INSTANCE WHAT?");
 
   asyncEnd();
 }
diff --git a/tests/lib/isolate/string_from_environment_default_value_test.dart b/tests/lib/isolate/string_from_environment_default_value_test.dart
index 78b2feb..165e044 100644
--- a/tests/lib/isolate/string_from_environment_default_value_test.dart
+++ b/tests/lib/isolate/string_from_environment_default_value_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 
 import "package:expect/expect.dart";
diff --git a/tests/lib/isolate/timer_isolate_test.dart b/tests/lib/isolate/timer_isolate_test.dart
index 58e93c5..a34005a 100644
--- a/tests/lib/isolate/timer_isolate_test.dart
+++ b/tests/lib/isolate/timer_isolate_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library multiple_timer_test;
 
 import 'dart:isolate';
diff --git a/tests/lib/isolate/timer_multiple_isolates_test.dart b/tests/lib/isolate/timer_multiple_isolates_test.dart
index 3f7d8f3..0e47a88 100644
--- a/tests/lib/isolate/timer_multiple_isolates_test.dart
+++ b/tests/lib/isolate/timer_multiple_isolates_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library timer_multiple_isolates_test;
 
 import 'dart:isolate';
diff --git a/tests/lib/isolate/transferable_failed_to_send_test.dart b/tests/lib/isolate/transferable_failed_to_send_test.dart
index c1d714a..f399576 100644
--- a/tests/lib/isolate/transferable_failed_to_send_test.dart
+++ b/tests/lib/isolate/transferable_failed_to_send_test.dart
@@ -2,16 +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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:io" show ServerSocket;
 import "dart:isolate";
 import "dart:typed_data" show ByteData;
 
 import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
 
 void main() async {
   final port = new ReceivePort();
diff --git a/tests/lib/isolate/transferable_test.dart b/tests/lib/isolate/transferable_test.dart
index 2264c8c..419c2b6 100644
--- a/tests/lib/isolate/transferable_test.dart
+++ b/tests/lib/isolate/transferable_test.dart
@@ -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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:async";
 import "dart:collection";
diff --git a/tests/lib/isolate/typed_message_test.dart b/tests/lib/isolate/typed_message_test.dart
index 38e24d0..a0327ea 100644
--- a/tests/lib/isolate/typed_message_test.dart
+++ b/tests/lib/isolate/typed_message_test.dart
@@ -2,8 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
 // Dart test program for testing isolate communication with
 // typed objects.
 
diff --git a/tests/lib/isolate/unresolved_ports_test.dart b/tests/lib/isolate/unresolved_ports_test.dart
index 7707fab..9ac7995 100644
--- a/tests/lib/isolate/unresolved_ports_test.dart
+++ b/tests/lib/isolate/unresolved_ports_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // spawns multiple isolates and sends unresolved ports between them.
 library unresolved_ports;
 
diff --git a/tests/lib/isolate/vm_rehash_test.dart b/tests/lib/isolate/vm_rehash_test.dart
index f5a0a73..7b1b6c4 100644
--- a/tests/lib/isolate/vm_rehash_test.dart
+++ b/tests/lib/isolate/vm_rehash_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:isolate';
 
diff --git a/tests/lib/isolate/weak_property_message_1_test.dart b/tests/lib/isolate/weak_property_message_1_test.dart
index 4946222..b475bd3 100644
--- a/tests/lib/isolate/weak_property_message_1_test.dart
+++ b/tests/lib/isolate/weak_property_message_1_test.dart
@@ -4,9 +4,6 @@
 
 // See https://github.com/dart-lang/sdk/issues/25559
 
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups
-
 import "dart:isolate";
 
 import "package:async_helper/async_helper.dart";
diff --git a/tests/lib/isolate/weak_property_message_2_test.dart b/tests/lib/isolate/weak_property_message_2_test.dart
index fd0dbc6..0b572e7 100644
--- a/tests/lib/isolate/weak_property_message_2_test.dart
+++ b/tests/lib/isolate/weak_property_message_2_test.dart
@@ -4,9 +4,6 @@
 
 // See https://github.com/dart-lang/sdk/issues/25559
 
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups
-
 import "dart:developer";
 import "dart:isolate";
 
diff --git a/tests/lib/js/external_extension_members_test.dart b/tests/lib/js/external_extension_members_test.dart
index 823861c..7f98c7d 100644
--- a/tests/lib/js/external_extension_members_test.dart
+++ b/tests/lib/js/external_extension_members_test.dart
@@ -35,6 +35,7 @@
   external set annotatedSetter(_);
 
   external num getField();
+  external void setField10([optionalArgument = 10]);
   @JS('toString')
   external String extToString();
   external dynamic getFirstEl(list);
@@ -72,6 +73,10 @@
       return this.field;
     }
 
+    Foo.prototype.setField10 = function(optionalArgument) {
+      this.field = optionalArgument;
+    }
+
     Foo.prototype.getFirstEl = function(list) {
       return list[0];
     }
@@ -128,6 +133,24 @@
     expect(foo.otherSumFn(10, 5), equals(15));
   });
 
+  // TODO(41375): Remove if JS interop default value arguments are disallowed.
+  test('optional arguments', () {
+    var foo = Foo(42);
+    expect(foo.field, equals(42));
+
+    foo.setField10();
+    expect(foo.field, equals(10));
+    foo.setField10(6);
+    expect(foo.field, equals(6));
+
+    // Test using tearoffs
+    var setF = foo.setField10;
+    setF();
+    expect(foo.field, equals(10));
+    setF(6);
+    expect(foo.field, equals(6));
+  });
+
   test('module class', () {
     var bar = Bar(5);
     expect(js_util.getProperty(bar, 'fieldAnnotation'), equals(5));
diff --git a/tests/lib_2/isolate/bool_from_environment_default_value_test.dart b/tests/lib_2/isolate/bool_from_environment_default_value_test.dart
index fe0bd39..aaa2feb 100644
--- a/tests/lib_2/isolate/bool_from_environment_default_value_test.dart
+++ b/tests/lib_2/isolate/bool_from_environment_default_value_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/capability_test.dart b/tests/lib_2/isolate/capability_test.dart
index 5f4ef37..a6570c5 100644
--- a/tests/lib_2/isolate/capability_test.dart
+++ b/tests/lib_2/isolate/capability_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
diff --git a/tests/lib_2/isolate/compile_time_error_test.dart b/tests/lib_2/isolate/compile_time_error_test.dart
index da85090..88a37d7 100644
--- a/tests/lib_2/isolate/compile_time_error_test.dart
+++ b/tests/lib_2/isolate/compile_time_error_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that errors thrown from isolates are
 // processed correctly and don't result in crashes.
 
@@ -18,9 +15,9 @@
 
 class TestClass {
   TestClass.named(num this.fld1)
-  // Should cause a compilation error (for the spawned isolate). It is a
-  // runtime error for the test.
-    : fld2 = this.fld1 // //# 01: compile-time error
+      // Should cause a compilation error (for the spawned isolate). It is a
+      // runtime error for the test.
+      : fld2 = this.fld1 // //# 01: compile-time error
   ;
   num fld1;
   num fld2;
diff --git a/tests/lib_2/isolate/count_test.dart b/tests/lib_2/isolate/count_test.dart
index e351ef9..90d3d4e 100644
--- a/tests/lib_2/isolate/count_test.dart
+++ b/tests/lib_2/isolate/count_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 library CountTest;
 
diff --git a/tests/lib_2/isolate/cross_isolate_message_test.dart b/tests/lib_2/isolate/cross_isolate_message_test.dart
index 59b9ed6..7d23e24 100644
--- a/tests/lib_2/isolate/cross_isolate_message_test.dart
+++ b/tests/lib_2/isolate/cross_isolate_message_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that isolates can communicate to isolates
 // other than the main isolate.
 
diff --git a/tests/lib_2/isolate/deferred_in_isolate2_test.dart b/tests/lib_2/isolate/deferred_in_isolate2_test.dart
index 0db87c3..7f1cb88 100644
--- a/tests/lib_2/isolate/deferred_in_isolate2_test.dart
+++ b/tests/lib_2/isolate/deferred_in_isolate2_test.dart
@@ -4,13 +4,9 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library deferred_in_isolate2_test;
 
 import 'dart:isolate';
-import 'dart:async';
 import 'package:async_helper/async_minitest.dart';
 
 import 'deferred_in_isolate2_lib.dart' deferred as lib;
diff --git a/tests/lib_2/isolate/deferred_in_isolate_test.dart b/tests/lib_2/isolate/deferred_in_isolate_test.dart
index 25d9fcf4..42ae7e2 100644
--- a/tests/lib_2/isolate/deferred_in_isolate_test.dart
+++ b/tests/lib_2/isolate/deferred_in_isolate_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test that deferred libraries are supported from isolates other than the root
 // isolate.
 
diff --git a/tests/lib_2/isolate/enum_const_test.dart b/tests/lib_2/isolate/enum_const_test.dart
index b93202d..09e3d2d 100644
--- a/tests/lib_2/isolate/enum_const_test.dart
+++ b/tests/lib_2/isolate/enum_const_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib_2/isolate/error_at_spawn_test.dart b/tests/lib_2/isolate/error_at_spawn_test.dart
index 7eab826..0847d2f 100644
--- a/tests/lib_2/isolate/error_at_spawn_test.dart
+++ b/tests/lib_2/isolate/error_at_spawn_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library error_at_spawn;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/error_at_spawnuri_test.dart b/tests/lib_2/isolate/error_at_spawnuri_test.dart
index 8d7254d..0329798 100644
--- a/tests/lib_2/isolate/error_at_spawnuri_test.dart
+++ b/tests/lib_2/isolate/error_at_spawnuri_test.dart
@@ -4,13 +4,9 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library error_at_spawnuri;
 
 import "dart:isolate";
-import "dart:async";
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib_2/isolate/error_exit_at_spawn_test.dart b/tests/lib_2/isolate/error_exit_at_spawn_test.dart
index 17f5cd6..83f29d1 100644
--- a/tests/lib_2/isolate/error_exit_at_spawn_test.dart
+++ b/tests/lib_2/isolate/error_exit_at_spawn_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library error_exit_at_spawn;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/error_exit_at_spawnuri_test.dart b/tests/lib_2/isolate/error_exit_at_spawnuri_test.dart
index 8b43578..b4b5831 100644
--- a/tests/lib_2/isolate/error_exit_at_spawnuri_test.dart
+++ b/tests/lib_2/isolate/error_exit_at_spawnuri_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library error_exit_at_spawnuri;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/exit_at_spawn_test.dart b/tests/lib_2/isolate/exit_at_spawn_test.dart
index ca8cfa5..203ea66 100644
--- a/tests/lib_2/isolate/exit_at_spawn_test.dart
+++ b/tests/lib_2/isolate/exit_at_spawn_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library exit_at_spawn;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/exit_at_spawnuri_test.dart b/tests/lib_2/isolate/exit_at_spawnuri_test.dart
index f6f4919..cc4000a 100644
--- a/tests/lib_2/isolate/exit_at_spawnuri_test.dart
+++ b/tests/lib_2/isolate/exit_at_spawnuri_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library exit_at_spawn;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/fast_copy_during_initial_message_test.dart b/tests/lib_2/isolate/fast_copy_during_initial_message_test.dart
index 15c3978..8111991 100644
--- a/tests/lib_2/isolate/fast_copy_during_initial_message_test.dart
+++ b/tests/lib_2/isolate/fast_copy_during_initial_message_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:isolate";
 
diff --git a/tests/lib_2/isolate/function_send1_test.dart b/tests/lib_2/isolate/function_send1_test.dart
index 2acd91b..c4defba 100644
--- a/tests/lib_2/isolate/function_send1_test.dart
+++ b/tests/lib_2/isolate/function_send1_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/function_send_test.dart b/tests/lib_2/isolate/function_send_test.dart
index 1f208e7..d3ac5fd 100644
--- a/tests/lib_2/isolate/function_send_test.dart
+++ b/tests/lib_2/isolate/function_send_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:isolate";
 import "dart:io";
@@ -15,9 +14,6 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 
-final bool isolateGroupsEnabled =
-    Platform.executableArguments.contains('--enable-isolate-groups');
-
 void toplevel(port, message) {
   port.send("toplevel:$message");
 }
@@ -68,38 +64,17 @@
   // Sendables are top-level functions and static functions only.
   testSendable("toplevel", toplevel);
   testSendable("static", C.staticFunc);
-  // Unsendables are any closure - instance methods or function expression.
-  var c = new C();
-  testUnsendable("instance method", c.instanceMethod);
-  testUnsendable("static context expression", createFuncToplevel());
-  testUnsendable("static context expression", C.createFuncStatic());
-  testUnsendable("initializer context expression", c.initializer);
-  testUnsendable("constructor context expression", c.body);
-  testUnsendable("instance method context expression", c.createFuncMember());
 
   // The result of `toplevel.call` and `staticFunc.call` may or may not be
   // identical to `toplevel` and `staticFunc` respectively. If they are not
   // equal, they may or may not be considered toplevel/static functions anyway,
   // and therefore sendable. The VM and dart2js currently disagree on whether
   // `toplevel` and `toplevel.call` are identical, both allow them to be sent.
-  // If this is ever specified to something else, use:
-  //     testUnsendable("toplevel.call", toplevel.call);
-  //     testUnsendable("static.call", C.staticFunc.call);
-  // instead.
   // These two tests should be considered canaries for accidental behavior
   // change rather than requirements.
   testSendable("toplevel", toplevel.call);
   testSendable("static", C.staticFunc.call);
 
-  // Callable objects are sendable if general objects are (VM yes, dart2js no).
-  // It's unspecified whether arbitrary objects can be sent. If it is specified,
-  // add a test that `new Callable()` is either sendable or unsendable.
-
-  // The call method of a callable object is a closure holding the object,
-  // not a top-level or static function, so it should be blocked, just as
-  // a normal method.
-  testUnsendable("callable object", new Callable().call);
-
   asyncEnd();
   return;
 }
@@ -182,51 +157,6 @@
   initPort.send(singleMessagePort(callFunc));
 }
 
-void testUnsendable(name, func) {
-  // Isolate group support does allow sending closures.
-  if (isolateGroupsEnabled) return;
-
-  asyncStart();
-  Isolate.spawn(nop, func).then((v) => throw "allowed spawn direct?",
-      onError: (e, s) {
-    asyncEnd();
-  });
-  asyncStart();
-  Isolate.spawn(nop, [func]).then((v) => throw "allowed spawn wrapped?",
-      onError: (e, s) {
-    asyncEnd();
-  });
-
-  asyncStart();
-  var noReply = new RawReceivePort((_) {
-    throw "Unexpected message: $_";
-  });
-  Expect.throws(() {
-    noReply.sendPort.send(func);
-  }, null, "send direct");
-  Expect.throws(() {
-    noReply.sendPort.send([func]);
-  }, null, "send wrapped");
-  scheduleMicrotask(() {
-    noReply.close();
-    asyncEnd();
-  });
-
-  // Try sending through other isolate.
-  asyncStart();
-  echoPort((v) {
-    Expect.equals(0, v);
-  }).then((p) {
-    try {
-      p.send(func);
-    } finally {
-      p.send(0); //   Closes echo port.
-    }
-  }).then((p) => throw "unreachable 2", onError: (e, s) {
-    asyncEnd();
-  });
-}
-
 void nop(_) {}
 
 void callFunc(message) {
diff --git a/tests/lib_2/isolate/handle_error2_test.dart b/tests/lib_2/isolate/handle_error2_test.dart
index 0a09262..33fa371 100644
--- a/tests/lib_2/isolate/handle_error2_test.dart
+++ b/tests/lib_2/isolate/handle_error2_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library handle_error_test;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/handle_error3_test.dart b/tests/lib_2/isolate/handle_error3_test.dart
index 4d4db96..f6d3c9b7 100644
--- a/tests/lib_2/isolate/handle_error3_test.dart
+++ b/tests/lib_2/isolate/handle_error3_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library handle_error_test;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/handle_error_test.dart b/tests/lib_2/isolate/handle_error_test.dart
index cbc707f..c095862 100644
--- a/tests/lib_2/isolate/handle_error_test.dart
+++ b/tests/lib_2/isolate/handle_error_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library handle_error_test;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/illegal_msg_function_test.dart b/tests/lib_2/isolate/illegal_msg_function_test.dart
deleted file mode 100644
index dbd3699..0000000
--- a/tests/lib_2/isolate/illegal_msg_function_test.dart
+++ /dev/null
@@ -1,45 +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.
-
-// @dart = 2.9
-
-// VMOptions=--no-enable-isolate-groups
-
-library illegal_msg_function_test;
-
-import "dart:isolate";
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-
-echo(sendPort) {
-  var port = new ReceivePort();
-  sendPort.send(port.sendPort);
-  port.listen((msg) {
-    sendPort.send("echoing ${msg(1)}}");
-  });
-}
-
-void main() {
-  asyncStart();
-
-  final port = new ReceivePort();
-
-  // Ignore returned Future.
-  Isolate.spawn(echo, port.sendPort);
-
-  port.first.then((_snd) {
-    SendPort snd = _snd;
-    int function(x) => x + 2;
-    try {
-      snd.send(function);
-    } catch (e) {
-      // Expected behavior.
-      port.close();
-      asyncEnd();
-      return;
-    }
-    Expect.fail("Should not be reached. Message sending didn't throw.");
-  });
-}
diff --git a/tests/lib_2/isolate/illegal_msg_mirror_test.dart b/tests/lib_2/isolate/illegal_msg_mirror_test.dart
index ada58e9..0e4fa15 100644
--- a/tests/lib_2/isolate/illegal_msg_mirror_test.dart
+++ b/tests/lib_2/isolate/illegal_msg_mirror_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library illegal_msg_mirror_test;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/int32_length_overflow_test.dart b/tests/lib_2/isolate/int32_length_overflow_test.dart
index 9d97252..bccdb54 100644
--- a/tests/lib_2/isolate/int32_length_overflow_test.dart
+++ b/tests/lib_2/isolate/int32_length_overflow_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:isolate";
 import "dart:typed_data";
diff --git a/tests/lib_2/isolate/int_from_environment_default_value_test.dart b/tests/lib_2/isolate/int_from_environment_default_value_test.dart
index fdf1c67..f30c852 100644
--- a/tests/lib_2/isolate/int_from_environment_default_value_test.dart
+++ b/tests/lib_2/isolate/int_from_environment_default_value_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 
 import "package:async_helper/async_helper.dart";
diff --git a/tests/lib_2/isolate/isolate_complex_messages_test.dart b/tests/lib_2/isolate/isolate_complex_messages_test.dart
index 6599829..e044aae 100644
--- a/tests/lib_2/isolate/isolate_complex_messages_test.dart
+++ b/tests/lib_2/isolate/isolate_complex_messages_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Dart test program for testing isolate communication with
 // complex messages.
diff --git a/tests/lib_2/isolate/isolate_current_test.dart b/tests/lib_2/isolate/isolate_current_test.dart
index c5d1432..99b2efe 100644
--- a/tests/lib_2/isolate/isolate_current_test.dart
+++ b/tests/lib_2/isolate/isolate_current_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 library isolate_current_test;
 
diff --git a/tests/lib_2/isolate/isolate_import_test.dart b/tests/lib_2/isolate/isolate_import_test.dart
index 02f5276..9a2a569 100644
--- a/tests/lib_2/isolate/isolate_import_test.dart
+++ b/tests/lib_2/isolate/isolate_import_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library IsolateImportNegativeTest;
 
 // Omitting the following import is an error:
diff --git a/tests/lib_2/isolate/issue_21398_parent_isolate1_test.dart b/tests/lib_2/isolate/issue_21398_parent_isolate1_test.dart
index 314d563..3188cdd 100644
--- a/tests/lib_2/isolate/issue_21398_parent_isolate1_test.dart
+++ b/tests/lib_2/isolate/issue_21398_parent_isolate1_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import "package:expect/expect.dart";
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/lib_2/isolate/issue_21398_parent_isolate2_test.dart b/tests/lib_2/isolate/issue_21398_parent_isolate2_test.dart
index a22fcb5..62e802d 100644
--- a/tests/lib_2/isolate/issue_21398_parent_isolate2_test.dart
+++ b/tests/lib_2/isolate/issue_21398_parent_isolate2_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import "package:expect/expect.dart";
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/lib_2/isolate/issue_21398_parent_isolate_test.dart b/tests/lib_2/isolate/issue_21398_parent_isolate_test.dart
index 86f28b4..6772cd0 100644
--- a/tests/lib_2/isolate/issue_21398_parent_isolate_test.dart
+++ b/tests/lib_2/isolate/issue_21398_parent_isolate_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import "package:expect/expect.dart";
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/lib_2/isolate/issue_22778_test.dart b/tests/lib_2/isolate/issue_22778_test.dart
index 6675134..a21fdf3 100644
--- a/tests/lib_2/isolate/issue_22778_test.dart
+++ b/tests/lib_2/isolate/issue_22778_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib_2/isolate/issue_24243_parent_isolate_test.dart b/tests/lib_2/isolate/issue_24243_parent_isolate_test.dart
index 7def95e..d292e8b 100644
--- a/tests/lib_2/isolate/issue_24243_parent_isolate_test.dart
+++ b/tests/lib_2/isolate/issue_24243_parent_isolate_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:collection';
 import 'dart:isolate';
 
diff --git a/tests/lib_2/isolate/issue_35626_test.dart b/tests/lib_2/isolate/issue_35626_test.dart
index 83c371c..57a6cb3 100644
--- a/tests/lib_2/isolate/issue_35626_test.dart
+++ b/tests/lib_2/isolate/issue_35626_test.dart
@@ -4,16 +4,14 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Tests that sets of enums can be set through ports.
 // https://github.com/dart-lang/sdk/issues/35626
 
 library spawn_tests;
 
-import "dart:io";
 import "dart:isolate";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib_2/isolate/kill2_test.dart b/tests/lib_2/isolate/kill2_test.dart
index e363a3d..0ee1d62 100644
--- a/tests/lib_2/isolate/kill2_test.dart
+++ b/tests/lib_2/isolate/kill2_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/kill_infinite_loop_in_initializer_test.dart b/tests/lib_2/isolate/kill_infinite_loop_in_initializer_test.dart
index 591b187..5b5a92b 100644
--- a/tests/lib_2/isolate/kill_infinite_loop_in_initializer_test.dart
+++ b/tests/lib_2/isolate/kill_infinite_loop_in_initializer_test.dart
@@ -4,15 +4,10 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Regression test against out-of-band messages being blocked during lazy
 // static field initialization.
 
 import "dart:isolate";
-import "dart:async";
-import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 
 dynamic staticFieldWithBadInitializer = badInitializer();
diff --git a/tests/lib_2/isolate/kill_self_synchronously_test.dart b/tests/lib_2/isolate/kill_self_synchronously_test.dart
index 74edac1..d8eb448 100644
--- a/tests/lib_2/isolate/kill_self_synchronously_test.dart
+++ b/tests/lib_2/isolate/kill_self_synchronously_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:io";
 
diff --git a/tests/lib_2/isolate/kill_self_test.dart b/tests/lib_2/isolate/kill_self_test.dart
index 0ea47b5..8f01f26 100644
--- a/tests/lib_2/isolate/kill_self_test.dart
+++ b/tests/lib_2/isolate/kill_self_test.dart
@@ -4,12 +4,9 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
-import "package:expect/expect.dart";
+
 import "package:async_helper/async_helper.dart";
 
 isomain1(replyPort) {
diff --git a/tests/lib_2/isolate/kill_test.dart b/tests/lib_2/isolate/kill_test.dart
index dd53477..4966bba 100644
--- a/tests/lib_2/isolate/kill_test.dart
+++ b/tests/lib_2/isolate/kill_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/large_byte_data_leak_test.dart b/tests/lib_2/isolate/large_byte_data_leak_test.dart
index 76fafd5..fda98f7 100644
--- a/tests/lib_2/isolate/large_byte_data_leak_test.dart
+++ b/tests/lib_2/isolate/large_byte_data_leak_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:async";
 import "dart:developer" show UserTag;
diff --git a/tests/lib_2/isolate/large_byte_data_test.dart b/tests/lib_2/isolate/large_byte_data_test.dart
index ff55e0a..be1ce00 100644
--- a/tests/lib_2/isolate/large_byte_data_test.dart
+++ b/tests/lib_2/isolate/large_byte_data_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:isolate";
 import "dart:typed_data";
diff --git a/tests/lib_2/isolate/mandel_isolate_test.dart b/tests/lib_2/isolate/mandel_isolate_test.dart
index 1d75cb2..249b366 100644
--- a/tests/lib_2/isolate/mandel_isolate_test.dart
+++ b/tests/lib_2/isolate/mandel_isolate_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library MandelIsolateTest;
 
 import 'dart:async';
diff --git a/tests/lib_2/isolate/message2_test.dart b/tests/lib_2/isolate/message2_test.dart
index 81892d4..76ac027 100644
--- a/tests/lib_2/isolate/message2_test.dart
+++ b/tests/lib_2/isolate/message2_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Dart test program for testing serialization of messages.
 // VMOptions=--enable_type_checks --enable_asserts
diff --git a/tests/lib_2/isolate/message3_test.dart b/tests/lib_2/isolate/message3_test.dart
index 4eb2c6b..37ddee5 100644
--- a/tests/lib_2/isolate/message3_test.dart
+++ b/tests/lib_2/isolate/message3_test.dart
@@ -4,13 +4,11 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Dart test program for testing serialization of messages.
-// VMOptions=--enable_type_checks --enable_asserts --enable-isolate-groups
-// VMOptions=--enable_type_checks --enable_asserts --no-enable-isolate-groups
+// VMOptions=--enable_type_checks --enable_asserts
 
 library MessageTest;
 
@@ -23,9 +21,6 @@
 import 'package:expect/expect.dart';
 import 'dart:typed_data';
 
-final bool isolateGroupsEnabled =
-    Platform.executableArguments.contains('--enable-isolate-groups');
-
 void echoMain(msg) {
   SendPort replyTo = msg[0];
   SendPort pong = msg[1];
@@ -416,14 +411,10 @@
     Expect.equals(42, x.fun()); //     //# fun: continued
   }); //                               //# fun: continued
 
-  if (isolateGroupsEnabled) {
-    ping.send(new E(new E(null).instanceFun));
-    checks.add((x) {
-      Expect.equals(1234, (x as E).fun());
-    });
-  } else {
-    Expect.throws(() => ping.send(new E(new E(null).instanceFun)));
-  }
+  ping.send(new E(new E(null).instanceFun));
+  checks.add((x) {
+    Expect.equals(1234, (x as E).fun());
+  });
 
   F nonConstF = new F();
   ping.send(nonConstF);
diff --git a/tests/lib_2/isolate/message4_test.dart b/tests/lib_2/isolate/message4_test.dart
index 045cde1..425ebb6 100644
--- a/tests/lib_2/isolate/message4_test.dart
+++ b/tests/lib_2/isolate/message4_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing serialization of messages with static
 // native functions.
 
diff --git a/tests/lib_2/isolate/message_const_type_arguments_1_test.dart b/tests/lib_2/isolate/message_const_type_arguments_1_test.dart
index 8e3144e..c189ecf 100644
--- a/tests/lib_2/isolate/message_const_type_arguments_1_test.dart
+++ b/tests/lib_2/isolate/message_const_type_arguments_1_test.dart
@@ -4,14 +4,11 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // https://github.com/dart-lang/sdk/issues/35778
 
 import "dart:async";
 import "dart:isolate";
-import "dart:typed_data";
+
 import "package:expect/expect.dart";
 
 void child(replyPort) {
diff --git a/tests/lib_2/isolate/message_const_type_arguments_2_test.dart b/tests/lib_2/isolate/message_const_type_arguments_2_test.dart
index 87c76ab..cc2a7e3 100644
--- a/tests/lib_2/isolate/message_const_type_arguments_2_test.dart
+++ b/tests/lib_2/isolate/message_const_type_arguments_2_test.dart
@@ -4,14 +4,11 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // https://github.com/dart-lang/sdk/issues/35778
 
 import "dart:async";
 import "dart:isolate";
-import "dart:typed_data";
+
 import "package:expect/expect.dart";
 
 void child(replyPort) {
diff --git a/tests/lib_2/isolate/message_enum_test.dart b/tests/lib_2/isolate/message_enum_test.dart
index 5487f73..4c34b38 100644
--- a/tests/lib_2/isolate/message_enum_test.dart
+++ b/tests/lib_2/isolate/message_enum_test.dart
@@ -4,12 +4,10 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
+import "dart:isolate";
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import "dart:isolate";
 
 enum Foo { BAR, BAZ }
 
diff --git a/tests/lib_2/isolate/message_test.dart b/tests/lib_2/isolate/message_test.dart
index 7ca930a..8189027 100644
--- a/tests/lib_2/isolate/message_test.dart
+++ b/tests/lib_2/isolate/message_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing serialization of messages.
 // VMOptions=--enable_type_checks --enable_asserts
 
diff --git a/tests/lib_2/isolate/mint_maker_test.dart b/tests/lib_2/isolate/mint_maker_test.dart
index 9b1b15c..397d60b 100644
--- a/tests/lib_2/isolate/mint_maker_test.dart
+++ b/tests/lib_2/isolate/mint_maker_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library MintMakerTest;
 
 import 'dart:async';
diff --git a/tests/lib_2/isolate/native_wrapper_message_test.dart b/tests/lib_2/isolate/native_wrapper_message_test.dart
index 4c91d647..1cbf323 100644
--- a/tests/lib_2/isolate/native_wrapper_message_test.dart
+++ b/tests/lib_2/isolate/native_wrapper_message_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import 'dart:nativewrappers';
 import 'package:expect/expect.dart';
diff --git a/tests/lib_2/isolate/nested_spawn2_test.dart b/tests/lib_2/isolate/nested_spawn2_test.dart
index 5c0c8be..9b93cb9 100644
--- a/tests/lib_2/isolate/nested_spawn2_test.dart
+++ b/tests/lib_2/isolate/nested_spawn2_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that isolates can spawn other isolates and
 // that the nested isolates can communicate with the main once the spawner has
 // disappeared.
diff --git a/tests/lib_2/isolate/nested_spawn_test.dart b/tests/lib_2/isolate/nested_spawn_test.dart
index 050f383..4483df1 100644
--- a/tests/lib_2/isolate/nested_spawn_test.dart
+++ b/tests/lib_2/isolate/nested_spawn_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that isolates can spawn other isolates.
 
 library NestedSpawnTest;
diff --git a/tests/lib_2/isolate/non_fatal_exception_in_timer_callback_test.dart b/tests/lib_2/isolate/non_fatal_exception_in_timer_callback_test.dart
index 03db0b8..d1a1d32 100644
--- a/tests/lib_2/isolate/non_fatal_exception_in_timer_callback_test.dart
+++ b/tests/lib_2/isolate/non_fatal_exception_in_timer_callback_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:isolate';
 import 'dart:io';
diff --git a/tests/lib_2/isolate/object_leak_test.dart b/tests/lib_2/isolate/object_leak_test.dart
index 719b8d8..8602ca0 100644
--- a/tests/lib_2/isolate/object_leak_test.dart
+++ b/tests/lib_2/isolate/object_leak_test.dart
@@ -4,17 +4,14 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Regression test for http://dartbug.com/18942
 
 library LeakTest;
 
+import 'dart:isolate';
+
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import 'dart:isolate';
-import 'dart:async';
 
 class A {
   var x = 0;
diff --git a/tests/lib_2/isolate/ondone_test.dart b/tests/lib_2/isolate/ondone_test.dart
index bc5d363..1b8421f 100644
--- a/tests/lib_2/isolate/ondone_test.dart
+++ b/tests/lib_2/isolate/ondone_test.dart
@@ -4,11 +4,9 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
+
 import "package:async_helper/async_helper.dart";
 
 void isomain(SendPort replyPort) {
diff --git a/tests/lib_2/isolate/package_config_test.dart b/tests/lib_2/isolate/package_config_test.dart
index 264aba2..fe0725d 100644
--- a/tests/lib_2/isolate/package_config_test.dart
+++ b/tests/lib_2/isolate/package_config_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
 // VMOptions=--trace_shutdown
+
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/lib_2/isolate/package_resolve_test.dart b/tests/lib_2/isolate/package_resolve_test.dart
index c36c430..057c5df 100644
--- a/tests/lib_2/isolate/package_resolve_test.dart
+++ b/tests/lib_2/isolate/package_resolve_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/lib_2/isolate/package_root_test.dart b/tests/lib_2/isolate/package_root_test.dart
index a8ef249..0902696 100644
--- a/tests/lib_2/isolate/package_root_test.dart
+++ b/tests/lib_2/isolate/package_root_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/lib_2/isolate/pause_test.dart b/tests/lib_2/isolate/pause_test.dart
index 240229e..5649705 100644
--- a/tests/lib_2/isolate/pause_test.dart
+++ b/tests/lib_2/isolate/pause_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:async_helper/async_helper.dart";
diff --git a/tests/lib_2/isolate/ping_pause_test.dart b/tests/lib_2/isolate/ping_pause_test.dart
index 2c14c4f..8f9ffa0 100644
--- a/tests/lib_2/isolate/ping_pause_test.dart
+++ b/tests/lib_2/isolate/ping_pause_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/ping_test.dart b/tests/lib_2/isolate/ping_test.dart
index 8f191b5..c182e48 100644
--- a/tests/lib_2/isolate/ping_test.dart
+++ b/tests/lib_2/isolate/ping_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/port_test.dart b/tests/lib_2/isolate/port_test.dart
index b46a048..76e2411 100644
--- a/tests/lib_2/isolate/port_test.dart
+++ b/tests/lib_2/isolate/port_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test properties of ports.
 library PortTest;
 
diff --git a/tests/lib_2/isolate/raw_port_test.dart b/tests/lib_2/isolate/raw_port_test.dart
index 08c1cc9..0f4634f 100644
--- a/tests/lib_2/isolate/raw_port_test.dart
+++ b/tests/lib_2/isolate/raw_port_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test RawReceivePort.
 
 library raw_port_test;
diff --git a/tests/lib_2/isolate/regress_34752_test.dart b/tests/lib_2/isolate/regress_34752_test.dart
index 8fe3c74..c630609 100644
--- a/tests/lib_2/isolate/regress_34752_test.dart
+++ b/tests/lib_2/isolate/regress_34752_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Verifies that large BigInt can be passed through a message port and
 // simple arithmetic operations still work after that.
diff --git a/tests/lib_2/isolate/regress_flutter_22796_test.dart b/tests/lib_2/isolate/regress_flutter_22796_test.dart
index 72200b8..35fd6b3 100644
--- a/tests/lib_2/isolate/regress_flutter_22796_test.dart
+++ b/tests/lib_2/isolate/regress_flutter_22796_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Verifies that large typed data can be passed in a field through message port.
 // This is a regression test for
 // https://github.com/flutter/flutter/issues/22796.
diff --git a/tests/lib_2/isolate/request_reply_test.dart b/tests/lib_2/isolate/request_reply_test.dart
index a2a0f53..23e55ed 100644
--- a/tests/lib_2/isolate/request_reply_test.dart
+++ b/tests/lib_2/isolate/request_reply_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library RequestReplyTest;
 
 import 'dart:isolate';
diff --git a/tests/lib_2/isolate/resolve_package_uri_test.dart b/tests/lib_2/isolate/resolve_package_uri_test.dart
index ce53991..d47c9d7 100644
--- a/tests/lib_2/isolate/resolve_package_uri_test.dart
+++ b/tests/lib_2/isolate/resolve_package_uri_test.dart
@@ -4,13 +4,9 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Regression test for faulty encoding of `Isolate.resolvePackageUri` by
 // dart2js.
 
-import 'dart:async';
 import 'dart:isolate';
 
 main() {
diff --git a/tests/lib_2/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart b/tests/lib_2/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart
index c36c430..057c5df 100644
--- a/tests/lib_2/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart
+++ b/tests/lib_2/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/lib_2/isolate/send_private_test.dart b/tests/lib_2/isolate/send_private_test.dart
index 645c12b..f265187 100644
--- a/tests/lib_2/isolate/send_private_test.dart
+++ b/tests/lib_2/isolate/send_private_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib_2/isolate/simple_message_test.dart b/tests/lib_2/isolate/simple_message_test.dart
index f5a394c..6cd8da0 100644
--- a/tests/lib_2/isolate/simple_message_test.dart
+++ b/tests/lib_2/isolate/simple_message_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that isolates are spawned.
 
 library IsolateNegativeTest;
diff --git a/tests/lib_2/isolate/spawn_function_custom_class_test.dart b/tests/lib_2/isolate/spawn_function_custom_class_test.dart
index 0e9ad2b..fbbdf69 100644
--- a/tests/lib_2/isolate/spawn_function_custom_class_test.dart
+++ b/tests/lib_2/isolate/spawn_function_custom_class_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Create a user-defined class in a new isolate.
 //
 // Regression test for vm bug 2235: We were forgetting to finalize
diff --git a/tests/lib_2/isolate/spawn_function_test.dart b/tests/lib_2/isolate/spawn_function_test.dart
index b12246e..5071ffa 100644
--- a/tests/lib_2/isolate/spawn_function_test.dart
+++ b/tests/lib_2/isolate/spawn_function_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Example of spawning an isolate from a function.
 library spawn_tests;
 
diff --git a/tests/lib_2/isolate/spawn_generic_test.dart b/tests/lib_2/isolate/spawn_generic_test.dart
index 05ea808..7305917 100644
--- a/tests/lib_2/isolate/spawn_generic_test.dart
+++ b/tests/lib_2/isolate/spawn_generic_test.dart
@@ -4,16 +4,13 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Check that Isolate.spawn is generic.
 library spawn_generic;
 
 import "dart:isolate";
 import "dart:async";
+
 import "package:async_helper/async_helper.dart";
-import "package:expect/expect.dart";
 
 void isomain(num args) {
   print(args);
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 463181f..d378cb0 100644
--- a/tests/lib_2/isolate/spawn_uri_exported_main_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_exported_main_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:isolate";
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/spawn_uri_fail_test.dart b/tests/lib_2/isolate/spawn_uri_fail_test.dart
index 9b5346f..45b39ba 100644
--- a/tests/lib_2/isolate/spawn_uri_fail_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_fail_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:io";
 import "dart:isolate";
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/spawn_uri_missing_from_isolate_test.dart b/tests/lib_2/isolate/spawn_uri_missing_from_isolate_test.dart
index 204fa9c..dfd0305 100644
--- a/tests/lib_2/isolate/spawn_uri_missing_from_isolate_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_missing_from_isolate_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 /// Tests that Isolate.spawnUri completes with an error when the given URI
 /// doesn't resolve to an existing resource.
 ///
diff --git a/tests/lib_2/isolate/spawn_uri_missing_test.dart b/tests/lib_2/isolate/spawn_uri_missing_test.dart
index fe27ff0..99e70b0 100644
--- a/tests/lib_2/isolate/spawn_uri_missing_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_missing_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 /// Tests that Isolate.spanUri completes with an error when the given URI
 /// doesn't resolve to an existing resource.
 library test.isolate.spawn_uri_missing_test;
diff --git a/tests/lib_2/isolate/spawn_uri_multi_test.dart b/tests/lib_2/isolate/spawn_uri_multi_test.dart
index dc50328..7d22284 100644
--- a/tests/lib_2/isolate/spawn_uri_multi_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_multi_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Negative test to make sure that we are reaching all assertions.
 library spawn_tests;
 
diff --git a/tests/lib_2/isolate/spawn_uri_nested_vm_test.dart b/tests/lib_2/isolate/spawn_uri_nested_vm_test.dart
index 81e5882..facefde 100644
--- a/tests/lib_2/isolate/spawn_uri_nested_vm_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_nested_vm_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Example of nested spawning of isolates from a URI
 library NestedSpawnUriLibrary;
 
diff --git a/tests/lib_2/isolate/spawn_uri_test.dart b/tests/lib_2/isolate/spawn_uri_test.dart
index 88e99bf..e85fbc6 100644
--- a/tests/lib_2/isolate/spawn_uri_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Example of spawning an isolate from a URI
 library spawn_tests;
 
diff --git a/tests/lib_2/isolate/spawn_uri_vm_test.dart b/tests/lib_2/isolate/spawn_uri_vm_test.dart
index 536b912..429b62b 100644
--- a/tests/lib_2/isolate/spawn_uri_vm_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_vm_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Example of spawning an isolate from a URI
 library spawn_tests;
 
diff --git a/tests/lib_2/isolate/start_paused_test.dart b/tests/lib_2/isolate/start_paused_test.dart
index 7ee4993..e066a93 100644
--- a/tests/lib_2/isolate/start_paused_test.dart
+++ b/tests/lib_2/isolate/start_paused_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library start_paused_test;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/static_function_test.dart b/tests/lib_2/isolate/static_function_test.dart
index 23a18fe..cccae39 100644
--- a/tests/lib_2/isolate/static_function_test.dart
+++ b/tests/lib_2/isolate/static_function_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test starting isolate with static functions (and toplevel ones, for sanity).
 
 library static_function_test;
@@ -118,9 +115,6 @@
 }
 
 void main([args, port]) {
-  final bool isolateGroupsEnabled =
-      Platform.executableArguments.contains('--enable-isolate-groups');
-
   asyncStart();
   // Sanity check.
   spawnTest("function", function, "TOP");
@@ -140,31 +134,17 @@
   spawnTest("lib._class._function", lib.privateClassFunction, "_LIB");
   spawnTest("lib._class._function", lib.privateClassAndFunction, "_LIBPRIVATE");
 
-  if (isolateGroupsEnabled) {
-    spawnTest("static closure", staticClosure, "WHAT?");
-    spawnTest("dynamic closure", dynamicClosure, "WHAT??");
-    spawnTest("named dynamic closure", namedDynamicClosure, "WHAT FOO??");
-    spawnTest("instance closure", new C().instanceClosure, "C WHAT?");
-    spawnTest(
-        "initializer closure", new C().constructorInitializerClosure, "Init?");
-    spawnTest(
-        "constructor closure", new C().constructorBodyClosure, "bodyClosure?");
-    spawnTest("named constructor closure", new C().namedConstructorBodyClosure,
-        "namedBodyClosure?");
-    spawnTest("instance method", new C().instanceMethod, "INSTANCE WHAT?");
-  } else {
-    // Negative tests
-    functionFailTest("static closure", staticClosure);
-    functionFailTest("dynamic closure", dynamicClosure);
-    functionFailTest("named dynamic closure", namedDynamicClosure);
-    functionFailTest("instance closure", new C().instanceClosure);
-    functionFailTest(
-        "initializer closure", new C().constructorInitializerClosure);
-    functionFailTest("constructor closure", new C().constructorBodyClosure);
-    functionFailTest(
-        "named constructor closure", new C().namedConstructorBodyClosure);
-    functionFailTest("instance method", new C().instanceMethod);
-  }
+  spawnTest("static closure", staticClosure, "WHAT?");
+  spawnTest("dynamic closure", dynamicClosure, "WHAT??");
+  spawnTest("named dynamic closure", namedDynamicClosure, "WHAT FOO??");
+  spawnTest("instance closure", new C().instanceClosure, "C WHAT?");
+  spawnTest(
+      "initializer closure", new C().constructorInitializerClosure, "Init?");
+  spawnTest(
+      "constructor closure", new C().constructorBodyClosure, "bodyClosure?");
+  spawnTest("named constructor closure", new C().namedConstructorBodyClosure,
+      "namedBodyClosure?");
+  spawnTest("instance method", new C().instanceMethod, "INSTANCE WHAT?");
 
   asyncEnd();
 }
diff --git a/tests/lib_2/isolate/string_from_environment_default_value_test.dart b/tests/lib_2/isolate/string_from_environment_default_value_test.dart
index f920f65..1a9a550 100644
--- a/tests/lib_2/isolate/string_from_environment_default_value_test.dart
+++ b/tests/lib_2/isolate/string_from_environment_default_value_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/timer_isolate_test.dart b/tests/lib_2/isolate/timer_isolate_test.dart
index 07485a6..9f87aa5 100644
--- a/tests/lib_2/isolate/timer_isolate_test.dart
+++ b/tests/lib_2/isolate/timer_isolate_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library multiple_timer_test;
 
 import 'dart:isolate';
diff --git a/tests/lib_2/isolate/timer_multiple_isolates_test.dart b/tests/lib_2/isolate/timer_multiple_isolates_test.dart
index 0321a8b..d8b6fb7 100644
--- a/tests/lib_2/isolate/timer_multiple_isolates_test.dart
+++ b/tests/lib_2/isolate/timer_multiple_isolates_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library timer_multiple_isolates_test;
 
 import 'dart:isolate';
diff --git a/tests/lib_2/isolate/transferable_failed_to_send_test.dart b/tests/lib_2/isolate/transferable_failed_to_send_test.dart
index 8f339585..b0ac3f4 100644
--- a/tests/lib_2/isolate/transferable_failed_to_send_test.dart
+++ b/tests/lib_2/isolate/transferable_failed_to_send_test.dart
@@ -4,16 +4,14 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:io" show ServerSocket;
 import "dart:isolate";
 import "dart:typed_data" show ByteData;
 
 import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
 
 void main() async {
   final port = new ReceivePort();
diff --git a/tests/lib_2/isolate/transferable_test.dart b/tests/lib_2/isolate/transferable_test.dart
index 26cb2e0..5d8ed4d 100644
--- a/tests/lib_2/isolate/transferable_test.dart
+++ b/tests/lib_2/isolate/transferable_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:async";
 import "dart:collection";
diff --git a/tests/lib_2/isolate/typed_message_test.dart b/tests/lib_2/isolate/typed_message_test.dart
index 3b30415..77c76d0 100644
--- a/tests/lib_2/isolate/typed_message_test.dart
+++ b/tests/lib_2/isolate/typed_message_test.dart
@@ -4,8 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
 // Dart test program for testing isolate communication with
 // typed objects.
 
diff --git a/tests/lib_2/isolate/unresolved_ports_test.dart b/tests/lib_2/isolate/unresolved_ports_test.dart
index 408a26e..5147909 100644
--- a/tests/lib_2/isolate/unresolved_ports_test.dart
+++ b/tests/lib_2/isolate/unresolved_ports_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // spawns multiple isolates and sends unresolved ports between them.
 library unresolved_ports;
 
diff --git a/tests/lib_2/isolate/vm_rehash_test.dart b/tests/lib_2/isolate/vm_rehash_test.dart
index 3813b67..2709901 100644
--- a/tests/lib_2/isolate/vm_rehash_test.dart
+++ b/tests/lib_2/isolate/vm_rehash_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:isolate';
 
diff --git a/tests/lib_2/isolate/weak_property_message_1_test.dart b/tests/lib_2/isolate/weak_property_message_1_test.dart
index b58e261..f5889fb 100644
--- a/tests/lib_2/isolate/weak_property_message_1_test.dart
+++ b/tests/lib_2/isolate/weak_property_message_1_test.dart
@@ -6,9 +6,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups
-
 import "dart:isolate";
 
 import "package:async_helper/async_helper.dart";
diff --git a/tests/lib_2/isolate/weak_property_message_2_test.dart b/tests/lib_2/isolate/weak_property_message_2_test.dart
index 353a8f5..517ae34 100644
--- a/tests/lib_2/isolate/weak_property_message_2_test.dart
+++ b/tests/lib_2/isolate/weak_property_message_2_test.dart
@@ -6,9 +6,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups
-
 import "dart:developer";
 import "dart:isolate";
 
diff --git a/tests/lib_2/js/external_extension_members_test.dart b/tests/lib_2/js/external_extension_members_test.dart
index b1b0cfe..34cc509 100644
--- a/tests/lib_2/js/external_extension_members_test.dart
+++ b/tests/lib_2/js/external_extension_members_test.dart
@@ -32,6 +32,7 @@
   external set annotatedSetter(_);
 
   external num getField();
+  external void setField10([optionalArgument = 10]);
   @JS('toString')
   external String extToString();
   external dynamic getFirstEl(list);
@@ -71,6 +72,10 @@
       return this.field;
     }
 
+    Foo.prototype.setField10 = function(optionalArgument) {
+      this.field = optionalArgument;
+    }
+
     Foo.prototype.getFirstEl = function(list) {
       return list[0];
     }
@@ -110,6 +115,24 @@
     expect(foo.otherSumFn(10, 5), equals(15));
   });
 
+  // TODO(41375): Remove if JS interop default value arguments are disallowed.
+  test('optional arguments', () {
+    var foo = Foo(42);
+    expect(foo.getField(), equals(42));
+
+    foo.setField10();
+    expect(foo.getField(), equals(10));
+    foo.setField10(6);
+    expect(foo.getField(), equals(6));
+
+    // Test using tearoffs
+    var setF = foo.setField10;
+    setF();
+    expect(foo.getField(), equals(10));
+    setF(6);
+    expect(foo.getField(), equals(6));
+  });
+
   test('module class', () {
     var bar = Bar(5);
     expect(js_util.getProperty(bar, 'fieldAnnotation'), equals(5));
diff --git a/tests/standalone/fields_may_be_reset_test.dart b/tests/standalone/fields_may_be_reset_test.dart
deleted file mode 100644
index 3ab6fc6..0000000
--- a/tests/standalone/fields_may_be_reset_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=--fields_may_be_reset
-
-main() {
-  print("Okay");
-}
diff --git a/tests/standalone/io/directory_rename_test.dart b/tests/standalone/io/directory_rename_test.dart
new file mode 100644
index 0000000..de14cea
--- /dev/null
+++ b/tests/standalone/io/directory_rename_test.dart
@@ -0,0 +1,160 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Directory rename test.
+
+import "dart:io";
+
+import "package:expect/expect.dart";
+import 'test_utils.dart' show withTempDir;
+
+testRenameToNewPath() async {
+  await withTempDir('testRenameToNewPath', (Directory tempDir) async {
+    final dir1 = Directory("${tempDir.path}/dir1");
+    dir1.createSync();
+
+    dir1.renameSync("${tempDir.path}/dir2");
+    Expect.isTrue(Directory("${tempDir.path}/dir2").existsSync());
+  });
+}
+
+testRenamePath() async {
+  // Verifies that the returned directory has the correct path.
+  await withTempDir('testRenameToNewPath', (Directory tempDir) async {
+    final oldDir = Directory("${tempDir.path}/dir1");
+    oldDir.createSync();
+
+    final newDir = oldDir.renameSync("${tempDir.path}/dir2");
+
+    Expect.isTrue(
+        oldDir.path == "${tempDir.path}/dir1",
+        "${oldDir.path} != '${tempDir.path}/dir1'"
+        "- path should not be updated");
+    Expect.isTrue(
+        newDir.path == "${tempDir.path}/dir2",
+        "${newDir.path} != '${tempDir.path}/dir2'"
+        "- path should be updated");
+  });
+}
+
+testRenameToSamePath() async {
+  await withTempDir('testRenameToSamePath', (Directory tempDir) async {
+    final dir = Directory("${tempDir.path}/dir");
+    dir.createSync();
+    final file = File("${dir.path}/file");
+    file.createSync();
+
+    dir.renameSync(dir.path);
+    Expect.isTrue(file.existsSync());
+  });
+}
+
+testRenameToExistingFile() async {
+  await withTempDir('testRenameToExistingFile', (Directory tempDir) async {
+    final dir = Directory("${tempDir.path}/dir");
+    dir.createSync();
+    final file = File("${tempDir.path}/file");
+    file.createSync();
+
+    // Overwriting an exsting file is not allowed.
+    try {
+      dir.renameSync(file.path);
+      Expect.fail('Directory.rename should fail to rename a non-directory');
+    } on FileSystemException catch (e) {
+      if (Platform.isWindows) {
+        Expect.isTrue(e.osError!.message.contains('file already exists'),
+            'Unexpected error: $e');
+      } else if (Platform.isLinux || Platform.isMacOS) {
+        Expect.isTrue(e.osError!.message.contains('Not a directory'),
+            'Unexpected error: $e');
+      }
+    }
+  });
+}
+
+testRenameToExistingEmptyDirectory() async {
+  await withTempDir('testRenameToExistingEmptyDirectory',
+      (Directory tempDir) async {
+    final dir1 = Directory("${tempDir.path}/dir1");
+    dir1.createSync();
+    File("${dir1.path}/file").createSync();
+
+    final dir2 = Directory("${tempDir.path}/dir2");
+    dir2.createSync();
+
+    try {
+      dir1.renameSync(dir2.path);
+      // Verify that the file contained in dir1 has been moved.
+      if (Platform.isWindows) {
+        Expect.fail(
+            'Directory.rename should fail to rename over an existing directory '
+            'on Windows');
+      } else {
+        Expect.isTrue(File("${dir2.path}/file").existsSync());
+      }
+    } on FileSystemException catch (e) {
+      if (Platform.isWindows) {
+        Expect.isTrue(e.osError!.message.contains('file already exists'));
+      } else {
+        Expect.fail('Directory.rename should allow moves to empty directories');
+      }
+    }
+  });
+}
+
+testRenameToExistingNonEmptyDirectory() async {
+  await withTempDir('testRenameToExistingNonEmptyDirectory',
+      (Directory tempDir) async {
+    final dir1 = Directory("${tempDir.path}/dir1");
+    dir1.createSync();
+    File("${dir1.path}/file1").createSync();
+
+    final dir2 = Directory("${tempDir.path}/dir2");
+    dir2.createSync();
+    File("${dir2.path}/file2").createSync();
+
+    try {
+      dir1.renameSync(dir2.path);
+      Expect.fail(
+          'Directory.rename should fail to rename a non-empty directory');
+    } on FileSystemException catch (e) {
+      if (Platform.isWindows) {
+        Expect.isTrue(e.osError!.message.contains('file already exists'),
+            'Unexpected error: $e');
+      } else if (Platform.isLinux || Platform.isMacOS) {
+        Expect.isTrue(e.osError!.message.contains('Directory not empty'),
+            'Unexpected error: $e');
+      }
+    }
+  });
+}
+
+testRenameButActuallyFile() async {
+  await withTempDir('testRenameButActuallyFile', (Directory tempDir) async {
+    final file = File("${tempDir.path}/file");
+    file.createSync();
+    final dir = Directory(file.path);
+    try {
+      dir.renameSync("${tempDir.path}/dir");
+      Expect.fail("Expected a failure to rename the file.");
+    } on FileSystemException catch (e) {
+      Expect.isTrue(
+          e.message.contains('Rename failed'), 'Unexpected error: $e');
+      if (Platform.isLinux || Platform.isMacOS) {
+        Expect.isTrue(e.osError!.message.contains('Not a directory'),
+            'Unexpected error: $e');
+      }
+    }
+  });
+}
+
+main() async {
+  await testRenameToNewPath();
+  await testRenamePath();
+  await testRenameToSamePath();
+  await testRenameToExistingFile();
+  await testRenameToExistingEmptyDirectory();
+  await testRenameToExistingNonEmptyDirectory();
+  await testRenameButActuallyFile();
+}
diff --git a/tests/standalone/io/directory_test.dart b/tests/standalone/io/directory_test.dart
index 5c39405..c6f6e81 100644
--- a/tests/standalone/io/directory_test.dart
+++ b/tests/standalone/io/directory_test.dart
@@ -582,36 +582,6 @@
   });
 }
 
-testRename() {
-  var temp1 = Directory.systemTemp.createTempSync('directory_test');
-  var temp2 = Directory.systemTemp.createTempSync('directory_test');
-  var temp3 = temp1.renameSync(temp2.path);
-  Expect.isFalse(temp1.existsSync());
-  Expect.isTrue(temp2.existsSync());
-  Expect.equals(temp3.path, temp2.path);
-
-  var temp4 = temp2.renameSync(temp1.path);
-  Expect.isFalse(temp3.existsSync());
-  Expect.isFalse(temp2.existsSync());
-  Expect.isTrue(temp1.existsSync());
-  Expect.isTrue(temp4.existsSync());
-  Expect.equals(temp1.path, temp4.path);
-
-  String foo = '${temp4.path}/foo';
-  String bar = '${temp4.path}/bar';
-  new File(foo).createSync();
-  try {
-    new Directory(foo).renameSync(bar);
-    Expect.fail('Directory.rename should fail to rename a non-directory');
-  } on FileSystemException catch (e) {
-    if (Platform.isLinux || Platform.isMacOS) {
-      Expect.isTrue(e.osError!.message.contains('Not a directory'));
-    }
-  }
-
-  temp1.deleteSync(recursive: true);
-}
-
 main() {
   DirectoryTest.testMain();
   NestedTempDirectoryTest.testMain();
@@ -621,5 +591,4 @@
   testCreateExisting();
   testCreateDirExistingFileSync();
   testCreateDirExistingFile();
-  testRename();
 }
diff --git a/tests/standalone/io/echo_server_stream_test.dart b/tests/standalone/io/echo_server_stream_test.dart
index 6da8ca2..ffbeba2 100644
--- a/tests/standalone/io/echo_server_stream_test.dart
+++ b/tests/standalone/io/echo_server_stream_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Echo server test program to test socket streams.
 //
 // VMOptions=
diff --git a/tests/standalone/io/file_stat_test.dart b/tests/standalone/io/file_stat_test.dart
index 86054da..8cc3e0e 100644
--- a/tests/standalone/io/file_stat_test.dart
+++ b/tests/standalone/io/file_stat_test.dart
@@ -19,11 +19,16 @@
   Expect.equals(FileSystemEntityType.notFound, fileStat.type);
   Expect.equals(FileSystemEntityType.notFound, fileStatDirect.type);
   file.writeAsStringSync("Dart IO library test of FileStat");
+  Link link = new Link(join(directory.path, "link"));
+  link.createSync(file.path);
   new Timer(const Duration(seconds: 2), () {
     file.readAsStringSync();
     directory.listSync();
     FileStat fileStat = FileStat.statSync(file.path);
     FileStat fileStatDirect = file.statSync();
+    FileStat linkStat = FileStat.statSync(link.path);
+    FileStat linkStatDirect = link.statSync();
+
     Expect.equals(FileSystemEntityType.file, fileStat.type);
     Expect.equals(32, fileStat.size);
     Expect.equals(FileSystemEntityType.file, fileStatDirect.type);
@@ -44,6 +49,13 @@
           directoryStat.changed.compareTo(directoryStat.accessed) < 0);
     }
     Expect.equals(7 << 6, directoryStat.mode & (7 << 6)); // Includes +urwx.
+
+    // Verify that statSync resolves the link.
+    Expect.equals(FileSystemEntityType.file, linkStat.type);
+    Expect.equals(32, linkStat.size);
+    Expect.equals(FileSystemEntityType.file, linkStatDirect.type);
+    Expect.equals(32, linkStatDirect.size);
+
     directory.deleteSync(recursive: true);
   });
 }
diff --git a/tests/standalone/io/file_system_watcher_large_set_test.dart b/tests/standalone/io/file_system_watcher_large_set_test.dart
index 2a4ed9d..07873a7 100644
--- a/tests/standalone/io/file_system_watcher_large_set_test.dart
+++ b/tests/standalone/io/file_system_watcher_large_set_test.dart
@@ -2,8 +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.
 
-// VMOptions=--delayed-filewatch-callback --enable-isolate-groups
-// VMOptions=--delayed-filewatch-callback --no-enable-isolate-groups
+// VMOptions=--delayed-filewatch-callback
 
 // Verifies that cancelling subscription from inside of the event handler
 // works as expected, does not result in crash or hang.
diff --git a/tests/standalone/io/file_system_watcher_test.dart b/tests/standalone/io/file_system_watcher_test.dart
index dae7f9d..e629e56 100644
--- a/tests/standalone/io/file_system_watcher_test.dart
+++ b/tests/standalone/io/file_system_watcher_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone/io/http_advanced_test.dart b/tests/standalone/io/http_advanced_test.dart
index 87553d9..344e0da 100644
--- a/tests/standalone/io/http_advanced_test.dart
+++ b/tests/standalone/io/http_advanced_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // VMOptions=
 // VMOptions=--short_socket_read
 // VMOptions=--short_socket_write
diff --git a/tests/standalone/io/http_basic_test.dart b/tests/standalone/io/http_basic_test.dart
index acc6eb5..9d001b0 100644
--- a/tests/standalone/io/http_basic_test.dart
+++ b/tests/standalone/io/http_basic_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // VMOptions=--trace_shutdown
 // VMOptions=--trace_shutdown --short_socket_read
 // VMOptions=--trace_shutdown --short_socket_write
diff --git a/tests/standalone/io/http_read_test.dart b/tests/standalone/io/http_read_test.dart
index b6f4a7e..584a7e1 100644
--- a/tests/standalone/io/http_read_test.dart
+++ b/tests/standalone/io/http_read_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // VMOptions=
 // VMOptions=--short_socket_read
 // VMOptions=--short_socket_write
diff --git a/tests/standalone/io/io_override_test.dart b/tests/standalone/io/io_override_test.dart
index 03c41af..fb8c780 100644
--- a/tests/standalone/io/io_override_test.dart
+++ b/tests/standalone/io/io_override_test.dart
@@ -175,7 +175,30 @@
   throw "";
 }
 
+class StdinMock extends Stream<List<int>> implements Stdin {
+  bool echoMode = false;
+  bool lineMode = false;
+  bool get hasTerminal => throw "";
+  bool get supportsAnsiEscapes => throw "";
+
+  int readByteSync() => throw "";
+  String readLineSync(
+          {Encoding encoding = systemEncoding, bool retainNewlines = false}) =>
+      throw "";
+  StreamSubscription<List<int>> listen(void onData(List<int> event)?,
+      {Function? onError, void onDone()?, bool? cancelOnError}) {
+    throw "";
+  }
+}
+
+class StdoutMock implements Stdout {
+  Never noSuchMethod(Invocation i) => throw "";
+}
+
 Future<Null> ioOverridesRunTest() async {
+  StdoutMock stdoutMock = StdoutMock();
+  StdoutMock stderrMock = StdoutMock();
+
   Future<Null> f = IOOverrides.runZoned(
     () async {
       Expect.isTrue(new Directory("directory") is DirectoryMock);
@@ -197,6 +220,9 @@
       asyncExpectThrows(() async => await Socket.connect(null, 0));
       asyncExpectThrows(() async => await Socket.startConnect(null, 0));
       asyncExpectThrows(() async => await ServerSocket.bind(null, 0));
+      Expect.isTrue(stdin is StdinMock);
+      Expect.identical(stdout, stdoutMock);
+      Expect.identical(stderr, stderrMock);
     },
     createDirectory: DirectoryMock.createDirectory,
     getCurrentDirectory: DirectoryMock.getCurrent,
@@ -215,6 +241,9 @@
     socketConnect: socketConnect,
     socketStartConnect: socketStartConnect,
     serverSocketBind: serverSocketBind,
+    stdin: () => StdinMock(),
+    stdout: () => stdoutMock,
+    stderr: () => stderrMock,
   );
   Expect.isFalse(new Directory("directory") is DirectoryMock);
   Expect.isTrue(new Directory("directory") is Directory);
diff --git a/tests/standalone/io/pipe_server_test.dart b/tests/standalone/io/pipe_server_test.dart
index 52d93b6..c2a1b93 100644
--- a/tests/standalone/io/pipe_server_test.dart
+++ b/tests/standalone/io/pipe_server_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // OtherResources=readline_test1.dat
 //
 // VMOptions=
diff --git a/tests/standalone/io/platform_locale_name_test.dart b/tests/standalone/io/platform_locale_name_test.dart
index 611623d..aa5c2b9 100644
--- a/tests/standalone/io/platform_locale_name_test.dart
+++ b/tests/standalone/io/platform_locale_name_test.dart
@@ -8,11 +8,12 @@
 
 main() {
   // Match patterns like:
-  //    "en-US"                 (Android, iOS, MacOS, Windows)
+  //    "en"                    (MacOS)
+  //    "en-US"                 (Android, iOS, Windows)
   //    "en_US", "en_US.UTF-8"  (Linux)
   //    "ESP-USA"               (theoretically possible)
   // Assumes that the platform has a reasonably configured locale.
-  var localePattern = RegExp(r"[A-Za-z]{2,4}[_-][A-Za-z]{2}");
+  var localePattern = RegExp(r"[A-Za-z]{2,4}([_-][A-Za-z]{2})?");
   var localeName = Platform.localeName;
   Expect.isNotNull(
       localePattern.matchAsPrefix(localeName),
diff --git a/tests/standalone/io/platform_test.dart b/tests/standalone/io/platform_test.dart
index ace9d85..3729439 100644
--- a/tests/standalone/io/platform_test.dart
+++ b/tests/standalone/io/platform_test.dart
@@ -2,16 +2,24 @@
 // for 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-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
-import "dart:async";
 import "dart:io";
 import "dart:isolate";
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
 
+final executableSuffix = Platform.isWindows ? '.exe' : '';
+final jitExecutableName = 'dart$executableSuffix';
+final aotExecutableName = 'dart_precompiled_runtime$executableSuffix';
+
+bool hasJitOrAotExecutableName(String executable) =>
+    executable.endsWith(jitExecutableName) ||
+    executable.endsWith(aotExecutableName);
+
+bool isRunningFromSource() =>
+    Platform.executable.endsWith(jitExecutableName) &&
+    Platform.script.toFilePath().endsWith('.dart');
+
 test() {
   Expect.isTrue(Platform.numberOfProcessors > 0);
   var os = Platform.operatingSystem;
@@ -27,13 +35,10 @@
   Expect.isTrue(hostname is String && hostname != "");
   var environment = Platform.environment;
   Expect.isTrue(environment is Map<String, String>);
-  if (!Platform.isWindows) {
-    Expect.isTrue(Platform.executable.endsWith('dart'));
-    Expect.isTrue(Platform.resolvedExecutable.endsWith('dart'));
-  } else {
-    Expect.isTrue(Platform.executable.endsWith('dart.exe'));
-    Expect.isTrue(Platform.resolvedExecutable.endsWith('dart.exe'));
-  }
+
+  Expect.isTrue(hasJitOrAotExecutableName(Platform.executable));
+  Expect.isTrue(hasJitOrAotExecutableName(Platform.resolvedExecutable));
+
   if (!Platform.isWindows) {
     Expect.isTrue(Platform.resolvedExecutable.startsWith('/'));
   } else {
@@ -46,9 +51,11 @@
   // Move directory to be sure script is correct.
   var oldDir = Directory.current;
   Directory.current = Directory.current.parent;
-  Expect.isTrue(
-      Platform.script.path.endsWith('tests/standalone/io/platform_test.dart'));
-  Expect.isTrue(Platform.script.toFilePath().startsWith(oldDir.path));
+  if (isRunningFromSource()) {
+    Expect.isTrue(Platform.script.path
+        .endsWith('tests/standalone/io/platform_test.dart'));
+    Expect.isTrue(Platform.script.toFilePath().startsWith(oldDir.path));
+  }
 }
 
 void f(reply) {
@@ -62,7 +69,7 @@
 testIsolate() {
   asyncStart();
   ReceivePort port = new ReceivePort();
-  var remote = Isolate.spawn(f, port.sendPort);
+  Isolate.spawn(f, port.sendPort);
   port.first.then((results) {
     Expect.equals(Platform.executable, results["Platform.executable"]);
 
@@ -70,7 +77,10 @@
     // SpawnFunction retains the script url of the parent which in this
     // case was a relative path.
     Expect.equals("file", uri.scheme);
-    Expect.isTrue(uri.path.endsWith('tests/standalone/io/platform_test.dart'));
+    if (isRunningFromSource()) {
+      Expect.isTrue(
+          uri.path.endsWith('tests/standalone/io/platform_test.dart'));
+    }
     Expect.listEquals(
         Platform.executableArguments, results["Platform.executableArguments"]);
     asyncEnd();
diff --git a/tests/standalone/io/raw_synchronous_socket_test.dart b/tests/standalone/io/raw_synchronous_socket_test.dart
index 50cb0f2..96f4511 100644
--- a/tests/standalone/io/raw_synchronous_socket_test.dart
+++ b/tests/standalone/io/raw_synchronous_socket_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone/io/shared_socket_test.dart b/tests/standalone/io/shared_socket_test.dart
index 3195b63..39eb4d1 100644
--- a/tests/standalone/io/shared_socket_test.dart
+++ b/tests/standalone/io/shared_socket_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:io';
 import 'dart:isolate';
diff --git a/tests/standalone/io/socket_close_test.dart b/tests/standalone/io/socket_close_test.dart
index 72a15de..38cc0d6 100644
--- a/tests/standalone/io/socket_close_test.dart
+++ b/tests/standalone/io/socket_close_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // VMOptions=
 // VMOptions=--short_socket_read
 // VMOptions=--short_socket_write
diff --git a/tests/standalone/io/socket_finalizer_test.dart b/tests/standalone/io/socket_finalizer_test.dart
index c82be22..5dfca94 100644
--- a/tests/standalone/io/socket_finalizer_test.dart
+++ b/tests/standalone/io/socket_finalizer_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // This test checks that sockets belonging to an isolate are properly cleaned up
 // when the isolate shuts down abnormally. If the socket is not properly cleaned
 // up, the test will time out.
diff --git a/tests/standalone/io/socket_many_connections_test.dart b/tests/standalone/io/socket_many_connections_test.dart
index 0140df7..5ed8d9d1 100644
--- a/tests/standalone/io/socket_many_connections_test.dart
+++ b/tests/standalone/io/socket_many_connections_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Test creating a large number of socket connections.
 library ServerTest;
 
diff --git a/tests/standalone/io/stdio_socket_finalizer_test.dart b/tests/standalone/io/stdio_socket_finalizer_test.dart
index c33da51..a35f0d5 100644
--- a/tests/standalone/io/stdio_socket_finalizer_test.dart
+++ b/tests/standalone/io/stdio_socket_finalizer_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // This test checks that stdin is *not* closed when an Isolate leaks it.
 
 import 'dart:async';
diff --git a/tests/standalone/io/wait_for_event_isolate_test.dart b/tests/standalone/io/wait_for_event_isolate_test.dart
index ce624e2..5948ea3 100644
--- a/tests/standalone/io/wait_for_event_isolate_test.dart
+++ b/tests/standalone/io/wait_for_event_isolate_test.dart
@@ -2,12 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:isolate';
-import 'dart:cli';
 
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
diff --git a/tests/standalone/packages_file_test.dart b/tests/standalone/packages_file_test.dart
index 99c2ab5..57fe3bf 100644
--- a/tests/standalone/packages_file_test.dart
+++ b/tests/standalone/packages_file_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:io";
 import "dart:convert" show json;
@@ -986,8 +983,7 @@
         "  config: $config\n"
         "  main  : $mainFile\n"
         "  args  : ${args.map((x) => '"$x"').join(" ")}\n"
-        ") : expect {\n${expect.keys.map((k) =>
-           '  "$k"'.padRight(6) + ":${json.encode(expect[k])}\n").join()}"
+        ") : expect {\n${expect.keys.map((k) => '  "$k"'.padRight(6) + ":${json.encode(expect[k])}\n").join()}"
         "}";
   }
 }
diff --git a/tests/standalone/regress_26031_test.dart b/tests/standalone/regress_26031_test.dart
index 60dd89b..c8a8e0a 100644
--- a/tests/standalone/regress_26031_test.dart
+++ b/tests/standalone/regress_26031_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/standalone/regress_28854_1_test.dart b/tests/standalone/regress_28854_1_test.dart
index 30b304a..80c831b 100644
--- a/tests/standalone/regress_28854_1_test.dart
+++ b/tests/standalone/regress_28854_1_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library regress;
 
 import 'dart:isolate';
diff --git a/tests/standalone/regress_28854_2_test.dart b/tests/standalone/regress_28854_2_test.dart
index 21395c1..169bb09 100644
--- a/tests/standalone/regress_28854_2_test.dart
+++ b/tests/standalone/regress_28854_2_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library regress;
 
 import 'dart:isolate';
diff --git a/tests/standalone/standalone_kernel.status b/tests/standalone/standalone_kernel.status
index a628ff4..a958509 100644
--- a/tests/standalone/standalone_kernel.status
+++ b/tests/standalone/standalone_kernel.status
@@ -91,7 +91,6 @@
 io/http_server_close_response_after_error_test: Skip # Flaky.
 io/http_shutdown_test: Skip # Flaky.
 io/https_client_certificate_test: Crash
-io/platform_test: Crash
 io/raw_datagram_socket_test: Skip # Flaky.
 io/raw_secure_server_closing_test: Skip # Flaky
 io/raw_socket_test: Crash
diff --git a/tests/standalone/standalone_precompiled.status b/tests/standalone/standalone_precompiled.status
index f6c27d2..536731b 100644
--- a/tests/standalone/standalone_precompiled.status
+++ b/tests/standalone/standalone_precompiled.status
@@ -21,7 +21,6 @@
 io/named_pipe_script_test: Skip
 io/namespace_test: Skip # Issue 33168
 io/platform_resolved_executable_test: Skip
-io/platform_test: RuntimeError # Expects to be running from 'dart' instead of 'dart_precompiled_runtime'
 io/print_sync_test: Skip
 io/process_check_arguments_test: Skip
 io/process_detached_test: Skip
diff --git a/tests/standalone/typed_array_int64_uint64_test.dart b/tests/standalone/typed_array_int64_uint64_test.dart
index 7b57986..e22036b 100644
--- a/tests/standalone/typed_array_int64_uint64_test.dart
+++ b/tests/standalone/typed_array_int64_uint64_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Dart test program for testing native typed arrays, int64 and uint64 only.
 
 // Library tag to be able to run in html test framework.
diff --git a/tests/standalone/typed_array_test.dart b/tests/standalone/typed_array_test.dart
index 6e4c6c3..305d736 100644
--- a/tests/standalone/typed_array_test.dart
+++ b/tests/standalone/typed_array_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Dart test program for testing native float and int arrays.  64-bit int arrays
 // are in a separate test.
 
diff --git a/tests/standalone/typed_data_isolate_test.dart b/tests/standalone/typed_data_isolate_test.dart
index 2573ada..a95b9db 100644
--- a/tests/standalone/typed_data_isolate_test.dart
+++ b/tests/standalone/typed_data_isolate_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Dart test program for testing typed data.
 
 // Library tag to be able to run in html test framework.
diff --git a/tests/standalone_2/fields_may_be_reset_test.dart b/tests/standalone_2/fields_may_be_reset_test.dart
deleted file mode 100644
index 7e7f00a..0000000
--- a/tests/standalone_2/fields_may_be_reset_test.dart
+++ /dev/null
@@ -1,11 +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.
-
-// @dart = 2.9
-
-// VMOptions=--fields_may_be_reset
-
-main() {
-  print("Okay");
-}
diff --git a/tests/standalone_2/io/directory_rename_test.dart b/tests/standalone_2/io/directory_rename_test.dart
new file mode 100644
index 0000000..5f47913
--- /dev/null
+++ b/tests/standalone_2/io/directory_rename_test.dart
@@ -0,0 +1,162 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Directory rename test.
+
+// @dart = 2.9
+
+import "dart:io";
+
+import "package:expect/expect.dart";
+import 'test_utils.dart' show withTempDir;
+
+testRenameToNewPath() async {
+  await withTempDir('testRenameToNewPath', (Directory tempDir) async {
+    final dir1 = Directory("${tempDir.path}/dir1");
+    dir1.createSync();
+
+    dir1.renameSync("${tempDir.path}/dir2");
+    Expect.isTrue(Directory("${tempDir.path}/dir2").existsSync());
+  });
+}
+
+testRenamePath() async {
+  // Verifies that the returned directory has the correct path.
+  await withTempDir('testRenameToNewPath', (Directory tempDir) async {
+    final oldDir = Directory("${tempDir.path}/dir1");
+    oldDir.createSync();
+
+    final newDir = oldDir.renameSync("${tempDir.path}/dir2");
+
+    Expect.isTrue(
+        oldDir.path == "${tempDir.path}/dir1",
+        "${oldDir.path} != '${tempDir.path}/dir1'"
+        "- path should not be updated");
+    Expect.isTrue(
+        newDir.path == "${tempDir.path}/dir2",
+        "${newDir.path} != '${tempDir.path}/dir2'"
+        "- path should be updated");
+  });
+}
+
+testRenameToSamePath() async {
+  await withTempDir('testRenameToSamePath', (Directory tempDir) async {
+    final dir = Directory("${tempDir.path}/dir");
+    dir.createSync();
+    final file = File("${dir.path}/file");
+    file.createSync();
+
+    dir.renameSync(dir.path);
+    Expect.isTrue(file.existsSync());
+  });
+}
+
+testRenameToExistingFile() async {
+  await withTempDir('testRenameToExistingFile', (Directory tempDir) async {
+    final dir = Directory("${tempDir.path}/dir");
+    dir.createSync();
+    final file = File("${tempDir.path}/file");
+    file.createSync();
+
+    // Overwriting an exsting file is not allowed.
+    try {
+      dir.renameSync(file.path);
+      Expect.fail('Directory.rename should fail to rename a non-directory');
+    } on FileSystemException catch (e) {
+      if (Platform.isWindows) {
+        Expect.isTrue(e.osError.message.contains('file already exists'),
+            'Unexpected error: $e');
+      } else if (Platform.isLinux || Platform.isMacOS) {
+        Expect.isTrue(e.osError.message.contains('Not a directory'),
+            'Unexpected error: $e');
+      }
+    }
+  });
+}
+
+testRenameToExistingEmptyDirectory() async {
+  await withTempDir('testRenameToExistingEmptyDirectory',
+      (Directory tempDir) async {
+    final dir1 = Directory("${tempDir.path}/dir1");
+    dir1.createSync();
+    File("${dir1.path}/file").createSync();
+
+    final dir2 = Directory("${tempDir.path}/dir2");
+    dir2.createSync();
+
+    try {
+      dir1.renameSync(dir2.path);
+      // Verify that the file contained in dir1 has been moved.
+      if (Platform.isWindows) {
+        Expect.fail(
+            'Directory.rename should fail to rename over an existing directory '
+            'on Windows');
+      } else {
+        Expect.isTrue(File("${dir2.path}/file").existsSync());
+      }
+    } on FileSystemException catch (e) {
+      if (Platform.isWindows) {
+        Expect.isTrue(e.osError.message.contains('file already exists'));
+      } else {
+        Expect.fail('Directory.rename should allow moves to empty directories');
+      }
+    }
+  });
+}
+
+testRenameToExistingNonEmptyDirectory() async {
+  await withTempDir('testRenameToExistingNonEmptyDirectory',
+      (Directory tempDir) async {
+    final dir1 = Directory("${tempDir.path}/dir1");
+    dir1.createSync();
+    File("${dir1.path}/file1").createSync();
+
+    final dir2 = Directory("${tempDir.path}/dir2");
+    dir2.createSync();
+    File("${dir2.path}/file2").createSync();
+
+    try {
+      dir1.renameSync(dir2.path);
+      Expect.fail(
+          'Directory.rename should fail to rename a non-empty directory');
+    } on FileSystemException catch (e) {
+      if (Platform.isWindows) {
+        Expect.isTrue(e.osError.message.contains('file already exists'),
+            'Unexpected error: $e');
+      } else if (Platform.isLinux || Platform.isMacOS) {
+        Expect.isTrue(e.osError.message.contains('Directory not empty'),
+            'Unexpected error: $e');
+      }
+    }
+  });
+}
+
+testRenameButActuallyFile() async {
+  await withTempDir('testRenameButActuallyFile', (Directory tempDir) async {
+    final file = File("${tempDir.path}/file");
+    file.createSync();
+    final dir = Directory(file.path);
+    try {
+      dir.renameSync("${tempDir.path}/dir");
+      Expect.fail("Expected a failure to rename the file.");
+    } on FileSystemException catch (e) {
+      Expect.isTrue(
+          e.message.contains('Rename failed'), 'Unexpected error: $e');
+      if (Platform.isLinux || Platform.isMacOS) {
+        Expect.isTrue(e.osError.message.contains('Not a directory'),
+            'Unexpected error: $e');
+      }
+    }
+  });
+}
+
+main() async {
+  await testRenameToNewPath();
+  await testRenamePath();
+  await testRenameToSamePath();
+  await testRenameToExistingFile();
+  await testRenameToExistingEmptyDirectory();
+  await testRenameToExistingNonEmptyDirectory();
+  await testRenameButActuallyFile();
+}
diff --git a/tests/standalone_2/io/directory_test.dart b/tests/standalone_2/io/directory_test.dart
index 91acf75..f0dad53 100644
--- a/tests/standalone_2/io/directory_test.dart
+++ b/tests/standalone_2/io/directory_test.dart
@@ -585,37 +585,6 @@
   });
 }
 
-testRename() {
-  var temp1 = Directory.systemTemp.createTempSync('directory_test');
-  var temp2 = Directory.systemTemp.createTempSync('directory_test');
-  var temp3 = temp1.renameSync(temp2.path);
-  Expect.isFalse(temp1.existsSync());
-  Expect.isTrue(temp2.existsSync());
-  Expect.equals(temp3.path, temp2.path);
-
-  var temp4 = temp2.renameSync(temp1.path);
-  Expect.isFalse(temp3.existsSync());
-  Expect.isFalse(temp2.existsSync());
-  Expect.isTrue(temp1.existsSync());
-  Expect.isTrue(temp4.existsSync());
-  Expect.equals(temp1.path, temp4.path);
-
-  String foo = '${temp4.path}/foo';
-  String bar = '${temp4.path}/bar';
-  new File(foo).createSync();
-  try {
-    new Directory(foo).renameSync(bar);
-    Expect.fail('Directory.rename should fail to rename a non-directory');
-  } catch (e) {
-    Expect.isTrue(e is FileSystemException);
-    if (Platform.isLinux || Platform.isMacOS) {
-      Expect.isTrue(e.osError.message.contains('Not a directory'));
-    }
-  }
-
-  temp1.deleteSync(recursive: true);
-}
-
 main() {
   DirectoryTest.testMain();
   NestedTempDirectoryTest.testMain();
@@ -625,5 +594,4 @@
   testCreateExisting();
   testCreateDirExistingFileSync();
   testCreateDirExistingFile();
-  testRename();
 }
diff --git a/tests/standalone_2/io/echo_server_stream_test.dart b/tests/standalone_2/io/echo_server_stream_test.dart
index e0449a3..1cfb36d 100644
--- a/tests/standalone_2/io/echo_server_stream_test.dart
+++ b/tests/standalone_2/io/echo_server_stream_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Echo server test program to test socket streams.
 //
 // VMOptions=
diff --git a/tests/standalone_2/io/file_stat_test.dart b/tests/standalone_2/io/file_stat_test.dart
index 9af5190..48b05b2 100644
--- a/tests/standalone_2/io/file_stat_test.dart
+++ b/tests/standalone_2/io/file_stat_test.dart
@@ -21,11 +21,16 @@
   Expect.equals(FileSystemEntityType.notFound, fileStat.type);
   Expect.equals(FileSystemEntityType.notFound, fileStatDirect.type);
   file.writeAsStringSync("Dart IO library test of FileStat");
+  Link link = new Link(join(directory.path, "link"));
+  link.createSync(file.path);
   new Timer(const Duration(seconds: 2), () {
     file.readAsStringSync();
     directory.listSync();
     FileStat fileStat = FileStat.statSync(file.path);
     FileStat fileStatDirect = file.statSync();
+    FileStat linkStat = FileStat.statSync(link.path);
+    FileStat linkStatDirect = link.statSync();
+
     Expect.equals(FileSystemEntityType.file, fileStat.type);
     Expect.equals(32, fileStat.size);
     Expect.equals(FileSystemEntityType.file, fileStatDirect.type);
@@ -46,6 +51,13 @@
           .isTrue(directoryStat.changed.compareTo(directoryStat.accessed) < 0);
     }
     Expect.equals(7 << 6, directoryStat.mode & (7 << 6)); // Includes +urwx.
+
+    // Verify that statSync resolves the link.
+    Expect.equals(FileSystemEntityType.file, linkStat.type);
+    Expect.equals(32, linkStat.size);
+    Expect.equals(FileSystemEntityType.file, linkStatDirect.type);
+    Expect.equals(32, linkStatDirect.size);
+
     directory.deleteSync(recursive: true);
   });
 }
@@ -53,8 +65,7 @@
 Future testStatAsync() {
   return Directory.systemTemp.createTemp('dart_file_stat').then((directory) {
     File file = new File(join(directory.path, "file"));
-    return FileStat
-        .stat(file.path)
+    return FileStat.stat(file.path)
         .then((fileStat) =>
             Expect.equals(FileSystemEntityType.notFound, fileStat.type))
         .then((_) => file.stat())
diff --git a/tests/standalone_2/io/file_system_watcher_large_set_test.dart b/tests/standalone_2/io/file_system_watcher_large_set_test.dart
index 326d201..9240759 100644
--- a/tests/standalone_2/io/file_system_watcher_large_set_test.dart
+++ b/tests/standalone_2/io/file_system_watcher_large_set_test.dart
@@ -2,8 +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.
 
-// VMOptions=--delayed-filewatch-callback --enable-isolate-groups
-// VMOptions=--delayed-filewatch-callback --no-enable-isolate-groups
+// VMOptions=--delayed-filewatch-callback
 
 // Verifies that cancelling subscription from inside of the event handler
 // works as expected, does not result in crash or hang.
diff --git a/tests/standalone_2/io/file_system_watcher_test.dart b/tests/standalone_2/io/file_system_watcher_test.dart
index bde35ce..b3e79db 100644
--- a/tests/standalone_2/io/file_system_watcher_test.dart
+++ b/tests/standalone_2/io/file_system_watcher_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone_2/io/http_advanced_test.dart b/tests/standalone_2/io/http_advanced_test.dart
index 10b6a5b..0d5c80f 100644
--- a/tests/standalone_2/io/http_advanced_test.dart
+++ b/tests/standalone_2/io/http_advanced_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // VMOptions=
 // VMOptions=--short_socket_read
 // VMOptions=--short_socket_write
diff --git a/tests/standalone_2/io/http_basic_test.dart b/tests/standalone_2/io/http_basic_test.dart
index 1cae05b..8d96875 100644
--- a/tests/standalone_2/io/http_basic_test.dart
+++ b/tests/standalone_2/io/http_basic_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // VMOptions=--trace_shutdown
 // VMOptions=--trace_shutdown --short_socket_read
 // VMOptions=--trace_shutdown --short_socket_write
diff --git a/tests/standalone_2/io/http_read_test.dart b/tests/standalone_2/io/http_read_test.dart
index 120e9ff..cc42d71 100644
--- a/tests/standalone_2/io/http_read_test.dart
+++ b/tests/standalone_2/io/http_read_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // VMOptions=
 // VMOptions=--short_socket_read
 // VMOptions=--short_socket_write
diff --git a/tests/standalone_2/io/io_override_test.dart b/tests/standalone_2/io/io_override_test.dart
index 54f0eb4..5ac4160 100644
--- a/tests/standalone_2/io/io_override_test.dart
+++ b/tests/standalone_2/io/io_override_test.dart
@@ -175,7 +175,30 @@
   return null;
 }
 
+class StdinMock extends Stream<List<int>> implements Stdin {
+  bool echoMode = false;
+  bool lineMode = false;
+  bool get hasTerminal => throw "";
+  bool get supportsAnsiEscapes => throw "";
+
+  int readByteSync() => throw "";
+  String readLineSync(
+          {Encoding encoding = systemEncoding, bool retainNewlines = false}) =>
+      throw "";
+  StreamSubscription<List<int>> listen(void onData(List<int> event),
+      {Function onError, void onDone(), bool cancelOnError}) {
+    throw "";
+  }
+}
+
+class StdoutMock implements Stdout {
+  void noSuchMethod(Invocation i) => throw "";
+}
+
 Future<Null> ioOverridesRunTest() async {
+  StdoutMock stdoutMock = StdoutMock();
+  StdoutMock stderrMock = StdoutMock();
+
   Future<Null> f = IOOverrides.runZoned(
     () async {
       Expect.isTrue(new Directory("directory") is DirectoryMock);
@@ -196,6 +219,9 @@
       Expect.isNull(Socket.connect(null, 0));
       Expect.isNull(Socket.startConnect(null, 0));
       Expect.isNull(ServerSocket.bind(null, 0));
+      Expect.isTrue(stdin is StdinMock);
+      Expect.identical(stdout, stdoutMock);
+      Expect.identical(stderr, stderrMock);
     },
     createDirectory: DirectoryMock.createDirectory,
     getCurrentDirectory: DirectoryMock.getCurrent,
@@ -214,6 +240,9 @@
     socketConnect: socketConnect,
     socketStartConnect: socketStartConnect,
     serverSocketBind: serverSocketBind,
+    stdin: () => StdinMock(),
+    stdout: () => stdoutMock,
+    stderr: () => stderrMock,
   );
   Expect.isFalse(new Directory("directory") is DirectoryMock);
   Expect.isTrue(new Directory("directory") is Directory);
diff --git a/tests/standalone_2/io/pipe_server_test.dart b/tests/standalone_2/io/pipe_server_test.dart
index 4628c69..f01e9c1 100644
--- a/tests/standalone_2/io/pipe_server_test.dart
+++ b/tests/standalone_2/io/pipe_server_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // OtherResources=readline_test1.dat
 //
 // VMOptions=
diff --git a/tests/standalone_2/io/platform_locale_name_test.dart b/tests/standalone_2/io/platform_locale_name_test.dart
index 5ad27ed..b615930 100644
--- a/tests/standalone_2/io/platform_locale_name_test.dart
+++ b/tests/standalone_2/io/platform_locale_name_test.dart
@@ -10,11 +10,12 @@
 
 main() {
   // Match patterns like:
-  //    "en-US"                 (Android, iOS, MacOS, Windows)
+  //    "en"                    (MacOS)
+  //    "en-US"                 (Android, iOS, Windows)
   //    "en_US", "en_US.UTF-8"  (Linux)
   //    "ESP-USA"               (theoretically possible)
   // Assumes that the platform has a reasonably configured locale.
-  var localePattern = RegExp(r"[A-Za-z]{2,4}[_-][A-Za-z]{2}");
+  var localePattern = RegExp(r"[A-Za-z]{2,4}([_-][A-Za-z]{2})?");
   var localeName = Platform.localeName;
   Expect.isNotNull(
       localePattern.matchAsPrefix(localeName),
diff --git a/tests/standalone_2/io/platform_test.dart b/tests/standalone_2/io/platform_test.dart
index 2ddc45d..e58632d 100644
--- a/tests/standalone_2/io/platform_test.dart
+++ b/tests/standalone_2/io/platform_test.dart
@@ -4,16 +4,24 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
-import "dart:async";
 import "dart:io";
 import "dart:isolate";
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
 
+final executableSuffix = Platform.isWindows ? '.exe' : '';
+final jitExecutableName = 'dart$executableSuffix';
+final aotExecutableName = 'dart_precompiled_runtime$executableSuffix';
+
+bool hasJitOrAotExecutableName(String executable) =>
+    executable.endsWith(jitExecutableName) ||
+    executable.endsWith(aotExecutableName);
+
+bool isRunningFromSource() =>
+    Platform.executable.endsWith(jitExecutableName) &&
+    Platform.script.toFilePath().endsWith('.dart');
+
 test() {
   Expect.isTrue(Platform.numberOfProcessors > 0);
   var os = Platform.operatingSystem;
@@ -29,13 +37,10 @@
   Expect.isTrue(hostname is String && hostname != "");
   var environment = Platform.environment;
   Expect.isTrue(environment is Map<String, String>);
-  if (!Platform.isWindows) {
-    Expect.isTrue(Platform.executable.endsWith('dart'));
-    Expect.isTrue(Platform.resolvedExecutable.endsWith('dart'));
-  } else {
-    Expect.isTrue(Platform.executable.endsWith('dart.exe'));
-    Expect.isTrue(Platform.resolvedExecutable.endsWith('dart.exe'));
-  }
+
+  Expect.isTrue(hasJitOrAotExecutableName(Platform.executable));
+  Expect.isTrue(hasJitOrAotExecutableName(Platform.resolvedExecutable));
+
   if (!Platform.isWindows) {
     Expect.isTrue(Platform.resolvedExecutable.startsWith('/'));
   } else {
@@ -48,9 +53,11 @@
   // Move directory to be sure script is correct.
   var oldDir = Directory.current;
   Directory.current = Directory.current.parent;
-  Expect.isTrue(Platform.script.path
-      .endsWith('tests/standalone_2/io/platform_test.dart'));
-  Expect.isTrue(Platform.script.toFilePath().startsWith(oldDir.path));
+  if (isRunningFromSource()) {
+    Expect.isTrue(Platform.script.path
+        .endsWith('tests/standalone_2/io/platform_test.dart'));
+    Expect.isTrue(Platform.script.toFilePath().startsWith(oldDir.path));
+  }
 }
 
 void f(reply) {
@@ -64,7 +71,7 @@
 testIsolate() {
   asyncStart();
   ReceivePort port = new ReceivePort();
-  var remote = Isolate.spawn(f, port.sendPort);
+  Isolate.spawn(f, port.sendPort);
   port.first.then((results) {
     Expect.equals(Platform.executable, results["Platform.executable"]);
 
@@ -72,8 +79,10 @@
     // SpawnFunction retains the script url of the parent which in this
     // case was a relative path.
     Expect.equals("file", uri.scheme);
-    Expect.isTrue(
-        uri.path.endsWith('tests/standalone_2/io/platform_test.dart'));
+    if (isRunningFromSource()) {
+      Expect.isTrue(
+          uri.path.endsWith('tests/standalone_2/io/platform_test.dart'));
+    }
     Expect.listEquals(
         Platform.executableArguments, results["Platform.executableArguments"]);
     asyncEnd();
diff --git a/tests/standalone_2/io/raw_synchronous_socket_test.dart b/tests/standalone_2/io/raw_synchronous_socket_test.dart
index 9e5b6bb..3e8a86b 100644
--- a/tests/standalone_2/io/raw_synchronous_socket_test.dart
+++ b/tests/standalone_2/io/raw_synchronous_socket_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone_2/io/shared_socket_test.dart b/tests/standalone_2/io/shared_socket_test.dart
index 6a12132..6cf7641 100644
--- a/tests/standalone_2/io/shared_socket_test.dart
+++ b/tests/standalone_2/io/shared_socket_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:io';
 import 'dart:isolate';
diff --git a/tests/standalone_2/io/socket_close_test.dart b/tests/standalone_2/io/socket_close_test.dart
index f9ad2d0..f509bc4 100644
--- a/tests/standalone_2/io/socket_close_test.dart
+++ b/tests/standalone_2/io/socket_close_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // VMOptions=
 // VMOptions=--short_socket_read
 // VMOptions=--short_socket_write
diff --git a/tests/standalone_2/io/socket_finalizer_test.dart b/tests/standalone_2/io/socket_finalizer_test.dart
index ecd8de3..a449270 100644
--- a/tests/standalone_2/io/socket_finalizer_test.dart
+++ b/tests/standalone_2/io/socket_finalizer_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // This test checks that sockets belonging to an isolate are properly cleaned up
 // when the isolate shuts down abnormally. If the socket is not properly cleaned
 // up, the test will time out.
diff --git a/tests/standalone_2/io/socket_many_connections_test.dart b/tests/standalone_2/io/socket_many_connections_test.dart
index 0e665dc..4944c33 100644
--- a/tests/standalone_2/io/socket_many_connections_test.dart
+++ b/tests/standalone_2/io/socket_many_connections_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Test creating a large number of socket connections.
 library ServerTest;
 
diff --git a/tests/standalone_2/io/stdio_socket_finalizer_test.dart b/tests/standalone_2/io/stdio_socket_finalizer_test.dart
index 7cc1b64..1a36dd8 100644
--- a/tests/standalone_2/io/stdio_socket_finalizer_test.dart
+++ b/tests/standalone_2/io/stdio_socket_finalizer_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // This test checks that stdin is *not* closed when an Isolate leaks it.
 
 import 'dart:async';
diff --git a/tests/standalone_2/io/wait_for_event_isolate_test.dart b/tests/standalone_2/io/wait_for_event_isolate_test.dart
index a22ce25..7cad2c2 100644
--- a/tests/standalone_2/io/wait_for_event_isolate_test.dart
+++ b/tests/standalone_2/io/wait_for_event_isolate_test.dart
@@ -4,12 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:isolate';
-import 'dart:cli';
 
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
diff --git a/tests/standalone_2/packages_file_test.dart b/tests/standalone_2/packages_file_test.dart
index a527ab4..26f9346 100644
--- a/tests/standalone_2/packages_file_test.dart
+++ b/tests/standalone_2/packages_file_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:io";
 import "dart:convert" show json;
@@ -988,8 +985,7 @@
         "  config: $config\n"
         "  main  : $mainFile\n"
         "  args  : ${args.map((x) => '"$x"').join(" ")}\n"
-        ") : expect {\n${expect.keys.map((k) =>
-           '  "$k"'.padRight(6) + ":${json.encode(expect[k])}\n").join()}"
+        ") : expect {\n${expect.keys.map((k) => '  "$k"'.padRight(6) + ":${json.encode(expect[k])}\n").join()}"
         "}";
   }
 }
diff --git a/tests/standalone_2/regress_26031_test.dart b/tests/standalone_2/regress_26031_test.dart
index 933f5b9..0c7b705 100644
--- a/tests/standalone_2/regress_26031_test.dart
+++ b/tests/standalone_2/regress_26031_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/standalone_2/regress_28854_1_test.dart b/tests/standalone_2/regress_28854_1_test.dart
index fdc3cc1..f2c7cba 100644
--- a/tests/standalone_2/regress_28854_1_test.dart
+++ b/tests/standalone_2/regress_28854_1_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library regress;
 
 import 'dart:isolate';
diff --git a/tests/standalone_2/regress_28854_2_test.dart b/tests/standalone_2/regress_28854_2_test.dart
index d05b294..24d6282 100644
--- a/tests/standalone_2/regress_28854_2_test.dart
+++ b/tests/standalone_2/regress_28854_2_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library regress;
 
 import 'dart:isolate';
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index 548f99c..77236ea 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -93,7 +93,6 @@
 io/http_server_close_response_after_error_test: Skip # Flaky.
 io/http_shutdown_test: Skip # Flaky.
 io/https_client_certificate_test: Crash
-io/platform_test: Crash
 io/raw_datagram_socket_test: Skip # Flaky.
 io/raw_secure_server_closing_test: Skip # Flaky
 io/raw_socket_test: Crash
diff --git a/tests/standalone_2/standalone_2_precompiled.status b/tests/standalone_2/standalone_2_precompiled.status
index cf466ae..07c20e7 100644
--- a/tests/standalone_2/standalone_2_precompiled.status
+++ b/tests/standalone_2/standalone_2_precompiled.status
@@ -18,7 +18,6 @@
 io/named_pipe_script_test: Skip
 io/namespace_test: Skip # Issue 33168
 io/platform_resolved_executable_test: Skip
-io/platform_test: RuntimeError # Expects to be running from 'dart' instead of 'dart_precompiled_runtime'
 io/print_sync_test: Skip
 io/process_check_arguments_test: Skip
 io/process_detached_test: Skip
diff --git a/tests/standalone_2/typed_array_int64_uint64_test.dart b/tests/standalone_2/typed_array_int64_uint64_test.dart
index 3eb3833..c394748 100644
--- a/tests/standalone_2/typed_array_int64_uint64_test.dart
+++ b/tests/standalone_2/typed_array_int64_uint64_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Dart test program for testing native typed arrays, int64 and uint64 only.
 
 // Library tag to be able to run in html test framework.
diff --git a/tests/standalone_2/typed_array_test.dart b/tests/standalone_2/typed_array_test.dart
index 94be7ec..9557f01b 100644
--- a/tests/standalone_2/typed_array_test.dart
+++ b/tests/standalone_2/typed_array_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Dart test program for testing native float and int arrays.  64-bit int arrays
 // are in a separate test.
 
diff --git a/tests/standalone_2/typed_data_isolate_test.dart b/tests/standalone_2/typed_data_isolate_test.dart
index 0868696..c3b4c30 100644
--- a/tests/standalone_2/typed_data_isolate_test.dart
+++ b/tests/standalone_2/typed_data_isolate_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Dart test program for testing typed data.
 
 // Library tag to be able to run in html test framework.
diff --git a/tests/web/47691_test.dart b/tests/web/47691_test.dart
new file mode 100644
index 0000000..db8ae9d
--- /dev/null
+++ b/tests/web/47691_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All 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 LoadElements {
+  List call() => [];
+}
+
+class ViewModel {
+  ViewModel(this._loadElements);
+
+  final LoadElements _loadElements;
+
+  void init() {
+    final elements = _loadElements();
+    for (final element in elements) {
+      Expect.identical(element, element);
+    }
+  }
+}
+
+void main() {
+  ViewModel(LoadElements()).init();
+}
diff --git a/tests/web/dummy_compiler_test.dart b/tests/web/dummy_compiler_test.dart
deleted file mode 100644
index 53d4c20..0000000
--- a/tests/web/dummy_compiler_test.dart
+++ /dev/null
@@ -1,68 +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.
-
-// Tests that the dart2js compiler can be run in a js engine.  This ensures that
-// the internal compiler APIs have no dependency on dart:io.
-library dummy_compiler;
-
-import 'dart:async';
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/compiler.dart';
-
-import 'mock_libraries.dart';
-
-String libProvider(Uri uri) {
-  if (uri.path.endsWith(".platform")) {
-    return DEFAULT_PLATFORM_CONFIG;
-  }
-  if (uri.path.endsWith("/core.dart")) {
-    return buildLibrarySource(DEFAULT_CORE_LIBRARY);
-  } else if (uri.path.endsWith('core_patch.dart')) {
-    return DEFAULT_PATCH_CORE_SOURCE;
-  } else if (uri.path.endsWith('internal.dart')) {
-    return buildLibrarySource(DEFAULT_INTERNAL_LIBRARY);
-  } else if (uri.path.endsWith('interceptors.dart')) {
-    return buildLibrarySource(DEFAULT_INTERCEPTORS_LIBRARY);
-  } else if (uri.path.endsWith('js_helper.dart')) {
-    return buildLibrarySource(DEFAULT_JS_HELPER_LIBRARY);
-  } else if (uri.path.endsWith('/async.dart')) {
-    return buildLibrarySource(DEFAULT_ASYNC_LIBRARY);
-  } else {
-    return "library lib${uri.path.replaceAll('/', '.')};";
-  }
-}
-
-Future<String> provider(Uri uri) {
-  String source;
-  if (uri.scheme == "main") {
-    source = "main() {}";
-  } else if (uri.scheme == "lib") {
-    source = libProvider(uri);
-  } else {
-    throw "unexpected URI $uri";
-  }
-  return new Future.value(source);
-}
-
-void handler(Uri uri, int begin, int end, String message, Diagnostic kind) {
-  if (uri == null) {
-    print('$kind: $message');
-  } else {
-    print('$uri:$begin:$end: $kind: $message');
-  }
-}
-
-main() {
-  asyncStart();
-  Future<CompilationResult> result = compile(new Uri(scheme: 'main'),
-      new Uri(scheme: 'lib', path: '/'), provider, handler);
-  result.then((CompilationResult result) {
-    if (!result.isSuccess) {
-      throw 'Compilation failed';
-    }
-  }, onError: (e, s) {
-    throw 'Compilation failed: $e\n$s';
-  }).then(asyncSuccess);
-}
diff --git a/tests/web/internal/mock_libraries.dart b/tests/web/internal/mock_libraries.dart
deleted file mode 100644
index d279e0c..0000000
--- a/tests/web/internal/mock_libraries.dart
+++ /dev/null
@@ -1,463 +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 for creating mock versions of platform and internal libraries.
-
-library mock_libraries;
-
-const DEFAULT_PLATFORM_CONFIG = """
-[libraries]
-core:core/core.dart
-async:async/async.dart
-_js_helper:_internal/js_runtime/lib/js_helper.dart
-_interceptors:_internal/js_runtime/lib/interceptors.dart
-_internal:internal/internal.dart
-""";
-
-String buildLibrarySource(Map<String, String> elementMap,
-    [Map<String, String> additionalElementMap = const <String, String>{}]) {
-  Map<String, String> map = new Map<String, String>.from(elementMap);
-  if (additionalElementMap != null) {
-    map.addAll(additionalElementMap);
-  }
-  StringBuffer sb = new StringBuffer();
-  map.values.forEach((String element) {
-    sb.write('$element\n');
-  });
-  return sb.toString();
-}
-
-const Map<String, String> DEFAULT_CORE_LIBRARY = const <String, String>{
-  '<imports>': '''
-import 'dart:_internal' as internal;
-''',
-  'bool': 'class bool {}',
-  'Comparator': 'abstract class Comparator<T> {}',
-  'DateTime': r'''
-      class DateTime {
-        DateTime(year);
-        DateTime.utc(year);
-      }''',
-  'Deprecated': r'''
-      class Deprecated extends Object {
-        final String expires;
-        const Deprecated(this.expires);
-      }''',
-  'deprecated': 'const Object deprecated = const Deprecated("next release");',
-  'double': r'''
-      abstract class double extends num {
-        static var nan = 0;
-        static parse(s) {}
-      }''',
-  'Enum': r'''
-      abstract class Enum {
-        int get index;
-      }''',
-  'Function': r'''
-      class Function {
-        static apply(Function fn, List positional, [Map named]) => null;
-      }''',
-  'identical': 'bool identical(Object a, Object b) { return true; }',
-  'int': 'abstract class int extends num { }',
-  'Iterable': '''
-      abstract class Iterable<E> {
-          Iterator<E> get iterator => null;
-      }''',
-  'Iterator': '''
-      abstract class Iterator<E> {
-          E get current => null;
-      }''',
-  'LinkedHashMap': r'''
-      class LinkedHashMap<K, V> implements Map<K, V> {
-      }''',
-  'List': r'''
-      class List<E> extends Iterable<E> {
-        var length;
-        List([length]);
-        List.filled(length, element);
-        E get first => null;
-        E get last => null;
-        E get single => null;
-        E removeLast() => null;
-        E removeAt(i) => null;
-        E elementAt(i) => null;
-        E singleWhere(f) => null;
-      }''',
-  'Map': 'abstract class Map<K,V> {}',
-  'Null': 'class Null {}',
-  'num': r'''
-      abstract class num {
-        operator +(_);
-        operator *(_);
-        operator -();
-      }''',
-  'print': 'print(var obj) {}',
-  'proxy': 'const proxy = 0;',
-  'Object': r'''
-      class Object {
-        const Object();
-        operator ==(other) { return true; }
-        get hashCode => throw "Object.hashCode not implemented.";
-        String toString() { return null; }
-        noSuchMethod(im) { throw im; }
-      }''',
-  'StackTrace': 'abstract class StackTrace {}',
-  'String': 'class String implements Pattern {}',
-  'Symbol': '''
-      abstract class Symbol {
-        const factory Symbol(String name) = internal.Symbol;
-      }
-      ''',
-  'Type': 'class Type {}',
-  'Pattern': 'abstract class Pattern {}',
-  '_genericNoSuchMethod': '_genericNoSuchMethod(a,b,c,d,e) {}',
-  '_unresolvedConstructorError': '_unresolvedConstructorError(a,b,c,d,e) {}',
-  '_malformedTypeError': '_malformedTypeError(message) {}',
-};
-
-const Map<String, String> DEFAULT_INTERNAL_LIBRARY = const <String, String>{
-  '<imports>': '''
-import 'dart:core' as core;
-''',
-  'Symbol': '''
-class Symbol implements core.Symbol {
-  final core.String _name;
-
-  const Symbol(this._name);
-  Symbol.validated(this._name);
-}
-''',
-};
-
-const String DEFAULT_PATCH_CORE_SOURCE = r'''
-import 'dart:_js_helper';
-import 'dart:_interceptors';
-import 'dart:async';
-
-@patch
-class LinkedHashMap<K, V> {
-  factory LinkedHashMap._empty() => null;
-  factory LinkedHashMap._literal(elements) => null;
-  static _makeEmpty() => null;
-  static _makeLiteral(elements) => null;
-}
-''';
-
-const Map<String, String> DEFAULT_JS_HELPER_LIBRARY = const <String, String>{
-  'assertTest': 'assertTest(a) {}',
-  'assertThrow': 'assertThrow(a) {}',
-  'assertHelper': 'assertHelper(a) {}',
-  'assertUnreachable': 'assertUnreachable() {}',
-  'assertIsSubtype': 'assertIsSubtype(subtype, supertype, message) {}',
-  'assertSubtype': 'assertSubtype(object, isField, checks, asField) {}',
-  'assertSubtypeOfRuntimeType': 'assertSubtypeOfRuntimeType(object, type) {}',
-  'asyncHelper': 'asyncHelper(object, asyncBody, completer) {}',
-  'boolConversionCheck': 'boolConversionCheck(x) {}',
-  'boolTypeCast': 'boolTypeCast(value) {}',
-  'boolTypeCheck': 'boolTypeCheck(value) {}',
-  'checkSubtype': 'checkSubtype(object, isField, checks, asField) {}',
-  'checkSubtypeOfRuntimeType': 'checkSubtypeOfRuntimeType(o, t) {}',
-  'BoundClosure': r'''abstract class BoundClosure extends Closure {
-    var self;
-    var target;
-    var receiver;
-  }''',
-  'buildFunctionType': r'''buildFunctionType(returnType, parameterTypes,
-                            optionalParameterTypes) {
-            return new RuntimeFunctionType();
-          }''',
-  'buildInterfaceType': '''buildInterfaceType(rti, typeArguments) {
-                             if (rti == null) return new RuntimeTypePlain();
-                             return new RuntimeTypeGeneric();
-                           }''',
-  'buildNamedFunctionType':
-      r'''buildNamedFunctionType(returnType, parameterTypes,
-                                 namedParameters) {
-            return new RuntimeFunctionType();
-          }''',
-  'checkFunctionSubtype':
-      r'''checkFunctionSubtype(var target, String signatureName,
-                               String contextName, var context,
-                               var typeArguments) {}''',
-  'checkMalformedType': 'checkMalformedType(value, message) {}',
-  'checkInt': 'checkInt(value) {}',
-  'checkNum': 'checkNum(value) {}',
-  'checkString': 'checkString(value) {}',
-  'Closure': 'abstract class Closure implements Function { }',
-  'closureFromTearOff':
-      r'''closureFromTearOff(receiver, functions, reflectionInfo,
-                             isStatic, jsArguments, name) {}''',
-  'computeSignature':
-      'computeSignature(var signature, var context, var contextName) {}',
-  'ConstantMap': 'class ConstantMap<K, V> {}',
-  'ConstantProtoMap': 'class ConstantProtoMap<K, V> {}',
-  'ConstantStringMap': 'class ConstantStringMap<K, V> {}',
-  'createInvocationMirror': 'createInvocationMirror(a0, a1, a2, a3, a4, a5) {}',
-  'createRuntimeType': 'createRuntimeType(a) {}',
-  'doubleTypeCast': 'doubleTypeCast(value) {}',
-  'doubleTypeCheck': 'doubleTypeCheck(value) {}',
-  'functionSubtypeCast':
-      r'''functionSubtypeCast(Object object, String signatureName,
-                              String contextName, var context) {}''',
-  'functionTypeTestMetaHelper': r'''
-      functionTypeTestMetaHelper() {
-        buildFunctionType(null, null, null);
-        buildNamedFunctionType(null, null, null);
-        buildInterfaceType(null, null);
-      }''',
-  'functionTypeTest': r'functionTypeTest(f, t) {}',
-  'functionTypeCast': r'functionTypeCast(f, t) { return f; }',
-  'functionTypeCheck': r'functionTypeCheck(f, t) { return f; }',
-  'futureOrTest': r'futureOrTest(f, t) {}',
-  'futureOrCast': r'futureOrCast(f, t) { return f; }',
-  'futureOrCheck': r'futureOrCheck(f, t) { return f; }',
-  'getFallThroughError': 'getFallThroughError() {}',
-  'getIsolateAffinityTag': 'getIsolateAffinityTag(_) {}',
-  'getRuntimeTypeArgumentIntercepted':
-      'getRuntimeTypeArgumentIntercepted(interceptor, target, substitutionName, index) {}',
-  'getRuntimeTypeArgument':
-      'getRuntimeTypeArgument(target, substitutionName, index) {}',
-  'getRuntimeTypeArguments':
-      'getRuntimeTypeArguments(target, substitutionName) {}',
-  'getRuntimeTypeInfo': 'getRuntimeTypeInfo(a) {}',
-  'getTraceFromException': 'getTraceFromException(exception) {}',
-  'getTypeArgumentByIndex': 'getTypeArgumentByIndex(target, index) {}',
-  'GeneralConstantMap': 'class GeneralConstantMap {}',
-  'iae': 'iae(x) { throw x; } ioore(x) { throw x; }',
-  'Instantiation1': 'class Instantiation1<T1> extends Closure {}',
-  'Instantiation2': 'class Instantiation2<T1,T2> extends Closure {}',
-  'Instantiation3': 'class Instantiation3<T1,T2,T3> extends Closure {}',
-  'interceptedTypeCast': 'interceptedTypeCast(value, property) {}',
-  'interceptedTypeCheck': 'interceptedTypeCheck(value, property) {}',
-  'intTypeCast': 'intTypeCast(value) {}',
-  'intTypeCheck': 'intTypeCheck(value) {}',
-  'isJsIndexable': 'isJsIndexable(a, b) {}',
-  'JavaScriptIndexingBehavior': 'abstract class JavaScriptIndexingBehavior {}',
-  'JSInvocationMirror': r'''
-  class JSInvocationMirror {
-    get typeArguments => null;
-  }''',
-  'listSuperNativeTypeCast': 'listSuperNativeTypeCast(value) {}',
-  'listSuperNativeTypeCheck': 'listSuperNativeTypeCheck(value) {}',
-  'listSuperTypeCast': 'listSuperTypeCast(value) {}',
-  'listSuperTypeCheck': 'listSuperTypeCheck(value) {}',
-  'listTypeCast': 'listTypeCast(value) {}',
-  'listTypeCheck': 'listTypeCheck(value) {}',
-  'makeLiteralMap': 'makeLiteralMap(List keyValuePairs) {}',
-  'Native': 'class Native {}',
-  'numberOrStringSuperNativeTypeCast':
-      'numberOrStringSuperNativeTypeCast(value) {}',
-  'numberOrStringSuperNativeTypeCheck':
-      'numberOrStringSuperNativeTypeCheck(value) {}',
-  'numberOrStringSuperTypeCast': 'numberOrStringSuperTypeCast(value) {}',
-  'numberOrStringSuperTypeCheck': 'numberOrStringSuperTypeCheck(value) {}',
-  'numTypeCast': 'numTypeCast(value) {}',
-  'numTypeCheck': 'numTypeCheck(value) {}',
-  '_Patch': 'class _Patch { final tag; const _Patch(this.tag); }',
-  'patch': 'const patch = const _Patch(null);',
-  'patch_full': 'const patch_full = const _Patch("full");',
-  'patch_lazy': 'const patch_lazy = const _Patch("lazy");',
-  'patch_startup': 'const patch_startup = const _Patch("startup");',
-  'propertyTypeCast': 'propertyTypeCast(x) {}',
-  'propertyTypeCheck': 'propertyTypeCheck(value, property) {}',
-  'requiresPreamble': 'requiresPreamble() {}',
-  'RuntimeFunctionType': 'class RuntimeFunctionType {}',
-  'RuntimeTypeGeneric': 'class RuntimeTypeGeneric {}',
-  'RuntimeTypePlain': 'class RuntimeTypePlain {}',
-  'S': 'S() {}',
-  'setRuntimeTypeInfo': 'setRuntimeTypeInfo(a, b) {}',
-  'stringSuperNativeTypeCast': 'stringSuperNativeTypeCast(value) {}',
-  'stringSuperNativeTypeCheck': 'stringSuperNativeTypeCheck(value) {}',
-  'stringSuperTypeCast': 'stringSuperTypeCast(value) {}',
-  'stringSuperTypeCheck': 'stringSuperTypeCheck(value) {}',
-  'stringTypeCast': 'stringTypeCast(x) {}',
-  'stringTypeCheck': 'stringTypeCheck(x) {}',
-  'subtypeCast': 'subtypeCast(object, isField, checks, asField) {}',
-  'subtypeOfRuntimeTypeCast': 'subtypeOfRuntimeTypeCast(object, type) {}',
-  'checkConcurrentModificationError':
-      'checkConcurrentModificationError(collection) {}',
-  'throwConcurrentModificationError':
-      'throwConcurrentModificationError(collection) {}',
-  'throwCyclicInit': 'throwCyclicInit(staticName) {}',
-  'throwExpression': 'throwExpression(e) {}',
-  'throwNoSuchMethod':
-      'throwNoSuchMethod(obj, name, arguments, expectedArgumentNames) {}',
-  'throwUnsupportedError': 'throwUnsupportedError(message) {}',
-  'throwTypeError': 'throwTypeError(message) {}',
-  'unwrapException': 'unwrapException(e) {}',
-  'voidTypeCheck': 'voidTypeCheck(value) {}',
-  'wrapException': 'wrapException(x) { return x; }',
-  'badMain': 'badMain() { throw "bad main"; }',
-  'missingMain': 'missingMain() { throw "missing main"; }',
-  'mainHasTooManyParameters': 'mainHasTooManyParameters() '
-      '{ throw "main has too many parameters"; }',
-};
-
-const Map<String, String> DEFAULT_FOREIGN_HELPER_LIBRARY =
-    const <String, String>{
-  'JS': r'''
-      dynamic JS(String typeDescription, String codeTemplate,
-        [var arg0, var arg1, var arg2, var arg3, var arg4, var arg5, var arg6,
-         var arg7, var arg8, var arg9, var arg10, var arg11]) {}''',
-};
-
-const Map<String, String> DEFAULT_INTERCEPTORS_LIBRARY = const <String, String>{
-  'findIndexForNativeSubclassType': 'findIndexForNativeSubclassType(type) {}',
-  'getDispatchProperty': 'getDispatchProperty(o) {}',
-  'getInterceptor': 'getInterceptor(x) {}',
-  'getNativeInterceptor': 'getNativeInterceptor(x) {}',
-  'initializeDispatchProperty': 'initializeDispatchProperty(f,p,i) {}',
-  'initializeDispatchPropertyCSP': 'initializeDispatchPropertyCSP(f,p,i) {}',
-  'Interceptor': r'''
-      class Interceptor {
-        toString() {}
-        bool operator==(other) => identical(this, other);
-        get hashCode => throw "Interceptor.hashCode not implemented.";
-        noSuchMethod(im) { throw im; }
-      }''',
-  'JSArray': r'''
-          class JSArray<E> extends Interceptor implements List<E>, JSIndexable {
-            JSArray();
-            factory JSArray.typed(a) => a;
-            var length;
-            operator[](index) => this[index];
-            operator[]=(index, value) { this[index] = value; }
-            add(value) { this[length] = value; }
-            insert(index, value) {}
-            E get first => this[0];
-            E get last => this[0];
-            E get single => this[0];
-            E removeLast() => this[0];
-            E removeAt(index) => this[0];
-            E elementAt(index) => this[0];
-            E singleWhere(f) => this[0];
-            Iterator<E> get iterator => null;
-          }''',
-  'JSBool': 'class JSBool extends Interceptor implements bool {}',
-  'JSDouble': 'class JSDouble extends JSNumber implements double {}',
-  'JSExtendableArray': 'class JSExtendableArray extends JSMutableArray {}',
-  'JSFixedArray': 'class JSFixedArray extends JSMutableArray {}',
-  'JSFunction':
-      'abstract class JSFunction extends Interceptor implements Function {}',
-  'JSIndexable': r'''
-      abstract class JSIndexable {
-        get length;
-        operator[](index);
-      }''',
-  'JSInt': r'''
-       class JSInt extends JSNumber implements int {
-         operator~() => this;
-       }''',
-  'JSMutableArray':
-      'class JSMutableArray extends JSArray implements JSMutableIndexable {}',
-  'JSUnmodifiableArray': 'class JSUnmodifiableArray extends JSArray {}',
-  'JSMutableIndexable':
-      'abstract class JSMutableIndexable extends JSIndexable {}',
-  'JSPositiveInt': 'class JSPositiveInt extends JSInt {}',
-  'JSNull': r'''
-      class JSNull extends Interceptor {
-        bool operator==(other) => identical(null, other);
-        get hashCode => throw "JSNull.hashCode not implemented.";
-        String toString() => 'Null';
-        Type get runtimeType => null;
-        noSuchMethod(x) => super.noSuchMethod(x);
-      }''',
-  'JSNumber': r'''
-      class JSNumber extends Interceptor implements num {
-        // All these methods return a number to please type inferencing.
-        operator-() => (this is JSInt) ? 42 : 42.2;
-        operator +(other) => (this is JSInt) ? 42 : 42.2;
-        operator -(other) => (this is JSInt) ? 42 : 42.2;
-        operator ~/(other) => _tdivFast(other);
-        operator /(other) => (this is JSInt) ? 42 : 42.2;
-        operator *(other) => (this is JSInt) ? 42 : 42.2;
-        operator %(other) => (this is JSInt) ? 42 : 42.2;
-        operator <<(other) => _shlPositive(other);
-        operator >>(other) {
-          return _shrBothPositive(other) + _shrReceiverPositive(other) +
-            _shrOtherPositive(other);
-        }
-        operator |(other) => 42;
-        operator &(other) => 42;
-        operator ^(other) => 42;
-
-        operator >(other) => !identical(this, other);
-        operator >=(other) => !identical(this, other);
-        operator <(other) => !identical(this, other);
-        operator <=(other) => !identical(this, other);
-        operator ==(other) => identical(this, other);
-        get hashCode => throw "JSNumber.hashCode not implemented.";
-
-        // We force side effects on _tdivFast to mimic the shortcomings of
-        // the effect analysis: because the `_tdivFast` implementation of
-        // the core library has calls that may not already be analyzed,
-        // the analysis will conclude that `_tdivFast` may have side
-        // effects.
-        _tdivFast(other) => new List()..length = 42;
-        _shlPositive(other) => 42;
-        _shrBothPositive(other) => 42;
-        _shrReceiverPositive(other) => 42;
-        _shrOtherPositive(other) => 42;
-
-        abs() => (this is JSInt) ? 42 : 42.2;
-        remainder(other) => (this is JSInt) ? 42 : 42.2;
-        truncate() => 42;
-      }''',
-  'JSString': r'''
-      class JSString extends Interceptor implements String, JSIndexable {
-        split(pattern) => [];
-        int get length => 42;
-        operator[](index) {}
-        toString() {}
-        operator+(other) => this;
-        codeUnitAt(index) => 42;
-      }''',
-  'JSUInt31': 'class JSUInt31 extends JSUInt32 {}',
-  'JSUInt32': 'class JSUInt32 extends JSPositiveInt {}',
-  'ObjectInterceptor': 'class ObjectInterceptor {}',
-  'JavaScriptObject': 'class JavaScriptObject {}',
-  'PlainJavaScriptObject': 'class PlainJavaScriptObject {}',
-  'UnknownJavaScriptObject': 'class UnknownJavaScriptObject {}',
-  'JavaScriptFunction': 'class JavaScriptFunction {}',
-};
-
-const Map<String, String> DEFAULT_ASYNC_LIBRARY = const <String, String>{
-  'DeferredLibrary': 'class DeferredLibrary {}',
-  'Future': '''
-      class Future<T> {
-        Future.value([value]);
-      }
-      ''',
-  'Stream': 'class Stream<T> {}',
-  'Completer': 'class Completer<T> {}',
-  'StreamIterator': 'class StreamIterator<T> {}',
-};
-
-/// These members are only needed when async/await is used.
-const Map<String, String> ASYNC_AWAIT_LIBRARY = const <String, String>{
-  '_wrapJsFunctionForAsync': '_wrapJsFunctionForAsync(f) {}',
-  '_asyncHelper': '_asyncHelper(o, f, c) {}',
-  '_SyncStarIterable': 'class _SyncStarIterable {}',
-  '_IterationMarker': 'class _IterationMarker {}',
-  '_AsyncStarStreamController': 'class _AsyncStarStreamController {}',
-  '_asyncStarHelper': '_asyncStarHelper(x, y, z) {}',
-  '_streamOfController': '_streamOfController(x) {}',
-};
-
-const String DEFAULT_MIRRORS_SOURCE = r'''
-import 'dart:_js_mirrors' as js;
-class Comment {}
-class MirrorSystem {}
-class MirrorsUsed {
-  final targets;
-  const MirrorsUsed({this.targets});
-}
-void reflectType(Type t) => js.disableTreeShaking();
-''';
-
-const String DEFAULT_JS_MIRRORS_SOURCE = r'''
-disableTreeShaking(){}
-preserveMetadata(){}
-preserveLibraryNames(){}
-''';
diff --git a/tests/web_2/47691_test.dart b/tests/web_2/47691_test.dart
new file mode 100644
index 0000000..7de21ae
--- /dev/null
+++ b/tests/web_2/47691_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.7
+
+import 'package:expect/expect.dart';
+
+class LoadElements {
+  List call() => [];
+}
+
+class ViewModel {
+  ViewModel(this._loadElements);
+
+  final LoadElements _loadElements;
+
+  void init() {
+    final elements = _loadElements();
+    for (final element in elements) {
+      Expect.identical(element, element);
+    }
+  }
+}
+
+void main() {
+  ViewModel(LoadElements()).init();
+}
diff --git a/tests/web_2/dummy_compiler_test.dart b/tests/web_2/dummy_compiler_test.dart
deleted file mode 100644
index 1f66dca..0000000
--- a/tests/web_2/dummy_compiler_test.dart
+++ /dev/null
@@ -1,70 +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.
-
-// @dart = 2.7
-
-// Tests that the dart2js compiler can be run in a js engine.  This ensures that
-// the internal compiler APIs have no dependency on dart:io.
-library dummy_compiler;
-
-import 'dart:async';
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/compiler.dart';
-
-import 'mock_libraries.dart';
-
-String libProvider(Uri uri) {
-  if (uri.path.endsWith(".platform")) {
-    return DEFAULT_PLATFORM_CONFIG;
-  }
-  if (uri.path.endsWith("/core.dart")) {
-    return buildLibrarySource(DEFAULT_CORE_LIBRARY);
-  } else if (uri.path.endsWith('core_patch.dart')) {
-    return DEFAULT_PATCH_CORE_SOURCE;
-  } else if (uri.path.endsWith('internal.dart')) {
-    return buildLibrarySource(DEFAULT_INTERNAL_LIBRARY);
-  } else if (uri.path.endsWith('interceptors.dart')) {
-    return buildLibrarySource(DEFAULT_INTERCEPTORS_LIBRARY);
-  } else if (uri.path.endsWith('js_helper.dart')) {
-    return buildLibrarySource(DEFAULT_JS_HELPER_LIBRARY);
-  } else if (uri.path.endsWith('/async.dart')) {
-    return buildLibrarySource(DEFAULT_ASYNC_LIBRARY);
-  } else {
-    return "library lib${uri.path.replaceAll('/', '.')};";
-  }
-}
-
-Future<String> provider(Uri uri) {
-  String source;
-  if (uri.scheme == "main") {
-    source = "main() {}";
-  } else if (uri.scheme == "lib") {
-    source = libProvider(uri);
-  } else {
-    throw "unexpected URI $uri";
-  }
-  return new Future.value(source);
-}
-
-void handler(Uri uri, int begin, int end, String message, Diagnostic kind) {
-  if (uri == null) {
-    print('$kind: $message');
-  } else {
-    print('$uri:$begin:$end: $kind: $message');
-  }
-}
-
-main() {
-  asyncStart();
-  Future<CompilationResult> result = compile(new Uri(scheme: 'main'),
-      new Uri(scheme: 'lib', path: '/'), provider, handler);
-  result.then((CompilationResult result) {
-    if (!result.isSuccess) {
-      throw 'Compilation failed';
-    }
-  }, onError: (e, s) {
-    throw 'Compilation failed: $e\n$s';
-  }).then(asyncSuccess);
-}
diff --git a/tests/web_2/internal/mock_libraries.dart b/tests/web_2/internal/mock_libraries.dart
deleted file mode 100644
index 9aa36ad..0000000
--- a/tests/web_2/internal/mock_libraries.dart
+++ /dev/null
@@ -1,417 +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.
-
-// @dart = 2.7
-
-// Library for creating mock versions of platform and internal libraries.
-
-library mock_libraries;
-
-const DEFAULT_PLATFORM_CONFIG = """
-[libraries]
-core:core/core.dart
-async:async/async.dart
-_js_helper:_internal/js_runtime/lib/js_helper.dart
-_interceptors:_internal/js_runtime/lib/interceptors.dart
-_internal:internal/internal.dart
-""";
-
-String buildLibrarySource(Map<String, String> elementMap,
-    [Map<String, String> additionalElementMap = const <String, String>{}]) {
-  Map<String, String> map = new Map<String, String>.from(elementMap);
-  if (additionalElementMap != null) {
-    map.addAll(additionalElementMap);
-  }
-  StringBuffer sb = new StringBuffer();
-  map.values.forEach((String element) {
-    sb.write('$element\n');
-  });
-  return sb.toString();
-}
-
-const Map<String, String> DEFAULT_CORE_LIBRARY = const <String, String>{
-  '<imports>': '''
-import 'dart:_internal' as internal;
-''',
-  'bool': 'class bool {}',
-  'Comparator': 'abstract class Comparator<T> {}',
-  'DateTime': r'''
-      class DateTime {
-        DateTime(year);
-        DateTime.utc(year);
-      }''',
-  'Deprecated': r'''
-      class Deprecated extends Object {
-        final String expires;
-        const Deprecated(this.expires);
-      }''',
-  'deprecated': 'const Object deprecated = const Deprecated("next release");',
-  'double': r'''
-      abstract class double extends num {
-        static var nan = 0;
-        static parse(s) {}
-      }''',
-  'Function': r'''
-      class Function {
-        static apply(Function fn, List positional, [Map named]) => null;
-      }''',
-  'identical': 'bool identical(Object a, Object b) { return true; }',
-  'int': 'abstract class int extends num { }',
-  'Iterable': '''
-      abstract class Iterable<E> {
-          Iterator<E> get iterator => null;
-      }''',
-  'Iterator': '''
-      abstract class Iterator<E> {
-          E get current => null;
-      }''',
-  'LinkedHashMap': r'''
-      class LinkedHashMap<K, V> implements Map<K, V> {
-      }''',
-  'List': r'''
-      class List<E> extends Iterable<E> {
-        var length;
-        List([length]);
-        List.filled(length, element);
-        E get first => null;
-        E get last => null;
-        E get single => null;
-        E removeLast() => null;
-        E removeAt(i) => null;
-        E elementAt(i) => null;
-        E singleWhere(f) => null;
-      }''',
-  'Map': 'abstract class Map<K,V> {}',
-  'Null': 'class Null {}',
-  'num': r'''
-      abstract class num {
-        operator +(_);
-        operator *(_);
-        operator -();
-      }''',
-  'print': 'print(var obj) {}',
-  'proxy': 'const proxy = 0;',
-  'Object': r'''
-      class Object {
-        const Object();
-        operator ==(other) { return true; }
-        get hashCode => throw "Object.hashCode not implemented.";
-        String toString() { return null; }
-        noSuchMethod(im) { throw im; }
-      }''',
-  'StackTrace': 'abstract class StackTrace {}',
-  'String': 'class String implements Pattern {}',
-  'Symbol': '''
-      abstract class Symbol {
-        const factory Symbol(String name) = internal.Symbol;
-      }
-      ''',
-  'Type': 'class Type {}',
-  'Pattern': 'abstract class Pattern {}',
-  '_genericNoSuchMethod': '_genericNoSuchMethod(a,b,c,d,e) {}',
-  '_unresolvedConstructorError': '_unresolvedConstructorError(a,b,c,d,e) {}',
-  '_malformedTypeError': '_malformedTypeError(message) {}',
-};
-
-const Map<String, String> DEFAULT_INTERNAL_LIBRARY = const <String, String>{
-  '<imports>': '''
-import 'dart:core' as core;
-''',
-  'Symbol': '''
-class Symbol implements core.Symbol {
-  final core.String _name;
-
-  const Symbol(this._name);
-  Symbol.validated(this._name);
-}
-''',
-};
-
-const String DEFAULT_PATCH_CORE_SOURCE = r'''
-import 'dart:_js_helper';
-import 'dart:_interceptors';
-import 'dart:async';
-
-@patch
-class LinkedHashMap<K, V> {
-  factory LinkedHashMap._empty() => null;
-  factory LinkedHashMap._literal(elements) => null;
-  static _makeEmpty() => null;
-  static _makeLiteral(elements) => null;
-}
-''';
-
-const Map<String, String> DEFAULT_JS_HELPER_LIBRARY = const <String, String>{
-  'assertTest': 'assertTest(a) {}',
-  'assertThrow': 'assertThrow(a) {}',
-  'assertHelper': 'assertHelper(a) {}',
-  'assertUnreachable': 'assertUnreachable() {}',
-  'assertSubtype': 'assertSubtype(object, isField, checks, asField) {}',
-  'asyncHelper': 'asyncHelper(object, asyncBody, completer) {}',
-  'boolConversionCheck': 'boolConversionCheck(x) {}',
-  'checkSubtype': 'checkSubtype(object, isField, checks, asField) {}',
-  'BoundClosure': r'''abstract class BoundClosure extends Closure {
-    var self;
-    var target;
-    var receiver;
-  }''',
-  'buildFunctionType': r'''buildFunctionType(returnType, parameterTypes,
-                            optionalParameterTypes) {
-            return new RuntimeFunctionType();
-          }''',
-  'buildInterfaceType': '''buildInterfaceType(rti, typeArguments) {
-                             if (rti == null) return new RuntimeTypePlain();
-                             return new RuntimeTypeGeneric();
-                           }''',
-  'buildNamedFunctionType':
-      r'''buildNamedFunctionType(returnType, parameterTypes,
-                                 namedParameters) {
-            return new RuntimeFunctionType();
-          }''',
-  'checkFunctionSubtype':
-      r'''checkFunctionSubtype(var target, String signatureName,
-                               String contextName, var context,
-                               var typeArguments) {}''',
-  'checkMalformedType': 'checkMalformedType(value, message) {}',
-  'checkInt': 'checkInt(value) {}',
-  'checkNum': 'checkNum(value) {}',
-  'checkString': 'checkString(value) {}',
-  'Closure': 'abstract class Closure implements Function { }',
-  'closureFromTearOff':
-      r'''closureFromTearOff(receiver, functions, reflectionInfo,
-                             isStatic, jsArguments, name) {}''',
-  'computeSignature':
-      'computeSignature(var signature, var context, var contextName) {}',
-  'ConstantMap': 'class ConstantMap<K, V> {}',
-  'ConstantProtoMap': 'class ConstantProtoMap<K, V> {}',
-  'ConstantStringMap': 'class ConstantStringMap<K, V> {}',
-  'createInvocationMirror': 'createInvocationMirror(a0, a1, a2, a3, a4, a5) {}',
-  'createRuntimeType': 'createRuntimeType(a) {}',
-  'functionSubtypeCast':
-      r'''functionSubtypeCast(Object object, String signatureName,
-                              String contextName, var context) {}''',
-  'functionTypeTestMetaHelper': r'''
-      functionTypeTestMetaHelper() {
-        buildFunctionType(null, null, null);
-        buildNamedFunctionType(null, null, null);
-        buildInterfaceType(null, null);
-      }''',
-  'getFallThroughError': 'getFallThroughError() {}',
-  'getIsolateAffinityTag': 'getIsolateAffinityTag(_) {}',
-  'getRuntimeTypeArguments':
-      'getRuntimeTypeArguments(target, substitutionName) {}',
-  'getRuntimeTypeInfo': 'getRuntimeTypeInfo(a) {}',
-  'getTraceFromException': 'getTraceFromException(exception) {}',
-  'GeneralConstantMap': 'class GeneralConstantMap {}',
-  'iae': 'iae(x) { throw x; } ioore(x) { throw x; }',
-  'Instantiation1': 'class Instantiation1<T1> extends Closure {}',
-  'Instantiation2': 'class Instantiation2<T1,T2> extends Closure {}',
-  'Instantiation3': 'class Instantiation3<T1,T2,T3> extends Closure {}',
-  'interceptedTypeCast': 'interceptedTypeCast(value, property) {}',
-  'interceptedTypeCheck': 'interceptedTypeCheck(value, property) {}',
-  'isJsIndexable': 'isJsIndexable(a, b) {}',
-  'JavaScriptIndexingBehavior': 'abstract class JavaScriptIndexingBehavior {}',
-  'JSInvocationMirror': r'''
-  class JSInvocationMirror {
-    get typeArguments => null;
-  }''',
-  'makeLiteralMap': 'makeLiteralMap(List keyValuePairs) {}',
-  'Native': 'class Native {}',
-  '_Patch': 'class _Patch { final tag; const _Patch(this.tag); }',
-  'patch': 'const patch = const _Patch(null);',
-  'patch_full': 'const patch_full = const _Patch("full");',
-  'patch_lazy': 'const patch_lazy = const _Patch("lazy");',
-  'patch_startup': 'const patch_startup = const _Patch("startup");',
-  'requiresPreamble': 'requiresPreamble() {}',
-  'RuntimeFunctionType': 'class RuntimeFunctionType {}',
-  'RuntimeTypeGeneric': 'class RuntimeTypeGeneric {}',
-  'RuntimeTypePlain': 'class RuntimeTypePlain {}',
-  'S': 'S() {}',
-  'setRuntimeTypeInfo': 'setRuntimeTypeInfo(a, b) {}',
-  'subtypeOfRuntimeTypeCast': 'subtypeOfRuntimeTypeCast(object, type) {}',
-  'checkConcurrentModificationError':
-      'checkConcurrentModificationError(collection) {}',
-  'throwConcurrentModificationError':
-      'throwConcurrentModificationError(collection) {}',
-  'throwCyclicInit': 'throwCyclicInit(staticName) {}',
-  'throwExpression': 'throwExpression(e) {}',
-  'throwNoSuchMethod':
-      'throwNoSuchMethod(obj, name, arguments, expectedArgumentNames) {}',
-  'throwUnsupportedError': 'throwUnsupportedError(message) {}',
-  'unwrapException': 'unwrapException(e) {}',
-  'voidTypeCheck': 'voidTypeCheck(value) {}',
-  'wrapException': 'wrapException(x) { return x; }',
-  'badMain': 'badMain() { throw "bad main"; }',
-  'missingMain': 'missingMain() { throw "missing main"; }',
-  'mainHasTooManyParameters': 'mainHasTooManyParameters() '
-      '{ throw "main has too many parameters"; }',
-};
-
-const Map<String, String> DEFAULT_FOREIGN_HELPER_LIBRARY =
-    const <String, String>{
-  'JS': r'''
-      dynamic JS(String typeDescription, String codeTemplate,
-        [var arg0, var arg1, var arg2, var arg3, var arg4, var arg5, var arg6,
-         var arg7, var arg8, var arg9, var arg10, var arg11]) {}''',
-};
-
-const Map<String, String> DEFAULT_INTERCEPTORS_LIBRARY = const <String, String>{
-  'findIndexForNativeSubclassType': 'findIndexForNativeSubclassType(type) {}',
-  'getDispatchProperty': 'getDispatchProperty(o) {}',
-  'getInterceptor': 'getInterceptor(x) {}',
-  'getNativeInterceptor': 'getNativeInterceptor(x) {}',
-  'initializeDispatchProperty': 'initializeDispatchProperty(f,p,i) {}',
-  'initializeDispatchPropertyCSP': 'initializeDispatchPropertyCSP(f,p,i) {}',
-  'Interceptor': r'''
-      class Interceptor {
-        toString() {}
-        bool operator==(other) => identical(this, other);
-        get hashCode => throw "Interceptor.hashCode not implemented.";
-        noSuchMethod(im) { throw im; }
-      }''',
-  'JSArray': r'''
-          class JSArray<E> extends Interceptor implements List<E>, JSIndexable {
-            JSArray();
-            factory JSArray.typed(a) => a;
-            var length;
-            operator[](index) => this[index];
-            operator[]=(index, value) { this[index] = value; }
-            add(value) { this[length] = value; }
-            insert(index, value) {}
-            E get first => this[0];
-            E get last => this[0];
-            E get single => this[0];
-            E removeLast() => this[0];
-            E removeAt(index) => this[0];
-            E elementAt(index) => this[0];
-            E singleWhere(f) => this[0];
-            Iterator<E> get iterator => null;
-          }''',
-  'JSBool': 'class JSBool extends Interceptor implements bool {}',
-  'JSDouble': 'class JSDouble extends JSNumber implements double {}',
-  'JSExtendableArray': 'class JSExtendableArray extends JSMutableArray {}',
-  'JSFixedArray': 'class JSFixedArray extends JSMutableArray {}',
-  'JSFunction':
-      'abstract class JSFunction extends Interceptor implements Function {}',
-  'JSIndexable': r'''
-      abstract class JSIndexable {
-        get length;
-        operator[](index);
-      }''',
-  'JSInt': r'''
-       class JSInt extends JSNumber implements int {
-         operator~() => this;
-       }''',
-  'JSMutableArray':
-      'class JSMutableArray extends JSArray implements JSMutableIndexable {}',
-  'JSUnmodifiableArray': 'class JSUnmodifiableArray extends JSArray {}',
-  'JSMutableIndexable':
-      'abstract class JSMutableIndexable extends JSIndexable {}',
-  'JSPositiveInt': 'class JSPositiveInt extends JSInt {}',
-  'JSNull': r'''
-      class JSNull extends Interceptor {
-        bool operator==(other) => identical(null, other);
-        get hashCode => throw "JSNull.hashCode not implemented.";
-        String toString() => 'Null';
-        Type get runtimeType => null;
-        noSuchMethod(x) => super.noSuchMethod(x);
-      }''',
-  'JSNumber': r'''
-      class JSNumber extends Interceptor implements num {
-        // All these methods return a number to please type inferencing.
-        operator-() => (this is JSInt) ? 42 : 42.2;
-        operator +(other) => (this is JSInt) ? 42 : 42.2;
-        operator -(other) => (this is JSInt) ? 42 : 42.2;
-        operator ~/(other) => _tdivFast(other);
-        operator /(other) => (this is JSInt) ? 42 : 42.2;
-        operator *(other) => (this is JSInt) ? 42 : 42.2;
-        operator %(other) => (this is JSInt) ? 42 : 42.2;
-        operator <<(other) => _shlPositive(other);
-        operator >>(other) {
-          return _shrBothPositive(other) + _shrReceiverPositive(other) +
-            _shrOtherPositive(other);
-        }
-        operator |(other) => 42;
-        operator &(other) => 42;
-        operator ^(other) => 42;
-
-        operator >(other) => !identical(this, other);
-        operator >=(other) => !identical(this, other);
-        operator <(other) => !identical(this, other);
-        operator <=(other) => !identical(this, other);
-        operator ==(other) => identical(this, other);
-        get hashCode => throw "JSNumber.hashCode not implemented.";
-
-        // We force side effects on _tdivFast to mimic the shortcomings of
-        // the effect analysis: because the `_tdivFast` implementation of
-        // the core library has calls that may not already be analyzed,
-        // the analysis will conclude that `_tdivFast` may have side
-        // effects.
-        _tdivFast(other) => new List()..length = 42;
-        _shlPositive(other) => 42;
-        _shrBothPositive(other) => 42;
-        _shrReceiverPositive(other) => 42;
-        _shrOtherPositive(other) => 42;
-
-        abs() => (this is JSInt) ? 42 : 42.2;
-        remainder(other) => (this is JSInt) ? 42 : 42.2;
-        truncate() => 42;
-      }''',
-  'JSString': r'''
-      class JSString extends Interceptor implements String, JSIndexable {
-        split(pattern) => [];
-        int get length => 42;
-        operator[](index) {}
-        toString() {}
-        operator+(other) => this;
-        codeUnitAt(index) => 42;
-      }''',
-  'JSUInt31': 'class JSUInt31 extends JSUInt32 {}',
-  'JSUInt32': 'class JSUInt32 extends JSPositiveInt {}',
-  'ObjectInterceptor': 'class ObjectInterceptor {}',
-  'JavaScriptObject': 'class JavaScriptObject {}',
-  'PlainJavaScriptObject': 'class PlainJavaScriptObject {}',
-  'UnknownJavaScriptObject': 'class UnknownJavaScriptObject {}',
-  'JavaScriptFunction': 'class JavaScriptFunction {}',
-};
-
-const Map<String, String> DEFAULT_ASYNC_LIBRARY = const <String, String>{
-  'DeferredLibrary': 'class DeferredLibrary {}',
-  'Future': '''
-      class Future<T> {
-        Future.value([value]);
-      }
-      ''',
-  'Stream': 'class Stream<T> {}',
-  'Completer': 'class Completer<T> {}',
-  'StreamIterator': 'class StreamIterator<T> {}',
-};
-
-/// These members are only needed when async/await is used.
-const Map<String, String> ASYNC_AWAIT_LIBRARY = const <String, String>{
-  '_wrapJsFunctionForAsync': '_wrapJsFunctionForAsync(f) {}',
-  '_asyncHelper': '_asyncHelper(o, f, c) {}',
-  '_SyncStarIterable': 'class _SyncStarIterable {}',
-  '_IterationMarker': 'class _IterationMarker {}',
-  '_AsyncStarStreamController': 'class _AsyncStarStreamController {}',
-  '_asyncStarHelper': '_asyncStarHelper(x, y, z) {}',
-  '_streamOfController': '_streamOfController(x) {}',
-};
-
-const String DEFAULT_MIRRORS_SOURCE = r'''
-import 'dart:_js_mirrors' as js;
-class Comment {}
-class MirrorSystem {}
-class MirrorsUsed {
-  final targets;
-  const MirrorsUsed({this.targets});
-}
-void reflectType(Type t) => js.disableTreeShaking();
-''';
-
-const String DEFAULT_JS_MIRRORS_SOURCE = r'''
-disableTreeShaking(){}
-preserveMetadata(){}
-preserveLibraryNames(){}
-''';
diff --git a/tools/VERSION b/tools/VERSION
index e37b1dd..f44f6d8 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -25,7 +25,7 @@
 #
 CHANNEL beta
 MAJOR 2
-MINOR 15
+MINOR 16
 PATCH 0
-PRERELEASE 268
-PRERELEASE_PATCH 18
\ No newline at end of file
+PRERELEASE 80
+PRERELEASE_PATCH 1
\ No newline at end of file
diff --git a/tools/bots/bot_utils.py b/tools/bots/bot_utils.py
index 5bd718b..58f136d 100755
--- a/tools/bots/bot_utils.py
+++ b/tools/bots/bot_utils.py
@@ -227,7 +227,6 @@
                local_path,
                remote_path,
                recursive=False,
-               public=False,
                multithread=False):
         assert remote_path.startswith('gs://')
 
@@ -235,8 +234,6 @@
             args = ['-m', 'cp']
         else:
             args = ['cp']
-        if public:
-            args += ['-a', 'public-read']
         if recursive:
             args += ['-R']
         args += [local_path, remote_path]
diff --git a/tools/bots/dart_sdk.py b/tools/bots/dart_sdk.py
index 0451f7b..d14f3ce 100755
--- a/tools/bots/dart_sdk.py
+++ b/tools/bots/dart_sdk.py
@@ -117,7 +117,6 @@
         dir_name,
         dartdocs_destination_gcsdir,
         recursive=True,
-        public=True,
         multithread=True)
 
 
@@ -185,7 +184,7 @@
 
 def DartArchiveFile(local_path, remote_path, checksum_files=False):
     gsutil = bot_utils.GSUtil()
-    gsutil.upload(local_path, remote_path, public=True)
+    gsutil.upload(local_path, remote_path)
     if checksum_files:
         # 'local_path' may have a different filename than 'remote_path'. So we need
         # to make sure the *.md5sum file contains the correct name.
@@ -194,10 +193,10 @@
         mangled_filename = remote_path[remote_path.rfind('/') + 1:]
         local_md5sum = bot_utils.CreateMD5ChecksumFile(local_path,
                                                        mangled_filename)
-        gsutil.upload(local_md5sum, remote_path + '.md5sum', public=True)
+        gsutil.upload(local_md5sum, remote_path + '.md5sum')
         local_sha256 = bot_utils.CreateSha256ChecksumFile(
             local_path, mangled_filename)
-        gsutil.upload(local_sha256, remote_path + '.sha256sum', public=True)
+        gsutil.upload(local_sha256, remote_path + '.sha256sum')
 
 
 def Run(command, env=None):
diff --git a/tools/bots/flutter/analyze_flutter_flutter.sh b/tools/bots/flutter/analyze_flutter_flutter.sh
index d040021..cd50561 100755
--- a/tools/bots/flutter/analyze_flutter_flutter.sh
+++ b/tools/bots/flutter/analyze_flutter_flutter.sh
@@ -36,9 +36,7 @@
 $dart --enable-asserts dev/bots/analyze.dart --dart-sdk $sdk
 
 # Test flutter's use of data-driven fixes.
-pushd packages/flutter/test_fixes
-../../../bin/dart fix --compare-to-golden
-popd
+$dart fix packages/flutter/test_fixes --compare-to-golden
 
 # Analyze the sample code in dartdoc snippets.
-./bin/dart dev/bots/analyze_sample_code.dart
+$dart dev/bots/analyze_sample_code.dart
diff --git a/tools/bots/get_builder_status.dart b/tools/bots/get_builder_status.dart
index d66167f..6abf4ef 100755
--- a/tools/bots/get_builder_status.dart
+++ b/tools/bots/get_builder_status.dart
@@ -8,8 +8,6 @@
 // These cloud functions write a success/failure result to the
 // builder table based on the approvals in Firestore.
 
-// @dart = 2.9
-
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
@@ -20,27 +18,26 @@
 const numAttempts = 20;
 const failuresPerConfiguration = 20;
 
-/*late*/ bool useStagingDatabase;
+late bool useStagingDatabase;
 
 Uri get _queryUrl {
-  var project = useStagingDatabase ? 'dart-ci-staging' : 'dart-ci';
+  final project = useStagingDatabase ? 'dart-ci-staging' : 'dart-ci';
   return Uri.https('firestore.googleapis.com',
       '/v1/projects/$project/databases/(default)/documents:runQuery');
 }
 
-/*late*/ String builder;
-/*late*/ String builderBase;
-/*late*/ int buildNumber;
-/*late*/ String token;
-/*late*/ http.Client client;
+late String builder;
+late String builderBase;
+late int buildNumber;
+late String token;
+late http.Client client;
 
 String get buildTable => builder.endsWith('-try') ? 'try_builds' : 'builds';
 String get resultsTable => builder.endsWith('-try') ? 'try_results' : 'results';
 
 bool booleanFieldOrFalse(Map<String, dynamic> document, String field) {
-  Map<String, dynamic> fieldObject = document['fields'][field];
-  if (fieldObject == null) return false;
-  return fieldObject['booleanValue'] ?? false;
+  final fieldObject = document['fields'][field];
+  return fieldObject?['booleanValue'] ?? false;
 }
 
 void usage(ArgParser parser) {
@@ -56,12 +53,12 @@
 }
 
 Future<String> readGcloudAuthToken(String path) async {
-  String token = await File(path).readAsString();
-  return token.split("\n").first;
+  final token = await File(path).readAsString();
+  return token.split('\n').first;
 }
 
-main(List<String> args) async {
-  final parser = new ArgParser();
+void main(List<String> args) async {
+  final parser = ArgParser();
   parser.addFlag('help', help: 'Show the program usage.', negatable: false);
   parser.addOption('auth_token',
       abbr: 'a', help: 'Authorization token with cloud-platform scope');
@@ -75,9 +72,9 @@
     usage(parser);
   }
 
-  useStagingDatabase = options['staging'] /*!*/;
-  builder = options['builder'] /*!*/;
-  buildNumber = int.parse(options['build_number'] /*!*/);
+  useStagingDatabase = options['staging'];
+  builder = options['builder'];
+  buildNumber = int.parse(options['build_number']);
   builderBase = builder.replaceFirst(RegExp('-try\$'), '');
   if (options['auth_token'] == null) {
     print('Option "--auth_token (-a)" is required\n');
@@ -85,83 +82,60 @@
   }
   token = await readGcloudAuthToken(options['auth_token']);
   client = http.Client();
-  for (int count = 0; count < numAttempts; ++count) {
-    if (count > 0) {
-      await Future.delayed(Duration(seconds: 10));
-    }
-    final response = await runFirestoreQuery(buildQuery());
-    if (response.statusCode == HttpStatus.ok) {
-      final documents = jsonDecode(response.body);
-      final document = documents.first['document'];
-      if (document != null) {
-        bool success = booleanFieldOrFalse(document, 'success');
-        bool completed = booleanFieldOrFalse(document, 'completed');
-        if (completed) {
-          print(success
-              ? 'No new unapproved failures'
-              : 'There are new unapproved failures on this build');
-          if (builder.endsWith('-try')) exit(success ? 0 : 1);
-          final configurations = await getConfigurations();
-          final failures = await fetchActiveFailures(configurations);
-          if (failures.isNotEmpty) {
-            print('There are unapproved failures');
-            printActiveFailures(failures);
-            exit(1);
-          } else {
-            print('There are no unapproved failures');
-            exit(0);
-          }
-        }
-        String chunks =
-            (document['fields']['num_chunks'] ?? const {})['integerValue'];
-        String processedChunks = (document['fields']['processed_chunks'] ??
-            const {})['integerValue'];
-        if (processedChunks != null) {
-          print([
-            'Received',
-            processedChunks,
-            if (chunks != null) ...['out of', chunks],
-            'chunks.'
-          ].join(' '));
-        }
-      } else {
-        print('No results received for build $buildNumber of $builder');
-      }
-    } else {
-      print('HTTP status ${response.statusCode} received '
-          'when fetching build data');
-    }
+  final response = await runFirestoreQuery(buildQuery());
+  if (response.statusCode != HttpStatus.ok) {
+    print('HTTP status ${response.statusCode} received '
+        'when fetching build data');
+    exit(2);
   }
-  print('No status received for build $buildNumber of $builder '
-      'after $numAttempts attempts, with 10 second waits.');
-  exit(2);
+  final documents = jsonDecode(response.body);
+  final document = documents.first['document'];
+  if (document == null) {
+    print('No results received for build $buildNumber of $builder');
+    exit(2);
+  }
+  final success = booleanFieldOrFalse(document, 'success');
+  print(success
+      ? 'No new unapproved failures'
+      : 'There are new unapproved failures on this build');
+  if (builder.endsWith('-try')) exit(success ? 0 : 1);
+  final configurations = await getConfigurations();
+  final failures = await fetchActiveFailures(configurations);
+  if (failures.isNotEmpty) {
+    print('There are unapproved failures');
+    printActiveFailures(failures);
+    exit(1);
+  } else {
+    print('There are no unapproved failures');
+    exit(0);
+  }
 }
 
 Future<List<String>> getConfigurations() async {
   final response = await runFirestoreQuery(configurationsQuery());
-  if (response.statusCode == HttpStatus.ok) {
-    final documents = jsonDecode(response.body);
-    final groups = <String /*!*/ >{
-      for (Map document in documents)
-        if (document.containsKey('document'))
-          document['document']['name'].split('/').last
-    };
-    return groups.toList();
+  if (response.statusCode != HttpStatus.ok) {
+    print('Could not fetch configurations for $builderBase');
+    return [];
   }
-  print('Could not fetch configurations for $builderBase');
-  return [];
+  final documents = jsonDecode(response.body);
+  final groups = <String>{
+    for (Map document in documents)
+      if (document.containsKey('document'))
+        document['document']['name'].split('/').last
+  };
+  return groups.toList();
 }
 
 Map<int, Future<String>> commitHashes = {};
 Future<String> commitHash(int index) =>
     commitHashes.putIfAbsent(index, () => fetchCommitHash(index));
 
-Future<String /*!*/ > fetchCommitHash(int index) async {
+Future<String> fetchCommitHash(int index) async {
   final response = await runFirestoreQuery(commitQuery(index));
   if (response.statusCode == HttpStatus.ok) {
     final document = jsonDecode(response.body).first['document'];
     if (document != null) {
-      return document['name'] /*!*/ .split('/').last;
+      return document['name'].split('/').last;
     }
   }
   print('Could not fetch commit with index $index');
@@ -169,7 +143,7 @@
 }
 
 Future<Map<String, List<Map<String, dynamic>>>> fetchActiveFailures(
-    List<String /*!*/ > configurations) async {
+    List<String> configurations) async {
   final failures = <String, List<Map<String, dynamic>>>{};
   for (final configuration in configurations) {
     final response =
@@ -197,9 +171,9 @@
 }
 
 void printActiveFailures(Map<String, List<Map<String, dynamic>>> failures) {
-  for (final configuration in failures.keys) {
+  failures.forEach((configuration, failureList) {
     print('($configuration):');
-    for (final failure in failures[configuration]) {
+    for (final failure in failureList) {
       print([
         '    ',
         failure['name'],
@@ -217,7 +191,7 @@
         ]
       ].join(''));
     }
-  }
+  });
 }
 
 Future<http.Response> runFirestoreQuery(String query) {
diff --git a/tools/bots/post_results_to_pubsub.dart b/tools/bots/post_results_to_pubsub.dart
deleted file mode 100644
index 774dec9..0000000
--- a/tools/bots/post_results_to_pubsub.dart
+++ /dev/null
@@ -1,125 +0,0 @@
-// 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.
-
-// Post results from Dart tryjobs and CI builders to Cloud Pub/Sub.
-//
-// Reads a results.json input file, sends only the changed results from
-// that file to the Pub/Sub channel 'results' in the 'dart-ci' project.
-// Multiple messages are sent if there are more than 100 changed results,
-// so the cloud function only needs to process 100 records within its time
-// limit of 60s. Because of this, we never approach the limit of 10 MB
-// base64-encoded data bytes per message.
-
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:args/args.dart';
-import 'package:http/http.dart' as http;
-
-void usage(ArgParser parser, {exitCode = 0}) {
-  print('''
-Usage: post_results_to_pubsub.dart [OPTIONS]
-Posts Dart CI results as messages to Google Cloud Pub/Sub
-
-The options are as follows:
-
-${parser.usage}''');
-  exit(exitCode);
-}
-
-const resultsPerMessage = 50;
-
-Uri _postUrl(String project) => Uri.https(
-    'pubsub.googleapis.com', 'v1/projects/$project/topics/results:publish');
-
-main(List<String> args) async {
-  final parser = new ArgParser();
-  parser.addFlag('help', help: 'Show the program usage.', negatable: false);
-  parser.addOption('auth_token',
-      abbr: 'a',
-      help: 'Authorization token with a scope including pubsub publish.');
-  parser.addOption('result_file',
-      abbr: 'f', help: 'File containing the results to send');
-  parser.addOption('id', abbr: 'i', help: 'Buildbucket ID of this build');
-  parser.addOption('base_revision', help: 'A try build\'s patch base');
-  parser.addFlag('staging',
-      abbr: 's', help: 'Publish to the staging system', defaultsTo: false);
-
-  final options = parser.parse(args);
-  if (options['help']) {
-    usage(parser);
-  }
-
-  if (options['result_file'] == null) {
-    print('Error: option "result_file" is required.\n');
-    usage(parser, exitCode: 1);
-  }
-
-  if (options['auth_token'] == null) {
-    print('Error: option "auth_token" is required.\n');
-    usage(parser, exitCode: 1);
-  }
-
-  final project = options['staging'] ? "dart-ci-staging" : "dart-ci";
-
-  final client = http.Client();
-
-  final lines = await File(options['result_file']).readAsLines();
-  final token = await File(options['auth_token']).readAsString();
-  final buildbucketID = options['id'];
-  final baseRevision = options['base_revision'];
-  if (lines.isEmpty) {
-    print('No results in input file');
-    return;
-  }
-
-  // TODO(karlklose): parse and validate data before sending it.
-
-  final changedPattern = '"changed":true';
-  List<String> changedResults =
-      lines.where((change) => change.contains(changedPattern)).toList();
-  // We need to send at least one result, to save build metadata to Firestore.
-  // Send an unchanged result - the cloud function filters these out.
-  if (changedResults.isEmpty) changedResults = lines.sublist(0, 1);
-
-  final chunks = <List<String>>[];
-  var position = 0;
-  final lastFullChunkStart = changedResults.length - resultsPerMessage;
-  while (position <= lastFullChunkStart) {
-    chunks.add(changedResults.sublist(position, position += resultsPerMessage));
-  }
-  if (position < changedResults.length)
-    chunks.add(changedResults.sublist(position));
-
-  // Send pubsub messages.
-  for (final chunk in chunks) {
-    // Space messages out to reduce scaling problems
-    const chunkDelay = Duration(seconds: 2);
-    if (chunk != chunks.first) {
-      await Future.delayed(chunkDelay);
-    }
-    final message = '[\n${chunk.join(",\n")}\n]';
-    final base64data = base64Encode(utf8.encode(message.toString()));
-    final attributes = {
-      if (chunk == chunks.last) 'num_chunks': chunks.length.toString(),
-      if (buildbucketID != null) 'buildbucket_id': buildbucketID,
-      if (baseRevision != null) 'base_revision': baseRevision,
-    };
-    final jsonMessage = jsonEncode({
-      'messages': [
-        {'attributes': attributes, 'data': base64data}
-      ]
-    });
-    final headers = {'Authorization': 'Bearer $token'};
-    final postUrl = _postUrl(project);
-    final response =
-        await client.post(postUrl, headers: headers, body: jsonMessage);
-
-    print('Sent pubsub message containing ${chunk.length} results');
-    print('Status ${response.statusCode}');
-    print('Response: ${response.body}');
-  }
-  print('Number of Pub/Sub messages sent: ${chunks.length}');
-  client.close();
-}
diff --git a/tools/bots/pub_integration_test.py b/tools/bots/pub_integration_test.py
index 371ed1a..f80c554 100755
--- a/tools/bots/pub_integration_test.py
+++ b/tools/bots/pub_integration_test.py
@@ -31,7 +31,7 @@
 
     (options, args) = parser.parse_args()
 
-    arch = 'XARM64' if options.arch == 'arm64' else 'X64'
+    arch = 'ARM64' if options.arch == 'arm64' else 'X64'
     mode = ('Debug' if options.mode == 'debug' else 'Release')
 
     out_dir = 'xcodebuild' if sys.platform == 'darwin' else 'out'
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index a960fa8..c060e70 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -424,6 +424,17 @@
         "use-sdk": true
       }
     },
+    "web-unittest-asserts-legacy-(linux|mac|win)": {
+      "options": {
+        "builder-tag": "web-legacy",
+        "compiler": "dartk",
+        "enable-asserts": true,
+        "mode": "release",
+        "runtime": "vm",
+        "timeout": 240,
+        "use-sdk": true
+      }
+    },
     "unittest-asserts-(debug|product|release)-(linux|mac|win)": {
       "options": {
         "compiler": "dartk",
@@ -826,21 +837,6 @@
         "vm-options": []
       }
     },
-    "dartkp-no-bare-(linux|mac|win)-(debug|product|release)-(x64|x64c)": {
-      "options": {
-        "vm-options": [
-          "--no-use-bare-instructions"
-        ]
-      }
-    },
-    "dartkp-no-bare-(linux|mac|win)-(debug|product|release)-(simarm|simarm64|simarm64c)": {
-      "options": {
-        "vm-options": [
-          "--no-use-bare-instructions"
-        ],
-        "use-elf": true
-      }
-    },
     "dartk-(linux|mac|win)-(debug|product|release)-(ia32|x64|x64c)": {},
     "dartk-fuchsia-(debug|product|release)-(x64|x64c)": {},
     "dartk-linux-debug-(ia32|x64)-canary": {
@@ -1548,36 +1544,6 @@
     },
     {
       "builders": [
-        "vm-kernel-precomp-bare-linux-release-x64",
-        "vm-kernel-precomp-bare-linux-release-x64c",
-        "vm-kernel-precomp-bare-linux-release-simarm",
-        "vm-kernel-precomp-bare-linux-release-simarm64",
-        "vm-kernel-precomp-bare-linux-release-simarm64c"
-      ],
-      "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",
-            "dart_precompiled_runtime"
-          ]
-        },
-        {
-          "name": "vm tests",
-          "arguments": [
-            "-ndartkp-no-bare-${system}-${mode}-${arch}"
-          ],
-          "fileset": "vm-kernel",
-          "shards": 10
-        }
-      ]
-    },
-    {
-      "builders": [
         "vm-kernel-precomp-obfuscate-linux-release-x64",
         "vm-kernel-precomp-obfuscate-linux-release-x64c"
       ],
@@ -2446,6 +2412,17 @@
           ]
         },
         {
+          "name": "dart2js legacy modular tests",
+          "script": "out/ReleaseX64/dart-sdk/bin/dart",
+          "testRunner": true,
+          "arguments": [
+            "pkg/compiler/tool/modular_test_suite_legacy.dart",
+            "-nweb-unittest-asserts-legacy-linux",
+            "--verbose",
+            "--use-sdk"
+          ]
+        },
+        {
           "name": "dart2js modular tests",
           "script": "out/ReleaseX64/dart-sdk/bin/dart",
           "testRunner": true,
diff --git a/tools/bots/try_benchmarks.sh b/tools/bots/try_benchmarks.sh
index 75f7375..2fb96f0 100755
--- a/tools/bots/try_benchmarks.sh
+++ b/tools/bots/try_benchmarks.sh
@@ -184,8 +184,12 @@
     out/ReleaseIA32/run_vm_tests --dfe=out/ReleaseIA32/kernel-service.dart.snapshot --sound-null-safety UseDartApi
     out/ReleaseIA32/dart --profile-period=10000 --packages=.packages benchmarks/Example/dart2/Example.dart
     out/ReleaseIA32/dart --sound-null-safety --profile-period=10000 --packages=.packages benchmarks/Example/dart/Example.dart
+    out/ReleaseIA32/dart benchmarks/NativeCall/dart2/NativeCall.dart
+    out/ReleaseIA32/dart --sound-null-safety benchmarks/NativeCall/dart/NativeCall.dart
     out/ReleaseIA32/dart benchmarks/FfiBoringssl/dart2/FfiBoringssl.dart
     out/ReleaseIA32/dart --sound-null-safety benchmarks/FfiBoringssl/dart/FfiBoringssl.dart
+    out/ReleaseIA32/dart benchmarks/FfiAsTypedList/dart2/FfiAsTypedList.dart
+    out/ReleaseIA32/dart --sound-null-safety benchmarks/FfiAsTypedList/dart/FfiAsTypedList.dart
     out/ReleaseIA32/dart benchmarks/FfiCall/dart2/FfiCall.dart
     out/ReleaseIA32/dart --sound-null-safety benchmarks/FfiCall/dart/FfiCall.dart
     out/ReleaseIA32/dart benchmarks/FfiMemory/dart2/FfiMemory.dart
diff --git a/tools/dom/docs/docs.json b/tools/dom/docs.json
similarity index 99%
rename from tools/dom/docs/docs.json
rename to tools/dom/docs.json
index 83d7a05..e1a453b 100644
--- a/tools/dom/docs/docs.json
+++ b/tools/dom/docs.json
@@ -2504,7 +2504,9 @@
         ],
         "insertBefore": [
           "/**",
-          "   * Inserts all of the nodes into this node directly before refChild.",
+          "   * Inserts the given node into this node directly before child.",
+          "   * If child is `null`, then the given node is inserted at the end",
+          "   * of this node's child nodes.",
           "   *",
           "   * ## Other resources",
           "   *",
diff --git a/tools/dom/docs/bin/docs.dart b/tools/dom/docs/bin/docs.dart
deleted file mode 100644
index 147401f..0000000
--- a/tools/dom/docs/bin/docs.dart
+++ /dev/null
@@ -1,27 +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 program reads the HTML libraries from [LIB_PATH] and outputs their
- * documentation to [JSON_PATH].
- */
-
-import 'dart:io';
-import 'dart:async';
-
-import 'package:path/path.dart' as path;
-
-import '../lib/docs.dart';
-
-final String json_path = Platform.script.resolve('../docs.json').toFilePath();
-final String lib_uri = Platform.script.resolve('../../../../sdk').toString();
-
-main() {
-  print('Converting HTML docs from $lib_uri to $json_path.');
-
-  convert(lib_uri, json_path).then((bool anyErrors) {
-    print('Converted HTML docs ${anyErrors ? "with": "without"}'
-        ' errors.');
-  });
-}
diff --git a/tools/dom/docs/docs.status b/tools/dom/docs/docs.status
deleted file mode 100644
index a502066..0000000
--- a/tools/dom/docs/docs.status
+++ /dev/null
@@ -1,7 +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.
-
-# docs.dart is a tool that only runs on the VM
-[ $compiler == dart2js ]
-*: Skip
diff --git a/tools/dom/docs/lib/docs.dart b/tools/dom/docs/lib/docs.dart
deleted file mode 100644
index ed9ecc6..0000000
--- a/tools/dom/docs/lib/docs.dart
+++ /dev/null
@@ -1,197 +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.
-
-/**
- * A library for extracting the documentation from the various HTML libraries
- * ([dart:html], [dart:svg], [dart:web_audio], [dart:indexed_db]) and saving
- * those documentation comments to a JSON file.
- */
-
-library docs;
-
-import '../../../../sdk/lib/_internal/dartdoc/lib/src/dart2js_mirrors.dart';
-import '../../../../pkg/compiler/lib/src/mirrors/source_mirrors.dart';
-import '../../../../pkg/compiler/lib/src/mirrors/mirrors_util.dart';
-import '../../../../sdk/lib/_internal/dartdoc/lib/dartdoc.dart';
-import '../../../../sdk/lib/_internal/dartdoc/lib/src/json_serializer.dart';
-import '../../../../utils/apidoc/lib/metadata.dart';
-import 'dart:async';
-import 'dart:io';
-
-/// The various HTML libraries.
-const List<String> HTML_LIBRARY_NAMES = const [
-  'dart:html',
-  'dart:indexed_db',
-  'dart:svg',
-  'dart:web_audio',
-  'dart:web_gl',
-  'dart:web_sql'
-];
-/**
- * Converts the libraries in [HTML_LIBRARY_NAMES] to a json file at [jsonPath]
- * given the library path at [libUri].
- *
- * The json output looks like:
- *     {
- *       $library_name: {
- *         $interface_name: {
- *           comment: "$comment"
- *           members: {
- *             $member: [
- *               [$comment1line1,
- *                $comment1line2,
- *                ...],
- *               ...
- *             ],
- *             ...
- *           }
- *         },
- *         ...
- *       },
- *       ...
- *     }
- *
- * Completes to true if any errors were encountered, false otherwise.
- */
-Future<bool> convert(String libUri, String jsonPath) {
-  var paths = <String>[];
-  for (var libraryName in HTML_LIBRARY_NAMES) {
-    paths.add(libraryName);
-  }
-
-  return analyze(paths, libUri, options: ['--preserve-comments'])
-      .then((MirrorSystem mirrors) {
-    var convertedJson = _generateJsonFromLibraries(mirrors);
-    return _exportJsonToFile(convertedJson, jsonPath);
-  });
-}
-
-Future<bool> _exportJsonToFile(Map convertedJson, String jsonPath) {
-  return new Future.sync(() {
-    final jsonFile = new File(jsonPath);
-    var writeJson = prettySerialize(convertedJson);
-
-    var outputStream = jsonFile.openWrite();
-    outputStream.writeln(writeJson);
-    outputStream.close();
-    return outputStream.done.then((_) => false);
-  });
-}
-
-Map _generateJsonFromLibraries(MirrorSystem mirrors) {
-  var convertedJson = {};
-
-  // Sort the libraries by name (not key).
-  var sortedLibraries = new List<LibraryMirror>.from(mirrors.libraries.values
-      .where((e) => HTML_LIBRARY_NAMES.indexOf(e.uri.toString()) >= 0))
-    ..sort((x, y) => x.uri
-        .toString()
-        .toUpperCase()
-        .compareTo(y.uri.toString().toUpperCase()));
-
-  for (LibraryMirror libMirror in sortedLibraries) {
-    print('Extracting documentation from ${libMirror.simpleName}.');
-
-    var libraryJson = {};
-    var sortedClasses = _sortAndFilterMirrors(
-        classesOf(libMirror.declarations).toList(),
-        ignoreDocsEditable: true);
-
-    for (ClassMirror classMirror in sortedClasses) {
-      print(' class: $classMirror');
-      var classJson = {};
-      var sortedMembers =
-          _sortAndFilterMirrors(membersOf(classMirror.declarations).toList());
-
-      var membersJson = {};
-      for (var memberMirror in sortedMembers) {
-        print('  member: $memberMirror');
-        var memberDomName = domNames(memberMirror)[0];
-        var memberComment = _splitCommentsByNewline(
-            computeUntrimmedCommentAsList(memberMirror));
-
-        // Remove interface name from Dom Name.
-        if (memberDomName.indexOf('.') >= 0) {
-          memberDomName =
-              memberDomName.substring(memberDomName.indexOf('.') + 1);
-        }
-
-        if (!memberComment.isEmpty) {
-          membersJson.putIfAbsent(memberDomName, () => memberComment);
-        }
-      }
-
-      // Only include the comment if DocsEditable is set.
-      var classComment =
-          _splitCommentsByNewline(computeUntrimmedCommentAsList(classMirror));
-      if (!classComment.isEmpty &&
-          findMetadata(classMirror.metadata, 'DocsEditable') != null) {
-        classJson.putIfAbsent('comment', () => classComment);
-      }
-      if (!membersJson.isEmpty) {
-        classJson.putIfAbsent('members', () => membersJson);
-      }
-
-      if (!classJson.isEmpty) {
-        libraryJson.putIfAbsent(domNames(classMirror)[0], () => classJson);
-      }
-    }
-
-    if (!libraryJson.isEmpty) {
-      convertedJson.putIfAbsent(nameOf(libMirror), () => libraryJson);
-    }
-  }
-
-  return convertedJson;
-}
-
-/// Filter out mirrors that are private, or which are not part of this docs
-/// process. That is, ones without the DocsEditable annotation.
-/// If [ignoreDocsEditable] is true, relax the restriction on @DocsEditable().
-/// This is to account for classes that are defined in a template, but whose
-/// members are generated.
-List<DeclarationMirror> _sortAndFilterMirrors(List<DeclarationMirror> mirrors,
-    {ignoreDocsEditable: false}) {
-  var filteredMirrors = mirrors
-      .where((DeclarationMirror c) =>
-          !domNames(c).isEmpty &&
-          !displayName(c).startsWith('_') &&
-          (!ignoreDocsEditable
-              ? (findMetadata(c.metadata, 'DocsEditable') != null)
-              : true))
-      .toList();
-
-  filteredMirrors.sort((x, y) =>
-      domNames(x)[0].toUpperCase().compareTo(domNames(y)[0].toUpperCase()));
-
-  return filteredMirrors;
-}
-
-List<String> _splitCommentsByNewline(List<String> comments) {
-  var out = [];
-
-  comments.forEach((c) {
-    out.addAll(c.split(new RegExp('\n')));
-  });
-
-  return out;
-}
-
-/// Given the class mirror, returns the names found or an empty list.
-List<String> domNames(DeclarationMirror mirror) {
-  var domNameMetadata = findMetadata(mirror.metadata, 'DomName');
-
-  if (domNameMetadata != null) {
-    var domNames = <String>[];
-    var tags = domNameMetadata.getField(#name);
-    for (var s in tags.reflectee.split(',')) {
-      domNames.add(s.trim());
-    }
-
-    if (domNames.length == 1 && domNames[0] == 'none') return <String>[];
-    return domNames;
-  } else {
-    return <String>[];
-  }
-}
diff --git a/tools/dom/docs/test/docs_test.dart b/tools/dom/docs/test/docs_test.dart
deleted file mode 100644
index 015f8e9..0000000
--- a/tools/dom/docs/test/docs_test.dart
+++ /dev/null
@@ -1,60 +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 docs_test;
-
-import 'dart:io';
-
-import 'package:unittest/unittest.dart';
-import 'package:path/path.dart' as path;
-
-import '../bin/docs.dart';
-import '../lib/docs.dart';
-
-final testJsonPath = Platform.script.resolve('test.json').toFilePath();
-
-main() {
-  // Some tests take more than the default 20 second unittest timeout.
-  unittestConfiguration.timeout = null;
-  group('docs', () {
-    var oldJson = new File(json_path);
-    var testJson = new File(testJsonPath);
-
-    tearDown(() {
-      // Clean up.
-      if (testJson.existsSync()) {
-        testJson.deleteSync();
-      }
-      assert(!testJson.existsSync());
-    });
-
-    test('Ensure that docs.json is up to date', () {
-      // We should find a json file where we expect it.
-      expect(oldJson.existsSync(), isTrue);
-
-      // Save the last modified time to check it at the end.
-      var oldJsonModified = oldJson.lastModifiedSync();
-
-      // There should be no test file yet.
-      if (testJson.existsSync()) testJson.deleteSync();
-      assert(!testJson.existsSync());
-
-      expect(
-          convert(lib_uri, testJsonPath).then((bool anyErrors) {
-            expect(anyErrors, isFalse);
-
-            // We should have a file now.
-            expect(testJson.existsSync(), isTrue);
-
-            // Ensure that there's nothing different between the new JSON and old.
-            expect(testJson.readAsStringSync(),
-                equals(oldJson.readAsStringSync()));
-
-            // Ensure that the old JSON file didn't actually change.
-            expect(oldJsonModified, equals(oldJson.lastModifiedSync()));
-          }),
-          completes);
-    });
-  });
-}
diff --git a/tools/dom/dom.py b/tools/dom/dom.py
index f986d3f..9fcdf99 100755
--- a/tools/dom/dom.py
+++ b/tools/dom/dom.py
@@ -64,20 +64,6 @@
     compile_dart2js(argv.pop(0), True)
 
 
-def docs():
-    return call([
-        os.path.join(dart_out_dir, 'dart-sdk', 'bin', 'dart'),
-        '--package-root=%s' % os.path.join(dart_out_dir, 'packages/'),
-        os.path.join('tools', 'dom', 'docs', 'bin', 'docs.dart'),
-    ])
-
-
-def test_docs():
-    return call([
-        os.path.join('tools', 'test.py'), '--mode=release', '--checked', 'docs'
-    ])
-
-
 def compile_dart2js(dart_file, checked):
     out_file = dart_file + '.js'
     dart2js_path = os.path.join(dart_out_dir, 'dart-sdk', 'bin', 'dart2js')
@@ -187,10 +173,8 @@
     'analyze': [analyze, 'Run the dart analyzer'],
     'build': [build, 'Build dart in release mode'],
     'dart2js': [dart2js, 'Run dart2js on the .dart file specified'],
-    'docs': [docs, 'Generates docs.json'],
     'gen': [gen, 'Re-generate DOM generated files (run go.sh)'],
     'size_check': [size_check, 'Check the size of dart2js compiled Swarm'],
-    'test_docs': [test_docs, 'Tests docs.dart'],
     'test_chrome': [
         test_chrome, 'Run tests in checked mode in Chrome.\n'
         '\t\tOptionally provide name of test to run.'
diff --git a/tools/dom/scripts/dartdomgenerator.py b/tools/dom/scripts/dartdomgenerator.py
index 1319e95..dd31046 100755
--- a/tools/dom/scripts/dartdomgenerator.py
+++ b/tools/dom/scripts/dartdomgenerator.py
@@ -124,9 +124,9 @@
     generator.CleanupOperationArguments(webkit_database)
 
     emitters = multiemitter.MultiEmitter(logging_level)
-    metadata = DartMetadata(
-        os.path.join(current_dir, '..', 'dom.json'),
-        os.path.join(current_dir, '..', 'docs', 'docs.json'), logging_level)
+    metadata = DartMetadata(os.path.join(current_dir, '..', 'dom.json'),
+                            os.path.join(current_dir, '..', 'docs.json'),
+                            logging_level)
     renamer = HtmlRenamer(webkit_database, metadata)
     type_registry = TypeRegistry(webkit_database, renamer)
 
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 8ced8e6..046addf 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -756,13 +756,9 @@
   /**
    * Allows access to all custom data attributes (data-*) set on this element.
    *
-   * The keys for the map must follow these rules:
-   *
-   * * The name must not begin with 'xml'.
-   * * The name cannot contain a semi-colon (';').
-   * * The name cannot contain any capital letters.
-   *
-   * Any keys from markup will be converted to camel-cased keys in the map.
+   * Any data attributes in the markup will be converted to camel-cased keys
+   * in the map based on [these conversion
+   * rules](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset).
    *
    * For example, HTML specified as:
    *
@@ -774,6 +770,8 @@
    *
    * See also:
    *
+   * * [HTML data-* attributes naming
+       restrictions](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/data-*)
    * * [Custom data
    *   attributes](http://dev.w3.org/html5/spec-preview/global-attributes.html#custom-data-attribute)
    */
diff --git a/tools/dom/templates/html/impl/impl_Node.darttemplate b/tools/dom/templates/html/impl/impl_Node.darttemplate
index 23092f5..a411fd9 100644
--- a/tools/dom/templates/html/impl/impl_Node.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Node.darttemplate
@@ -220,13 +220,13 @@
   }
 
   /**
-   * Inserts all of the nodes into this node directly before refChild.
+   * Inserts all of the nodes into this node directly before child.
    *
    * See also:
    *
    * * [insertBefore]
    */
-  void insertAllBefore(Iterable<Node> newNodes, Node refChild) {
+  void insertAllBefore(Iterable<Node> newNodes, Node child) {
     if (newNodes is _ChildNodeListLazy) {
       _ChildNodeListLazy otherList = newNodes;
       if (identical(otherList._this, this)) {
@@ -235,11 +235,11 @@
 
       // Optimized route for copying between nodes.
       for (var i = 0, len = otherList.length; i < len; ++i) {
-        this.insertBefore(otherList._this.firstChild$NULLASSERT, refChild);
+        this.insertBefore(otherList._this.firstChild$NULLASSERT, child);
       }
     } else {
       for (var node in newNodes) {
-        this.insertBefore(node, refChild);
+        this.insertBefore(node, child);
       }
     }
   }
diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml
index 971d422..9aa634d 100644
--- a/tools/experimental_features.yaml
+++ b/tools/experimental_features.yaml
@@ -103,7 +103,7 @@
 # default 'language' "category" with code generated for both CFE and Analyzer,
 # while other categories can be tailored more specifically.
 
-current-version: '2.15.0'
+current-version: '2.16.0'
 
 features:
   variance:
diff --git a/tools/generate_package_config.dart b/tools/generate_package_config.dart
index 066eb2c..d6c7b56 100644
--- a/tools/generate_package_config.dart
+++ b/tools/generate_package_config.dart
@@ -56,6 +56,7 @@
     packageDirectory('runtime/observatory_2'),
     packageDirectory(
         'runtime/observatory_2/tests/service_2/observatory_test_package_2'),
+    packageDirectory('pkg/vm_service/test/test_package'),
     packageDirectory('sdk/lib/_internal/sdk_library_metadata'),
     packageDirectory('third_party/devtools/devtools_server'),
     packageDirectory('third_party/devtools/devtools_shared'),
diff --git a/tools/linux_dist_support/upload_debian_packages.py b/tools/linux_dist_support/upload_debian_packages.py
index d2f7151..ab3c911 100755
--- a/tools/linux_dist_support/upload_debian_packages.py
+++ b/tools/linux_dist_support/upload_debian_packages.py
@@ -22,7 +22,7 @@
     remote_tarfile = '/'.join(
         [namer.src_directory(revision),
          os.path.basename(tarfile)])
-    gsutil.upload(tarfile, remote_tarfile, public=True)
+    gsutil.upload(tarfile, remote_tarfile)
     # Archive all files except the tar file to the linux packages dir
     for entry in os.listdir(builddir):
         full_path = os.path.join(builddir, entry)
@@ -31,7 +31,7 @@
         if full_path != tarfile:
             package_dir = namer.linux_packages_directory(revision)
             remote_file = '/'.join([package_dir, os.path.basename(entry)])
-            gsutil.upload(full_path, remote_file, public=True)
+            gsutil.upload(full_path, remote_file)
 
 
 if __name__ == '__main__':
diff --git a/tools/package_deps/bin/package_deps.dart b/tools/package_deps/bin/package_deps.dart
index d0a8abc..38cca34 100644
--- a/tools/package_deps/bin/package_deps.dart
+++ b/tools/package_deps/bin/package_deps.dart
@@ -321,6 +321,7 @@
         // Skip 'pkg/analyzer_cli/test/data'.
         // Skip 'pkg/front_end/test/id_testing/data/'.
         // Skip 'pkg/front_end/test/language_versioning/data/'.
+        // Skip 'pkg/front_end/outline_extraction_testcases/'.
         if (name == 'data' && path.split(entity.parent.path).contains('test')) {
           continue;
         }
@@ -335,6 +336,11 @@
           continue;
         }
 
+        // Skip 'pkg/front_end/outline_extraction_testcases'.
+        if (name == 'outline_extraction_testcases') {
+          continue;
+        }
+
         if (!name.startsWith('.')) {
           _collectDartFiles(entity, files);
         }
diff --git a/tools/promote.py b/tools/promote.py
index 966b735..4d32d19 100755
--- a/tools/promote.py
+++ b/tools/promote.py
@@ -152,30 +152,30 @@
         remove_gs_directory(to_loc)
         has_signed = exists(from_loc)
         if has_signed:
-            Gsutil(['-m', 'cp', '-a', 'public-read', '-R', from_loc, to_loc])
+            Gsutil(['-m', 'cp', '-R', from_loc, to_loc])
             # Because gsutil copies differently to existing directories, we need
             # to use the base directory for the next recursive copy.
             to_loc = release_namer.base_directory(to_revision)
 
         # Copy the unsigned sdk directory without clobbering signed files.
         from_loc = raw_namer.sdk_directory(revision)
-        Gsutil(['-m', 'cp', '-n', '-a', 'public-read', '-R', from_loc, to_loc])
+        Gsutil(['-m', 'cp', '-n', '-R', from_loc, to_loc])
 
         # Copy api-docs zipfile.
         from_loc = raw_namer.apidocs_zipfilepath(revision)
         to_loc = release_namer.apidocs_zipfilepath(to_revision)
-        Gsutil(['-m', 'cp', '-a', 'public-read', from_loc, to_loc])
+        Gsutil(['-m', 'cp', from_loc, to_loc])
 
         # Copy linux deb and src packages.
         from_loc = raw_namer.linux_packages_directory(revision)
         to_loc = release_namer.linux_packages_directory(to_revision)
         remove_gs_directory(to_loc)
-        Gsutil(['-m', 'cp', '-a', 'public-read', '-R', from_loc, to_loc])
+        Gsutil(['-m', 'cp', '-R', from_loc, to_loc])
 
         # Copy VERSION file.
         from_loc = raw_namer.version_filepath(revision)
         to_loc = release_namer.version_filepath(to_revision)
-        Gsutil(['cp', '-a', 'public-read', from_loc, to_loc])
+        Gsutil(['cp', from_loc, to_loc])
 
     promote(revision)
     promote('latest')
diff --git a/tools/verify_docs/README.md b/tools/verify_docs/README.md
index a79aa7c..41be863 100644
--- a/tools/verify_docs/README.md
+++ b/tools/verify_docs/README.md
@@ -1,19 +1,20 @@
-## Whats' this?
+## What’s this?
 
 A tool to validate the documentation comments for the `dart:` libraries.
 
 ## Running the tool
 
-To validate all the dart: libraries, run:
+To validate all the `dart:` libraries, run:
 
 ```
 dart tools/verify_docs/bin/verify_docs.dart
 ```
 
-Or to validate an individual library (async, collection, js_util, ...), run:
+Or to validate an individual library (async, collection, js_util, ...), run either of:
 
 ```
 dart tools/verify_docs/bin/verify_docs.dart sdk/lib/<lib-name>
+dart tools/verify_docs/bin/verify_docs.dart dart:<lib-name>
 ```
 
 The tool should be run from the root of the sdk repository.
@@ -22,68 +23,104 @@
 
 ### What gets analyzed
 
-This tool will walk all dartdoc api docs looking for code samples in doc comments.
+This tool will walk all DartDoc API docs looking for code samples in doc comments.
 It will analyze any code sample in a `dart` code fence. For example:
 
-> ```dart
-> print('hello world!');
-> ```
+> ````dart
+> /// ```dart
+> /// print('hello world!');
+> /// ```
+> ````
 
-By default, an import for that library is added to the sample being analyzed (i.e.,
-`import 'dart:async";`).
+By default, an import for that library is added to the sample being analyzed, e.g., `import 'dart:async";`.
 
 ### Excluding code samples from analysis
 
 In order to exclude a code sample from analysis, change it to a plain code fence style:
 
-> ```
-> print("I'm not analyzed :(");
-> ```
-
-### Specifying additional imports
-
-In order to reference code from other Dart core libraries, you can either explicitly add
-the import to the code sample - in-line in the sample - or use a directive on the same
-line as the code fence. The directive style looks like:
-
-> ```dart import:async
-> print('hello world ${Timer()}');
-> ```
-
-Multiple imports can be specified like this if desired (i.e., "```dart import:async import:convert").
+> ````dart
+> /// ```
+> /// print("I'm not analyzed :(");
+> /// ```
+> ````
 
 ### Specifying templates
 
 The analysis tool can inject the code sample into a template before analyzing the
-sample. This allows the author to focus on the import parts of the API being
+sample. This allows the author to focus on the important parts of the API being
 documented with less boilerplate in the generated docs.
 
+The template includes an automatic import of the library containing the example, so an example in, say, the documentation of `StreamController.add` would have `dart:async` imported automatically.
+
 The tool will try and automatically detect the right template to use based on
 code patterns within the sample itself. In order to explicitly indicate which template
 to use, you can specify it as part of the code fence line. For example:
 
-> ```dart template:main
-> print('hello world ${Timer()}');
+> ```dart
+> /// ```dart template:main
+> /// print('hello world ${Timer()}');
+> /// ```
 > ```
 
-The three current templates are:
-- `none`: do not wrap the code sample in any template
-- `main`: wrap the code sample in a simple main() method
-- `expression`: wrap the code sample in a statement within a main() method
+The current templates are:
 
-For most code sample, the auto-detection code will select `template:main` or
+- `none`: Do not wrap the code sample in any template, including no imports.
+- `top`: The code sample is top level code, preceded only by imports.
+- `main`: The code sample is one or more statements in a simple asynchronous  `main()` function.
+- `expression`: The code sample is an expression within a simple asynchronous `main()` method.
+
+For most code samples, the auto-detection code will select `template:main` or
 `template:expression`.
 
+If the example contains any `library` declarations, the template becomes `none`.
+
+### Specifying additional imports
+
+If your example contains any `library`, the default import of the current library is omitted. To avoid that, you can declare extra automatic imports in the code fence like:
+
+> ````dart
+> /// ```dart import:async
+> /// print('hello world ${Timer()}');
+> /// ```
+> ````
+
+Multiple imports can be specified like this if desired, e.g., "```` ```dart import:async import:convert````".
+
+Does not work if combined with `template:none`, whether the `none` template is specified explicitly or auto-detected.
+
+### Splitting examples
+
+Some examples may be split into separate code blocks, but should be seen
+as continuing the same running example.
+
+If the following code blocks are marked as `continued` as shown below, they
+are included into the previous code block instead of being treated as a new
+example.
+
+> ````dart
+> /// ```dart
+> /// var list = [1, 2, 3];
+> /// ```
+> /// And then you can also do the following:
+> /// ```dart continued
+> /// list.forEach(print);
+> /// ```
+> ````
+
+A `continued` code block cannot have any other flags in the fence.
+
 ### Including additional code for analysis
 
 You can declare code that should be included in the analysis but not shown in
 the API docs by adding a comment "// Examples can assume:" to the file (usually
 at the top of the file, after the imports), following by one or more
-commented-out lines of code. That code is included verbatim in the analysis. For
-example:
+commented-out lines of code. That code is included verbatim in the analysis, at top-level after the automatic imports. Does not work with `template:none`.
+
+For example:
 
 ```dart
 // Examples can assume:
 // final BuildContext context;
 // final String userAvatarUrl;
 ```
+
diff --git a/tools/verify_docs/bin/verify_docs.dart b/tools/verify_docs/bin/verify_docs.dart
old mode 100644
new mode 100755
index 085223f..8cba35f
--- a/tools/verify_docs/bin/verify_docs.dart
+++ b/tools/verify_docs/bin/verify_docs.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.
 
+// Read the ../README.md file for the recognized syntax.
+
 import 'dart:collection';
 import 'dart:io';
 
@@ -20,10 +22,10 @@
 import 'package:analyzer/src/util/comment.dart';
 import 'package:path/path.dart' as path;
 
+final libDir = Directory(path.join('sdk', 'lib'));
 void main(List<String> args) async {
-  final libDir = Directory('sdk/lib');
   if (!libDir.existsSync()) {
-    print('Please run this tool from the root of the sdk repo.');
+    print('Please run this tool from the root of the sdk repository.');
     exit(1);
   }
 
@@ -37,7 +39,7 @@
 
   final coreLibraries = args.isEmpty
       ? libDir.listSync().whereType<Directory>().toList()
-      : args.map((arg) => Directory(arg)).toList();
+      : args.map(parseArg).toList();
   coreLibraries.sort((a, b) => a.path.compareTo(b.path));
 
   // Skip some dart: libraries.
@@ -172,9 +174,9 @@
     var offset = text.indexOf(sampleStart);
     while (offset != -1) {
       // Collect template directives, like "```dart import:async".
-      final codeFenceSuffix = text.substring(
-          offset + sampleStart.length, text.indexOf('\n', offset));
-      final directives = Set.unmodifiable(codeFenceSuffix.trim().split(' '));
+      final codeFenceSuffix = text
+          .substring(offset + sampleStart.length, text.indexOf('\n', offset))
+          .trim();
 
       offset = text.indexOf('\n', offset) + 1;
       final end = text.indexOf(sampleEnd, offset);
@@ -183,73 +185,128 @@
       snippet = snippet.substring(0, snippet.lastIndexOf('\n'));
 
       List<String> lines = snippet.split('\n');
-
-      samples.add(
-        CodeSample(
-          lines.map((e) => '  ${cleanDocLine(e)}').join('\n'),
-          coreLibName: coreLibName,
-          directives: directives,
-          lineStartOffset: commentLineStart +
-              text.substring(0, offset - 1).split('\n').length -
-              1,
-        ),
-      );
+      var startLineNumber = commentLineStart +
+          text.substring(0, offset - 1).split('\n').length -
+          1;
+      if (codeFenceSuffix == "continued") {
+        if (samples.isEmpty) {
+          throw "Continued code block without previous code";
+        }
+        samples.last = samples.last.append(lines, startLineNumber);
+      } else {
+        final directives = Set.unmodifiable(codeFenceSuffix.split(' '));
+        samples.add(
+          CodeSample(
+            [for (var e in lines) '  ${cleanDocLine(e)}'],
+            coreLibName: coreLibName,
+            directives: directives,
+            lineStartOffset: startLineNumber,
+          ),
+        );
+      }
 
       offset = text.indexOf(sampleStart, offset);
     }
   }
 
-  Future validateCodeSample(CodeSample sample) async {
-    var text = sample.text;
-    final lines = sample.text.split('\n').map((l) => l.trim()).toList();
+  // RegExp detecting various top-level declarations or `main(`.
+  //
+  // If the top-level declaration is `library` or `import`,
+  // then match 1 (`libdecl`) will be non-null.
+  // This is a sign that no auto-imports should be added.
+  //
+  // If an import declaration is included in the sample, no
+  // assumed-declarations are added.
+  // Use the `import:foo` template to import other `dart:` libraries
+  // instead of writing them explicitly to.
+  //
+  // Captures:
+  // 1/libdecl: Non-null if mathcing a `library` declaration.
+  // 2: Internal use, quote around import URI.
+  // 3/importuri: Import URI.
+  final _toplevelDeclarationRE = RegExp(r'^\s*(?:'
+      r'library\b(?<libdecl>)|'
+      r'''import (['"])(?<importuri>.*?)\2|'''
+      r'class\b|mixin\b|enum\b|extension\b|typedef\b|.*\bmain\('
+      r')');
 
-    final hasImports = text.contains("import '") || text.contains('import "');
+  validateCodeSample(CodeSample sample) async {
+    final lines = sample.lines;
 
-    // One of 'none', 'main', or 'expression'.
-    String? template;
+    // The default imports includes the library itself
+    // and any import directives.
+    Set<String> autoImports = sample.imports;
 
-    if (sample.hasTemplateDirective) {
-      template = sample.templateDirective;
+    // One of 'none', 'top, 'main', or 'expression'.
+    String template;
+
+    bool hasImport = false;
+
+    final templateDirective = sample.templateDirective;
+    if (templateDirective != null) {
+      template = templateDirective;
     } else {
-      // If there's no explicit template, auto-detect one.
-      if (lines.any((line) =>
-          line.startsWith('class ') ||
-          line.startsWith('enum ') ||
-          line.startsWith('extension '))) {
+      // Scan lines for top-level declarations.
+      bool hasTopDeclaration = false;
+      bool hasLibraryDeclaration = false;
+      for (var line in lines) {
+        var topDeclaration = _toplevelDeclarationRE.firstMatch(line);
+        if (topDeclaration != null) {
+          hasTopDeclaration = true;
+          hasLibraryDeclaration |=
+              (topDeclaration.namedGroup("libdecl") != null);
+          var importDecl = topDeclaration.namedGroup("importuri");
+          if (importDecl != null) {
+            hasImport = true;
+            if (importDecl.startsWith('dart:')) {
+              // Remove explicit imports from automatic imports
+              // to avoid duplicate import warnings.
+              autoImports.remove(importDecl.substring('dart:'.length));
+            }
+          }
+        }
+      }
+      if (hasLibraryDeclaration) {
         template = 'none';
-      } else if (lines
-          .any((line) => line.startsWith('main(') || line.contains(' main('))) {
-        template = 'none';
+      } else if (hasTopDeclaration) {
+        template = 'top';
       } else if (lines.length == 1 && !lines.first.trim().endsWith(';')) {
+        // If single line with no trailing `;`, assume expression.
         template = 'expression';
       } else {
+        // Otherwise default to `main`.
         template = 'main';
       }
     }
 
-    final assumptions = sampleAssumptions ?? '';
+    var buffer = StringBuffer();
 
-    if (!hasImports) {
-      if (template == 'none') {
-        // just use the sample text as is
-      } else if (template == 'main') {
-        text = "${assumptions}main() async {\n${text.trimRight()}\n}\n";
-      } else if (template == 'expression') {
-        text = "${assumptions}main() async {\n${text.trimRight()}\n;\n}\n";
-      } else {
-        throw 'unexpected template directive: $template';
+    if (template != 'none') {
+      for (var library in autoImports) {
+        buffer.writeln("import 'dart:$library';");
       }
-
-      for (final directive
-          in sample.directives.where((str) => str.startsWith('import:'))) {
-        final libName = directive.substring('import:'.length);
-        text = "import 'dart:$libName';\n$text";
-      }
-
-      if (sample.coreLibName != 'internal') {
-        text = "import 'dart:${sample.coreLibName}';\n$text";
+      if (!hasImport) {
+        buffer.write(sampleAssumptions ?? '');
       }
     }
+    if (template == 'none' || template == 'top') {
+      buffer.writeAllLines(lines);
+    } else if (template == 'main') {
+      buffer
+        ..writeln('void main() async {')
+        ..writeAllLines(lines)
+        ..writeln('}');
+    } else if (template == 'expression') {
+      assert(lines.length >= 1);
+      buffer
+        ..writeln('void main() async =>')
+        ..writeAllLines(lines.take(lines.length - 1))
+        ..writeln("${lines.last.trimRight()};");
+    } else {
+      throw 'unexpected template directive: $template';
+    }
+
+    final text = buffer.toString();
 
     final result = await analysisHelper.resolveFile(text);
 
@@ -311,8 +368,7 @@
         print('');
 
         // Print out the code sample.
-        print(sample.text
-            .split('\n')
+        print(sample.lines
             .map((line) =>
                 '  >${line.length >= 5 ? line.substring(5) : line.trimLeft()}')
             .join('\n'));
@@ -337,27 +393,63 @@
 }
 
 class CodeSample {
+  /// Currently valid template names.
+  static const validTemplates = ['none', 'top', 'main', 'expression'];
+
   final String coreLibName;
   final Set<String> directives;
-  final String text;
+  final List<String> lines;
   final int lineStartOffset;
 
   CodeSample(
-    this.text, {
+    this.lines, {
     required this.coreLibName,
     this.directives = const {},
     required this.lineStartOffset,
   });
 
+  String get text => lines.join('\n');
+
   bool get hasTemplateDirective => templateDirective != null;
 
+  /// The specified template, or `null` if no template is specified.
+  ///
+  /// A specified template must be of [validTemplates].
   String? get templateDirective {
     const prefix = 'template:';
 
-    String? match = directives.cast<String?>().firstWhere(
-        (directive) => directive!.startsWith(prefix),
-        orElse: () => null);
-    return match == null ? match : match.substring(prefix.length);
+    for (var directive in directives) {
+      if (directive.startsWith(prefix)) {
+        var result = directive.substring(prefix.length);
+        if (!validTemplates.contains(result)) {
+          throw "Invalid template name: $result";
+        }
+        return result;
+      }
+    }
+    return null;
+  }
+
+  /// The implicit or explicitly requested imports.
+  Set<String> get imports => {
+        if (coreLibName != 'internal' && coreLibName != 'core') coreLibName,
+        for (var directive in directives)
+          if (directive.startsWith('import:'))
+            directive.substring('import:'.length)
+      };
+
+  /// Creates a new code sample by appending [lines] to this sample.
+  ///
+  /// The new sample only differs from this sample in that it has
+  /// more lines appended, first `this.lines`, then a gap of `  //` lines
+  /// and then [lines].
+  CodeSample append(List<String> lines, int lineStartOffset) {
+    var gapSize = lineStartOffset - (this.lineStartOffset + this.lines.length);
+    return CodeSample(
+        [...this.lines, for (var i = 0; i < gapSize; i++) "  //", ...lines],
+        coreLibName: coreLibName,
+        directives: directives,
+        lineStartOffset: this.lineStartOffset);
   }
 }
 
@@ -422,3 +514,35 @@
     return await analysisSession.getResolvedUnit(samplePath);
   }
 }
+
+// Helper function to make things easier to read.
+extension on StringBuffer {
+  /// Write every line, right-trimmed, of [lines] with a newline after.
+  void writeAllLines(Iterable<String> lines) {
+    for (var line in lines) {
+      this.writeln(line.trimRight());
+    }
+  }
+}
+
+/// Interprets [arg] as directory containing a platform library.
+///
+/// If [arg] is `dart:foo`, the directory is the default directory for
+/// the `dart:foo` library source.
+/// Otherwise, if [arg] is a directory (relative to the current directory)
+/// which exists, that is the result.
+/// Otherwise, if [arg] is the name of a platform library,
+/// like `foo` where `dart:foo` is a platform library,
+/// the result is the default directory for that library's source.
+/// Otherwise it's treated as a directory relative to the current directory,
+/// which doesn't exist (but that's what the error will refer to).
+Directory parseArg(String arg) {
+  if (arg.startsWith('dart:')) {
+    return Directory(path.join(libDir.path, arg.substring('dart:'.length)));
+  }
+  var dir = Directory(arg);
+  if (dir.existsSync()) return dir;
+  var relDir = Directory(path.join(libDir.path, arg));
+  if (relDir.existsSync()) return relDir;
+  return dir;
+}
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index da80743..5d93e80 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -49,11 +49,16 @@
   abs_output = rebase_path(out)
 
   prebuilt_dart_action(target_name) {
-    deps = invoker.deps + [ "../compiler:compile_dart2js_platform" ]
+    deps = invoker.deps + [
+             "../compiler:compile_dart2js_platform",
+             "../compiler:compile_dart2js_platform_unsound",
+           ]
 
     inputs = [
       "$root_out_dir/dart2js_platform.dill",
+      "$root_out_dir/dart2js_platform_unsound.dill",
       "$root_out_dir/dart2js_outline.dill",
+      "$root_out_dir/dart2js_outline_unsound.dill",
     ]
     outputs = [ out ]