diff --git a/pkgs/sse/CHANGELOG.md b/pkgs/sse/CHANGELOG.md
index 3b8c49b..5837152 100644
--- a/pkgs/sse/CHANGELOG.md
+++ b/pkgs/sse/CHANGELOG.md
@@ -1,3 +1,5 @@
+## 3.6.1-dev
+
 ## 3.6.0
 
 - Improve performance by buffering out of order messages in the server instead
diff --git a/pkgs/sse/lib/client/sse_client.dart b/pkgs/sse/lib/client/sse_client.dart
index 1316191..11327fd 100644
--- a/pkgs/sse/lib/client/sse_client.dart
+++ b/pkgs/sse/lib/client/sse_client.dart
@@ -8,7 +8,8 @@
 
 import 'package:logging/logging.dart';
 import 'package:stream_channel/stream_channel.dart';
-import 'package:uuid/uuid.dart';
+
+import '../src/util/uuid.dart';
 
 /// A client for bi-directional sse communcation.
 ///
@@ -32,7 +33,7 @@
   /// [serverUrl] is the URL under which the server is listening for
   /// incoming bi-directional SSE connections.
   SseClient(String serverUrl) {
-    var clientId = Uuid().v1();
+    var clientId = generateUuidV4();
     _eventSource =
         EventSource('$serverUrl?sseClientId=$clientId', withCredentials: true);
     _serverUrl = '$serverUrl?sseClientId=$clientId';
diff --git a/pkgs/sse/lib/src/util/uuid.dart b/pkgs/sse/lib/src/util/uuid.dart
new file mode 100644
index 0000000..e33e7e8
--- /dev/null
+++ b/pkgs/sse/lib/src/util/uuid.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:math' show Random;
+
+/// Returns a unique ID in the format:
+///
+///     f47ac10b-58cc-4372-a567-0e02b2c3d479
+///
+/// The generated uuids are 128 bit numbers encoded in a specific string format.
+/// For more information, see
+/// [en.wikipedia.org/wiki/Universally_unique_identifier](http://en.wikipedia.org/wiki/Universally_unique_identifier).
+String generateUuidV4() {
+  final random = Random();
+
+  int _generateBits(int bitCount) => random.nextInt(1 << bitCount);
+
+  String _printDigits(int value, int count) =>
+      value.toRadixString(16).padLeft(count, '0');
+  String _bitsDigits(int bitCount, int digitCount) =>
+      _printDigits(_generateBits(bitCount), digitCount);
+
+  // Generate xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx / 8-4-4-4-12.
+  var special = 8 + random.nextInt(4);
+
+  return '${_bitsDigits(16, 4)}${_bitsDigits(16, 4)}-'
+      '${_bitsDigits(16, 4)}-'
+      '4${_bitsDigits(12, 3)}-'
+      '${_printDigits(special, 1)}${_bitsDigits(12, 3)}-'
+      '${_bitsDigits(16, 4)}${_bitsDigits(16, 4)}${_bitsDigits(16, 4)}';
+}
diff --git a/pkgs/sse/pubspec.yaml b/pkgs/sse/pubspec.yaml
index 4df0f80..29b8c00 100644
--- a/pkgs/sse/pubspec.yaml
+++ b/pkgs/sse/pubspec.yaml
@@ -1,5 +1,5 @@
 name: sse
-version: 3.6.0
+version: 3.6.1-dev
 homepage: https://github.com/dart-lang/sse
 description: >-
   Provides client and server functionality for setting up bi-directional
@@ -16,7 +16,6 @@
   pedantic: ^1.4.0
   stream_channel: '>=1.6.8 <3.0.0'
   shelf: ^0.7.4
-  uuid: ^2.0.0
 
 dev_dependencies:
   shelf_static: ^0.2.8
diff --git a/pkgs/sse/test/web/index.dart.js b/pkgs/sse/test/web/index.dart.js
index 7ad7d5a..1d2b6b6 100644
--- a/pkgs/sse/test/web/index.dart.js
+++ b/pkgs/sse/test/web/index.dart.js
@@ -1,4 +1,4 @@
-// Generated by dart2js (fast startup emitter, strong), the Dart to JavaScript compiler version: 2.11.0-190.0.dev.
+// Generated by dart2js (fast startup emitter, strong), the Dart to JavaScript compiler version: 2.12.0-33.0.dev.
 // The code supports the following hooks:
 // dartPrint(message):
 //    if this function is defined it is called instead of the Dart [print]
@@ -248,12 +248,21 @@
   var C = {},
   H = {JS_CONST: function JS_CONST() {
     },
+    checkNotNullable: function(value, $name, $T) {
+      if (value == null)
+        throw H.wrapException(new H.NotNullableError($name, $T._eval$1("NotNullableError<0>")));
+      return value;
+    },
     IterableElementError_noElement: function() {
       return new P.StateError("No element");
     },
-    LateInitializationErrorImpl: function LateInitializationErrorImpl(t0) {
+    LateError: function LateError(t0) {
       this._message = t0;
     },
+    NotNullableError: function NotNullableError(t0, t1) {
+      this.__internal$_name = t0;
+      this.$ti = t1;
+    },
     EfficientLengthIterable: function EfficientLengthIterable() {
     },
     ListIterable: function ListIterable() {
@@ -268,9 +277,6 @@
     },
     FixedLengthListMixin: function FixedLengthListMixin() {
     },
-    Symbol: function Symbol(t0) {
-      this.__internal$_name = t0;
-    },
     unminifyOrTag: function(rawClassName) {
       var preserved = H.unmangleGlobalNameIfPreservedAnyways(rawClassName);
       if (preserved != null)
@@ -352,24 +358,13 @@
       var t1 = $name !== "Object" && $name !== "";
       return t1;
     },
-    Primitives_stringFromNativeUint8List: function(charCodes, start, end) {
-      var i, result, i0, chunkEnd;
-      if (end <= 500 && start === 0 && end === charCodes.length)
-        return String.fromCharCode.apply(null, charCodes);
-      for (i = start, result = ""; i < end; i = i0) {
-        i0 = i + 500;
-        chunkEnd = i0 < end ? i0 : end;
-        result += String.fromCharCode.apply(null, charCodes.subarray(i, chunkEnd));
-      }
-      return result;
-    },
     Primitives_stringFromCharCode: function(charCode) {
       var bits;
       if (charCode <= 65535)
         return String.fromCharCode(charCode);
       if (charCode <= 1114111) {
         bits = charCode - 65536;
-        return String.fromCharCode((55296 | C.JSInt_methods._shrOtherPositive$1(bits, 10)) >>> 0, 56320 | bits & 1023);
+        return String.fromCharCode((C.JSInt_methods._shrOtherPositive$1(bits, 10) | 55296) >>> 0, bits & 1023 | 56320);
       }
       throw H.wrapException(P.RangeError$range(charCode, 0, 1114111, null, null));
     },
@@ -399,113 +394,6 @@
     Primitives_getMilliseconds: function(receiver) {
       return receiver.isUtc ? H.Primitives_lazyAsJsDate(receiver).getUTCMilliseconds() + 0 : H.Primitives_lazyAsJsDate(receiver).getMilliseconds() + 0;
     },
-    Primitives_functionNoSuchMethod: function($function, positionalArguments, namedArguments) {
-      var $arguments, namedArgumentList, t1 = {};
-      t1.argumentCount = 0;
-      $arguments = [];
-      namedArgumentList = [];
-      t1.argumentCount = positionalArguments.length;
-      C.JSArray_methods.addAll$1($arguments, positionalArguments);
-      t1.names = "";
-      if (namedArguments != null && namedArguments.__js_helper$_length !== 0)
-        namedArguments.forEach$1(0, new H.Primitives_functionNoSuchMethod_closure(t1, namedArgumentList, $arguments));
-      "" + t1.argumentCount;
-      return J.noSuchMethod$1$($function, new H.JSInvocationMirror(C.Symbol_call, 0, $arguments, namedArgumentList, 0));
-    },
-    Primitives_applyFunction: function($function, positionalArguments, namedArguments) {
-      var t1, $arguments, argumentCount, jsStub;
-      if (positionalArguments instanceof Array)
-        t1 = namedArguments == null || namedArguments.__js_helper$_length === 0;
-      else
-        t1 = false;
-      if (t1) {
-        $arguments = positionalArguments;
-        argumentCount = $arguments.length;
-        if (argumentCount === 0) {
-          if (!!$function.call$0)
-            return $function.call$0();
-        } else if (argumentCount === 1) {
-          if (!!$function.call$1)
-            return $function.call$1($arguments[0]);
-        } else if (argumentCount === 2) {
-          if (!!$function.call$2)
-            return $function.call$2($arguments[0], $arguments[1]);
-        } else if (argumentCount === 3) {
-          if (!!$function.call$3)
-            return $function.call$3($arguments[0], $arguments[1], $arguments[2]);
-        } else if (argumentCount === 4) {
-          if (!!$function.call$4)
-            return $function.call$4($arguments[0], $arguments[1], $arguments[2], $arguments[3]);
-        } else if (argumentCount === 5)
-          if (!!$function.call$5)
-            return $function.call$5($arguments[0], $arguments[1], $arguments[2], $arguments[3], $arguments[4]);
-        jsStub = $function["call" + "$" + argumentCount];
-        if (jsStub != null)
-          return jsStub.apply($function, $arguments);
-      }
-      return H.Primitives__genericApplyFunction2($function, positionalArguments, namedArguments);
-    },
-    Primitives__genericApplyFunction2: function($function, positionalArguments, namedArguments) {
-      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, type$.dynamic);
-      else
-        $arguments = [];
-      argumentCount = $arguments.length;
-      requiredParameterCount = $function.$requiredArgCount;
-      if (argumentCount < requiredParameterCount)
-        return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
-      defaultValuesClosure = $function.$defaultValues;
-      t1 = defaultValuesClosure == null;
-      defaultValues = !t1 ? defaultValuesClosure() : null;
-      interceptor = J.getInterceptor$($function);
-      jsFunction = interceptor["call*"];
-      if (typeof jsFunction == "string")
-        jsFunction = interceptor[jsFunction];
-      if (t1) {
-        if (namedArguments != null && namedArguments.__js_helper$_length !== 0)
-          return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
-        if (argumentCount === requiredParameterCount)
-          return jsFunction.apply($function, $arguments);
-        return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
-      }
-      if (defaultValues instanceof Array) {
-        if (namedArguments != null && namedArguments.__js_helper$_length !== 0)
-          return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
-        if (argumentCount > requiredParameterCount + defaultValues.length)
-          return H.Primitives_functionNoSuchMethod($function, $arguments, null);
-        C.JSArray_methods.addAll$1($arguments, defaultValues.slice(argumentCount - requiredParameterCount));
-        return jsFunction.apply($function, $arguments);
-      } else {
-        if (argumentCount > requiredParameterCount)
-          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) {
-            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) {
-            key = H._asStringS(keys[_i]);
-            if (namedArguments.containsKey$1(key)) {
-              ++used;
-              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);
-        }
-        return jsFunction.apply($function, $arguments);
-      }
-    },
     iae: function(argument) {
       throw H.wrapException(H.argumentErrorValue(argument));
     },
@@ -532,9 +420,6 @@
     argumentErrorValue: function(object) {
       return new P.ArgumentError(true, object, null, null);
     },
-    checkBool: function(value) {
-      return value;
-    },
     wrapException: function(ex) {
       var wrapper, t1;
       if (ex == null)
@@ -740,7 +625,7 @@
         case 4:
           return closure.call$4(arg1, arg2, arg3, arg4);
       }
-      throw H.wrapException(P.Exception_Exception("Unsupported number of arguments for wrapped closure"));
+      throw H.wrapException(new P._Exception("Unsupported number of arguments for wrapped closure"));
     },
     convertDartClosureToJS: function(closure, arity) {
       var $function;
@@ -1023,7 +908,7 @@
       return init.getIsolateTag($name);
     },
     throwLateInitializationError: function($name) {
-      return H.throwExpression(new H.LateInitializationErrorImpl($name));
+      return H.throwExpression(new H.LateError($name));
     },
     defineProperty: function(obj, property, value) {
       Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
@@ -1171,32 +1056,6 @@
         return string.replace(/[[\]{}()*+?.\\^$|]/g, "\\$&");
       return string;
     },
