diff --git a/CHANGELOG.md b/CHANGELOG.md
index ddcd721..3b8c49b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,13 @@
+## 3.6.0
+
+- Improve performance by buffering out of order messages in the server instead
+  of the client.
+
+** Note ** This is not modelled as a breaking change as the server can handle
+messages from older clients. However, clients should be using the latest server
+if they require order guarantees.
+
+
 ## 3.5.0
 
 - Add new `shutdown` methods on `SseHandler` and `SseConnection` to allow closing
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 0e180e4..2a0ddfa 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -4,7 +4,6 @@
     implicit-casts: false
   errors:
     dead_code: error
-    override_on_non_overriding_method: error
     unused_element: error
     unused_import: error
     unused_local_variable: error
diff --git a/lib/client/sse_client.dart b/lib/client/sse_client.dart
index 232a9c9..1316191 100644
--- a/lib/client/sse_client.dart
+++ b/lib/client/sse_client.dart
@@ -21,6 +21,8 @@
 
   final _logger = Logger('SseClient');
 
+  int _lastMessageId = -1;
+
   EventSource _eventSource;
 
   String _serverUrl;
@@ -51,8 +53,6 @@
         });
       }
     });
-
-    _startPostingMessages();
   }
 
   Stream<Event> get onOpen => _eventSource.onOpen;
@@ -95,24 +95,21 @@
     close();
   }
 
-  final _messages = StreamController<dynamic>();
-
-  void _onOutgoingMessage(dynamic message) async {
-    _messages.add(message);
-  }
-
-  void _startPostingMessages() async {
-    await for (var message in _messages.stream) {
-      try {
-        await HttpRequest.request(_serverUrl,
-            method: 'POST',
-            sendData: jsonEncode(message),
-            withCredentials: true);
-      } on JsonUnsupportedObjectError catch (e) {
-        _logger.warning('Unable to encode outgoing message: $e');
-      } on ArgumentError catch (e) {
-        _logger.warning('Invalid argument: $e');
-      }
+  void _onOutgoingMessage(String message) async {
+    String encodedMessage;
+    try {
+      encodedMessage = jsonEncode(message);
+    } on JsonUnsupportedObjectError catch (e) {
+      _logger.warning('Unable to encode outgoing message: $e');
+    } on ArgumentError catch (e) {
+      _logger.warning('Invalid argument: $e');
+    }
+    try {
+      await HttpRequest.request('$_serverUrl&messageId=${++_lastMessageId}',
+          method: 'POST', sendData: encodedMessage, withCredentials: true);
+    } catch (e) {
+      _logger.severe('Failed to send $message:\n $e');
+      close();
     }
   }
 }
diff --git a/lib/src/server/sse_handler.dart b/lib/src/server/sse_handler.dart
index 923b87f..e764651 100644
--- a/lib/src/server/sse_handler.dart
+++ b/lib/src/server/sse_handler.dart
@@ -6,6 +6,7 @@
 import 'dart:convert';
 
 import 'package:async/async.dart';
+import 'package:collection/collection.dart';
 import 'package:logging/logging.dart';
 import 'package:pedantic/pedantic.dart';
 import 'package:shelf/shelf.dart' as shelf;
@@ -20,6 +21,12 @@
     'Access-Control-Allow-Origin: $origin\r\n'
     '\r\n\r\n';
 
+class _SseMessage {
+  final int id;
+  final String message;
+  _SseMessage(this.id, this.message);
+}
+
 /// A bi-directional SSE connection between server and browser.
 class SseConnection extends StreamChannelMixin<String> {
   /// Incoming messages from the Browser client.
@@ -39,6 +46,13 @@
   /// Whether this connection is currently in the KeepAlive timeout period.
   bool get isInKeepAlivePeriod => _keepAliveTimer?.isActive ?? false;
 
+  /// The id of the last processed incoming message.
+  int _lastProcessedId = -1;
+
+  /// Incoming messages that have yet to be processed.
+  final _pendingMessages =
+      HeapPriorityQueue<_SseMessage>((a, b) => a.id.compareTo(b.id));
+
   final _closedCompleter = Completer<void>();
 
   /// Wraps the `_outgoingController.stream` to buffer events to enable keep
@@ -106,6 +120,26 @@
   @override
   Stream<String> get stream => _incomingController.stream;
 
+  /// Adds an incoming [message] to the [stream].
+  ///
+  /// This will buffer messages to guarantee order.
+  void _addIncomingMessage(int id, String message) {
+    _pendingMessages.add(_SseMessage(id, message));
+    while (_pendingMessages.isNotEmpty) {
+      var pendingMessage = _pendingMessages.first;
+      // Only process the next incremental message.
+      if (pendingMessage.id - _lastProcessedId <= 1) {
+        _incomingController.sink.add(pendingMessage.message);
+        _lastProcessedId = pendingMessage.id;
+        _pendingMessages.removeFirst();
+      } else {
+        // A message came out of order. Wait until we receive the previous
+        // messages to process.
+        break;
+      }
+    }
+  }
+
   void _acceptReconnection(Sink sink) {
     _keepAliveTimer?.cancel();
     _sink = sink;
@@ -221,9 +255,10 @@
       shelf.Request req, String path) async {
     try {
       var clientId = req.url.queryParameters['sseClientId'];
+      var messageId = int.parse(req.url.queryParameters['messageId'] ?? '0');
       var message = await req.readAsString();
       var jsonObject = json.decode(message) as String;
-      _connections[clientId]?._incomingController?.add(jsonObject);
+      _connections[clientId]?._addIncomingMessage(messageId, jsonObject);
     } catch (e, st) {
       _logger.fine('Failed to handle incoming message. $e $st');
     }
diff --git a/pubspec.yaml b/pubspec.yaml
index 76f3d97..4df0f80 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: sse
-version: 3.5.0
+version: 3.6.0
 homepage: https://github.com/dart-lang/sse
 description: >-
   Provides client and server functionality for setting up bi-directional
@@ -11,6 +11,7 @@
 
 dependencies:
   async: ^2.0.8
+  collection: ^1.0.0
   logging: ^0.11.3+2
   pedantic: ^1.4.0
   stream_channel: '>=1.6.8 <3.0.0'
diff --git a/test/sse_test.dart b/test/sse_test.dart
index e7263f1..00349d1 100644
--- a/test/sse_test.dart
+++ b/test/sse_test.dart
@@ -60,14 +60,30 @@
       await server.close();
     });
 
-    test('Can round trip messages', () async {
+    test('can round trip messages', () async {
       await webdriver.get('http://localhost:${server.port}');
       var connection = await handler.connections.next;
       connection.sink.add('blah');
       expect(await connection.stream.first, 'blah');
     });
 
-    test('Multiple clients can connect', () async {
+    test('messages arrive in-order', () async {
+      expect(handler.numberOfClients, 0);
+      await webdriver.get('http://localhost:${server.port}');
+      var connection = await handler.connections.next;
+      expect(handler.numberOfClients, 1);
+
+      var expected = <String>[];
+      var count = 100;
+      for (var i = 0; i < count; i++) {
+        expected.add(i.toString());
+      }
+      connection.sink.add('send $count');
+
+      expect(await connection.stream.take(count).toList(), equals(expected));
+    });
+
+    test('multiple clients can connect', () async {
       var connections = handler.connections;
       await webdriver.get('http://localhost:${server.port}');
       await connections.next;
@@ -75,7 +91,7 @@
       await connections.next;
     });
 
-    test('Routes data correctly', () async {
+    test('routes data correctly', () async {
       var connections = handler.connections;
       await webdriver.get('http://localhost:${server.port}');
       var connectionA = await connections.next;
@@ -88,7 +104,7 @@
       expect(await connectionB.stream.first, 'bar');
     });
 
-    test('Can close from the server', () async {
+    test('can close from the server', () async {
       expect(handler.numberOfClients, 0);
       await webdriver.get('http://localhost:${server.port}');
       var connection = await handler.connections.next;
@@ -98,7 +114,7 @@
       expect(handler.numberOfClients, 0);
     });
 
-    test('Client reconnects after being disconnected', () async {
+    test('client reconnects after being disconnected', () async {
       expect(handler.numberOfClients, 0);
       await webdriver.get('http://localhost:${server.port}');
       var connection = await handler.connections.next;
@@ -111,7 +127,7 @@
       await handler.connections.next;
     });
 
-    test('Can close from the client-side', () async {
+    test('can close from the client-side', () async {
       expect(handler.numberOfClients, 0);
       await webdriver.get('http://localhost:${server.port}');
       var connection = await handler.connections.next;
@@ -125,7 +141,7 @@
       expect(handler.numberOfClients, 0);
     });
 
-    test('Cancelling the listener closes the connection', () async {
+    test('cancelling the listener closes the connection', () async {
       expect(handler.numberOfClients, 0);
       await webdriver.get('http://localhost:${server.port}');
       var connection = await handler.connections.next;
@@ -137,7 +153,7 @@
       expect(handler.numberOfClients, 0);
     });
 
-    test('Disconnects when navigating away', () async {
+    test('disconnects when navigating away', () async {
       await webdriver.get('http://localhost:${server.port}');
       expect(handler.numberOfClients, 1);
 
@@ -172,7 +188,7 @@
       await server.close();
     });
 
-    test('Client reconnect use the same connection', () async {
+    test('client reconnect use the same connection', () async {
       expect(handler.numberOfClients, 0);
       await webdriver.get('http://localhost:${server.port}');
       var connection = await handler.connections.next;
@@ -213,7 +229,7 @@
       expect(connection.isInKeepAlivePeriod, isFalse);
     });
 
-    test('Messages sent during disconnect arrive in-order', () async {
+    test('messages sent during disconnect arrive in-order', () async {
       expect(handler.numberOfClients, 0);
       await webdriver.get('http://localhost:${server.port}');
       var connection = await handler.connections.next;
@@ -232,7 +248,7 @@
       expect(await connection.stream.take(2).toList(), equals(['one', 'two']));
     });
 
-    test('Explicit shutdown does not wait for keepAlive', () async {
+    test('explicit shutdown does not wait for keepAlive', () async {
       expect(handler.numberOfClients, 0);
       await webdriver.get('http://localhost:${server.port}');
       await handler.connections.next;
diff --git a/test/web/index.dart b/test/web/index.dart
index c58cde9..7d00757 100644
--- a/test/web/index.dart
+++ b/test/web/index.dart
@@ -14,6 +14,13 @@
   });
 
   channel.stream.listen((s) {
-    channel.sink.add(s);
+    if (s.startsWith('send ')) {
+      var count = int.parse(s.split(' ').last);
+      for (var i = 0; i < count; i++) {
+        channel.sink.add('$i');
+      }
+    } else {
+      channel.sink.add(s);
+    }
   });
 }
diff --git a/test/web/index.dart.js b/test/web/index.dart.js
index caabae5..7ad7d5a 100644
--- a/test/web/index.dart.js
+++ b/test/web/index.dart.js
@@ -1,4 +1,4 @@
-// Generated by dart2js (fast startup emitter, strong), the Dart to JavaScript compiler version: 2.7.0-dev.0.0.
+// Generated by dart2js (fast startup emitter, strong), the Dart to JavaScript compiler version: 2.11.0-190.0.dev.
 // The code supports the following hooks:
 // dartPrint(message):
 //    if this function is defined it is called instead of the Dart [print]
@@ -19,8 +19,6 @@
 //    if this function is defined, it will be called at each entry of a
 //    method or constructor. Used only when compiling programs with
 //    --experiment-call-instrumentation.
-{
-}
 (function dartProgram() {
   function copyProperties(from, to) {
     var keys = Object.keys(from);
@@ -86,7 +84,7 @@
     copyProperties(mixin.prototype, cls.prototype);
     cls.prototype.constructor = cls;
   }
-  function lazy(holder, name, getterName, initializer) {
+  function lazyOld(holder, name, getterName, initializer) {
     var uninitializedSentinel = holder;
     holder[name] = uninitializedSentinel;
     holder[getterName] = function() {
@@ -111,6 +109,34 @@
       return result;
     };
   }
+  function lazy(holder, name, getterName, initializer) {
+    var uninitializedSentinel = holder;
+    holder[name] = uninitializedSentinel;
+    holder[getterName] = function() {
+      if (holder[name] === uninitializedSentinel)
+        holder[name] = initializer();
+      holder[getterName] = function() {
+        return this[name];
+      };
+      return holder[name];
+    };
+  }
+  function lazyFinal(holder, name, getterName, initializer) {
+    var uninitializedSentinel = holder;
+    holder[name] = uninitializedSentinel;
+    holder[getterName] = function() {
+      if (holder[name] === uninitializedSentinel) {
+        var value = initializer();
+        if (holder[name] !== uninitializedSentinel)
+          H.throwLateInitializationError(name);
+        holder[name] = value;
+      }
+      holder[getterName] = function() {
+        return this[name];
+      };
+      return holder[name];
+    };
+  }
   function makeConstList(list) {
     list.immutable$list = Array;
     list.fixed$length = Array;
@@ -205,7 +231,7 @@
           return installStaticTearOff(container, getterName, requiredParameterCount, optionalParameterDefaultValues, callNames, [name], funType, applyIndex);
         };
       };
-    return {inherit: inherit, inheritMany: inheritMany, mixin: mixin, installStaticTearOff: installStaticTearOff, installInstanceTearOff: installInstanceTearOff, _instance_0u: mkInstance(0, 0, null, ["call$0"], 0), _instance_1u: mkInstance(0, 1, null, ["call$1"], 0), _instance_2u: mkInstance(0, 2, null, ["call$2"], 0), _instance_0i: mkInstance(1, 0, null, ["call$0"], 0), _instance_1i: mkInstance(1, 1, null, ["call$1"], 0), _instance_2i: mkInstance(1, 2, null, ["call$2"], 0), _static_0: mkStatic(0, null, ["call$0"], 0), _static_1: mkStatic(1, null, ["call$1"], 0), _static_2: mkStatic(2, null, ["call$2"], 0), makeConstList: makeConstList, lazy: lazy, updateHolder: updateHolder, convertToFastObject: convertToFastObject, setFunctionNamesIfNecessary: setFunctionNamesIfNecessary, updateTypes: updateTypes, setOrUpdateInterceptorsByTag: setOrUpdateInterceptorsByTag, setOrUpdateLeafTags: setOrUpdateLeafTags};
+    return {inherit: inherit, inheritMany: inheritMany, mixin: mixin, installStaticTearOff: installStaticTearOff, installInstanceTearOff: installInstanceTearOff, _instance_0u: mkInstance(0, 0, null, ["call$0"], 0), _instance_1u: mkInstance(0, 1, null, ["call$1"], 0), _instance_2u: mkInstance(0, 2, null, ["call$2"], 0), _instance_0i: mkInstance(1, 0, null, ["call$0"], 0), _instance_1i: mkInstance(1, 1, null, ["call$1"], 0), _instance_2i: mkInstance(1, 2, null, ["call$2"], 0), _static_0: mkStatic(0, null, ["call$0"], 0), _static_1: mkStatic(1, null, ["call$1"], 0), _static_2: mkStatic(2, null, ["call$2"], 0), makeConstList: makeConstList, lazy: lazy, lazyFinal: lazyFinal, lazyOld: lazyOld, updateHolder: updateHolder, convertToFastObject: convertToFastObject, setFunctionNamesIfNecessary: setFunctionNamesIfNecessary, updateTypes: updateTypes, setOrUpdateInterceptorsByTag: setOrUpdateInterceptorsByTag, setOrUpdateLeafTags: setOrUpdateLeafTags};
   }();
   function initializeDeferredHunk(hunk) {
     typesOffset = init.types.length;
@@ -222,8 +248,11 @@
   var C = {},
   H = {JS_CONST: function JS_CONST() {
     },
-    IterableElementError_tooFew: function() {
-      return new P.StateError("Too few elements");
+    IterableElementError_noElement: function() {
+      return new P.StateError("No element");
+    },
+    LateInitializationErrorImpl: function LateInitializationErrorImpl(t0) {
+      this._message = t0;
     },
     EfficientLengthIterable: function EfficientLengthIterable() {
     },
@@ -239,18 +268,15 @@
     },
     FixedLengthListMixin: function FixedLengthListMixin() {
     },
-    Symbol0: function Symbol0(t0) {
+    Symbol: function Symbol(t0) {
       this.__internal$_name = t0;
     },
     unminifyOrTag: function(rawClassName) {
       var preserved = H.unmangleGlobalNameIfPreservedAnyways(rawClassName);
-      if (typeof preserved === "string")
+      if (preserved != null)
         return preserved;
       return rawClassName;
     },
-    getType: function(index) {
-      return init.types[H.intTypeCheck(index)];
-    },
     isJsIndexable: function(object, record) {
       var result;
       if (record != null) {
@@ -258,13 +284,13 @@
         if (result != null)
           return result;
       }
-      return !!J.getInterceptor$(object).$isJavaScriptIndexingBehavior;
+      return type$.JavaScriptIndexingBehavior_dynamic._is(object);
     },
     S: function(value) {
       var res;
-      if (typeof value === "string")
+      if (typeof value == "string")
         return value;
-      if (typeof value === "number") {
+      if (typeof value == "number") {
         if (value !== 0)
           return "" + value;
       } else if (true === value)
@@ -274,7 +300,7 @@
       else if (value == null)
         return "null";
       res = J.toString$0$(value);
-      if (typeof res !== "string")
+      if (typeof res != "string")
         throw H.wrapException(H.argumentErrorValue(value));
       return res;
     },
@@ -286,36 +312,45 @@
       }
       return hash;
     },
-    Primitives_objectTypeName: function(object) {
-      return H.Primitives__objectClassName(object) + H._joinArguments(H.getRuntimeTypeInfo(object), 0, null);
+    Primitives_parseInt: function(source, radix) {
+      var match, decimalMatch;
+      if (typeof source != "string")
+        H.throwExpression(H.argumentErrorValue(source));
+      match = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(source);
+      if (match == null)
+        return null;
+      if (3 >= match.length)
+        return H.ioore(match, 3);
+      decimalMatch = match[3];
+      if (decimalMatch != null)
+        return parseInt(source, 10);
+      if (match[2] != null)
+        return parseInt(source, 16);
+      return null;
     },
-    Primitives__objectClassName: function(object) {
-      var interceptorConstructorName, $name, t1, dispatchName, objectConstructor, match, decompiledName,
-        interceptor = J.getInterceptor$(object),
-        interceptorConstructor = interceptor.constructor;
-      if (typeof interceptorConstructor == "function") {
-        interceptorConstructorName = interceptorConstructor.name;
-        $name = typeof interceptorConstructorName === "string" ? interceptorConstructorName : null;
-      } else
-        $name = null;
-      t1 = $name == null;
-      if (t1 || interceptor === C.Interceptor_methods || !!interceptor.$isUnknownJavaScriptObject) {
+    Primitives_objectTypeName: function(object) {
+      return H.Primitives__objectTypeNameNewRti(object);
+    },
+    Primitives__objectTypeNameNewRti: function(object) {
+      var dispatchName, $constructor, constructorName;
+      if (object instanceof P.Object)
+        return H._rtiToString(H.instanceType(object), null);
+      if (J.getInterceptor$(object) === C.Interceptor_methods || type$.UnknownJavaScriptObject._is(object)) {
         dispatchName = C.C_JS_CONST(object);
-        if (t1)
-          $name = dispatchName;
-        if (dispatchName === "Object") {
-          objectConstructor = object.constructor;
-          if (typeof objectConstructor == "function") {
-            match = String(objectConstructor).match(/^\s*function\s*([\w$]*)\s*\(/);
-            decompiledName = match == null ? null : match[1];
-            if (typeof decompiledName === "string" && /^\w+$/.test(decompiledName))
-              $name = decompiledName;
-          }
+        if (H.Primitives__saneNativeClassName(dispatchName))
+          return dispatchName;
+        $constructor = object.constructor;
+        if (typeof $constructor == "function") {
+          constructorName = $constructor.name;
+          if (typeof constructorName == "string" && H.Primitives__saneNativeClassName(constructorName))
+            return constructorName;
         }
-        return $name;
       }
-      $name = $name;
-      return H.unminifyOrTag($name.length > 1 && C.JSString_methods._codeUnitAt$1($name, 0) === 36 ? C.JSString_methods.substring$1($name, 1) : $name);
+      return H._rtiToString(H.instanceType(object), null);
+    },
+    Primitives__saneNativeClassName: function($name) {
+      var t1 = $name !== "Object" && $name !== "";
+      return t1;
     },
     Primitives_stringFromNativeUint8List: function(charCodes, start, end) {
       var i, result, i0, chunkEnd;
@@ -411,9 +446,9 @@
       return H.Primitives__genericApplyFunction2($function, positionalArguments, namedArguments);
     },
     Primitives__genericApplyFunction2: function($function, positionalArguments, namedArguments) {
-      var $arguments, argumentCount, requiredParameterCount, defaultValuesClosure, t1, defaultValues, interceptor, jsFunction, keys, _i, used, t2;
+      var $arguments, argumentCount, requiredParameterCount, defaultValuesClosure, t1, defaultValues, interceptor, jsFunction, keys, _i, defaultValue, used, key;
       if (positionalArguments != null)
-        $arguments = positionalArguments instanceof Array ? positionalArguments : P.List_List$from(positionalArguments, true, null);
+        $arguments = positionalArguments instanceof Array ? positionalArguments : P.List_List$from(positionalArguments, type$.dynamic);
       else
         $arguments = [];
       argumentCount = $arguments.length;
@@ -425,7 +460,7 @@
       defaultValues = !t1 ? defaultValuesClosure() : null;
       interceptor = J.getInterceptor$($function);
       jsFunction = interceptor["call*"];
-      if (typeof jsFunction === "string")
+      if (typeof jsFunction == "string")
         jsFunction = interceptor[jsFunction];
       if (t1) {
         if (namedArguments != null && namedArguments.__js_helper$_length !== 0)
@@ -446,16 +481,24 @@
           return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
         keys = Object.keys(defaultValues);
         if (namedArguments == null)
-          for (t1 = keys.length, _i = 0; _i < keys.length; keys.length === t1 || (0, H.throwConcurrentModificationError)(keys), ++_i)
-            C.JSArray_methods.add$1($arguments, defaultValues[H.stringTypeCheck(keys[_i])]);
+          for (t1 = keys.length, _i = 0; _i < keys.length; keys.length === t1 || (0, H.throwConcurrentModificationError)(keys), ++_i) {
+            defaultValue = defaultValues[H._asStringS(keys[_i])];
+            if (C.C__Required === defaultValue)
+              return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
+            C.JSArray_methods.add$1($arguments, defaultValue);
+          }
         else {
           for (t1 = keys.length, used = 0, _i = 0; _i < keys.length; keys.length === t1 || (0, H.throwConcurrentModificationError)(keys), ++_i) {
-            t2 = H.stringTypeCheck(keys[_i]);
-            if (namedArguments.containsKey$1(t2)) {
+            key = H._asStringS(keys[_i]);
+            if (namedArguments.containsKey$1(key)) {
               ++used;
-              C.JSArray_methods.add$1($arguments, namedArguments.$index(0, t2));
-            } else
-              C.JSArray_methods.add$1($arguments, defaultValues[t2]);
+              C.JSArray_methods.add$1($arguments, namedArguments.$index(0, key));
+            } else {
+              defaultValue = defaultValues[key];
+              if (C.C__Required === defaultValue)
+                return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
+              C.JSArray_methods.add$1($arguments, defaultValue);
+            }
           }
           if (used !== namedArguments.__js_helper$_length)
             return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
@@ -473,9 +516,9 @@
     },
     diagnoseIndexError: function(indexable, index) {
       var $length, t1, _s5_ = "index";
-      if (typeof index !== "number" || Math.floor(index) !== index)
+      if (!H._isInt(index))
         return new P.ArgumentError(true, index, _s5_, null);
-      $length = H.intTypeCheck(J.get$length$asx(indexable));
+      $length = H._asIntS(J.get$length$asx(indexable));
       if (!(index < 0)) {
         if (typeof $length !== "number")
           return H.iae($length);
@@ -493,16 +536,17 @@
       return value;
     },
     wrapException: function(ex) {
-      var wrapper;
+      var wrapper, t1;
       if (ex == null)
         ex = new P.NullThrownError();
       wrapper = new Error();
       wrapper.dartException = ex;
+      t1 = H.toStringWrapper;
       if ("defineProperty" in Object) {
-        Object.defineProperty(wrapper, "message", {get: H.toStringWrapper});
+        Object.defineProperty(wrapper, "message", {get: t1});
         wrapper.name = "";
       } else
-        wrapper.toString = H.toStringWrapper;
+        wrapper.toString = t1;
       return wrapper;
     },
     toStringWrapper: function() {
@@ -519,7 +563,7 @@
       message = H.quoteStringForRegExp(message.replace(String({}), '$receiver$'));
       match = message.match(/\\\$[a-zA-Z]+\\\$/g);
       if (match == null)
-        match = H.setRuntimeTypeInfo([], [P.String]);
+        match = H.setRuntimeTypeInfo([], type$.JSArray_String);
       $arguments = match.indexOf("\\$arguments\\$");
       argumentsExpr = match.indexOf("\\$argumentsExpr\\$");
       expr = match.indexOf("\\$expr\\$");
@@ -555,17 +599,25 @@
       return new H.JsNoSuchMethodError(_message, t2, t1 ? null : match.receiver);
     },
     unwrapException: function(ex) {
-      var message, number, ieErrorCode, nsme, notClosure, nullCall, nullLiteralCall, undefCall, undefLiteralCall, nullProperty, undefProperty, undefLiteralProperty, match, t2, _null = null,
-        t1 = new H.unwrapException_saveStackTrace(ex);
       if (ex == null)
-        return;
+        return new H.NullThrownFromJavaScriptException(ex);
       if (ex instanceof H.ExceptionAndStackTrace)
-        return t1.call$1(ex.dartException);
+        return H.saveStackTrace(ex, ex.dartException);
       if (typeof ex !== "object")
         return ex;
       if ("dartException" in ex)
-        return t1.call$1(ex.dartException);
-      else if (!("message" in ex))
+        return H.saveStackTrace(ex, ex.dartException);
+      return H._unwrapNonDartException(ex);
+    },
+    saveStackTrace: function(ex, error) {
+      if (type$.Error._is(error))
+        if (error.$thrownJsError == null)
+          error.$thrownJsError = ex;
+      return error;
+    },
+    _unwrapNonDartException: function(ex) {
+      var message, number, ieErrorCode, nsme, notClosure, nullCall, nullLiteralCall, undefCall, undefLiteralCall, nullProperty, undefProperty, undefLiteralProperty, match, t1, _null = null;
+      if (!("message" in ex))
         return ex;
       message = ex.message;
       if ("number" in ex && typeof ex.number == "number") {
@@ -574,10 +626,10 @@
         if ((C.JSInt_methods._shrOtherPositive$1(number, 16) & 8191) === 10)
           switch (ieErrorCode) {
             case 438:
-              return t1.call$1(H.JsNoSuchMethodError$(H.S(message) + " (Error " + ieErrorCode + ")", _null));
+              return H.saveStackTrace(ex, H.JsNoSuchMethodError$(H.S(message) + " (Error " + ieErrorCode + ")", _null));
             case 445:
             case 5007:
-              return t1.call$1(H.NullError$(H.S(message) + " (Error " + ieErrorCode + ")", _null));
+              return H.saveStackTrace(ex, H.NullError$(H.S(message) + " (Error " + ieErrorCode + ")", _null));
           }
       }
       if (ex instanceof TypeError) {
@@ -593,12 +645,12 @@
         undefLiteralProperty = $.$get$TypeErrorDecoder_undefinedLiteralPropertyPattern();
         match = nsme.matchTypeError$1(message);
         if (match != null)
-          return t1.call$1(H.JsNoSuchMethodError$(H.stringTypeCheck(message), match));
+          return H.saveStackTrace(ex, H.JsNoSuchMethodError$(H._asStringS(message), match));
         else {
           match = notClosure.matchTypeError$1(message);
           if (match != null) {
             match.method = "call";
-            return t1.call$1(H.JsNoSuchMethodError$(H.stringTypeCheck(message), match));
+            return H.saveStackTrace(ex, H.JsNoSuchMethodError$(H._asStringS(message), match));
           } else {
             match = nullCall.matchTypeError$1(message);
             if (match == null) {
@@ -615,29 +667,29 @@
                         match = undefProperty.matchTypeError$1(message);
                         if (match == null) {
                           match = undefLiteralProperty.matchTypeError$1(message);
-                          t2 = match != null;
+                          t1 = match != null;
                         } else
-                          t2 = true;
+                          t1 = true;
                       } else
-                        t2 = true;
+                        t1 = true;
                     } else
-                      t2 = true;
+                      t1 = true;
                   } else
-                    t2 = true;
+                    t1 = true;
                 } else
-                  t2 = true;
+                  t1 = true;
               } else
-                t2 = true;
+                t1 = true;
             } else
-              t2 = true;
-            if (t2)
-              return t1.call$1(H.NullError$(H.stringTypeCheck(message), match));
+              t1 = true;
+            if (t1)
+              return H.saveStackTrace(ex, H.NullError$(H._asStringS(message), match));
           }
         }
-        return t1.call$1(new H.UnknownJsTypeError(typeof message === "string" ? message : ""));
+        return H.saveStackTrace(ex, new H.UnknownJsTypeError(typeof message == "string" ? message : ""));
       }
       if (ex instanceof RangeError) {
-        if (typeof message === "string" && message.indexOf("call stack") !== -1)
+        if (typeof message == "string" && message.indexOf("call stack") !== -1)
           return new P.StackOverflowError();
         message = function(ex) {
           try {
@@ -646,10 +698,10 @@
           }
           return null;
         }(ex);
-        return t1.call$1(new P.ArgumentError(false, _null, _null, typeof message === "string" ? message.replace(/^RangeError:\s*/, "") : message));
+        return H.saveStackTrace(ex, new P.ArgumentError(false, _null, _null, typeof message == "string" ? message.replace(/^RangeError:\s*/, "") : message));
       }
       if (typeof InternalError == "function" && ex instanceof InternalError)
-        if (typeof message === "string" && message === "too much recursion")
+        if (typeof message == "string" && message === "too much recursion")
           return new P.StackOverflowError();
       return ex;
     },
@@ -675,8 +727,8 @@
       return result;
     },
     invokeClosure: function(closure, numberOfArguments, arg1, arg2, arg3, arg4) {
-      H.interceptedTypeCheck(closure, "$isFunction");
-      switch (H.intTypeCheck(numberOfArguments)) {
+      type$.Function._as(closure);
+      switch (H._asIntS(numberOfArguments)) {
         case 0:
           return closure.call$0();
         case 1:
@@ -693,7 +745,7 @@
     convertDartClosureToJS: function(closure, arity) {
       var $function;
       if (closure == null)
-        return;
+        return null;
       $function = closure.$identity;
       if (!!$function)
         return $function;
@@ -706,10 +758,10 @@
       return $function;
     },
     Closure_fromTearOff: function(receiver, functions, applyTrampolineIndex, reflectionInfo, isStatic, isIntercepted, propertyName) {
-      var $constructor, t1, trampoline, signatureFunction, applyTrampoline, i, stub, stubCallName, _null = null,
+      var $constructor, t1, trampoline, applyTrampoline, i, stub, stubCallName,
         $function = functions[0],
         callName = $function.$callName,
-        $prototype = isStatic ? Object.create(new H.StaticClosure().constructor.prototype) : Object.create(new H.BoundClosure(_null, _null, _null, _null).constructor.prototype);
+        $prototype = isStatic ? Object.create(new H.StaticClosure().constructor.prototype) : Object.create(new H.BoundClosure(null, null, null, "").constructor.prototype);
       $prototype.$initialize = $prototype.constructor;
       if (isStatic)
         $constructor = function static_tear_off() {
@@ -732,8 +784,7 @@
         $prototype.$static_name = propertyName;
         trampoline = $function;
       }
-      signatureFunction = H.Closure__computeSignatureFunctionLegacy(reflectionInfo, isStatic, isIntercepted);
-      $prototype.$signature = signatureFunction;
+      $prototype.$signature = H.Closure__computeSignatureFunctionNewRti(reflectionInfo, isStatic, isIntercepted);
       $prototype[callName] = trampoline;
       for (applyTrampoline = trampoline, i = 1; i < functions.length; ++i) {
         stub = functions[i];
@@ -752,25 +803,24 @@
       $prototype.$defaultValues = $function.$defaultValues;
       return $constructor;
     },
-    Closure__computeSignatureFunctionLegacy: function(functionType, isStatic, isIntercepted) {
-      var getReceiver;
+    Closure__computeSignatureFunctionNewRti: function(functionType, isStatic, isIntercepted) {
+      var typeEvalMethod;
       if (typeof functionType == "number")
         return function(getType, t) {
           return function() {
             return getType(t);
           };
-        }(H.getType, functionType);
-      if (typeof functionType == "function")
+        }(H.getTypeFromTypesTable, functionType);
+      if (typeof functionType == "string") {
         if (isStatic)
-          return functionType;
-        else {
-          getReceiver = isIntercepted ? H.BoundClosure_receiverOf : H.BoundClosure_selfOf;
-          return function(f, r) {
-            return function() {
-              return f.apply({$receiver: r(this)}, arguments);
-            };
-          }(functionType, getReceiver);
-        }
+          throw H.wrapException("Cannot compute signature for static tearoff.");
+        typeEvalMethod = isIntercepted ? H.BoundClosure_evalRecipeIntercepted : H.BoundClosure_evalRecipe;
+        return function(recipe, evalOnReceiver) {
+          return function() {
+            return evalOnReceiver(this, recipe);
+          };
+        }(functionType, typeEvalMethod);
+      }
       throw H.wrapException("Error in functionType of tearoff");
     },
     Closure_cspForwardCall: function(arity, isSuperCall, stubName, $function) {
@@ -837,9 +887,7 @@
           return t1.$add();
         $.Closure_functionCounter = t1 + 1;
         selfName = "self" + t1;
-        t1 = "return function(){var " + selfName + " = this.";
-        t2 = $.BoundClosure_selfFieldNameCache;
-        return new Function(t1 + H.S(t2 == null ? $.BoundClosure_selfFieldNameCache = H.BoundClosure_computeFieldNamed("self") : t2) + ";return " + selfName + "." + H.S(stubName) + "();}")();
+        return new Function("return function(){var " + selfName + " = this." + H.S(H.BoundClosure_selfFieldName()) + ";return " + selfName + "." + H.S(stubName) + "();}")();
       }
       $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity).join(",");
       t1 = $.Closure_functionCounter;
@@ -847,16 +895,14 @@
         return t1.$add();
       $.Closure_functionCounter = t1 + 1;
       $arguments += t1;
-      t1 = "return function(" + $arguments + "){return this.";
-      t2 = $.BoundClosure_selfFieldNameCache;
-      return new Function(t1 + H.S(t2 == null ? $.BoundClosure_selfFieldNameCache = H.BoundClosure_computeFieldNamed("self") : t2) + "." + H.S(stubName) + "(" + $arguments + ");}")();
+      return new Function("return function(" + $arguments + "){return this." + H.S(H.BoundClosure_selfFieldName()) + "." + H.S(stubName) + "(" + $arguments + ");}")();
     },
     Closure_cspForwardInterceptedCall: function(arity, isSuperCall, $name, $function) {
       var getSelf = H.BoundClosure_selfOf,
         getReceiver = H.BoundClosure_receiverOf;
       switch (isSuperCall ? -1 : arity) {
         case 0:
-          throw H.wrapException(H.RuntimeError$("Intercepted function with no arguments."));
+          throw H.wrapException(new H.RuntimeError("Intercepted function with no arguments."));
         case 1:
           return function(n, s, r) {
             return function() {
@@ -904,22 +950,20 @@
       }
     },
     Closure_forwardInterceptedCallTo: function(receiver, $function) {
-      var t2, stubName, arity, lookedUpFunction, t3, t4, $arguments,
-        t1 = $.BoundClosure_selfFieldNameCache;
-      if (t1 == null)
-        t1 = $.BoundClosure_selfFieldNameCache = H.BoundClosure_computeFieldNamed("self");
-      t2 = $.BoundClosure_receiverFieldNameCache;
-      if (t2 == null)
-        t2 = $.BoundClosure_receiverFieldNameCache = H.BoundClosure_computeFieldNamed("receiver");
+      var stubName, arity, lookedUpFunction, t1, t2, $arguments,
+        selfField = H.BoundClosure_selfFieldName(),
+        receiverField = $.BoundClosure_receiverFieldNameCache;
+      if (receiverField == null)
+        receiverField = $.BoundClosure_receiverFieldNameCache = H.BoundClosure_computeFieldNamed("receiver");
       stubName = $function.$stubName;
       arity = $function.length;
       lookedUpFunction = receiver[stubName];
-      t3 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
-      t4 = !t3 || arity >= 28;
-      if (t4)
-        return H.Closure_cspForwardInterceptedCall(arity, !t3, stubName, $function);
+      t1 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
+      t2 = !t1 || arity >= 28;
+      if (t2)
+        return H.Closure_cspForwardInterceptedCall(arity, !t1, stubName, $function);
       if (arity === 1) {
-        t1 = "return function(){return this." + H.S(t1) + "." + H.S(stubName) + "(this." + H.S(t2) + ");";
+        t1 = "return function(){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + receiverField + ");";
         t2 = $.Closure_functionCounter;
         if (typeof t2 !== "number")
           return t2.$add();
@@ -927,7 +971,7 @@
         return new Function(t1 + t2 + "}")();
       }
       $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity - 1).join(",");
-      t1 = "return function(" + $arguments + "){return this." + H.S(t1) + "." + H.S(stubName) + "(this." + H.S(t2) + ", " + $arguments + ");";
+      t1 = "return function(" + $arguments + "){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + receiverField + ", " + $arguments + ");";
       t2 = $.Closure_functionCounter;
       if (typeof t2 !== "number")
         return t2.$add();
@@ -937,530 +981,56 @@
     closureFromTearOff: function(receiver, functions, applyTrampolineIndex, reflectionInfo, isStatic, isIntercepted, $name) {
       return H.Closure_fromTearOff(receiver, functions, applyTrampolineIndex, reflectionInfo, !!isStatic, !!isIntercepted, $name);
     },
+    BoundClosure_evalRecipe: function(closure, recipe) {
+      return H._Universe_evalInEnvironment(init.typeUniverse, H.instanceType(closure._self), recipe);
+    },
+    BoundClosure_evalRecipeIntercepted: function(closure, recipe) {
+      return H._Universe_evalInEnvironment(init.typeUniverse, H.instanceType(closure._receiver), recipe);
+    },
     BoundClosure_selfOf: function(closure) {
       return closure._self;
     },
     BoundClosure_receiverOf: function(closure) {
       return closure._receiver;
     },
+    BoundClosure_selfFieldName: function() {
+      var t1 = $.BoundClosure_selfFieldNameCache;
+      return t1 == null ? $.BoundClosure_selfFieldNameCache = H.BoundClosure_computeFieldNamed("self") : t1;
+    },
     BoundClosure_computeFieldNamed: function(fieldName) {
       var t1, i, $name,
         template = new H.BoundClosure("self", "target", "receiver", "name"),
-        names = J.JSArray_markFixedList(Object.getOwnPropertyNames(template));
+        names = J.JSArray_markFixedList(Object.getOwnPropertyNames(template), type$.nullable_Object);
       for (t1 = names.length, i = 0; i < t1; ++i) {
         $name = names[i];
         if (template[$name] === fieldName)
           return $name;
       }
+      throw H.wrapException(P.ArgumentError$("Field name " + fieldName + " not found."));
     },
     boolConversionCheck: function(value) {
       if (value == null)
         H.assertThrow("boolean expression must not be null");
       return value;
     },
-    stringTypeCheck: function(value) {
-      if (value == null)
-        return value;
-      if (typeof value === "string")
-        return value;
-      throw H.wrapException(H.TypeErrorImplementation$(value, "String"));
-    },
-    stringTypeCast: function(value) {
-      if (typeof value === "string" || value == null)
-        return value;
-      throw H.wrapException(H.CastErrorImplementation$(value, "String"));
-    },
-    doubleTypeCheck: function(value) {
-      if (value == null)
-        return value;
-      if (typeof value === "number")
-        return value;
-      throw H.wrapException(H.TypeErrorImplementation$(value, "double"));
-    },
-    numTypeCheck: function(value) {
-      if (value == null)
-        return value;
-      if (typeof value === "number")
-        return value;
-      throw H.wrapException(H.TypeErrorImplementation$(value, "num"));
-    },
-    boolTypeCheck: function(value) {
-      if (value == null)
-        return value;
-      if (typeof value === "boolean")
-        return value;
-      throw H.wrapException(H.TypeErrorImplementation$(value, "bool"));
-    },
-    intTypeCheck: function(value) {
-      if (value == null)
-        return value;
-      if (typeof value === "number" && Math.floor(value) === value)
-        return value;
-      throw H.wrapException(H.TypeErrorImplementation$(value, "int"));
-    },
-    propertyTypeError: function(value, property) {
-      throw H.wrapException(H.TypeErrorImplementation$(value, H.unminifyOrTag(H.stringTypeCheck(property).substring(3))));
-    },
-    propertyTypeCastError: function(value, property) {
-      throw H.wrapException(H.CastErrorImplementation$(value, H.unminifyOrTag(H.stringTypeCheck(property).substring(3))));
-    },
-    interceptedTypeCheck: function(value, property) {
-      if (value == null)
-        return value;
-      if ((typeof value === "object" || typeof value === "function") && J.getInterceptor$(value)[property])
-        return value;
-      H.propertyTypeError(value, property);
-    },
-    interceptedTypeCast: function(value, property) {
-      var t1;
-      if (value != null)
-        t1 = (typeof value === "object" || typeof value === "function") && J.getInterceptor$(value)[property];
-      else
-        t1 = true;
-      if (t1)
-        return value;
-      H.propertyTypeCastError(value, property);
-    },
-    listTypeCheck: function(value) {
-      if (value == null)
-        return value;
-      if (!!J.getInterceptor$(value).$isList)
-        return value;
-      throw H.wrapException(H.TypeErrorImplementation$(value, "List<dynamic>"));
-    },
-    listSuperNativeTypeCheck: function(value, property) {
-      var t1;
-      if (value == null)
-        return value;
-      t1 = J.getInterceptor$(value);
-      if (!!t1.$isList)
-        return value;
-      if (t1[property])
-        return value;
-      H.propertyTypeError(value, property);
-    },
-    extractFunctionTypeObjectFromInternal: function(o) {
-      var signature;
-      if ("$signature" in o) {
-        signature = o.$signature;
-        if (typeof signature == "number")
-          return init.types[H.intTypeCheck(signature)];
-        else
-          return o.$signature();
-      }
-      return;
-    },
-    functionTypeTest: function(value, functionTypeRti) {
-      var functionTypeObject;
-      if (typeof value == "function")
-        return true;
-      functionTypeObject = H.extractFunctionTypeObjectFromInternal(J.getInterceptor$(value));
-      if (functionTypeObject == null)
-        return false;
-      return H._isFunctionSubtype(functionTypeObject, null, functionTypeRti, null);
-    },
-    functionTypeCheck: function(value, functionTypeRti) {
-      var $self, t1;
-      if (value == null)
-        return value;
-      if ($._inTypeAssertion)
-        return value;
-      $._inTypeAssertion = true;
-      try {
-        if (H.functionTypeTest(value, functionTypeRti))
-          return value;
-        $self = H.runtimeTypeToString(functionTypeRti);
-        t1 = H.TypeErrorImplementation$(value, $self);
-        throw H.wrapException(t1);
-      } finally {
-        $._inTypeAssertion = false;
-      }
-    },
-    futureOrCheck: function(o, futureOrRti) {
-      if (o != null && !H.checkSubtypeOfRuntimeType(o, futureOrRti))
-        H.throwExpression(H.TypeErrorImplementation$(o, H.runtimeTypeToString(futureOrRti)));
-      return o;
-    },
-    TypeErrorImplementation$: function(value, type) {
-      return new H.TypeErrorImplementation("TypeError: " + P.Error_safeToString(value) + ": type '" + H.S(H._typeDescription(value)) + "' is not a subtype of type '" + type + "'");
-    },
-    CastErrorImplementation$: function(value, type) {
-      return new H.CastErrorImplementation("CastError: " + P.Error_safeToString(value) + ": type '" + H.S(H._typeDescription(value)) + "' is not a subtype of type '" + type + "'");
-    },
-    _typeDescription: function(value) {
-      var functionTypeObject,
-        t1 = J.getInterceptor$(value);
-      if (!!t1.$isClosure) {
-        functionTypeObject = H.extractFunctionTypeObjectFromInternal(t1);
-        if (functionTypeObject != null)
-          return H.runtimeTypeToString(functionTypeObject);
-        return "Closure";
-      }
-      return H.Primitives_objectTypeName(value);
-    },
     assertThrow: function(message) {
       throw H.wrapException(new H._AssertionError(message));
     },
     throwCyclicInit: function(staticName) {
       throw H.wrapException(new P.CyclicInitializationError(staticName));
     },
-    RuntimeError$: function(message) {
-      return new H.RuntimeError(message);
-    },
     getIsolateAffinityTag: function($name) {
       return init.getIsolateTag($name);
     },
-    setRuntimeTypeInfo: function(target, rti) {
-      target.$ti = rti;
-      return target;
-    },
-    getRuntimeTypeInfo: function(target) {
-      if (target == null)
-        return;
-      return target.$ti;
-    },
-    getRuntimeTypeArguments: function(interceptor, object, substitutionName) {
-      return H.substitute(interceptor["$as" + H.S(substitutionName)], H.getRuntimeTypeInfo(object));
-    },
-    getRuntimeTypeArgumentIntercepted: function(interceptor, target, substitutionName, index) {
-      var $arguments = H.substitute(interceptor["$as" + H.S(substitutionName)], H.getRuntimeTypeInfo(target));
-      return $arguments == null ? null : $arguments[index];
-    },
-    getRuntimeTypeArgument: function(target, substitutionName, index) {
-      var $arguments = H.substitute(target["$as" + H.S(substitutionName)], H.getRuntimeTypeInfo(target));
-      return $arguments == null ? null : $arguments[index];
-    },
-    getTypeArgumentByIndex: function(target, index) {
-      var rti = H.getRuntimeTypeInfo(target);
-      return rti == null ? null : rti[index];
-    },
-    runtimeTypeToString: function(rti) {
-      return H._runtimeTypeToString(rti, null);
-    },
-    _runtimeTypeToString: function(rti, genericContext) {
-      var t1, t2;
-      if (rti == null)
-        return "dynamic";
-      if (rti === -1)
-        return "void";
-      if (typeof rti === "object" && rti !== null && rti.constructor === Array)
-        return H.unminifyOrTag(rti[0].name) + H._joinArguments(rti, 1, genericContext);
-      if (typeof rti == "function")
-        return H.unminifyOrTag(rti.name);
-      if (rti === -2)
-        return "dynamic";
-      if (typeof rti === "number") {
-        H.intTypeCheck(rti);
-        if (genericContext == null || rti < 0 || rti >= genericContext.length)
-          return "unexpected-generic-index:" + rti;
-        t1 = genericContext.length;
-        t2 = t1 - rti - 1;
-        if (t2 < 0 || t2 >= t1)
-          return H.ioore(genericContext, t2);
-        return H.S(genericContext[t2]);
-      }
-      if ('func' in rti)
-        return H._functionRtiToString(rti, genericContext);
-      if ('futureOr' in rti)
-        return "FutureOr<" + H._runtimeTypeToString("type" in rti ? rti.type : null, genericContext) + ">";
-      return "unknown-reified-type";
-    },
-    _functionRtiToString: function(rti, genericContext) {
-      var boundsRti, outerContextLength, offset, i, i0, typeParameters, typeSep, t1, t2, boundRti, returnTypeText, $arguments, argumentsText, sep, _i, argument, optionalArguments, namedArguments, t3, _s2_ = ", ";
-      if ("bounds" in rti) {
-        boundsRti = rti.bounds;
-        if (genericContext == null) {
-          genericContext = H.setRuntimeTypeInfo([], [P.String]);
-          outerContextLength = null;
-        } else
-          outerContextLength = genericContext.length;
-        offset = genericContext.length;
-        for (i = boundsRti.length, i0 = i; i0 > 0; --i0)
-          C.JSArray_methods.add$1(genericContext, "T" + (offset + i0));
-        for (typeParameters = "<", typeSep = "", i0 = 0; i0 < i; ++i0, typeSep = _s2_) {
-          typeParameters += typeSep;
-          t1 = genericContext.length;
-          t2 = t1 - i0 - 1;
-          if (t2 < 0)
-            return H.ioore(genericContext, t2);
-          typeParameters = C.JSString_methods.$add(typeParameters, genericContext[t2]);
-          boundRti = boundsRti[i0];
-          if (boundRti != null && boundRti !== P.Object)
-            typeParameters += " extends " + H._runtimeTypeToString(boundRti, genericContext);
-        }
-        typeParameters += ">";
-      } else {
-        typeParameters = "";
-        outerContextLength = null;
-      }
-      returnTypeText = !!rti.v ? "void" : H._runtimeTypeToString(rti.ret, genericContext);
-      if ("args" in rti) {
-        $arguments = rti.args;
-        for (t1 = $arguments.length, argumentsText = "", sep = "", _i = 0; _i < t1; ++_i, sep = _s2_) {
-          argument = $arguments[_i];
-          argumentsText = argumentsText + sep + H._runtimeTypeToString(argument, genericContext);
-        }
-      } else {
-        argumentsText = "";
-        sep = "";
-      }
-      if ("opt" in rti) {
-        optionalArguments = rti.opt;
-        argumentsText += sep + "[";
-        for (t1 = optionalArguments.length, sep = "", _i = 0; _i < t1; ++_i, sep = _s2_) {
-          argument = optionalArguments[_i];
-          argumentsText = argumentsText + sep + H._runtimeTypeToString(argument, genericContext);
-        }
-        argumentsText += "]";
-      }
-      if ("named" in rti) {
-        namedArguments = rti.named;
-        argumentsText += sep + "{";
-        for (t1 = H.extractKeys(namedArguments), t2 = t1.length, sep = "", _i = 0; _i < t2; ++_i, sep = _s2_) {
-          t3 = H.stringTypeCheck(t1[_i]);
-          argumentsText = argumentsText + sep + H._runtimeTypeToString(namedArguments[t3], genericContext) + (" " + H.S(t3));
-        }
-        argumentsText += "}";
-      }
-      if (outerContextLength != null)
-        genericContext.length = outerContextLength;
-      return typeParameters + "(" + argumentsText + ") => " + returnTypeText;
-    },
-    _joinArguments: function(types, startIndex, genericContext) {
-      var buffer, index, separator, allDynamic, t1, argument;
-      if (types == null)
-        return "";
-      buffer = new P.StringBuffer("");
-      for (index = startIndex, separator = "", allDynamic = true, t1 = ""; index < types.length; ++index, separator = ", ") {
-        buffer._contents = t1 + separator;
-        argument = types[index];
-        if (argument != null)
-          allDynamic = false;
-        t1 = buffer._contents += H._runtimeTypeToString(argument, genericContext);
-      }
-      return "<" + buffer.toString$0(0) + ">";
-    },
-    substitute: function(substitution, $arguments) {
-      if (substitution == null)
-        return $arguments;
-      substitution = substitution.apply(null, $arguments);
-      if (substitution == null)
-        return;
-      if (typeof substitution === "object" && substitution !== null && substitution.constructor === Array)
-        return substitution;
-      if (typeof substitution == "function")
-        return substitution.apply(null, $arguments);
-      return $arguments;
-    },
-    checkSubtype: function(object, isField, checks, asField) {
-      var $arguments, interceptor;
-      if (object == null)
-        return false;
-      $arguments = H.getRuntimeTypeInfo(object);
-      interceptor = J.getInterceptor$(object);
-      if (interceptor[isField] == null)
-        return false;
-      return H.areSubtypes(H.substitute(interceptor[asField], $arguments), null, checks, null);
-    },
-    subtypeCast: function(object, isField, checks, asField) {
-      if (object == null)
-        return object;
-      if (H.checkSubtype(object, isField, checks, asField))
-        return object;
-      throw H.wrapException(H.CastErrorImplementation$(object, function(str, names) {
-        return str.replace(/[^<,> ]+/g, function(m) {
-          return names[m] || m;
-        });
-      }(H.unminifyOrTag(isField.substring(3)) + H._joinArguments(checks, 0, null), init.mangledGlobalNames)));
-    },
-    assertSubtype: function(object, isField, checks, asField) {
-      if (object == null)
-        return object;
-      if (H.checkSubtype(object, isField, checks, asField))
-        return object;
-      throw H.wrapException(H.TypeErrorImplementation$(object, function(str, names) {
-        return str.replace(/[^<,> ]+/g, function(m) {
-          return names[m] || m;
-        });
-      }(H.unminifyOrTag(isField.substring(3)) + H._joinArguments(checks, 0, null), init.mangledGlobalNames)));
-    },
-    areSubtypes: function(s, sEnv, t, tEnv) {
-      var len, i;
-      if (t == null)
-        return true;
-      if (s == null) {
-        len = t.length;
-        for (i = 0; i < len; ++i)
-          if (!H._isSubtype(null, null, t[i], tEnv))
-            return false;
-        return true;
-      }
-      len = s.length;
-      for (i = 0; i < len; ++i)
-        if (!H._isSubtype(s[i], sEnv, t[i], tEnv))
-          return false;
-      return true;
-    },
-    computeSignature: function(signature, context, contextName) {
-      return signature.apply(context, H.substitute(J.getInterceptor$(context)["$as" + H.S(contextName)], H.getRuntimeTypeInfo(context)));
-    },
-    isSupertypeOfNullRecursive: function(type) {
-      var typeArgument;
-      if (typeof type === "number")
-        return false;
-      if ('futureOr' in type) {
-        typeArgument = "type" in type ? type.type : null;
-        return type == null || type.name === "Object" || type.name === "Null" || type === -1 || type === -2 || H.isSupertypeOfNullRecursive(typeArgument);
-      }
-      return false;
-    },
-    checkSubtypeOfRuntimeType: function(o, t) {
-      var type, rti;
-      if (o == null)
-        return t == null || t.name === "Object" || t.name === "Null" || t === -1 || t === -2 || H.isSupertypeOfNullRecursive(t);
-      if (t == null || t === -1 || t.name === "Object" || t === -2)
-        return true;
-      if (typeof t == "object") {
-        if ('futureOr' in t)
-          if (H.checkSubtypeOfRuntimeType(o, "type" in t ? t.type : null))
-            return true;
-        if ('func' in t)
-          return H.functionTypeTest(o, t);
-      }
-      type = J.getInterceptor$(o).constructor;
-      rti = H.getRuntimeTypeInfo(o);
-      if (rti != null) {
-        rti = rti.slice();
-        rti.splice(0, 0, type);
-        type = rti;
-      }
-      return H._isSubtype(type, null, t, null);
-    },
-    assertSubtypeOfRuntimeType: function(object, type) {
-      if (object != null && !H.checkSubtypeOfRuntimeType(object, type))
-        throw H.wrapException(H.TypeErrorImplementation$(object, H.runtimeTypeToString(type)));
-      return object;
-    },
-    _isSubtype: function(s, sEnv, t, tEnv) {
-      var t1, typeOfS, tTypeArgument, futureSubstitution, futureArguments, t2, typeOfT, typeOfTString, substitution, _null = null;
-      if (s === t)
-        return true;
-      if (t == null || t === -1 || t.name === "Object" || t === -2)
-        return true;
-      if (s === -2)
-        return true;
-      if (s == null || s === -1 || s.name === "Object" || s === -2) {
-        if (typeof t === "number")
-          return false;
-        if ('futureOr' in t)
-          return H._isSubtype(s, sEnv, "type" in t ? t.type : _null, tEnv);
-        return false;
-      }
-      if (typeof s === "number")
-        return H._isSubtype(sEnv[H.intTypeCheck(s)], sEnv, t, tEnv);
-      if (typeof t === "number")
-        return false;
-      if (s.name === "Null")
-        return true;
-      t1 = typeof s === "object" && s !== null && s.constructor === Array;
-      typeOfS = t1 ? s[0] : s;
-      if ('futureOr' in t) {
-        tTypeArgument = "type" in t ? t.type : _null;
-        if ('futureOr' in s)
-          return H._isSubtype("type" in s ? s.type : _null, sEnv, tTypeArgument, tEnv);
-        else if (H._isSubtype(s, sEnv, tTypeArgument, tEnv))
-          return true;
-        else {
-          if (!('$is' + "Future" in typeOfS.prototype))
-            return false;
-          futureSubstitution = typeOfS.prototype["$as" + "Future"];
-          futureArguments = H.substitute(futureSubstitution, t1 ? s.slice(1) : _null);
-          return H._isSubtype(typeof futureArguments === "object" && futureArguments !== null && futureArguments.constructor === Array ? futureArguments[0] : _null, sEnv, tTypeArgument, tEnv);
-        }
-      }
-      if ('func' in t)
-        return H._isFunctionSubtype(s, sEnv, t, tEnv);
-      if ('func' in s)
-        return t.name === "Function";
-      t2 = typeof t === "object" && t !== null && t.constructor === Array;
-      typeOfT = t2 ? t[0] : t;
-      if (typeOfT !== typeOfS) {
-        typeOfTString = typeOfT.name;
-        if (!('$is' + typeOfTString in typeOfS.prototype))
-          return false;
-        substitution = typeOfS.prototype["$as" + typeOfTString];
-      } else
-        substitution = _null;
-      if (!t2)
-        return true;
-      t1 = t1 ? s.slice(1) : _null;
-      t2 = t.slice(1);
-      return H.areSubtypes(H.substitute(substitution, t1), sEnv, t2, tEnv);
-    },
-    _isFunctionSubtype: function(s, sEnv, t, tEnv) {
-      var sBounds, tBounds, sParameterTypes, tParameterTypes, sOptionalParameterTypes, tOptionalParameterTypes, sParametersLen, tParametersLen, sOptionalParametersLen, tOptionalParametersLen, pos, tPos, sPos, sNamedParameters, tNamedParameters;
-      if (!('func' in s))
-        return false;
-      if ("bounds" in s) {
-        if (!("bounds" in t))
-          return false;
-        sBounds = s.bounds;
-        tBounds = t.bounds;
-        if (sBounds.length !== tBounds.length)
-          return false;
-        sEnv = sEnv == null ? sBounds : sBounds.concat(sEnv);
-        tEnv = tEnv == null ? tBounds : tBounds.concat(tEnv);
-      } else if ("bounds" in t)
-        return false;
-      if (!H._isSubtype(s.ret, sEnv, t.ret, tEnv))
-        return false;
-      sParameterTypes = s.args;
-      tParameterTypes = t.args;
-      sOptionalParameterTypes = s.opt;
-      tOptionalParameterTypes = t.opt;
-      sParametersLen = sParameterTypes != null ? sParameterTypes.length : 0;
-      tParametersLen = tParameterTypes != null ? tParameterTypes.length : 0;
-      sOptionalParametersLen = sOptionalParameterTypes != null ? sOptionalParameterTypes.length : 0;
-      tOptionalParametersLen = tOptionalParameterTypes != null ? tOptionalParameterTypes.length : 0;
-      if (sParametersLen > tParametersLen)
-        return false;
-      if (sParametersLen + sOptionalParametersLen < tParametersLen + tOptionalParametersLen)
-        return false;
-      for (pos = 0; pos < sParametersLen; ++pos)
-        if (!H._isSubtype(tParameterTypes[pos], tEnv, sParameterTypes[pos], sEnv))
-          return false;
-      for (tPos = pos, sPos = 0; tPos < tParametersLen; ++sPos, ++tPos)
-        if (!H._isSubtype(tParameterTypes[tPos], tEnv, sOptionalParameterTypes[sPos], sEnv))
-          return false;
-      for (tPos = 0; tPos < tOptionalParametersLen; ++sPos, ++tPos)
-        if (!H._isSubtype(tOptionalParameterTypes[tPos], tEnv, sOptionalParameterTypes[sPos], sEnv))
-          return false;
-      sNamedParameters = s.named;
-      tNamedParameters = t.named;
-      if (tNamedParameters == null)
-        return true;
-      if (sNamedParameters == null)
-        return false;
-      return H.namedParametersSubtypeCheck(sNamedParameters, sEnv, tNamedParameters, tEnv);
-    },
-    namedParametersSubtypeCheck: function(s, sEnv, t, tEnv) {
-      var t1, i, $name,
-        names = Object.getOwnPropertyNames(t);
-      for (t1 = names.length, i = 0; i < t1; ++i) {
-        $name = names[i];
-        if (!Object.hasOwnProperty.call(s, $name))
-          return false;
-        if (!H._isSubtype(t[$name], tEnv, s[$name], sEnv))
-          return false;
-      }
-      return true;
+    throwLateInitializationError: function($name) {
+      return H.throwExpression(new H.LateInitializationErrorImpl($name));
     },
     defineProperty: function(obj, property, value) {
       Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
     },
     lookupAndCacheInterceptor: function(obj) {
-      var interceptor, interceptorClass, mark, t1,
-        tag = H.stringTypeCheck($.getTagFunction.call$1(obj)),
+      var interceptor, interceptorClass, altTag, mark, t1,
+        tag = H._asStringS($.getTagFunction.call$1(obj)),
         record = $.dispatchRecordsForInstanceTags[tag];
       if (record != null) {
         Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
@@ -1471,21 +1041,22 @@
         return interceptor;
       interceptorClass = init.interceptorsByTag[tag];
       if (interceptorClass == null) {
-        tag = H.stringTypeCheck($.alternateTagFunction.call$2(obj, tag));
-        if (tag != null) {
-          record = $.dispatchRecordsForInstanceTags[tag];
+        altTag = H._asStringQ($.alternateTagFunction.call$2(obj, tag));
+        if (altTag != null) {
+          record = $.dispatchRecordsForInstanceTags[altTag];
           if (record != null) {
             Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
             return record.i;
           }
-          interceptor = $.interceptorsForUncacheableTags[tag];
+          interceptor = $.interceptorsForUncacheableTags[altTag];
           if (interceptor != null)
             return interceptor;
-          interceptorClass = init.interceptorsByTag[tag];
+          interceptorClass = init.interceptorsByTag[altTag];
+          tag = altTag;
         }
       }
       if (interceptorClass == null)
-        return;
+        return null;
       interceptor = interceptorClass.prototype;
       mark = tag[0];
       if (mark === "!") {
@@ -1616,7 +1187,7 @@
     JSInvocationMirror: function JSInvocationMirror(t0, t1, t2, t3, t4) {
       var _ = this;
       _._memberName = t0;
-      _._kind = t1;
+      _.__js_helper$_kind = t1;
       _._arguments = t2;
       _._namedArgumentNames = t3;
       _._typeArgumentCount = t4;
@@ -1636,24 +1207,24 @@
       _._receiver = t5;
     },
     NullError: function NullError(t0, t1) {
-      this._message = t0;
+      this.__js_helper$_message = t0;
       this._method = t1;
     },
     JsNoSuchMethodError: function JsNoSuchMethodError(t0, t1, t2) {
-      this._message = t0;
+      this.__js_helper$_message = t0;
       this._method = t1;
       this._receiver = t2;
     },
     UnknownJsTypeError: function UnknownJsTypeError(t0) {
-      this._message = t0;
+      this.__js_helper$_message = t0;
+    },
+    NullThrownFromJavaScriptException: function NullThrownFromJavaScriptException(t0) {
+      this._irritant = t0;
     },
     ExceptionAndStackTrace: function ExceptionAndStackTrace(t0, t1) {
       this.dartException = t0;
       this.stackTrace = t1;
     },
-    unwrapException_saveStackTrace: function unwrapException_saveStackTrace(t0) {
-      this.ex = t0;
-    },
     _StackTrace: function _StackTrace(t0) {
       this._exception = t0;
       this._trace = null;
@@ -1671,22 +1242,18 @@
       _._receiver = t2;
       _._name = t3;
     },
-    TypeErrorImplementation: function TypeErrorImplementation(t0) {
-      this.message = t0;
-    },
-    CastErrorImplementation: function CastErrorImplementation(t0) {
-      this.message = t0;
-    },
     RuntimeError: function RuntimeError(t0) {
       this.message = t0;
     },
     _AssertionError: function _AssertionError(t0) {
       this.message = t0;
     },
+    _Required: function _Required() {
+    },
     JsLinkedHashMap: function JsLinkedHashMap(t0) {
       var _ = this;
       _.__js_helper$_length = 0;
-      _._last = _._first = _._rest = _._nums = _._strings = null;
+      _._last = _._first = _.__js_helper$_rest = _._nums = _._strings = null;
       _._modifications = 0;
       _.$ti = t0;
     },
@@ -1749,8 +1316,1394 @@
     },
     _NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin: function _NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin() {
     },
-    extractKeys: function(victim) {
-      return J.JSArray_JSArray$markFixed(victim ? Object.keys(victim) : [], null);
+    Rti__getQuestionFromStar: function(universe, rti) {
+      var question = rti._precomputed1;
+      return question == null ? rti._precomputed1 = H._Universe__lookupQuestionRti(universe, rti._primary, true) : question;
+    },
+    Rti__getFutureFromFutureOr: function(universe, rti) {
+      var future = rti._precomputed1;
+      return future == null ? rti._precomputed1 = H._Universe__lookupInterfaceRti(universe, "Future", [rti._primary]) : future;
+    },
+    Rti__isUnionOfFunctionType: function(rti) {
+      var kind = rti._kind;
+      if (kind === 6 || kind === 7 || kind === 8)
+        return H.Rti__isUnionOfFunctionType(rti._primary);
+      return kind === 11 || kind === 12;
+    },
+    Rti__getCanonicalRecipe: function(rti) {
+      return rti._canonicalRecipe;
+    },
+    findType: function(recipe) {
+      return H._Universe_eval(init.typeUniverse, recipe, false);
+    },
+    _substitute: function(universe, rti, typeArguments, depth) {
+      var baseType, substitutedBaseType, interfaceTypeArguments, substitutedInterfaceTypeArguments, base, substitutedBase, $arguments, substitutedArguments, returnType, substitutedReturnType, functionParameters, substitutedFunctionParameters, bounds, substitutedBounds, index, argument,
+        kind = rti._kind;
+      switch (kind) {
+        case 5:
+        case 1:
+        case 2:
+        case 3:
+        case 4:
+          return rti;
+        case 6:
+          baseType = rti._primary;
+          substitutedBaseType = H._substitute(universe, baseType, typeArguments, depth);
+          if (substitutedBaseType === baseType)
+            return rti;
+          return H._Universe__lookupStarRti(universe, substitutedBaseType, true);
+        case 7:
+          baseType = rti._primary;
+          substitutedBaseType = H._substitute(universe, baseType, typeArguments, depth);
+          if (substitutedBaseType === baseType)
+            return rti;
+          return H._Universe__lookupQuestionRti(universe, substitutedBaseType, true);
+        case 8:
+          baseType = rti._primary;
+          substitutedBaseType = H._substitute(universe, baseType, typeArguments, depth);
+          if (substitutedBaseType === baseType)
+            return rti;
+          return H._Universe__lookupFutureOrRti(universe, substitutedBaseType, true);
+        case 9:
+          interfaceTypeArguments = rti._rest;
+          substitutedInterfaceTypeArguments = H._substituteArray(universe, interfaceTypeArguments, typeArguments, depth);
+          if (substitutedInterfaceTypeArguments === interfaceTypeArguments)
+            return rti;
+          return H._Universe__lookupInterfaceRti(universe, rti._primary, substitutedInterfaceTypeArguments);
+        case 10:
+          base = rti._primary;
+          substitutedBase = H._substitute(universe, base, typeArguments, depth);
+          $arguments = rti._rest;
+          substitutedArguments = H._substituteArray(universe, $arguments, typeArguments, depth);
+          if (substitutedBase === base && substitutedArguments === $arguments)
+            return rti;
+          return H._Universe__lookupBindingRti(universe, substitutedBase, substitutedArguments);
+        case 11:
+          returnType = rti._primary;
+          substitutedReturnType = H._substitute(universe, returnType, typeArguments, depth);
+          functionParameters = rti._rest;
+          substitutedFunctionParameters = H._substituteFunctionParameters(universe, functionParameters, typeArguments, depth);
+          if (substitutedReturnType === returnType && substitutedFunctionParameters === functionParameters)
+            return rti;
+          return H._Universe__lookupFunctionRti(universe, substitutedReturnType, substitutedFunctionParameters);
+        case 12:
+          bounds = rti._rest;
+          depth += bounds.length;
+          substitutedBounds = H._substituteArray(universe, bounds, typeArguments, depth);
+          base = rti._primary;
+          substitutedBase = H._substitute(universe, base, typeArguments, depth);
+          if (substitutedBounds === bounds && substitutedBase === base)
+            return rti;
+          return H._Universe__lookupGenericFunctionRti(universe, substitutedBase, substitutedBounds, true);
+        case 13:
+          index = rti._primary;
+          if (index < depth)
+            return rti;
+          argument = typeArguments[index - depth];
+          if (argument == null)
+            return rti;
+          return argument;
+        default:
+          throw H.wrapException(P.AssertionError$("Attempted to substitute unexpected RTI kind " + kind));
+      }
+    },
+    _substituteArray: function(universe, rtiArray, typeArguments, depth) {
+      var changed, i, rti, substitutedRti,
+        $length = rtiArray.length,
+        result = [];
+      for (changed = false, i = 0; i < $length; ++i) {
+        rti = rtiArray[i];
+        substitutedRti = H._substitute(universe, rti, typeArguments, depth);
+        if (substitutedRti !== rti)
+          changed = true;
+        result.push(substitutedRti);
+      }
+      return changed ? result : rtiArray;
+    },
+    _substituteNamed: function(universe, namedArray, typeArguments, depth) {
+      var changed, i, t1, t2, rti, substitutedRti,
+        $length = namedArray.length,
+        result = [];
+      for (changed = false, i = 0; i < $length; i += 3) {
+        t1 = namedArray[i];
+        t2 = namedArray[i + 1];
+        rti = namedArray[i + 2];
+        substitutedRti = H._substitute(universe, rti, typeArguments, depth);
+        if (substitutedRti !== rti)
+          changed = true;
+        result.push(t1);
+        result.push(t2);
+        result.push(substitutedRti);
+      }
+      return changed ? result : namedArray;
+    },
+    _substituteFunctionParameters: function(universe, functionParameters, typeArguments, depth) {
+      var result,
+        requiredPositional = functionParameters._requiredPositional,
+        substitutedRequiredPositional = H._substituteArray(universe, requiredPositional, typeArguments, depth),
+        optionalPositional = functionParameters._optionalPositional,
+        substitutedOptionalPositional = H._substituteArray(universe, optionalPositional, typeArguments, depth),
+        named = functionParameters._named,
+        substitutedNamed = H._substituteNamed(universe, named, typeArguments, depth);
+      if (substitutedRequiredPositional === requiredPositional && substitutedOptionalPositional === optionalPositional && substitutedNamed === named)
+        return functionParameters;
+      result = new H._FunctionParameters();
+      result._requiredPositional = substitutedRequiredPositional;
+      result._optionalPositional = substitutedOptionalPositional;
+      result._named = substitutedNamed;
+      return result;
+    },
+    setRuntimeTypeInfo: function(target, rti) {
+      target[init.arrayRti] = rti;
+      return target;
+    },
+    closureFunctionType: function(closure) {
+      var signature = closure.$signature;
+      if (signature != null) {
+        if (typeof signature == "number")
+          return H.getTypeFromTypesTable(signature);
+        return closure.$signature();
+      }
+      return null;
+    },
+    instanceOrFunctionType: function(object, testRti) {
+      var rti;
+      if (H.Rti__isUnionOfFunctionType(testRti))
+        if (object instanceof H.Closure) {
+          rti = H.closureFunctionType(object);
+          if (rti != null)
+            return rti;
+        }
+      return H.instanceType(object);
+    },
+    instanceType: function(object) {
+      var rti;
+      if (object instanceof P.Object) {
+        rti = object.$ti;
+        return rti != null ? rti : H._instanceTypeFromConstructor(object);
+      }
+      if (Array.isArray(object))
+        return H._arrayInstanceType(object);
+      return H._instanceTypeFromConstructor(J.getInterceptor$(object));
+    },
+    _arrayInstanceType: function(object) {
+      var rti = object[init.arrayRti],
+        defaultRti = type$.JSArray_dynamic;
+      if (rti == null)
+        return defaultRti;
+      if (rti.constructor !== defaultRti.constructor)
+        return defaultRti;
+      return rti;
+    },
+    _instanceType: function(object) {
+      var rti = object.$ti;
+      return rti != null ? rti : H._instanceTypeFromConstructor(object);
+    },
+    _instanceTypeFromConstructor: function(instance) {
+      var $constructor = instance.constructor,
+        probe = $constructor.$ccache;
+      if (probe != null)
+        return probe;
+      return H._instanceTypeFromConstructorMiss(instance, $constructor);
+    },
+    _instanceTypeFromConstructorMiss: function(instance, $constructor) {
+      var effectiveConstructor = instance instanceof H.Closure ? instance.__proto__.__proto__.constructor : $constructor,
+        rti = H._Universe_findErasedType(init.typeUniverse, effectiveConstructor.name);
+      $constructor.$ccache = rti;
+      return rti;
+    },
+    getTypeFromTypesTable: function(index) {
+      var table, type, rti;
+      H._asIntS(index);
+      table = init.types;
+      type = table[index];
+      if (typeof type == "string") {
+        rti = H._Universe_eval(init.typeUniverse, type, false);
+        table[index] = rti;
+        return rti;
+      }
+      return type;
+    },
+    _installSpecializedIsTest: function(object) {
+      var unstarred, isFn, testRti = this,
+        t1 = type$.Object;
+      if (testRti === t1)
+        return H._finishIsFn(testRti, object, H._isObject);
+      if (!H.isStrongTopType(testRti))
+        if (!(testRti === type$.legacy_Object))
+          t1 = testRti === t1;
+        else
+          t1 = true;
+      else
+        t1 = true;
+      if (t1)
+        return H._finishIsFn(testRti, object, H._isTop);
+      t1 = testRti._kind;
+      unstarred = t1 === 6 ? testRti._primary : testRti;
+      if (unstarred === type$.int)
+        isFn = H._isInt;
+      else if (unstarred === type$.double || unstarred === type$.num)
+        isFn = H._isNum;
+      else if (unstarred === type$.String)
+        isFn = H._isString;
+      else
+        isFn = unstarred === type$.bool ? H._isBool : null;
+      if (isFn != null)
+        return H._finishIsFn(testRti, object, isFn);
+      if (unstarred._kind === 9) {
+        t1 = unstarred._primary;
+        if (unstarred._rest.every(H.isTopType)) {
+          testRti._specializedTestResource = "$is" + t1;
+          return H._finishIsFn(testRti, object, H._isTestViaProperty);
+        }
+      } else if (t1 === 7)
+        return H._finishIsFn(testRti, object, H._generalNullableIsTestImplementation);
+      return H._finishIsFn(testRti, object, H._generalIsTestImplementation);
+    },
+    _finishIsFn: function(testRti, object, isFn) {
+      testRti._is = isFn;
+      return testRti._is(object);
+    },
+    _installSpecializedAsCheck: function(object) {
+      var t1, asFn, testRti = this;
+      if (!H.isStrongTopType(testRti))
+        if (!(testRti === type$.legacy_Object))
+          t1 = testRti === type$.Object;
+        else
+          t1 = true;
+      else
+        t1 = true;
+      if (t1)
+        asFn = H._asTop;
+      else if (testRti === type$.Object)
+        asFn = H._asObject;
+      else
+        asFn = H._generalNullableAsCheckImplementation;
+      testRti._as = asFn;
+      return testRti._as(object);
+    },
+    _nullIs: function(testRti) {
+      var t1,
+        kind = testRti._kind;
+      if (!H.isStrongTopType(testRti))
+        if (!(testRti === type$.legacy_Object))
+          if (!(testRti === type$.legacy_Never))
+            if (kind !== 7)
+              t1 = kind === 8 && H._nullIs(testRti._primary) || testRti === type$.Null || testRti === type$.JSNull;
+            else
+              t1 = true;
+          else
+            t1 = true;
+        else
+          t1 = true;
+      else
+        t1 = true;
+      return t1;
+    },
+    _generalIsTestImplementation: function(object) {
+      var testRti = this;
+      if (object == null)
+        return H._nullIs(testRti);
+      return H._isSubtype(init.typeUniverse, H.instanceOrFunctionType(object, testRti), null, testRti, null);
+    },
+    _generalNullableIsTestImplementation: function(object) {
+      if (object == null)
+        return true;
+      return this._primary._is(object);
+    },
+    _isTestViaProperty: function(object) {
+      var tag, testRti = this;
+      if (object == null)
+        return H._nullIs(testRti);
+      tag = testRti._specializedTestResource;
+      if (object instanceof P.Object)
+        return !!object[tag];
+      return !!J.getInterceptor$(object)[tag];
+    },
+    _generalAsCheckImplementation: function(object) {
+      var testRti = this;
+      if (object == null)
+        return object;
+      else if (testRti._is(object))
+        return object;
+      H._failedAsCheck(object, testRti);
+    },
+    _generalNullableAsCheckImplementation: function(object) {
+      var testRti = this;
+      if (object == null)
+        return object;
+      else if (testRti._is(object))
+        return object;
+      H._failedAsCheck(object, testRti);
+    },
+    _failedAsCheck: function(object, testRti) {
+      throw H.wrapException(H._TypeError$fromMessage(H._Error_compose(object, H.instanceOrFunctionType(object, testRti), H._rtiToString(testRti, null))));
+    },
+    _Error_compose: function(object, objectRti, checkedTypeDescription) {
+      var objectDescription = P.Error_safeToString(object),
+        objectTypeDescription = H._rtiToString(objectRti == null ? H.instanceType(object) : objectRti, null);
+      return objectDescription + ": type '" + H.S(objectTypeDescription) + "' is not a subtype of type '" + H.S(checkedTypeDescription) + "'";
+    },
+    _TypeError$fromMessage: function(message) {
+      return new H._TypeError("TypeError: " + message);
+    },
+    _TypeError__TypeError$forType: function(object, type) {
+      return new H._TypeError("TypeError: " + H._Error_compose(object, null, type));
+    },
+    _isObject: function(object) {
+      return object != null;
+    },
+    _asObject: function(object) {
+      return object;
+    },
+    _isTop: function(object) {
+      return true;
+    },
+    _asTop: function(object) {
+      return object;
+    },
+    _isBool: function(object) {
+      return true === object || false === object;
+    },
+    _asBool: function(object) {
+      if (true === object)
+        return true;
+      if (false === object)
+        return false;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "bool"));
+    },
+    _asBoolS: function(object) {
+      if (true === object)
+        return true;
+      if (false === object)
+        return false;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "bool"));
+    },
+    _asBoolQ: function(object) {
+      if (true === object)
+        return true;
+      if (false === object)
+        return false;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "bool?"));
+    },
+    _asDouble: function(object) {
+      if (typeof object == "number")
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "double"));
+    },
+    _asDoubleS: function(object) {
+      if (typeof object == "number")
+        return object;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "double"));
+    },
+    _asDoubleQ: function(object) {
+      if (typeof object == "number")
+        return object;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "double?"));
+    },
+    _isInt: function(object) {
+      return typeof object == "number" && Math.floor(object) === object;
+    },
+    _asInt: function(object) {
+      if (typeof object == "number" && Math.floor(object) === object)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "int"));
+    },
+    _asIntS: function(object) {
+      if (typeof object == "number" && Math.floor(object) === object)
+        return object;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "int"));
+    },
+    _asIntQ: function(object) {
+      if (typeof object == "number" && Math.floor(object) === object)
+        return object;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "int?"));
+    },
+    _isNum: function(object) {
+      return typeof object == "number";
+    },
+    _asNum: function(object) {
+      if (typeof object == "number")
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "num"));
+    },
+    _asNumS: function(object) {
+      if (typeof object == "number")
+        return object;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "num"));
+    },
+    _asNumQ: function(object) {
+      if (typeof object == "number")
+        return object;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "num?"));
+    },
+    _isString: function(object) {
+      return typeof object == "string";
+    },
+    _asString: function(object) {
+      if (typeof object == "string")
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "String"));
+    },
+    _asStringS: function(object) {
+      if (typeof object == "string")
+        return object;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "String"));
+    },
+    _asStringQ: function(object) {
+      if (typeof object == "string")
+        return object;
+      if (object == null)
+        return object;
+      throw H.wrapException(H._TypeError__TypeError$forType(object, "String?"));
+    },
+    _rtiArrayToString: function(array, genericContext) {
+      var s, sep, i;
+      for (s = "", sep = "", i = 0; i < array.length; ++i, sep = ", ")
+        s += C.JSString_methods.$add(sep, H._rtiToString(array[i], genericContext));
+      return s;
+    },
+    _functionRtiToString: function(functionType, genericContext, bounds) {
+      var boundsLength, outerContextLength, offset, i, t1, t2, t3, typeParametersText, typeSep, t4, t5, boundRti, kind, parameters, requiredPositional, requiredPositionalLength, optionalPositional, optionalPositionalLength, named, namedLength, returnTypeText, argumentsText, sep, _s2_ = ", ";
+      if (bounds != null) {
+        boundsLength = bounds.length;
+        if (genericContext == null) {
+          genericContext = H.setRuntimeTypeInfo([], type$.JSArray_String);
+          outerContextLength = null;
+        } else
+          outerContextLength = genericContext.length;
+        offset = genericContext.length;
+        for (i = boundsLength; i > 0; --i)
+          C.JSArray_methods.add$1(genericContext, "T" + (offset + i));
+        for (t1 = type$.nullable_Object, t2 = type$.legacy_Object, t3 = type$.Object, typeParametersText = "<", typeSep = "", i = 0; i < boundsLength; ++i, typeSep = _s2_) {
+          typeParametersText += typeSep;
+          t4 = genericContext.length;
+          t5 = t4 - 1 - i;
+          if (t5 < 0)
+            return H.ioore(genericContext, t5);
+          typeParametersText = C.JSString_methods.$add(typeParametersText, genericContext[t5]);
+          boundRti = bounds[i];
+          kind = boundRti._kind;
+          if (!(kind === 2 || kind === 3 || kind === 4 || kind === 5 || boundRti === t1))
+            if (!(boundRti === t2))
+              t4 = boundRti === t3;
+            else
+              t4 = true;
+          else
+            t4 = true;
+          if (!t4)
+            typeParametersText += C.JSString_methods.$add(" extends ", H._rtiToString(boundRti, genericContext));
+        }
+        typeParametersText += ">";
+      } else {
+        typeParametersText = "";
+        outerContextLength = null;
+      }
+      t1 = functionType._primary;
+      parameters = functionType._rest;
+      requiredPositional = parameters._requiredPositional;
+      requiredPositionalLength = requiredPositional.length;
+      optionalPositional = parameters._optionalPositional;
+      optionalPositionalLength = optionalPositional.length;
+      named = parameters._named;
+      namedLength = named.length;
+      returnTypeText = H._rtiToString(t1, genericContext);
+      for (argumentsText = "", sep = "", i = 0; i < requiredPositionalLength; ++i, sep = _s2_)
+        argumentsText += C.JSString_methods.$add(sep, H._rtiToString(requiredPositional[i], genericContext));
+      if (optionalPositionalLength > 0) {
+        argumentsText += sep + "[";
+        for (sep = "", i = 0; i < optionalPositionalLength; ++i, sep = _s2_)
+          argumentsText += C.JSString_methods.$add(sep, H._rtiToString(optionalPositional[i], genericContext));
+        argumentsText += "]";
+      }
+      if (namedLength > 0) {
+        argumentsText += sep + "{";
+        for (sep = "", i = 0; i < namedLength; i += 3, sep = _s2_) {
+          argumentsText += sep;
+          if (named[i + 1])
+            argumentsText += "required ";
+          argumentsText += J.$add$ansx(H._rtiToString(named[i + 2], genericContext), " ") + named[i];
+        }
+        argumentsText += "}";
+      }
+      if (outerContextLength != null) {
+        genericContext.toString;
+        genericContext.length = outerContextLength;
+      }
+      return typeParametersText + "(" + argumentsText + ") => " + H.S(returnTypeText);
+    },
+    _rtiToString: function(rti, genericContext) {
+      var s, questionArgument, argumentKind, $name, $arguments, t1, t2,
+        kind = rti._kind;
+      if (kind === 5)
+        return "erased";
+      if (kind === 2)
+        return "dynamic";
+      if (kind === 3)
+        return "void";
+      if (kind === 1)
+        return "Never";
+      if (kind === 4)
+        return "any";
+      if (kind === 6) {
+        s = H._rtiToString(rti._primary, genericContext);
+        return s;
+      }
+      if (kind === 7) {
+        questionArgument = rti._primary;
+        s = H._rtiToString(questionArgument, genericContext);
+        argumentKind = questionArgument._kind;
+        return J.$add$ansx(argumentKind === 11 || argumentKind === 12 ? C.JSString_methods.$add("(", s) + ")" : s, "?");
+      }
+      if (kind === 8)
+        return "FutureOr<" + H.S(H._rtiToString(rti._primary, genericContext)) + ">";
+      if (kind === 9) {
+        $name = H._unminifyOrTag(rti._primary);
+        $arguments = rti._rest;
+        return $arguments.length !== 0 ? $name + ("<" + H._rtiArrayToString($arguments, genericContext) + ">") : $name;
+      }
+      if (kind === 11)
+        return H._functionRtiToString(rti, genericContext, null);
+      if (kind === 12)
+        return H._functionRtiToString(rti._primary, genericContext, rti._rest);
+      if (kind === 13) {
+        genericContext.toString;
+        t1 = rti._primary;
+        t2 = genericContext.length;
+        t1 = t2 - 1 - t1;
+        if (t1 < 0 || t1 >= t2)
+          return H.ioore(genericContext, t1);
+        return genericContext[t1];
+      }
+      return "?";
+    },
+    _unminifyOrTag: function(rawClassName) {
+      var preserved = H.unmangleGlobalNameIfPreservedAnyways(rawClassName);
+      if (preserved != null)
+        return preserved;
+      return rawClassName;
+    },
+    _Universe_findRule: function(universe, targetType) {
+      var rule = universe.tR[targetType];
+      for (; typeof rule == "string";)
+        rule = universe.tR[rule];
+      return rule;
+    },
+    _Universe_findErasedType: function(universe, cls) {
+      var $length, erased, $arguments, i, $interface,
+        metadata = universe.eT,
+        probe = metadata[cls];
+      if (probe == null)
+        return H._Universe_eval(universe, cls, false);
+      else if (typeof probe == "number") {
+        $length = probe;
+        erased = H._Universe__lookupTerminalRti(universe, 5, "#");
+        $arguments = [];
+        for (i = 0; i < $length; ++i)
+          $arguments.push(erased);
+        $interface = H._Universe__lookupInterfaceRti(universe, cls, $arguments);
+        metadata[cls] = $interface;
+        return $interface;
+      } else
+        return probe;
+    },
+    _Universe_addRules: function(universe, rules) {
+      return H._Utils_objectAssign(universe.tR, rules);
+    },
+    _Universe_addErasedTypes: function(universe, types) {
+      return H._Utils_objectAssign(universe.eT, types);
+    },
+    _Universe_eval: function(universe, recipe, normalize) {
+      var rti,
+        cache = universe.eC,
+        probe = cache.get(recipe);
+      if (probe != null)
+        return probe;
+      rti = H._Parser_parse(H._Parser_create(universe, null, recipe, normalize));
+      cache.set(recipe, rti);
+      return rti;
+    },
+    _Universe_evalInEnvironment: function(universe, environment, recipe) {
+      var probe, rti,
+        cache = environment._evalCache;
+      if (cache == null)
+        cache = environment._evalCache = new Map();
+      probe = cache.get(recipe);
+      if (probe != null)
+        return probe;
+      rti = H._Parser_parse(H._Parser_create(universe, environment, recipe, true));
+      cache.set(recipe, rti);
+      return rti;
+    },
+    _Universe_bind: function(universe, environment, argumentsRti) {
+      var argumentsRecipe, probe, rti,
+        cache = environment._bindCache;
+      if (cache == null)
+        cache = environment._bindCache = new Map();
+      argumentsRecipe = argumentsRti._canonicalRecipe;
+      probe = cache.get(argumentsRecipe);
+      if (probe != null)
+        return probe;
+      rti = H._Universe__lookupBindingRti(universe, environment, argumentsRti._kind === 10 ? argumentsRti._rest : [argumentsRti]);
+      cache.set(argumentsRecipe, rti);
+      return rti;
+    },
+    _Universe__installTypeTests: function(universe, rti) {
+      rti._as = H._installSpecializedAsCheck;
+      rti._is = H._installSpecializedIsTest;
+      return rti;
+    },
+    _Universe__lookupTerminalRti: function(universe, kind, key) {
+      var rti, t1,
+        probe = universe.eC.get(key);
+      if (probe != null)
+        return probe;
+      rti = new H.Rti(null, null);
+      rti._kind = kind;
+      rti._canonicalRecipe = key;
+      t1 = H._Universe__installTypeTests(universe, rti);
+      universe.eC.set(key, t1);
+      return t1;
+    },
+    _Universe__lookupStarRti: function(universe, baseType, normalize) {
+      var t1,
+        key = baseType._canonicalRecipe + "*",
+        probe = universe.eC.get(key);
+      if (probe != null)
+        return probe;
+      t1 = H._Universe__createStarRti(universe, baseType, key, normalize);
+      universe.eC.set(key, t1);
+      return t1;
+    },
+    _Universe__createStarRti: function(universe, baseType, key, normalize) {
+      var baseKind, t1, rti;
+      if (normalize) {
+        baseKind = baseType._kind;
+        if (!H.isStrongTopType(baseType))
+          t1 = baseType === type$.Null || baseType === type$.JSNull || baseKind === 7 || baseKind === 6;
+        else
+          t1 = true;
+        if (t1)
+          return baseType;
+      }
+      rti = new H.Rti(null, null);
+      rti._kind = 6;
+      rti._primary = baseType;
+      rti._canonicalRecipe = key;
+      return H._Universe__installTypeTests(universe, rti);
+    },
+    _Universe__lookupQuestionRti: function(universe, baseType, normalize) {
+      var t1,
+        key = baseType._canonicalRecipe + "?",
+        probe = universe.eC.get(key);
+      if (probe != null)
+        return probe;
+      t1 = H._Universe__createQuestionRti(universe, baseType, key, normalize);
+      universe.eC.set(key, t1);
+      return t1;
+    },
+    _Universe__createQuestionRti: function(universe, baseType, key, normalize) {
+      var baseKind, t1, starArgument, rti;
+      if (normalize) {
+        baseKind = baseType._kind;
+        if (!H.isStrongTopType(baseType))
+          if (!(baseType === type$.Null || baseType === type$.JSNull))
+            if (baseKind !== 7)
+              t1 = baseKind === 8 && H.isNullable(baseType._primary);
+            else
+              t1 = true;
+          else
+            t1 = true;
+        else
+          t1 = true;
+        if (t1)
+          return baseType;
+        else if (baseKind === 1 || baseType === type$.legacy_Never)
+          return type$.Null;
+        else if (baseKind === 6) {
+          starArgument = baseType._primary;
+          if (starArgument._kind === 8 && H.isNullable(starArgument._primary))
+            return starArgument;
+          else
+            return H.Rti__getQuestionFromStar(universe, baseType);
+        }
+      }
+      rti = new H.Rti(null, null);
+      rti._kind = 7;
+      rti._primary = baseType;
+      rti._canonicalRecipe = key;
+      return H._Universe__installTypeTests(universe, rti);
+    },
+    _Universe__lookupFutureOrRti: function(universe, baseType, normalize) {
+      var t1,
+        key = baseType._canonicalRecipe + "/",
+        probe = universe.eC.get(key);
+      if (probe != null)
+        return probe;
+      t1 = H._Universe__createFutureOrRti(universe, baseType, key, normalize);
+      universe.eC.set(key, t1);
+      return t1;
+    },
+    _Universe__createFutureOrRti: function(universe, baseType, key, normalize) {
+      var t1, t2, rti;
+      if (normalize) {
+        t1 = baseType._kind;
+        if (!H.isStrongTopType(baseType))
+          if (!(baseType === type$.legacy_Object))
+            t2 = baseType === type$.Object;
+          else
+            t2 = true;
+        else
+          t2 = true;
+        if (t2 || baseType === type$.Object)
+          return baseType;
+        else if (t1 === 1)
+          return H._Universe__lookupInterfaceRti(universe, "Future", [baseType]);
+        else if (baseType === type$.Null || baseType === type$.JSNull)
+          return type$.nullable_Future_Null;
+      }
+      rti = new H.Rti(null, null);
+      rti._kind = 8;
+      rti._primary = baseType;
+      rti._canonicalRecipe = key;
+      return H._Universe__installTypeTests(universe, rti);
+    },
+    _Universe__lookupGenericFunctionParameterRti: function(universe, index) {
+      var rti, t1,
+        key = "" + index + "^",
+        probe = universe.eC.get(key);
+      if (probe != null)
+        return probe;
+      rti = new H.Rti(null, null);
+      rti._kind = 13;
+      rti._primary = index;
+      rti._canonicalRecipe = key;
+      t1 = H._Universe__installTypeTests(universe, rti);
+      universe.eC.set(key, t1);
+      return t1;
+    },
+    _Universe__canonicalRecipeJoin: function($arguments) {
+      var s, sep, i,
+        $length = $arguments.length;
+      for (s = "", sep = "", i = 0; i < $length; ++i, sep = ",")
+        s += sep + $arguments[i]._canonicalRecipe;
+      return s;
+    },
+    _Universe__canonicalRecipeJoinNamed: function($arguments) {
+      var s, sep, i, t1, nameSep, s0,
+        $length = $arguments.length;
+      for (s = "", sep = "", i = 0; i < $length; i += 3, sep = ",") {
+        t1 = $arguments[i];
+        nameSep = $arguments[i + 1] ? "!" : ":";
+        s0 = $arguments[i + 2]._canonicalRecipe;
+        s += sep + t1 + nameSep + s0;
+      }
+      return s;
+    },
+    _Universe__lookupInterfaceRti: function(universe, $name, $arguments) {
+      var probe, rti, t1,
+        s = $name;
+      if ($arguments.length !== 0)
+        s += "<" + H._Universe__canonicalRecipeJoin($arguments) + ">";
+      probe = universe.eC.get(s);
+      if (probe != null)
+        return probe;
+      rti = new H.Rti(null, null);
+      rti._kind = 9;
+      rti._primary = $name;
+      rti._rest = $arguments;
+      if ($arguments.length > 0)
+        rti._precomputed1 = $arguments[0];
+      rti._canonicalRecipe = s;
+      t1 = H._Universe__installTypeTests(universe, rti);
+      universe.eC.set(s, t1);
+      return t1;
+    },
+    _Universe__lookupBindingRti: function(universe, base, $arguments) {
+      var newBase, newArguments, key, probe, rti, t1;
+      if (base._kind === 10) {
+        newBase = base._primary;
+        newArguments = base._rest.concat($arguments);
+      } else {
+        newArguments = $arguments;
+        newBase = base;
+      }
+      key = newBase._canonicalRecipe + (";<" + H._Universe__canonicalRecipeJoin(newArguments) + ">");
+      probe = universe.eC.get(key);
+      if (probe != null)
+        return probe;
+      rti = new H.Rti(null, null);
+      rti._kind = 10;
+      rti._primary = newBase;
+      rti._rest = newArguments;
+      rti._canonicalRecipe = key;
+      t1 = H._Universe__installTypeTests(universe, rti);
+      universe.eC.set(key, t1);
+      return t1;
+    },
+    _Universe__lookupFunctionRti: function(universe, returnType, parameters) {
+      var sep, t1, key, probe, rti,
+        s = returnType._canonicalRecipe,
+        requiredPositional = parameters._requiredPositional,
+        requiredPositionalLength = requiredPositional.length,
+        optionalPositional = parameters._optionalPositional,
+        optionalPositionalLength = optionalPositional.length,
+        named = parameters._named,
+        namedLength = named.length,
+        recipe = "(" + H._Universe__canonicalRecipeJoin(requiredPositional);
+      if (optionalPositionalLength > 0) {
+        sep = requiredPositionalLength > 0 ? "," : "";
+        t1 = H._Universe__canonicalRecipeJoin(optionalPositional);
+        recipe += sep + "[" + t1 + "]";
+      }
+      if (namedLength > 0) {
+        sep = requiredPositionalLength > 0 ? "," : "";
+        t1 = H._Universe__canonicalRecipeJoinNamed(named);
+        recipe += sep + "{" + t1 + "}";
+      }
+      key = s + (recipe + ")");
+      probe = universe.eC.get(key);
+      if (probe != null)
+        return probe;
+      rti = new H.Rti(null, null);
+      rti._kind = 11;
+      rti._primary = returnType;
+      rti._rest = parameters;
+      rti._canonicalRecipe = key;
+      t1 = H._Universe__installTypeTests(universe, rti);
+      universe.eC.set(key, t1);
+      return t1;
+    },
+    _Universe__lookupGenericFunctionRti: function(universe, baseFunctionType, bounds, normalize) {
+      var t1,
+        key = baseFunctionType._canonicalRecipe + ("<" + H._Universe__canonicalRecipeJoin(bounds) + ">"),
+        probe = universe.eC.get(key);
+      if (probe != null)
+        return probe;
+      t1 = H._Universe__createGenericFunctionRti(universe, baseFunctionType, bounds, key, normalize);
+      universe.eC.set(key, t1);
+      return t1;
+    },
+    _Universe__createGenericFunctionRti: function(universe, baseFunctionType, bounds, key, normalize) {
+      var $length, typeArguments, count, i, bound, substitutedBase, substitutedBounds, rti;
+      if (normalize) {
+        $length = bounds.length;
+        typeArguments = new Array($length);
+        for (count = 0, i = 0; i < $length; ++i) {
+          bound = bounds[i];
+          if (bound._kind === 1) {
+            typeArguments[i] = bound;
+            ++count;
+          }
+        }
+        if (count > 0) {
+          substitutedBase = H._substitute(universe, baseFunctionType, typeArguments, 0);
+          substitutedBounds = H._substituteArray(universe, bounds, typeArguments, 0);
+          return H._Universe__lookupGenericFunctionRti(universe, substitutedBase, substitutedBounds, bounds !== substitutedBounds);
+        }
+      }
+      rti = new H.Rti(null, null);
+      rti._kind = 12;
+      rti._primary = baseFunctionType;
+      rti._rest = bounds;
+      rti._canonicalRecipe = key;
+      return H._Universe__installTypeTests(universe, rti);
+    },
+    _Parser_create: function(universe, environment, recipe, normalize) {
+      return {u: universe, e: environment, r: recipe, s: [], p: 0, n: normalize};
+    },
+    _Parser_parse: function(parser) {
+      var t1, i, ch, universe, array, head, base, u, parameters, optionalPositional, named, item,
+        source = parser.r,
+        stack = parser.s;
+      for (t1 = source.length, i = 0; i < t1;) {
+        ch = source.charCodeAt(i);
+        if (ch >= 48 && ch <= 57)
+          i = H._Parser_handleDigit(i + 1, ch, source, stack);
+        else if ((((ch | 32) >>> 0) - 97 & 65535) < 26 || ch === 95 || ch === 36)
+          i = H._Parser_handleIdentifier(parser, i, source, stack, false);
+        else if (ch === 46)
+          i = H._Parser_handleIdentifier(parser, i, source, stack, true);
+        else {
+          ++i;
+          switch (ch) {
+            case 44:
+              break;
+            case 58:
+              stack.push(false);
+              break;
+            case 33:
+              stack.push(true);
+              break;
+            case 59:
+              stack.push(H._Parser_toType(parser.u, parser.e, stack.pop()));
+              break;
+            case 94:
+              stack.push(H._Universe__lookupGenericFunctionParameterRti(parser.u, stack.pop()));
+              break;
+            case 35:
+              stack.push(H._Universe__lookupTerminalRti(parser.u, 5, "#"));
+              break;
+            case 64:
+              stack.push(H._Universe__lookupTerminalRti(parser.u, 2, "@"));
+              break;
+            case 126:
+              stack.push(H._Universe__lookupTerminalRti(parser.u, 3, "~"));
+              break;
+            case 60:
+              stack.push(parser.p);
+              parser.p = stack.length;
+              break;
+            case 62:
+              universe = parser.u;
+              array = stack.splice(parser.p);
+              H._Parser_toTypes(parser.u, parser.e, array);
+              parser.p = stack.pop();
+              head = stack.pop();
+              if (typeof head == "string")
+                stack.push(H._Universe__lookupInterfaceRti(universe, head, array));
+              else {
+                base = H._Parser_toType(universe, parser.e, head);
+                switch (base._kind) {
+                  case 11:
+                    stack.push(H._Universe__lookupGenericFunctionRti(universe, base, array, parser.n));
+                    break;
+                  default:
+                    stack.push(H._Universe__lookupBindingRti(universe, base, array));
+                    break;
+                }
+              }
+              break;
+            case 38:
+              H._Parser_handleExtendedOperations(parser, stack);
+              break;
+            case 42:
+              u = parser.u;
+              stack.push(H._Universe__lookupStarRti(u, H._Parser_toType(u, parser.e, stack.pop()), parser.n));
+              break;
+            case 63:
+              u = parser.u;
+              stack.push(H._Universe__lookupQuestionRti(u, H._Parser_toType(u, parser.e, stack.pop()), parser.n));
+              break;
+            case 47:
+              u = parser.u;
+              stack.push(H._Universe__lookupFutureOrRti(u, H._Parser_toType(u, parser.e, stack.pop()), parser.n));
+              break;
+            case 40:
+              stack.push(parser.p);
+              parser.p = stack.length;
+              break;
+            case 41:
+              universe = parser.u;
+              parameters = new H._FunctionParameters();
+              optionalPositional = universe.sEA;
+              named = universe.sEA;
+              head = stack.pop();
+              if (typeof head == "number")
+                switch (head) {
+                  case -1:
+                    optionalPositional = stack.pop();
+                    break;
+                  case -2:
+                    named = stack.pop();
+                    break;
+                  default:
+                    stack.push(head);
+                    break;
+                }
+              else
+                stack.push(head);
+              array = stack.splice(parser.p);
+              H._Parser_toTypes(parser.u, parser.e, array);
+              parser.p = stack.pop();
+              parameters._requiredPositional = array;
+              parameters._optionalPositional = optionalPositional;
+              parameters._named = named;
+              stack.push(H._Universe__lookupFunctionRti(universe, H._Parser_toType(universe, parser.e, stack.pop()), parameters));
+              break;
+            case 91:
+              stack.push(parser.p);
+              parser.p = stack.length;
+              break;
+            case 93:
+              array = stack.splice(parser.p);
+              H._Parser_toTypes(parser.u, parser.e, array);
+              parser.p = stack.pop();
+              stack.push(array);
+              stack.push(-1);
+              break;
+            case 123:
+              stack.push(parser.p);
+              parser.p = stack.length;
+              break;
+            case 125:
+              array = stack.splice(parser.p);
+              H._Parser_toTypesNamed(parser.u, parser.e, array);
+              parser.p = stack.pop();
+              stack.push(array);
+              stack.push(-2);
+              break;
+            default:
+              throw "Bad character " + ch;
+          }
+        }
+      }
+      item = stack.pop();
+      return H._Parser_toType(parser.u, parser.e, item);
+    },
+    _Parser_handleDigit: function(i, digit, source, stack) {
+      var t1, ch,
+        value = digit - 48;
+      for (t1 = source.length; i < t1; ++i) {
+        ch = source.charCodeAt(i);
+        if (!(ch >= 48 && ch <= 57))
+          break;
+        value = value * 10 + (ch - 48);
+      }
+      stack.push(value);
+      return i;
+    },
+    _Parser_handleIdentifier: function(parser, start, source, stack, hasPeriod) {
+      var t1, ch, t2, string, environment, recipe,
+        i = start + 1;
+      for (t1 = source.length; i < t1; ++i) {
+        ch = source.charCodeAt(i);
+        if (ch === 46) {
+          if (hasPeriod)
+            break;
+          hasPeriod = true;
+        } else {
+          if (!((((ch | 32) >>> 0) - 97 & 65535) < 26 || ch === 95 || ch === 36))
+            t2 = ch >= 48 && ch <= 57;
+          else
+            t2 = true;
+          if (!t2)
+            break;
+        }
+      }
+      string = source.substring(start, i);
+      if (hasPeriod) {
+        t1 = parser.u;
+        environment = parser.e;
+        if (environment._kind === 10)
+          environment = environment._primary;
+        recipe = H._Universe_findRule(t1, environment._primary)[string];
+        if (recipe == null)
+          H.throwExpression('No "' + string + '" in "' + H.Rti__getCanonicalRecipe(environment) + '"');
+        stack.push(H._Universe_evalInEnvironment(t1, environment, recipe));
+      } else
+        stack.push(string);
+      return i;
+    },
+    _Parser_handleExtendedOperations: function(parser, stack) {
+      var $top = stack.pop();
+      if (0 === $top) {
+        stack.push(H._Universe__lookupTerminalRti(parser.u, 1, "0&"));
+        return;
+      }
+      if (1 === $top) {
+        stack.push(H._Universe__lookupTerminalRti(parser.u, 4, "1&"));
+        return;
+      }
+      throw H.wrapException(P.AssertionError$("Unexpected extended operation " + H.S($top)));
+    },
+    _Parser_toType: function(universe, environment, item) {
+      if (typeof item == "string")
+        return H._Universe__lookupInterfaceRti(universe, item, universe.sEA);
+      else if (typeof item == "number")
+        return H._Parser_indexToType(universe, environment, item);
+      else
+        return item;
+    },
+    _Parser_toTypes: function(universe, environment, items) {
+      var i,
+        $length = items.length;
+      for (i = 0; i < $length; ++i)
+        items[i] = H._Parser_toType(universe, environment, items[i]);
+    },
+    _Parser_toTypesNamed: function(universe, environment, items) {
+      var i,
+        $length = items.length;
+      for (i = 2; i < $length; i += 3)
+        items[i] = H._Parser_toType(universe, environment, items[i]);
+    },
+    _Parser_indexToType: function(universe, environment, index) {
+      var typeArguments, len,
+        kind = environment._kind;
+      if (kind === 10) {
+        if (index === 0)
+          return environment._primary;
+        typeArguments = environment._rest;
+        len = typeArguments.length;
+        if (index <= len)
+          return typeArguments[index - 1];
+        index -= len;
+        environment = environment._primary;
+        kind = environment._kind;
+      } else if (index === 0)
+        return environment;
+      if (kind !== 9)
+        throw H.wrapException(P.AssertionError$("Indexed base must be an interface type"));
+      typeArguments = environment._rest;
+      if (index <= typeArguments.length)
+        return typeArguments[index - 1];
+      throw H.wrapException(P.AssertionError$("Bad index " + index + " for " + environment.toString$0(0)));
+    },
+    _isSubtype: function(universe, s, sEnv, t, tEnv) {
+      var t1, sKind, leftTypeVariable, tKind, sBounds, tBounds, sLength, i, sBound, tBound;
+      if (s === t)
+        return true;
+      if (!H.isStrongTopType(t))
+        if (!(t === type$.legacy_Object))
+          t1 = t === type$.Object;
+        else
+          t1 = true;
+      else
+        t1 = true;
+      if (t1)
+        return true;
+      sKind = s._kind;
+      if (sKind === 4)
+        return true;
+      if (H.isStrongTopType(s))
+        return false;
+      if (s._kind !== 1)
+        t1 = s === type$.Null || s === type$.JSNull;
+      else
+        t1 = true;
+      if (t1)
+        return true;
+      leftTypeVariable = sKind === 13;
+      if (leftTypeVariable)
+        if (H._isSubtype(universe, sEnv[s._primary], sEnv, t, tEnv))
+          return true;
+      tKind = t._kind;
+      if (sKind === 6)
+        return H._isSubtype(universe, s._primary, sEnv, t, tEnv);
+      if (tKind === 6) {
+        t1 = t._primary;
+        return H._isSubtype(universe, s, sEnv, t1, tEnv);
+      }
+      if (sKind === 8) {
+        if (!H._isSubtype(universe, s._primary, sEnv, t, tEnv))
+          return false;
+        return H._isSubtype(universe, H.Rti__getFutureFromFutureOr(universe, s), sEnv, t, tEnv);
+      }
+      if (sKind === 7) {
+        t1 = H._isSubtype(universe, s._primary, sEnv, t, tEnv);
+        return t1;
+      }
+      if (tKind === 8) {
+        if (H._isSubtype(universe, s, sEnv, t._primary, tEnv))
+          return true;
+        return H._isSubtype(universe, s, sEnv, H.Rti__getFutureFromFutureOr(universe, t), tEnv);
+      }
+      if (tKind === 7) {
+        t1 = H._isSubtype(universe, s, sEnv, t._primary, tEnv);
+        return t1;
+      }
+      if (leftTypeVariable)
+        return false;
+      t1 = sKind !== 11;
+      if ((!t1 || sKind === 12) && t === type$.Function)
+        return true;
+      if (tKind === 12) {
+        if (s === type$.JavaScriptFunction)
+          return true;
+        if (sKind !== 12)
+          return false;
+        sBounds = s._rest;
+        tBounds = t._rest;
+        sLength = sBounds.length;
+        if (sLength !== tBounds.length)
+          return false;
+        sEnv = sEnv == null ? sBounds : sBounds.concat(sEnv);
+        tEnv = tEnv == null ? tBounds : tBounds.concat(tEnv);
+        for (i = 0; i < sLength; ++i) {
+          sBound = sBounds[i];
+          tBound = tBounds[i];
+          if (!H._isSubtype(universe, sBound, sEnv, tBound, tEnv) || !H._isSubtype(universe, tBound, tEnv, sBound, sEnv))
+            return false;
+        }
+        return H._isFunctionSubtype(universe, s._primary, sEnv, t._primary, tEnv);
+      }
+      if (tKind === 11) {
+        if (s === type$.JavaScriptFunction)
+          return true;
+        if (t1)
+          return false;
+        return H._isFunctionSubtype(universe, s, sEnv, t, tEnv);
+      }
+      if (sKind === 9) {
+        if (tKind !== 9)
+          return false;
+        return H._isInterfaceSubtype(universe, s, sEnv, t, tEnv);
+      }
+      return false;
+    },
+    _isFunctionSubtype: function(universe, s, sEnv, t, tEnv) {
+      var sParameters, tParameters, sRequiredPositional, tRequiredPositional, sRequiredPositionalLength, tRequiredPositionalLength, requiredPositionalDelta, sOptionalPositional, tOptionalPositional, sOptionalPositionalLength, tOptionalPositionalLength, i, t1, sNamed, tNamed, sNamedLength, tNamedLength, sIndex, tIndex, tName, sName;
+      if (!H._isSubtype(universe, s._primary, sEnv, t._primary, tEnv))
+        return false;
+      sParameters = s._rest;
+      tParameters = t._rest;
+      sRequiredPositional = sParameters._requiredPositional;
+      tRequiredPositional = tParameters._requiredPositional;
+      sRequiredPositionalLength = sRequiredPositional.length;
+      tRequiredPositionalLength = tRequiredPositional.length;
+      if (sRequiredPositionalLength > tRequiredPositionalLength)
+        return false;
+      requiredPositionalDelta = tRequiredPositionalLength - sRequiredPositionalLength;
+      sOptionalPositional = sParameters._optionalPositional;
+      tOptionalPositional = tParameters._optionalPositional;
+      sOptionalPositionalLength = sOptionalPositional.length;
+      tOptionalPositionalLength = tOptionalPositional.length;
+      if (sRequiredPositionalLength + sOptionalPositionalLength < tRequiredPositionalLength + tOptionalPositionalLength)
+        return false;
+      for (i = 0; i < sRequiredPositionalLength; ++i) {
+        t1 = sRequiredPositional[i];
+        if (!H._isSubtype(universe, tRequiredPositional[i], tEnv, t1, sEnv))
+          return false;
+      }
+      for (i = 0; i < requiredPositionalDelta; ++i) {
+        t1 = sOptionalPositional[i];
+        if (!H._isSubtype(universe, tRequiredPositional[sRequiredPositionalLength + i], tEnv, t1, sEnv))
+          return false;
+      }
+      for (i = 0; i < tOptionalPositionalLength; ++i) {
+        t1 = sOptionalPositional[requiredPositionalDelta + i];
+        if (!H._isSubtype(universe, tOptionalPositional[i], tEnv, t1, sEnv))
+          return false;
+      }
+      sNamed = sParameters._named;
+      tNamed = tParameters._named;
+      sNamedLength = sNamed.length;
+      tNamedLength = tNamed.length;
+      for (sIndex = 0, tIndex = 0; tIndex < tNamedLength; tIndex += 3) {
+        tName = tNamed[tIndex];
+        for (; true;) {
+          if (sIndex >= sNamedLength)
+            return false;
+          sName = sNamed[sIndex];
+          sIndex += 3;
+          if (tName < sName)
+            return false;
+          if (sName < tName)
+            continue;
+          t1 = sNamed[sIndex - 1];
+          if (!H._isSubtype(universe, tNamed[tIndex + 2], tEnv, t1, sEnv))
+            return false;
+          break;
+        }
+      }
+      return true;
+    },
+    _isInterfaceSubtype: function(universe, s, sEnv, t, tEnv) {
+      var sArgs, tArgs, $length, i, t1, t2, rule, supertypeArgs,
+        sName = s._primary,
+        tName = t._primary;
+      if (sName === tName) {
+        sArgs = s._rest;
+        tArgs = t._rest;
+        $length = sArgs.length;
+        for (i = 0; i < $length; ++i) {
+          t1 = sArgs[i];
+          t2 = tArgs[i];
+          if (!H._isSubtype(universe, t1, sEnv, t2, tEnv))
+            return false;
+        }
+        return true;
+      }
+      if (t === type$.Object)
+        return true;
+      rule = H._Universe_findRule(universe, sName);
+      if (rule == null)
+        return false;
+      supertypeArgs = rule[tName];
+      if (supertypeArgs == null)
+        return false;
+      $length = supertypeArgs.length;
+      tArgs = t._rest;
+      for (i = 0; i < $length; ++i)
+        if (!H._isSubtype(universe, H._Universe_evalInEnvironment(universe, s, supertypeArgs[i]), sEnv, tArgs[i], tEnv))
+          return false;
+      return true;
+    },
+    isNullable: function(t) {
+      var t1,
+        kind = t._kind;
+      if (!(t === type$.Null || t === type$.JSNull))
+        if (!H.isStrongTopType(t))
+          if (kind !== 7)
+            if (!(kind === 6 && H.isNullable(t._primary)))
+              t1 = kind === 8 && H.isNullable(t._primary);
+            else
+              t1 = true;
+          else
+            t1 = true;
+        else
+          t1 = true;
+      else
+        t1 = true;
+      return t1;
+    },
+    isTopType: function(t) {
+      var t1;
+      if (!H.isStrongTopType(t))
+        if (!(t === type$.legacy_Object))
+          t1 = t === type$.Object;
+        else
+          t1 = true;
+      else
+        t1 = true;
+      return t1;
+    },
+    isStrongTopType: function(t) {
+      var kind = t._kind;
+      return kind === 2 || kind === 3 || kind === 4 || kind === 5 || t === type$.nullable_Object;
+    },
+    _Utils_objectAssign: function(o, other) {
+      var i, key,
+        keys = Object.keys(other),
+        $length = keys.length;
+      for (i = 0; i < $length; ++i) {
+        key = keys[i];
+        o[key] = other[key];
+      }
+    },
+    Rti: function Rti(t0, t1) {
+      var _ = this;
+      _._as = t0;
+      _._is = t1;
+      _._cachedRuntimeType = _._specializedTestResource = _._precomputed1 = null;
+      _._kind = 0;
+      _._canonicalRecipe = _._bindCache = _._evalCache = _._rest = _._primary = null;
+    },
+    _FunctionParameters: function _FunctionParameters() {
+      this._named = this._optionalPositional = this._requiredPositional = null;
+    },
+    _Error: function _Error() {
+    },
+    _TypeError: function _TypeError(t0) {
+      this.__rti$_message = t0;
     },
     unmangleGlobalNameIfPreservedAnyways: function($name) {
       return init.mangledGlobalNames[$name];
@@ -1781,7 +2734,7 @@
           throw H.wrapException(P.UnimplementedError$("Return interceptor for " + H.S(proto(object, record))));
       }
       $constructor = object.constructor;
-      interceptor = $constructor == null ? null : $constructor[$.$get$JS_INTEROP_INTERCEPTOR_TAG()];
+      interceptor = $constructor == null ? null : $constructor[J.JS_INTEROP_INTERCEPTOR_TAG()];
       if (interceptor != null)
         return interceptor;
       interceptor = H.lookupAndCacheInterceptor(object);
@@ -1795,15 +2748,21 @@
       if (proto === Object.prototype)
         return C.PlainJavaScriptObject_methods;
       if (typeof $constructor == "function") {
-        Object.defineProperty($constructor, $.$get$JS_INTEROP_INTERCEPTOR_TAG(), {value: C.UnknownJavaScriptObject_methods, enumerable: false, writable: true, configurable: true});
+        Object.defineProperty($constructor, J.JS_INTEROP_INTERCEPTOR_TAG(), {value: C.UnknownJavaScriptObject_methods, enumerable: false, writable: true, configurable: true});
         return C.UnknownJavaScriptObject_methods;
       }
       return C.UnknownJavaScriptObject_methods;
     },
-    JSArray_JSArray$markFixed: function(allocation, $E) {
-      return J.JSArray_markFixedList(H.setRuntimeTypeInfo(allocation, [$E]));
+    JS_INTEROP_INTERCEPTOR_TAG: function() {
+      var t1 = $._JS_INTEROP_INTERCEPTOR_TAG;
+      return t1 == null ? $._JS_INTEROP_INTERCEPTOR_TAG = init.getIsolateTag("_$dart_js") : t1;
     },
-    JSArray_markFixedList: function(list) {
+    JSArray_JSArray$fixed: function($length, $E) {
+      if ($length > 4294967295)
+        throw H.wrapException(P.RangeError$range($length, 0, 4294967295, "length", null));
+      return J.JSArray_markFixedList(H.setRuntimeTypeInfo(new Array($length), $E._eval$1("JSArray<0>")), $E);
+    },
+    JSArray_markFixedList: function(list, $T) {
       list.fixed$length = Array;
       return list;
     },
@@ -1981,15 +2940,15 @@
         return receiver - a0;
       return J.getInterceptor$n(receiver).$sub(receiver, a0);
     },
-    _removeEventListener$3$x: function(receiver, a0, a1, a2) {
-      return J.getInterceptor$x(receiver)._removeEventListener$3(receiver, a0, a1, a2);
-    },
     addEventListener$3$x: function(receiver, a0, a1, a2) {
       return J.getInterceptor$x(receiver).addEventListener$3(receiver, a0, a1, a2);
     },
     noSuchMethod$1$: function(receiver, a0) {
       return J.getInterceptor$(receiver).noSuchMethod$1(receiver, a0);
     },
+    startsWith$1$s: function(receiver, a0) {
+      return J.getInterceptor$s(receiver).startsWith$1(receiver, a0);
+    },
     toString$0$: function(receiver) {
       return J.getInterceptor$(receiver).toString$0(receiver);
     },
@@ -2046,13 +3005,13 @@
       return P.async__AsyncRun__scheduleImmediateWithTimer$closure();
     },
     _AsyncRun__scheduleImmediateJsOverride: function(callback) {
-      self.scheduleImmediate(H.convertDartClosureToJS(new P._AsyncRun__scheduleImmediateJsOverride_internalCallback(H.functionTypeCheck(callback, {func: 1, ret: -1})), 0));
+      self.scheduleImmediate(H.convertDartClosureToJS(new P._AsyncRun__scheduleImmediateJsOverride_internalCallback(type$.void_Function._as(callback)), 0));
     },
     _AsyncRun__scheduleImmediateWithSetImmediate: function(callback) {
-      self.setImmediate(H.convertDartClosureToJS(new P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback(H.functionTypeCheck(callback, {func: 1, ret: -1})), 0));
+      self.setImmediate(H.convertDartClosureToJS(new P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback(type$.void_Function._as(callback)), 0));
     },
     _AsyncRun__scheduleImmediateWithTimer: function(callback) {
-      P.Timer__createTimer(C.Duration_0, H.functionTypeCheck(callback, {func: 1, ret: -1}));
+      P.Timer__createTimer(C.Duration_0, type$.void_Function._as(callback));
     },
     Timer__createTimer: function(duration, callback) {
       var milliseconds = C.JSInt_methods._tdivFast$1(duration._duration, 1000);
@@ -2064,7 +3023,7 @@
       return t1;
     },
     _makeAsyncAwaitCompleter: function($T) {
-      return new P._AsyncAwaitCompleter(new P._Future($.Zone__current, [$T]), [$T]);
+      return new P._AsyncAwaitCompleter(new P._Future($.Zone__current, $T._eval$1("_Future<0>")), $T._eval$1("_AsyncAwaitCompleter<0>"));
     },
     _asyncStartSync: function(bodyFunction, completer) {
       bodyFunction.call$2(0, null);
@@ -2081,20 +3040,21 @@
       completer.completeError$2(H.unwrapException(object), H.getTraceFromException(object));
     },
     _awaitOnObject: function(object, bodyFunction) {
-      var future, _null = null,
+      var t1, future,
         thenCallback = new P._awaitOnObject_closure(bodyFunction),
-        errorCallback = new P._awaitOnObject_closure0(bodyFunction),
-        t1 = J.getInterceptor$(object);
-      if (!!t1.$is_Future)
-        object._thenAwait$1$2(thenCallback, errorCallback, _null);
-      else if (!!t1.$isFuture)
-        object.then$1$2$onError(thenCallback, errorCallback, _null);
+        errorCallback = new P._awaitOnObject_closure0(bodyFunction);
+      if (object instanceof P._Future)
+        object._thenAwait$1$2(thenCallback, errorCallback, type$.dynamic);
       else {
-        future = new P._Future($.Zone__current, [null]);
-        H.assertSubtypeOfRuntimeType(object, null);
-        future._state = 4;
-        future._resultOrListeners = object;
-        future._thenAwait$1$2(thenCallback, _null, _null);
+        t1 = type$.dynamic;
+        if (type$.Future_dynamic._is(object))
+          object.then$1$2$onError(thenCallback, errorCallback, t1);
+        else {
+          future = new P._Future($.Zone__current, type$._Future_dynamic);
+          future._state = 4;
+          future._resultOrListeners = object;
+          future._thenAwait$1$2(thenCallback, errorCallback, t1);
+        }
       }
     },
     _wrapJsFunctionForAsync: function($function) {
@@ -2110,20 +3070,13 @@
             }
         };
       }($function, 1);
-      return $.Zone__current.registerBinaryCallback$3$1(new P._wrapJsFunctionForAsync_closure($protected), P.Null, P.int, null);
-    },
-    _Future$zoneValue: function(value, _zone, $T) {
-      var t1 = new P._Future(_zone, [$T]);
-      H.assertSubtypeOfRuntimeType(value, $T);
-      t1._state = 4;
-      t1._resultOrListeners = value;
-      return t1;
+      return $.Zone__current.registerBinaryCallback$3$1(new P._wrapJsFunctionForAsync_closure($protected), type$.void, type$.int, type$.dynamic);
     },
     _Future__chainForeignFuture: function(source, target) {
       var e, s, exception;
       target._state = 1;
       try {
-        source.then$1$2$onError(new P._Future__chainForeignFuture_closure(target), new P._Future__chainForeignFuture_closure0(target), P.Null);
+        source.then$1$2$onError(new P._Future__chainForeignFuture_closure(target), new P._Future__chainForeignFuture_closure0(target), type$.Null);
       } catch (exception) {
         e = H.unwrapException(exception);
         s = H.getTraceFromException(exception);
@@ -2131,59 +3084,62 @@
       }
     },
     _Future__chainCoreFuture: function(source, target) {
-      var t1, listeners;
-      for (; t1 = source._state, t1 === 2;)
-        source = H.interceptedTypeCheck(source._resultOrListeners, "$is_Future");
-      if (t1 >= 4) {
+      var t1, t2, listeners;
+      for (t1 = type$._Future_dynamic; t2 = source._state, t2 === 2;)
+        source = t1._as(source._resultOrListeners);
+      if (t2 >= 4) {
         listeners = target._removeListeners$0();
         target._state = source._state;
         target._resultOrListeners = source._resultOrListeners;
         P._Future__propagateToListeners(target, listeners);
       } else {
-        listeners = H.interceptedTypeCheck(target._resultOrListeners, "$is_FutureListener");
+        listeners = type$.nullable__FutureListener_dynamic_dynamic._as(target._resultOrListeners);
         target._state = 2;
         target._resultOrListeners = source;
         source._prependListeners$1(listeners);
       }
     },
     _Future__propagateToListeners: function(source, listeners) {
-      var _box_0, hasError, asyncError, listeners0, sourceResult, t2, t3, zone, t4, oldZone, current, result, _null = null, _box_1 = {},
+      var t2, t3, t4, _box_0, hasError, asyncError, nextListener, nextListener0, t5, sourceResult, t6, t7, zone, oldZone, result, current, _null = null, _box_1 = {},
         t1 = _box_1.source = source;
-      for (; true;) {
+      for (t2 = type$.AsyncError, t3 = type$.nullable__FutureListener_dynamic_dynamic, t4 = type$.Future_dynamic; true;) {
         _box_0 = {};
         hasError = t1._state === 8;
         if (listeners == null) {
           if (hasError) {
-            asyncError = H.interceptedTypeCheck(t1._resultOrListeners, "$isAsyncError");
+            asyncError = t2._as(t1._resultOrListeners);
             P._rootHandleUncaughtError(_null, _null, t1._zone, asyncError.error, asyncError.stackTrace);
           }
           return;
         }
-        for (; listeners0 = listeners._nextListener, listeners0 != null; listeners = listeners0) {
-          listeners._nextListener = null;
-          P._Future__propagateToListeners(_box_1.source, listeners);
+        _box_0.listener = listeners;
+        nextListener = listeners._nextListener;
+        for (t1 = listeners; nextListener != null; t1 = nextListener, nextListener = nextListener0) {
+          t1._nextListener = null;
+          P._Future__propagateToListeners(_box_1.source, t1);
+          _box_0.listener = nextListener;
+          nextListener0 = nextListener._nextListener;
         }
-        t1 = _box_1.source;
-        sourceResult = t1._resultOrListeners;
+        t5 = _box_1.source;
+        sourceResult = t5._resultOrListeners;
         _box_0.listenerHasError = hasError;
         _box_0.listenerValueOrError = sourceResult;
-        t2 = !hasError;
-        if (t2) {
-          t3 = listeners.state;
-          t3 = (t3 & 1) !== 0 || (t3 & 15) === 8;
+        t6 = !hasError;
+        if (t6) {
+          t7 = t1.state;
+          t7 = (t7 & 1) !== 0 || (t7 & 15) === 8;
         } else
-          t3 = true;
-        if (t3) {
-          t3 = listeners.result;
-          zone = t3._zone;
+          t7 = true;
+        if (t7) {
+          zone = t1.result._zone;
           if (hasError) {
-            t4 = t1._zone === zone;
-            t4 = !(t4 || t4);
+            t7 = t5._zone === zone;
+            t7 = !(t7 || t7);
           } else
-            t4 = false;
-          if (t4) {
-            H.interceptedTypeCheck(sourceResult, "$isAsyncError");
-            P._rootHandleUncaughtError(_null, _null, t1._zone, sourceResult.error, sourceResult.stackTrace);
+            t7 = false;
+          if (t7) {
+            t2._as(sourceResult);
+            P._rootHandleUncaughtError(_null, _null, t5._zone, sourceResult.error, sourceResult.stackTrace);
             return;
           }
           oldZone = $.Zone__current;
@@ -2191,66 +3147,69 @@
             $.Zone__current = zone;
           else
             oldZone = _null;
-          t1 = listeners.state;
+          t1 = t1.state;
           if ((t1 & 15) === 8)
-            new P._Future__propagateToListeners_handleWhenCompleteCallback(_box_1, _box_0, listeners, hasError).call$0();
-          else if (t2) {
+            new P._Future__propagateToListeners_handleWhenCompleteCallback(_box_0, _box_1, hasError).call$0();
+          else if (t6) {
             if ((t1 & 1) !== 0)
-              new P._Future__propagateToListeners_handleValueCallback(_box_0, listeners, sourceResult).call$0();
+              new P._Future__propagateToListeners_handleValueCallback(_box_0, sourceResult).call$0();
           } else if ((t1 & 2) !== 0)
-            new P._Future__propagateToListeners_handleError(_box_1, _box_0, listeners).call$0();
+            new P._Future__propagateToListeners_handleError(_box_1, _box_0).call$0();
           if (oldZone != null)
             $.Zone__current = oldZone;
           t1 = _box_0.listenerValueOrError;
-          if (!!J.getInterceptor$(t1).$isFuture) {
+          if (t4._is(t1)) {
+            result = _box_0.listener.result;
             if (t1._state >= 4) {
-              current = H.interceptedTypeCheck(t3._resultOrListeners, "$is_FutureListener");
-              t3._resultOrListeners = null;
-              listeners = t3._reverseListeners$1(current);
-              t3._state = t1._state;
-              t3._resultOrListeners = t1._resultOrListeners;
+              current = t3._as(result._resultOrListeners);
+              result._resultOrListeners = null;
+              listeners = result._reverseListeners$1(current);
+              result._state = t1._state;
+              result._resultOrListeners = t1._resultOrListeners;
               _box_1.source = t1;
               continue;
             } else
-              P._Future__chainCoreFuture(t1, t3);
+              P._Future__chainCoreFuture(t1, result);
             return;
           }
         }
-        result = listeners.result;
-        current = H.interceptedTypeCheck(result._resultOrListeners, "$is_FutureListener");
+        result = _box_0.listener.result;
+        current = t3._as(result._resultOrListeners);
         result._resultOrListeners = null;
         listeners = result._reverseListeners$1(current);
         t1 = _box_0.listenerHasError;
-        t2 = _box_0.listenerValueOrError;
+        t5 = _box_0.listenerValueOrError;
         if (!t1) {
-          H.assertSubtypeOfRuntimeType(t2, H.getTypeArgumentByIndex(result, 0));
+          result.$ti._precomputed1._as(t5);
           result._state = 4;
-          result._resultOrListeners = t2;
+          result._resultOrListeners = t5;
         } else {
-          H.interceptedTypeCheck(t2, "$isAsyncError");
+          t2._as(t5);
           result._state = 8;
-          result._resultOrListeners = t2;
+          result._resultOrListeners = t5;
         }
         _box_1.source = result;
         t1 = result;
       }
     },
     _registerErrorHandler: function(errorHandler, zone) {
-      if (H.functionTypeTest(errorHandler, {func: 1, args: [P.Object, P.StackTrace]}))
-        return zone.registerBinaryCallback$3$1(errorHandler, null, P.Object, P.StackTrace);
-      if (H.functionTypeTest(errorHandler, {func: 1, args: [P.Object]}))
-        return H.functionTypeCheck(errorHandler, {func: 1, ret: null, args: [P.Object]});
+      var t1;
+      if (type$.dynamic_Function_Object_StackTrace._is(errorHandler))
+        return zone.registerBinaryCallback$3$1(errorHandler, type$.dynamic, type$.Object, type$.StackTrace);
+      t1 = type$.dynamic_Function_Object;
+      if (t1._is(errorHandler))
+        return t1._as(errorHandler);
       throw H.wrapException(P.ArgumentError$value(errorHandler, "onError", "Error handler must accept one Object or one Object and a StackTrace as arguments, and return a a valid result"));
     },
     _microtaskLoop: function() {
-      var t1, t2;
-      for (; t1 = $._nextCallback, t1 != null;) {
+      var entry, next;
+      for (entry = $._nextCallback; entry != null; entry = $._nextCallback) {
         $._lastPriorityCallback = null;
-        t2 = t1.next;
-        $._nextCallback = t2;
-        if (t2 == null)
+        next = entry.next;
+        $._nextCallback = next;
+        if (next == null)
           $._lastCallback = null;
-        t1.callback.call$0();
+        entry.callback.call$0();
       }
     },
     _startMicrotaskLoop: function() {
@@ -2265,16 +3224,17 @@
       }
     },
     _scheduleAsyncCallback: function(callback) {
-      var newEntry = new P._AsyncCallbackEntry(callback);
-      if ($._nextCallback == null) {
+      var newEntry = new P._AsyncCallbackEntry(callback),
+        lastCallback = $._lastCallback;
+      if (lastCallback == null) {
         $._nextCallback = $._lastCallback = newEntry;
         if (!$._isInCallbackLoop)
           $.$get$_AsyncRun__scheduleImmediateClosure().call$1(P.async___startMicrotaskLoop$closure());
       } else
-        $._lastCallback = $._lastCallback.next = newEntry;
+        $._lastCallback = lastCallback.next = newEntry;
     },
     _schedulePriorityAsyncCallback: function(callback) {
-      var entry, t2,
+      var entry, lastPriorityCallback, next,
         t1 = $._nextCallback;
       if (t1 == null) {
         P._scheduleAsyncCallback(callback);
@@ -2282,14 +3242,15 @@
         return;
       }
       entry = new P._AsyncCallbackEntry(callback);
-      t2 = $._lastPriorityCallback;
-      if (t2 == null) {
+      lastPriorityCallback = $._lastPriorityCallback;
+      if (lastPriorityCallback == null) {
         entry.next = t1;
         $._nextCallback = $._lastPriorityCallback = entry;
       } else {
-        entry.next = t2.next;
-        $._lastPriorityCallback = t2.next = entry;
-        if (entry.next == null)
+        next = lastPriorityCallback.next;
+        entry.next = next;
+        $._lastPriorityCallback = lastPriorityCallback.next = entry;
+        if (next == null)
           $._lastCallback = entry;
       }
     },
@@ -2300,19 +3261,28 @@
         P._rootScheduleMicrotask(_null, _null, C.C__RootZone, callback);
         return;
       }
-      P._rootScheduleMicrotask(_null, _null, currentZone, H.functionTypeCheck(currentZone.bindCallbackGuarded$1(callback), {func: 1, ret: -1}));
+      P._rootScheduleMicrotask(_null, _null, currentZone, type$.void_Function._as(currentZone.bindCallbackGuarded$1(callback)));
     },
     StreamIterator_StreamIterator: function(stream, $T) {
-      var t1 = stream == null ? H.throwExpression(P.ArgumentError$notNull("stream")) : stream;
-      return new P._StreamIterator(t1, [$T]);
+      P.ArgumentError_checkNotNull(stream, "stream", $T._eval$1("Stream<0>"));
+      return new P._StreamIterator($T._eval$1("_StreamIterator<0>"));
     },
     StreamController_StreamController: function($T) {
       var _null = null;
-      return new P._AsyncStreamController(_null, _null, _null, _null, [$T]);
+      return new P._AsyncStreamController(_null, _null, _null, _null, $T._eval$1("_AsyncStreamController<0>"));
     },
     _runGuarded: function(notificationHandler) {
       return;
     },
+    _BufferingStreamSubscription__registerErrorHandler: function(zone, handleError) {
+      if (handleError == null)
+        handleError = P.async___nullErrorHandler$closure();
+      if (type$.void_Function_Object_StackTrace._is(handleError))
+        return zone.registerBinaryCallback$3$1(handleError, type$.dynamic, type$.Object, type$.StackTrace);
+      if (type$.void_Function_Object._is(handleError))
+        return type$.dynamic_Function_Object._as(handleError);
+      throw H.wrapException(P.ArgumentError$("handleError callback must take either an Object (the error), or both an Object (the error) and a StackTrace."));
+    },
     _nullErrorHandler: function(error, stackTrace) {
       P._rootHandleUncaughtError(null, null, $.Zone__current, error, stackTrace);
     },
@@ -2321,13 +3291,25 @@
     Timer_Timer: function(duration, callback) {
       var t1 = $.Zone__current;
       if (t1 === C.C__RootZone)
-        return P.Timer__createTimer(duration, H.functionTypeCheck(callback, {func: 1, ret: -1}));
-      return P.Timer__createTimer(duration, H.functionTypeCheck(t1.bindCallbackGuarded$1(callback), {func: 1, ret: -1}));
+        return P.Timer__createTimer(duration, type$.void_Function._as(callback));
+      return P.Timer__createTimer(duration, type$.void_Function._as(t1.bindCallbackGuarded$1(callback)));
+    },
+    AsyncError$: function(error, stackTrace) {
+      var t1 = stackTrace == null ? P.AsyncError_defaultStackTrace(error) : stackTrace;
+      P.ArgumentError_checkNotNull(error, "error", type$.Object);
+      return new P.AsyncError(error, t1);
+    },
+    AsyncError_defaultStackTrace: function(error) {
+      var stackTrace;
+      if (type$.Error._is(error)) {
+        stackTrace = error.get$stackTrace();
+        if (stackTrace != null)
+          return stackTrace;
+      }
+      return C.C__StringStackTrace;
     },
     _rootHandleUncaughtError: function($self, $parent, zone, error, stackTrace) {
-      var t1 = {};
-      t1.error = error;
-      P._schedulePriorityAsyncCallback(new P._rootHandleUncaughtError_closure(t1, stackTrace));
+      P._schedulePriorityAsyncCallback(new P._rootHandleUncaughtError_closure(error, stackTrace));
     },
     _rootRun: function($self, $parent, zone, f, $R) {
       var old,
@@ -2373,10 +3355,10 @@
     },
     _rootScheduleMicrotask: function($self, $parent, zone, f) {
       var t1;
-      H.functionTypeCheck(f, {func: 1, ret: -1});
+      type$.void_Function._as(f);
       t1 = C.C__RootZone !== zone;
       if (t1)
-        f = !(!t1 || false) ? zone.bindCallbackGuarded$1(f) : zone.bindCallback$1$1(f, -1);
+        f = !(!t1 || false) ? zone.bindCallbackGuarded$1(f) : zone.bindCallback$1$1(f, type$.void);
       P._scheduleAsyncCallback(f);
     },
     _AsyncRun__initializeScheduleImmediate_internalCallback: function _AsyncRun__initializeScheduleImmediate_internalCallback(t0) {
@@ -2455,7 +3437,7 @@
       this.e = t1;
       this.s = t2;
     },
-    _Future__asyncComplete_closure: function _Future__asyncComplete_closure(t0, t1) {
+    _Future__asyncCompleteWithValue_closure: function _Future__asyncCompleteWithValue_closure(t0, t1) {
       this.$this = t0;
       this.value = t1;
     },
@@ -2468,25 +3450,21 @@
       this.error = t1;
       this.stackTrace = t2;
     },
-    _Future__propagateToListeners_handleWhenCompleteCallback: function _Future__propagateToListeners_handleWhenCompleteCallback(t0, t1, t2, t3) {
-      var _ = this;
-      _._box_1 = t0;
-      _._box_0 = t1;
-      _.listener = t2;
-      _.hasError = t3;
+    _Future__propagateToListeners_handleWhenCompleteCallback: function _Future__propagateToListeners_handleWhenCompleteCallback(t0, t1, t2) {
+      this._box_0 = t0;
+      this._box_1 = t1;
+      this.hasError = t2;
     },
     _Future__propagateToListeners_handleWhenCompleteCallback_closure: function _Future__propagateToListeners_handleWhenCompleteCallback_closure(t0) {
       this.originalSource = t0;
     },
-    _Future__propagateToListeners_handleValueCallback: function _Future__propagateToListeners_handleValueCallback(t0, t1, t2) {
+    _Future__propagateToListeners_handleValueCallback: function _Future__propagateToListeners_handleValueCallback(t0, t1) {
       this._box_0 = t0;
-      this.listener = t1;
-      this.sourceResult = t2;
+      this.sourceResult = t1;
     },
-    _Future__propagateToListeners_handleError: function _Future__propagateToListeners_handleError(t0, t1, t2) {
+    _Future__propagateToListeners_handleError: function _Future__propagateToListeners_handleError(t0, t1) {
       this._box_1 = t0;
       this._box_0 = t1;
-      this.listener = t2;
     },
     _AsyncCallbackEntry: function _AsyncCallbackEntry(t0) {
       this.callback = t0;
@@ -2531,14 +3509,16 @@
       this._controller = t0;
       this.$ti = t1;
     },
-    _ControllerSubscription: function _ControllerSubscription(t0, t1, t2, t3) {
+    _ControllerSubscription: function _ControllerSubscription(t0, t1, t2, t3, t4, t5, t6) {
       var _ = this;
       _._controller = t0;
-      _._onDone = _._onError = _._onData = null;
-      _._zone = t1;
-      _._state = t2;
+      _._onData = t1;
+      _._onError = t2;
+      _._onDone = t3;
+      _._zone = t4;
+      _._state = t5;
       _._pending = _._cancelFuture = null;
-      _.$ti = t3;
+      _.$ti = t6;
     },
     _StreamSinkWrapper: function _StreamSinkWrapper(t0, t1) {
       this._async$_target = t0;
@@ -2582,12 +3562,8 @@
       _._state = 0;
       _.$ti = t0;
     },
-    _StreamIterator: function _StreamIterator(t0, t1) {
-      var _ = this;
-      _._subscription = null;
-      _._stateData = t0;
-      _._isPaused = false;
-      _.$ti = t1;
+    _StreamIterator: function _StreamIterator(t0) {
+      this.$ti = t0;
     },
     AsyncError: function AsyncError(t0, t1) {
       this.error = t0;
@@ -2596,7 +3572,7 @@
     _Zone: function _Zone() {
     },
     _rootHandleUncaughtError_closure: function _rootHandleUncaughtError_closure(t0, t1) {
-      this._box_0 = t0;
+      this.error = t0;
       this.stackTrace = t1;
     },
     _RootZone: function _RootZone() {
@@ -2616,13 +3592,10 @@
       this.T = t2;
     },
     LinkedHashMap_LinkedHashMap$_literal: function(keyValuePairs, $K, $V) {
-      return H.assertSubtype(H.fillLiteralMap(keyValuePairs, new H.JsLinkedHashMap([$K, $V])), "$isLinkedHashMap", [$K, $V], "$asLinkedHashMap");
+      return $K._eval$1("@<0>")._bind$1($V)._eval$1("LinkedHashMap<1,2>")._as(H.fillLiteralMap(keyValuePairs, new H.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"))));
     },
     LinkedHashMap_LinkedHashMap$_empty: function($K, $V) {
-      return new H.JsLinkedHashMap([$K, $V]);
-    },
-    LinkedHashMap__makeEmpty: function() {
-      return new H.JsLinkedHashMap([null, null]);
+      return new H.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"));
     },
     IterableBase_iterableToShortString: function(iterable, leftDelimiter, rightDelimiter) {
       var parts, t1;
@@ -2631,7 +3604,7 @@
           return "(...)";
         return leftDelimiter + "..." + rightDelimiter;
       }
-      parts = H.setRuntimeTypeInfo([], [P.String]);
+      parts = H.setRuntimeTypeInfo([], type$.JSArray_String);
       C.JSArray_methods.add$1($._toStringVisiting, iterable);
       try {
         P._iterablePartsToStrings(iterable, parts);
@@ -2640,7 +3613,7 @@
           return H.ioore($._toStringVisiting, -1);
         $._toStringVisiting.pop();
       }
-      t1 = P.StringBuffer__writeAll(leftDelimiter, H.listSuperNativeTypeCheck(parts, "$isIterable"), ", ") + rightDelimiter;
+      t1 = P.StringBuffer__writeAll(leftDelimiter, type$.Iterable_dynamic._as(parts), ", ") + rightDelimiter;
       return t1.charCodeAt(0) == 0 ? t1 : t1;
     },
     IterableBase_iterableToFullString: function(iterable, leftDelimiter, rightDelimiter) {
@@ -2788,7 +3761,7 @@
     },
     _parseJson: function(source, reviver) {
       var parsed, e, exception, t1;
-      if (typeof source !== "string")
+      if (typeof source != "string")
         throw H.wrapException(H.argumentErrorValue(source));
       parsed = null;
       try {
@@ -2804,7 +3777,7 @@
     _convertJsonToDartLazy: function(object) {
       var i;
       if (object == null)
-        return;
+        return null;
       if (typeof object != "object")
         return object;
       if (Object.getPrototypeOf(object) !== Array.prototype)
@@ -2819,10 +3792,13 @@
     _defaultToEncodable: function(object) {
       return object.toJson$0();
     },
+    _JsonStringStringifier$: function(_sink, _toEncodable) {
+      return new P._JsonStringStringifier(_sink, [], P.convert___defaultToEncodable$closure());
+    },
     _JsonStringStringifier_stringify: function(object, toEncodable, indent) {
       var t1,
         output = new P.StringBuffer(""),
-        stringifier = new P._JsonStringStringifier(output, [], P.convert___defaultToEncodable$closure());
+        stringifier = P._JsonStringStringifier$(output, toEncodable);
       stringifier.writeObject$1(object);
       t1 = output._contents;
       return t1.charCodeAt(0) == 0 ? t1 : t1;
@@ -2867,23 +3843,37 @@
       this._toEncodable = t2;
     },
     _symbolMapToStringMap: function(map) {
-      var result = new H.JsLinkedHashMap([P.String, null]);
+      var result = new H.JsLinkedHashMap(type$.JsLinkedHashMap_String_dynamic);
       map.forEach$1(0, new P._symbolMapToStringMap_closure(result));
       return result;
     },
     Function_apply: function($function, positionalArguments, namedArguments) {
       return H.Primitives_applyFunction($function, positionalArguments, namedArguments == null ? null : P._symbolMapToStringMap(namedArguments));
     },
+    int_parse: function(source) {
+      var value = H.Primitives_parseInt(source, null);
+      if (value != null)
+        return value;
+      throw H.wrapException(P.FormatException$(source, null, null));
+    },
     Error__objectToString: function(object) {
       if (object instanceof H.Closure)
         return object.toString$0(0);
       return "Instance of '" + H.S(H.Primitives_objectTypeName(object)) + "'";
     },
-    List_List$from: function(elements, growable, $E) {
+    List_List$filled: function($length, fill, $E) {
+      var i,
+        result = J.JSArray_JSArray$fixed($length, $E);
+      if ($length !== 0 && fill != null)
+        for (i = 0; i < result.length; ++i)
+          result[i] = fill;
+      return result;
+    },
+    List_List$from: function(elements, $E) {
       var t1,
-        list = H.setRuntimeTypeInfo([], [$E]);
+        list = H.setRuntimeTypeInfo([], $E._eval$1("JSArray<0>"));
       for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
-        C.JSArray_methods.add$1(list, H.assertSubtypeOfRuntimeType(t1.get$current(), $E));
+        C.JSArray_methods.add$1(list, $E._as(t1.get$current()));
       return list;
     },
     String_String$fromCharCodes: function(charCodes) {
@@ -2944,20 +3934,25 @@
       return "0" + n;
     },
     Error_safeToString: function(object) {
-      if (typeof object === "number" || typeof object === "boolean" || null == object)
+      if (typeof object == "number" || H._isBool(object) || null == object)
         return J.toString$0$(object);
-      if (typeof object === "string")
+      if (typeof object == "string")
         return JSON.stringify(object);
       return P.Error__objectToString(object);
     },
+    AssertionError$: function(message) {
+      return new P.AssertionError(message);
+    },
     ArgumentError$: function(message) {
       return new P.ArgumentError(false, null, null, message);
     },
     ArgumentError$value: function(value, $name, message) {
       return new P.ArgumentError(true, value, $name, message);
     },
-    ArgumentError$notNull: function($name) {
-      return new P.ArgumentError(false, null, $name, "Must not be null");
+    ArgumentError_checkNotNull: function(argument, $name, $T) {
+      if (argument == null)
+        throw H.wrapException(new P.ArgumentError(false, null, $name, "Must not be null"));
+      return argument;
     },
     RangeError$value: function(value, $name) {
       return new P.RangeError(null, null, true, value, $name, "Value not in range");
@@ -2968,21 +3963,10 @@
     RangeError_checkValidRange: function(start, end, $length) {
       if (start > $length)
         throw H.wrapException(P.RangeError$range(start, 0, $length, "start", null));
-      if (end != null) {
-        if (start > end || end > $length)
-          throw H.wrapException(P.RangeError$range(end, start, $length, "end", null));
-        return end;
-      }
       return $length;
     },
-    RangeError_checkNotNegative: function(value, $name) {
-      if (typeof value !== "number")
-        return value.$lt();
-      if (value < 0)
-        throw H.wrapException(P.RangeError$range(value, 0, null, $name, null));
-    },
     IndexError$: function(invalidValue, indexable, $name, message, $length) {
-      var t1 = H.intTypeCheck($length == null ? J.get$length$asx(indexable) : $length);
+      var t1 = H._asIntS($length == null ? J.get$length$asx(indexable) : $length);
       return new P.IndexError(t1, true, invalidValue, $name, "Index out of range");
     },
     UnsupportedError$: function(message) {
@@ -3010,14 +3994,10 @@
       this._box_0 = t0;
       this.sb = t1;
     },
-    bool: function bool() {
-    },
     DateTime: function DateTime(t0, t1) {
       this._value = t0;
       this.isUtc = t1;
     },
-    double: function double() {
-    },
     Duration: function Duration(t0) {
       this._duration = t0;
     },
@@ -3027,7 +4007,10 @@
     },
     Error: function Error() {
     },
-    AssertionError: function AssertionError() {
+    AssertionError: function AssertionError(t0) {
+      this.message = t0;
+    },
+    TypeError: function TypeError() {
     },
     NullThrownError: function NullThrownError() {
     },
@@ -3089,38 +4072,22 @@
       this.source = t1;
       this.offset = t2;
     },
-    int: function int() {
-    },
     Iterable: function Iterable() {
     },
-    List: function List() {
-    },
     Null: function Null() {
     },
-    num: function num() {
-    },
     Object: function Object() {
     },
-    StackTrace: function StackTrace() {
-    },
-    String: function String() {
+    _StringStackTrace: function _StringStackTrace() {
     },
     StringBuffer: function StringBuffer(t0) {
       this._contents = t0;
     },
-    Symbol: function Symbol() {
-    },
     convertDartToNative_Dictionary: function(dict) {
       var object = {};
       dict.forEach$1(0, new P.convertDartToNative_Dictionary_closure(object));
       return object;
     },
-    promiseToFuture: function(promise, $T) {
-      var t1 = new P._Future($.Zone__current, [$T]),
-        completer = new P._AsyncCompleter(t1, [$T]);
-      promise.then(H.convertDartClosureToJS(new P.promiseToFuture_closure(completer, $T), 1), H.convertDartClosureToJS(new P.promiseToFuture_closure0(completer), 1));
-      return t1;
-    },
     _AcceptStructuredClone: function _AcceptStructuredClone() {
     },
     _AcceptStructuredClone_walk_closure: function _AcceptStructuredClone_walk_closure(t0, t1) {
@@ -3135,6 +4102,12 @@
       this.copies = t1;
       this.mustCopy = false;
     },
+    promiseToFuture: function(jsPromise, $T) {
+      var t1 = new P._Future($.Zone__current, $T._eval$1("_Future<0>")),
+        completer = new P._AsyncCompleter(t1, $T._eval$1("_AsyncCompleter<0>"));
+      jsPromise.then(H.convertDartClosureToJS(new P.promiseToFuture_closure(completer, $T), 1), H.convertDartClosureToJS(new P.promiseToFuture_closure0(completer), 1));
+      return t1;
+    },
     promiseToFuture_closure: function promiseToFuture_closure(t0, t1) {
       this.completer = t0;
       this.T = t1;
@@ -3153,25 +4126,29 @@
       return t1;
     },
     HttpRequest_request: function(url, method, sendData, withCredentials) {
-      var t3,
-        t1 = W.HttpRequest,
-        t2 = new P._Future($.Zone__current, [t1]),
-        completer = new P._AsyncCompleter(t2, [t1]),
+      var t2, t3, t4,
+        t1 = new P._Future($.Zone__current, type$._Future_HttpRequest),
+        completer = new P._AsyncCompleter(t1, type$._AsyncCompleter_HttpRequest),
         xhr = new XMLHttpRequest();
       C.HttpRequest_methods.open$3$async(xhr, method, url, true);
-      xhr.withCredentials = true;
-      t1 = W.ProgressEvent;
-      t3 = {func: 1, ret: -1, args: [t1]};
-      W._EventStreamSubscription$(xhr, "load", H.functionTypeCheck(new W.HttpRequest_request_closure(xhr, completer), t3), false, t1);
-      W._EventStreamSubscription$(xhr, "error", H.functionTypeCheck(completer.get$completeError(), t3), false, t1);
-      xhr.send(sendData);
-      return t2;
+      C.HttpRequest_methods.set$withCredentials(xhr, true);
+      t2 = type$.nullable_void_Function_legacy_ProgressEvent;
+      t3 = t2._as(new W.HttpRequest_request_closure(xhr, completer));
+      type$.nullable_void_Function._as(null);
+      t4 = type$.legacy_ProgressEvent;
+      W._EventStreamSubscription$(xhr, "load", t3, false, t4);
+      W._EventStreamSubscription$(xhr, "error", t2._as(completer.get$completeError()), false, t4);
+      if (sendData != null)
+        xhr.send(sendData);
+      else
+        xhr.send();
+      return t1;
     },
     _EventStreamSubscription$: function(_target, _eventType, onData, _useCapture, $T) {
-      var t1 = W._wrapZone(new W._EventStreamSubscription_closure(onData), W.Event);
-      t1 = new W._EventStreamSubscription(_target, _eventType, t1, false, [$T]);
-      t1._tryResume$0();
-      return t1;
+      var t1 = W._wrapZone(new W._EventStreamSubscription_closure(onData), type$.Event);
+      if (t1 != null && true)
+        J.addEventListener$3$x(_target, _eventType, t1, false);
+      return new W._EventStreamSubscription(_target, _eventType, t1, false, $T._eval$1("_EventStreamSubscription<0>"));
     },
     _wrapZone: function(callback, $T) {
       var t1 = $.Zone__current;
@@ -3217,6 +4194,10 @@
     },
     UIEvent: function UIEvent() {
     },
+    EventStreamProvider: function EventStreamProvider(t0, t1) {
+      this._eventType = t0;
+      this.$ti = t1;
+    },
     _EventStream: function _EventStream(t0, t1, t2, t3) {
       var _ = this;
       _._target = t0;
@@ -3233,7 +4214,6 @@
     },
     _EventStreamSubscription: function _EventStreamSubscription(t0, t1, t2, t3, t4) {
       var _ = this;
-      _._pauseCount = 0;
       _._target = t0;
       _._eventType = t1;
       _._html$_onData = t2;
@@ -3245,28 +4225,7 @@
     }
   },
   N = {HexCodec: function HexCodec() {
-    },
-    Logger_Logger: function($name) {
-      return $.Logger__loggers.putIfAbsent$2($name, new N.Logger_Logger_closure($name));
-    },
-    Logger: function Logger(t0, t1, t2) {
-      this.name = t0;
-      this.parent = t1;
-      this._children = t2;
-    },
-    Logger_Logger_closure: function Logger_Logger_closure(t0) {
-      this.name = t0;
-    },
-    Level: function Level(t0, t1) {
-      this.name = t0;
-      this.value = t1;
-    },
-    LogRecord: function LogRecord(t0, t1, t2) {
-      this.level = t0;
-      this.message = t1;
-      this.loggerName = t2;
-    }
-  },
+    }},
   R = {
     _convert: function(bytes, start, end) {
       var t1, t2, i, bufferIndex, byteOr, byte, bufferIndex0, t3,
@@ -3310,20 +4269,44 @@
     StreamChannelMixin: function StreamChannelMixin() {
     }
   },
+  Y = {Level: function Level(t0, t1) {
+      this.name = t0;
+      this.value = t1;
+    }},
+  L = {LogRecord: function LogRecord(t0, t1, t2) {
+      this.level = t0;
+      this.message = t1;
+      this.loggerName = t2;
+    }},
+  F = {
+    Logger_Logger: function($name) {
+      return $.Logger__loggers.putIfAbsent$2($name, new F.Logger_Logger_closure($name));
+    },
+    Logger: function Logger(t0, t1, t2) {
+      var _ = this;
+      _.name = t0;
+      _.parent = t1;
+      _._level = null;
+      _._children = t2;
+    },
+    Logger_Logger_closure: function Logger_Logger_closure(t0) {
+      this.name = t0;
+    }
+  },
   M = {
     SseClient$: function(serverUrl) {
-      var t1 = P.String;
-      t1 = new M.SseClient(P.StreamController_StreamController(t1), P.StreamController_StreamController(t1), N.Logger_Logger("SseClient"), P.StreamController_StreamController(null));
+      var t1 = type$.legacy_String;
+      t1 = new M.SseClient(P.StreamController_StreamController(t1), P.StreamController_StreamController(t1), F.Logger_Logger("SseClient"));
       t1.SseClient$1(serverUrl);
       return t1;
     },
-    SseClient: function SseClient(t0, t1, t2, t3) {
+    SseClient: function SseClient(t0, t1, t2) {
       var _ = this;
       _._incomingController = t0;
       _._outgoingController = t1;
       _._logger = t2;
+      _._lastMessageId = -1;
       _._errorTimer = _._serverUrl = _._eventSource = null;
-      _._messages = t3;
     },
     SseClient_closure: function SseClient_closure(t0) {
       this.$this = t0;
@@ -3336,12 +4319,12 @@
       this.error = t1;
     }
   },
-  F = {
+  K = {
     Uuid$: function() {
       var options, t2, t1 = {};
       t1.options = options;
       t1.options = null;
-      t2 = new F.Uuid();
+      t2 = new K.Uuid();
       t2.Uuid$1$options(t1);
       return t2;
     },
@@ -3356,10 +4339,12 @@
     main: function() {
       var channel = M.SseClient$("/test"),
         t1 = J.get$onClick$x(document.querySelector("button")),
-        t2 = H.getTypeArgumentByIndex(t1, 0);
-      W._EventStreamSubscription$(t1._target, t1._eventType, H.functionTypeCheck(new E.main_closure(channel), {func: 1, ret: -1, args: [t2]}), false, t2);
+        t2 = t1.$ti,
+        t3 = t2._eval$1("~(1)?")._as(new E.main_closure(channel));
+      type$.nullable_void_Function._as(null);
+      W._EventStreamSubscription$(t1._target, t1._eventType, t3, false, t2._precomputed1);
       t2 = channel._incomingController;
-      new P._ControllerStream(t2, [H.getTypeArgumentByIndex(t2, 0)]).listen$1(new E.main_closure0(channel));
+      new P._ControllerStream(t2, H._instanceType(t2)._eval$1("_ControllerStream<1>")).listen$1(new E.main_closure0(channel));
     },
     main_closure: function main_closure(t0) {
       this.channel = t0;
@@ -3368,12 +4353,12 @@
       this.channel = t0;
     }
   },
-  U = {
+  T = {
     UuidUtil_mathRNG: function() {
       var b, rand, i,
         t1 = new Array(16);
       t1.fixed$length = Array;
-      b = H.setRuntimeTypeInfo(t1, [P.int]);
+      b = H.setRuntimeTypeInfo(t1, type$.JSArray_legacy_int);
       for (rand = null, i = 0; i < 16; ++i) {
         t1 = i & 3;
         if (t1 === 0)
@@ -3385,7 +4370,7 @@
       return b;
     }
   };
-  var holders = [C, H, J, P, W, N, R, M, F, E, U];
+  var holders = [C, H, J, P, W, N, R, Y, L, F, M, K, E, T];
   hunkHelpers.setFunctionNamesIfNecessary(holders);
   var $ = {};
   H.JS_CONST.prototype = {};
@@ -3400,7 +4385,7 @@
       return "Instance of '" + H.S(H.Primitives_objectTypeName(receiver)) + "'";
     },
     noSuchMethod$1: function(receiver, invocation) {
-      H.interceptedTypeCheck(invocation, "$isInvocation");
+      type$.Invocation._as(invocation);
       throw H.wrapException(P.NoSuchMethodError$(receiver, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments()));
     }
   };
@@ -3409,10 +4394,10 @@
       return String(receiver);
     },
     $and: function(receiver, other) {
-      return H.checkBool(H.boolTypeCheck(other)) && receiver;
+      return H.checkBool(H._asBoolS(other)) && receiver;
     },
     $or: function(receiver, other) {
-      return H.checkBool(H.boolTypeCheck(other)) || receiver;
+      return H.checkBool(H._asBoolS(other)) || receiver;
     },
     get$hashCode: function(receiver) {
       return receiver ? 519018 : 218159;
@@ -3430,7 +4415,7 @@
       return 0;
     },
     noSuchMethod$1: function(receiver, invocation) {
-      return this.super$Interceptor$noSuchMethod(receiver, H.interceptedTypeCheck(invocation, "$isInvocation"));
+      return this.super$Interceptor$noSuchMethod(receiver, type$.Invocation._as(invocation));
     },
     $isNull: 1
   };
@@ -3451,47 +4436,28 @@
         return this.super$JavaScriptObject$toString(receiver);
       return "JavaScript function for " + H.S(J.toString$0$(dartClosure));
     },
-    $signature: function() {
-      return {func: 1, opt: [,,,,,,,,,,,,,,,,]};
-    },
     $isFunction: 1
   };
   J.JSArray.prototype = {
     add$1: function(receiver, value) {
-      H.assertSubtypeOfRuntimeType(value, H.getTypeArgumentByIndex(receiver, 0));
+      H._arrayInstanceType(receiver)._precomputed1._as(value);
       if (!!receiver.fixed$length)
         H.throwExpression(P.UnsupportedError$("add"));
       receiver.push(value);
     },
     addAll$1: function(receiver, collection) {
       var t1, _i;
-      H.assertSubtype(collection, "$isIterable", [H.getTypeArgumentByIndex(receiver, 0)], "$asIterable");
+      H._arrayInstanceType(receiver)._eval$1("Iterable<1>")._as(collection);
       if (!!receiver.fixed$length)
         H.throwExpression(P.UnsupportedError$("addAll"));
       for (t1 = collection.length, _i = 0; _i < collection.length; collection.length === t1 || (0, H.throwConcurrentModificationError)(collection), ++_i)
         receiver.push(collection[_i]);
     },
-    setRange$3: function(receiver, start, end, iterable) {
-      var $length, i,
-        t1 = H.getTypeArgumentByIndex(receiver, 0);
-      H.assertSubtype(iterable, "$isIterable", [t1], "$asIterable");
-      if (!!receiver.immutable$list)
-        H.throwExpression(P.UnsupportedError$("setRange"));
-      P.RangeError_checkValidRange(start, end, receiver.length);
-      $length = end - start;
-      if ($length === 0)
-        return;
-      P.RangeError_checkNotNegative(0, "skipCount");
-      H.assertSubtype(iterable, "$isList", [t1], "$asList");
-      t1 = J.getInterceptor$asx(iterable);
-      if ($length > t1.get$length(iterable))
-        throw H.wrapException(H.IterableElementError_tooFew());
-      if (0 < start)
-        for (i = $length - 1; i >= 0; --i)
-          receiver[start + i] = t1.$index(iterable, i);
-      else
-        for (i = 0; i < $length; ++i)
-          receiver[start + i] = t1.$index(iterable, i);
+    get$last: function(receiver) {
+      var t1 = receiver.length;
+      if (t1 > 0)
+        return receiver[t1 - 1];
+      throw H.wrapException(H.IterableElementError_noElement());
     },
     get$isNotEmpty: function(receiver) {
       return receiver.length !== 0;
@@ -3500,7 +4466,7 @@
       return P.IterableBase_iterableToFullString(receiver, "[", "]");
     },
     get$iterator: function(receiver) {
-      return new J.ArrayIterator(receiver, receiver.length, [H.getTypeArgumentByIndex(receiver, 0)]);
+      return new J.ArrayIterator(receiver, receiver.length, H._arrayInstanceType(receiver)._eval$1("ArrayIterator<1>"));
     },
     get$hashCode: function(receiver) {
       return H.Primitives_objectHashCode(receiver);
@@ -3508,40 +4474,33 @@
     get$length: function(receiver) {
       return receiver.length;
     },
-    set$length: function(receiver, newLength) {
-      if (!!receiver.fixed$length)
-        H.throwExpression(P.UnsupportedError$("set length"));
-      if (newLength < 0)
-        throw H.wrapException(P.RangeError$range(newLength, 0, null, "newLength", null));
-      receiver.length = newLength;
-    },
     $index: function(receiver, index) {
-      if (typeof index !== "number" || Math.floor(index) !== index)
+      if (!H._isInt(index))
         throw H.wrapException(H.diagnoseIndexError(receiver, index));
       if (index >= receiver.length || index < 0)
         throw H.wrapException(H.diagnoseIndexError(receiver, index));
       return receiver[index];
     },
     $indexSet: function(receiver, index, value) {
-      H.intTypeCheck(index);
-      H.assertSubtypeOfRuntimeType(value, H.getTypeArgumentByIndex(receiver, 0));
+      H._asIntS(index);
+      H._arrayInstanceType(receiver)._precomputed1._as(value);
       if (!!receiver.immutable$list)
         H.throwExpression(P.UnsupportedError$("indexed set"));
-      if (typeof index !== "number" || Math.floor(index) !== index)
+      if (!H._isInt(index))
         throw H.wrapException(H.diagnoseIndexError(receiver, index));
       if (index >= receiver.length || index < 0)
         throw H.wrapException(H.diagnoseIndexError(receiver, index));
       receiver[index] = value;
     },
     $add: function(receiver, other) {
-      var totalLength,
-        t1 = [H.getTypeArgumentByIndex(receiver, 0)];
-      H.assertSubtype(other, "$isList", t1, "$asList");
-      totalLength = C.JSInt_methods.$add(receiver.length, other.get$length(other));
+      var t2, _i,
+        t1 = H._arrayInstanceType(receiver);
+      t1._eval$1("List<1>")._as(other);
       t1 = H.setRuntimeTypeInfo([], t1);
-      this.set$length(t1, totalLength);
-      this.setRange$3(t1, 0, receiver.length, receiver);
-      this.setRange$3(t1, receiver.length, totalLength, other);
+      for (t2 = receiver.length, _i = 0; _i < receiver.length; receiver.length === t2 || (0, H.throwConcurrentModificationError)(receiver), ++_i)
+        this.add$1(t1, receiver[_i]);
+      for (t2 = other.get$iterator(other); t2.moveNext$0();)
+        this.add$1(t1, t2.get$current());
       return t1;
     },
     $isIterable: 1,
@@ -3568,7 +4527,7 @@
       return true;
     },
     set$_current: function(_current) {
-      this._current = H.assertSubtypeOfRuntimeType(_current, H.getTypeArgumentByIndex(this, 0));
+      this._current = this.$ti._eval$1("1?")._as(_current);
     }
   };
   J.JSNumber.prototype = {
@@ -3638,7 +4597,7 @@
       return 536870911 & ((scaled * 9007199254740992 | 0) + (scaled * 3542243181176521 | 0)) * 599197 + floorLog2 * 1259;
     },
     $add: function(receiver, other) {
-      H.numTypeCheck(other);
+      H._asNumS(other);
       return receiver + other;
     },
     $sub: function(receiver, other) {
@@ -3706,23 +4665,19 @@
       return (receiver & other) >>> 0;
     },
     $or: function(receiver, other) {
-      H.numTypeCheck(other);
-      if (typeof other !== "number")
+      H._asNumS(other);
+      if (typeof other != "number")
         throw H.wrapException(H.argumentErrorValue(other));
       return (receiver | other) >>> 0;
     },
     $lt: function(receiver, other) {
-      if (typeof other !== "number")
-        throw H.wrapException(H.argumentErrorValue(other));
       return receiver < other;
     },
     $gt: function(receiver, other) {
-      if (typeof other !== "number")
-        throw H.wrapException(H.argumentErrorValue(other));
       return receiver > other;
     },
     $ge: function(receiver, other) {
-      if (typeof other !== "number")
+      if (typeof other != "number")
         throw H.wrapException(H.argumentErrorValue(other));
       return receiver >= other;
     },
@@ -3745,8 +4700,8 @@
       return receiver.charCodeAt(index);
     },
     $add: function(receiver, other) {
-      H.stringTypeCheck(other);
-      if (typeof other !== "string")
+      H._asStringS(other);
+      if (typeof other != "string")
         throw H.wrapException(P.ArgumentError$value(other, null, null));
       return receiver + other;
     },
@@ -3820,19 +4775,27 @@
     $isPattern: 1,
     $isString: 1
   };
+  H.LateInitializationErrorImpl.prototype = {
+    toString$0: function(_) {
+      var message = this._message;
+      return message != null ? "LateInitializationError: " + message : "LateInitializationError";
+    }
+  };
   H.EfficientLengthIterable.prototype = {};
   H.ListIterable.prototype = {
     get$iterator: function(_) {
       var _this = this;
-      return new H.ListIterator(_this, _this.get$length(_this), [H.getRuntimeTypeArgument(_this, "ListIterable", 0)]);
+      return new H.ListIterator(_this, _this.get$length(_this), H._instanceType(_this)._eval$1("ListIterator<ListIterable.E>"));
     },
     get$isEmpty: function(_) {
-      return this.get$length(this) === 0;
+      var t1 = this._parent;
+      return t1.get$length(t1) === 0;
     }
   };
   H.ListIterator.prototype = {
     get$current: function() {
-      return this.__internal$_current;
+      var cur = this.__internal$_current;
+      return cur;
     },
     moveNext$0: function() {
       var t3, _this = this,
@@ -3851,11 +4814,11 @@
       return true;
     },
     set$__internal$_current: function(_current) {
-      this.__internal$_current = H.assertSubtypeOfRuntimeType(_current, H.getTypeArgumentByIndex(this, 0));
+      this.__internal$_current = this.$ti._eval$1("1?")._as(_current);
     }
   };
   H.FixedLengthListMixin.prototype = {};
-  H.Symbol0.prototype = {
+  H.Symbol.prototype = {
     get$hashCode: function(_) {
       var hash = this._hashCode;
       if (hash != null)
@@ -3870,9 +4833,9 @@
     $eq: function(_, other) {
       if (other == null)
         return false;
-      return other instanceof H.Symbol0 && this.__internal$_name == other.__internal$_name;
+      return other instanceof H.Symbol && this.__internal$_name == other.__internal$_name;
     },
-    $isSymbol: 1
+    $isSymbol0: 1
   };
   H.ConstantMapView.prototype = {};
   H.ConstantMap.prototype = {
@@ -3893,20 +4856,20 @@
     },
     $index: function(_, key) {
       if (!this.containsKey$1(key))
-        return;
+        return null;
       return this._fetch$1(key);
     },
     _fetch$1: function(key) {
-      return this._jsObject[H.stringTypeCheck(key)];
+      return this._jsObject[H._asStringS(key)];
     },
     forEach$1: function(_, f) {
-      var keys, t2, i, key, _this = this,
-        t1 = H.getTypeArgumentByIndex(_this, 1);
-      H.functionTypeCheck(f, {func: 1, ret: -1, args: [H.getTypeArgumentByIndex(_this, 0), t1]});
-      keys = _this._keys;
-      for (t2 = keys.length, i = 0; i < t2; ++i) {
+      var keys, t2, i, key,
+        t1 = H._instanceType(this);
+      t1._eval$1("~(1,2)")._as(f);
+      keys = this._keys;
+      for (t2 = keys.length, t1 = t1._rest[1], i = 0; i < t2; ++i) {
         key = keys[i];
-        f.call$2(key, H.assertSubtypeOfRuntimeType(_this._fetch$1(key), t1));
+        f.call$2(key, t1._as(this._fetch$1(key)));
       }
     }
   };
@@ -3917,7 +4880,7 @@
     },
     get$positionalArguments: function() {
       var t1, argumentCount, list, index, _this = this;
-      if (_this._kind === 1)
+      if (_this.__js_helper$_kind === 1)
         return C.List_empty;
       t1 = _this._arguments;
       argumentCount = t1.length - _this._namedArgumentNames.length - _this._typeArgumentCount;
@@ -3934,8 +4897,8 @@
       return list;
     },
     get$namedArguments: function() {
-      var t1, namedArgumentCount, t2, namedArgumentsStartIndex, t3, map, i, t4, t5, _this = this;
-      if (_this._kind !== 0)
+      var t1, namedArgumentCount, t2, namedArgumentsStartIndex, map, i, t3, t4, _this = this;
+      if (_this.__js_helper$_kind !== 0)
         return C.Map_empty;
       t1 = _this._namedArgumentNames;
       namedArgumentCount = t1.length;
@@ -3943,25 +4906,24 @@
       namedArgumentsStartIndex = t2.length - namedArgumentCount - _this._typeArgumentCount;
       if (namedArgumentCount === 0)
         return C.Map_empty;
-      t3 = P.Symbol;
-      map = new H.JsLinkedHashMap([t3, null]);
+      map = new H.JsLinkedHashMap(type$.JsLinkedHashMap_Symbol_dynamic);
       for (i = 0; i < namedArgumentCount; ++i) {
         if (i >= t1.length)
           return H.ioore(t1, i);
-        t4 = t1[i];
-        t5 = namedArgumentsStartIndex + i;
-        if (t5 < 0 || t5 >= t2.length)
-          return H.ioore(t2, t5);
-        map.$indexSet(0, new H.Symbol0(t4), t2[t5]);
+        t3 = t1[i];
+        t4 = namedArgumentsStartIndex + i;
+        if (t4 < 0 || t4 >= t2.length)
+          return H.ioore(t2, t4);
+        map.$indexSet(0, new H.Symbol(t3), t2[t4]);
       }
-      return new H.ConstantMapView(map, [t3, null]);
+      return new H.ConstantMapView(map, type$.ConstantMapView_Symbol_dynamic);
     },
     $isInvocation: 1
   };
   H.Primitives_functionNoSuchMethod_closure.prototype = {
     call$2: function($name, argument) {
       var t1;
-      H.stringTypeCheck($name);
+      H._asStringS($name);
       t1 = this._box_0;
       t1.names = t1.names + "$" + H.S($name);
       C.JSArray_methods.add$1(this.namedArgumentList, $name);
@@ -3975,7 +4937,7 @@
       var result, t1, _this = this,
         match = new RegExp(_this._pattern).exec(message);
       if (match == null)
-        return;
+        return null;
       result = Object.create(null);
       t1 = _this._arguments;
       if (t1 !== -1)
@@ -3999,7 +4961,7 @@
     toString$0: function(_) {
       var t1 = this._method;
       if (t1 == null)
-        return "NoSuchMethodError: " + H.S(this._message);
+        return "NoSuchMethodError: " + H.S(this.__js_helper$_message);
       return "NoSuchMethodError: method not found: '" + t1 + "' on null";
     }
   };
@@ -4009,29 +4971,25 @@
         _s38_ = "NoSuchMethodError: method not found: '",
         t1 = _this._method;
       if (t1 == null)
-        return "NoSuchMethodError: " + H.S(_this._message);
+        return "NoSuchMethodError: " + H.S(_this.__js_helper$_message);
       t2 = _this._receiver;
       if (t2 == null)
-        return _s38_ + t1 + "' (" + H.S(_this._message) + ")";
-      return _s38_ + t1 + "' on '" + t2 + "' (" + H.S(_this._message) + ")";
+        return _s38_ + t1 + "' (" + H.S(_this.__js_helper$_message) + ")";
+      return _s38_ + t1 + "' on '" + t2 + "' (" + H.S(_this.__js_helper$_message) + ")";
     }
   };
   H.UnknownJsTypeError.prototype = {
     toString$0: function(_) {
-      var t1 = this._message;
+      var t1 = this.__js_helper$_message;
       return t1.length === 0 ? "Error" : "Error: " + t1;
     }
   };
-  H.ExceptionAndStackTrace.prototype = {};
-  H.unwrapException_saveStackTrace.prototype = {
-    call$1: function(error) {
-      if (!!J.getInterceptor$(error).$isError)
-        if (error.$thrownJsError == null)
-          error.$thrownJsError = this.ex;
-      return error;
-    },
-    $signature: 4
+  H.NullThrownFromJavaScriptException.prototype = {
+    toString$0: function(_) {
+      return "Throw of null ('" + (this._irritant === null ? "null" : "undefined") + "' from JavaScript)";
+    }
   };
+  H.ExceptionAndStackTrace.prototype = {};
   H._StackTrace.prototype = {
     toString$0: function(_) {
       var trace,
@@ -4094,19 +5052,9 @@
       return "Closure '" + H.S(this._name) + "' of " + ("Instance of '" + H.S(H.Primitives_objectTypeName(receiver)) + "'");
     }
   };
-  H.TypeErrorImplementation.prototype = {
-    toString$0: function(_) {
-      return this.message;
-    }
-  };
-  H.CastErrorImplementation.prototype = {
-    toString$0: function(_) {
-      return this.message;
-    }
-  };
   H.RuntimeError.prototype = {
     toString$0: function(_) {
-      return "RuntimeError: " + H.S(this.message);
+      return "RuntimeError: " + this.message;
     }
   };
   H._AssertionError.prototype = {
@@ -4114,6 +5062,7 @@
       return "Assertion failed: " + P.Error_safeToString(this.message);
     }
   };
+  H._Required.prototype = {};
   H.JsLinkedHashMap.prototype = {
     get$length: function(_) {
       return this.__js_helper$_length;
@@ -4122,11 +5071,11 @@
       return this.__js_helper$_length === 0;
     },
     get$keys: function() {
-      return new H.LinkedHashMapKeyIterable(this, [H.getTypeArgumentByIndex(this, 0)]);
+      return new H.LinkedHashMapKeyIterable(this, H._instanceType(this)._eval$1("LinkedHashMapKeyIterable<1>"));
     },
     containsKey$1: function(key) {
       var strings, t1;
-      if (typeof key === "string") {
+      if (typeof key == "string") {
         strings = this._strings;
         if (strings == null)
           return false;
@@ -4137,55 +5086,56 @@
       }
     },
     internalContainsKey$1: function(key) {
-      var rest = this._rest;
+      var rest = this.__js_helper$_rest;
       if (rest == null)
         return false;
       return this.internalFindBucketIndex$2(this._getTableBucket$2(rest, J.get$hashCode$(key) & 0x3ffffff), key) >= 0;
     },
     $index: function(_, key) {
-      var strings, cell, t1, nums, _this = this;
-      if (typeof key === "string") {
+      var strings, cell, t1, nums, _this = this, _null = null;
+      if (typeof key == "string") {
         strings = _this._strings;
         if (strings == null)
-          return;
+          return _null;
         cell = _this._getTableCell$2(strings, key);
-        t1 = cell == null ? null : cell.hashMapCellValue;
+        t1 = cell == null ? _null : cell.hashMapCellValue;
         return t1;
-      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+      } else if (typeof key == "number" && (key & 0x3ffffff) === key) {
         nums = _this._nums;
         if (nums == null)
-          return;
+          return _null;
         cell = _this._getTableCell$2(nums, key);
-        t1 = cell == null ? null : cell.hashMapCellValue;
+        t1 = cell == null ? _null : cell.hashMapCellValue;
         return t1;
       } else
         return _this.internalGet$1(key);
     },
     internalGet$1: function(key) {
       var bucket, index,
-        rest = this._rest;
+        rest = this.__js_helper$_rest;
       if (rest == null)
-        return;
+        return null;
       bucket = this._getTableBucket$2(rest, J.get$hashCode$(key) & 0x3ffffff);
       index = this.internalFindBucketIndex$2(bucket, key);
       if (index < 0)
-        return;
+        return null;
       return bucket[index].hashMapCellValue;
     },
     $indexSet: function(_, key, value) {
-      var strings, nums, rest, hash, bucket, index, _this = this;
-      H.assertSubtypeOfRuntimeType(key, H.getTypeArgumentByIndex(_this, 0));
-      H.assertSubtypeOfRuntimeType(value, H.getTypeArgumentByIndex(_this, 1));
-      if (typeof key === "string") {
+      var strings, nums, rest, hash, bucket, index, _this = this,
+        t1 = H._instanceType(_this);
+      t1._precomputed1._as(key);
+      t1._rest[1]._as(value);
+      if (typeof key == "string") {
         strings = _this._strings;
         _this._addHashTableEntry$3(strings == null ? _this._strings = _this._newHashTable$0() : strings, key, value);
-      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+      } else if (typeof key == "number" && (key & 0x3ffffff) === key) {
         nums = _this._nums;
         _this._addHashTableEntry$3(nums == null ? _this._nums = _this._newHashTable$0() : nums, key, value);
       } else {
-        rest = _this._rest;
+        rest = _this.__js_helper$_rest;
         if (rest == null)
-          rest = _this._rest = _this._newHashTable$0();
+          rest = _this.__js_helper$_rest = _this._newHashTable$0();
         hash = J.get$hashCode$(key) & 0x3ffffff;
         bucket = _this._getTableBucket$2(rest, hash);
         if (bucket == null)
@@ -4200,9 +5150,10 @@
       }
     },
     putIfAbsent$2: function(key, ifAbsent) {
-      var value, _this = this;
-      H.assertSubtypeOfRuntimeType(key, H.getTypeArgumentByIndex(_this, 0));
-      H.functionTypeCheck(ifAbsent, {func: 1, ret: H.getTypeArgumentByIndex(_this, 1)});
+      var value, _this = this,
+        t1 = H._instanceType(_this);
+      t1._precomputed1._as(key);
+      t1._eval$1("2()")._as(ifAbsent);
       if (_this.containsKey$1(key))
         return _this.$index(0, key);
       value = ifAbsent.call$0();
@@ -4211,7 +5162,7 @@
     },
     forEach$1: function(_, action) {
       var cell, modifications, _this = this;
-      H.functionTypeCheck(action, {func: 1, ret: -1, args: [H.getTypeArgumentByIndex(_this, 0), H.getTypeArgumentByIndex(_this, 1)]});
+      H._instanceType(_this)._eval$1("~(1,2)")._as(action);
       cell = _this._first;
       modifications = _this._modifications;
       for (; cell != null;) {
@@ -4222,9 +5173,10 @@
       }
     },
     _addHashTableEntry$3: function(table, key, value) {
-      var cell, _this = this;
-      H.assertSubtypeOfRuntimeType(key, H.getTypeArgumentByIndex(_this, 0));
-      H.assertSubtypeOfRuntimeType(value, H.getTypeArgumentByIndex(_this, 1));
+      var cell, _this = this,
+        t1 = H._instanceType(_this);
+      t1._precomputed1._as(key);
+      t1._rest[1]._as(value);
       cell = _this._getTableCell$2(table, key);
       if (cell == null)
         _this._setTableEntry$3(table, key, _this._newLinkedCell$2(key, value));
@@ -4233,7 +5185,8 @@
     },
     _newLinkedCell$2: function(key, value) {
       var _this = this,
-        cell = new H.LinkedHashMapCell(H.assertSubtypeOfRuntimeType(key, H.getTypeArgumentByIndex(_this, 0)), H.assertSubtypeOfRuntimeType(value, H.getTypeArgumentByIndex(_this, 1)));
+        t1 = H._instanceType(_this),
+        cell = new H.LinkedHashMapCell(t1._precomputed1._as(key), t1._rest[1]._as(value));
       if (_this._first == null)
         _this._first = _this._last = cell;
       else
@@ -4289,7 +5242,7 @@
     },
     get$iterator: function(_) {
       var t1 = this._map,
-        t2 = new H.LinkedHashMapKeyIterator(t1, t1._modifications, this.$ti);
+        t2 = new H.LinkedHashMapKeyIterator(t1, t1._modifications, this.$ti._eval$1("LinkedHashMapKeyIterator<1>"));
       t2._cell = t1._first;
       return t2;
     }
@@ -4299,24 +5252,22 @@
       return this.__js_helper$_current;
     },
     moveNext$0: function() {
-      var _this = this,
+      var cell, _this = this,
         t1 = _this._map;
       if (_this._modifications !== t1._modifications)
         throw H.wrapException(P.ConcurrentModificationError$(t1));
-      else {
-        t1 = _this._cell;
-        if (t1 == null) {
-          _this.set$__js_helper$_current(null);
-          return false;
-        } else {
-          _this.set$__js_helper$_current(t1.hashMapCellKey);
-          _this._cell = _this._cell._next;
-          return true;
-        }
+      cell = _this._cell;
+      if (cell == null) {
+        _this.set$__js_helper$_current(null);
+        return false;
+      } else {
+        _this.set$__js_helper$_current(cell.hashMapCellKey);
+        _this._cell = cell._next;
+        return true;
       }
     },
     set$__js_helper$_current: function(_current) {
-      this.__js_helper$_current = H.assertSubtypeOfRuntimeType(_current, H.getTypeArgumentByIndex(this, 0));
+      this.__js_helper$_current = this.$ti._eval$1("1?")._as(_current);
     }
   };
   H.initHooks_closure.prototype = {
@@ -4333,7 +5284,7 @@
   };
   H.initHooks_closure1.prototype = {
     call$1: function(tag) {
-      return this.prototypeForTag(H.stringTypeCheck(tag));
+      return this.prototypeForTag(H._asStringS(tag));
     },
     $signature: 14
   };
@@ -4342,9 +5293,7 @@
     get$length: function(receiver) {
       return receiver.length;
     },
-    $isJavaScriptIndexingBehavior: 1,
-    $asJavaScriptIndexingBehavior: function() {
-    }
+    $isJavaScriptIndexingBehavior: 1
   };
   H.NativeTypedArrayOfDouble.prototype = {
     $index: function(receiver, index) {
@@ -4352,47 +5301,23 @@
       return receiver[index];
     },
     $indexSet: function(receiver, index, value) {
-      H.intTypeCheck(index);
-      H.doubleTypeCheck(value);
+      H._asIntS(index);
+      H._asDoubleS(value);
       H._checkValidIndex(index, receiver, receiver.length);
       receiver[index] = value;
     },
-    $asFixedLengthListMixin: function() {
-      return [P.double];
-    },
-    $asListMixin: function() {
-      return [P.double];
-    },
     $isIterable: 1,
-    $asIterable: function() {
-      return [P.double];
-    },
-    $isList: 1,
-    $asList: function() {
-      return [P.double];
-    }
+    $isList: 1
   };
   H.NativeTypedArrayOfInt.prototype = {
     $indexSet: function(receiver, index, value) {
-      H.intTypeCheck(index);
-      H.intTypeCheck(value);
+      H._asIntS(index);
+      H._asIntS(value);
       H._checkValidIndex(index, receiver, receiver.length);
       receiver[index] = value;
     },
-    $asFixedLengthListMixin: function() {
-      return [P.int];
-    },
-    $asListMixin: function() {
-      return [P.int];
-    },
     $isIterable: 1,
-    $asIterable: function() {
-      return [P.int];
-    },
-    $isList: 1,
-    $asList: function() {
-      return [P.int];
-    }
+    $isList: 1
   };
   H.NativeInt16List.prototype = {
     $index: function(receiver, index) {
@@ -4446,6 +5371,21 @@
   H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin.prototype = {};
   H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin.prototype = {};
   H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin.prototype = {};
+  H.Rti.prototype = {
+    _eval$1: function(recipe) {
+      return H._Universe_evalInEnvironment(init.typeUniverse, this, recipe);
+    },
+    _bind$1: function(typeOrTuple) {
+      return H._Universe_bind(init.typeUniverse, this, typeOrTuple);
+    }
+  };
+  H._FunctionParameters.prototype = {};
+  H._Error.prototype = {
+    toString$0: function(_) {
+      return this.__rti$_message;
+    }
+  };
+  H._TypeError.prototype = {};
   P._AsyncRun__initializeScheduleImmediate_internalCallback.prototype = {
     call$1: function(_) {
       var t1 = this._box_0,
@@ -4453,12 +5393,12 @@
       t1.storedCallback = null;
       f.call$0();
     },
-    $signature: 7
+    $signature: 5
   };
   P._AsyncRun__initializeScheduleImmediate_closure.prototype = {
     call$1: function(callback) {
       var t1, t2;
-      this._box_0.storedCallback = H.functionTypeCheck(callback, {func: 1, ret: -1});
+      this._box_0.storedCallback = type$.void_Function._as(callback);
       t1 = this.div;
       t2 = this.span;
       t1.firstChild ? t1.removeChild(t2) : t1.appendChild(t2);
@@ -4471,7 +5411,7 @@
     },
     "call*": "call$0",
     $requiredArgCount: 0,
-    $signature: 1
+    $signature: 0
   };
   P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback.prototype = {
     call$0: function() {
@@ -4479,7 +5419,7 @@
     },
     "call*": "call$0",
     $requiredArgCount: 0,
-    $signature: 1
+    $signature: 0
   };
   P._TimerImpl.prototype = {
     _TimerImpl$2: function(milliseconds, callback) {
@@ -4507,22 +5447,28 @@
     },
     "call*": "call$0",
     $requiredArgCount: 0,
-    $signature: 0
+    $signature: 1
   };
   P._AsyncAwaitCompleter.prototype = {
     complete$1: function(_, value) {
-      var t2, t3, _this = this,
-        t1 = H.getTypeArgumentByIndex(_this, 0);
-      H.futureOrCheck(value, {futureOr: 1, type: t1});
-      t2 = !_this.isSync || H.checkSubtype(value, "$isFuture", _this.$ti, "$asFuture");
-      t3 = _this._future;
-      if (t2)
-        t3._asyncComplete$1(value);
-      else
-        t3._completeWithValue$1(H.assertSubtypeOfRuntimeType(value, t1));
+      var t2, _this = this,
+        t1 = _this.$ti;
+      t1._eval$1("1/?")._as(value);
+      if (!_this.isSync)
+        _this._future._asyncComplete$1(value);
+      else {
+        t2 = _this._future;
+        if (t1._eval$1("Future<1>")._is(value))
+          t2._chainFuture$1(value);
+        else
+          t2._completeWithValue$1(t1._precomputed1._as(value));
+      }
     },
     completeError$2: function(e, st) {
-      var t1 = this._future;
+      var t1;
+      if (st == null)
+        st = P.AsyncError_defaultStackTrace(e);
+      t1 = this._future;
       if (this.isSync)
         t1._completeError$2(e, st);
       else
@@ -4537,7 +5483,7 @@
   };
   P._awaitOnObject_closure0.prototype = {
     call$2: function(error, stackTrace) {
-      this.bodyFunction.call$2(1, new H.ExceptionAndStackTrace(error, H.interceptedTypeCheck(stackTrace, "$isStackTrace")));
+      this.bodyFunction.call$2(1, new H.ExceptionAndStackTrace(error, type$.StackTrace._as(stackTrace)));
     },
     "call*": "call$2",
     $requiredArgCount: 2,
@@ -4545,18 +5491,19 @@
   };
   P._wrapJsFunctionForAsync_closure.prototype = {
     call$2: function(errorCode, result) {
-      this.$protected(H.intTypeCheck(errorCode), result);
+      this.$protected(H._asIntS(errorCode), result);
     },
     $signature: 17
   };
   P._Completer.prototype = {
     completeError$2: function(error, stackTrace) {
       var t1;
-      if (error == null)
-        error = new P.NullThrownError();
+      P.ArgumentError_checkNotNull(error, "error", type$.Object);
       t1 = this.future;
       if (t1._state !== 0)
         throw H.wrapException(P.StateError$("Future already completed"));
+      if (stackTrace == null)
+        stackTrace = P.AsyncError_defaultStackTrace(error);
       t1._asyncCompleteError$2(error, stackTrace);
     },
     completeError$1: function(error) {
@@ -4565,45 +5512,47 @@
   };
   P._AsyncCompleter.prototype = {
     complete$1: function(_, value) {
-      var t1;
-      H.futureOrCheck(value, {futureOr: 1, type: H.getTypeArgumentByIndex(this, 0)});
-      t1 = this.future;
-      if (t1._state !== 0)
+      var t2,
+        t1 = this.$ti;
+      t1._eval$1("1/?")._as(value);
+      t2 = this.future;
+      if (t2._state !== 0)
         throw H.wrapException(P.StateError$("Future already completed"));
-      t1._asyncComplete$1(value);
+      t2._asyncComplete$1(t1._eval$1("1/")._as(value));
     }
   };
   P._FutureListener.prototype = {
     matchesErrorTest$1: function(asyncError) {
       if ((this.state & 15) !== 6)
         return true;
-      return this.result._zone.runUnary$2$2(H.functionTypeCheck(this.callback, {func: 1, ret: P.bool, args: [P.Object]}), asyncError.error, P.bool, P.Object);
+      return this.result._zone.runUnary$2$2(type$.bool_Function_Object._as(this.callback), asyncError.error, type$.bool, type$.Object);
     },
     handleError$1: function(asyncError) {
       var errorCallback = this.errorCallback,
-        t1 = P.Object,
-        t2 = {futureOr: 1, type: H.getTypeArgumentByIndex(this, 1)},
-        t3 = this.result._zone;
-      if (H.functionTypeTest(errorCallback, {func: 1, args: [P.Object, P.StackTrace]}))
-        return H.futureOrCheck(t3.runBinary$3$3(errorCallback, asyncError.error, asyncError.stackTrace, null, t1, P.StackTrace), t2);
+        t1 = type$.dynamic,
+        t2 = type$.Object,
+        t3 = this.$ti._eval$1("2/"),
+        t4 = this.result._zone;
+      if (type$.dynamic_Function_Object_StackTrace._is(errorCallback))
+        return t3._as(t4.runBinary$3$3(errorCallback, asyncError.error, asyncError.stackTrace, t1, t2, type$.StackTrace));
       else
-        return H.futureOrCheck(t3.runUnary$2$2(H.functionTypeCheck(errorCallback, {func: 1, args: [P.Object]}), asyncError.error, null, t1), t2);
+        return t3._as(t4.runUnary$2$2(type$.dynamic_Function_Object._as(errorCallback), asyncError.error, t1, t2));
     }
   };
   P._Future.prototype = {
     then$1$2$onError: function(f, onError, $R) {
       var currentZone, result, t2,
-        t1 = H.getTypeArgumentByIndex(this, 0);
-      H.functionTypeCheck(f, {func: 1, ret: {futureOr: 1, type: $R}, args: [t1]});
+        t1 = this.$ti;
+      t1._bind$1($R)._eval$1("1/(2)")._as(f);
       currentZone = $.Zone__current;
       if (currentZone !== C.C__RootZone) {
-        H.functionTypeCheck(f, {func: 1, ret: {futureOr: 1, type: $R}, args: [t1]});
+        $R._eval$1("@<0/>")._bind$1(t1._precomputed1)._eval$1("1(2)")._as(f);
         if (onError != null)
           onError = P._registerErrorHandler(onError, currentZone);
       }
-      result = new P._Future($.Zone__current, [$R]);
+      result = new P._Future(currentZone, $R._eval$1("_Future<0>"));
       t2 = onError == null ? 1 : 3;
-      this._addListener$1(new P._FutureListener(result, t2, f, onError, [t1, $R]));
+      this._addListener$1(new P._FutureListener(result, t2, f, onError, t1._eval$1("@<1>")._bind$1($R)._eval$1("_FutureListener<1,2>")));
       return result;
     },
     then$1$1: function(f, $R) {
@@ -4611,32 +5560,34 @@
     },
     _thenAwait$1$2: function(f, onError, $E) {
       var result,
-        t1 = H.getTypeArgumentByIndex(this, 0);
-      H.functionTypeCheck(f, {func: 1, ret: {futureOr: 1, type: $E}, args: [t1]});
-      result = new P._Future($.Zone__current, [$E]);
-      this._addListener$1(new P._FutureListener(result, (onError == null ? 1 : 3) | 16, f, onError, [t1, $E]));
+        t1 = this.$ti;
+      t1._bind$1($E)._eval$1("1/(2)")._as(f);
+      result = new P._Future($.Zone__current, $E._eval$1("_Future<0>"));
+      this._addListener$1(new P._FutureListener(result, 19, f, onError, t1._eval$1("@<1>")._bind$1($E)._eval$1("_FutureListener<1,2>")));
       return result;
     },
     whenComplete$1: function(action) {
       var t1, result;
-      H.functionTypeCheck(action, {func: 1});
-      t1 = $.Zone__current;
-      result = new P._Future(t1, this.$ti);
-      if (t1 !== C.C__RootZone)
-        action = H.functionTypeCheck(action, {func: 1, ret: null});
-      t1 = H.getTypeArgumentByIndex(this, 0);
-      this._addListener$1(new P._FutureListener(result, 8, action, null, [t1, t1]));
+      type$.dynamic_Function._as(action);
+      t1 = this.$ti;
+      result = new P._Future($.Zone__current, t1);
+      this._addListener$1(new P._FutureListener(result, 8, action, null, t1._eval$1("@<1>")._bind$1(t1._precomputed1)._eval$1("_FutureListener<1,2>")));
       return result;
     },
+    _setValue$1: function(value) {
+      this.$ti._precomputed1._as(value);
+      this._state = 4;
+      this._resultOrListeners = value;
+    },
     _addListener$1: function(listener) {
       var source, _this = this,
         t1 = _this._state;
       if (t1 <= 1) {
-        listener._nextListener = H.interceptedTypeCheck(_this._resultOrListeners, "$is_FutureListener");
+        listener._nextListener = type$.nullable__FutureListener_dynamic_dynamic._as(_this._resultOrListeners);
         _this._resultOrListeners = listener;
       } else {
         if (t1 === 2) {
-          source = H.interceptedTypeCheck(_this._resultOrListeners, "$is_Future");
+          source = type$._Future_dynamic._as(_this._resultOrListeners);
           t1 = source._state;
           if (t1 < 4) {
             source._addListener$1(listener);
@@ -4645,26 +5596,27 @@
           _this._state = t1;
           _this._resultOrListeners = source._resultOrListeners;
         }
-        P._rootScheduleMicrotask(null, null, _this._zone, H.functionTypeCheck(new P._Future__addListener_closure(_this, listener), {func: 1, ret: -1}));
+        P._rootScheduleMicrotask(null, null, _this._zone, type$.void_Function._as(new P._Future__addListener_closure(_this, listener)));
       }
     },
     _prependListeners$1: function(listeners) {
-      var t1, existingListeners, cursor, cursor0, source, _this = this, _box_0 = {};
+      var t1, existingListeners, next, cursor, next0, source, _this = this, _box_0 = {};
       _box_0.listeners = listeners;
       if (listeners == null)
         return;
       t1 = _this._state;
       if (t1 <= 1) {
-        existingListeners = H.interceptedTypeCheck(_this._resultOrListeners, "$is_FutureListener");
-        cursor = _this._resultOrListeners = listeners;
+        existingListeners = type$.nullable__FutureListener_dynamic_dynamic._as(_this._resultOrListeners);
+        _this._resultOrListeners = listeners;
         if (existingListeners != null) {
-          for (; cursor0 = cursor._nextListener, cursor0 != null; cursor = cursor0)
-            ;
+          next = listeners._nextListener;
+          for (cursor = listeners; next != null; cursor = next, next = next0)
+            next0 = next._nextListener;
           cursor._nextListener = existingListeners;
         }
       } else {
         if (t1 === 2) {
-          source = H.interceptedTypeCheck(_this._resultOrListeners, "$is_Future");
+          source = type$._Future_dynamic._as(_this._resultOrListeners);
           t1 = source._state;
           if (t1 < 4) {
             source._prependListeners$1(listeners);
@@ -4674,11 +5626,11 @@
           _this._resultOrListeners = source._resultOrListeners;
         }
         _box_0.listeners = _this._reverseListeners$1(listeners);
-        P._rootScheduleMicrotask(null, null, _this._zone, H.functionTypeCheck(new P._Future__prependListeners_closure(_box_0, _this), {func: 1, ret: -1}));
+        P._rootScheduleMicrotask(null, null, _this._zone, type$.void_Function._as(new P._Future__prependListeners_closure(_box_0, _this)));
       }
     },
     _removeListeners$0: function() {
-      var current = H.interceptedTypeCheck(this._resultOrListeners, "$is_FutureListener");
+      var current = type$.nullable__FutureListener_dynamic_dynamic._as(this._resultOrListeners);
       this._resultOrListeners = null;
       return this._reverseListeners$1(current);
     },
@@ -4691,18 +5643,17 @@
       return prev;
     },
     _complete$1: function(value) {
-      var t2, listeners, _this = this,
-        t1 = H.getTypeArgumentByIndex(_this, 0);
-      H.futureOrCheck(value, {futureOr: 1, type: t1});
-      t2 = _this.$ti;
-      if (H.checkSubtype(value, "$isFuture", t2, "$asFuture"))
-        if (H.checkSubtype(value, "$is_Future", t2, null))
+      var listeners, _this = this,
+        t1 = _this.$ti;
+      t1._eval$1("1/")._as(value);
+      if (t1._eval$1("Future<1>")._is(value))
+        if (t1._is(value))
           P._Future__chainCoreFuture(value, _this);
         else
           P._Future__chainForeignFuture(value, _this);
       else {
         listeners = _this._removeListeners$0();
-        H.assertSubtypeOfRuntimeType(value, t1);
+        t1._precomputed1._as(value);
         _this._state = 4;
         _this._resultOrListeners = value;
         P._Future__propagateToListeners(_this, listeners);
@@ -4710,41 +5661,44 @@
     },
     _completeWithValue$1: function(value) {
       var listeners, _this = this;
-      H.assertSubtypeOfRuntimeType(value, H.getTypeArgumentByIndex(_this, 0));
+      _this.$ti._precomputed1._as(value);
       listeners = _this._removeListeners$0();
       _this._state = 4;
       _this._resultOrListeners = value;
       P._Future__propagateToListeners(_this, listeners);
     },
     _completeError$2: function(error, stackTrace) {
-      var listeners, _this = this;
-      H.interceptedTypeCheck(stackTrace, "$isStackTrace");
+      var listeners, t1, _this = this;
+      type$.StackTrace._as(stackTrace);
       listeners = _this._removeListeners$0();
+      t1 = P.AsyncError$(error, stackTrace);
       _this._state = 8;
-      _this._resultOrListeners = new P.AsyncError(error, stackTrace);
+      _this._resultOrListeners = t1;
       P._Future__propagateToListeners(_this, listeners);
     },
-    _completeError$1: function(error) {
-      return this._completeError$2(error, null);
-    },
     _asyncComplete$1: function(value) {
-      var _this = this;
-      H.futureOrCheck(value, {futureOr: 1, type: H.getTypeArgumentByIndex(_this, 0)});
-      if (H.checkSubtype(value, "$isFuture", _this.$ti, "$asFuture")) {
-        _this._chainFuture$1(value);
+      var t1 = this.$ti;
+      t1._eval$1("1/")._as(value);
+      if (t1._eval$1("Future<1>")._is(value)) {
+        this._chainFuture$1(value);
         return;
       }
+      this._asyncCompleteWithValue$1(t1._precomputed1._as(value));
+    },
+    _asyncCompleteWithValue$1: function(value) {
+      var _this = this;
+      _this.$ti._precomputed1._as(value);
       _this._state = 1;
-      P._rootScheduleMicrotask(null, null, _this._zone, H.functionTypeCheck(new P._Future__asyncComplete_closure(_this, value), {func: 1, ret: -1}));
+      P._rootScheduleMicrotask(null, null, _this._zone, type$.void_Function._as(new P._Future__asyncCompleteWithValue_closure(_this, value)));
     },
     _chainFuture$1: function(value) {
       var _this = this,
         t1 = _this.$ti;
-      H.assertSubtype(value, "$isFuture", t1, "$asFuture");
-      if (H.checkSubtype(value, "$is_Future", t1, null)) {
+      t1._eval$1("Future<1>")._as(value);
+      if (t1._is(value)) {
         if (value._state === 8) {
           _this._state = 1;
-          P._rootScheduleMicrotask(null, null, _this._zone, H.functionTypeCheck(new P._Future__chainFuture_closure(_this, value), {func: 1, ret: -1}));
+          P._rootScheduleMicrotask(null, null, _this._zone, type$.void_Function._as(new P._Future__chainFuture_closure(_this, value)));
         } else
           P._Future__chainCoreFuture(value, _this);
         return;
@@ -4752,9 +5706,9 @@
       P._Future__chainForeignFuture(value, _this);
     },
     _asyncCompleteError$2: function(error, stackTrace) {
-      H.interceptedTypeCheck(stackTrace, "$isStackTrace");
+      type$.StackTrace._as(stackTrace);
       this._state = 1;
-      P._rootScheduleMicrotask(null, null, this._zone, H.functionTypeCheck(new P._Future__asyncCompleteError_closure(this, error, stackTrace), {func: 1, ret: -1}));
+      P._rootScheduleMicrotask(null, null, this._zone, type$.void_Function._as(new P._Future__asyncCompleteError_closure(this, error, stackTrace)));
     },
     $isFuture: 1
   };
@@ -4762,13 +5716,13 @@
     call$0: function() {
       P._Future__propagateToListeners(this.$this, this.listener);
     },
-    $signature: 1
+    $signature: 0
   };
   P._Future__prependListeners_closure.prototype = {
     call$0: function() {
       P._Future__propagateToListeners(this.$this, this._box_0.listeners);
     },
-    $signature: 1
+    $signature: 0
   };
   P._Future__chainForeignFuture_closure.prototype = {
     call$1: function(value) {
@@ -4776,58 +5730,51 @@
       t1._state = 0;
       t1._complete$1(value);
     },
-    $signature: 7
+    $signature: 5
   };
   P._Future__chainForeignFuture_closure0.prototype = {
     call$2: function(error, stackTrace) {
-      H.interceptedTypeCheck(stackTrace, "$isStackTrace");
-      this.target._completeError$2(error, stackTrace);
-    },
-    call$1: function(error) {
-      return this.call$2(error, null);
+      this.target._completeError$2(error, type$.StackTrace._as(stackTrace));
     },
     "call*": "call$2",
-    $defaultValues: function() {
-      return [null];
-    },
-    $signature: 18
+    $requiredArgCount: 2,
+    $signature: 19
   };
   P._Future__chainForeignFuture_closure1.prototype = {
     call$0: function() {
       this.target._completeError$2(this.e, this.s);
     },
-    $signature: 1
+    $signature: 0
   };
-  P._Future__asyncComplete_closure.prototype = {
+  P._Future__asyncCompleteWithValue_closure.prototype = {
     call$0: function() {
-      var t1 = this.$this;
-      t1._completeWithValue$1(H.assertSubtypeOfRuntimeType(this.value, H.getTypeArgumentByIndex(t1, 0)));
+      this.$this._completeWithValue$1(this.value);
     },
-    $signature: 1
+    $signature: 0
   };
   P._Future__chainFuture_closure.prototype = {
     call$0: function() {
       P._Future__chainCoreFuture(this.value, this.$this);
     },
-    $signature: 1
+    $signature: 0
   };
   P._Future__asyncCompleteError_closure.prototype = {
     call$0: function() {
       this.$this._completeError$2(this.error, this.stackTrace);
     },
-    $signature: 1
+    $signature: 0
   };
   P._Future__propagateToListeners_handleWhenCompleteCallback.prototype = {
     call$0: function() {
       var e, s, t1, exception, t2, originalSource, _this = this, completeResult = null;
       try {
-        t1 = _this.listener;
-        completeResult = t1.result._zone.run$1$1(H.functionTypeCheck(t1.callback, {func: 1}), null);
+        t1 = _this._box_0.listener;
+        completeResult = t1.result._zone.run$1$1(type$.dynamic_Function._as(t1.callback), type$.dynamic);
       } catch (exception) {
         e = H.unwrapException(exception);
         s = H.getTraceFromException(exception);
         if (_this.hasError) {
-          t1 = H.interceptedTypeCheck(_this._box_1.source._resultOrListeners, "$isAsyncError").error;
+          t1 = type$.AsyncError._as(_this._box_1.source._resultOrListeners).error;
           t2 = e;
           t2 = t1 == null ? t2 == null : t1 === t2;
           t1 = t2;
@@ -4835,86 +5782,86 @@
           t1 = false;
         t2 = _this._box_0;
         if (t1)
-          t2.listenerValueOrError = H.interceptedTypeCheck(_this._box_1.source._resultOrListeners, "$isAsyncError");
+          t2.listenerValueOrError = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
         else
-          t2.listenerValueOrError = new P.AsyncError(e, s);
+          t2.listenerValueOrError = P.AsyncError$(e, s);
         t2.listenerHasError = true;
         return;
       }
-      if (!!J.getInterceptor$(completeResult).$isFuture) {
-        if (completeResult instanceof P._Future && completeResult._state >= 4) {
-          if (completeResult._state === 8) {
-            t1 = _this._box_0;
-            t1.listenerValueOrError = H.interceptedTypeCheck(completeResult._resultOrListeners, "$isAsyncError");
-            t1.listenerHasError = true;
-          }
-          return;
+      if (completeResult instanceof P._Future && completeResult._state >= 4) {
+        if (completeResult._state === 8) {
+          t1 = _this._box_0;
+          t1.listenerValueOrError = type$.AsyncError._as(completeResult._resultOrListeners);
+          t1.listenerHasError = true;
         }
+        return;
+      }
+      if (type$.Future_dynamic._is(completeResult)) {
         originalSource = _this._box_1.source;
         t1 = _this._box_0;
-        t1.listenerValueOrError = completeResult.then$1$1(new P._Future__propagateToListeners_handleWhenCompleteCallback_closure(originalSource), null);
+        t1.listenerValueOrError = completeResult.then$1$1(new P._Future__propagateToListeners_handleWhenCompleteCallback_closure(originalSource), type$.dynamic);
         t1.listenerHasError = false;
       }
     },
-    $signature: 0
+    $signature: 1
   };
   P._Future__propagateToListeners_handleWhenCompleteCallback_closure.prototype = {
     call$1: function(_) {
       return this.originalSource;
     },
-    $signature: 19
+    $signature: 20
   };
   P._Future__propagateToListeners_handleValueCallback.prototype = {
     call$0: function() {
-      var e, s, t1, t2, t3, t4, exception, _this = this;
+      var e, s, t1, t2, t3, t4, t5, exception;
       try {
-        t1 = _this.listener;
-        t2 = H.getTypeArgumentByIndex(t1, 0);
-        t3 = H.assertSubtypeOfRuntimeType(_this.sourceResult, t2);
-        t4 = H.getTypeArgumentByIndex(t1, 1);
-        _this._box_0.listenerValueOrError = t1.result._zone.runUnary$2$2(H.functionTypeCheck(t1.callback, {func: 1, ret: {futureOr: 1, type: t4}, args: [t2]}), t3, {futureOr: 1, type: t4}, t2);
+        t1 = this._box_0;
+        t2 = t1.listener;
+        t3 = t2.$ti;
+        t4 = t3._precomputed1;
+        t5 = t4._as(this.sourceResult);
+        t1.listenerValueOrError = t2.result._zone.runUnary$2$2(t3._eval$1("2/(1)")._as(t2.callback), t5, t3._eval$1("2/"), t4);
       } catch (exception) {
         e = H.unwrapException(exception);
         s = H.getTraceFromException(exception);
-        t1 = _this._box_0;
-        t1.listenerValueOrError = new P.AsyncError(e, s);
+        t1 = this._box_0;
+        t1.listenerValueOrError = P.AsyncError$(e, s);
         t1.listenerHasError = true;
       }
     },
-    $signature: 0
+    $signature: 1
   };
   P._Future__propagateToListeners_handleError.prototype = {
     call$0: function() {
-      var asyncError, e, s, t1, t2, exception, t3, t4, _this = this;
+      var asyncError, e, s, t1, exception, t2, t3, t4, _this = this;
       try {
-        asyncError = H.interceptedTypeCheck(_this._box_1.source._resultOrListeners, "$isAsyncError");
-        t1 = _this.listener;
-        if (H.boolConversionCheck(t1.matchesErrorTest$1(asyncError)) && t1.errorCallback != null) {
-          t2 = _this._box_0;
-          t2.listenerValueOrError = t1.handleError$1(asyncError);
-          t2.listenerHasError = false;
+        asyncError = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
+        t1 = _this._box_0;
+        if (H.boolConversionCheck(t1.listener.matchesErrorTest$1(asyncError)) && t1.listener.errorCallback != null) {
+          t1.listenerValueOrError = t1.listener.handleError$1(asyncError);
+          t1.listenerHasError = false;
         }
       } catch (exception) {
         e = H.unwrapException(exception);
         s = H.getTraceFromException(exception);
-        t1 = H.interceptedTypeCheck(_this._box_1.source._resultOrListeners, "$isAsyncError");
+        t1 = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
         t2 = t1.error;
         t3 = e;
         t4 = _this._box_0;
         if (t2 == null ? t3 == null : t2 === t3)
           t4.listenerValueOrError = t1;
         else
-          t4.listenerValueOrError = new P.AsyncError(e, s);
+          t4.listenerValueOrError = P.AsyncError$(e, s);
         t4.listenerHasError = true;
       }
     },
-    $signature: 0
+    $signature: 1
   };
   P._AsyncCallbackEntry.prototype = {};
   P.Stream.prototype = {
     get$length: function(_) {
       var t1 = {},
-        future = new P._Future($.Zone__current, [P.int]);
+        future = new P._Future($.Zone__current, type$._Future_int);
       t1.count = 0;
       this.listen$4$cancelOnError$onDone$onError(new P.Stream_length_closure(t1, this), true, new P.Stream_length_closure0(t1, future), future.get$_completeError());
       return future;
@@ -4922,18 +5869,18 @@
   };
   P.Stream_length_closure.prototype = {
     call$1: function(_) {
-      H.assertSubtypeOfRuntimeType(_, H.getTypeArgumentByIndex(this.$this, 0));
+      H._instanceType(this.$this)._precomputed1._as(_);
       ++this._box_0.count;
     },
     $signature: function() {
-      return {func: 1, ret: P.Null, args: [H.getTypeArgumentByIndex(this.$this, 0)]};
+      return H._instanceType(this.$this)._eval$1("Null(1)");
     }
   };
   P.Stream_length_closure0.prototype = {
     call$0: function() {
       this.future._complete$1(this._box_0.count);
     },
-    $signature: 1
+    $signature: 0
   };
   P.StreamSubscription.prototype = {};
   P.StreamTransformerBase.prototype = {};
@@ -4941,30 +5888,27 @@
     get$_pendingEvents: function() {
       var t1, _this = this;
       if ((_this._state & 8) === 0)
-        return H.assertSubtype(_this._varData, "$is_PendingEvents", _this.$ti, "$as_PendingEvents");
-      t1 = _this.$ti;
-      return H.assertSubtype(H.assertSubtype(_this._varData, "$is_StreamControllerAddStreamState", t1, "$as_StreamControllerAddStreamState").get$varData(), "$is_PendingEvents", t1, "$as_PendingEvents");
+        return H._instanceType(_this)._eval$1("_PendingEvents<1>?")._as(_this._varData);
+      t1 = H._instanceType(_this);
+      return t1._eval$1("_PendingEvents<1>?")._as(t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).get$varData());
     },
     _ensurePendingEvents$0: function() {
-      var t1, state, _this = this;
+      var events, t1, _this = this;
       if ((_this._state & 8) === 0) {
-        t1 = _this._varData;
-        if (t1 == null)
-          t1 = _this._varData = new P._StreamImplEvents(_this.$ti);
-        return H.assertSubtype(t1, "$is_StreamImplEvents", _this.$ti, "$as_StreamImplEvents");
+        events = _this._varData;
+        if (events == null)
+          events = _this._varData = new P._StreamImplEvents(H._instanceType(_this)._eval$1("_StreamImplEvents<1>"));
+        return H._instanceType(_this)._eval$1("_StreamImplEvents<1>")._as(events);
       }
-      t1 = _this.$ti;
-      state = H.assertSubtype(_this._varData, "$is_StreamControllerAddStreamState", t1, "$as_StreamControllerAddStreamState");
-      state.get$varData();
-      return H.assertSubtype(state.get$varData(), "$is_StreamImplEvents", t1, "$as_StreamImplEvents");
+      t1 = H._instanceType(_this);
+      events = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).get$varData();
+      return t1._eval$1("_StreamImplEvents<1>")._as(events);
     },
     get$_subscription: function() {
-      var t1, _this = this;
-      if ((_this._state & 8) !== 0) {
-        t1 = _this.$ti;
-        return H.assertSubtype(H.assertSubtype(_this._varData, "$is_StreamControllerAddStreamState", t1, "$as_StreamControllerAddStreamState").get$varData(), "$is_ControllerSubscription", t1, "$as_ControllerSubscription");
-      }
-      return H.assertSubtype(_this._varData, "$is_ControllerSubscription", _this.$ti, "$as_ControllerSubscription");
+      var varData = this._varData;
+      if ((this._state & 8) !== 0)
+        varData = type$._StreamControllerAddStreamState_nullable_Object._as(varData).get$varData();
+      return H._instanceType(this)._eval$1("_ControllerSubscription<1>")._as(varData);
     },
     _badEventState$0: function() {
       if ((this._state & 4) !== 0)
@@ -4974,19 +5918,20 @@
     _ensureDoneFuture$0: function() {
       var t1 = this._doneFuture;
       if (t1 == null)
-        t1 = this._doneFuture = (this._state & 2) !== 0 ? $.$get$Future__nullFuture() : new P._Future($.Zone__current, [null]);
+        t1 = this._doneFuture = (this._state & 2) !== 0 ? $.$get$Future__nullFuture() : new P._Future($.Zone__current, type$._Future_void);
       return t1;
     },
     add$1: function(_, value) {
-      var t1, _this = this;
-      H.assertSubtypeOfRuntimeType(value, H.getTypeArgumentByIndex(_this, 0));
-      t1 = _this._state;
-      if (t1 >= 4)
+      var t2, _this = this,
+        t1 = H._instanceType(_this);
+      t1._precomputed1._as(value);
+      t2 = _this._state;
+      if (t2 >= 4)
         throw H.wrapException(_this._badEventState$0());
-      if ((t1 & 1) !== 0)
+      if ((t2 & 1) !== 0)
         _this._sendData$1(value);
-      else if ((t1 & 3) === 0)
-        _this._ensurePendingEvents$0().add$1(0, new P._DelayedData(value, _this.$ti));
+      else if ((t2 & 3) === 0)
+        _this._ensurePendingEvents$0().add$1(0, new P._DelayedData(value, t1._eval$1("_DelayedData<1>")));
     },
     close$0: function(_) {
       var _this = this,
@@ -5003,38 +5948,61 @@
       return _this._ensureDoneFuture$0();
     },
     _subscribe$4: function(onData, onError, onDone, cancelOnError) {
-      var t2, t3, t4, subscription, pendingEvents, addState, _this = this,
-        t1 = H.getTypeArgumentByIndex(_this, 0);
-      H.functionTypeCheck(onData, {func: 1, ret: -1, args: [t1]});
-      H.functionTypeCheck(onDone, {func: 1, ret: -1});
+      var t2, t3, t4, t5, t6, subscription, pendingEvents, addState, _this = this,
+        t1 = H._instanceType(_this);
+      t1._eval$1("~(1)?")._as(onData);
+      type$.nullable_void_Function._as(onDone);
       if ((_this._state & 3) !== 0)
         throw H.wrapException(P.StateError$("Stream has already been listened to."));
       t2 = $.Zone__current;
       t3 = cancelOnError ? 1 : 0;
-      t4 = _this.$ti;
-      subscription = new P._ControllerSubscription(_this, t2, t3, t4);
-      subscription._BufferingStreamSubscription$4(onData, onError, onDone, cancelOnError, t1);
+      type$.$env_1_1_void._bind$1(t1._precomputed1)._eval$1("1(2)")._as(onData);
+      t4 = P._BufferingStreamSubscription__registerErrorHandler(t2, onError);
+      t5 = onDone == null ? P.async___nullDoneHandler$closure() : onDone;
+      t6 = type$.void_Function;
+      subscription = new P._ControllerSubscription(_this, onData, t4, t6._as(t5), t2, t3, t1._eval$1("_ControllerSubscription<1>"));
       pendingEvents = _this.get$_pendingEvents();
-      t1 = _this._state |= 1;
-      if ((t1 & 8) !== 0) {
-        addState = H.assertSubtype(_this._varData, "$is_StreamControllerAddStreamState", t4, "$as_StreamControllerAddStreamState");
+      t3 = _this._state |= 1;
+      if ((t3 & 8) !== 0) {
+        addState = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData);
         addState.set$varData(subscription);
         addState.resume$0();
       } else
         _this._varData = subscription;
       subscription._setPendingEvents$1(pendingEvents);
-      subscription._guardCallback$1(new P._StreamController__subscribe_closure(_this));
+      t1 = t6._as(new P._StreamController__subscribe_closure(_this));
+      t2 = subscription._state;
+      subscription._state = t2 | 32;
+      t1.call$0();
+      subscription._state &= 4294967263;
+      subscription._checkState$1((t2 & 4) !== 0);
       return subscription;
     },
     _recordCancel$1: function(subscription) {
-      var result, _this = this,
-        t1 = _this.$ti;
-      H.assertSubtype(subscription, "$isStreamSubscription", t1, "$asStreamSubscription");
+      var result, onCancel, cancelResult, e, s, exception, result0, _this = this,
+        t1 = H._instanceType(_this);
+      t1._eval$1("StreamSubscription<1>")._as(subscription);
       result = null;
       if ((_this._state & 8) !== 0)
-        result = H.assertSubtype(_this._varData, "$is_StreamControllerAddStreamState", t1, "$as_StreamControllerAddStreamState").cancel$0();
+        result = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).cancel$0();
       _this._varData = null;
       _this._state = _this._state & 4294967286 | 2;
+      onCancel = _this.onCancel;
+      if (onCancel != null)
+        if (result == null)
+          try {
+            cancelResult = onCancel.call$0();
+            if (type$.Future_void._is(cancelResult))
+              result = cancelResult;
+          } catch (exception) {
+            e = H.unwrapException(exception);
+            s = H.getTraceFromException(exception);
+            result0 = new P._Future($.Zone__current, type$._Future_void);
+            result0._asyncCompleteError$2(e, s);
+            result = result0;
+          }
+        else
+          result = result.whenComplete$1(onCancel);
       t1 = new P._StreamController__recordCancel_complete(_this);
       if (result != null)
         result = result.whenComplete$1(t1);
@@ -5050,21 +6018,21 @@
     call$0: function() {
       P._runGuarded(this.$this.onListen);
     },
-    $signature: 1
+    $signature: 0
   };
   P._StreamController__recordCancel_complete.prototype = {
     call$0: function() {
-      var t1 = this.$this._doneFuture;
-      if (t1 != null && t1._state === 0)
-        t1._asyncComplete$1(null);
+      var doneFuture = this.$this._doneFuture;
+      if (doneFuture != null && doneFuture._state === 0)
+        doneFuture._asyncComplete$1(null);
     },
-    $signature: 0
+    $signature: 1
   };
   P._AsyncStreamControllerDispatch.prototype = {
     _sendData$1: function(data) {
-      var t1 = H.getTypeArgumentByIndex(this, 0);
-      H.assertSubtypeOfRuntimeType(data, t1);
-      this.get$_subscription()._addPending$1(new P._DelayedData(data, [t1]));
+      var t1 = this.$ti;
+      t1._precomputed1._as(data);
+      this.get$_subscription()._addPending$1(new P._DelayedData(data, t1._eval$1("_DelayedData<1>")));
     },
     _sendError$2: function(error, stackTrace) {
       this.get$_subscription()._addPending$1(new P._DelayedError(error, stackTrace));
@@ -5092,95 +6060,37 @@
     },
     _onPause$0: function() {
       var t1 = this._controller,
-        t2 = H.getTypeArgumentByIndex(t1, 0);
-      H.assertSubtype(this, "$isStreamSubscription", [t2], "$asStreamSubscription");
+        t2 = H._instanceType(t1);
+      t2._eval$1("StreamSubscription<1>")._as(this);
       if ((t1._state & 8) !== 0)
-        C.JSNull_methods.pause$0(H.assertSubtype(t1._varData, "$is_StreamControllerAddStreamState", [t2], "$as_StreamControllerAddStreamState"));
+        t2._eval$1("_StreamControllerAddStreamState<1>")._as(t1._varData).pause$0(0);
       P._runGuarded(t1.onPause);
     },
     _onResume$0: function() {
       var t1 = this._controller,
-        t2 = H.getTypeArgumentByIndex(t1, 0);
-      H.assertSubtype(this, "$isStreamSubscription", [t2], "$asStreamSubscription");
+        t2 = H._instanceType(t1);
+      t2._eval$1("StreamSubscription<1>")._as(this);
       if ((t1._state & 8) !== 0)
-        H.assertSubtype(t1._varData, "$is_StreamControllerAddStreamState", [t2], "$as_StreamControllerAddStreamState").resume$0();
+        t2._eval$1("_StreamControllerAddStreamState<1>")._as(t1._varData).resume$0();
       P._runGuarded(t1.onResume);
     }
   };
   P._StreamSinkWrapper.prototype = {};
   P._BufferingStreamSubscription.prototype = {
-    _BufferingStreamSubscription$4: function(onData, onError, onDone, cancelOnError, $T) {
-      var handleError, handleDone, _this = this,
-        t1 = H.getTypeArgumentByIndex(_this, 0);
-      H.functionTypeCheck(onData, {func: 1, ret: -1, args: [t1]});
-      _this.set$_onData(H.functionTypeCheck(onData, {func: 1, ret: null, args: [t1]}));
-      handleError = onError == null ? P.async___nullErrorHandler$closure() : onError;
-      if (H.functionTypeTest(handleError, {func: 1, ret: -1, args: [P.Object, P.StackTrace]}))
-        _this._onError = _this._zone.registerBinaryCallback$3$1(handleError, null, P.Object, P.StackTrace);
-      else if (H.functionTypeTest(handleError, {func: 1, ret: -1, args: [P.Object]}))
-        _this._onError = H.functionTypeCheck(handleError, {func: 1, ret: null, args: [P.Object]});
-      else
-        H.throwExpression(P.ArgumentError$("handleError callback must take either an Object (the error), or both an Object (the error) and a StackTrace."));
-      H.functionTypeCheck(onDone, {func: 1, ret: -1});
-      handleDone = onDone == null ? P.async___nullDoneHandler$closure() : onDone;
-      _this.set$_onDone(H.functionTypeCheck(handleDone, {func: 1, ret: -1}));
-    },
     _setPendingEvents$1: function(pendingEvents) {
       var _this = this;
-      H.assertSubtype(pendingEvents, "$is_PendingEvents", _this.$ti, "$as_PendingEvents");
+      H._instanceType(_this)._eval$1("_PendingEvents<1>?")._as(pendingEvents);
       if (pendingEvents == null)
         return;
       _this.set$_pending(pendingEvents);
       if (pendingEvents.lastPendingEvent != null) {
-        _this._state = (_this._state | 64) >>> 0;
-        _this._pending.schedule$1(_this);
+        _this._state |= 64;
+        pendingEvents.schedule$1(_this);
       }
     },
-    pause$0: function(_) {
-      var t2, t3, _this = this,
-        t1 = _this._state;
-      if ((t1 & 8) !== 0)
-        return;
-      t2 = (t1 + 128 | 4) >>> 0;
-      _this._state = t2;
-      if (t1 < 128 && _this._pending != null) {
-        t3 = _this._pending;
-        if (t3._state === 1)
-          t3._state = 3;
-      }
-      if ((t1 & 4) === 0 && (t2 & 32) === 0)
-        _this._guardCallback$1(_this.get$_onPause());
-    },
-    resume$0: function() {
-      var _this = this,
-        t1 = _this._state;
-      if ((t1 & 8) !== 0)
-        return;
-      if (t1 >= 128) {
-        t1 = _this._state = t1 - 128;
-        if (t1 < 128)
-          if ((t1 & 64) !== 0 && _this._pending.lastPendingEvent != null)
-            _this._pending.schedule$1(_this);
-          else {
-            t1 = (t1 & 4294967291) >>> 0;
-            _this._state = t1;
-            if ((t1 & 32) === 0)
-              _this._guardCallback$1(_this.get$_onResume());
-          }
-      }
-    },
-    cancel$0: function() {
-      var _this = this,
-        t1 = (_this._state & 4294967279) >>> 0;
-      _this._state = t1;
-      if ((t1 & 8) === 0)
-        _this._cancel$0();
-      t1 = _this._cancelFuture;
-      return t1 == null ? $.$get$Future__nullFuture() : t1;
-    },
     _cancel$0: function() {
       var t2, _this = this,
-        t1 = _this._state = (_this._state | 8) >>> 0;
+        t1 = _this._state |= 8;
       if ((t1 & 64) !== 0) {
         t2 = _this._pending;
         if (t2._state === 1)
@@ -5195,45 +6105,44 @@
     _onResume$0: function() {
     },
     _onCancel$0: function() {
-      return;
+      return null;
     },
     _addPending$1: function($event) {
       var _this = this,
-        t1 = _this.$ti,
-        pending = H.assertSubtype(_this._pending, "$is_StreamImplEvents", t1, "$as_StreamImplEvents");
-      if (pending == null) {
-        pending = new P._StreamImplEvents(t1);
-        _this.set$_pending(pending);
-      }
+        t1 = H._instanceType(_this),
+        pending = t1._eval$1("_StreamImplEvents<1>?")._as(_this._pending);
+      if (pending == null)
+        pending = new P._StreamImplEvents(t1._eval$1("_StreamImplEvents<1>"));
+      _this.set$_pending(pending);
       pending.add$1(0, $event);
       t1 = _this._state;
       if ((t1 & 64) === 0) {
-        t1 = (t1 | 64) >>> 0;
+        t1 |= 64;
         _this._state = t1;
         if (t1 < 128)
-          _this._pending.schedule$1(_this);
+          pending.schedule$1(_this);
       }
     },
     _sendData$1: function(data) {
       var t2, _this = this,
-        t1 = H.getTypeArgumentByIndex(_this, 0);
-      H.assertSubtypeOfRuntimeType(data, t1);
+        t1 = H._instanceType(_this)._precomputed1;
+      t1._as(data);
       t2 = _this._state;
-      _this._state = (t2 | 32) >>> 0;
+      _this._state = t2 | 32;
       _this._zone.runUnaryGuarded$1$2(_this._onData, data, t1);
-      _this._state = (_this._state & 4294967263) >>> 0;
+      _this._state &= 4294967263;
       _this._checkState$1((t2 & 4) !== 0);
     },
     _sendError$2: function(error, stackTrace) {
-      var _this = this,
+      var cancelFuture, _this = this,
         t1 = _this._state,
         t2 = new P._BufferingStreamSubscription__sendError_sendError(_this, error, stackTrace);
       if ((t1 & 1) !== 0) {
-        _this._state = (t1 | 16) >>> 0;
+        _this._state = t1 | 16;
         _this._cancel$0();
-        t1 = _this._cancelFuture;
-        if (t1 != null && t1 !== $.$get$Future__nullFuture())
-          t1.whenComplete$1(t2);
+        cancelFuture = _this._cancelFuture;
+        if (cancelFuture != null && cancelFuture !== $.$get$Future__nullFuture())
+          cancelFuture.whenComplete$1(t2);
         else
           t2.call$0();
       } else {
@@ -5242,40 +6151,32 @@
       }
     },
     _sendDone$0: function() {
-      var t2, _this = this,
+      var cancelFuture, _this = this,
         t1 = new P._BufferingStreamSubscription__sendDone_sendDone(_this);
       _this._cancel$0();
-      _this._state = (_this._state | 16) >>> 0;
-      t2 = _this._cancelFuture;
-      if (t2 != null && t2 !== $.$get$Future__nullFuture())
-        t2.whenComplete$1(t1);
+      _this._state |= 16;
+      cancelFuture = _this._cancelFuture;
+      if (cancelFuture != null && cancelFuture !== $.$get$Future__nullFuture())
+        cancelFuture.whenComplete$1(t1);
       else
         t1.call$0();
     },
-    _guardCallback$1: function(callback) {
-      var t1, _this = this;
-      H.functionTypeCheck(callback, {func: 1, ret: -1});
-      t1 = _this._state;
-      _this._state = (t1 | 32) >>> 0;
-      callback.call$0();
-      _this._state = (_this._state & 4294967263) >>> 0;
-      _this._checkState$1((t1 & 4) !== 0);
-    },
     _checkState$1: function(wasInputPaused) {
       var t2, isInputPaused, _this = this,
         t1 = _this._state;
       if ((t1 & 64) !== 0 && _this._pending.lastPendingEvent == null) {
-        t1 = _this._state = (t1 & 4294967231) >>> 0;
+        t1 = _this._state = t1 & 4294967231;
         if ((t1 & 4) !== 0)
           if (t1 < 128) {
             t2 = _this._pending;
-            t2 = t2 == null || t2.lastPendingEvent == null;
+            t2 = t2 == null ? null : t2.lastPendingEvent == null;
+            t2 = t2 !== false;
           } else
             t2 = false;
         else
           t2 = false;
         if (t2) {
-          t1 = (t1 & 4294967291) >>> 0;
+          t1 &= 4294967291;
           _this._state = t1;
         }
       }
@@ -5287,25 +6188,18 @@
         isInputPaused = (t1 & 4) !== 0;
         if (wasInputPaused === isInputPaused)
           break;
-        _this._state = (t1 ^ 32) >>> 0;
+        _this._state = t1 ^ 32;
         if (isInputPaused)
           _this._onPause$0();
         else
           _this._onResume$0();
-        t1 = (_this._state & 4294967263) >>> 0;
-        _this._state = t1;
+        t1 = _this._state &= 4294967263;
       }
       if ((t1 & 64) !== 0 && t1 < 128)
         _this._pending.schedule$1(_this);
     },
-    set$_onData: function(_onData) {
-      this._onData = H.functionTypeCheck(_onData, {func: 1, ret: -1, args: [H.getTypeArgumentByIndex(this, 0)]});
-    },
-    set$_onDone: function(_onDone) {
-      this._onDone = H.functionTypeCheck(_onDone, {func: 1, ret: -1});
-    },
     set$_pending: function(_pending) {
-      this._pending = H.assertSubtype(_pending, "$is_PendingEvents", this.$ti, "$as_PendingEvents");
+      this._pending = H._instanceType(this)._eval$1("_PendingEvents<1>?")._as(_pending);
     },
     $isStreamSubscription: 1,
     $is_EventDispatch: 1
@@ -5317,18 +6211,18 @@
         t2 = t1._state;
       if ((t2 & 8) !== 0 && (t2 & 16) === 0)
         return;
-      t1._state = (t2 | 32) >>> 0;
+      t1._state = t2 | 32;
       onError = t1._onError;
       t2 = this.error;
-      t3 = P.Object;
+      t3 = type$.Object;
       t4 = t1._zone;
-      if (H.functionTypeTest(onError, {func: 1, ret: -1, args: [P.Object, P.StackTrace]}))
-        t4.runBinaryGuarded$2$3(onError, t2, this.stackTrace, t3, P.StackTrace);
+      if (type$.void_Function_Object_StackTrace._is(onError))
+        t4.runBinaryGuarded$2$3(onError, t2, this.stackTrace, t3, type$.StackTrace);
       else
-        t4.runUnaryGuarded$1$2(H.functionTypeCheck(t1._onError, {func: 1, ret: -1, args: [P.Object]}), t2, t3);
-      t1._state = (t1._state & 4294967263) >>> 0;
+        t4.runUnaryGuarded$1$2(type$.void_Function_Object._as(onError), t2, t3);
+      t1._state &= 4294967263;
     },
-    $signature: 0
+    $signature: 1
   };
   P._BufferingStreamSubscription__sendDone_sendDone.prototype = {
     call$0: function() {
@@ -5336,17 +6230,18 @@
         t2 = t1._state;
       if ((t2 & 16) === 0)
         return;
-      t1._state = (t2 | 42) >>> 0;
+      t1._state = t2 | 42;
       t1._zone.runGuarded$1(t1._onDone);
-      t1._state = (t1._state & 4294967263) >>> 0;
+      t1._state &= 4294967263;
     },
-    $signature: 0
+    $signature: 1
   };
   P._StreamImpl.prototype = {
     listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
-      H.functionTypeCheck(onData, {func: 1, ret: -1, args: [H.getTypeArgumentByIndex(this, 0)]});
-      H.functionTypeCheck(onDone, {func: 1, ret: -1});
-      return this._controller._subscribe$4(H.functionTypeCheck(onData, {func: 1, ret: -1, args: [H.getTypeArgumentByIndex(this, 0)]}), onError, onDone, true === cancelOnError);
+      var t1 = this.$ti;
+      t1._eval$1("~(1)?")._as(onData);
+      type$.nullable_void_Function._as(onDone);
+      return this._controller._subscribe$4(t1._eval$1("~(1)?")._as(onData), onError, onDone, cancelOnError === true);
     },
     listen$1: function(onData) {
       return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
@@ -5357,7 +6252,7 @@
   };
   P._DelayedEvent.prototype = {
     set$next: function(next) {
-      this.next = H.interceptedTypeCheck(next, "$is_DelayedEvent");
+      this.next = type$.nullable__DelayedEvent_dynamic._as(next);
     },
     get$next: function() {
       return this.next;
@@ -5365,14 +6260,12 @@
   };
   P._DelayedData.prototype = {
     perform$1: function(dispatch) {
-      H.assertSubtype(dispatch, "$is_EventDispatch", this.$ti, "$as_EventDispatch")._sendData$1(this.value);
+      this.$ti._eval$1("_EventDispatch<1>")._as(dispatch)._sendData$1(this.value);
     }
   };
   P._DelayedError.prototype = {
     perform$1: function(dispatch) {
       dispatch._sendError$2(this.error, this.stackTrace);
-    },
-    $as_DelayedEvent: function() {
     }
   };
   P._DelayedDone.prototype = {
@@ -5380,19 +6273,17 @@
       dispatch._sendDone$0();
     },
     get$next: function() {
-      return;
+      return null;
     },
     set$next: function(_) {
       throw H.wrapException(P.StateError$("No events after a done."));
     },
-    $is_DelayedEvent: 1,
-    $as_DelayedEvent: function() {
-    }
+    $is_DelayedEvent: 1
   };
   P._PendingEvents.prototype = {
     schedule$1: function(dispatch) {
       var t1, _this = this;
-      H.assertSubtype(dispatch, "$is_EventDispatch", _this.$ti, "$as_EventDispatch");
+      _this.$ti._eval$1("_EventDispatch<1>")._as(dispatch);
       t1 = _this._state;
       if (t1 === 1)
         return;
@@ -5406,211 +6297,137 @@
   };
   P._PendingEvents_schedule_closure.prototype = {
     call$0: function() {
-      var t2, $event, t3,
+      var t2, $event, nextEvent,
         t1 = this.$this,
         oldState = t1._state;
       t1._state = 0;
       if (oldState === 3)
         return;
-      t2 = H.assertSubtype(this.dispatch, "$is_EventDispatch", [H.getTypeArgumentByIndex(t1, 0)], "$as_EventDispatch");
+      t2 = t1.$ti._eval$1("_EventDispatch<1>")._as(this.dispatch);
       $event = t1.firstPendingEvent;
-      t3 = $event.get$next();
-      t1.firstPendingEvent = t3;
-      if (t3 == null)
+      nextEvent = $event.get$next();
+      t1.firstPendingEvent = nextEvent;
+      if (nextEvent == null)
         t1.lastPendingEvent = null;
       $event.perform$1(t2);
     },
-    $signature: 1
+    $signature: 0
   };
   P._StreamImplEvents.prototype = {
     add$1: function(_, $event) {
       var _this = this,
-        t1 = _this.lastPendingEvent;
-      if (t1 == null)
+        lastEvent = _this.lastPendingEvent;
+      if (lastEvent == null)
         _this.firstPendingEvent = _this.lastPendingEvent = $event;
       else {
-        t1.set$next($event);
+        lastEvent.set$next($event);
         _this.lastPendingEvent = $event;
       }
     }
   };
-  P._StreamIterator.prototype = {
-    get$current: function() {
-      var _this = this;
-      if (_this._subscription != null && _this._isPaused)
-        return H.assertSubtypeOfRuntimeType(_this._stateData, H.getTypeArgumentByIndex(_this, 0));
-      return;
-    },
-    moveNext$0: function() {
-      var future, _this = this,
-        t1 = _this._subscription;
-      if (t1 != null) {
-        if (_this._isPaused) {
-          future = new P._Future($.Zone__current, [P.bool]);
-          _this._stateData = future;
-          _this._isPaused = false;
-          t1.resume$0();
-          return future;
-        }
-        throw H.wrapException(P.StateError$("Already waiting for next."));
-      }
-      return _this._initializeOrDone$0();
-    },
-    _initializeOrDone$0: function() {
-      var _this = this,
-        stateData = _this._stateData;
-      if (stateData != null) {
-        _this._subscription = H.assertSubtype(stateData, "$isStream", _this.$ti, "$asStream").listen$4$cancelOnError$onDone$onError(_this.get$_onData(), true, _this.get$_onDone(), _this.get$_onError());
-        return _this._stateData = new P._Future($.Zone__current, [P.bool]);
-      }
-      return $.$get$Future__falseFuture();
-    },
-    cancel$0: function() {
-      var _this = this,
-        subscription = H.assertSubtype(_this._subscription, "$isStreamSubscription", _this.$ti, "$asStreamSubscription"),
-        stateData = _this._stateData;
-      _this._stateData = null;
-      if (subscription != null) {
-        _this._subscription = null;
-        if (!_this._isPaused)
-          H.assertSubtype(stateData, "$is_Future", [P.bool], "$as_Future")._asyncComplete$1(false);
-        return subscription.cancel$0();
-      }
-      return $.$get$Future__nullFuture();
-    },
-    _onData$1: function(data) {
-      var moveNextFuture, t1, _this = this;
-      H.assertSubtypeOfRuntimeType(data, H.getTypeArgumentByIndex(_this, 0));
-      moveNextFuture = H.assertSubtype(_this._stateData, "$is_Future", [P.bool], "$as_Future");
-      _this._stateData = data;
-      _this._isPaused = true;
-      moveNextFuture._complete$1(true);
-      t1 = _this._subscription;
-      if (t1 != null && _this._isPaused)
-        t1.pause$0(0);
-    },
-    _onError$2: function(error, stackTrace) {
-      var moveNextFuture;
-      H.interceptedTypeCheck(stackTrace, "$isStackTrace");
-      moveNextFuture = H.assertSubtype(this._stateData, "$is_Future", [P.bool], "$as_Future");
-      this._stateData = this._subscription = null;
-      moveNextFuture._completeError$2(error, stackTrace);
-    },
-    _onError$1: function(error) {
-      return this._onError$2(error, null);
-    },
-    _onDone$0: function() {
-      var moveNextFuture = H.assertSubtype(this._stateData, "$is_Future", [P.bool], "$as_Future");
-      this._stateData = this._subscription = null;
-      moveNextFuture._complete$1(false);
-    }
-  };
+  P._StreamIterator.prototype = {};
   P.AsyncError.prototype = {
     toString$0: function(_) {
       return H.S(this.error);
     },
-    $isError: 1
+    $isError: 1,
+    get$stackTrace: function() {
+      return this.stackTrace;
+    }
   };
   P._Zone.prototype = {$isZone: 1};
   P._rootHandleUncaughtError_closure.prototype = {
     call$0: function() {
-      var error,
-        t1 = this._box_0,
-        t2 = t1.error;
-      t1 = t2 == null ? t1.error = new P.NullThrownError() : t2;
-      t2 = this.stackTrace;
-      if (t2 == null)
-        throw H.wrapException(t1);
-      error = H.wrapException(t1);
-      error.stack = t2.toString$0(0);
+      var error = H.wrapException(this.error);
+      error.stack = J.toString$0$(this.stackTrace);
       throw error;
     },
-    $signature: 1
+    $signature: 0
   };
   P._RootZone.prototype = {
     runGuarded$1: function(f) {
       var e, s, exception, _null = null;
-      H.functionTypeCheck(f, {func: 1, ret: -1});
+      type$.void_Function._as(f);
       try {
         if (C.C__RootZone === $.Zone__current) {
           f.call$0();
           return;
         }
-        P._rootRun(_null, _null, this, f, -1);
+        P._rootRun(_null, _null, this, f, type$.void);
       } catch (exception) {
         e = H.unwrapException(exception);
         s = H.getTraceFromException(exception);
-        P._rootHandleUncaughtError(_null, _null, this, e, H.interceptedTypeCheck(s, "$isStackTrace"));
+        P._rootHandleUncaughtError(_null, _null, this, e, type$.StackTrace._as(s));
       }
     },
     runUnaryGuarded$1$2: function(f, arg, $T) {
       var e, s, exception, _null = null;
-      H.functionTypeCheck(f, {func: 1, ret: -1, args: [$T]});
-      H.assertSubtypeOfRuntimeType(arg, $T);
+      $T._eval$1("~(0)")._as(f);
+      $T._as(arg);
       try {
         if (C.C__RootZone === $.Zone__current) {
           f.call$1(arg);
           return;
         }
-        P._rootRunUnary(_null, _null, this, f, arg, -1, $T);
+        P._rootRunUnary(_null, _null, this, f, arg, type$.void, $T);
       } catch (exception) {
         e = H.unwrapException(exception);
         s = H.getTraceFromException(exception);
-        P._rootHandleUncaughtError(_null, _null, this, e, H.interceptedTypeCheck(s, "$isStackTrace"));
+        P._rootHandleUncaughtError(_null, _null, this, e, type$.StackTrace._as(s));
       }
     },
     runBinaryGuarded$2$3: function(f, arg1, arg2, T1, T2) {
       var e, s, exception, _null = null;
-      H.functionTypeCheck(f, {func: 1, ret: -1, args: [T1, T2]});
-      H.assertSubtypeOfRuntimeType(arg1, T1);
-      H.assertSubtypeOfRuntimeType(arg2, T2);
+      T1._eval$1("@<0>")._bind$1(T2)._eval$1("~(1,2)")._as(f);
+      T1._as(arg1);
+      T2._as(arg2);
       try {
         if (C.C__RootZone === $.Zone__current) {
           f.call$2(arg1, arg2);
           return;
         }
-        P._rootRunBinary(_null, _null, this, f, arg1, arg2, -1, T1, T2);
+        P._rootRunBinary(_null, _null, this, f, arg1, arg2, type$.void, T1, T2);
       } catch (exception) {
         e = H.unwrapException(exception);
         s = H.getTraceFromException(exception);
-        P._rootHandleUncaughtError(_null, _null, this, e, H.interceptedTypeCheck(s, "$isStackTrace"));
+        P._rootHandleUncaughtError(_null, _null, this, e, type$.StackTrace._as(s));
       }
     },
     bindCallback$1$1: function(f, $R) {
-      return new P._RootZone_bindCallback_closure(this, H.functionTypeCheck(f, {func: 1, ret: $R}), $R);
+      return new P._RootZone_bindCallback_closure(this, $R._eval$1("0()")._as(f), $R);
     },
     bindCallbackGuarded$1: function(f) {
-      return new P._RootZone_bindCallbackGuarded_closure(this, H.functionTypeCheck(f, {func: 1, ret: -1}));
+      return new P._RootZone_bindCallbackGuarded_closure(this, type$.void_Function._as(f));
     },
     bindUnaryCallbackGuarded$1$1: function(f, $T) {
-      return new P._RootZone_bindUnaryCallbackGuarded_closure(this, H.functionTypeCheck(f, {func: 1, ret: -1, args: [$T]}), $T);
+      return new P._RootZone_bindUnaryCallbackGuarded_closure(this, $T._eval$1("~(0)")._as(f), $T);
     },
     $index: function(_, key) {
-      return;
+      return null;
     },
     run$1$1: function(f, $R) {
-      H.functionTypeCheck(f, {func: 1, ret: $R});
+      $R._eval$1("0()")._as(f);
       if ($.Zone__current === C.C__RootZone)
         return f.call$0();
       return P._rootRun(null, null, this, f, $R);
     },
     runUnary$2$2: function(f, arg, $R, $T) {
-      H.functionTypeCheck(f, {func: 1, ret: $R, args: [$T]});
-      H.assertSubtypeOfRuntimeType(arg, $T);
+      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
+      $T._as(arg);
       if ($.Zone__current === C.C__RootZone)
         return f.call$1(arg);
       return P._rootRunUnary(null, null, this, f, arg, $R, $T);
     },
     runBinary$3$3: function(f, arg1, arg2, $R, T1, T2) {
-      H.functionTypeCheck(f, {func: 1, ret: $R, args: [T1, T2]});
-      H.assertSubtypeOfRuntimeType(arg1, T1);
-      H.assertSubtypeOfRuntimeType(arg2, T2);
+      $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
+      T1._as(arg1);
+      T2._as(arg2);
       if ($.Zone__current === C.C__RootZone)
         return f.call$2(arg1, arg2);
       return P._rootRunBinary(null, null, this, f, arg1, arg2, $R, T1, T2);
     },
     registerBinaryCallback$3$1: function(f, $R, T1, T2) {
-      return H.functionTypeCheck(f, {func: 1, ret: $R, args: [T1, T2]});
+      return $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
     }
   };
   P._RootZone_bindCallback_closure.prototype = {
@@ -5618,27 +6435,27 @@
       return this.$this.run$1$1(this.f, this.R);
     },
     $signature: function() {
-      return {func: 1, ret: this.R};
+      return this.R._eval$1("0()");
     }
   };
   P._RootZone_bindCallbackGuarded_closure.prototype = {
     call$0: function() {
       return this.$this.runGuarded$1(this.f);
     },
-    $signature: 0
+    $signature: 1
   };
   P._RootZone_bindUnaryCallbackGuarded_closure.prototype = {
     call$1: function(arg) {
       var t1 = this.T;
-      return this.$this.runUnaryGuarded$1$2(this.f, H.assertSubtypeOfRuntimeType(arg, t1), t1);
+      return this.$this.runUnaryGuarded$1$2(this.f, t1._as(arg), t1);
     },
     $signature: function() {
-      return {func: 1, ret: -1, args: [this.T]};
+      return this.T._eval$1("~(0)");
     }
   };
   P.ListMixin.prototype = {
     get$iterator: function(receiver) {
-      return new H.ListIterator(receiver, this.get$length(receiver), [H.getRuntimeTypeArgumentIntercepted(this, receiver, "ListMixin", 0)]);
+      return new H.ListIterator(receiver, this.get$length(receiver), H.instanceType(receiver)._eval$1("ListIterator<ListMixin.E>"));
     },
     elementAt$1: function(receiver, index) {
       return this.$index(receiver, index);
@@ -5647,14 +6464,17 @@
       return this.get$length(receiver) !== 0;
     },
     $add: function(receiver, other) {
-      var result, _this = this,
-        t1 = [H.getRuntimeTypeArgumentIntercepted(_this, receiver, "ListMixin", 0)];
-      H.assertSubtype(other, "$isList", t1, "$asList");
-      result = H.setRuntimeTypeInfo([], t1);
-      C.JSArray_methods.set$length(result, C.JSInt_methods.$add(_this.get$length(receiver), other.get$length(other)));
-      C.JSArray_methods.setRange$3(result, 0, _this.get$length(receiver), receiver);
-      C.JSArray_methods.setRange$3(result, _this.get$length(receiver), result.length, other);
-      return result;
+      var t2, cur,
+        t1 = H.instanceType(receiver);
+      t1._eval$1("List<ListMixin.E>")._as(other);
+      t2 = H.setRuntimeTypeInfo([], t1._eval$1("JSArray<ListMixin.E>"));
+      for (t1 = new H.ListIterator(receiver, this.get$length(receiver), t1._eval$1("ListIterator<ListMixin.E>")); t1.moveNext$0();) {
+        cur = t1.__internal$_current;
+        C.JSArray_methods.add$1(t2, cur);
+      }
+      for (t1 = other.get$iterator(other); t1.moveNext$0();)
+        C.JSArray_methods.add$1(t2, t1.get$current());
+      return t2;
     },
     toString$0: function(receiver) {
       return P.IterableBase_iterableToFullString(receiver, "[", "]");
@@ -5673,15 +6493,15 @@
       t1._contents = t2 + ": ";
       t1._contents += H.S(v);
     },
-    $signature: 5
+    $signature: 7
   };
   P.MapMixin.prototype = {
     forEach$1: function(_, action) {
-      var t1, key, _this = this;
-      H.functionTypeCheck(action, {func: 1, ret: -1, args: [H.getRuntimeTypeArgument(_this, "MapMixin", 0), H.getRuntimeTypeArgument(_this, "MapMixin", 1)]});
-      for (t1 = _this.get$keys(), t1 = t1.get$iterator(t1); t1.moveNext$0();) {
+      var t1, key;
+      H._instanceType(this)._eval$1("~(MapMixin.K,MapMixin.V)")._as(action);
+      for (t1 = this.get$keys(), t1 = t1.get$iterator(t1); t1.moveNext$0();) {
         key = t1.get$current();
-        action.call$2(key, _this.$index(0, key));
+        action.call$2(key, this.$index(0, key));
       }
     },
     get$length: function(_) {
@@ -5703,7 +6523,7 @@
       return this._collection$_map.$index(0, key);
     },
     forEach$1: function(_, action) {
-      this._collection$_map.forEach$1(0, H.functionTypeCheck(action, {func: 1, ret: -1, args: [H.getTypeArgumentByIndex(this, 0), H.getTypeArgumentByIndex(this, 1)]}));
+      this._collection$_map.forEach$1(0, H._instanceType(this)._eval$1("~(1,2)")._as(action));
     },
     get$isEmpty: function(_) {
       return this._collection$_map.__js_helper$_length === 0;
@@ -5724,8 +6544,8 @@
         t1 = this._processed;
       if (t1 == null)
         return this._data.$index(0, key);
-      else if (typeof key !== "string")
-        return;
+      else if (typeof key != "string")
+        return null;
       else {
         result = t1[key];
         return typeof result == "undefined" ? this._process$1(key) : result;
@@ -5740,13 +6560,13 @@
     get$keys: function() {
       if (this._processed == null) {
         var t1 = this._data;
-        return new H.LinkedHashMapKeyIterable(t1, [H.getTypeArgumentByIndex(t1, 0)]);
+        return new H.LinkedHashMapKeyIterable(t1, H._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>"));
       }
       return new P._JsonMapKeyIterable(this);
     },
     forEach$1: function(_, f) {
       var keys, i, key, value, _this = this;
-      H.functionTypeCheck(f, {func: 1, ret: -1, args: [P.String,,]});
+      type$.void_Function_String_dynamic._as(f);
       if (_this._processed == null)
         return _this._data.forEach$1(0, f);
       keys = _this._computeKeys$0();
@@ -5763,23 +6583,17 @@
       }
     },
     _computeKeys$0: function() {
-      var keys = H.listTypeCheck(this._data);
+      var keys = type$.nullable_List_dynamic._as(this._data);
       if (keys == null)
-        keys = this._data = H.setRuntimeTypeInfo(Object.keys(this._original), [P.String]);
+        keys = this._data = H.setRuntimeTypeInfo(Object.keys(this._original), type$.JSArray_String);
       return keys;
     },
     _process$1: function(key) {
       var result;
       if (!Object.prototype.hasOwnProperty.call(this._original, key))
-        return;
+        return null;
       result = P._convertJsonToDartLazy(this._original[key]);
       return this._processed[key] = result;
-    },
-    $asMapMixin: function() {
-      return [P.String, null];
-    },
-    $asMap: function() {
-      return [P.String, null];
     }
   };
   P._JsonMapKeyIterable.prototype = {
@@ -5793,7 +6607,7 @@
         t1 = t1.get$keys().elementAt$1(0, index);
       else {
         t1 = t1._computeKeys$0();
-        if (index < 0 || index >= t1.length)
+        if (index >= t1.length)
           return H.ioore(t1, index);
         t1 = t1[index];
       }
@@ -5806,15 +6620,9 @@
         t1 = t1.get$iterator(t1);
       } else {
         t1 = t1._computeKeys$0();
-        t1 = new J.ArrayIterator(t1, t1.length, [H.getTypeArgumentByIndex(t1, 0)]);
+        t1 = new J.ArrayIterator(t1, t1.length, H._arrayInstanceType(t1)._eval$1("ArrayIterator<1>"));
       }
       return t1;
-    },
-    $asListIterable: function() {
-      return [P.String];
-    },
-    $asIterable: function() {
-      return [P.String];
     }
   };
   P.Codec.prototype = {};
@@ -5832,11 +6640,15 @@
   };
   P.JsonCodec.prototype = {
     decode$2$reviver: function(_, source, reviver) {
-      var t1 = P._parseJson(source, this.get$decoder()._reviver);
+      var t1;
+      type$.nullable_nullable_Object_Function_2_nullable_Object_and_nullable_Object._as(reviver);
+      t1 = P._parseJson(source, this.get$decoder()._reviver);
       return t1;
     },
     encode$2$toEncodable: function(value, toEncodable) {
-      var t1 = P._JsonStringStringifier_stringify(value, this.get$encoder()._toEncodable, null);
+      var t1;
+      type$.nullable_nullable_Object_Function_dynamic._as(toEncodable);
+      t1 = P._JsonStringStringifier_stringify(value, this.get$encoder()._toEncodable, null);
       return t1;
     },
     get$encoder: function() {
@@ -5844,29 +6656,49 @@
     },
     get$decoder: function() {
       return C.JsonDecoder_null;
-    },
-    $asCodec: function() {
-      return [P.Object, P.String];
     }
   };
-  P.JsonEncoder.prototype = {
-    $asConverter: function() {
-      return [P.Object, P.String];
-    }
-  };
-  P.JsonDecoder.prototype = {
-    $asConverter: function() {
-      return [P.String, P.Object];
-    }
-  };
+  P.JsonEncoder.prototype = {};
+  P.JsonDecoder.prototype = {};
   P._JsonStringifier.prototype = {
     writeStringContent$1: function(s) {
-      var t1, t2, offset, i, charCode, t3,
+      var t1, t2, offset, i, charCode, t3, t4,
         $length = s.length;
       for (t1 = J.getInterceptor$s(s), t2 = this._sink, offset = 0, i = 0; i < $length; ++i) {
         charCode = t1._codeUnitAt$1(s, i);
-        if (charCode > 92)
+        if (charCode > 92) {
+          if (charCode >= 55296) {
+            t3 = charCode & 64512;
+            if (t3 === 55296) {
+              t4 = i + 1;
+              t4 = !(t4 < $length && (C.JSString_methods._codeUnitAt$1(s, t4) & 64512) === 56320);
+            } else
+              t4 = false;
+            if (!t4)
+              if (t3 === 56320) {
+                t3 = i - 1;
+                t3 = !(t3 >= 0 && (C.JSString_methods.codeUnitAt$1(s, t3) & 64512) === 55296);
+              } else
+                t3 = false;
+            else
+              t3 = true;
+            if (t3) {
+              if (i > offset)
+                t2._contents += C.JSString_methods.substring$2(s, offset, i);
+              offset = i + 1;
+              t2._contents += H.Primitives_stringFromCharCode(92);
+              t2._contents += H.Primitives_stringFromCharCode(117);
+              t2._contents += H.Primitives_stringFromCharCode(100);
+              t3 = charCode >>> 8 & 15;
+              t2._contents += H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
+              t3 = charCode >>> 4 & 15;
+              t2._contents += H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
+              t3 = charCode & 15;
+              t2._contents += H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
+            }
+          }
           continue;
+        }
         if (charCode < 32) {
           if (i > offset)
             t2._contents += C.JSString_methods.substring$2(s, offset, i);
@@ -5943,7 +6775,7 @@
     },
     writeJsonValue$1: function(object) {
       var t1, success, _this = this;
-      if (typeof object === "number") {
+      if (typeof object == "number") {
         if (!isFinite(object))
           return false;
         _this._sink._contents += C.JSNumber_methods.toString$0(object);
@@ -5957,33 +6789,30 @@
       } else if (object == null) {
         _this._sink._contents += "null";
         return true;
-      } else if (typeof object === "string") {
+      } else if (typeof object == "string") {
         t1 = _this._sink;
         t1._contents += '"';
         _this.writeStringContent$1(object);
         t1._contents += '"';
         return true;
-      } else {
-        t1 = J.getInterceptor$(object);
-        if (!!t1.$isList) {
-          _this._checkCycle$1(object);
-          _this.writeList$1(object);
-          t1 = _this._seen;
-          if (0 >= t1.length)
-            return H.ioore(t1, -1);
-          t1.pop();
-          return true;
-        } else if (!!t1.$isMap) {
-          _this._checkCycle$1(object);
-          success = _this.writeMap$1(object);
-          t1 = _this._seen;
-          if (0 >= t1.length)
-            return H.ioore(t1, -1);
-          t1.pop();
-          return success;
-        } else
-          return false;
-      }
+      } else if (type$.List_dynamic._is(object)) {
+        _this._checkCycle$1(object);
+        _this.writeList$1(object);
+        t1 = _this._seen;
+        if (0 >= t1.length)
+          return H.ioore(t1, -1);
+        t1.pop();
+        return true;
+      } else if (type$.Map_dynamic_dynamic._is(object)) {
+        _this._checkCycle$1(object);
+        success = _this.writeMap$1(object);
+        t1 = _this._seen;
+        if (0 >= t1.length)
+          return H.ioore(t1, -1);
+        t1.pop();
+        return success;
+      } else
+        return false;
     },
     writeList$1: function(list) {
       var t2, i,
@@ -6000,45 +6829,43 @@
       t1._contents += "]";
     },
     writeMap$1: function(map) {
-      var t1, keyValueList, i, t2, separator, t3, _this = this, _box_0 = {};
+      var keyValueList, i, t1, separator, t2, _this = this, _box_0 = {};
       if (map.get$isEmpty(map)) {
         _this._sink._contents += "{}";
         return true;
       }
-      t1 = map.get$length(map) * 2;
-      keyValueList = new Array(t1);
-      keyValueList.fixed$length = Array;
+      keyValueList = P.List_List$filled(map.get$length(map) * 2, null, type$.nullable_Object);
       i = _box_0.i = 0;
       _box_0.allStringKeys = true;
       map.forEach$1(0, new P._JsonStringifier_writeMap_closure(_box_0, keyValueList));
       if (!_box_0.allStringKeys)
         return false;
-      t2 = _this._sink;
-      t2._contents += "{";
-      for (separator = '"'; i < t1; i += 2, separator = ',"') {
-        t2._contents += separator;
-        _this.writeStringContent$1(H.stringTypeCheck(keyValueList[i]));
-        t2._contents += '":';
-        t3 = i + 1;
-        if (t3 >= t1)
-          return H.ioore(keyValueList, t3);
-        _this.writeObject$1(keyValueList[t3]);
+      t1 = _this._sink;
+      t1._contents += "{";
+      for (separator = '"'; i < keyValueList.length; i += 2, separator = ',"') {
+        t1._contents += separator;
+        _this.writeStringContent$1(H._asStringS(keyValueList[i]));
+        t1._contents += '":';
+        t2 = i + 1;
+        if (t2 >= keyValueList.length)
+          return H.ioore(keyValueList, t2);
+        _this.writeObject$1(keyValueList[t2]);
       }
-      t2._contents += "}";
+      t1._contents += "}";
       return true;
     }
   };
   P._JsonStringifier_writeMap_closure.prototype = {
     call$2: function(key, value) {
       var t1, t2;
-      if (typeof key !== "string")
+      if (typeof key != "string")
         this._box_0.allStringKeys = false;
       t1 = this.keyValueList;
       t2 = this._box_0;
       C.JSArray_methods.$indexSet(t1, t2.i++, key);
       C.JSArray_methods.$indexSet(t1, t2.i++, value);
     },
-    $signature: 5
+    $signature: 7
   };
   P._JsonStringStringifier.prototype = {
     get$_partialResult: function() {
@@ -6048,14 +6875,14 @@
   };
   P._symbolMapToStringMap_closure.prototype = {
     call$2: function(key, value) {
-      this.result.$indexSet(0, H.interceptedTypeCheck(key, "$isSymbol").__internal$_name, value);
+      this.result.$indexSet(0, type$.Symbol._as(key).__internal$_name, value);
     },
     $signature: 8
   };
   P.NoSuchMethodError_toString_closure.prototype = {
     call$2: function(key, value) {
       var t1, t2, t3;
-      H.interceptedTypeCheck(key, "$isSymbol");
+      type$.Symbol._as(key);
       t1 = this.sb;
       t2 = this._box_0;
       t1._contents += t2.comma;
@@ -6066,7 +6893,6 @@
     },
     $signature: 8
   };
-  P.bool.prototype = {};
   P.DateTime.prototype = {
     $eq: function(_, other) {
       if (other == null)
@@ -6092,22 +6918,21 @@
         return y + "-" + m + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms;
     }
   };
-  P.double.prototype = {};
   P.Duration.prototype = {
     $add: function(_, other) {
-      return new P.Duration(C.JSInt_methods.$add(this._duration, H.interceptedTypeCheck(other, "$isDuration")._duration));
+      return new P.Duration(C.JSInt_methods.$add(this._duration, type$.Duration._as(other).get$_duration()));
     },
     $sub: function(_, other) {
-      return new P.Duration(C.JSInt_methods.$sub(this._duration, H.interceptedTypeCheck(other, "$isDuration")._duration));
+      return new P.Duration(C.JSInt_methods.$sub(this._duration, type$.Duration._as(other).get$_duration()));
     },
     $lt: function(_, other) {
-      return C.JSInt_methods.$lt(this._duration, H.interceptedTypeCheck(other, "$isDuration")._duration);
+      return C.JSInt_methods.$lt(this._duration, type$.Duration._as(other).get$_duration());
     },
     $gt: function(_, other) {
-      return C.JSInt_methods.$gt(this._duration, H.interceptedTypeCheck(other, "$isDuration")._duration);
+      return C.JSInt_methods.$gt(this._duration, type$.Duration._as(other).get$_duration());
     },
     $ge: function(_, other) {
-      return C.JSInt_methods.$ge(this._duration, H.interceptedTypeCheck(other, "$isDuration")._duration);
+      return C.JSInt_methods.$ge(this._duration, type$.Duration._as(other).get$_duration());
     },
     $eq: function(_, other) {
       if (other == null)
@@ -6153,12 +6978,20 @@
     },
     $signature: 9
   };
-  P.Error.prototype = {};
+  P.Error.prototype = {
+    get$stackTrace: function() {
+      return H.getTraceFromException(this.$thrownJsError);
+    }
+  };
   P.AssertionError.prototype = {
     toString$0: function(_) {
+      var t1 = this.message;
+      if (t1 != null)
+        return "Assertion failed: " + P.Error_safeToString(t1);
       return "Assertion failed";
     }
   };
+  P.TypeError.prototype = {};
   P.NullThrownError.prototype = {
     toString$0: function(_) {
       return "Throw of null.";
@@ -6172,12 +7005,12 @@
       return "";
     },
     toString$0: function(_) {
-      var message, prefix, explanation, errorValue, _this = this,
-        t1 = _this.name,
-        nameString = t1 != null ? " (" + t1 + ")" : "";
-      t1 = _this.message;
-      message = t1 == null ? "" : ": " + t1;
-      prefix = _this.get$_errorName() + nameString + message;
+      var explanation, errorValue, _this = this,
+        $name = _this.name,
+        nameString = $name == null ? "" : " (" + $name + ")",
+        message = _this.message,
+        messageString = message == null ? "" : ": " + message,
+        prefix = _this.get$_errorName() + nameString + messageString;
       if (!_this._hasValue)
         return prefix;
       explanation = _this.get$_errorExplanation();
@@ -6190,20 +7023,17 @@
       return "RangeError";
     },
     get$_errorExplanation: function() {
-      var explanation, t2,
-        t1 = this.start;
-      if (t1 == null) {
-        t1 = this.end;
-        explanation = t1 != null ? ": Not less than or equal to " + H.S(t1) : "";
-      } else {
-        t2 = this.end;
-        if (t2 == null)
-          explanation = ": Not greater than or equal to " + H.S(t1);
-        else if (t2 > t1)
-          explanation = ": Not in range " + H.S(t1) + ".." + H.S(t2) + ", inclusive";
-        else
-          explanation = t2 < t1 ? ": Valid value range is empty" : ": Only valid value is " + H.S(t1);
-      }
+      var explanation,
+        start = this.start,
+        end = this.end;
+      if (start == null)
+        explanation = end != null ? ": Not less than or equal to " + H.S(end) : "";
+      else if (end == null)
+        explanation = ": Not greater than or equal to " + H.S(start);
+      else if (end > start)
+        explanation = ": Not in inclusive range " + H.S(start) + ".." + H.S(end);
+      else
+        explanation = end < start ? ": Valid value range is empty" : ": Only valid value is " + H.S(start);
       return explanation;
     }
   };
@@ -6213,7 +7043,7 @@
     },
     get$_errorExplanation: function() {
       var t1,
-        invalidValue = H.intTypeCheck(this.invalidValue);
+        invalidValue = H._asIntS(this.invalidValue);
       if (typeof invalidValue !== "number")
         return invalidValue.$lt();
       if (invalidValue < 0)
@@ -6229,13 +7059,14 @@
   };
   P.NoSuchMethodError.prototype = {
     toString$0: function(_) {
-      var t1, t2, _i, t3, t4, argument, receiverText, actualParameters, _this = this, _box_0 = {},
+      var $arguments, t1, _i, t2, t3, argument, receiverText, actualParameters, _this = this, _box_0 = {},
         sb = new P.StringBuffer("");
       _box_0.comma = "";
-      for (t1 = _this._core$_arguments, t2 = t1.length, _i = 0, t3 = "", t4 = ""; _i < t2; ++_i, t4 = ", ") {
-        argument = t1[_i];
-        sb._contents = t3 + t4;
-        t3 = sb._contents += P.Error_safeToString(argument);
+      $arguments = _this._core$_arguments;
+      for (t1 = $arguments.length, _i = 0, t2 = "", t3 = ""; _i < t1; ++_i, t3 = ", ") {
+        argument = $arguments[_i];
+        sb._contents = t2 + t3;
+        t2 = sb._contents += P.Error_safeToString(argument);
         _box_0.comma = ", ";
       }
       _this._namedArguments.forEach$1(0, new P.NoSuchMethodError_toString_closure(_box_0, sb));
@@ -6252,8 +7083,8 @@
   };
   P.UnimplementedError.prototype = {
     toString$0: function(_) {
-      var t1 = this.message;
-      return t1 != null ? "UnimplementedError: " + t1 : "UnimplementedError";
+      var message = this.message;
+      return message != null ? "UnimplementedError: " + message : "UnimplementedError";
     }
   };
   P.StateError.prototype = {
@@ -6273,18 +7104,24 @@
     toString$0: function(_) {
       return "Out of Memory";
     },
+    get$stackTrace: function() {
+      return null;
+    },
     $isError: 1
   };
   P.StackOverflowError.prototype = {
     toString$0: function(_) {
       return "Stack Overflow";
     },
+    get$stackTrace: function() {
+      return null;
+    },
     $isError: 1
   };
   P.CyclicInitializationError.prototype = {
     toString$0: function(_) {
-      var t1 = this.variableName;
-      return t1 == null ? "Reading static variable during its initialization" : "Reading static variable '" + t1 + "' during its initialization";
+      var variableName = this.variableName;
+      return variableName == null ? "Reading static variable during its initialization" : "Reading static variable '" + variableName + "' during its initialization";
     }
   };
   P._Exception.prototype = {
@@ -6294,13 +7131,12 @@
   };
   P.FormatException.prototype = {
     toString$0: function(_) {
-      var t1 = this.message,
-        report = "" !== t1 ? "FormatException: " + t1 : "FormatException",
+      var message = this.message,
+        report = message != null && "" !== message ? "FormatException: " + H.S(message) : "FormatException",
         offset = this.offset;
       return offset != null ? report + (" (at offset " + H.S(offset) + ")") : report;
     }
   };
-  P.int.prototype = {};
   P.Iterable.prototype = {
     get$length: function(_) {
       var count,
@@ -6311,7 +7147,6 @@
     },
     elementAt$1: function(_, index) {
       var t1, elementIndex, element;
-      P.RangeError_checkNotNegative(index, "index");
       for (t1 = this.get$iterator(this), elementIndex = 0; t1.moveNext$0();) {
         element = t1.get$current();
         if (index === elementIndex)
@@ -6324,16 +7159,14 @@
       return P.IterableBase_iterableToShortString(this, "(", ")");
     }
   };
-  P.List.prototype = {$isIterable: 1};
   P.Null.prototype = {
     get$hashCode: function(_) {
-      return P.Object.prototype.get$hashCode.call(this, this);
+      return P.Object.prototype.get$hashCode.call(C.JSNull_methods, this);
     },
     toString$0: function(_) {
       return "null";
     }
   };
-  P.num.prototype = {};
   P.Object.prototype = {constructor: P.Object, $isObject: 1,
     $eq: function(_, other) {
       return this === other;
@@ -6345,15 +7178,19 @@
       return "Instance of '" + H.S(H.Primitives_objectTypeName(this)) + "'";
     },
     noSuchMethod$1: function(_, invocation) {
-      H.interceptedTypeCheck(invocation, "$isInvocation");
+      type$.Invocation._as(invocation);
       throw H.wrapException(P.NoSuchMethodError$(this, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments()));
     },
     toString: function() {
       return this.toString$0(this);
     }
   };
-  P.StackTrace.prototype = {};
-  P.String.prototype = {$isPattern: 1};
+  P._StringStackTrace.prototype = {
+    toString$0: function(_) {
+      return "";
+    },
+    $isStackTrace: 1
+  };
   P.StringBuffer.prototype = {
     get$length: function(_) {
       return this._contents.length;
@@ -6364,7 +7201,6 @@
     },
     $isStringSink: 1
   };
-  P.Symbol.prototype = {};
   W.HtmlElement.prototype = {};
   W.AnchorElement.prototype = {
     toString$0: function(receiver) {
@@ -6386,7 +7222,7 @@
       return receiver.localName;
     },
     get$onClick: function(receiver) {
-      return new W._ElementEventStreamImpl(receiver, "click", false, [W.MouseEvent]);
+      return new W._ElementEventStreamImpl(receiver, "click", false, type$._ElementEventStreamImpl_legacy_MouseEvent);
     },
     $isElement: 1
   };
@@ -6394,7 +7230,7 @@
   W.EventSource.prototype = {$isEventSource: 1};
   W.EventTarget.prototype = {
     addEventListener$3: function(receiver, type, listener, useCapture) {
-      H.functionTypeCheck(listener, {func: 1, args: [W.Event]});
+      type$.nullable_dynamic_Function_Event._as(listener);
       if (listener != null)
         this._addEventListener$3(receiver, type, listener, useCapture);
     },
@@ -6402,10 +7238,7 @@
       return this.addEventListener$3($receiver, type, listener, null);
     },
     _addEventListener$3: function(receiver, type, listener, options) {
-      return receiver.addEventListener(type, H.convertDartClosureToJS(H.functionTypeCheck(listener, {func: 1, args: [W.Event]}), 1), options);
-    },
-    _removeEventListener$3: function(receiver, type, listener, options) {
-      return receiver.removeEventListener(type, H.convertDartClosureToJS(H.functionTypeCheck(listener, {func: 1, args: [W.Event]}), 1), false);
+      return receiver.addEventListener(type, H.convertDartClosureToJS(type$.nullable_dynamic_Function_Event._as(listener), 1), options);
     },
     $isEventTarget: 1
   };
@@ -6418,16 +7251,18 @@
     open$3$async: function(receiver, method, url, async) {
       return receiver.open(method, url, true);
     },
+    set$withCredentials: function(receiver, value) {
+      receiver.withCredentials = true;
+    },
     $isHttpRequest: 1
   };
   W.HttpRequest_request_closure.prototype = {
     call$1: function(e) {
       var t1, t2, accepted, unknownRedirect, t3;
-      H.interceptedTypeCheck(e, "$isProgressEvent");
+      type$.ProgressEvent._as(e);
       t1 = this.xhr;
       t2 = t1.status;
-      if (typeof t2 !== "number")
-        return t2.$ge();
+      t2.toString;
       accepted = t2 >= 200 && t2 < 300;
       unknownRedirect = t2 > 307 && t2 < 400;
       t2 = accepted || t2 === 0 || t2 === 304 || unknownRedirect;
@@ -6455,63 +7290,20 @@
     }
   };
   W.UIEvent.prototype = {};
+  W.EventStreamProvider.prototype = {};
   W._EventStream.prototype = {
     listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
-      var t1 = H.getTypeArgumentByIndex(this, 0);
-      H.functionTypeCheck(onData, {func: 1, ret: -1, args: [t1]});
-      H.functionTypeCheck(onDone, {func: 1, ret: -1});
-      return W._EventStreamSubscription$(this._target, this._eventType, onData, false, t1);
+      var t1 = H._instanceType(this);
+      t1._eval$1("~(1)?")._as(onData);
+      type$.nullable_void_Function._as(onDone);
+      return W._EventStreamSubscription$(this._target, this._eventType, onData, false, t1._precomputed1);
     }
   };
   W._ElementEventStreamImpl.prototype = {};
-  W._EventStreamSubscription.prototype = {
-    cancel$0: function() {
-      var _this = this;
-      if (_this._target == null)
-        return;
-      _this._unlisten$0();
-      _this._target = null;
-      _this.set$_html$_onData(null);
-      return;
-    },
-    pause$0: function(_) {
-      if (this._target == null)
-        return;
-      ++this._pauseCount;
-      this._unlisten$0();
-    },
-    resume$0: function() {
-      var _this = this;
-      if (_this._target == null || _this._pauseCount <= 0)
-        return;
-      --_this._pauseCount;
-      _this._tryResume$0();
-    },
-    _tryResume$0: function() {
-      var _this = this,
-        t1 = _this._html$_onData;
-      if (t1 != null && _this._pauseCount <= 0)
-        J.addEventListener$3$x(_this._target, _this._eventType, t1, false);
-    },
-    _unlisten$0: function() {
-      var t3,
-        t1 = this._html$_onData,
-        t2 = t1 != null;
-      if (t2) {
-        t3 = this._target;
-        t3.toString;
-        H.functionTypeCheck(t1, {func: 1, args: [W.Event]});
-        if (t2)
-          J._removeEventListener$3$x(t3, this._eventType, t1, false);
-      }
-    },
-    set$_html$_onData: function(_onData) {
-      this._html$_onData = H.functionTypeCheck(_onData, {func: 1, args: [W.Event]});
-    }
-  };
+  W._EventStreamSubscription.prototype = {};
   W._EventStreamSubscription_closure.prototype = {
     call$1: function(e) {
-      return this.onData.call$1(H.interceptedTypeCheck(e, "$isEvent"));
+      return this.onData.call$1(type$.Event._as(e));
     },
     $signature: 22
   };
@@ -6528,14 +7320,14 @@
       return $length;
     },
     walk$1: function(e) {
-      var millisSinceEpoch, t1, proto, slot, copy, l, t2, $length, i, _this = this, _box_0 = {};
+      var millisSinceEpoch, t1, proto, slot, copy, t2, l, $length, i, _this = this, _box_0 = {};
       if (e == null)
         return e;
-      if (typeof e === "boolean")
+      if (H._isBool(e))
         return e;
-      if (typeof e === "number")
+      if (typeof e == "number")
         return e;
-      if (typeof e === "string")
+      if (typeof e == "string")
         return e;
       if (e instanceof Date) {
         millisSinceEpoch = e.getTime();
@@ -6545,12 +7337,13 @@
           t1 = true;
         if (t1)
           H.throwExpression(P.ArgumentError$("DateTime is outside valid range: " + millisSinceEpoch));
+        P.ArgumentError_checkNotNull(true, "isUtc", type$.bool);
         return new P.DateTime(millisSinceEpoch, true);
       }
       if (e instanceof RegExp)
         throw H.wrapException(P.UnimplementedError$("structured clone of RegExp"));
       if (typeof Promise != "undefined" && e instanceof Promise)
-        return P.promiseToFuture(e, null);
+        return P.promiseToFuture(e, type$.dynamic);
       proto = Object.getPrototypeOf(e);
       if (proto === Object.prototype || proto === null) {
         slot = _this.findSlot$1(e);
@@ -6560,7 +7353,8 @@
         copy = _box_0.copy = t1[slot];
         if (copy != null)
           return copy;
-        copy = P.LinkedHashMap__makeEmpty();
+        t2 = type$.dynamic;
+        copy = P.LinkedHashMap_LinkedHashMap$_empty(t2, t2);
         _box_0.copy = copy;
         C.JSArray_methods.$indexSet(t1, slot, copy);
         _this.forEachJsField$2(e, new P._AcceptStructuredClone_walk_closure(_box_0, _this));
@@ -6603,12 +7397,12 @@
     call$2: function(key, value) {
       this.object[key] = value;
     },
-    $signature: 5
+    $signature: 24
   };
   P._AcceptStructuredCloneDart2Js.prototype = {
     forEachJsField$2: function(object, action) {
       var t1, t2, _i, key;
-      H.functionTypeCheck(action, {func: 1, args: [,,]});
+      type$.dynamic_Function_dynamic_dynamic._as(action);
       for (t1 = Object.keys(object), t2 = t1.length, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
         key = t1[_i];
         action.call$2(key, object[key]);
@@ -6617,7 +7411,7 @@
   };
   P.promiseToFuture_closure.prototype = {
     call$1: function(r) {
-      return this.completer.complete$1(0, H.futureOrCheck(r, {futureOr: 1, type: this.T}));
+      return this.completer.complete$1(0, this.T._eval$1("0/?")._as(r));
     },
     $signature: 2
   };
@@ -6634,83 +7428,32 @@
   };
   P.SvgElement.prototype = {
     get$onClick: function(receiver) {
-      return new W._ElementEventStreamImpl(receiver, "click", false, [W.MouseEvent]);
+      return new W._ElementEventStreamImpl(receiver, "click", false, type$._ElementEventStreamImpl_legacy_MouseEvent);
     }
   };
   N.HexCodec.prototype = {
     get$encoder: function() {
       return C.C_HexEncoder;
-    },
-    $asCodec: function() {
-      return [[P.List, P.int], P.String];
     }
   };
   R.HexEncoder.prototype = {
     convert$1: function(bytes) {
-      H.assertSubtype(bytes, "$isList", [P.int], "$asList");
+      type$.legacy_List_legacy_int._as(bytes);
       return R._convert(bytes, 0, bytes.length);
-    },
-    $asConverter: function() {
-      return [[P.List, P.int], P.String];
     }
   };
-  N.Logger.prototype = {
-    get$fullName: function() {
-      var t1 = this.parent,
-        t2 = t1 == null || t1.name === "",
-        t3 = this.name;
-      return t2 ? t3 : t1.get$fullName() + "." + t3;
-    },
-    get$level: function() {
-      return C.Level_INFO_800;
-    },
-    log$4: function(logLevel, message, error, stackTrace) {
-      var t1 = logLevel.value;
-      if (t1 >= this.get$level().value) {
-        if (t1 >= 2000) {
-          P.StackTrace_current();
-          logLevel.toString$0(0);
-        }
-        t1 = this.get$fullName();
-        Date.now();
-        $.LogRecord__nextNumber = $.LogRecord__nextNumber + 1;
-        $.$get$Logger_root()._publish$1(new N.LogRecord(logLevel, message, t1));
-      }
-    },
-    _publish$1: function(record) {
-    }
-  };
-  N.Logger_Logger_closure.prototype = {
-    call$0: function() {
-      var dot, $parent, t1,
-        thisName = this.name;
-      if (C.JSString_methods.startsWith$1(thisName, "."))
-        H.throwExpression(P.ArgumentError$("name shouldn't start with a '.'"));
-      dot = C.JSString_methods.lastIndexOf$1(thisName, ".");
-      if (dot === -1)
-        $parent = thisName !== "" ? N.Logger_Logger("") : null;
-      else {
-        $parent = N.Logger_Logger(C.JSString_methods.substring$2(thisName, 0, dot));
-        thisName = C.JSString_methods.substring$1(thisName, dot + 1);
-      }
-      t1 = new N.Logger(thisName, $parent, new H.JsLinkedHashMap([P.String, N.Logger]));
-      if ($parent != null)
-        $parent._children.$indexSet(0, thisName, t1);
-      return t1;
-    },
-    $signature: 24
-  };
-  N.Level.prototype = {
+  Y.Level.prototype = {
     $eq: function(_, other) {
       if (other == null)
         return false;
-      return other instanceof N.Level && this.value === other.value;
+      return other instanceof Y.Level && this.value === other.value;
     },
     $gt: function(_, other) {
-      return C.JSInt_methods.$gt(this.value, H.interceptedTypeCheck(other, "$isLevel").value);
+      type$.legacy_Level._as(other);
+      return C.JSInt_methods.$gt(this.value, other.get$value(other));
     },
     $ge: function(_, other) {
-      return this.value >= H.interceptedTypeCheck(other, "$isLevel").value;
+      return this.value >= type$.legacy_Level._as(other).value;
     },
     get$hashCode: function(_) {
       return this.value;
@@ -6719,26 +7462,88 @@
       return this.name;
     }
   };
-  N.LogRecord.prototype = {
+  L.LogRecord.prototype = {
     toString$0: function(_) {
-      return "[" + this.level.name + "] " + this.loggerName + ": " + H.S(this.message);
+      return "[" + this.level.name + "] " + this.loggerName + ": " + this.message;
     }
   };
+  F.Logger.prototype = {
+    get$fullName: function() {
+      var t1 = this.parent,
+        t2 = t1 == null || t1.name === "",
+        t3 = this.name;
+      return t2 ? t3 : t1.get$fullName() + "." + t3;
+    },
+    get$level: function() {
+      var effectiveLevel, t1;
+      if (this.parent == null)
+        effectiveLevel = this._level;
+      else {
+        t1 = $.$get$Logger_root();
+        effectiveLevel = t1._level;
+      }
+      return effectiveLevel;
+    },
+    log$4: function(logLevel, message, error, stackTrace) {
+      var record, _this = this,
+        t1 = logLevel.value;
+      if (t1 >= _this.get$level().value) {
+        if (t1 >= 2000) {
+          P.StackTrace_current();
+          logLevel.toString$0(0);
+        }
+        t1 = _this.get$fullName();
+        Date.now();
+        $.LogRecord__nextNumber = $.LogRecord__nextNumber + 1;
+        record = new L.LogRecord(logLevel, message, t1);
+        if (_this.parent == null)
+          _this._publish$1(record);
+        else
+          $.$get$Logger_root()._publish$1(record);
+      }
+    },
+    _publish$1: function(record) {
+    }
+  };
+  F.Logger_Logger_closure.prototype = {
+    call$0: function() {
+      var dot, $parent, t1,
+        thisName = this.name;
+      if (C.JSString_methods.startsWith$1(thisName, "."))
+        H.throwExpression(P.ArgumentError$("name shouldn't start with a '.'"));
+      dot = C.JSString_methods.lastIndexOf$1(thisName, ".");
+      if (dot === -1)
+        $parent = thisName !== "" ? F.Logger_Logger("") : null;
+      else {
+        $parent = F.Logger_Logger(C.JSString_methods.substring$2(thisName, 0, dot));
+        thisName = C.JSString_methods.substring$1(thisName, dot + 1);
+      }
+      t1 = new F.Logger(thisName, $parent, P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_Logger));
+      if ($parent == null)
+        t1._level = C.Level_INFO_800;
+      else
+        $parent._children.$indexSet(0, thisName, t1);
+      return t1;
+    },
+    $signature: 25
+  };
   M.SseClient.prototype = {
     SseClient$1: function(serverUrl) {
-      var t1, t2, _this = this,
-        clientId = F.Uuid$().v1$0();
-      _this._eventSource = W.EventSource__factoryEventSource(serverUrl + "?sseClientId=" + clientId, P.LinkedHashMap_LinkedHashMap$_literal(["withCredentials", true], P.String, null));
+      var t1, t2, t3, t4, _this = this,
+        clientId = K.Uuid$().v1$0();
+      _this._eventSource = W.EventSource__factoryEventSource(serverUrl + "?sseClientId=" + clientId, P.LinkedHashMap_LinkedHashMap$_literal(["withCredentials", true], type$.String, type$.dynamic));
       _this._serverUrl = serverUrl + "?sseClientId=" + clientId;
       t1 = _this._outgoingController;
-      new P._ControllerStream(t1, [H.getTypeArgumentByIndex(t1, 0)]).listen$2$onDone(_this.get$_onOutgoingMessage(), _this.get$_onOutgoingDone());
+      new P._ControllerStream(t1, H._instanceType(t1)._eval$1("_ControllerStream<1>")).listen$2$onDone(_this.get$_onOutgoingMessage(), _this.get$_onOutgoingDone());
       C.EventSource_methods.addEventListener$2(_this._eventSource, "message", _this.get$_onIncomingMessage());
       C.EventSource_methods.addEventListener$2(_this._eventSource, "control", _this.get$_onIncomingControlMessage());
-      t1 = W.Event;
-      t2 = {func: 1, ret: -1, args: [t1]};
-      W._EventStreamSubscription$(_this._eventSource, "open", H.functionTypeCheck(new M.SseClient_closure(_this), t2), false, t1);
-      W._EventStreamSubscription$(_this._eventSource, "error", H.functionTypeCheck(new M.SseClient_closure0(_this), t2), false, t1);
-      _this._startPostingMessages$0();
+      t1 = _this._eventSource;
+      t2 = type$.nullable_void_Function_legacy_Event;
+      t3 = t2._as(new M.SseClient_closure(_this));
+      type$.nullable_void_Function._as(null);
+      t4 = type$.legacy_Event;
+      W._EventStreamSubscription$(t1, "open", t3, false, t4);
+      W._EventStreamSubscription$(_this._eventSource, "error", t2._as(new M.SseClient_closure0(_this)), false, t4);
     },
     close$0: function(_) {
       this._eventSource.close();
@@ -6746,41 +7551,26 @@
       this._outgoingController.close$0(0);
     },
     _onIncomingControlMessage$1: function(message) {
-      var data = new P._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(H.interceptedTypeCast(H.interceptedTypeCheck(message, "$isEvent"), "$isMessageEvent").data, true);
+      var data = new P._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.legacy_MessageEvent._as(type$.legacy_Event._as(message)).data, true);
       if (J.$eq$(data, "close"))
         this.close$0(0);
       else
         throw H.wrapException(P.UnsupportedError$('Illegal Control Message "' + H.S(data) + '"'));
     },
     _onIncomingMessage$1: function(message) {
-      this._incomingController.add$1(0, H.stringTypeCast(C.C_JsonCodec.decode$2$reviver(0, H.stringTypeCast(new P._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(H.interceptedTypeCast(H.interceptedTypeCheck(message, "$isEvent"), "$isMessageEvent").data, true)), null)));
+      this._incomingController.add$1(0, H._asStringS(C.C_JsonCodec.decode$2$reviver(0, H._asStringS(new P._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.legacy_MessageEvent._as(type$.legacy_Event._as(message)).data, true)), null)));
     },
     _onOutgoingDone$0: function() {
       this.close$0(0);
     },
     _onOutgoingMessage$1: function(message) {
-      var $async$goto = 0,
-        $async$completer = P._makeAsyncAwaitCompleter(null),
-        $async$self = this;
-      var $async$_onOutgoingMessage$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
-        if ($async$errorCode === 1)
-          return P._asyncRethrow($async$result, $async$completer);
-        while (true)
-          switch ($async$goto) {
-            case 0:
-              // Function start
-              $async$self._messages.add$1(0, message);
-              // implicit return
-              return P._asyncReturn(null, $async$completer);
-          }
-      });
-      return P._asyncStartSync($async$_onOutgoingMessage$1, $async$completer);
+      return this._onOutgoingMessage$body$SseClient(H._asStringS(message));
     },
-    _startPostingMessages$0: function() {
+    _onOutgoingMessage$body$SseClient: function(message) {
       var $async$goto = 0,
-        $async$completer = P._makeAsyncAwaitCompleter(null),
-        $async$handler = 1, $async$currentError, $async$next = [], $async$self = this, message, e, e0, t2, exception, t3, t4, t1, $async$exception, $async$temp1;
-      var $async$_startPostingMessages$0 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
+        $async$completer = P._makeAsyncAwaitCompleter(type$.dynamic),
+        $async$handler = 1, $async$currentError, $async$next = [], $async$self = this, e, e0, e1, exception, t1, encodedMessage, $async$exception;
+      var $async$_onOutgoingMessage$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
         if ($async$errorCode === 1) {
           $async$currentError = $async$result;
           $async$goto = $async$handler;
@@ -6789,79 +7579,46 @@
           switch ($async$goto) {
             case 0:
               // Function start
-              t1 = $async$self._messages;
-              t1 = new P._StreamIterator(new P._ControllerStream(t1, [H.getTypeArgumentByIndex(t1, 0)]), [null]);
-              $async$handler = 2;
-              t2 = $async$self._logger;
-            case 5:
-              // for condition
-              $async$temp1 = H;
-              $async$goto = 7;
-              return P._asyncAwait(t1.moveNext$0(), $async$_startPostingMessages$0);
-            case 7:
-              // returning from await.
-              if (!$async$temp1.boolConversionCheck($async$result)) {
-                // goto after for
-                $async$goto = 6;
-                break;
+              encodedMessage = null;
+              try {
+                encodedMessage = C.C_JsonCodec.encode$2$toEncodable(message, null);
+              } catch (exception) {
+                t1 = H.unwrapException(exception);
+                if (t1 instanceof P.JsonUnsupportedObjectError) {
+                  e = t1;
+                  $async$self._logger.log$4(C.Level_WARNING_900, "Unable to encode outgoing message: " + H.S(e), null, null);
+                } else if (t1 instanceof P.ArgumentError) {
+                  e0 = t1;
+                  $async$self._logger.log$4(C.Level_WARNING_900, "Invalid argument: " + H.S(e0), null, null);
+                } else
+                  throw exception;
               }
-              message = t1.get$current();
-              $async$handler = 9;
-              $async$goto = 12;
-              return P._asyncAwait(W.HttpRequest_request($async$self._serverUrl, "POST", C.C_JsonCodec.encode$2$toEncodable(message, null), true), $async$_startPostingMessages$0);
-            case 12:
+              $async$handler = 3;
+              $async$goto = 6;
+              return P._asyncAwait(W.HttpRequest_request($async$self._serverUrl + "&messageId=" + ++$async$self._lastMessageId, "POST", encodedMessage, true), $async$_onOutgoingMessage$1);
+            case 6:
               // returning from await.
-              $async$handler = 2;
+              $async$handler = 1;
               // goto after finally
-              $async$goto = 11;
-              break;
-            case 9:
-              // catch
-              $async$handler = 8;
-              $async$exception = $async$currentError;
-              t3 = H.unwrapException($async$exception);
-              t4 = J.getInterceptor$(t3);
-              if (!!t4.$isJsonUnsupportedObjectError) {
-                e = t3;
-                t2.log$4(C.Level_WARNING_900, "Unable to encode outgoing message: " + H.S(e), null, null);
-              } else if (!!t4.$isArgumentError) {
-                e0 = t3;
-                t2.log$4(C.Level_WARNING_900, "Invalid argument: " + H.S(e0), null, null);
-              } else
-                throw $async$exception;
-              // goto after finally
-              $async$goto = 11;
-              break;
-            case 8:
-              // uncaught
-              // goto uncaught
-              $async$goto = 2;
-              break;
-            case 11:
-              // after finally
-              // goto for condition
               $async$goto = 5;
               break;
-            case 6:
-              // after for
-              $async$next.push(4);
-              // goto finally
-              $async$goto = 3;
+            case 3:
+              // catch
+              $async$handler = 2;
+              $async$exception = $async$currentError;
+              e1 = H.unwrapException($async$exception);
+              t1 = "Failed to send " + H.S(message) + ":\n " + H.S(e1);
+              $async$self._logger.log$4(C.Level_SEVERE_1000, t1, null, null);
+              $async$self.close$0(0);
+              // goto after finally
+              $async$goto = 5;
               break;
             case 2:
               // uncaught
-              $async$next = [1];
-            case 3:
-              // finally
-              $async$handler = 1;
-              $async$goto = 13;
-              return P._asyncAwait(t1.cancel$0(), $async$_startPostingMessages$0);
-            case 13:
-              // returning from await.
-              // goto the next finally handler
-              $async$goto = $async$next.pop();
+              // goto rethrow
+              $async$goto = 1;
               break;
-            case 4:
+            case 5:
               // after finally
               // implicit return
               return P._asyncReturn(null, $async$completer);
@@ -6870,7 +7627,7 @@
               return P._asyncRethrow($async$currentError, $async$completer);
           }
       });
-      return P._asyncStartSync($async$_startPostingMessages$0, $async$completer);
+      return P._asyncStartSync($async$_onOutgoingMessage$1, $async$completer);
     }
   };
   M.SseClient_closure.prototype = {
@@ -6893,25 +7650,25 @@
   };
   M.SseClient__closure.prototype = {
     call$0: function() {
-      var t3,
+      var stackTrace, t3,
         t1 = this.$this,
         t2 = t1._incomingController,
         error = this.error;
+      P.ArgumentError_checkNotNull(error, "error", type$.Object);
       if (t2._state >= 4)
         H.throwExpression(t2._badEventState$0());
-      if (error == null)
-        error = new P.NullThrownError();
+      stackTrace = P.AsyncError_defaultStackTrace(error);
       t3 = t2._state;
       if ((t3 & 1) !== 0)
-        t2._sendError$2(error, null);
+        t2._sendError$2(error, stackTrace);
       else if ((t3 & 3) === 0)
-        t2._ensurePendingEvents$0().add$1(0, new P._DelayedError(error, null));
-      t1._eventSource.close();
+        t2._ensurePendingEvents$0().add$1(0, new P._DelayedError(error, stackTrace));
+      t1.close$0(0);
     },
-    $signature: 1
+    $signature: 0
   };
   R.StreamChannelMixin.prototype = {};
-  F.Uuid.prototype = {
+  K.Uuid.prototype = {
     Uuid$1$options: function(_box_0) {
       var t1, t2, i, hex, t3, v1PositionalArgs, v1NamedArgs, _this = this,
         _s19_ = "v1rngPositionalArgs",
@@ -6920,29 +7677,27 @@
         _s13_ = "grngNamedArgs",
         options = _box_0.options;
       if (!(options != null))
-        options = new H.JsLinkedHashMap([P.String, null]);
+        options = new H.JsLinkedHashMap(type$.JsLinkedHashMap_of_legacy_String_and_dynamic);
       _box_0.options = options;
       t1 = new Array(256);
       t1.fixed$length = Array;
-      t2 = P.String;
-      _this.set$_byteToHex(H.setRuntimeTypeInfo(t1, [t2]));
-      t1 = P.int;
-      _this.set$_hexToByte(new H.JsLinkedHashMap([t2, t1]));
-      for (t1 = [t1], t2 = [P.List, P.int], i = 0; i < 256; ++i) {
+      _this.set$_byteToHex(H.setRuntimeTypeInfo(t1, type$.JSArray_legacy_String));
+      _this.set$_hexToByte(new H.JsLinkedHashMap(type$.JsLinkedHashMap_of_legacy_String_and_legacy_int));
+      for (t1 = type$.JSArray_legacy_int, t2 = type$.HexCodec._eval$1("Codec.S"), i = 0; i < 256; ++i) {
         hex = H.setRuntimeTypeInfo([], t1);
         C.JSArray_methods.add$1(hex, i);
         t3 = _this._byteToHex;
-        H.assertSubtypeOfRuntimeType(hex, t2);
+        t2._as(hex);
         (t3 && C.JSArray_methods).$indexSet(t3, i, C.C_HexCodec.get$encoder().convert$1(hex));
         _this._hexToByte.$indexSet(0, _this._byteToHex[i], i);
       }
       v1PositionalArgs = _box_0.options.$index(0, _s19_) != null ? _box_0.options.$index(0, _s19_) : [];
-      v1NamedArgs = _box_0.options.$index(0, _s14_) != null ? H.subtypeCast(_box_0.options.$index(0, _s14_), "$isMap", [P.Symbol, null], "$asMap") : C.Map_empty;
-      _this._seedBytes = _box_0.options.$index(0, "v1rng") != null ? P.Function_apply(H.interceptedTypeCheck(_box_0.options.$index(0, "v1rng"), "$isFunction"), H.listTypeCheck(v1PositionalArgs), v1NamedArgs) : U.UuidUtil_mathRNG();
+      v1NamedArgs = _box_0.options.$index(0, _s14_) != null ? type$.legacy_Map_of_legacy_Symbol_and_dynamic._as(_box_0.options.$index(0, _s14_)) : C.Map_empty;
+      _this._seedBytes = _box_0.options.$index(0, "v1rng") != null ? P.Function_apply(type$.Function._as(_box_0.options.$index(0, "v1rng")), type$.nullable_List_dynamic._as(v1PositionalArgs), v1NamedArgs) : T.UuidUtil_mathRNG();
       if (_box_0.options.$index(0, _s18_) != null)
         _box_0.options.$index(0, _s18_);
       if (_box_0.options.$index(0, _s13_) != null)
-        H.subtypeCast(_box_0.options.$index(0, _s13_), "$isMap", [P.Symbol, null], "$asMap");
+        type$.legacy_Map_of_legacy_Symbol_and_dynamic._as(_box_0.options.$index(0, _s13_));
       _this._nodeId = [J.$or$bn(J.$index$asx(_this._seedBytes, 0), 1), J.$index$asx(_this._seedBytes, 1), J.$index$asx(_this._seedBytes, 2), J.$index$asx(_this._seedBytes, 3), J.$index$asx(_this._seedBytes, 4), J.$index$asx(_this._seedBytes, 5)];
       t1 = J.$shl$n(J.$index$asx(_this._seedBytes, 6), 8);
       t2 = J.$index$asx(_this._seedBytes, 7);
@@ -6951,29 +7706,28 @@
       _this._clockSeq = (t1 | t2) & 262143;
     },
     v1$0: function() {
-      var t2, buf, options, clockSeq, mSecs, nSecs, dt, t3, tl, tmh, node, n, _this = this,
+      var buf, options, clockSeq, mSecs, nSecs, dt, t2, tl, tmh, node, n, _this = this,
         _s8_ = "clockSeq",
         _s5_ = "nSecs",
         t1 = new Array(16);
       t1.fixed$length = Array;
-      t2 = P.int;
-      buf = H.setRuntimeTypeInfo(t1, [t2]);
-      options = new H.JsLinkedHashMap([P.String, null]);
+      buf = H.setRuntimeTypeInfo(t1, type$.JSArray_legacy_int);
+      options = new H.JsLinkedHashMap(type$.JsLinkedHashMap_of_legacy_String_and_dynamic);
       clockSeq = options.$index(0, _s8_) != null ? options.$index(0, _s8_) : _this._clockSeq;
       mSecs = options.$index(0, "mSecs") != null ? options.$index(0, "mSecs") : Date.now();
       nSecs = options.$index(0, _s5_) != null ? options.$index(0, _s5_) : _this._lastNSecs + 1;
       t1 = J.getInterceptor$n(mSecs);
       dt = J.$add$ansx(t1.$sub(mSecs, _this._lastMSecs), J.$div$n(J.$sub$n(nSecs, _this._lastNSecs), 10000));
-      t3 = J.getInterceptor$n(dt);
-      if (t3.$lt(dt, 0) && options.$index(0, _s8_) == null)
+      t2 = J.getInterceptor$n(dt);
+      if (t2.$lt(dt, 0) && options.$index(0, _s8_) == null)
         clockSeq = J.$and$bn(J.$add$ansx(clockSeq, 1), 16383);
-      if ((t3.$lt(dt, 0) || t1.$gt(mSecs, _this._lastMSecs)) && options.$index(0, _s5_) == null)
+      if ((t2.$lt(dt, 0) || t1.$gt(mSecs, _this._lastMSecs)) && options.$index(0, _s5_) == null)
         nSecs = 0;
       if (J.$ge$n(nSecs, 10000))
         throw H.wrapException(P.Exception_Exception("uuid.v1(): Can't create more than 10M uuids/sec"));
-      H.intTypeCheck(mSecs);
+      H._asIntS(mSecs);
       _this._lastMSecs = mSecs;
-      H.intTypeCheck(nSecs);
+      H._asIntS(nSecs);
       _this._lastNSecs = nSecs;
       _this._clockSeq = clockSeq;
       mSecs += 122192928e5;
@@ -6989,11 +7743,11 @@
       C.JSArray_methods.$indexSet(buf, 7, tmh >>> 16 & 255);
       t1 = J.getInterceptor$n(clockSeq);
       C.JSArray_methods.$indexSet(buf, 8, (t1.$shr(clockSeq, 8) | 128) >>> 0);
-      C.JSArray_methods.$indexSet(buf, 9, H.intTypeCheck(t1.$and(clockSeq, 255)));
+      C.JSArray_methods.$indexSet(buf, 9, H._asIntS(t1.$and(clockSeq, 255)));
       node = options.$index(0, "node") != null ? options.$index(0, "node") : _this._nodeId;
       for (t1 = J.getInterceptor$asx(node), n = 0; n < 6; ++n)
-        C.JSArray_methods.$indexSet(buf, 10 + n, H.intTypeCheck(t1.$index(node, n)));
-      H.assertSubtype(buf, "$isList", [t2], "$asList");
+        C.JSArray_methods.$indexSet(buf, 10 + n, H._asIntS(t1.$index(node, n)));
+      type$.legacy_List_legacy_int._as(buf);
       t1 = _this._byteToHex;
       t1 = H.S((t1 && C.JSArray_methods).$index(t1, buf[0]));
       t2 = _this._byteToHex;
@@ -7028,25 +7782,50 @@
       return t1 + H.S((t2 && C.JSArray_methods).$index(t2, buf[15]));
     },
     set$_byteToHex: function(_byteToHex) {
-      this._byteToHex = H.assertSubtype(_byteToHex, "$isList", [P.String], "$asList");
+      this._byteToHex = type$.legacy_List_legacy_String._as(_byteToHex);
     },
     set$_hexToByte: function(_hexToByte) {
-      this._hexToByte = H.assertSubtype(_hexToByte, "$isMap", [P.String, P.int], "$asMap");
+      this._hexToByte = type$.legacy_Map_of_legacy_String_and_legacy_int._as(_hexToByte);
     }
   };
   E.main_closure.prototype = {
     call$1: function(_) {
-      H.interceptedTypeCheck(_, "$isMouseEvent");
+      type$.legacy_MouseEvent._as(_);
       this.channel._outgoingController.close$0(0);
     },
-    $signature: 25
+    $signature: 27
   };
   E.main_closure0.prototype = {
     call$1: function(s) {
-      var t1 = this.channel._outgoingController;
-      t1.add$1(0, H.assertSubtypeOfRuntimeType(H.stringTypeCheck(s), H.getTypeArgumentByIndex(t1, 0)));
+      var count, t1, t2, t3, i, t4, t5, lastEvent;
+      H._asStringS(s);
+      if (J.startsWith$1$s(s, "send ")) {
+        count = P.int_parse(C.JSArray_methods.get$last(s.split(" ")));
+        for (t1 = this.channel._outgoingController, t2 = H._instanceType(t1), t3 = t2._precomputed1, t2 = t2._eval$1("_DelayedData<1>"), i = 0; i < count; ++i) {
+          t4 = t3._as("" + i);
+          if (t1._state >= 4)
+            H.throwExpression(t1._badEventState$0());
+          t5 = t1._state;
+          if ((t5 & 1) !== 0)
+            t1._sendData$1(t4);
+          else if ((t5 & 3) === 0) {
+            t5 = t1._ensurePendingEvents$0();
+            t4 = new P._DelayedData(t4, t2);
+            lastEvent = t5.lastPendingEvent;
+            if (lastEvent == null)
+              t5.firstPendingEvent = t5.lastPendingEvent = t4;
+            else {
+              lastEvent.set$next(t4);
+              t5.lastPendingEvent = t4;
+            }
+          }
+        }
+      } else {
+        t1 = this.channel._outgoingController;
+        t1.add$1(0, H._instanceType(t1)._precomputed1._as(s));
+      }
     },
-    $signature: 26
+    $signature: 28
   };
   (function aliases() {
     var _ = J.Interceptor.prototype;
@@ -7058,56 +7837,45 @@
   (function installTearOffs() {
     var _static_1 = hunkHelpers._static_1,
       _static_0 = hunkHelpers._static_0,
-      _static = hunkHelpers.installStaticTearOff,
+      _static_2 = hunkHelpers._static_2,
       _instance = hunkHelpers.installInstanceTearOff,
-      _instance_0_u = hunkHelpers._instance_0u,
-      _instance_1_u = hunkHelpers._instance_1u;
-    _static_1(P, "async__AsyncRun__scheduleImmediateJsOverride$closure", "_AsyncRun__scheduleImmediateJsOverride", 6);
-    _static_1(P, "async__AsyncRun__scheduleImmediateWithSetImmediate$closure", "_AsyncRun__scheduleImmediateWithSetImmediate", 6);
-    _static_1(P, "async__AsyncRun__scheduleImmediateWithTimer$closure", "_AsyncRun__scheduleImmediateWithTimer", 6);
-    _static_0(P, "async___startMicrotaskLoop$closure", "_startMicrotaskLoop", 0);
-    _static(P, "async___nullErrorHandler$closure", 1, null, ["call$2", "call$1"], ["_nullErrorHandler", function(error) {
-      return P._nullErrorHandler(error, null);
-    }], 3, 0);
-    _static_0(P, "async___nullDoneHandler$closure", "_nullDoneHandler", 0);
-    _instance(P._Completer.prototype, "get$completeError", 0, 1, null, ["call$2", "call$1"], ["completeError$2", "completeError$1"], 3, 0);
-    _instance(P._Future.prototype, "get$_completeError", 0, 1, function() {
-      return [null];
-    }, ["call$2", "call$1"], ["_completeError$2", "_completeError$1"], 3, 0);
-    var _;
-    _instance_0_u(_ = P._ControllerSubscription.prototype, "get$_onPause", "_onPause$0", 0);
-    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
-    _instance_0_u(_ = P._BufferingStreamSubscription.prototype, "get$_onPause", "_onPause$0", 0);
-    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
-    _instance_1_u(_ = P._StreamIterator.prototype, "get$_onData", "_onData$1", 20);
-    _instance(_, "get$_onError", 0, 1, function() {
-      return [null];
-    }, ["call$2", "call$1"], ["_onError$2", "_onError$1"], 3, 0);
-    _instance_0_u(_, "get$_onDone", "_onDone$0", 0);
+      _instance_2_u = hunkHelpers._instance_2u,
+      _instance_1_u = hunkHelpers._instance_1u,
+      _instance_0_u = hunkHelpers._instance_0u;
+    _static_1(P, "async__AsyncRun__scheduleImmediateJsOverride$closure", "_AsyncRun__scheduleImmediateJsOverride", 3);
+    _static_1(P, "async__AsyncRun__scheduleImmediateWithSetImmediate$closure", "_AsyncRun__scheduleImmediateWithSetImmediate", 3);
+    _static_1(P, "async__AsyncRun__scheduleImmediateWithTimer$closure", "_AsyncRun__scheduleImmediateWithTimer", 3);
+    _static_0(P, "async___startMicrotaskLoop$closure", "_startMicrotaskLoop", 1);
+    _static_2(P, "async___nullErrorHandler$closure", "_nullErrorHandler", 6);
+    _static_0(P, "async___nullDoneHandler$closure", "_nullDoneHandler", 1);
+    _instance(P._Completer.prototype, "get$completeError", 0, 1, null, ["call$2", "call$1"], ["completeError$2", "completeError$1"], 18, 0);
+    _instance_2_u(P._Future.prototype, "get$_completeError", "_completeError$2", 6);
     _static_1(P, "convert___defaultToEncodable$closure", "_defaultToEncodable", 4);
+    var _;
     _instance_1_u(_ = M.SseClient.prototype, "get$_onIncomingControlMessage", "_onIncomingControlMessage$1", 10);
     _instance_1_u(_, "get$_onIncomingMessage", "_onIncomingMessage$1", 10);
-    _instance_0_u(_, "get$_onOutgoingDone", "_onOutgoingDone$0", 0);
-    _instance_1_u(_, "get$_onOutgoingMessage", "_onOutgoingMessage$1", 2);
+    _instance_0_u(_, "get$_onOutgoingDone", "_onOutgoingDone$0", 1);
+    _instance_1_u(_, "get$_onOutgoingMessage", "_onOutgoingMessage$1", 26);
   })();
   (function inheritance() {
     var _mixin = hunkHelpers.mixin,
       _inherit = hunkHelpers.inherit,
       _inheritMany = hunkHelpers.inheritMany;
     _inherit(P.Object, null);
-    _inheritMany(P.Object, [H.JS_CONST, J.Interceptor, J.ArrayIterator, P.Iterable, H.ListIterator, H.FixedLengthListMixin, H.Symbol0, P.MapView, H.ConstantMap, H.JSInvocationMirror, H.Closure, H.TypeErrorDecoder, P.Error, H.ExceptionAndStackTrace, H._StackTrace, P.MapMixin, H.LinkedHashMapCell, H.LinkedHashMapKeyIterator, P._TimerImpl, P._AsyncAwaitCompleter, P._Completer, P._FutureListener, P._Future, P._AsyncCallbackEntry, P.Stream, P.StreamSubscription, P.StreamTransformerBase, P._StreamController, P._AsyncStreamControllerDispatch, P._BufferingStreamSubscription, P._StreamSinkWrapper, P._DelayedEvent, P._DelayedDone, P._PendingEvents, P._StreamIterator, P.AsyncError, P._Zone, P.ListMixin, P._UnmodifiableMapMixin, P.Codec, P._JsonStringifier, P.bool, P.DateTime, P.num, P.Duration, P.OutOfMemoryError, P.StackOverflowError, P._Exception, P.FormatException, P.List, P.Null, P.StackTrace, P.String, P.StringBuffer, P.Symbol, P._AcceptStructuredClone, P._JSRandom, N.Logger, N.Level, N.LogRecord, R.StreamChannelMixin, F.Uuid]);
+    _inheritMany(P.Object, [H.JS_CONST, J.Interceptor, J.ArrayIterator, P.Error, P.Iterable, H.ListIterator, H.FixedLengthListMixin, H.Symbol, P.MapView, H.ConstantMap, H.JSInvocationMirror, H.Closure, H.TypeErrorDecoder, H.NullThrownFromJavaScriptException, H.ExceptionAndStackTrace, H._StackTrace, H._Required, P.MapMixin, H.LinkedHashMapCell, H.LinkedHashMapKeyIterator, H.Rti, H._FunctionParameters, P._TimerImpl, P._AsyncAwaitCompleter, P._Completer, P._FutureListener, P._Future, P._AsyncCallbackEntry, P.Stream, P.StreamSubscription, P.StreamTransformerBase, P._StreamController, P._AsyncStreamControllerDispatch, P._BufferingStreamSubscription, P._StreamSinkWrapper, P._DelayedEvent, P._DelayedDone, P._PendingEvents, P._StreamIterator, P.AsyncError, P._Zone, P.ListMixin, P._UnmodifiableMapMixin, P.Codec, P._JsonStringifier, P.DateTime, P.Duration, P.OutOfMemoryError, P.StackOverflowError, P._Exception, P.FormatException, P.Null, P._StringStackTrace, P.StringBuffer, W.EventStreamProvider, P._AcceptStructuredClone, P._JSRandom, Y.Level, L.LogRecord, F.Logger, R.StreamChannelMixin, K.Uuid]);
     _inheritMany(J.Interceptor, [J.JSBool, J.JSNull, J.JavaScriptObject, J.JSArray, J.JSNumber, J.JSString, H.NativeTypedData, W.EventTarget, W.DomException, W.Event]);
     _inheritMany(J.JavaScriptObject, [J.PlainJavaScriptObject, J.UnknownJavaScriptObject, J.JavaScriptFunction]);
     _inherit(J.JSUnmodifiableArray, J.JSArray);
     _inheritMany(J.JSNumber, [J.JSInt, J.JSDouble]);
+    _inheritMany(P.Error, [H.LateInitializationErrorImpl, P.TypeError, H.JsNoSuchMethodError, H.UnknownJsTypeError, H.RuntimeError, P.AssertionError, H._Error, P.JsonUnsupportedObjectError, P.NullThrownError, P.ArgumentError, P.NoSuchMethodError, P.UnsupportedError, P.UnimplementedError, P.StateError, P.ConcurrentModificationError, P.CyclicInitializationError]);
     _inherit(H.EfficientLengthIterable, P.Iterable);
     _inheritMany(H.EfficientLengthIterable, [H.ListIterable, H.LinkedHashMapKeyIterable]);
     _inherit(P._UnmodifiableMapView_MapView__UnmodifiableMapMixin, P.MapView);
     _inherit(P.UnmodifiableMapView, P._UnmodifiableMapView_MapView__UnmodifiableMapMixin);
     _inherit(H.ConstantMapView, P.UnmodifiableMapView);
     _inherit(H.ConstantStringMap, H.ConstantMap);
-    _inheritMany(H.Closure, [H.Primitives_functionNoSuchMethod_closure, H.unwrapException_saveStackTrace, H.TearOffClosure, H.initHooks_closure, H.initHooks_closure0, H.initHooks_closure1, P._AsyncRun__initializeScheduleImmediate_internalCallback, P._AsyncRun__initializeScheduleImmediate_closure, P._AsyncRun__scheduleImmediateJsOverride_internalCallback, P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, P._TimerImpl_internalCallback, P._awaitOnObject_closure, P._awaitOnObject_closure0, P._wrapJsFunctionForAsync_closure, P._Future__addListener_closure, P._Future__prependListeners_closure, P._Future__chainForeignFuture_closure, P._Future__chainForeignFuture_closure0, P._Future__chainForeignFuture_closure1, P._Future__asyncComplete_closure, P._Future__chainFuture_closure, P._Future__asyncCompleteError_closure, P._Future__propagateToListeners_handleWhenCompleteCallback, P._Future__propagateToListeners_handleWhenCompleteCallback_closure, P._Future__propagateToListeners_handleValueCallback, P._Future__propagateToListeners_handleError, P.Stream_length_closure, P.Stream_length_closure0, P._StreamController__subscribe_closure, P._StreamController__recordCancel_complete, P._BufferingStreamSubscription__sendError_sendError, P._BufferingStreamSubscription__sendDone_sendDone, P._PendingEvents_schedule_closure, P._rootHandleUncaughtError_closure, P._RootZone_bindCallback_closure, P._RootZone_bindCallbackGuarded_closure, P._RootZone_bindUnaryCallbackGuarded_closure, P.MapBase_mapToString_closure, P._JsonStringifier_writeMap_closure, P._symbolMapToStringMap_closure, P.NoSuchMethodError_toString_closure, P.Duration_toString_sixDigits, P.Duration_toString_twoDigits, W.HttpRequest_request_closure, W._EventStreamSubscription_closure, P._AcceptStructuredClone_walk_closure, P.convertDartToNative_Dictionary_closure, P.promiseToFuture_closure, P.promiseToFuture_closure0, N.Logger_Logger_closure, M.SseClient_closure, M.SseClient_closure0, M.SseClient__closure, E.main_closure, E.main_closure0]);
-    _inheritMany(P.Error, [H.NullError, H.JsNoSuchMethodError, H.UnknownJsTypeError, H.TypeErrorImplementation, H.CastErrorImplementation, H.RuntimeError, P.AssertionError, P.JsonUnsupportedObjectError, P.NullThrownError, P.ArgumentError, P.NoSuchMethodError, P.UnsupportedError, P.UnimplementedError, P.StateError, P.ConcurrentModificationError, P.CyclicInitializationError]);
+    _inheritMany(H.Closure, [H.Primitives_functionNoSuchMethod_closure, H.TearOffClosure, H.initHooks_closure, H.initHooks_closure0, H.initHooks_closure1, P._AsyncRun__initializeScheduleImmediate_internalCallback, P._AsyncRun__initializeScheduleImmediate_closure, P._AsyncRun__scheduleImmediateJsOverride_internalCallback, P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, P._TimerImpl_internalCallback, P._awaitOnObject_closure, P._awaitOnObject_closure0, P._wrapJsFunctionForAsync_closure, P._Future__addListener_closure, P._Future__prependListeners_closure, P._Future__chainForeignFuture_closure, P._Future__chainForeignFuture_closure0, P._Future__chainForeignFuture_closure1, P._Future__asyncCompleteWithValue_closure, P._Future__chainFuture_closure, P._Future__asyncCompleteError_closure, P._Future__propagateToListeners_handleWhenCompleteCallback, P._Future__propagateToListeners_handleWhenCompleteCallback_closure, P._Future__propagateToListeners_handleValueCallback, P._Future__propagateToListeners_handleError, P.Stream_length_closure, P.Stream_length_closure0, P._StreamController__subscribe_closure, P._StreamController__recordCancel_complete, P._BufferingStreamSubscription__sendError_sendError, P._BufferingStreamSubscription__sendDone_sendDone, P._PendingEvents_schedule_closure, P._rootHandleUncaughtError_closure, P._RootZone_bindCallback_closure, P._RootZone_bindCallbackGuarded_closure, P._RootZone_bindUnaryCallbackGuarded_closure, P.MapBase_mapToString_closure, P._JsonStringifier_writeMap_closure, P._symbolMapToStringMap_closure, P.NoSuchMethodError_toString_closure, P.Duration_toString_sixDigits, P.Duration_toString_twoDigits, W.HttpRequest_request_closure, W._EventStreamSubscription_closure, P._AcceptStructuredClone_walk_closure, P.convertDartToNative_Dictionary_closure, P.promiseToFuture_closure, P.promiseToFuture_closure0, F.Logger_Logger_closure, M.SseClient_closure, M.SseClient_closure0, M.SseClient__closure, E.main_closure, E.main_closure0]);
+    _inherit(H.NullError, P.TypeError);
     _inheritMany(H.TearOffClosure, [H.StaticClosure, H.BoundClosure]);
     _inherit(H._AssertionError, P.AssertionError);
     _inherit(P.MapBase, P.MapMixin);
@@ -7119,6 +7887,7 @@
     _inherit(H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin, H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin);
     _inherit(H.NativeTypedArrayOfInt, H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin);
     _inheritMany(H.NativeTypedArrayOfInt, [H.NativeInt16List, H.NativeInt32List, H.NativeInt8List, H.NativeUint16List, H.NativeUint32List, H.NativeUint8ClampedList, H.NativeUint8List]);
+    _inherit(H._TypeError, H._Error);
     _inherit(P._AsyncCompleter, P._Completer);
     _inherit(P._AsyncStreamController, P._StreamController);
     _inheritMany(P.Stream, [P._StreamImpl, W._EventStream]);
@@ -7133,7 +7902,6 @@
     _inheritMany(P.Codec, [P.JsonCodec, N.HexCodec]);
     _inheritMany(P.Converter, [P.JsonEncoder, P.JsonDecoder, R.HexEncoder]);
     _inherit(P._JsonStringStringifier, P._JsonStringifier);
-    _inheritMany(P.num, [P.double, P.int]);
     _inheritMany(P.ArgumentError, [P.RangeError, P.IndexError]);
     _inheritMany(W.EventTarget, [W.Node, W.EventSource, W.HttpRequestEventTarget]);
     _inherit(W.Element, W.Node);
@@ -7153,7 +7921,103 @@
     _mixin(P._AsyncStreamController, P._AsyncStreamControllerDispatch);
     _mixin(P._UnmodifiableMapView_MapView__UnmodifiableMapMixin, P._UnmodifiableMapMixin);
   })();
-  var init = {mangledGlobalNames: {int: "int", double: "double", num: "num", String: "String", bool: "bool", Null: "Null", List: "List"}, mangledNames: {}, getTypeFromName: getGlobalFromName, metadata: [], types: [{func: 1, ret: -1}, {func: 1, ret: P.Null}, {func: 1, ret: -1, args: [,]}, {func: 1, ret: -1, args: [P.Object], opt: [P.StackTrace]}, {func: 1, args: [,]}, {func: 1, ret: P.Null, args: [,,]}, {func: 1, ret: -1, args: [{func: 1, ret: -1}]}, {func: 1, ret: P.Null, args: [,]}, {func: 1, ret: P.Null, args: [P.Symbol,,]}, {func: 1, ret: P.String, args: [P.int]}, {func: 1, ret: -1, args: [W.Event]}, {func: 1, ret: P.Null, args: [W.Event]}, {func: 1, ret: P.Null, args: [P.String,,]}, {func: 1, args: [, P.String]}, {func: 1, args: [P.String]}, {func: 1, ret: P.Null, args: [{func: 1, ret: -1}]}, {func: 1, ret: P.Null, args: [, P.StackTrace]}, {func: 1, ret: P.Null, args: [P.int,,]}, {func: 1, ret: P.Null, args: [,], opt: [P.StackTrace]}, {func: 1, ret: [P._Future,,], args: [,]}, {func: 1, ret: -1, args: [P.Object]}, {func: 1, ret: P.Null, args: [W.ProgressEvent]}, {func: 1, args: [W.Event]}, {func: 1, args: [,,]}, {func: 1, ret: N.Logger}, {func: 1, ret: P.Null, args: [W.MouseEvent]}, {func: 1, ret: P.Null, args: [P.String]}], interceptorsByTag: null, leafTags: null};
+  var init = {
+    typeUniverse: {eC: new Map(), tR: {}, eT: {}, tPV: {}, sEA: []},
+    mangledGlobalNames: {int: "int", double: "double", num: "num", String: "String", bool: "bool", Null: "Null", List: "List"},
+    mangledNames: {},
+    getTypeFromName: getGlobalFromName,
+    metadata: [],
+    types: ["Null()", "~()", "~(@)", "~(~())", "@(@)", "Null(@)", "~(Object,StackTrace)", "Null(Object?,Object?)", "Null(Symbol0,@)", "String(int)", "~(Event*)", "Null(Event*)", "Null(String,@)", "@(@,String)", "@(String)", "Null(~())", "Null(@,StackTrace)", "Null(int,@)", "~(Object[StackTrace?])", "Null(Object,StackTrace)", "_Future<@>(@)", "Null(ProgressEvent)", "@(Event)", "@(@,@)", "Null(@,@)", "Logger*()", "~(String*)", "Null(MouseEvent*)", "Null(String*)"],
+    interceptorsByTag: null,
+    leafTags: null,
+    arrayRti: typeof Symbol == "function" && typeof Symbol() == "symbol" ? Symbol("$ti") : "$ti"
+  };
+  H._Universe_addRules(init.typeUniverse, JSON.parse('{"JavaScriptFunction":"JavaScriptObject","PlainJavaScriptObject":"JavaScriptObject","UnknownJavaScriptObject":"JavaScriptObject","AbortPaymentEvent":"Event","ExtendableEvent":"Event","AElement":"SvgElement","GraphicsElement":"SvgElement","_ResourceProgressEvent":"ProgressEvent","AudioElement":"HtmlElement","MediaElement":"HtmlElement","PointerEvent":"MouseEvent","CompositionEvent":"UIEvent","MessagePort":"EventTarget","HtmlDocument":"Node","Document":"Node","NativeFloat32List":"NativeTypedArrayOfDouble","JSBool":{"bool":[]},"JSNull":{"Null":[]},"JavaScriptObject":{"Function":[]},"JSArray":{"List":["1"],"Iterable":["1"]},"JSUnmodifiableArray":{"JSArray":["1"],"List":["1"],"Iterable":["1"]},"JSNumber":{"double":[],"num":[]},"JSInt":{"double":[],"int":[],"num":[]},"JSDouble":{"double":[],"num":[]},"JSString":{"String":[],"Pattern":[]},"LateInitializationErrorImpl":{"Error":[]},"EfficientLengthIterable":{"Iterable":["1"]},"ListIterable":{"Iterable":["1"]},"Symbol":{"Symbol0":[]},"ConstantMapView":{"UnmodifiableMapView":["1","2"],"_UnmodifiableMapView_MapView__UnmodifiableMapMixin":["1","2"],"MapView":["1","2"],"_UnmodifiableMapMixin":["1","2"],"Map":["1","2"]},"ConstantMap":{"Map":["1","2"]},"ConstantStringMap":{"ConstantMap":["1","2"],"Map":["1","2"]},"JSInvocationMirror":{"Invocation":[]},"NullError":{"Error":[]},"JsNoSuchMethodError":{"Error":[]},"UnknownJsTypeError":{"Error":[]},"_StackTrace":{"StackTrace":[]},"Closure":{"Function":[]},"TearOffClosure":{"Function":[]},"StaticClosure":{"Function":[]},"BoundClosure":{"Function":[]},"RuntimeError":{"Error":[]},"_AssertionError":{"Error":[]},"JsLinkedHashMap":{"MapMixin":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapMixin.K":"1","MapMixin.V":"2"},"LinkedHashMapKeyIterable":{"Iterable":["1"]},"NativeTypedArray":{"JavaScriptIndexingBehavior":["1"]},"NativeTypedArrayOfDouble":{"ListMixin":["double"],"JavaScriptIndexingBehavior":["double"],"List":["double"],"Iterable":["double"],"FixedLengthListMixin":["double"],"ListMixin.E":"double"},"NativeTypedArrayOfInt":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"]},"NativeInt16List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeInt32List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeInt8List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint16List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint32List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint8ClampedList":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint8List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"_Error":{"Error":[]},"_TypeError":{"Error":[]},"_TimerImpl":{"Timer":[]},"_AsyncCompleter":{"_Completer":["1"]},"_Future":{"Future":["1"]},"_StreamController":{"StreamController":["1"],"_StreamControllerLifecycle":["1"],"_EventDispatch":["1"]},"_AsyncStreamController":{"_AsyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"_StreamControllerLifecycle":["1"],"_EventDispatch":["1"]},"_ControllerStream":{"_StreamImpl":["1"],"Stream":["1"]},"_ControllerSubscription":{"_BufferingStreamSubscription":["1"],"StreamSubscription":["1"],"_EventDispatch":["1"]},"_BufferingStreamSubscription":{"StreamSubscription":["1"],"_EventDispatch":["1"]},"_StreamImpl":{"Stream":["1"]},"_DelayedData":{"_DelayedEvent":["1"]},"_DelayedError":{"_DelayedEvent":["@"]},"_DelayedDone":{"_DelayedEvent":["@"]},"_StreamImplEvents":{"_PendingEvents":["1"]},"AsyncError":{"Error":[]},"_Zone":{"Zone":[]},"_RootZone":{"_Zone":[],"Zone":[]},"MapBase":{"MapMixin":["1","2"],"Map":["1","2"]},"MapMixin":{"Map":["1","2"]},"MapView":{"Map":["1","2"]},"UnmodifiableMapView":{"_UnmodifiableMapView_MapView__UnmodifiableMapMixin":["1","2"],"MapView":["1","2"],"_UnmodifiableMapMixin":["1","2"],"Map":["1","2"]},"_JsonMap":{"MapMixin":["String","@"],"Map":["String","@"],"MapMixin.K":"String","MapMixin.V":"@"},"_JsonMapKeyIterable":{"ListIterable":["String"],"Iterable":["String"],"ListIterable.E":"String"},"JsonUnsupportedObjectError":{"Error":[]},"JsonCyclicError":{"Error":[]},"JsonCodec":{"Codec":["Object?","String"],"Codec.S":"Object?"},"JsonEncoder":{"Converter":["Object?","String"]},"JsonDecoder":{"Converter":["String","Object?"]},"double":{"num":[]},"int":{"num":[]},"List":{"Iterable":["1"]},"String":{"Pattern":[]},"AssertionError":{"Error":[]},"TypeError":{"Error":[]},"NullThrownError":{"Error":[]},"ArgumentError":{"Error":[]},"RangeError":{"Error":[]},"IndexError":{"Error":[]},"NoSuchMethodError":{"Error":[]},"UnsupportedError":{"Error":[]},"UnimplementedError":{"Error":[]},"StateError":{"Error":[]},"ConcurrentModificationError":{"Error":[]},"OutOfMemoryError":{"Error":[]},"StackOverflowError":{"Error":[]},"CyclicInitializationError":{"Error":[]},"_StringStackTrace":{"StackTrace":[]},"StringBuffer":{"StringSink":[]},"HtmlElement":{"Element":[],"EventTarget":[]},"AnchorElement":{"Element":[],"EventTarget":[]},"AreaElement":{"Element":[],"EventTarget":[]},"Element":{"EventTarget":[]},"EventSource":{"EventTarget":[]},"FormElement":{"Element":[],"EventTarget":[]},"HttpRequest":{"EventTarget":[]},"HttpRequestEventTarget":{"EventTarget":[]},"MessageEvent":{"Event":[]},"MouseEvent":{"Event":[]},"Node":{"EventTarget":[]},"ProgressEvent":{"Event":[]},"SelectElement":{"Element":[],"EventTarget":[]},"UIEvent":{"Event":[]},"_EventStream":{"Stream":["1"]},"_ElementEventStreamImpl":{"_EventStream":["1"],"Stream":["1"]},"_EventStreamSubscription":{"StreamSubscription":["1"]},"SvgElement":{"Element":[],"EventTarget":[]},"HexCodec":{"Codec":["List<int*>*","String*"],"Codec.S":"List<int*>*"},"HexEncoder":{"Converter":["List<int*>*","String*"]}}'));
+  H._Universe_addErasedTypes(init.typeUniverse, JSON.parse('{"EfficientLengthIterable":1,"NativeTypedArray":1,"StreamTransformerBase":2,"MapBase":2,"StreamChannelMixin":1}'));
+  0;
+  var type$ = (function rtii() {
+    var findType = H.findType;
+    return {
+      $env_1_1_void: findType("@<~>"),
+      AsyncError: findType("AsyncError"),
+      ConstantMapView_Symbol_dynamic: findType("ConstantMapView<Symbol0,@>"),
+      Duration: findType("Duration"),
+      Error: findType("Error"),
+      Event: findType("Event"),
+      Function: findType("Function"),
+      Future_dynamic: findType("Future<@>"),
+      Future_void: findType("Future<~>"),
+      HexCodec: findType("HexCodec"),
+      Invocation: findType("Invocation"),
+      Iterable_dynamic: findType("Iterable<@>"),
+      JSArray_String: findType("JSArray<String>"),
+      JSArray_dynamic: findType("JSArray<@>"),
+      JSArray_legacy_String: findType("JSArray<String*>"),
+      JSArray_legacy_int: findType("JSArray<int*>"),
+      JSNull: findType("JSNull"),
+      JavaScriptFunction: findType("JavaScriptFunction"),
+      JavaScriptIndexingBehavior_dynamic: findType("JavaScriptIndexingBehavior<@>"),
+      JsLinkedHashMap_String_dynamic: findType("JsLinkedHashMap<String,@>"),
+      JsLinkedHashMap_Symbol_dynamic: findType("JsLinkedHashMap<Symbol0,@>"),
+      JsLinkedHashMap_of_legacy_String_and_dynamic: findType("JsLinkedHashMap<String*,@>"),
+      JsLinkedHashMap_of_legacy_String_and_legacy_int: findType("JsLinkedHashMap<String*,int*>"),
+      List_dynamic: findType("List<@>"),
+      Map_dynamic_dynamic: findType("Map<@,@>"),
+      Null: findType("Null"),
+      Object: findType("Object"),
+      ProgressEvent: findType("ProgressEvent"),
+      StackTrace: findType("StackTrace"),
+      String: findType("String"),
+      Symbol: findType("Symbol0"),
+      UnknownJavaScriptObject: findType("UnknownJavaScriptObject"),
+      _AsyncCompleter_HttpRequest: findType("_AsyncCompleter<HttpRequest>"),
+      _ElementEventStreamImpl_legacy_MouseEvent: findType("_ElementEventStreamImpl<MouseEvent*>"),
+      _Future_HttpRequest: findType("_Future<HttpRequest>"),
+      _Future_dynamic: findType("_Future<@>"),
+      _Future_int: findType("_Future<int>"),
+      _Future_void: findType("_Future<~>"),
+      _StreamControllerAddStreamState_nullable_Object: findType("_StreamControllerAddStreamState<Object?>"),
+      bool: findType("bool"),
+      bool_Function_Object: findType("bool(Object)"),
+      double: findType("double"),
+      dynamic: findType("@"),
+      dynamic_Function: findType("@()"),
+      dynamic_Function_Object: findType("@(Object)"),
+      dynamic_Function_Object_StackTrace: findType("@(Object,StackTrace)"),
+      dynamic_Function_dynamic_dynamic: findType("@(@,@)"),
+      int: findType("int"),
+      legacy_Event: findType("Event*"),
+      legacy_Level: findType("Level*"),
+      legacy_List_legacy_String: findType("List<String*>*"),
+      legacy_List_legacy_int: findType("List<int*>*"),
+      legacy_Logger: findType("Logger*"),
+      legacy_Map_of_legacy_String_and_legacy_int: findType("Map<String*,int*>*"),
+      legacy_Map_of_legacy_Symbol_and_dynamic: findType("Map<Symbol0*,@>*"),
+      legacy_MessageEvent: findType("MessageEvent*"),
+      legacy_MouseEvent: findType("MouseEvent*"),
+      legacy_Never: findType("0&*"),
+      legacy_Object: findType("Object*"),
+      legacy_ProgressEvent: findType("ProgressEvent*"),
+      legacy_String: findType("String*"),
+      nullable_Future_Null: findType("Future<Null>?"),
+      nullable_List_dynamic: findType("List<@>?"),
+      nullable_Object: findType("Object?"),
+      nullable__DelayedEvent_dynamic: findType("_DelayedEvent<@>?"),
+      nullable__FutureListener_dynamic_dynamic: findType("_FutureListener<@,@>?"),
+      nullable_dynamic_Function_Event: findType("@(Event)?"),
+      nullable_nullable_Object_Function_2_nullable_Object_and_nullable_Object: findType("Object?(Object?,Object?)?"),
+      nullable_nullable_Object_Function_dynamic: findType("Object?(@)?"),
+      nullable_void_Function: findType("~()?"),
+      nullable_void_Function_legacy_Event: findType("~(Event*)?"),
+      nullable_void_Function_legacy_ProgressEvent: findType("~(ProgressEvent*)?"),
+      num: findType("num"),
+      void: findType("~"),
+      void_Function: findType("~()"),
+      void_Function_Object: findType("~(Object)"),
+      void_Function_Object_StackTrace: findType("~(Object,StackTrace)"),
+      void_Function_String_dynamic: findType("~(String,@)")
+    };
+  })();
   (function constants() {
     var makeConstList = hunkHelpers.makeConstList;
     C.EventSource_methods = W.EventSource.prototype;
@@ -7294,23 +8158,26 @@
     C.C_OutOfMemoryError = new P.OutOfMemoryError();
     C.C__DelayedDone = new P._DelayedDone();
     C.C__JSRandom = new P._JSRandom();
+    C.C__Required = new H._Required();
     C.C__RootZone = new P._RootZone();
+    C.C__StringStackTrace = new P._StringStackTrace();
     C.Duration_0 = new P.Duration(0);
     C.Duration_5000000 = new P.Duration(5000000);
     C.JsonDecoder_null = new P.JsonDecoder(null);
     C.JsonEncoder_null = new P.JsonEncoder(null);
-    C.Level_INFO_800 = new N.Level("INFO", 800);
-    C.Level_WARNING_900 = new N.Level("WARNING", 900);
-    C.List_empty = makeConstList([]);
-    C.List_empty0 = H.setRuntimeTypeInfo(makeConstList([]), [P.Symbol]);
-    C.Map_empty = new H.ConstantStringMap(0, {}, C.List_empty0, [P.Symbol, null]);
-    C.Symbol_call = new H.Symbol0("call");
+    C.Level_INFO_800 = new Y.Level("INFO", 800);
+    C.Level_SEVERE_1000 = new Y.Level("SEVERE", 1000);
+    C.Level_WARNING_900 = new Y.Level("WARNING", 900);
+    C.List_empty = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_dynamic);
+    C.List_empty0 = H.setRuntimeTypeInfo(makeConstList([]), H.findType("JSArray<Symbol0*>"));
+    C.Map_empty = new H.ConstantStringMap(0, {}, C.List_empty0, H.findType("ConstantStringMap<Symbol0*,@>"));
+    C.Symbol_call = new H.Symbol("call");
   })();
   (function staticFields() {
+    $._JS_INTEROP_INTERCEPTOR_TAG = null;
     $.Closure_functionCounter = 0;
     $.BoundClosure_selfFieldNameCache = null;
     $.BoundClosure_receiverFieldNameCache = null;
-    $._inTypeAssertion = false;
     $.getTagFunction = null;
     $.alternateTagFunction = null;
     $.prototypeForTagFunction = null;
@@ -7322,36 +8189,35 @@
     $._lastPriorityCallback = null;
     $._isInCallbackLoop = false;
     $.Zone__current = C.C__RootZone;
-    $._toStringVisiting = [];
-    $.Logger__loggers = P.LinkedHashMap_LinkedHashMap$_empty(P.String, N.Logger);
+    $._toStringVisiting = H.setRuntimeTypeInfo([], H.findType("JSArray<Object>"));
     $.LogRecord__nextNumber = 0;
+    $.Logger__loggers = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_Logger);
   })();
   (function lazyInitializers() {
-    var _lazy = hunkHelpers.lazy;
-    _lazy($, "DART_CLOSURE_PROPERTY_NAME", "$get$DART_CLOSURE_PROPERTY_NAME", function() {
+    var _lazyFinal = hunkHelpers.lazyFinal,
+      _lazy = hunkHelpers.lazy,
+      _lazyOld = hunkHelpers.lazyOld;
+    _lazyFinal($, "DART_CLOSURE_PROPERTY_NAME", "$get$DART_CLOSURE_PROPERTY_NAME", function() {
       return H.getIsolateAffinityTag("_$dart_dartClosure");
     });
-    _lazy($, "JS_INTEROP_INTERCEPTOR_TAG", "$get$JS_INTEROP_INTERCEPTOR_TAG", function() {
-      return H.getIsolateAffinityTag("_$dart_js");
-    });
-    _lazy($, "TypeErrorDecoder_noSuchMethodPattern", "$get$TypeErrorDecoder_noSuchMethodPattern", function() {
+    _lazyFinal($, "TypeErrorDecoder_noSuchMethodPattern", "$get$TypeErrorDecoder_noSuchMethodPattern", function() {
       return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({
         toString: function() {
           return "$receiver$";
         }
       }));
     });
-    _lazy($, "TypeErrorDecoder_notClosurePattern", "$get$TypeErrorDecoder_notClosurePattern", function() {
+    _lazyFinal($, "TypeErrorDecoder_notClosurePattern", "$get$TypeErrorDecoder_notClosurePattern", function() {
       return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({$method$: null,
         toString: function() {
           return "$receiver$";
         }
       }));
     });
-    _lazy($, "TypeErrorDecoder_nullCallPattern", "$get$TypeErrorDecoder_nullCallPattern", function() {
+    _lazyFinal($, "TypeErrorDecoder_nullCallPattern", "$get$TypeErrorDecoder_nullCallPattern", function() {
       return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(null));
     });
-    _lazy($, "TypeErrorDecoder_nullLiteralCallPattern", "$get$TypeErrorDecoder_nullLiteralCallPattern", function() {
+    _lazyFinal($, "TypeErrorDecoder_nullLiteralCallPattern", "$get$TypeErrorDecoder_nullLiteralCallPattern", function() {
       return H.TypeErrorDecoder_extractPattern(function() {
         var $argumentsExpr$ = '$arguments$';
         try {
@@ -7361,10 +8227,10 @@
         }
       }());
     });
-    _lazy($, "TypeErrorDecoder_undefinedCallPattern", "$get$TypeErrorDecoder_undefinedCallPattern", function() {
+    _lazyFinal($, "TypeErrorDecoder_undefinedCallPattern", "$get$TypeErrorDecoder_undefinedCallPattern", function() {
       return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(void 0));
     });
-    _lazy($, "TypeErrorDecoder_undefinedLiteralCallPattern", "$get$TypeErrorDecoder_undefinedLiteralCallPattern", function() {
+    _lazyFinal($, "TypeErrorDecoder_undefinedLiteralCallPattern", "$get$TypeErrorDecoder_undefinedLiteralCallPattern", function() {
       return H.TypeErrorDecoder_extractPattern(function() {
         var $argumentsExpr$ = '$arguments$';
         try {
@@ -7374,10 +8240,10 @@
         }
       }());
     });
-    _lazy($, "TypeErrorDecoder_nullPropertyPattern", "$get$TypeErrorDecoder_nullPropertyPattern", function() {
+    _lazyFinal($, "TypeErrorDecoder_nullPropertyPattern", "$get$TypeErrorDecoder_nullPropertyPattern", function() {
       return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(null));
     });
-    _lazy($, "TypeErrorDecoder_nullLiteralPropertyPattern", "$get$TypeErrorDecoder_nullLiteralPropertyPattern", function() {
+    _lazyFinal($, "TypeErrorDecoder_nullLiteralPropertyPattern", "$get$TypeErrorDecoder_nullLiteralPropertyPattern", function() {
       return H.TypeErrorDecoder_extractPattern(function() {
         try {
           null.$method$;
@@ -7386,10 +8252,10 @@
         }
       }());
     });
-    _lazy($, "TypeErrorDecoder_undefinedPropertyPattern", "$get$TypeErrorDecoder_undefinedPropertyPattern", function() {
+    _lazyFinal($, "TypeErrorDecoder_undefinedPropertyPattern", "$get$TypeErrorDecoder_undefinedPropertyPattern", function() {
       return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(void 0));
     });
-    _lazy($, "TypeErrorDecoder_undefinedLiteralPropertyPattern", "$get$TypeErrorDecoder_undefinedLiteralPropertyPattern", function() {
+    _lazyFinal($, "TypeErrorDecoder_undefinedLiteralPropertyPattern", "$get$TypeErrorDecoder_undefinedLiteralPropertyPattern", function() {
       return H.TypeErrorDecoder_extractPattern(function() {
         try {
           (void 0).$method$;
@@ -7398,20 +8264,19 @@
         }
       }());
     });
-    _lazy($, "_AsyncRun__scheduleImmediateClosure", "$get$_AsyncRun__scheduleImmediateClosure", function() {
+    _lazyFinal($, "_AsyncRun__scheduleImmediateClosure", "$get$_AsyncRun__scheduleImmediateClosure", function() {
       return P._AsyncRun__initializeScheduleImmediate();
     });
-    _lazy($, "Future__nullFuture", "$get$Future__nullFuture", function() {
-      return P._Future$zoneValue(null, C.C__RootZone, P.Null);
-    });
-    _lazy($, "Future__falseFuture", "$get$Future__falseFuture", function() {
-      return P._Future$zoneValue(false, C.C__RootZone, P.bool);
+    _lazyFinal($, "Future__nullFuture", "$get$Future__nullFuture", function() {
+      var t1 = new P._Future(C.C__RootZone, H.findType("_Future<Null>"));
+      t1._setValue$1(null);
+      return t1;
     });
     _lazy($, "_hasErrorStackProperty", "$get$_hasErrorStackProperty", function() {
       return new Error().stack != void 0;
     });
-    _lazy($, "Logger_root", "$get$Logger_root", function() {
-      return N.Logger_Logger("");
+    _lazyOld($, "Logger_root", "$get$Logger_root", function() {
+      return F.Logger_Logger("");
     });
   })();
   (function nativeSupport() {
@@ -7437,8 +8302,8 @@
       }
       init.dispatchPropertyName = init.getIsolateTag("dispatch_record");
     }();
-    hunkHelpers.setOrUpdateInterceptorsByTag({ArrayBuffer: J.Interceptor, Blob: J.Interceptor, DOMError: J.Interceptor, File: J.Interceptor, MediaError: J.Interceptor, NavigatorUserMediaError: J.Interceptor, OverconstrainedError: J.Interceptor, PositionError: J.Interceptor, SQLError: J.Interceptor, DataView: H.NativeTypedData, ArrayBufferView: H.NativeTypedData, Float32Array: H.NativeTypedArrayOfDouble, Float64Array: H.NativeTypedArrayOfDouble, Int16Array: H.NativeInt16List, Int32Array: H.NativeInt32List, Int8Array: H.NativeInt8List, Uint16Array: H.NativeUint16List, Uint32Array: H.NativeUint32List, Uint8ClampedArray: H.NativeUint8ClampedList, CanvasPixelArray: H.NativeUint8ClampedList, Uint8Array: H.NativeUint8List, HTMLAudioElement: W.HtmlElement, HTMLBRElement: W.HtmlElement, HTMLBaseElement: W.HtmlElement, HTMLBodyElement: W.HtmlElement, HTMLButtonElement: W.HtmlElement, HTMLCanvasElement: W.HtmlElement, HTMLContentElement: W.HtmlElement, HTMLDListElement: W.HtmlElement, HTMLDataElement: W.HtmlElement, HTMLDataListElement: W.HtmlElement, HTMLDetailsElement: W.HtmlElement, HTMLDialogElement: W.HtmlElement, HTMLDivElement: W.HtmlElement, HTMLEmbedElement: W.HtmlElement, HTMLFieldSetElement: W.HtmlElement, HTMLHRElement: W.HtmlElement, HTMLHeadElement: W.HtmlElement, HTMLHeadingElement: W.HtmlElement, HTMLHtmlElement: W.HtmlElement, HTMLIFrameElement: W.HtmlElement, HTMLImageElement: W.HtmlElement, HTMLInputElement: W.HtmlElement, HTMLLIElement: W.HtmlElement, HTMLLabelElement: W.HtmlElement, HTMLLegendElement: W.HtmlElement, HTMLLinkElement: W.HtmlElement, HTMLMapElement: W.HtmlElement, HTMLMediaElement: W.HtmlElement, HTMLMenuElement: W.HtmlElement, HTMLMetaElement: W.HtmlElement, HTMLMeterElement: W.HtmlElement, HTMLModElement: W.HtmlElement, HTMLOListElement: W.HtmlElement, HTMLObjectElement: W.HtmlElement, HTMLOptGroupElement: W.HtmlElement, HTMLOptionElement: W.HtmlElement, HTMLOutputElement: W.HtmlElement, HTMLParagraphElement: W.HtmlElement, HTMLParamElement: W.HtmlElement, HTMLPictureElement: W.HtmlElement, HTMLPreElement: W.HtmlElement, HTMLProgressElement: W.HtmlElement, HTMLQuoteElement: W.HtmlElement, HTMLScriptElement: W.HtmlElement, HTMLShadowElement: W.HtmlElement, HTMLSlotElement: W.HtmlElement, HTMLSourceElement: W.HtmlElement, HTMLSpanElement: W.HtmlElement, HTMLStyleElement: W.HtmlElement, HTMLTableCaptionElement: W.HtmlElement, HTMLTableCellElement: W.HtmlElement, HTMLTableDataCellElement: W.HtmlElement, HTMLTableHeaderCellElement: W.HtmlElement, HTMLTableColElement: W.HtmlElement, HTMLTableElement: W.HtmlElement, HTMLTableRowElement: W.HtmlElement, HTMLTableSectionElement: W.HtmlElement, HTMLTemplateElement: W.HtmlElement, HTMLTextAreaElement: W.HtmlElement, HTMLTimeElement: W.HtmlElement, HTMLTitleElement: W.HtmlElement, HTMLTrackElement: W.HtmlElement, HTMLUListElement: W.HtmlElement, HTMLUnknownElement: W.HtmlElement, HTMLVideoElement: W.HtmlElement, HTMLDirectoryElement: W.HtmlElement, HTMLFontElement: W.HtmlElement, HTMLFrameElement: W.HtmlElement, HTMLFrameSetElement: W.HtmlElement, HTMLMarqueeElement: W.HtmlElement, HTMLElement: W.HtmlElement, HTMLAnchorElement: W.AnchorElement, HTMLAreaElement: W.AreaElement, DOMException: W.DomException, Element: W.Element, AbortPaymentEvent: W.Event, AnimationEvent: W.Event, AnimationPlaybackEvent: W.Event, ApplicationCacheErrorEvent: W.Event, BackgroundFetchClickEvent: W.Event, BackgroundFetchEvent: W.Event, BackgroundFetchFailEvent: W.Event, BackgroundFetchedEvent: W.Event, BeforeInstallPromptEvent: W.Event, BeforeUnloadEvent: W.Event, BlobEvent: W.Event, CanMakePaymentEvent: W.Event, ClipboardEvent: W.Event, CloseEvent: W.Event, CustomEvent: W.Event, DeviceMotionEvent: W.Event, DeviceOrientationEvent: W.Event, ErrorEvent: W.Event, ExtendableEvent: W.Event, ExtendableMessageEvent: W.Event, FetchEvent: W.Event, FontFaceSetLoadEvent: W.Event, ForeignFetchEvent: W.Event, GamepadEvent: W.Event, HashChangeEvent: W.Event, InstallEvent: W.Event, MediaEncryptedEvent: W.Event, MediaKeyMessageEvent: W.Event, MediaQueryListEvent: W.Event, MediaStreamEvent: W.Event, MediaStreamTrackEvent: W.Event, MIDIConnectionEvent: W.Event, MIDIMessageEvent: W.Event, MutationEvent: W.Event, NotificationEvent: W.Event, PageTransitionEvent: W.Event, PaymentRequestEvent: W.Event, PaymentRequestUpdateEvent: W.Event, PopStateEvent: W.Event, PresentationConnectionAvailableEvent: W.Event, PresentationConnectionCloseEvent: W.Event, PromiseRejectionEvent: W.Event, PushEvent: W.Event, RTCDataChannelEvent: W.Event, RTCDTMFToneChangeEvent: W.Event, RTCPeerConnectionIceEvent: W.Event, RTCTrackEvent: W.Event, SecurityPolicyViolationEvent: W.Event, SensorErrorEvent: W.Event, SpeechRecognitionError: W.Event, SpeechRecognitionEvent: W.Event, SpeechSynthesisEvent: W.Event, StorageEvent: W.Event, SyncEvent: W.Event, TrackEvent: W.Event, TransitionEvent: W.Event, WebKitTransitionEvent: W.Event, VRDeviceEvent: W.Event, VRDisplayEvent: W.Event, VRSessionEvent: W.Event, MojoInterfaceRequestEvent: W.Event, USBConnectionEvent: W.Event, IDBVersionChangeEvent: W.Event, AudioProcessingEvent: W.Event, OfflineAudioCompletionEvent: W.Event, WebGLContextEvent: W.Event, Event: W.Event, InputEvent: W.Event, EventSource: W.EventSource, MessagePort: W.EventTarget, EventTarget: W.EventTarget, HTMLFormElement: W.FormElement, XMLHttpRequest: W.HttpRequest, XMLHttpRequestEventTarget: W.HttpRequestEventTarget, MessageEvent: W.MessageEvent, MouseEvent: W.MouseEvent, DragEvent: W.MouseEvent, PointerEvent: W.MouseEvent, WheelEvent: W.MouseEvent, Document: W.Node, HTMLDocument: W.Node, Node: W.Node, ProgressEvent: W.ProgressEvent, ResourceProgressEvent: W.ProgressEvent, HTMLSelectElement: W.SelectElement, CompositionEvent: W.UIEvent, FocusEvent: W.UIEvent, KeyboardEvent: W.UIEvent, TextEvent: W.UIEvent, TouchEvent: W.UIEvent, UIEvent: W.UIEvent, SVGAElement: P.SvgElement, SVGAnimateElement: P.SvgElement, SVGAnimateMotionElement: P.SvgElement, SVGAnimateTransformElement: P.SvgElement, SVGAnimationElement: P.SvgElement, SVGCircleElement: P.SvgElement, SVGClipPathElement: P.SvgElement, SVGDefsElement: P.SvgElement, SVGDescElement: P.SvgElement, SVGDiscardElement: P.SvgElement, SVGEllipseElement: P.SvgElement, SVGFEBlendElement: P.SvgElement, SVGFEColorMatrixElement: P.SvgElement, SVGFEComponentTransferElement: P.SvgElement, SVGFECompositeElement: P.SvgElement, SVGFEConvolveMatrixElement: P.SvgElement, SVGFEDiffuseLightingElement: P.SvgElement, SVGFEDisplacementMapElement: P.SvgElement, SVGFEDistantLightElement: P.SvgElement, SVGFEFloodElement: P.SvgElement, SVGFEFuncAElement: P.SvgElement, SVGFEFuncBElement: P.SvgElement, SVGFEFuncGElement: P.SvgElement, SVGFEFuncRElement: P.SvgElement, SVGFEGaussianBlurElement: P.SvgElement, SVGFEImageElement: P.SvgElement, SVGFEMergeElement: P.SvgElement, SVGFEMergeNodeElement: P.SvgElement, SVGFEMorphologyElement: P.SvgElement, SVGFEOffsetElement: P.SvgElement, SVGFEPointLightElement: P.SvgElement, SVGFESpecularLightingElement: P.SvgElement, SVGFESpotLightElement: P.SvgElement, SVGFETileElement: P.SvgElement, SVGFETurbulenceElement: P.SvgElement, SVGFilterElement: P.SvgElement, SVGForeignObjectElement: P.SvgElement, SVGGElement: P.SvgElement, SVGGeometryElement: P.SvgElement, SVGGraphicsElement: P.SvgElement, SVGImageElement: P.SvgElement, SVGLineElement: P.SvgElement, SVGLinearGradientElement: P.SvgElement, SVGMarkerElement: P.SvgElement, SVGMaskElement: P.SvgElement, SVGMetadataElement: P.SvgElement, SVGPathElement: P.SvgElement, SVGPatternElement: P.SvgElement, SVGPolygonElement: P.SvgElement, SVGPolylineElement: P.SvgElement, SVGRadialGradientElement: P.SvgElement, SVGRectElement: P.SvgElement, SVGScriptElement: P.SvgElement, SVGSetElement: P.SvgElement, SVGStopElement: P.SvgElement, SVGStyleElement: P.SvgElement, SVGElement: P.SvgElement, SVGSVGElement: P.SvgElement, SVGSwitchElement: P.SvgElement, SVGSymbolElement: P.SvgElement, SVGTSpanElement: P.SvgElement, SVGTextContentElement: P.SvgElement, SVGTextElement: P.SvgElement, SVGTextPathElement: P.SvgElement, SVGTextPositioningElement: P.SvgElement, SVGTitleElement: P.SvgElement, SVGUseElement: P.SvgElement, SVGViewElement: P.SvgElement, SVGGradientElement: P.SvgElement, SVGComponentTransferFunctionElement: P.SvgElement, SVGFEDropShadowElement: P.SvgElement, SVGMPathElement: P.SvgElement});
-    hunkHelpers.setOrUpdateLeafTags({ArrayBuffer: true, Blob: true, DOMError: true, File: true, MediaError: true, NavigatorUserMediaError: true, OverconstrainedError: true, PositionError: true, SQLError: true, DataView: true, ArrayBufferView: false, Float32Array: true, Float64Array: true, Int16Array: true, Int32Array: true, Int8Array: true, Uint16Array: true, Uint32Array: true, Uint8ClampedArray: true, CanvasPixelArray: true, Uint8Array: false, HTMLAudioElement: true, HTMLBRElement: true, HTMLBaseElement: true, HTMLBodyElement: true, HTMLButtonElement: true, HTMLCanvasElement: true, HTMLContentElement: true, HTMLDListElement: true, HTMLDataElement: true, HTMLDataListElement: true, HTMLDetailsElement: true, HTMLDialogElement: true, HTMLDivElement: true, HTMLEmbedElement: true, HTMLFieldSetElement: true, HTMLHRElement: true, HTMLHeadElement: true, HTMLHeadingElement: true, HTMLHtmlElement: true, HTMLIFrameElement: true, HTMLImageElement: true, HTMLInputElement: true, HTMLLIElement: true, HTMLLabelElement: true, HTMLLegendElement: true, HTMLLinkElement: true, HTMLMapElement: true, HTMLMediaElement: true, HTMLMenuElement: true, HTMLMetaElement: true, HTMLMeterElement: true, HTMLModElement: true, HTMLOListElement: true, HTMLObjectElement: true, HTMLOptGroupElement: true, HTMLOptionElement: true, HTMLOutputElement: true, HTMLParagraphElement: true, HTMLParamElement: true, HTMLPictureElement: true, HTMLPreElement: true, HTMLProgressElement: true, HTMLQuoteElement: true, HTMLScriptElement: true, HTMLShadowElement: true, HTMLSlotElement: true, HTMLSourceElement: true, HTMLSpanElement: true, HTMLStyleElement: true, HTMLTableCaptionElement: true, HTMLTableCellElement: true, HTMLTableDataCellElement: true, HTMLTableHeaderCellElement: true, HTMLTableColElement: true, HTMLTableElement: true, HTMLTableRowElement: true, HTMLTableSectionElement: true, HTMLTemplateElement: true, HTMLTextAreaElement: true, HTMLTimeElement: true, HTMLTitleElement: true, HTMLTrackElement: true, HTMLUListElement: true, HTMLUnknownElement: true, HTMLVideoElement: true, HTMLDirectoryElement: true, HTMLFontElement: true, HTMLFrameElement: true, HTMLFrameSetElement: true, HTMLMarqueeElement: true, HTMLElement: false, HTMLAnchorElement: true, HTMLAreaElement: true, DOMException: true, Element: false, AbortPaymentEvent: true, AnimationEvent: true, AnimationPlaybackEvent: true, ApplicationCacheErrorEvent: true, BackgroundFetchClickEvent: true, BackgroundFetchEvent: true, BackgroundFetchFailEvent: true, BackgroundFetchedEvent: true, BeforeInstallPromptEvent: true, BeforeUnloadEvent: true, BlobEvent: true, CanMakePaymentEvent: true, ClipboardEvent: true, CloseEvent: true, CustomEvent: true, DeviceMotionEvent: true, DeviceOrientationEvent: true, ErrorEvent: true, ExtendableEvent: true, ExtendableMessageEvent: true, FetchEvent: true, FontFaceSetLoadEvent: true, ForeignFetchEvent: true, GamepadEvent: true, HashChangeEvent: true, InstallEvent: true, MediaEncryptedEvent: true, MediaKeyMessageEvent: true, MediaQueryListEvent: true, MediaStreamEvent: true, MediaStreamTrackEvent: true, MIDIConnectionEvent: true, MIDIMessageEvent: true, MutationEvent: true, NotificationEvent: true, PageTransitionEvent: true, PaymentRequestEvent: true, PaymentRequestUpdateEvent: true, PopStateEvent: true, PresentationConnectionAvailableEvent: true, PresentationConnectionCloseEvent: true, PromiseRejectionEvent: true, PushEvent: true, RTCDataChannelEvent: true, RTCDTMFToneChangeEvent: true, RTCPeerConnectionIceEvent: true, RTCTrackEvent: true, SecurityPolicyViolationEvent: true, SensorErrorEvent: true, SpeechRecognitionError: true, SpeechRecognitionEvent: true, SpeechSynthesisEvent: true, StorageEvent: true, SyncEvent: true, TrackEvent: true, TransitionEvent: true, WebKitTransitionEvent: true, VRDeviceEvent: true, VRDisplayEvent: true, VRSessionEvent: true, MojoInterfaceRequestEvent: true, USBConnectionEvent: true, IDBVersionChangeEvent: true, AudioProcessingEvent: true, OfflineAudioCompletionEvent: true, WebGLContextEvent: true, Event: false, InputEvent: false, EventSource: true, MessagePort: true, EventTarget: false, HTMLFormElement: true, XMLHttpRequest: true, XMLHttpRequestEventTarget: false, MessageEvent: true, MouseEvent: true, DragEvent: true, PointerEvent: true, WheelEvent: true, Document: true, HTMLDocument: true, Node: false, ProgressEvent: true, ResourceProgressEvent: true, HTMLSelectElement: true, CompositionEvent: true, FocusEvent: true, KeyboardEvent: true, TextEvent: true, TouchEvent: true, UIEvent: false, SVGAElement: true, SVGAnimateElement: true, SVGAnimateMotionElement: true, SVGAnimateTransformElement: true, SVGAnimationElement: true, SVGCircleElement: true, SVGClipPathElement: true, SVGDefsElement: true, SVGDescElement: true, SVGDiscardElement: true, SVGEllipseElement: true, SVGFEBlendElement: true, SVGFEColorMatrixElement: true, SVGFEComponentTransferElement: true, SVGFECompositeElement: true, SVGFEConvolveMatrixElement: true, SVGFEDiffuseLightingElement: true, SVGFEDisplacementMapElement: true, SVGFEDistantLightElement: true, SVGFEFloodElement: true, SVGFEFuncAElement: true, SVGFEFuncBElement: true, SVGFEFuncGElement: true, SVGFEFuncRElement: true, SVGFEGaussianBlurElement: true, SVGFEImageElement: true, SVGFEMergeElement: true, SVGFEMergeNodeElement: true, SVGFEMorphologyElement: true, SVGFEOffsetElement: true, SVGFEPointLightElement: true, SVGFESpecularLightingElement: true, SVGFESpotLightElement: true, SVGFETileElement: true, SVGFETurbulenceElement: true, SVGFilterElement: true, SVGForeignObjectElement: true, SVGGElement: true, SVGGeometryElement: true, SVGGraphicsElement: true, SVGImageElement: true, SVGLineElement: true, SVGLinearGradientElement: true, SVGMarkerElement: true, SVGMaskElement: true, SVGMetadataElement: true, SVGPathElement: true, SVGPatternElement: true, SVGPolygonElement: true, SVGPolylineElement: true, SVGRadialGradientElement: true, SVGRectElement: true, SVGScriptElement: true, SVGSetElement: true, SVGStopElement: true, SVGStyleElement: true, SVGElement: true, SVGSVGElement: true, SVGSwitchElement: true, SVGSymbolElement: true, SVGTSpanElement: true, SVGTextContentElement: true, SVGTextElement: true, SVGTextPathElement: true, SVGTextPositioningElement: true, SVGTitleElement: true, SVGUseElement: true, SVGViewElement: true, SVGGradientElement: true, SVGComponentTransferFunctionElement: true, SVGFEDropShadowElement: true, SVGMPathElement: true});
+    hunkHelpers.setOrUpdateInterceptorsByTag({ArrayBuffer: J.Interceptor, Blob: J.Interceptor, DOMError: J.Interceptor, File: J.Interceptor, MediaError: J.Interceptor, NavigatorUserMediaError: J.Interceptor, OverconstrainedError: J.Interceptor, PositionError: J.Interceptor, SQLError: J.Interceptor, DataView: H.NativeTypedData, ArrayBufferView: H.NativeTypedData, Float32Array: H.NativeTypedArrayOfDouble, Float64Array: H.NativeTypedArrayOfDouble, Int16Array: H.NativeInt16List, Int32Array: H.NativeInt32List, Int8Array: H.NativeInt8List, Uint16Array: H.NativeUint16List, Uint32Array: H.NativeUint32List, Uint8ClampedArray: H.NativeUint8ClampedList, CanvasPixelArray: H.NativeUint8ClampedList, Uint8Array: H.NativeUint8List, HTMLAudioElement: W.HtmlElement, HTMLBRElement: W.HtmlElement, HTMLBaseElement: W.HtmlElement, HTMLBodyElement: W.HtmlElement, HTMLButtonElement: W.HtmlElement, HTMLCanvasElement: W.HtmlElement, HTMLContentElement: W.HtmlElement, HTMLDListElement: W.HtmlElement, HTMLDataElement: W.HtmlElement, HTMLDataListElement: W.HtmlElement, HTMLDetailsElement: W.HtmlElement, HTMLDialogElement: W.HtmlElement, HTMLDivElement: W.HtmlElement, HTMLEmbedElement: W.HtmlElement, HTMLFieldSetElement: W.HtmlElement, HTMLHRElement: W.HtmlElement, HTMLHeadElement: W.HtmlElement, HTMLHeadingElement: W.HtmlElement, HTMLHtmlElement: W.HtmlElement, HTMLIFrameElement: W.HtmlElement, HTMLImageElement: W.HtmlElement, HTMLInputElement: W.HtmlElement, HTMLLIElement: W.HtmlElement, HTMLLabelElement: W.HtmlElement, HTMLLegendElement: W.HtmlElement, HTMLLinkElement: W.HtmlElement, HTMLMapElement: W.HtmlElement, HTMLMediaElement: W.HtmlElement, HTMLMenuElement: W.HtmlElement, HTMLMetaElement: W.HtmlElement, HTMLMeterElement: W.HtmlElement, HTMLModElement: W.HtmlElement, HTMLOListElement: W.HtmlElement, HTMLObjectElement: W.HtmlElement, HTMLOptGroupElement: W.HtmlElement, HTMLOptionElement: W.HtmlElement, HTMLOutputElement: W.HtmlElement, HTMLParagraphElement: W.HtmlElement, HTMLParamElement: W.HtmlElement, HTMLPictureElement: W.HtmlElement, HTMLPreElement: W.HtmlElement, HTMLProgressElement: W.HtmlElement, HTMLQuoteElement: W.HtmlElement, HTMLScriptElement: W.HtmlElement, HTMLShadowElement: W.HtmlElement, HTMLSlotElement: W.HtmlElement, HTMLSourceElement: W.HtmlElement, HTMLSpanElement: W.HtmlElement, HTMLStyleElement: W.HtmlElement, HTMLTableCaptionElement: W.HtmlElement, HTMLTableCellElement: W.HtmlElement, HTMLTableDataCellElement: W.HtmlElement, HTMLTableHeaderCellElement: W.HtmlElement, HTMLTableColElement: W.HtmlElement, HTMLTableElement: W.HtmlElement, HTMLTableRowElement: W.HtmlElement, HTMLTableSectionElement: W.HtmlElement, HTMLTemplateElement: W.HtmlElement, HTMLTextAreaElement: W.HtmlElement, HTMLTimeElement: W.HtmlElement, HTMLTitleElement: W.HtmlElement, HTMLTrackElement: W.HtmlElement, HTMLUListElement: W.HtmlElement, HTMLUnknownElement: W.HtmlElement, HTMLVideoElement: W.HtmlElement, HTMLDirectoryElement: W.HtmlElement, HTMLFontElement: W.HtmlElement, HTMLFrameElement: W.HtmlElement, HTMLFrameSetElement: W.HtmlElement, HTMLMarqueeElement: W.HtmlElement, HTMLElement: W.HtmlElement, HTMLAnchorElement: W.AnchorElement, HTMLAreaElement: W.AreaElement, DOMException: W.DomException, Element: W.Element, AbortPaymentEvent: W.Event, AnimationEvent: W.Event, AnimationPlaybackEvent: W.Event, ApplicationCacheErrorEvent: W.Event, BackgroundFetchClickEvent: W.Event, BackgroundFetchEvent: W.Event, BackgroundFetchFailEvent: W.Event, BackgroundFetchedEvent: W.Event, BeforeInstallPromptEvent: W.Event, BeforeUnloadEvent: W.Event, BlobEvent: W.Event, CanMakePaymentEvent: W.Event, ClipboardEvent: W.Event, CloseEvent: W.Event, CustomEvent: W.Event, DeviceMotionEvent: W.Event, DeviceOrientationEvent: W.Event, ErrorEvent: W.Event, ExtendableEvent: W.Event, ExtendableMessageEvent: W.Event, FetchEvent: W.Event, FontFaceSetLoadEvent: W.Event, ForeignFetchEvent: W.Event, GamepadEvent: W.Event, HashChangeEvent: W.Event, InstallEvent: W.Event, MediaEncryptedEvent: W.Event, MediaKeyMessageEvent: W.Event, MediaQueryListEvent: W.Event, MediaStreamEvent: W.Event, MediaStreamTrackEvent: W.Event, MIDIConnectionEvent: W.Event, MIDIMessageEvent: W.Event, MutationEvent: W.Event, NotificationEvent: W.Event, PageTransitionEvent: W.Event, PaymentRequestEvent: W.Event, PaymentRequestUpdateEvent: W.Event, PopStateEvent: W.Event, PresentationConnectionAvailableEvent: W.Event, PresentationConnectionCloseEvent: W.Event, PromiseRejectionEvent: W.Event, PushEvent: W.Event, RTCDataChannelEvent: W.Event, RTCDTMFToneChangeEvent: W.Event, RTCPeerConnectionIceEvent: W.Event, RTCTrackEvent: W.Event, SecurityPolicyViolationEvent: W.Event, SensorErrorEvent: W.Event, SpeechRecognitionError: W.Event, SpeechRecognitionEvent: W.Event, SpeechSynthesisEvent: W.Event, StorageEvent: W.Event, SyncEvent: W.Event, TrackEvent: W.Event, TransitionEvent: W.Event, WebKitTransitionEvent: W.Event, VRDeviceEvent: W.Event, VRDisplayEvent: W.Event, VRSessionEvent: W.Event, MojoInterfaceRequestEvent: W.Event, USBConnectionEvent: W.Event, IDBVersionChangeEvent: W.Event, AudioProcessingEvent: W.Event, OfflineAudioCompletionEvent: W.Event, WebGLContextEvent: W.Event, Event: W.Event, InputEvent: W.Event, SubmitEvent: W.Event, EventSource: W.EventSource, MessagePort: W.EventTarget, EventTarget: W.EventTarget, HTMLFormElement: W.FormElement, XMLHttpRequest: W.HttpRequest, XMLHttpRequestEventTarget: W.HttpRequestEventTarget, MessageEvent: W.MessageEvent, MouseEvent: W.MouseEvent, DragEvent: W.MouseEvent, PointerEvent: W.MouseEvent, WheelEvent: W.MouseEvent, Document: W.Node, HTMLDocument: W.Node, Node: W.Node, ProgressEvent: W.ProgressEvent, ResourceProgressEvent: W.ProgressEvent, HTMLSelectElement: W.SelectElement, CompositionEvent: W.UIEvent, FocusEvent: W.UIEvent, KeyboardEvent: W.UIEvent, TextEvent: W.UIEvent, TouchEvent: W.UIEvent, UIEvent: W.UIEvent, SVGAElement: P.SvgElement, SVGAnimateElement: P.SvgElement, SVGAnimateMotionElement: P.SvgElement, SVGAnimateTransformElement: P.SvgElement, SVGAnimationElement: P.SvgElement, SVGCircleElement: P.SvgElement, SVGClipPathElement: P.SvgElement, SVGDefsElement: P.SvgElement, SVGDescElement: P.SvgElement, SVGDiscardElement: P.SvgElement, SVGEllipseElement: P.SvgElement, SVGFEBlendElement: P.SvgElement, SVGFEColorMatrixElement: P.SvgElement, SVGFEComponentTransferElement: P.SvgElement, SVGFECompositeElement: P.SvgElement, SVGFEConvolveMatrixElement: P.SvgElement, SVGFEDiffuseLightingElement: P.SvgElement, SVGFEDisplacementMapElement: P.SvgElement, SVGFEDistantLightElement: P.SvgElement, SVGFEFloodElement: P.SvgElement, SVGFEFuncAElement: P.SvgElement, SVGFEFuncBElement: P.SvgElement, SVGFEFuncGElement: P.SvgElement, SVGFEFuncRElement: P.SvgElement, SVGFEGaussianBlurElement: P.SvgElement, SVGFEImageElement: P.SvgElement, SVGFEMergeElement: P.SvgElement, SVGFEMergeNodeElement: P.SvgElement, SVGFEMorphologyElement: P.SvgElement, SVGFEOffsetElement: P.SvgElement, SVGFEPointLightElement: P.SvgElement, SVGFESpecularLightingElement: P.SvgElement, SVGFESpotLightElement: P.SvgElement, SVGFETileElement: P.SvgElement, SVGFETurbulenceElement: P.SvgElement, SVGFilterElement: P.SvgElement, SVGForeignObjectElement: P.SvgElement, SVGGElement: P.SvgElement, SVGGeometryElement: P.SvgElement, SVGGraphicsElement: P.SvgElement, SVGImageElement: P.SvgElement, SVGLineElement: P.SvgElement, SVGLinearGradientElement: P.SvgElement, SVGMarkerElement: P.SvgElement, SVGMaskElement: P.SvgElement, SVGMetadataElement: P.SvgElement, SVGPathElement: P.SvgElement, SVGPatternElement: P.SvgElement, SVGPolygonElement: P.SvgElement, SVGPolylineElement: P.SvgElement, SVGRadialGradientElement: P.SvgElement, SVGRectElement: P.SvgElement, SVGScriptElement: P.SvgElement, SVGSetElement: P.SvgElement, SVGStopElement: P.SvgElement, SVGStyleElement: P.SvgElement, SVGElement: P.SvgElement, SVGSVGElement: P.SvgElement, SVGSwitchElement: P.SvgElement, SVGSymbolElement: P.SvgElement, SVGTSpanElement: P.SvgElement, SVGTextContentElement: P.SvgElement, SVGTextElement: P.SvgElement, SVGTextPathElement: P.SvgElement, SVGTextPositioningElement: P.SvgElement, SVGTitleElement: P.SvgElement, SVGUseElement: P.SvgElement, SVGViewElement: P.SvgElement, SVGGradientElement: P.SvgElement, SVGComponentTransferFunctionElement: P.SvgElement, SVGFEDropShadowElement: P.SvgElement, SVGMPathElement: P.SvgElement});
+    hunkHelpers.setOrUpdateLeafTags({ArrayBuffer: true, Blob: true, DOMError: true, File: true, MediaError: true, NavigatorUserMediaError: true, OverconstrainedError: true, PositionError: true, SQLError: true, DataView: true, ArrayBufferView: false, Float32Array: true, Float64Array: true, Int16Array: true, Int32Array: true, Int8Array: true, Uint16Array: true, Uint32Array: true, Uint8ClampedArray: true, CanvasPixelArray: true, Uint8Array: false, HTMLAudioElement: true, HTMLBRElement: true, HTMLBaseElement: true, HTMLBodyElement: true, HTMLButtonElement: true, HTMLCanvasElement: true, HTMLContentElement: true, HTMLDListElement: true, HTMLDataElement: true, HTMLDataListElement: true, HTMLDetailsElement: true, HTMLDialogElement: true, HTMLDivElement: true, HTMLEmbedElement: true, HTMLFieldSetElement: true, HTMLHRElement: true, HTMLHeadElement: true, HTMLHeadingElement: true, HTMLHtmlElement: true, HTMLIFrameElement: true, HTMLImageElement: true, HTMLInputElement: true, HTMLLIElement: true, HTMLLabelElement: true, HTMLLegendElement: true, HTMLLinkElement: true, HTMLMapElement: true, HTMLMediaElement: true, HTMLMenuElement: true, HTMLMetaElement: true, HTMLMeterElement: true, HTMLModElement: true, HTMLOListElement: true, HTMLObjectElement: true, HTMLOptGroupElement: true, HTMLOptionElement: true, HTMLOutputElement: true, HTMLParagraphElement: true, HTMLParamElement: true, HTMLPictureElement: true, HTMLPreElement: true, HTMLProgressElement: true, HTMLQuoteElement: true, HTMLScriptElement: true, HTMLShadowElement: true, HTMLSlotElement: true, HTMLSourceElement: true, HTMLSpanElement: true, HTMLStyleElement: true, HTMLTableCaptionElement: true, HTMLTableCellElement: true, HTMLTableDataCellElement: true, HTMLTableHeaderCellElement: true, HTMLTableColElement: true, HTMLTableElement: true, HTMLTableRowElement: true, HTMLTableSectionElement: true, HTMLTemplateElement: true, HTMLTextAreaElement: true, HTMLTimeElement: true, HTMLTitleElement: true, HTMLTrackElement: true, HTMLUListElement: true, HTMLUnknownElement: true, HTMLVideoElement: true, HTMLDirectoryElement: true, HTMLFontElement: true, HTMLFrameElement: true, HTMLFrameSetElement: true, HTMLMarqueeElement: true, HTMLElement: false, HTMLAnchorElement: true, HTMLAreaElement: true, DOMException: true, Element: false, AbortPaymentEvent: true, AnimationEvent: true, AnimationPlaybackEvent: true, ApplicationCacheErrorEvent: true, BackgroundFetchClickEvent: true, BackgroundFetchEvent: true, BackgroundFetchFailEvent: true, BackgroundFetchedEvent: true, BeforeInstallPromptEvent: true, BeforeUnloadEvent: true, BlobEvent: true, CanMakePaymentEvent: true, ClipboardEvent: true, CloseEvent: true, CustomEvent: true, DeviceMotionEvent: true, DeviceOrientationEvent: true, ErrorEvent: true, ExtendableEvent: true, ExtendableMessageEvent: true, FetchEvent: true, FontFaceSetLoadEvent: true, ForeignFetchEvent: true, GamepadEvent: true, HashChangeEvent: true, InstallEvent: true, MediaEncryptedEvent: true, MediaKeyMessageEvent: true, MediaQueryListEvent: true, MediaStreamEvent: true, MediaStreamTrackEvent: true, MIDIConnectionEvent: true, MIDIMessageEvent: true, MutationEvent: true, NotificationEvent: true, PageTransitionEvent: true, PaymentRequestEvent: true, PaymentRequestUpdateEvent: true, PopStateEvent: true, PresentationConnectionAvailableEvent: true, PresentationConnectionCloseEvent: true, PromiseRejectionEvent: true, PushEvent: true, RTCDataChannelEvent: true, RTCDTMFToneChangeEvent: true, RTCPeerConnectionIceEvent: true, RTCTrackEvent: true, SecurityPolicyViolationEvent: true, SensorErrorEvent: true, SpeechRecognitionError: true, SpeechRecognitionEvent: true, SpeechSynthesisEvent: true, StorageEvent: true, SyncEvent: true, TrackEvent: true, TransitionEvent: true, WebKitTransitionEvent: true, VRDeviceEvent: true, VRDisplayEvent: true, VRSessionEvent: true, MojoInterfaceRequestEvent: true, USBConnectionEvent: true, IDBVersionChangeEvent: true, AudioProcessingEvent: true, OfflineAudioCompletionEvent: true, WebGLContextEvent: true, Event: false, InputEvent: false, SubmitEvent: false, EventSource: true, MessagePort: true, EventTarget: false, HTMLFormElement: true, XMLHttpRequest: true, XMLHttpRequestEventTarget: false, MessageEvent: true, MouseEvent: true, DragEvent: true, PointerEvent: true, WheelEvent: true, Document: true, HTMLDocument: true, Node: false, ProgressEvent: true, ResourceProgressEvent: true, HTMLSelectElement: true, CompositionEvent: true, FocusEvent: true, KeyboardEvent: true, TextEvent: true, TouchEvent: true, UIEvent: false, SVGAElement: true, SVGAnimateElement: true, SVGAnimateMotionElement: true, SVGAnimateTransformElement: true, SVGAnimationElement: true, SVGCircleElement: true, SVGClipPathElement: true, SVGDefsElement: true, SVGDescElement: true, SVGDiscardElement: true, SVGEllipseElement: true, SVGFEBlendElement: true, SVGFEColorMatrixElement: true, SVGFEComponentTransferElement: true, SVGFECompositeElement: true, SVGFEConvolveMatrixElement: true, SVGFEDiffuseLightingElement: true, SVGFEDisplacementMapElement: true, SVGFEDistantLightElement: true, SVGFEFloodElement: true, SVGFEFuncAElement: true, SVGFEFuncBElement: true, SVGFEFuncGElement: true, SVGFEFuncRElement: true, SVGFEGaussianBlurElement: true, SVGFEImageElement: true, SVGFEMergeElement: true, SVGFEMergeNodeElement: true, SVGFEMorphologyElement: true, SVGFEOffsetElement: true, SVGFEPointLightElement: true, SVGFESpecularLightingElement: true, SVGFESpotLightElement: true, SVGFETileElement: true, SVGFETurbulenceElement: true, SVGFilterElement: true, SVGForeignObjectElement: true, SVGGElement: true, SVGGeometryElement: true, SVGGraphicsElement: true, SVGImageElement: true, SVGLineElement: true, SVGLinearGradientElement: true, SVGMarkerElement: true, SVGMaskElement: true, SVGMetadataElement: true, SVGPathElement: true, SVGPatternElement: true, SVGPolygonElement: true, SVGPolylineElement: true, SVGRadialGradientElement: true, SVGRectElement: true, SVGScriptElement: true, SVGSetElement: true, SVGStopElement: true, SVGStyleElement: true, SVGElement: true, SVGSVGElement: true, SVGSwitchElement: true, SVGSymbolElement: true, SVGTSpanElement: true, SVGTextContentElement: true, SVGTextElement: true, SVGTextPathElement: true, SVGTextPositioningElement: true, SVGTitleElement: true, SVGUseElement: true, SVGViewElement: true, SVGGradientElement: true, SVGComponentTransferFunctionElement: true, SVGFEDropShadowElement: true, SVGMPathElement: true});
     H.NativeTypedArray.$nativeSuperclassTag = "ArrayBufferView";
     H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin.$nativeSuperclassTag = "ArrayBufferView";
     H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin.$nativeSuperclassTag = "ArrayBufferView";