-    ConstantMapView: function ConstantMapView(t0, t1) {
-      this._collection$_map = t0;
-      this.$ti = t1;
-    },
-    ConstantMap: function ConstantMap() {
-    },
-    ConstantStringMap: function ConstantStringMap(t0, t1, t2, t3) {
-      var _ = this;
-      _.__js_helper$_length = t0;
-      _._jsObject = t1;
-      _._keys = t2;
-      _.$ti = t3;
-    },
-    JSInvocationMirror: function JSInvocationMirror(t0, t1, t2, t3, t4) {
-      var _ = this;
-      _._memberName = t0;
-      _.__js_helper$_kind = t1;
-      _._arguments = t2;
-      _._namedArgumentNames = t3;
-      _._typeArgumentCount = t4;
-    },
-    Primitives_functionNoSuchMethod_closure: function Primitives_functionNoSuchMethod_closure(t0, t1, t2) {
-      this._box_0 = t0;
-      this.namedArgumentList = t1;
-      this.$arguments = t2;
-    },
     TypeErrorDecoder: function TypeErrorDecoder(t0, t1, t2, t3, t4, t5) {
       var _ = this;
       _._pattern = t0;
@@ -1248,8 +1107,6 @@
     _AssertionError: function _AssertionError(t0) {
       this.message = t0;
     },
-    _Required: function _Required() {
-    },
     JsLinkedHashMap: function JsLinkedHashMap(t0) {
       var _ = this;
       _.__js_helper$_length = 0;
@@ -1524,6 +1381,19 @@
       }
       return type;
     },
+    createRuntimeType: function(rti) {
+      var recipe, starErasedRecipe, starErasedRti,
+        type = rti._cachedRuntimeType;
+      if (type != null)
+        return type;
+      recipe = rti._canonicalRecipe;
+      starErasedRecipe = recipe.replace(/\*/g, "");
+      if (starErasedRecipe === recipe)
+        return rti._cachedRuntimeType = new H._Type(rti);
+      starErasedRti = H._Universe_eval(init.typeUniverse, starErasedRecipe, true);
+      type = starErasedRti._cachedRuntimeType;
+      return rti._cachedRuntimeType = type == null ? starErasedRti._cachedRuntimeType = new H._Type(starErasedRti) : type;
+    },
     _installSpecializedIsTest: function(object) {
       var unstarred, isFn, testRti = this,
         t1 = type$.Object;
@@ -2700,6 +2570,9 @@
     _FunctionParameters: function _FunctionParameters() {
       this._named = this._optionalPositional = this._requiredPositional = null;
     },
+    _Type: function _Type(t0) {
+      this._rti = t0;
+    },
     _Error: function _Error() {
     },
     _TypeError: function _TypeError(t0) {
@@ -2757,11 +2630,6 @@
       var t1 = $._JS_INTEROP_INTERCEPTOR_TAG;
       return t1 == null ? $._JS_INTEROP_INTERCEPTOR_TAG = init.getIsolateTag("_$dart_js") : t1;
     },
-    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;
@@ -2837,26 +2705,6 @@
         return receiver;
       return J.getNativeInterceptor(receiver);
     },
-    getInterceptor$bn: function(receiver) {
-      if (typeof receiver == "number")
-        return J.JSNumber.prototype;
-      if (receiver == null)
-        return receiver;
-      if (typeof receiver == "boolean")
-        return J.JSBool.prototype;
-      if (!(receiver instanceof P.Object))
-        return J.UnknownJavaScriptObject.prototype;
-      return receiver;
-    },
-    getInterceptor$n: function(receiver) {
-      if (typeof receiver == "number")
-        return J.JSNumber.prototype;
-      if (receiver == null)
-        return receiver;
-      if (!(receiver instanceof P.Object))
-        return J.UnknownJavaScriptObject.prototype;
-      return receiver;
-    },
     getInterceptor$s: function(receiver) {
       if (typeof receiver == "string")
         return J.JSString.prototype;
@@ -2895,16 +2743,6 @@
         return receiver + a0;
       return J.getInterceptor$ansx(receiver).$add(receiver, a0);
     },
-    $and$bn: function(receiver, a0) {
-      if (typeof receiver == "number" && typeof a0 == "number")
-        return (receiver & a0) >>> 0;
-      return J.getInterceptor$bn(receiver).$and(receiver, a0);
-    },
-    $div$n: function(receiver, a0) {
-      if (typeof receiver == "number" && typeof a0 == "number")
-        return receiver / a0;
-      return J.getInterceptor$n(receiver).$div(receiver, a0);
-    },
     $eq$: function(receiver, a0) {
       if (receiver == null)
         return a0 == null;
@@ -2912,40 +2750,12 @@
         return a0 != null && receiver === a0;
       return J.getInterceptor$(receiver).$eq(receiver, a0);
     },
-    $ge$n: function(receiver, a0) {
-      if (typeof receiver == "number" && typeof a0 == "number")
-        return receiver >= a0;
-      return J.getInterceptor$n(receiver).$ge(receiver, a0);
-    },
-    $index$asx: function(receiver, a0) {
-      if (typeof a0 === "number")
-        if (receiver.constructor == Array || typeof receiver == "string" || H.isJsIndexable(receiver, receiver[init.dispatchPropertyName]))
-          if (a0 >>> 0 === a0 && a0 < receiver.length)
-            return receiver[a0];
-      return J.getInterceptor$asx(receiver).$index(receiver, a0);
-    },
     $indexSet$ax: function(receiver, a0, a1) {
       return J.getInterceptor$ax(receiver).$indexSet(receiver, a0, a1);
     },
-    $or$bn: function(receiver, a0) {
-      if (typeof receiver == "number" && typeof a0 == "number")
-        return (receiver | a0) >>> 0;
-      return J.getInterceptor$bn(receiver).$or(receiver, a0);
-    },
-    $shl$n: function(receiver, a0) {
-      return J.getInterceptor$n(receiver).$shl(receiver, a0);
-    },
-    $sub$n: function(receiver, a0) {
-      if (typeof receiver == "number" && typeof a0 == "number")
-        return receiver - a0;
-      return J.getInterceptor$n(receiver).$sub(receiver, a0);
-    },
     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);
     },
@@ -3264,7 +3074,7 @@
       P._rootScheduleMicrotask(_null, _null, currentZone, type$.void_Function._as(currentZone.bindCallbackGuarded$1(callback)));
     },
     StreamIterator_StreamIterator: function(stream, $T) {
-      P.ArgumentError_checkNotNull(stream, "stream", $T._eval$1("Stream<0>"));
+      H.checkNotNullable(stream, "stream", type$.Object);
       return new P._StreamIterator($T._eval$1("_StreamIterator<0>"));
     },
     StreamController_StreamController: function($T) {
@@ -3295,9 +3105,8 @@
       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);
+      var t1 = H.checkNotNullable(error, "error", type$.Object);
+      return new P.AsyncError(t1, stackTrace == null ? P.AsyncError_defaultStackTrace(error) : stackTrace);
     },
     AsyncError_defaultStackTrace: function(error) {
       var stackTrace;
@@ -3751,14 +3560,6 @@
     },
     MapMixin: function MapMixin() {
     },
-    _UnmodifiableMapMixin: function _UnmodifiableMapMixin() {
-    },
-    MapView: function MapView() {
-    },
-    UnmodifiableMapView: function UnmodifiableMapView() {
-    },
-    _UnmodifiableMapView_MapView__UnmodifiableMapMixin: function _UnmodifiableMapView_MapView__UnmodifiableMapMixin() {
-    },
     _parseJson: function(source, reviver) {
       var parsed, e, exception, t1;
       if (typeof source != "string")
@@ -3768,7 +3569,7 @@
         parsed = JSON.parse(source);
       } catch (exception) {
         e = H.unwrapException(exception);
-        t1 = P.FormatException$(String(e), null, null);
+        t1 = P.FormatException$(String(e));
         throw H.wrapException(t1);
       }
       t1 = P._convertJsonToDartLazy(parsed);
@@ -3842,19 +3643,11 @@
       this._seen = t1;
       this._toEncodable = t2;
     },
-    _symbolMapToStringMap: function(map) {
-      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));
+      throw H.wrapException(P.FormatException$(source));
     },
     Error__objectToString: function(object) {
       if (object instanceof H.Closure)
@@ -3862,24 +3655,12 @@
       return "Instance of '" + H.S(H.Primitives_objectTypeName(object)) + "'";
     },
     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;
+      var result;
+      if ($length > 4294967295)
+        H.throwExpression(P.RangeError$range($length, 0, 4294967295, "length", null));
+      result = J.JSArray_markFixedList(H.setRuntimeTypeInfo(new Array($length), $E._eval$1("JSArray<0>")), $E);
       return result;
     },
-    List_List$from: function(elements, $E) {
-      var t1,
-        list = H.setRuntimeTypeInfo([], $E._eval$1("JSArray<0>"));
-      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
-        C.JSArray_methods.add$1(list, $E._as(t1.get$current()));
-      return list;
-    },
-    String_String$fromCharCodes: function(charCodes) {
-      var t1 = H.Primitives_stringFromNativeUint8List(charCodes, 0, P.RangeError_checkValidRange(0, null, charCodes.length));
-      return t1;
-    },
     StringBuffer__writeAll: function(string, objects, separator) {
       var iterator = J.get$iterator$ax(objects);
       if (!iterator.moveNext$0())
@@ -3895,9 +3676,6 @@
       }
       return string;
     },
-    NoSuchMethodError$: function(receiver, memberName, positionalArguments, namedArguments) {
-      return new P.NoSuchMethodError(receiver, memberName, positionalArguments, namedArguments);
-    },
     StackTrace_current: function() {
       var stackTrace, exception;
       if (H.boolConversionCheck($.$get$_hasErrorStackProperty()))
@@ -3949,10 +3727,9 @@
     ArgumentError$value: function(value, $name, message) {
       return new P.ArgumentError(true, value, $name, message);
     },
-    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$: function(message) {
+      var _null = null;
+      return new P.RangeError(_null, _null, false, _null, _null, message);
     },
     RangeError$value: function(value, $name) {
       return new P.RangeError(null, null, true, value, $name, "Value not in range");
@@ -3960,11 +3737,6 @@
     RangeError$range: function(invalidValue, minValue, maxValue, $name, message) {
       return new P.RangeError(minValue, maxValue, true, invalidValue, $name, "Invalid value");
     },
-    RangeError_checkValidRange: function(start, end, $length) {
-      if (start > $length)
-        throw H.wrapException(P.RangeError$range(start, 0, $length, "start", null));
-      return $length;
-    },
     IndexError$: function(invalidValue, indexable, $name, message, $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");
@@ -3981,18 +3753,8 @@
     ConcurrentModificationError$: function(modifiedObject) {
       return new P.ConcurrentModificationError(modifiedObject);
     },
-    Exception_Exception: function(message) {
-      return new P._Exception(message);
-    },
-    FormatException$: function(message, source, offset) {
-      return new P.FormatException(message, source, offset);
-    },
-    _symbolMapToStringMap_closure: function _symbolMapToStringMap_closure(t0) {
-      this.result = t0;
-    },
-    NoSuchMethodError_toString_closure: function NoSuchMethodError_toString_closure(t0, t1) {
-      this._box_0 = t0;
-      this.sb = t1;
+    FormatException$: function(message) {
+      return new P.FormatException(message);
     },
     DateTime: function DateTime(t0, t1) {
       this._value = t0;
@@ -4038,13 +3800,6 @@
       _.name = t3;
       _.message = t4;
     },
-    NoSuchMethodError: function NoSuchMethodError(t0, t1, t2, t3) {
-      var _ = this;
-      _._core$_receiver = t0;
-      _._core$_memberName = t1;
-      _._core$_arguments = t2;
-      _._namedArguments = t3;
-    },
     UnsupportedError: function UnsupportedError(t0) {
       this.message = t0;
     },
@@ -4067,10 +3822,8 @@
     _Exception: function _Exception(t0) {
       this.message = t0;
     },
-    FormatException: function FormatException(t0, t1, t2) {
+    FormatException: function FormatException(t0) {
       this.message = t0;
-      this.source = t1;
-      this.offset = t2;
     },
     Iterable: function Iterable() {
     },
@@ -4224,79 +3977,32 @@
       this.onData = t0;
     }
   },
-  N = {HexCodec: function HexCodec() {
-    }},
-  R = {
-    _convert: function(bytes, start, end) {
-      var t1, t2, i, bufferIndex, byteOr, byte, bufferIndex0, t3,
-        buffer = new Uint8Array((end - start) * 2);
-      for (t1 = buffer.length, t2 = bytes.length, i = start, bufferIndex = 0, byteOr = 0; i < end; ++i) {
-        if (i >= t2)
-          return H.ioore(bytes, i);
-        byte = bytes[i];
-        if (typeof byte !== "number")
-          return H.iae(byte);
-        byteOr = (byteOr | byte) >>> 0;
-        bufferIndex0 = bufferIndex + 1;
-        t3 = (byte & 240) >>> 4;
-        t3 = t3 < 10 ? t3 + 48 : t3 + 97 - 10;
-        if (bufferIndex >= t1)
-          return H.ioore(buffer, bufferIndex);
-        buffer[bufferIndex] = t3;
-        bufferIndex = bufferIndex0 + 1;
-        t3 = byte & 15;
-        t3 = t3 < 10 ? t3 + 48 : t3 + 97 - 10;
-        if (bufferIndex0 >= t1)
-          return H.ioore(buffer, bufferIndex0);
-        buffer[bufferIndex0] = t3;
-      }
-      if (byteOr >= 0 && byteOr <= 255)
-        return P.String_String$fromCharCodes(buffer);
-      for (i = start; i < end; ++i) {
-        if (i >= t2)
-          return H.ioore(bytes, i);
-        byte = bytes[i];
-        if (typeof byte !== "number")
-          return byte.$ge();
-        if (byte >= 0 && byte <= 255)
-          continue;
-        throw H.wrapException(P.FormatException$("Invalid byte " + (byte < 0 ? "-" : "") + "0x" + C.JSInt_methods.toRadixString$1(Math.abs(byte), 16) + ".", bytes, i));
-      }
-      throw H.wrapException("unreachable");
-    },
-    HexEncoder: function HexEncoder() {
-    },
-    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 = {
+  N = {
     Logger_Logger: function($name) {
-      return $.Logger__loggers.putIfAbsent$2($name, new F.Logger_Logger_closure($name));
+      return $.Logger__loggers.putIfAbsent$2($name, new N.Logger_Logger_closure($name));
     },
     Logger: function Logger(t0, t1, t2) {
-      var _ = this;
-      _.name = t0;
-      _.parent = t1;
-      _._level = null;
-      _._children = 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;
     }
   },
   M = {
     SseClient$: function(serverUrl) {
       var t1 = type$.legacy_String;
-      t1 = new M.SseClient(P.StreamController_StreamController(t1), P.StreamController_StreamController(t1), F.Logger_Logger("SseClient"));
+      t1 = new M.SseClient(P.StreamController_StreamController(t1), P.StreamController_StreamController(t1), N.Logger_Logger("SseClient"));
       t1.SseClient$1(serverUrl);
       return t1;
     },
@@ -4319,22 +4025,25 @@
       this.error = t1;
     }
   },
-  K = {
-    Uuid$: function() {
-      var options, t2, t1 = {};
-      t1.options = options;
-      t1.options = null;
-      t2 = new K.Uuid();
-      t2.Uuid$1$options(t1);
-      return t2;
+  T = {
+    generateUuidV4: function() {
+      var t1 = new T.generateUuidV4__printDigits(),
+        t2 = new T.generateUuidV4__bitsDigits(t1, new T.generateUuidV4__generateBits(C.C__JSRandom)),
+        t3 = C.C__JSRandom.nextInt$1(4);
+      return H.S(t2.call$2(16, 4)) + H.S(t2.call$2(16, 4)) + "-" + H.S(t2.call$2(16, 4)) + "-4" + H.S(t2.call$2(12, 3)) + "-" + H.S(t1.call$2(8 + t3, 1)) + H.S(t2.call$2(12, 3)) + "-" + H.S(t2.call$2(16, 4)) + H.S(t2.call$2(16, 4)) + H.S(t2.call$2(16, 4));
     },
-    Uuid: function Uuid() {
-      var _ = this;
-      _._clockSeq = _._nodeId = _._seedBytes = null;
-      _._lastNSecs = _._lastMSecs = 0;
-      _._hexToByte = _._byteToHex = null;
+    generateUuidV4__generateBits: function generateUuidV4__generateBits(t0) {
+      this.random = t0;
+    },
+    generateUuidV4__printDigits: function generateUuidV4__printDigits() {
+    },
+    generateUuidV4__bitsDigits: function generateUuidV4__bitsDigits(t0, t1) {
+      this._printDigits = t0;
+      this._generateBits = t1;
     }
   },
+  R = {StreamChannelMixin: function StreamChannelMixin() {
+    }},
   E = {
     main: function() {
       var channel = M.SseClient$("/test"),
@@ -4352,25 +4061,8 @@
     main_closure0: function main_closure0(t0) {
       this.channel = t0;
     }
-  },
-  T = {
-    UuidUtil_mathRNG: function() {
-      var b, rand, i,
-        t1 = new Array(16);
-      t1.fixed$length = Array;
-      b = H.setRuntimeTypeInfo(t1, type$.JSArray_legacy_int);
-      for (rand = null, i = 0; i < 16; ++i) {
-        t1 = i & 3;
-        if (t1 === 0)
-          rand = C.JSInt_methods.toInt$0(C.JSNumber_methods.floor$0(C.C__JSRandom.nextDouble$0() * 4294967296));
-        if (typeof rand !== "number")
-          return rand.$shr();
-        C.JSArray_methods.$indexSet(b, i, C.JSInt_methods._shrOtherPositive$1(rand, t1 << 3) & 255);
-      }
-      return b;
-    }
   };
-  var holders = [C, H, J, P, W, N, R, Y, L, F, M, K, E, T];
+  var holders = [C, H, J, P, W, N, M, T, R, E];
   hunkHelpers.setFunctionNamesIfNecessary(holders);
   var $ = {};
   H.JS_CONST.prototype = {};
@@ -4383,22 +4075,12 @@
     },
     toString$0: function(receiver) {
       return "Instance of '" + H.S(H.Primitives_objectTypeName(receiver)) + "'";
-    },
-    noSuchMethod$1: function(receiver, invocation) {
-      type$.Invocation._as(invocation);
-      throw H.wrapException(P.NoSuchMethodError$(receiver, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments()));
     }
   };
   J.JSBool.prototype = {
     toString$0: function(receiver) {
       return String(receiver);
     },
-    $and: function(receiver, other) {
-      return H.checkBool(H._asBoolS(other)) && receiver;
-    },
-    $or: function(receiver, other) {
-      return H.checkBool(H._asBoolS(other)) || receiver;
-    },
     get$hashCode: function(receiver) {
       return receiver ? 519018 : 218159;
     },
@@ -4414,9 +4096,6 @@
     get$hashCode: function(receiver) {
       return 0;
     },
-    noSuchMethod$1: function(receiver, invocation) {
-      return this.super$Interceptor$noSuchMethod(receiver, type$.Invocation._as(invocation));
-    },
     $isNull: 1
   };
   J.JavaScriptObject.prototype = {
@@ -4445,14 +4124,6 @@
         H.throwExpression(P.UnsupportedError$("add"));
       receiver.push(value);
     },
-    addAll$1: function(receiver, collection) {
-      var t1, _i;
-      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]);
-    },
     get$last: function(receiver) {
       var t1 = receiver.length;
       if (t1 > 0)
@@ -4475,8 +4146,6 @@
       return receiver.length;
     },
     $index: function(receiver, 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];
@@ -4492,17 +4161,6 @@
         throw H.wrapException(H.diagnoseIndexError(receiver, index));
       receiver[index] = value;
     },
-    $add: function(receiver, other) {
-      var t2, _i,
-        t1 = H._arrayInstanceType(receiver);
-      t1._eval$1("List<1>")._as(other);
-      t1 = H.setRuntimeTypeInfo([], t1);
-      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,
     $isList: 1
   };
@@ -4531,30 +4189,6 @@
     }
   };
   J.JSNumber.prototype = {
-    toInt$0: function(receiver) {
-      var t1;
-      if (receiver >= -2147483648 && receiver <= 2147483647)
-        return receiver | 0;
-      if (isFinite(receiver)) {
-        t1 = receiver < 0 ? Math.ceil(receiver) : Math.floor(receiver);
-        return t1 + 0;
-      }
-      throw H.wrapException(P.UnsupportedError$("" + receiver + ".toInt()"));
-    },
-    floor$0: function(receiver) {
-      var truncated, d;
-      if (receiver >= 0) {
-        if (receiver <= 2147483647)
-          return receiver | 0;
-      } else if (receiver >= -2147483648) {
-        truncated = receiver | 0;
-        return receiver === truncated ? truncated : truncated - 1;
-      }
-      d = Math.floor(receiver);
-      if (isFinite(d))
-        return d;
-      throw H.wrapException(P.UnsupportedError$("" + receiver + ".floor()"));
-    },
     toRadixString$1: function(receiver, radix) {
       var result, match, t1, exponent;
       if (radix < 2 || radix > 36)
@@ -4589,33 +4223,12 @@
       var absolute, floorLog2, factor, scaled,
         intValue = receiver | 0;
       if (receiver === intValue)
-        return 536870911 & intValue;
+        return intValue & 536870911;
       absolute = Math.abs(receiver);
       floorLog2 = Math.log(absolute) / 0.6931471805599453 | 0;
       factor = Math.pow(2, floorLog2);
       scaled = absolute < 1 ? absolute / factor : factor / absolute;
-      return 536870911 & ((scaled * 9007199254740992 | 0) + (scaled * 3542243181176521 | 0)) * 599197 + floorLog2 * 1259;
-    },
-    $add: function(receiver, other) {
-      H._asNumS(other);
-      return receiver + other;
-    },
-    $sub: function(receiver, other) {
-      return receiver - other;
-    },
-    $div: function(receiver, other) {
-      return receiver / other;
-    },
-    $mod: function(receiver, other) {
-      var result = receiver % other;
-      if (result === 0)
-        return 0;
-      if (result > 0)
-        return result;
-      if (other < 0)
-        return result - other;
-      else
-        return result + other;
+      return ((scaled * 9007199254740992 | 0) + (scaled * 3542243181176521 | 0)) * 599197 + floorLog2 * 1259 & 536870911;
     },
     _tdivFast$1: function(receiver, other) {
       return (receiver | 0) === receiver ? receiver / other | 0 : this._tdivSlow$1(receiver, other);
@@ -4631,23 +4244,9 @@
         return Math.ceil(quotient);
       throw H.wrapException(P.UnsupportedError$("Result of truncating division is " + H.S(quotient) + ": " + H.S(receiver) + " ~/ " + other));
     },
-    $shl: function(receiver, other) {
-      if (other < 0)
-        throw H.wrapException(H.argumentErrorValue(other));
+    _shlPositive$1: function(receiver, other) {
       return other > 31 ? 0 : receiver << other >>> 0;
     },
-    $shr: function(receiver, other) {
-      var t1;
-      if (other < 0)
-        throw H.wrapException(H.argumentErrorValue(other));
-      if (receiver > 0)
-        t1 = this._shrBothPositive$1(receiver, other);
-      else {
-        t1 = other > 31 ? 31 : other;
-        t1 = receiver >> t1 >>> 0;
-      }
-      return t1;
-    },
     _shrOtherPositive$1: function(receiver, other) {
       var t1;
       if (receiver > 0)
@@ -4661,26 +4260,6 @@
     _shrBothPositive$1: function(receiver, other) {
       return other > 31 ? 0 : receiver >>> other;
     },
-    $and: function(receiver, other) {
-      return (receiver & other) >>> 0;
-    },
-    $or: function(receiver, other) {
-      H._asNumS(other);
-      if (typeof other != "number")
-        throw H.wrapException(H.argumentErrorValue(other));
-      return (receiver | other) >>> 0;
-    },
-    $lt: function(receiver, other) {
-      return receiver < other;
-    },
-    $gt: function(receiver, other) {
-      return receiver > other;
-    },
-    $ge: function(receiver, other) {
-      if (typeof other != "number")
-        throw H.wrapException(H.argumentErrorValue(other));
-      return receiver >= other;
-    },
     $isdouble: 1,
     $isnum: 1
   };
@@ -4700,7 +4279,6 @@
       return receiver.charCodeAt(index);
     },
     $add: function(receiver, other) {
-      H._asStringS(other);
       if (typeof other != "string")
         throw H.wrapException(P.ArgumentError$value(other, null, null));
       return receiver + other;
@@ -4743,6 +4321,12 @@
       }
       return result;
     },
+    padLeft$2: function(receiver, width, padding) {
+      var delta = width - receiver.length;
+      if (delta <= 0)
+        return receiver;
+      return this.$mul(padding, delta) + receiver;
+    },
     lastIndexOf$1: function(receiver, pattern) {
       var start = receiver.length,
         t1 = pattern.length;
@@ -4756,31 +4340,31 @@
     get$hashCode: function(receiver) {
       var t1, hash, i;
       for (t1 = receiver.length, hash = 0, i = 0; i < t1; ++i) {
-        hash = 536870911 & hash + receiver.charCodeAt(i);
-        hash = 536870911 & hash + ((524287 & hash) << 10);
+        hash = hash + receiver.charCodeAt(i) & 536870911;
+        hash = hash + ((hash & 524287) << 10) & 536870911;
         hash ^= hash >> 6;
       }
-      hash = 536870911 & hash + ((67108863 & hash) << 3);
+      hash = hash + ((hash & 67108863) << 3) & 536870911;
       hash ^= hash >> 11;
-      return 536870911 & hash + ((16383 & hash) << 15);
+      return hash + ((hash & 16383) << 15) & 536870911;
     },
     get$length: function(receiver) {
       return receiver.length;
     },
-    $index: function(receiver, index) {
-      if (index >= receiver.length || false)
-        throw H.wrapException(H.diagnoseIndexError(receiver, index));
-      return receiver[index];
-    },
     $isPattern: 1,
     $isString: 1
   };
-  H.LateInitializationErrorImpl.prototype = {
+  H.LateError.prototype = {
     toString$0: function(_) {
       var message = this._message;
       return message != null ? "LateInitializationError: " + message : "LateInitializationError";
     }
   };
+  H.NotNullableError.prototype = {
+    toString$0: function(_) {
+      return "Null is not a valid value for the parameter '" + this.__internal$_name + "' of type '" + H.createRuntimeType(this.$ti._precomputed1).toString$0(0) + "'";
+    }
+  };
   H.EfficientLengthIterable.prototype = {};
   H.ListIterable.prototype = {
     get$iterator: function(_) {
@@ -4818,120 +4402,6 @@
     }
   };
   H.FixedLengthListMixin.prototype = {};
-  H.Symbol.prototype = {
-    get$hashCode: function(_) {
-      var hash = this._hashCode;
-      if (hash != null)
-        return hash;
-      hash = 536870911 & 664597 * J.get$hashCode$(this.__internal$_name);
-      this._hashCode = hash;
-      return hash;
-    },
-    toString$0: function(_) {
-      return 'Symbol("' + H.S(this.__internal$_name) + '")';
-    },
-    $eq: function(_, other) {
-      if (other == null)
-        return false;
-      return other instanceof H.Symbol && this.__internal$_name == other.__internal$_name;
-    },
-    $isSymbol0: 1
-  };
-  H.ConstantMapView.prototype = {};
-  H.ConstantMap.prototype = {
-    get$isEmpty: function(_) {
-      return this.get$length(this) === 0;
-    },
-    toString$0: function(_) {
-      return P.MapBase_mapToString(this);
-    },
-    $isMap: 1
-  };
-  H.ConstantStringMap.prototype = {
-    get$length: function(_) {
-      return this.__js_helper$_length;
-    },
-    containsKey$1: function(key) {
-      return false;
-    },
-    $index: function(_, key) {
-      if (!this.containsKey$1(key))
-        return null;
-      return this._fetch$1(key);
-    },
-    _fetch$1: function(key) {
-      return this._jsObject[H._asStringS(key)];
-    },
-    forEach$1: function(_, f) {
-      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, t1._as(this._fetch$1(key)));
-      }
-    }
-  };
-  H.JSInvocationMirror.prototype = {
-    get$memberName: function() {
-      var t1 = this._memberName;
-      return t1;
-    },
-    get$positionalArguments: function() {
-      var t1, argumentCount, list, index, _this = this;
-      if (_this.__js_helper$_kind === 1)
-        return C.List_empty;
-      t1 = _this._arguments;
-      argumentCount = t1.length - _this._namedArgumentNames.length - _this._typeArgumentCount;
-      if (argumentCount === 0)
-        return C.List_empty;
-      list = [];
-      for (index = 0; index < argumentCount; ++index) {
-        if (index >= t1.length)
-          return H.ioore(t1, index);
-        list.push(t1[index]);
-      }
-      list.fixed$length = Array;
-      list.immutable$list = Array;
-      return list;
-    },
-    get$namedArguments: function() {
-      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;
-      t2 = _this._arguments;
-      namedArgumentsStartIndex = t2.length - namedArgumentCount - _this._typeArgumentCount;
-      if (namedArgumentCount === 0)
-        return C.Map_empty;
-      map = new H.JsLinkedHashMap(type$.JsLinkedHashMap_Symbol_dynamic);
-      for (i = 0; i < namedArgumentCount; ++i) {
-        if (i >= t1.length)
-          return H.ioore(t1, i);
-        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, type$.ConstantMapView_Symbol_dynamic);
-    },
-    $isInvocation: 1
-  };
-  H.Primitives_functionNoSuchMethod_closure.prototype = {
-    call$2: function($name, argument) {
-      var t1;
-      H._asStringS($name);
-      t1 = this._box_0;
-      t1.names = t1.names + "$" + H.S($name);
-      C.JSArray_methods.add$1(this.namedArgumentList, $name);
-      C.JSArray_methods.add$1(this.$arguments, argument);
-      ++t1.argumentCount;
-    },
-    $signature: 12
-  };
   H.TypeErrorDecoder.prototype = {
     matchTypeError$1: function(message) {
       var result, t1, _this = this,
@@ -5062,7 +4532,6 @@
       return "Assertion failed: " + P.Error_safeToString(this.message);
     }
   };
-  H._Required.prototype = {};
   H.JsLinkedHashMap.prototype = {
     get$length: function(_) {
       return this.__js_helper$_length;
@@ -5074,22 +4543,10 @@
       return new H.LinkedHashMapKeyIterable(this, H._instanceType(this)._eval$1("LinkedHashMapKeyIterable<1>"));
     },
     containsKey$1: function(key) {
-      var strings, t1;
-      if (typeof key == "string") {
-        strings = this._strings;
-        if (strings == null)
-          return false;
-        return this._containsTableEntry$2(strings, key);
-      } else {
-        t1 = this.internalContainsKey$1(key);
-        return t1;
-      }
-    },
-    internalContainsKey$1: function(key) {
-      var rest = this.__js_helper$_rest;
-      if (rest == null)
+      var strings = this._strings;
+      if (strings == null)
         return false;
-      return this.internalFindBucketIndex$2(this._getTableBucket$2(rest, J.get$hashCode$(key) & 0x3ffffff), key) >= 0;
+      return this._containsTableEntry$2(strings, key);
     },
     $index: function(_, key) {
       var strings, cell, t1, nums, _this = this, _null = null;
@@ -5280,13 +4737,13 @@
     call$2: function(o, tag) {
       return this.getUnknownTag(o, tag);
     },
-    $signature: 13
+    $signature: 12
   };
   H.initHooks_closure1.prototype = {
     call$1: function(tag) {
       return this.prototypeForTag(H._asStringS(tag));
     },
-    $signature: 14
+    $signature: 13
   };
   H.NativeTypedData.prototype = {};
   H.NativeTypedArray.prototype = {
@@ -5380,6 +4837,11 @@
     }
   };
   H._FunctionParameters.prototype = {};
+  H._Type.prototype = {
+    toString$0: function(_) {
+      return H._rtiToString(this._rti, null);
+    }
+  };
   H._Error.prototype = {
     toString$0: function(_) {
       return this.__rti$_message;
@@ -5403,23 +4865,19 @@
       t2 = this.span;
       t1.firstChild ? t1.removeChild(t2) : t1.appendChild(t2);
     },
-    $signature: 15
+    $signature: 14
   };
   P._AsyncRun__scheduleImmediateJsOverride_internalCallback.prototype = {
     call$0: function() {
       this.callback.call$0();
     },
-    "call*": "call$0",
-    $requiredArgCount: 0,
-    $signature: 0
+    $signature: 1
   };
   P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback.prototype = {
     call$0: function() {
       this.callback.call$0();
     },
-    "call*": "call$0",
-    $requiredArgCount: 0,
-    $signature: 0
+    $signature: 1
   };
   P._TimerImpl.prototype = {
     _TimerImpl$2: function(milliseconds, callback) {
@@ -5445,9 +4903,7 @@
       this.$this._handle = null;
       this.callback.call$0();
     },
-    "call*": "call$0",
-    $requiredArgCount: 0,
-    $signature: 1
+    $signature: 0
   };
   P._AsyncAwaitCompleter.prototype = {
     complete$1: function(_, value) {
@@ -5485,20 +4941,18 @@
     call$2: function(error, stackTrace) {
       this.bodyFunction.call$2(1, new H.ExceptionAndStackTrace(error, type$.StackTrace._as(stackTrace)));
     },
-    "call*": "call$2",
-    $requiredArgCount: 2,
-    $signature: 16
+    $signature: 15
   };
   P._wrapJsFunctionForAsync_closure.prototype = {
     call$2: function(errorCode, result) {
       this.$protected(H._asIntS(errorCode), result);
     },
-    $signature: 17
+    $signature: 16
   };
   P._Completer.prototype = {
     completeError$2: function(error, stackTrace) {
       var t1;
-      P.ArgumentError_checkNotNull(error, "error", type$.Object);
+      H.checkNotNullable(error, "error", type$.Object);
       t1 = this.future;
       if (t1._state !== 0)
         throw H.wrapException(P.StateError$("Future already completed"));
@@ -5736,9 +5190,7 @@
     call$2: function(error, stackTrace) {
       this.target._completeError$2(error, type$.StackTrace._as(stackTrace));
     },
-    "call*": "call$2",
-    $requiredArgCount: 2,
-    $signature: 19
+    $signature: 18
   };
   P._Future__chainForeignFuture_closure1.prototype = {
     call$0: function() {
@@ -5803,13 +5255,13 @@
         t1.listenerHasError = false;
       }
     },
-    $signature: 1
+    $signature: 0
   };
   P._Future__propagateToListeners_handleWhenCompleteCallback_closure.prototype = {
     call$1: function(_) {
       return this.originalSource;
     },
-    $signature: 20
+    $signature: 19
   };
   P._Future__propagateToListeners_handleValueCallback.prototype = {
     call$0: function() {
@@ -5829,7 +5281,7 @@
         t1.listenerHasError = true;
       }
     },
-    $signature: 1
+    $signature: 0
   };
   P._Future__propagateToListeners_handleError.prototype = {
     call$0: function() {
@@ -5855,7 +5307,7 @@
         t4.listenerHasError = true;
       }
     },
-    $signature: 1
+    $signature: 0
   };
   P._AsyncCallbackEntry.prototype = {};
   P.Stream.prototype = {
@@ -5873,7 +5325,7 @@
       ++this._box_0.count;
     },
     $signature: function() {
-      return H._instanceType(this.$this)._eval$1("Null(1)");
+      return H._instanceType(this.$this)._eval$1("~(1)");
     }
   };
   P.Stream_length_closure0.prototype = {
@@ -6026,7 +5478,7 @@
       if (doneFuture != null && doneFuture._state === 0)
         doneFuture._asyncComplete$1(null);
     },
-    $signature: 1
+    $signature: 0
   };
   P._AsyncStreamControllerDispatch.prototype = {
     _sendData$1: function(data) {
@@ -6222,7 +5674,7 @@
         t4.runUnaryGuarded$1$2(type$.void_Function_Object._as(onError), t2, t3);
       t1._state &= 4294967263;
     },
-    $signature: 1
+    $signature: 0
   };
   P._BufferingStreamSubscription__sendDone_sendDone.prototype = {
     call$0: function() {
@@ -6234,7 +5686,7 @@
       t1._zone.runGuarded$1(t1._onDone);
       t1._state &= 4294967263;
     },
-    $signature: 1
+    $signature: 0
   };
   P._StreamImpl.prototype = {
     listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
@@ -6402,9 +5854,6 @@
     bindUnaryCallbackGuarded$1$1: function(f, $T) {
       return new P._RootZone_bindUnaryCallbackGuarded_closure(this, $T._eval$1("~(0)")._as(f), $T);
     },
-    $index: function(_, key) {
-      return null;
-    },
     run$1$1: function(f, $R) {
       $R._eval$1("0()")._as(f);
       if ($.Zone__current === C.C__RootZone)
@@ -6442,7 +5891,7 @@
     call$0: function() {
       return this.$this.runGuarded$1(this.f);
     },
-    $signature: 1
+    $signature: 0
   };
   P._RootZone_bindUnaryCallbackGuarded_closure.prototype = {
     call$1: function(arg) {
@@ -6463,19 +5912,6 @@
     get$isNotEmpty: function(receiver) {
       return this.get$length(receiver) !== 0;
     },
-    $add: function(receiver, other) {
-      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, "[", "]");
     }
@@ -6517,27 +5953,6 @@
     },
     $isMap: 1
   };
-  P._UnmodifiableMapMixin.prototype = {};
-  P.MapView.prototype = {
-    $index: function(_, key) {
-      return this._collection$_map.$index(0, key);
-    },
-    forEach$1: function(_, action) {
-      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;
-    },
-    get$length: function(_) {
-      return this._collection$_map.__js_helper$_length;
-    },
-    toString$0: function(_) {
-      return P.MapBase_mapToString(this._collection$_map);
-    },
-    $isMap: 1
-  };
-  P.UnmodifiableMapView.prototype = {};
-  P._UnmodifiableMapView_MapView__UnmodifiableMapMixin.prototype = {};
   P._JsonMap.prototype = {
     $index: function(_, key) {
       var result,
@@ -6686,15 +6101,19 @@
               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);
+              t3 = t2._contents += H.Primitives_stringFromCharCode(92);
+              t3 += H.Primitives_stringFromCharCode(117);
+              t2._contents = t3;
+              t3 += H.Primitives_stringFromCharCode(100);
+              t2._contents = t3;
+              t4 = charCode >>> 8 & 15;
+              t3 += H.Primitives_stringFromCharCode(t4 < 10 ? 48 + t4 : 87 + t4);
+              t2._contents = t3;
+              t4 = charCode >>> 4 & 15;
+              t3 += H.Primitives_stringFromCharCode(t4 < 10 ? 48 + t4 : 87 + t4);
+              t2._contents = t3;
+              t4 = charCode & 15;
+              t2._contents = t3 + H.Primitives_stringFromCharCode(t4 < 10 ? 48 + t4 : 87 + t4);
             }
           }
           continue;
@@ -6703,39 +6122,43 @@
           if (i > offset)
             t2._contents += C.JSString_methods.substring$2(s, offset, i);
           offset = i + 1;
-          t2._contents += H.Primitives_stringFromCharCode(92);
+          t3 = t2._contents += H.Primitives_stringFromCharCode(92);
           switch (charCode) {
             case 8:
-              t2._contents += H.Primitives_stringFromCharCode(98);
+              t2._contents = t3 + H.Primitives_stringFromCharCode(98);
               break;
             case 9:
-              t2._contents += H.Primitives_stringFromCharCode(116);
+              t2._contents = t3 + H.Primitives_stringFromCharCode(116);
               break;
             case 10:
-              t2._contents += H.Primitives_stringFromCharCode(110);
+              t2._contents = t3 + H.Primitives_stringFromCharCode(110);
               break;
             case 12:
-              t2._contents += H.Primitives_stringFromCharCode(102);
+              t2._contents = t3 + H.Primitives_stringFromCharCode(102);
               break;
             case 13:
-              t2._contents += H.Primitives_stringFromCharCode(114);
+              t2._contents = t3 + H.Primitives_stringFromCharCode(114);
               break;
             default:
-              t2._contents += H.Primitives_stringFromCharCode(117);
-              t2._contents += H.Primitives_stringFromCharCode(48);
-              t2._contents += H.Primitives_stringFromCharCode(48);
-              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);
+              t3 += H.Primitives_stringFromCharCode(117);
+              t2._contents = t3;
+              t3 += H.Primitives_stringFromCharCode(48);
+              t2._contents = t3;
+              t3 += H.Primitives_stringFromCharCode(48);
+              t2._contents = t3;
+              t4 = charCode >>> 4 & 15;
+              t3 += H.Primitives_stringFromCharCode(t4 < 10 ? 48 + t4 : 87 + t4);
+              t2._contents = t3;
+              t4 = charCode & 15;
+              t2._contents = t3 + H.Primitives_stringFromCharCode(t4 < 10 ? 48 + t4 : 87 + t4);
               break;
           }
         } else if (charCode === 34 || charCode === 92) {
           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(charCode);
+          t3 = t2._contents += H.Primitives_stringFromCharCode(92);
+          t2._contents = t3 + H.Primitives_stringFromCharCode(charCode);
         }
       }
       if (offset === 0)
@@ -6829,29 +6252,30 @@
       t1._contents += "]";
     },
     writeMap$1: function(map) {
-      var keyValueList, i, t1, separator, t2, _this = this, _box_0 = {};
+      var t1, keyValueList, i, t2, separator, t3, _this = this, _box_0 = {};
       if (map.get$isEmpty(map)) {
         _this._sink._contents += "{}";
         return true;
       }
-      keyValueList = P.List_List$filled(map.get$length(map) * 2, null, type$.nullable_Object);
+      t1 = map.get$length(map) * 2;
+      keyValueList = P.List_List$filled(t1, 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;
-      t1 = _this._sink;
-      t1._contents += "{";
-      for (separator = '"'; i < keyValueList.length; i += 2, separator = ',"') {
-        t1._contents += separator;
+      t2 = _this._sink;
+      t2._contents += "{";
+      for (separator = '"'; i < t1; i += 2, separator = ',"') {
+        t2._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 += '":';
+        t3 = i + 1;
+        if (t3 >= t1)
+          return H.ioore(keyValueList, t3);
+        _this.writeObject$1(keyValueList[t3]);
       }
-      t1._contents += "}";
+      t2._contents += "}";
       return true;
     }
   };
@@ -6873,26 +6297,6 @@
       return t1.charCodeAt(0) == 0 ? t1 : t1;
     }
   };
-  P._symbolMapToStringMap_closure.prototype = {
-    call$2: function(key, 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;
-      type$.Symbol._as(key);
-      t1 = this.sb;
-      t2 = this._box_0;
-      t1._contents += t2.comma;
-      t3 = t1._contents += H.S(key.__internal$_name);
-      t1._contents = t3 + ": ";
-      t1._contents += P.Error_safeToString(value);
-      t2.comma = ", ";
-    },
-    $signature: 8
-  };
   P.DateTime.prototype = {
     $eq: function(_, other) {
       if (other == null)
@@ -6919,21 +6323,6 @@
     }
   };
   P.Duration.prototype = {
-    $add: function(_, other) {
-      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, type$.Duration._as(other).get$_duration()));
-    },
-    $lt: function(_, other) {
-      return C.JSInt_methods.$lt(this._duration, type$.Duration._as(other).get$_duration());
-    },
-    $gt: function(_, other) {
-      return C.JSInt_methods.$gt(this._duration, type$.Duration._as(other).get$_duration());
-    },
-    $ge: function(_, other) {
-      return C.JSInt_methods.$ge(this._duration, type$.Duration._as(other).get$_duration());
-    },
     $eq: function(_, other) {
       if (other == null)
         return false;
@@ -6968,7 +6357,7 @@
         return "0000" + n;
       return "00000" + n;
     },
-    $signature: 9
+    $signature: 8
   };
   P.Duration_toString_twoDigits.prototype = {
     call$1: function(n) {
@@ -6976,7 +6365,7 @@
         return "" + n;
       return "0" + n;
     },
-    $signature: 9
+    $signature: 8
   };
   P.Error.prototype = {
     get$stackTrace: function() {
@@ -7057,25 +6446,6 @@
       return this.length;
     }
   };
-  P.NoSuchMethodError.prototype = {
-    toString$0: function(_) {
-      var $arguments, t1, _i, t2, t3, argument, receiverText, actualParameters, _this = this, _box_0 = {},
-        sb = new P.StringBuffer("");
-      _box_0.comma = "";
-      $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));
-      receiverText = P.Error_safeToString(_this._core$_receiver);
-      actualParameters = sb.toString$0(0);
-      t1 = "NoSuchMethodError: method not found: '" + H.S(_this._core$_memberName.__internal$_name) + "'\nReceiver: " + receiverText + "\nArguments: [" + actualParameters + "]";
-      return t1;
-    }
-  };
   P.UnsupportedError.prototype = {
     toString$0: function(_) {
       return "Unsupported operation: " + this.message;
@@ -7132,9 +6502,8 @@
   P.FormatException.prototype = {
     toString$0: function(_) {
       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;
+        report = message != null && "" !== message ? "FormatException: " + H.S(message) : "FormatException";
+      return report;
     }
   };
   P.Iterable.prototype = {
@@ -7177,10 +6546,6 @@
     toString$0: function(_) {
       return "Instance of '" + H.S(H.Primitives_objectTypeName(this)) + "'";
     },
-    noSuchMethod$1: function(_, invocation) {
-      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);
     }
@@ -7272,7 +6637,7 @@
       else
         t3.completeError$1(e);
     },
-    $signature: 21
+    $signature: 20
   };
   W.HttpRequestEventTarget.prototype = {};
   W.MessageEvent.prototype = {$isMessageEvent: 1};
@@ -7305,7 +6670,7 @@
     call$1: function(e) {
       return this.onData.call$1(type$.Event._as(e));
     },
-    $signature: 22
+    $signature: 21
   };
   P._AcceptStructuredClone.prototype = {
     findSlot$1: function(value) {
@@ -7337,7 +6702,7 @@
           t1 = true;
         if (t1)
           H.throwExpression(P.ArgumentError$("DateTime is outside valid range: " + millisSinceEpoch));
-        P.ArgumentError_checkNotNull(true, "isUtc", type$.bool);
+        H.checkNotNullable(true, "isUtc", type$.bool);
         return new P.DateTime(millisSinceEpoch, true);
       }
       if (e instanceof RegExp)
@@ -7391,13 +6756,13 @@
       J.$indexSet$ax(t1, key, t2);
       return t2;
     },
-    $signature: 23
+    $signature: 22
   };
   P.convertDartToNative_Dictionary_closure.prototype = {
     call$2: function(key, value) {
       this.object[key] = value;
     },
-    $signature: 24
+    $signature: 23
   };
   P._AcceptStructuredCloneDart2Js.prototype = {
     forEachJsField$2: function(object, action) {
@@ -7422,8 +6787,10 @@
     $signature: 2
   };
   P._JSRandom.prototype = {
-    nextDouble$0: function() {
-      return Math.random();
+    nextInt$1: function(max) {
+      if (max <= 0 || max > 4294967296)
+        throw H.wrapException(P.RangeError$("max must be in range 0 < max \u2264 2^32, was " + max));
+      return Math.random() * max >>> 0;
     }
   };
   P.SvgElement.prototype = {
@@ -7431,29 +6798,57 @@
       return new W._ElementEventStreamImpl(receiver, "click", false, type$._ElementEventStreamImpl_legacy_MouseEvent);
     }
   };
-  N.HexCodec.prototype = {
-    get$encoder: function() {
-      return C.C_HexEncoder;
+  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) {
     }
   };
-  R.HexEncoder.prototype = {
-    convert$1: function(bytes) {
-      type$.legacy_List_legacy_int._as(bytes);
-      return R._convert(bytes, 0, bytes.length);
-    }
+  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(type$.JsLinkedHashMap_of_legacy_String_and_legacy_Logger));
+      if ($parent != null)
+        $parent._children.$indexSet(0, thisName, t1);
+      return t1;
+    },
+    $signature: 24
   };
-  Y.Level.prototype = {
+  N.Level.prototype = {
     $eq: function(_, other) {
       if (other == null)
         return false;
-      return other instanceof Y.Level && this.value === other.value;
-    },
-    $gt: function(_, other) {
-      type$.legacy_Level._as(other);
-      return C.JSInt_methods.$gt(this.value, other.get$value(other));
-    },
-    $ge: function(_, other) {
-      return this.value >= type$.legacy_Level._as(other).value;
+      return other instanceof N.Level && this.value === other.value;
     },
     get$hashCode: function(_) {
       return this.value;
@@ -7462,75 +6857,15 @@
       return this.name;
     }
   };
-  L.LogRecord.prototype = {
+  N.LogRecord.prototype = {
     toString$0: function(_) {
       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, t3, t4, _this = this,
-        clientId = K.Uuid$().v1$0();
+        clientId = T.generateUuidV4();
       _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;
@@ -7636,7 +6971,7 @@
       if (t1 != null)
         t1.cancel$0();
     },
-    $signature: 11
+    $signature: 10
   };
   M.SseClient_closure0.prototype = {
     call$1: function(error) {
@@ -7646,7 +6981,7 @@
       if (t2 !== true)
         t1._errorTimer = P.Timer_Timer(C.Duration_5000000, new M.SseClient__closure(t1, error));
     },
-    $signature: 11
+    $signature: 10
   };
   M.SseClient__closure.prototype = {
     call$0: function() {
@@ -7654,7 +6989,7 @@
         t1 = this.$this,
         t2 = t1._incomingController,
         error = this.error;
-      P.ArgumentError_checkNotNull(error, "error", type$.Object);
+      H.checkNotNullable(error, "error", type$.Object);
       if (t2._state >= 4)
         H.throwExpression(t2._badEventState$0());
       stackTrace = P.AsyncError_defaultStackTrace(error);
@@ -7665,129 +7000,27 @@
         t2._ensurePendingEvents$0().add$1(0, new P._DelayedError(error, stackTrace));
       t1.close$0(0);
     },
-    $signature: 0
+    $signature: 1
+  };
+  T.generateUuidV4__generateBits.prototype = {
+    call$1: function(bitCount) {
+      return this.random.nextInt$1(C.JSInt_methods._shlPositive$1(1, bitCount));
+    },
+    $signature: 26
+  };
+  T.generateUuidV4__printDigits.prototype = {
+    call$2: function(value, count) {
+      return C.JSString_methods.padLeft$2(C.JSInt_methods.toRadixString$1(value, 16), count, "0");
+    },
+    $signature: 11
+  };
+  T.generateUuidV4__bitsDigits.prototype = {
+    call$2: function(bitCount, digitCount) {
+      return this._printDigits.call$2(this._generateBits.call$1(bitCount), digitCount);
+    },
+    $signature: 11
   };
   R.StreamChannelMixin.prototype = {};
-  K.Uuid.prototype = {
-    Uuid$1$options: function(_box_0) {
-      var t1, t2, i, hex, t3, v1PositionalArgs, v1NamedArgs, _this = this,
-        _s19_ = "v1rngPositionalArgs",
-        _s14_ = "v1rngNamedArgs",
-        _s18_ = "grngPositionalArgs",
-        _s13_ = "grngNamedArgs",
-        options = _box_0.options;
-      if (!(options != null))
-        options = new H.JsLinkedHashMap(type$.JsLinkedHashMap_of_legacy_String_and_dynamic);
-      _box_0.options = options;
-      t1 = new Array(256);
-      t1.fixed$length = Array;
-      _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;
-        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 ? 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)
-        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);
-      if (typeof t2 !== "number")
-        return H.iae(t2);
-      _this._clockSeq = (t1 | t2) & 262143;
-    },
-    v1$0: function() {
-      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;
-      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));
-      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 ((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._asIntS(mSecs);
-      _this._lastMSecs = mSecs;
-      H._asIntS(nSecs);
-      _this._lastNSecs = nSecs;
-      _this._clockSeq = clockSeq;
-      mSecs += 122192928e5;
-      tl = C.JSInt_methods.$mod((mSecs & 268435455) * 10000 + nSecs, 4294967296);
-      C.JSArray_methods.$indexSet(buf, 0, C.JSInt_methods._shrOtherPositive$1(tl, 24) & 255);
-      C.JSArray_methods.$indexSet(buf, 1, C.JSInt_methods._shrOtherPositive$1(tl, 16) & 255);
-      C.JSArray_methods.$indexSet(buf, 2, C.JSInt_methods._shrOtherPositive$1(tl, 8) & 255);
-      C.JSArray_methods.$indexSet(buf, 3, tl & 255);
-      tmh = C.JSDouble_methods.floor$0(mSecs / 4294967296 * 10000) & 268435455;
-      C.JSArray_methods.$indexSet(buf, 4, tmh >>> 8 & 255);
-      C.JSArray_methods.$indexSet(buf, 5, tmh & 255);
-      C.JSArray_methods.$indexSet(buf, 6, tmh >>> 24 & 15 | 16);
-      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._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._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;
-      t2 = t1 + H.S((t2 && C.JSArray_methods).$index(t2, buf[1]));
-      t1 = _this._byteToHex;
-      t1 = t2 + H.S((t1 && C.JSArray_methods).$index(t1, buf[2]));
-      t2 = _this._byteToHex;
-      t2 = t1 + H.S((t2 && C.JSArray_methods).$index(t2, buf[3])) + "-";
-      t1 = _this._byteToHex;
-      t1 = t2 + H.S((t1 && C.JSArray_methods).$index(t1, buf[4]));
-      t2 = _this._byteToHex;
-      t2 = t1 + H.S((t2 && C.JSArray_methods).$index(t2, buf[5])) + "-";
-      t1 = _this._byteToHex;
-      t1 = t2 + H.S((t1 && C.JSArray_methods).$index(t1, buf[6]));
-      t2 = _this._byteToHex;
-      t2 = t1 + H.S((t2 && C.JSArray_methods).$index(t2, buf[7])) + "-";
-      t1 = _this._byteToHex;
-      t1 = t2 + H.S((t1 && C.JSArray_methods).$index(t1, buf[8]));
-      t2 = _this._byteToHex;
-      t2 = t1 + H.S((t2 && C.JSArray_methods).$index(t2, buf[9])) + "-";
-      t1 = _this._byteToHex;
-      t1 = t2 + H.S((t1 && C.JSArray_methods).$index(t1, buf[10]));
-      t2 = _this._byteToHex;
-      t2 = t1 + H.S((t2 && C.JSArray_methods).$index(t2, buf[11]));
-      t1 = _this._byteToHex;
-      t1 = t2 + H.S((t1 && C.JSArray_methods).$index(t1, buf[12]));
-      t2 = _this._byteToHex;
-      t2 = t1 + H.S((t2 && C.JSArray_methods).$index(t2, buf[13]));
-      t1 = _this._byteToHex;
-      t1 = t2 + H.S((t1 && C.JSArray_methods).$index(t1, buf[14]));
-      t2 = _this._byteToHex;
-      return t1 + H.S((t2 && C.JSArray_methods).$index(t2, buf[15]));
-    },
-    set$_byteToHex: function(_byteToHex) {
-      this._byteToHex = type$.legacy_List_legacy_String._as(_byteToHex);
-    },
-    set$_hexToByte: function(_hexToByte) {
-      this._hexToByte = type$.legacy_Map_of_legacy_String_and_legacy_int._as(_hexToByte);
-    }
-  };
   E.main_closure.prototype = {
     call$1: function(_) {
       type$.legacy_MouseEvent._as(_);
@@ -7830,7 +7063,6 @@
   (function aliases() {
     var _ = J.Interceptor.prototype;
     _.super$Interceptor$toString = _.toString$0;
-    _.super$Interceptor$noSuchMethod = _.noSuchMethod$1;
     _ = J.JavaScriptObject.prototype;
     _.super$JavaScriptObject$toString = _.toString$0;
   })();
@@ -7845,37 +7077,33 @@
     _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_0(P, "async___startMicrotaskLoop$closure", "_startMicrotaskLoop", 0);
     _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);
+    _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"], 17, 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", 1);
-    _instance_1_u(_, "get$_onOutgoingMessage", "_onOutgoingMessage$1", 26);
+    _instance_1_u(_ = M.SseClient.prototype, "get$_onIncomingControlMessage", "_onIncomingControlMessage$1", 9);
+    _instance_1_u(_, "get$_onIncomingMessage", "_onIncomingMessage$1", 9);
+    _instance_0_u(_, "get$_onOutgoingDone", "_onOutgoingDone$0", 0);
+    _instance_1_u(_, "get$_onOutgoingMessage", "_onOutgoingMessage$1", 25);
   })();
   (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.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(P.Object, [H.JS_CONST, J.Interceptor, J.ArrayIterator, P.Error, P.Iterable, H.ListIterator, H.FixedLengthListMixin, H.TypeErrorDecoder, H.NullThrownFromJavaScriptException, H.ExceptionAndStackTrace, H._StackTrace, H.Closure, P.MapMixin, H.LinkedHashMapCell, H.LinkedHashMapKeyIterator, H.Rti, H._FunctionParameters, H._Type, 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.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, N.Logger, N.Level, N.LogRecord, R.StreamChannelMixin]);
     _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]);
+    _inheritMany(P.Error, [H.LateError, H.NotNullableError, P.TypeError, H.JsNoSuchMethodError, H.UnknownJsTypeError, H.RuntimeError, P.AssertionError, H._Error, P.JsonUnsupportedObjectError, P.NullThrownError, P.ArgumentError, 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.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.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.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, T.generateUuidV4__generateBits, T.generateUuidV4__printDigits, T.generateUuidV4__bitsDigits, E.main_closure, E.main_closure0]);
     _inheritMany(H.TearOffClosure, [H.StaticClosure, H.BoundClosure]);
     _inherit(H._AssertionError, P.AssertionError);
     _inherit(P.MapBase, P.MapMixin);
@@ -7899,8 +7127,8 @@
     _inherit(P._JsonMapKeyIterable, H.ListIterable);
     _inherit(P.Converter, P.StreamTransformerBase);
     _inherit(P.JsonCyclicError, P.JsonUnsupportedObjectError);
-    _inheritMany(P.Codec, [P.JsonCodec, N.HexCodec]);
-    _inheritMany(P.Converter, [P.JsonEncoder, P.JsonDecoder, R.HexEncoder]);
+    _inherit(P.JsonCodec, P.Codec);
+    _inheritMany(P.Converter, [P.JsonEncoder, P.JsonDecoder]);
     _inherit(P._JsonStringStringifier, P._JsonStringifier);
     _inheritMany(P.ArgumentError, [P.RangeError, P.IndexError]);
     _inheritMany(W.EventTarget, [W.Node, W.EventSource, W.HttpRequestEventTarget]);
@@ -7919,7 +7147,6 @@
     _mixin(H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin, P.ListMixin);
     _mixin(H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin, H.FixedLengthListMixin);
     _mixin(P._AsyncStreamController, P._AsyncStreamControllerDispatch);
-    _mixin(P._UnmodifiableMapView_MapView__UnmodifiableMapMixin, P._UnmodifiableMapMixin);
   })();
   var init = {
     typeUniverse: {eC: new Map(), tR: {}, eT: {}, tPV: {}, sEA: []},
@@ -7927,40 +7154,31 @@
     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*)"],
+    types: ["~()", "Null()", "~(@)", "~(~())", "@(@)", "Null(@)", "~(Object,StackTrace)", "~(Object?,Object?)", "String(int)", "~(Event*)", "Null(Event*)", "String*(int*,int*)", "@(@,String)", "@(String)", "Null(~())", "Null(@,StackTrace)", "~(int,@)", "~(Object[StackTrace?])", "Null(Object,StackTrace)", "_Future<@>(@)", "~(ProgressEvent)", "~(Event)", "@(@,@)", "~(@,@)", "Logger*()", "~(String*)", "int*(int*)", "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}'));
+  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":[]},"LateError":{"Error":[]},"NotNullableError":{"Error":[]},"EfficientLengthIterable":{"Iterable":["1"]},"ListIterable":{"Iterable":["1"]},"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"]},"_JsonMap":{"MapMixin":["String","@"],"Map":["String","@"],"MapMixin.K":"String","MapMixin.V":"@"},"_JsonMapKeyIterable":{"ListIterable":["String"],"Iterable":["String"],"ListIterable.E":"String"},"JsonUnsupportedObjectError":{"Error":[]},"JsonCyclicError":{"Error":[]},"JsonEncoder":{"Converter":["Object?","String"]},"JsonDecoder":{"Converter":["String","Object?"]},"double":{"num":[]},"int":{"num":[]},"String":{"Pattern":[]},"AssertionError":{"Error":[]},"TypeError":{"Error":[]},"NullThrownError":{"Error":[]},"ArgumentError":{"Error":[]},"RangeError":{"Error":[]},"IndexError":{"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":[]}}'));
+  H._Universe_addErasedTypes(init.typeUniverse, JSON.parse('{"EfficientLengthIterable":1,"NativeTypedArray":1,"StreamTransformerBase":2,"MapBase":2,"Codec":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*>"),
+      JsLinkedHashMap_of_legacy_String_and_legacy_Logger: findType("JsLinkedHashMap<String*,Logger*>"),
       List_dynamic: findType("List<@>"),
       Map_dynamic_dynamic: findType("Map<@,@>"),
       Null: findType("Null"),
@@ -7968,7 +7186,6 @@
       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*>"),
@@ -7987,12 +7204,6 @@
       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&*"),
@@ -8019,12 +7230,10 @@
     };
   })();
   (function constants() {
-    var makeConstList = hunkHelpers.makeConstList;
     C.EventSource_methods = W.EventSource.prototype;
     C.HttpRequest_methods = W.HttpRequest.prototype;
     C.Interceptor_methods = J.Interceptor.prototype;
     C.JSArray_methods = J.JSArray.prototype;
-    C.JSDouble_methods = J.JSDouble.prototype;
     C.JSInt_methods = J.JSInt.prototype;
     C.JSNull_methods = J.JSNull.prototype;
     C.JSNumber_methods = J.JSNumber.prototype;
@@ -8032,8 +7241,6 @@
     C.JavaScriptFunction_methods = J.JavaScriptFunction.prototype;
     C.PlainJavaScriptObject_methods = J.PlainJavaScriptObject.prototype;
     C.UnknownJavaScriptObject_methods = J.UnknownJavaScriptObject.prototype;
-    C.C_HexCodec = new N.HexCodec();
-    C.C_HexEncoder = new R.HexEncoder();
     C.C_JS_CONST = function getTagFallback(o) {
   var s = Object.prototype.toString.call(o);
   return s.substring(8, s.length - 1);
@@ -8158,20 +7365,15 @@
     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 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");
+    C.Level_INFO_800 = new N.Level("INFO", 800);
+    C.Level_SEVERE_1000 = new N.Level("SEVERE", 1000);
+    C.Level_WARNING_900 = new N.Level("WARNING", 900);
   })();
   (function staticFields() {
     $._JS_INTEROP_INTERCEPTOR_TAG = null;
@@ -8190,8 +7392,8 @@
     $._isInCallbackLoop = false;
     $.Zone__current = C.C__RootZone;
     $._toStringVisiting = H.setRuntimeTypeInfo([], H.findType("JSArray<Object>"));
+    $.Logger__loggers = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, H.findType("Logger*"));
     $.LogRecord__nextNumber = 0;
-    $.Logger__loggers = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_Logger);
   })();
   (function lazyInitializers() {
     var _lazyFinal = hunkHelpers.lazyFinal,
@@ -8276,7 +7478,7 @@
       return new Error().stack != void 0;
     });
     _lazyOld($, "Logger_root", "$get$Logger_root", function() {
-      return F.Logger_Logger("");
+      return N.Logger_Logger("");
     });
   })();
   (function nativeSupport() {
