// Generated by dart2js (NullSafetyMode.unsound, no-legacy-javascript, new-holders, csp), the Dart to JavaScript compiler version: 2.16.0-80.0.dev.
// The code supports the following hooks:
// dartPrint(message):
//    if this function is defined it is called instead of the Dart [print]
//    method.
//
// dartMainRunner(main, args):
//    if this function is defined, the Dart [main] method will not be invoked
//    directly. Instead, a closure that will invoke [main], and its arguments
//    [args] is passed to [dartMainRunner].
//
// dartDeferredLibraryLoader(uri, successCallback, errorCallback, loadId):
//    if this function is defined, it will be called when a deferred library
//    is loaded. It should load and eval the javascript of `uri`, and call
//    successCallback. If it fails to do so, it should call errorCallback with
//    an error. The loadId argument is the deferred import that resulted in
//    this uri being loaded.
//
// dartCallInstrumentation(id, qualifiedName):
//    if this function is defined, it will be called at each entry of a
//    method or constructor. Used only when compiling programs with
//    --experiment-call-instrumentation.
(function dartProgram() {
  function copyProperties(from, to) {
    var keys = Object.keys(from);
    for (var i = 0; i < keys.length; i++) {
      var key = keys[i];
      to[key] = from[key];
    }
  }
  function mixinPropertiesHard(from, to) {
    var keys = Object.keys(from);
    for (var i = 0; i < keys.length; i++) {
      var key = keys[i];
      if (!to.hasOwnProperty(key))
        to[key] = from[key];
    }
  }
  function mixinPropertiesEasy(from, to) {
    Object.assign(to, from);
  }
  var supportsDirectProtoAccess = function() {
    var cls = function() {
    };
    cls.prototype = {p: {}};
    var object = new cls();
    if (!(object.__proto__ && object.__proto__.p === cls.prototype.p))
      return false;
    try {
      if (typeof navigator != "undefined" && typeof navigator.userAgent == "string" && navigator.userAgent.indexOf("Chrome/") >= 0)
        return true;
      if (typeof version == "function" && version.length == 0) {
        var v = version();
        if (/^\d+\.\d+\.\d+\.\d+$/.test(v))
          return true;
      }
    } catch (_) {
    }
    return false;
  }();
  function setFunctionNamesIfNecessary(holders) {
    function t() {
    }
    ;
    if (typeof t.name == "string")
      return;
    for (var i = 0; i < holders.length; i++) {
      var holder = holders[i];
      var keys = Object.keys(holder);
      for (var j = 0; j < keys.length; j++) {
        var key = keys[j];
        var f = holder[key];
        if (typeof f == "function")
          f.name = key;
      }
    }
  }
  function inherit(cls, sup) {
    cls.prototype.constructor = cls;
    cls.prototype["$is" + cls.name] = cls;
    if (sup != null) {
      if (supportsDirectProtoAccess) {
        cls.prototype.__proto__ = sup.prototype;
        return;
      }
      var clsPrototype = Object.create(sup.prototype);
      copyProperties(cls.prototype, clsPrototype);
      cls.prototype = clsPrototype;
    }
  }
  function inheritMany(sup, classes) {
    for (var i = 0; i < classes.length; i++)
      inherit(classes[i], sup);
  }
  function mixinEasy(cls, mixin) {
    mixinPropertiesEasy(mixin.prototype, cls.prototype);
    cls.prototype.constructor = cls;
  }
  function mixinHard(cls, mixin) {
    mixinPropertiesHard(mixin.prototype, cls.prototype);
    cls.prototype.constructor = cls;
  }
  function lazyOld(holder, name, getterName, initializer) {
    var uninitializedSentinel = holder;
    holder[name] = uninitializedSentinel;
    holder[getterName] = function() {
      holder[getterName] = function() {
        A.throwCyclicInit(name);
      };
      var result;
      var sentinelInProgress = initializer;
      try {
        if (holder[name] === uninitializedSentinel) {
          result = holder[name] = sentinelInProgress;
          result = holder[name] = initializer();
        } else
          result = holder[name];
      } finally {
        if (result === sentinelInProgress)
          holder[name] = null;
        holder[getterName] = function() {
          return this[name];
        };
      }
      return result;
    };
  }
  function lazy(holder, name, getterName, initializer) {
    var uninitializedSentinel = holder;
    holder[name] = uninitializedSentinel;
    holder[getterName] = function() {
      if (holder[name] === uninitializedSentinel)
        holder[name] = initializer();
      holder[getterName] = function() {
        return this[name];
      };
      return holder[name];
    };
  }
  function lazyFinal(holder, name, getterName, initializer) {
    var uninitializedSentinel = holder;
    holder[name] = uninitializedSentinel;
    holder[getterName] = function() {
      if (holder[name] === uninitializedSentinel) {
        var value = initializer();
        if (holder[name] !== uninitializedSentinel)
          A.throwLateFieldADI(name);
        holder[name] = value;
      }
      var finalValue = holder[name];
      holder[getterName] = function() {
        return finalValue;
      };
      return finalValue;
    };
  }
  function makeConstList(list) {
    list.immutable$list = Array;
    list.fixed$length = Array;
    return list;
  }
  function convertToFastObject(properties) {
    function t() {
    }
    t.prototype = properties;
    new t();
    return properties;
  }
  function convertAllToFastObject(arrayOfObjects) {
    for (var i = 0; i < arrayOfObjects.length; ++i)
      convertToFastObject(arrayOfObjects[i]);
  }
  var functionCounter = 0;
  function instanceTearOffGetter(isIntercepted, parameters) {
    var cache = null;
    return isIntercepted ? function(receiver) {
      if (cache === null)
        cache = A.closureFromTearOff(parameters);
      return new cache(receiver, this);
    } : function() {
      if (cache === null)
        cache = A.closureFromTearOff(parameters);
      return new cache(this, null);
    };
  }
  function staticTearOffGetter(parameters) {
    var cache = null;
    return function() {
      if (cache === null)
        cache = A.closureFromTearOff(parameters).prototype;
      return cache;
    };
  }
  var typesOffset = 0;
  function tearOffParameters(container, isStatic, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex, needsDirectAccess) {
    if (typeof funType == "number")
      funType += typesOffset;
    return {co: container, iS: isStatic, iI: isIntercepted, rC: requiredParameterCount, dV: optionalParameterDefaultValues, cs: callNames, fs: funsOrNames, fT: funType, aI: applyIndex || 0, nDA: needsDirectAccess};
  }
  function installStaticTearOff(holder, getterName, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex) {
    var parameters = tearOffParameters(holder, true, false, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex, false);
    var getterFunction = staticTearOffGetter(parameters);
    holder[getterName] = getterFunction;
  }
  function installInstanceTearOff(prototype, getterName, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex, needsDirectAccess) {
    isIntercepted = !!isIntercepted;
    var parameters = tearOffParameters(prototype, false, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex, !!needsDirectAccess);
    var getterFunction = instanceTearOffGetter(isIntercepted, parameters);
    prototype[getterName] = getterFunction;
  }
  function setOrUpdateInterceptorsByTag(newTags) {
    var tags = init.interceptorsByTag;
    if (!tags) {
      init.interceptorsByTag = newTags;
      return;
    }
    copyProperties(newTags, tags);
  }
  function setOrUpdateLeafTags(newTags) {
    var tags = init.leafTags;
    if (!tags) {
      init.leafTags = newTags;
      return;
    }
    copyProperties(newTags, tags);
  }
  function updateTypes(newTypes) {
    var types = init.types;
    var length = types.length;
    types.push.apply(types, newTypes);
    return length;
  }
  function updateHolder(holder, newHolder) {
    copyProperties(newHolder, holder);
    return holder;
  }
  var hunkHelpers = function() {
    var mkInstance = function(isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, applyIndex) {
        return function(container, getterName, name, funType) {
          return installInstanceTearOff(container, getterName, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, [name], funType, applyIndex, false);
        };
      },
      mkStatic = function(requiredParameterCount, optionalParameterDefaultValues, callNames, applyIndex) {
        return function(container, getterName, name, funType) {
          return installStaticTearOff(container, getterName, requiredParameterCount, optionalParameterDefaultValues, callNames, [name], funType, applyIndex);
        };
      };
    return {inherit: inherit, inheritMany: inheritMany, mixin: mixinEasy, mixinHard: mixinHard, installStaticTearOff: installStaticTearOff, installInstanceTearOff: installInstanceTearOff, _instance_0u: mkInstance(0, 0, null, ["call$0"], 0), _instance_1u: mkInstance(0, 1, null, ["call$1"], 0), _instance_2u: mkInstance(0, 2, null, ["call$2"], 0), _instance_0i: mkInstance(1, 0, null, ["call$0"], 0), _instance_1i: mkInstance(1, 1, null, ["call$1"], 0), _instance_2i: mkInstance(1, 2, null, ["call$2"], 0), _static_0: mkStatic(0, null, ["call$0"], 0), _static_1: mkStatic(1, null, ["call$1"], 0), _static_2: mkStatic(2, null, ["call$2"], 0), makeConstList: makeConstList, lazy: lazy, lazyFinal: lazyFinal, lazyOld: lazyOld, updateHolder: updateHolder, convertToFastObject: convertToFastObject, setFunctionNamesIfNecessary: setFunctionNamesIfNecessary, updateTypes: updateTypes, setOrUpdateInterceptorsByTag: setOrUpdateInterceptorsByTag, setOrUpdateLeafTags: setOrUpdateLeafTags};
  }();
  function initializeDeferredHunk(hunk) {
    typesOffset = init.types.length;
    hunk(hunkHelpers, init, holders, $);
  }
  var A = {JS_CONST: function JS_CONST() {
    },
    CastIterable_CastIterable(source, $S, $T) {
      if ($S._eval$1("EfficientLengthIterable<0>")._is(source))
        return new A._EfficientLengthCastIterable(source, $S._eval$1("@<0>")._bind$1($T)._eval$1("_EfficientLengthCastIterable<1,2>"));
      return new A.CastIterable(source, $S._eval$1("@<0>")._bind$1($T)._eval$1("CastIterable<1,2>"));
    },
    LateError$fieldADI(fieldName) {
      return new A.LateError("Field '" + A.S(fieldName) + "' has been assigned during initialization.");
    },
    LateError$fieldNI(fieldName) {
      return new A.LateError("Field '" + fieldName + "' has not been initialized.");
    },
    ReachabilityError$(_message) {
      return new A.ReachabilityError(_message);
    },
    hexDigitValue(char) {
      var letter,
        digit = char ^ 48;
      if (digit <= 9)
        return digit;
      letter = char | 32;
      if (97 <= letter && letter <= 102)
        return letter - 87;
      return -1;
    },
    SystemHash_combine(hash, value) {
      if (typeof hash !== "number")
        return hash.$add();
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    SystemHash_finish(hash) {
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    checkNotNullable(value, $name, $T) {
      if (value == null)
        throw A.wrapException(new A.NotNullableError($name, $T._eval$1("NotNullableError<0>")));
      return value;
    },
    SubListIterable$(_iterable, _start, _endOrLength, $E) {
      A.RangeError_checkNotNegative(_start, "start");
      if (_endOrLength != null) {
        A.RangeError_checkNotNegative(_endOrLength, "end");
        if (_start > _endOrLength)
          A.throwExpression(A.RangeError$range(_start, 0, _endOrLength, "start", null));
      }
      return new A.SubListIterable(_iterable, _start, _endOrLength, $E._eval$1("SubListIterable<0>"));
    },
    MappedIterable_MappedIterable(iterable, $function, $S, $T) {
      if (type$.EfficientLengthIterable_dynamic._is(iterable))
        return new A.EfficientLengthMappedIterable(iterable, $function, $S._eval$1("@<0>")._bind$1($T)._eval$1("EfficientLengthMappedIterable<1,2>"));
      return new A.MappedIterable(iterable, $function, $S._eval$1("@<0>")._bind$1($T)._eval$1("MappedIterable<1,2>"));
    },
    SkipIterable_SkipIterable(iterable, count, $E) {
      if (type$.EfficientLengthIterable_dynamic._is(iterable)) {
        A.RangeError_checkNotNegative(count, "count");
        return new A.EfficientLengthSkipIterable(iterable, count, $E._eval$1("EfficientLengthSkipIterable<0>"));
      }
      A.RangeError_checkNotNegative(count, "count");
      return new A.SkipIterable(iterable, count, $E._eval$1("SkipIterable<0>"));
    },
    IterableElementError_noElement() {
      return new A.StateError("No element");
    },
    IterableElementError_tooMany() {
      return new A.StateError("Too many elements");
    },
    IterableElementError_tooFew() {
      return new A.StateError("Too few elements");
    },
    Sort_sort(a, compare, $E) {
      A.Sort__doSort(a, 0, J.get$length$asx(a) - 1, compare, $E);
    },
    Sort__doSort(a, left, right, compare, $E) {
      if (right - left <= 32)
        A.Sort__insertionSort(a, left, right, compare, $E);
      else
        A.Sort__dualPivotQuicksort(a, left, right, compare, $E);
    },
    Sort__insertionSort(a, left, right, compare, $E) {
      var i, t1, el, j, t2, j0;
      for (i = left + 1, t1 = J.getInterceptor$asx(a); i <= right; ++i) {
        el = t1.$index(a, i);
        j = i;
        while (true) {
          if (j > left) {
            t2 = compare.call$2(t1.$index(a, j - 1), el);
            if (typeof t2 !== "number")
              return t2.$gt();
            t2 = t2 > 0;
          } else
            t2 = false;
          if (!t2)
            break;
          j0 = j - 1;
          t1.$indexSet(a, j, t1.$index(a, j0));
          j = j0;
        }
        t1.$indexSet(a, j, el);
      }
    },
    Sort__dualPivotQuicksort(a, left, right, compare, $E) {
      var t0, less, great, k, ak, comp, great0, less0, pivots_are_equal, comp_pivot1, comp_pivot2,
        sixth = B.JSInt_methods._tdivFast$1(right - left + 1, 6),
        index1 = left + sixth,
        index5 = right - sixth,
        index3 = B.JSInt_methods._tdivFast$1(left + right, 2),
        index2 = index3 - sixth,
        index4 = index3 + sixth,
        t1 = J.getInterceptor$asx(a),
        el1 = t1.$index(a, index1),
        el2 = t1.$index(a, index2),
        el3 = t1.$index(a, index3),
        el4 = t1.$index(a, index4),
        el5 = t1.$index(a, index5),
        t2 = compare.call$2(el1, el2);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el2;
        el2 = el1;
        el1 = t0;
      }
      t2 = compare.call$2(el4, el5);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el5;
        el5 = el4;
        el4 = t0;
      }
      t2 = compare.call$2(el1, el3);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el3;
        el3 = el1;
        el1 = t0;
      }
      t2 = compare.call$2(el2, el3);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el3;
        el3 = el2;
        el2 = t0;
      }
      t2 = compare.call$2(el1, el4);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el4;
        el4 = el1;
        el1 = t0;
      }
      t2 = compare.call$2(el3, el4);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el4;
        el4 = el3;
        el3 = t0;
      }
      t2 = compare.call$2(el2, el5);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el5;
        el5 = el2;
        el2 = t0;
      }
      t2 = compare.call$2(el2, el3);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el3;
        el3 = el2;
        el2 = t0;
      }
      t2 = compare.call$2(el4, el5);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el5;
        el5 = el4;
        el4 = t0;
      }
      t1.$indexSet(a, index1, el1);
      t1.$indexSet(a, index3, el3);
      t1.$indexSet(a, index5, el5);
      t1.$indexSet(a, index2, t1.$index(a, left));
      t1.$indexSet(a, index4, t1.$index(a, right));
      less = left + 1;
      great = right - 1;
      if (J.$eq$(compare.call$2(el2, el4), 0)) {
        for (k = less; k <= great; ++k) {
          ak = t1.$index(a, k);
          comp = compare.call$2(ak, el2);
          if (comp === 0)
            continue;
          if (typeof comp !== "number")
            return comp.$lt();
          if (comp < 0) {
            if (k !== less) {
              t1.$indexSet(a, k, t1.$index(a, less));
              t1.$indexSet(a, less, ak);
            }
            ++less;
          } else
            for (; true;) {
              comp = compare.call$2(t1.$index(a, great), el2);
              if (typeof comp !== "number")
                return comp.$gt();
              if (comp > 0) {
                --great;
                continue;
              } else {
                great0 = great - 1;
                if (comp < 0) {
                  t1.$indexSet(a, k, t1.$index(a, less));
                  less0 = less + 1;
                  t1.$indexSet(a, less, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                  great = great0;
                  less = less0;
                  break;
                } else {
                  t1.$indexSet(a, k, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                  great = great0;
                  break;
                }
              }
            }
        }
        pivots_are_equal = true;
      } else {
        for (k = less; k <= great; ++k) {
          ak = t1.$index(a, k);
          comp_pivot1 = compare.call$2(ak, el2);
          if (typeof comp_pivot1 !== "number")
            return comp_pivot1.$lt();
          if (comp_pivot1 < 0) {
            if (k !== less) {
              t1.$indexSet(a, k, t1.$index(a, less));
              t1.$indexSet(a, less, ak);
            }
            ++less;
          } else {
            comp_pivot2 = compare.call$2(ak, el4);
            if (typeof comp_pivot2 !== "number")
              return comp_pivot2.$gt();
            if (comp_pivot2 > 0)
              for (; true;) {
                comp = compare.call$2(t1.$index(a, great), el4);
                if (typeof comp !== "number")
                  return comp.$gt();
                if (comp > 0) {
                  --great;
                  if (great < k)
                    break;
                  continue;
                } else {
                  comp = compare.call$2(t1.$index(a, great), el2);
                  if (typeof comp !== "number")
                    return comp.$lt();
                  great0 = great - 1;
                  if (comp < 0) {
                    t1.$indexSet(a, k, t1.$index(a, less));
                    less0 = less + 1;
                    t1.$indexSet(a, less, t1.$index(a, great));
                    t1.$indexSet(a, great, ak);
                    less = less0;
                  } else {
                    t1.$indexSet(a, k, t1.$index(a, great));
                    t1.$indexSet(a, great, ak);
                  }
                  great = great0;
                  break;
                }
              }
          }
        }
        pivots_are_equal = false;
      }
      t2 = less - 1;
      t1.$indexSet(a, left, t1.$index(a, t2));
      t1.$indexSet(a, t2, el2);
      t2 = great + 1;
      t1.$indexSet(a, right, t1.$index(a, t2));
      t1.$indexSet(a, t2, el4);
      A.Sort__doSort(a, left, less - 2, compare, $E);
      A.Sort__doSort(a, great + 2, right, compare, $E);
      if (pivots_are_equal)
        return;
      if (less < index1 && great > index5) {
        for (; J.$eq$(compare.call$2(t1.$index(a, less), el2), 0);)
          ++less;
        for (; J.$eq$(compare.call$2(t1.$index(a, great), el4), 0);)
          --great;
        for (k = less; k <= great; ++k) {
          ak = t1.$index(a, k);
          if (compare.call$2(ak, el2) === 0) {
            if (k !== less) {
              t1.$indexSet(a, k, t1.$index(a, less));
              t1.$indexSet(a, less, ak);
            }
            ++less;
          } else if (compare.call$2(ak, el4) === 0)
            for (; true;)
              if (compare.call$2(t1.$index(a, great), el4) === 0) {
                --great;
                if (great < k)
                  break;
                continue;
              } else {
                comp = compare.call$2(t1.$index(a, great), el2);
                if (typeof comp !== "number")
                  return comp.$lt();
                great0 = great - 1;
                if (comp < 0) {
                  t1.$indexSet(a, k, t1.$index(a, less));
                  less0 = less + 1;
                  t1.$indexSet(a, less, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                  less = less0;
                } else {
                  t1.$indexSet(a, k, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                }
                great = great0;
                break;
              }
        }
        A.Sort__doSort(a, less, great, compare, $E);
      } else
        A.Sort__doSort(a, less, great, compare, $E);
    },
    _CastIterableBase: function _CastIterableBase() {
    },
    CastIterator: function CastIterator(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    CastIterable: function CastIterable(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    _EfficientLengthCastIterable: function _EfficientLengthCastIterable(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    _CastListBase: function _CastListBase() {
    },
    _CastListBase_sort_closure: function _CastListBase_sort_closure(t0, t1) {
      this.$this = t0;
      this.compare = t1;
    },
    CastList: function CastList(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    CastMap: function CastMap(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    CastMap_forEach_closure: function CastMap_forEach_closure(t0, t1) {
      this.$this = t0;
      this.f = t1;
    },
    LateError: function LateError(t0) {
      this._message = t0;
    },
    ReachabilityError: function ReachabilityError(t0) {
      this._message = t0;
    },
    nullFuture_closure: function nullFuture_closure() {
    },
    SentinelValue: function SentinelValue() {
    },
    NotNullableError: function NotNullableError(t0, t1) {
      this._name = t0;
      this.$ti = t1;
    },
    EfficientLengthIterable: function EfficientLengthIterable() {
    },
    ListIterable: function ListIterable() {
    },
    SubListIterable: function SubListIterable(t0, t1, t2, t3) {
      var _ = this;
      _.__internal$_iterable = t0;
      _.__internal$_start = t1;
      _._endOrLength = t2;
      _.$ti = t3;
    },
    ListIterator: function ListIterator(t0, t1, t2) {
      var _ = this;
      _.__internal$_iterable = t0;
      _.__internal$_length = t1;
      _.__internal$_index = 0;
      _.__internal$_current = null;
      _.$ti = t2;
    },
    MappedIterable: function MappedIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._f = t1;
      this.$ti = t2;
    },
    EfficientLengthMappedIterable: function EfficientLengthMappedIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._f = t1;
      this.$ti = t2;
    },
    MappedIterator: function MappedIterator(t0, t1, t2) {
      var _ = this;
      _.__internal$_current = null;
      _._iterator = t0;
      _._f = t1;
      _.$ti = t2;
    },
    MappedListIterable: function MappedListIterable(t0, t1, t2) {
      this.__internal$_source = t0;
      this._f = t1;
      this.$ti = t2;
    },
    WhereIterable: function WhereIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._f = t1;
      this.$ti = t2;
    },
    WhereIterator: function WhereIterator(t0, t1, t2) {
      this._iterator = t0;
      this._f = t1;
      this.$ti = t2;
    },
    SkipIterable: function SkipIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._skipCount = t1;
      this.$ti = t2;
    },
    EfficientLengthSkipIterable: function EfficientLengthSkipIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._skipCount = t1;
      this.$ti = t2;
    },
    SkipIterator: function SkipIterator(t0, t1, t2) {
      this._iterator = t0;
      this._skipCount = t1;
      this.$ti = t2;
    },
    EmptyIterable: function EmptyIterable(t0) {
      this.$ti = t0;
    },
    EmptyIterator: function EmptyIterator(t0) {
      this.$ti = t0;
    },
    FixedLengthListMixin: function FixedLengthListMixin() {
    },
    UnmodifiableListMixin: function UnmodifiableListMixin() {
    },
    UnmodifiableListBase: function UnmodifiableListBase() {
    },
    ReversedListIterable: function ReversedListIterable(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    Symbol: function Symbol(t0) {
      this._name = t0;
    },
    __CastListBase__CastIterableBase_ListMixin: function __CastListBase__CastIterableBase_ListMixin() {
    },
    ConstantMap__throwUnmodifiable() {
      throw A.wrapException(A.UnsupportedError$("Cannot modify unmodifiable Map"));
    },
    unminifyOrTag(rawClassName) {
      var preserved = init.mangledGlobalNames[rawClassName];
      if (preserved != null)
        return preserved;
      return rawClassName;
    },
    isJsIndexable(object, record) {
      var result;
      if (record != null) {
        result = record.x;
        if (result != null)
          return result;
      }
      return type$.JavaScriptIndexingBehavior_dynamic._is(object);
    },
    S(value) {
      var result;
      if (typeof value == "string")
        return value;
      if (typeof value == "number") {
        if (value !== 0)
          return "" + value;
      } else if (true === value)
        return "true";
      else if (false === value)
        return "false";
      else if (value == null)
        return "null";
      result = J.toString$0$(value);
      if (typeof result != "string")
        throw A.wrapException(A.ArgumentError$value(value, "object", "toString method returned 'null'"));
      return result;
    },
    Primitives_objectHashCode(object) {
      var hash,
        property = $.Primitives__identityHashCodeProperty;
      if (property == null) {
        property = Symbol("identityHashCode");
        $.Primitives__identityHashCodeProperty = property;
      }
      hash = object[property];
      if (hash == null) {
        hash = Math.random() * 0x3fffffff | 0;
        object[property] = hash;
      }
      return hash;
    },
    Primitives_parseInt(source, radix) {
      var match, decimalMatch, maxCharCode, digitsPart, t1, i, _null = null;
      if (typeof source != "string")
        A.throwExpression(A.argumentErrorValue(source));
      match = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(source);
      if (match == null)
        return _null;
      if (3 >= match.length)
        return A.ioore(match, 3);
      decimalMatch = match[3];
      if (radix == null) {
        if (decimalMatch != null)
          return parseInt(source, 10);
        if (match[2] != null)
          return parseInt(source, 16);
        return _null;
      }
      if (radix < 2 || radix > 36)
        throw A.wrapException(A.RangeError$range(radix, 2, 36, "radix", _null));
      if (radix === 10 && decimalMatch != null)
        return parseInt(source, 10);
      if (radix < 10 || decimalMatch == null) {
        maxCharCode = radix <= 10 ? 47 + radix : 86 + radix;
        digitsPart = match[1];
        for (t1 = digitsPart.length, i = 0; i < t1; ++i)
          if ((B.JSString_methods._codeUnitAt$1(digitsPart, i) | 32) > maxCharCode)
            return _null;
      }
      return parseInt(source, radix);
    },
    Primitives_objectTypeName(object) {
      return A.Primitives__objectTypeNameNewRti(object);
    },
    Primitives__objectTypeNameNewRti(object) {
      var dispatchName, t1, $constructor, constructorName;
      if (object instanceof A.Object)
        return A._rtiToString(A.instanceType(object), null);
      if (J.getInterceptor$(object) === B.Interceptor_methods || type$.UnknownJavaScriptObject._is(object)) {
        dispatchName = B.C_JS_CONST(object);
        t1 = dispatchName !== "Object" && dispatchName !== "";
        if (t1)
          return dispatchName;
        $constructor = object.constructor;
        if (typeof $constructor == "function") {
          constructorName = $constructor.name;
          if (typeof constructorName == "string")
            t1 = constructorName !== "Object" && constructorName !== "";
          else
            t1 = false;
          if (t1)
            return constructorName;
        }
      }
      return A._rtiToString(A.instanceType(object), null);
    },
    Primitives__fromCharCodeApply(array) {
      var result, i, i0, chunkEnd,
        end = array.length;
      if (end <= 500)
        return String.fromCharCode.apply(null, array);
      for (result = "", i = 0; i < end; i = i0) {
        i0 = i + 500;
        chunkEnd = i0 < end ? i0 : end;
        result += String.fromCharCode.apply(null, array.slice(i, chunkEnd));
      }
      return result;
    },
    Primitives_stringFromCodePoints(codePoints) {
      var t1, _i, i,
        a = A._setArrayType([], type$.JSArray_int);
      for (t1 = codePoints.length, _i = 0; _i < codePoints.length; codePoints.length === t1 || (0, A.throwConcurrentModificationError)(codePoints), ++_i) {
        i = codePoints[_i];
        if (!A._isInt(i))
          throw A.wrapException(A.argumentErrorValue(i));
        if (i <= 65535)
          B.JSArray_methods.add$1(a, i);
        else if (i <= 1114111) {
          B.JSArray_methods.add$1(a, 55296 + (B.JSInt_methods._shrOtherPositive$1(i - 65536, 10) & 1023));
          B.JSArray_methods.add$1(a, 56320 + (i & 1023));
        } else
          throw A.wrapException(A.argumentErrorValue(i));
      }
      return A.Primitives__fromCharCodeApply(a);
    },
    Primitives_stringFromCharCodes(charCodes) {
      var t1, _i, i;
      for (t1 = charCodes.length, _i = 0; _i < t1; ++_i) {
        i = charCodes[_i];
        if (!A._isInt(i))
          throw A.wrapException(A.argumentErrorValue(i));
        if (i < 0)
          throw A.wrapException(A.argumentErrorValue(i));
        if (i > 65535)
          return A.Primitives_stringFromCodePoints(charCodes);
      }
      return A.Primitives__fromCharCodeApply(charCodes);
    },
    Primitives_stringFromNativeUint8List(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(charCode) {
      var bits;
      if (0 <= charCode) {
        if (charCode <= 65535)
          return String.fromCharCode(charCode);
        if (charCode <= 1114111) {
          bits = charCode - 65536;
          return String.fromCharCode((B.JSInt_methods._shrOtherPositive$1(bits, 10) | 55296) >>> 0, bits & 1023 | 56320);
        }
      }
      throw A.wrapException(A.RangeError$range(charCode, 0, 1114111, null, null));
    },
    Primitives_lazyAsJsDate(receiver) {
      if (receiver.date === void 0)
        receiver.date = new Date(receiver._value);
      return receiver.date;
    },
    Primitives_getYear(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCFullYear() + 0 : A.Primitives_lazyAsJsDate(receiver).getFullYear() + 0;
    },
    Primitives_getMonth(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCMonth() + 1 : A.Primitives_lazyAsJsDate(receiver).getMonth() + 1;
    },
    Primitives_getDay(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCDate() + 0 : A.Primitives_lazyAsJsDate(receiver).getDate() + 0;
    },
    Primitives_getHours(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCHours() + 0 : A.Primitives_lazyAsJsDate(receiver).getHours() + 0;
    },
    Primitives_getMinutes(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCMinutes() + 0 : A.Primitives_lazyAsJsDate(receiver).getMinutes() + 0;
    },
    Primitives_getSeconds(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCSeconds() + 0 : A.Primitives_lazyAsJsDate(receiver).getSeconds() + 0;
    },
    Primitives_getMilliseconds(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCMilliseconds() + 0 : A.Primitives_lazyAsJsDate(receiver).getMilliseconds() + 0;
    },
    Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments) {
      var $arguments, namedArgumentList, t1 = {};
      t1.argumentCount = 0;
      $arguments = [];
      namedArgumentList = [];
      t1.argumentCount = positionalArguments.length;
      B.JSArray_methods.addAll$1($arguments, positionalArguments);
      t1.names = "";
      if (namedArguments != null && !namedArguments.get$isEmpty(namedArguments))
        namedArguments.forEach$1(0, new A.Primitives_functionNoSuchMethod_closure(t1, namedArgumentList, $arguments));
      "" + t1.argumentCount;
      return J.noSuchMethod$1$($function, new A.JSInvocationMirror(B.Symbol_call, 0, $arguments, namedArgumentList, 0));
    },
    Primitives_applyFunction($function, positionalArguments, namedArguments) {
      var t1, argumentCount, jsStub;
      if (Array.isArray(positionalArguments))
        t1 = namedArguments == null || namedArguments.get$isEmpty(namedArguments);
      else
        t1 = false;
      if (t1) {
        argumentCount = positionalArguments.length;
        if (argumentCount === 0) {
          if (!!$function.call$0)
            return $function.call$0();
        } else if (argumentCount === 1) {
          if (!!$function.call$1)
            return $function.call$1(positionalArguments[0]);
        } else if (argumentCount === 2) {
          if (!!$function.call$2)
            return $function.call$2(positionalArguments[0], positionalArguments[1]);
        } else if (argumentCount === 3) {
          if (!!$function.call$3)
            return $function.call$3(positionalArguments[0], positionalArguments[1], positionalArguments[2]);
        } else if (argumentCount === 4) {
          if (!!$function.call$4)
            return $function.call$4(positionalArguments[0], positionalArguments[1], positionalArguments[2], positionalArguments[3]);
        } else if (argumentCount === 5)
          if (!!$function.call$5)
            return $function.call$5(positionalArguments[0], positionalArguments[1], positionalArguments[2], positionalArguments[3], positionalArguments[4]);
        jsStub = $function["call" + "$" + argumentCount];
        if (jsStub != null)
          return jsStub.apply($function, positionalArguments);
      }
      return A.Primitives__generalApplyFunction($function, positionalArguments, namedArguments);
    },
    Primitives__generalApplyFunction($function, positionalArguments, namedArguments) {
      var $arguments, argumentCount, requiredParameterCount, defaultValuesClosure, t1, defaultValues, interceptor, jsFunction, maxArguments, missingDefaults, keys, _i, defaultValue, used, key;
      if (positionalArguments != null)
        $arguments = Array.isArray(positionalArguments) ? positionalArguments : A.List_List$of(positionalArguments, true, type$.dynamic);
      else
        $arguments = [];
      argumentCount = $arguments.length;
      requiredParameterCount = $function.$requiredArgCount;
      if (argumentCount < requiredParameterCount)
        return A.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.get$isNotEmpty(namedArguments))
          return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        if (argumentCount === requiredParameterCount)
          return jsFunction.apply($function, $arguments);
        return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
      }
      if (Array.isArray(defaultValues)) {
        if (namedArguments != null && namedArguments.get$isNotEmpty(namedArguments))
          return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        maxArguments = requiredParameterCount + defaultValues.length;
        if (argumentCount > maxArguments)
          return A.Primitives_functionNoSuchMethod($function, $arguments, null);
        if (argumentCount < maxArguments) {
          missingDefaults = defaultValues.slice(argumentCount - requiredParameterCount);
          if ($arguments === positionalArguments)
            $arguments = A.List_List$of($arguments, true, type$.dynamic);
          B.JSArray_methods.addAll$1($arguments, missingDefaults);
        }
        return jsFunction.apply($function, $arguments);
      } else {
        if (argumentCount > requiredParameterCount)
          return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        if ($arguments === positionalArguments)
          $arguments = A.List_List$of($arguments, true, type$.dynamic);
        keys = Object.keys(defaultValues);
        if (namedArguments == null)
          for (t1 = keys.length, _i = 0; _i < keys.length; keys.length === t1 || (0, A.throwConcurrentModificationError)(keys), ++_i) {
            defaultValue = defaultValues[A._asStringS(keys[_i])];
            if (B.C__Required === defaultValue)
              return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
            B.JSArray_methods.add$1($arguments, defaultValue);
          }
        else {
          for (t1 = keys.length, used = 0, _i = 0; _i < keys.length; keys.length === t1 || (0, A.throwConcurrentModificationError)(keys), ++_i) {
            key = A._asStringS(keys[_i]);
            if (namedArguments.containsKey$1(0, key)) {
              ++used;
              B.JSArray_methods.add$1($arguments, namedArguments.$index(0, key));
            } else {
              defaultValue = defaultValues[key];
              if (B.C__Required === defaultValue)
                return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
              B.JSArray_methods.add$1($arguments, defaultValue);
            }
          }
          if (used !== namedArguments.get$length(namedArguments))
            return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        }
        return jsFunction.apply($function, $arguments);
      }
    },
    iae(argument) {
      throw A.wrapException(A.argumentErrorValue(argument));
    },
    ioore(receiver, index) {
      if (receiver == null)
        J.get$length$asx(receiver);
      throw A.wrapException(A.diagnoseIndexError(receiver, index));
    },
    diagnoseIndexError(indexable, index) {
      var $length, t1, _s5_ = "index";
      if (!A._isInt(index))
        return new A.ArgumentError(true, index, _s5_, null);
      $length = A._asIntS(J.get$length$asx(indexable));
      if (!(index < 0)) {
        if (typeof $length !== "number")
          return A.iae($length);
        t1 = index >= $length;
      } else
        t1 = true;
      if (t1)
        return A.IndexError$(index, indexable, _s5_, null, $length);
      return A.RangeError$value(index, _s5_);
    },
    diagnoseRangeError(start, end, $length) {
      if (start > $length)
        return A.RangeError$range(start, 0, $length, "start", null);
      if (end != null)
        if (end < start || end > $length)
          return A.RangeError$range(end, start, $length, "end", null);
      return new A.ArgumentError(true, end, "end", null);
    },
    argumentErrorValue(object) {
      return new A.ArgumentError(true, object, null, null);
    },
    checkNum(value) {
      if (typeof value != "number")
        throw A.wrapException(A.argumentErrorValue(value));
      return value;
    },
    wrapException(ex) {
      var wrapper, t1;
      if (ex == null)
        ex = new A.NullThrownError();
      wrapper = new Error();
      wrapper.dartException = ex;
      t1 = A.toStringWrapper;
      if ("defineProperty" in Object) {
        Object.defineProperty(wrapper, "message", {get: t1});
        wrapper.name = "";
      } else
        wrapper.toString = t1;
      return wrapper;
    },
    toStringWrapper() {
      return J.toString$0$(this.dartException);
    },
    throwExpression(ex) {
      throw A.wrapException(ex);
    },
    throwConcurrentModificationError(collection) {
      throw A.wrapException(A.ConcurrentModificationError$(collection));
    },
    TypeErrorDecoder_extractPattern(message) {
      var match, $arguments, argumentsExpr, expr, method, receiver;
      message = A.quoteStringForRegExp(message.replace(String({}), "$receiver$"));
      match = message.match(/\\\$[a-zA-Z]+\\\$/g);
      if (match == null)
        match = A._setArrayType([], type$.JSArray_String);
      $arguments = match.indexOf("\\$arguments\\$");
      argumentsExpr = match.indexOf("\\$argumentsExpr\\$");
      expr = match.indexOf("\\$expr\\$");
      method = match.indexOf("\\$method\\$");
      receiver = match.indexOf("\\$receiver\\$");
      return new A.TypeErrorDecoder(message.replace(new RegExp("\\\\\\$arguments\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$argumentsExpr\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$expr\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$method\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$receiver\\\\\\$", "g"), "((?:x|[^x])*)"), $arguments, argumentsExpr, expr, method, receiver);
    },
    TypeErrorDecoder_provokeCallErrorOn(expression) {
      return function($expr$) {
        var $argumentsExpr$ = "$arguments$";
        try {
          $expr$.$method$($argumentsExpr$);
        } catch (e) {
          return e.message;
        }
      }(expression);
    },
    TypeErrorDecoder_provokePropertyErrorOn(expression) {
      return function($expr$) {
        try {
          $expr$.$method$;
        } catch (e) {
          return e.message;
        }
      }(expression);
    },
    JsNoSuchMethodError$(_message, match) {
      var t1 = match == null,
        t2 = t1 ? null : match.method;
      return new A.JsNoSuchMethodError(_message, t2, t1 ? null : match.receiver);
    },
    unwrapException(ex) {
      if (ex == null)
        return new A.NullThrownFromJavaScriptException(ex);
      if (ex instanceof A.ExceptionAndStackTrace)
        return A.saveStackTrace(ex, ex.dartException);
      if (typeof ex !== "object")
        return ex;
      if ("dartException" in ex)
        return A.saveStackTrace(ex, ex.dartException);
      return A._unwrapNonDartException(ex);
    },
    saveStackTrace(ex, error) {
      if (type$.Error._is(error))
        if (error.$thrownJsError == null)
          error.$thrownJsError = ex;
      return error;
    },
    _unwrapNonDartException(ex) {
      var message, number, ieErrorCode, t1, nsme, notClosure, nullCall, nullLiteralCall, undefCall, undefLiteralCall, nullProperty, undefProperty, undefLiteralProperty, match, _null = null;
      if (!("message" in ex))
        return ex;
      message = ex.message;
      if ("number" in ex && typeof ex.number == "number") {
        number = ex.number;
        ieErrorCode = number & 65535;
        if ((B.JSInt_methods._shrOtherPositive$1(number, 16) & 8191) === 10)
          switch (ieErrorCode) {
            case 438:
              return A.saveStackTrace(ex, A.JsNoSuchMethodError$(A.S(message) + " (Error " + ieErrorCode + ")", _null));
            case 445:
            case 5007:
              t1 = A.S(message) + " (Error " + ieErrorCode + ")";
              return A.saveStackTrace(ex, new A.NullError(t1, _null));
          }
      }
      if (ex instanceof TypeError) {
        nsme = $.$get$TypeErrorDecoder_noSuchMethodPattern();
        notClosure = $.$get$TypeErrorDecoder_notClosurePattern();
        nullCall = $.$get$TypeErrorDecoder_nullCallPattern();
        nullLiteralCall = $.$get$TypeErrorDecoder_nullLiteralCallPattern();
        undefCall = $.$get$TypeErrorDecoder_undefinedCallPattern();
        undefLiteralCall = $.$get$TypeErrorDecoder_undefinedLiteralCallPattern();
        nullProperty = $.$get$TypeErrorDecoder_nullPropertyPattern();
        $.$get$TypeErrorDecoder_nullLiteralPropertyPattern();
        undefProperty = $.$get$TypeErrorDecoder_undefinedPropertyPattern();
        undefLiteralProperty = $.$get$TypeErrorDecoder_undefinedLiteralPropertyPattern();
        match = nsme.matchTypeError$1(message);
        if (match != null)
          return A.saveStackTrace(ex, A.JsNoSuchMethodError$(A._asStringS(message), match));
        else {
          match = notClosure.matchTypeError$1(message);
          if (match != null) {
            match.method = "call";
            return A.saveStackTrace(ex, A.JsNoSuchMethodError$(A._asStringS(message), match));
          } else {
            match = nullCall.matchTypeError$1(message);
            if (match == null) {
              match = nullLiteralCall.matchTypeError$1(message);
              if (match == null) {
                match = undefCall.matchTypeError$1(message);
                if (match == null) {
                  match = undefLiteralCall.matchTypeError$1(message);
                  if (match == null) {
                    match = nullProperty.matchTypeError$1(message);
                    if (match == null) {
                      match = nullLiteralCall.matchTypeError$1(message);
                      if (match == null) {
                        match = undefProperty.matchTypeError$1(message);
                        if (match == null) {
                          match = undefLiteralProperty.matchTypeError$1(message);
                          t1 = match != null;
                        } else
                          t1 = true;
                      } else
                        t1 = true;
                    } else
                      t1 = true;
                  } else
                    t1 = true;
                } else
                  t1 = true;
              } else
                t1 = true;
            } else
              t1 = true;
            if (t1) {
              A._asStringS(message);
              return A.saveStackTrace(ex, new A.NullError(message, match == null ? _null : match.method));
            }
          }
        }
        return A.saveStackTrace(ex, new A.UnknownJsTypeError(typeof message == "string" ? message : ""));
      }
      if (ex instanceof RangeError) {
        if (typeof message == "string" && message.indexOf("call stack") !== -1)
          return new A.StackOverflowError();
        message = function(ex) {
          try {
            return String(ex);
          } catch (e) {
          }
          return null;
        }(ex);
        return A.saveStackTrace(ex, new A.ArgumentError(false, _null, _null, typeof message == "string" ? message.replace(/^RangeError:\s*/, "") : message));
      }
      if (typeof InternalError == "function" && ex instanceof InternalError)
        if (typeof message == "string" && message === "too much recursion")
          return new A.StackOverflowError();
      return ex;
    },
    getTraceFromException(exception) {
      var trace;
      if (exception instanceof A.ExceptionAndStackTrace)
        return exception.stackTrace;
      if (exception == null)
        return new A._StackTrace(exception);
      trace = exception.$cachedTrace;
      if (trace != null)
        return trace;
      return exception.$cachedTrace = new A._StackTrace(exception);
    },
    objectHashCode(object) {
      if (object == null || typeof object != "object")
        return J.get$hashCode$(object);
      else
        return A.Primitives_objectHashCode(object);
    },
    fillLiteralMap(keyValuePairs, result) {
      var index, index0, index1,
        $length = keyValuePairs.length;
      for (index = 0; index < $length; index = index1) {
        index0 = index + 1;
        index1 = index0 + 1;
        result.$indexSet(0, keyValuePairs[index], keyValuePairs[index0]);
      }
      return result;
    },
    invokeClosure(closure, numberOfArguments, arg1, arg2, arg3, arg4) {
      type$.Function._as(closure);
      switch (A._asIntS(numberOfArguments)) {
        case 0:
          return closure.call$0();
        case 1:
          return closure.call$1(arg1);
        case 2:
          return closure.call$2(arg1, arg2);
        case 3:
          return closure.call$3(arg1, arg2, arg3);
        case 4:
          return closure.call$4(arg1, arg2, arg3, arg4);
      }
      throw A.wrapException(A.Exception_Exception("Unsupported number of arguments for wrapped closure"));
    },
    convertDartClosureToJS(closure, arity) {
      var $function;
      if (closure == null)
        return null;
      $function = closure.$identity;
      if (!!$function)
        return $function;
      $function = function(closure, arity, invoke) {
        return function(a1, a2, a3, a4) {
          return invoke(closure, arity, a1, a2, a3, a4);
        };
      }(closure, arity, A.invokeClosure);
      closure.$identity = $function;
      return $function;
    },
    Closure_fromTearOff(parameters) {
      var $prototype, $constructor, t2, trampoline, applyTrampoline, i, stub, stub0, stubName, stubCallName,
        container = parameters.co,
        isStatic = parameters.iS,
        isIntercepted = parameters.iI,
        needsDirectAccess = parameters.nDA,
        applyTrampolineIndex = parameters.aI,
        funsOrNames = parameters.fs,
        callNames = parameters.cs,
        $name = funsOrNames[0],
        callName = callNames[0],
        $function = container[$name],
        t1 = parameters.fT;
      t1.toString;
      A.boolConversionCheck(isStatic);
      $prototype = isStatic ? Object.create(new A.StaticClosure().constructor.prototype) : Object.create(new A.BoundClosure(null, null).constructor.prototype);
      $prototype.$initialize = $prototype.constructor;
      if (isStatic)
        $constructor = function static_tear_off() {
          this.$initialize();
        };
      else
        $constructor = function tear_off(a, b) {
          this.$initialize(a, b);
        };
      $prototype.constructor = $constructor;
      $constructor.prototype = $prototype;
      $prototype.$_name = $name;
      $prototype.$_target = $function;
      t2 = !isStatic;
      if (t2)
        trampoline = A.Closure_forwardCallTo($name, $function, isIntercepted, needsDirectAccess);
      else {
        $prototype.$static_name = $name;
        trampoline = $function;
      }
      $prototype.$signature = A.Closure__computeSignatureFunctionNewRti(t1, isStatic, isIntercepted);
      $prototype[callName] = trampoline;
      for (applyTrampoline = trampoline, i = 1; i < funsOrNames.length; ++i) {
        stub = funsOrNames[i];
        if (typeof stub == "string") {
          stub0 = container[stub];
          stubName = stub;
          stub = stub0;
        } else
          stubName = "";
        stubCallName = callNames[i];
        if (stubCallName != null) {
          if (t2)
            stub = A.Closure_forwardCallTo(stubName, stub, isIntercepted, needsDirectAccess);
          $prototype[stubCallName] = stub;
        }
        if (i === applyTrampolineIndex)
          applyTrampoline = stub;
      }
      $prototype["call*"] = applyTrampoline;
      $prototype.$requiredArgCount = parameters.rC;
      $prototype.$defaultValues = parameters.dV;
      return $constructor;
    },
    Closure__computeSignatureFunctionNewRti(functionType, isStatic, isIntercepted) {
      if (typeof functionType == "number")
        return functionType;
      if (typeof functionType == "string") {
        if (A.boolConversionCheck(isStatic))
          throw A.wrapException("Cannot compute signature for static tearoff.");
        return function(recipe, evalOnReceiver) {
          return function() {
            return evalOnReceiver(this, recipe);
          };
        }(functionType, A.BoundClosure_evalRecipe);
      }
      throw A.wrapException("Error in functionType of tearoff");
    },
    Closure_cspForwardCall(arity, needsDirectAccess, stubName, $function) {
      var getReceiver = A.BoundClosure_receiverOf;
      switch (A.boolConversionCheck(needsDirectAccess) ? -1 : arity) {
        case 0:
          return function(entry, receiverOf) {
            return function() {
              return receiverOf(this)[entry]();
            };
          }(stubName, getReceiver);
        case 1:
          return function(entry, receiverOf) {
            return function(a) {
              return receiverOf(this)[entry](a);
            };
          }(stubName, getReceiver);
        case 2:
          return function(entry, receiverOf) {
            return function(a, b) {
              return receiverOf(this)[entry](a, b);
            };
          }(stubName, getReceiver);
        case 3:
          return function(entry, receiverOf) {
            return function(a, b, c) {
              return receiverOf(this)[entry](a, b, c);
            };
          }(stubName, getReceiver);
        case 4:
          return function(entry, receiverOf) {
            return function(a, b, c, d) {
              return receiverOf(this)[entry](a, b, c, d);
            };
          }(stubName, getReceiver);
        case 5:
          return function(entry, receiverOf) {
            return function(a, b, c, d, e) {
              return receiverOf(this)[entry](a, b, c, d, e);
            };
          }(stubName, getReceiver);
        default:
          return function(f, receiverOf) {
            return function() {
              return f.apply(receiverOf(this), arguments);
            };
          }($function, getReceiver);
      }
    },
    Closure_forwardCallTo(stubName, $function, isIntercepted, needsDirectAccess) {
      var arity, t1;
      if (A.boolConversionCheck(isIntercepted))
        return A.Closure_forwardInterceptedCallTo(stubName, $function, needsDirectAccess);
      arity = $function.length;
      t1 = A.Closure_cspForwardCall(arity, needsDirectAccess, stubName, $function);
      return t1;
    },
    Closure_cspForwardInterceptedCall(arity, needsDirectAccess, stubName, $function) {
      var getReceiver = A.BoundClosure_receiverOf,
        getInterceptor = A.BoundClosure_interceptorOf;
      switch (A.boolConversionCheck(needsDirectAccess) ? -1 : arity) {
        case 0:
          throw A.wrapException(new A.RuntimeError("Intercepted function with no arguments."));
        case 1:
          return function(entry, interceptorOf, receiverOf) {
            return function() {
              return interceptorOf(this)[entry](receiverOf(this));
            };
          }(stubName, getInterceptor, getReceiver);
        case 2:
          return function(entry, interceptorOf, receiverOf) {
            return function(a) {
              return interceptorOf(this)[entry](receiverOf(this), a);
            };
          }(stubName, getInterceptor, getReceiver);
        case 3:
          return function(entry, interceptorOf, receiverOf) {
            return function(a, b) {
              return interceptorOf(this)[entry](receiverOf(this), a, b);
            };
          }(stubName, getInterceptor, getReceiver);
        case 4:
          return function(entry, interceptorOf, receiverOf) {
            return function(a, b, c) {
              return interceptorOf(this)[entry](receiverOf(this), a, b, c);
            };
          }(stubName, getInterceptor, getReceiver);
        case 5:
          return function(entry, interceptorOf, receiverOf) {
            return function(a, b, c, d) {
              return interceptorOf(this)[entry](receiverOf(this), a, b, c, d);
            };
          }(stubName, getInterceptor, getReceiver);
        case 6:
          return function(entry, interceptorOf, receiverOf) {
            return function(a, b, c, d, e) {
              return interceptorOf(this)[entry](receiverOf(this), a, b, c, d, e);
            };
          }(stubName, getInterceptor, getReceiver);
        default:
          return function(f, interceptorOf, receiverOf) {
            return function() {
              var a = [receiverOf(this)];
              Array.prototype.push.apply(a, arguments);
              return f.apply(interceptorOf(this), a);
            };
          }($function, getInterceptor, getReceiver);
      }
    },
    Closure_forwardInterceptedCallTo(stubName, $function, needsDirectAccess) {
      var receiverField, arity, t1,
        interceptorField = $.BoundClosure__interceptorFieldNameCache;
      interceptorField == null ? $.BoundClosure__interceptorFieldNameCache = A.BoundClosure__computeFieldNamed("interceptor") : interceptorField;
      receiverField = $.BoundClosure__receiverFieldNameCache;
      receiverField == null ? $.BoundClosure__receiverFieldNameCache = A.BoundClosure__computeFieldNamed("receiver") : receiverField;
      arity = $function.length;
      t1 = A.Closure_cspForwardInterceptedCall(arity, needsDirectAccess, stubName, $function);
      return t1;
    },
    closureFromTearOff(parameters) {
      return A.Closure_fromTearOff(parameters);
    },
    BoundClosure_evalRecipe(closure, recipe) {
      return A._Universe_evalInEnvironment(init.typeUniverse, A.instanceType(closure._receiver), recipe);
    },
    BoundClosure_receiverOf(closure) {
      return closure._receiver;
    },
    BoundClosure_interceptorOf(closure) {
      return closure._interceptor;
    },
    BoundClosure__computeFieldNamed(fieldName) {
      var t1, i, $name,
        template = new A.BoundClosure("receiver", "interceptor"),
        names = J.JSArray_markFixedList(Object.getOwnPropertyNames(template), type$.nullable_Object);
      for (t1 = names.length, i = 0; i < t1; ++i) {
        $name = names[i];
        if (template[$name] === fieldName)
          return $name;
      }
      throw A.wrapException(A.ArgumentError$("Field name " + fieldName + " not found.", null));
    },
    boolConversionCheck(value) {
      if (value == null)
        A.assertThrow("boolean expression must not be null");
      return value;
    },
    assertThrow(message) {
      throw A.wrapException(new A._AssertionError(message));
    },
    throwCyclicInit(staticName) {
      throw A.wrapException(new A.CyclicInitializationError(staticName));
    },
    getIsolateAffinityTag($name) {
      return init.getIsolateTag($name);
    },
    defineProperty(obj, property, value) {
      Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
    },
    lookupAndCacheInterceptor(obj) {
      var interceptor, interceptorClass, altTag, mark, t1,
        tag = A._asStringS($.getTagFunction.call$1(obj)),
        record = $.dispatchRecordsForInstanceTags[tag];
      if (record != null) {
        Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
        return record.i;
      }
      interceptor = $.interceptorsForUncacheableTags[tag];
      if (interceptor != null)
        return interceptor;
      interceptorClass = init.interceptorsByTag[tag];
      if (interceptorClass == null) {
        altTag = A._asStringQ($.alternateTagFunction.call$2(obj, tag));
        if (altTag != null) {
          record = $.dispatchRecordsForInstanceTags[altTag];
          if (record != null) {
            Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
            return record.i;
          }
          interceptor = $.interceptorsForUncacheableTags[altTag];
          if (interceptor != null)
            return interceptor;
          interceptorClass = init.interceptorsByTag[altTag];
          tag = altTag;
        }
      }
      if (interceptorClass == null)
        return null;
      interceptor = interceptorClass.prototype;
      mark = tag[0];
      if (mark === "!") {
        record = A.makeLeafDispatchRecord(interceptor);
        $.dispatchRecordsForInstanceTags[tag] = record;
        Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
        return record.i;
      }
      if (mark === "~") {
        $.interceptorsForUncacheableTags[tag] = interceptor;
        return interceptor;
      }
      if (mark === "-") {
        t1 = A.makeLeafDispatchRecord(interceptor);
        Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
        return t1.i;
      }
      if (mark === "+")
        return A.patchInteriorProto(obj, interceptor);
      if (mark === "*")
        throw A.wrapException(A.UnimplementedError$(tag));
      if (init.leafTags[tag] === true) {
        t1 = A.makeLeafDispatchRecord(interceptor);
        Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
        return t1.i;
      } else
        return A.patchInteriorProto(obj, interceptor);
    },
    patchInteriorProto(obj, interceptor) {
      var proto = Object.getPrototypeOf(obj);
      Object.defineProperty(proto, init.dispatchPropertyName, {value: J.makeDispatchRecord(interceptor, proto, null, null), enumerable: false, writable: true, configurable: true});
      return interceptor;
    },
    makeLeafDispatchRecord(interceptor) {
      return J.makeDispatchRecord(interceptor, false, null, !!interceptor.$isJavaScriptIndexingBehavior);
    },
    makeDefaultDispatchRecord(tag, interceptorClass, proto) {
      var interceptor = interceptorClass.prototype;
      if (init.leafTags[tag] === true)
        return A.makeLeafDispatchRecord(interceptor);
      else
        return J.makeDispatchRecord(interceptor, proto, null, null);
    },
    initNativeDispatch() {
      if (true === $.initNativeDispatchFlag)
        return;
      $.initNativeDispatchFlag = true;
      A.initNativeDispatchContinue();
    },
    initNativeDispatchContinue() {
      var map, tags, fun, i, tag, proto, record, interceptorClass;
      $.dispatchRecordsForInstanceTags = Object.create(null);
      $.interceptorsForUncacheableTags = Object.create(null);
      A.initHooks();
      map = init.interceptorsByTag;
      tags = Object.getOwnPropertyNames(map);
      if (typeof window != "undefined") {
        window;
        fun = function() {
        };
        for (i = 0; i < tags.length; ++i) {
          tag = tags[i];
          proto = $.prototypeForTagFunction.call$1(tag);
          if (proto != null) {
            record = A.makeDefaultDispatchRecord(tag, map[tag], proto);
            if (record != null) {
              Object.defineProperty(proto, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
              fun.prototype = proto;
            }
          }
        }
      }
      for (i = 0; i < tags.length; ++i) {
        tag = tags[i];
        if (/^[A-Za-z_]/.test(tag)) {
          interceptorClass = map[tag];
          map["!" + tag] = interceptorClass;
          map["~" + tag] = interceptorClass;
          map["-" + tag] = interceptorClass;
          map["+" + tag] = interceptorClass;
          map["*" + tag] = interceptorClass;
        }
      }
    },
    initHooks() {
      var transformers, i, transformer, getTag, getUnknownTag, prototypeForTag,
        hooks = B.C_JS_CONST0();
      hooks = A.applyHooksTransformer(B.C_JS_CONST1, A.applyHooksTransformer(B.C_JS_CONST2, A.applyHooksTransformer(B.C_JS_CONST3, A.applyHooksTransformer(B.C_JS_CONST3, A.applyHooksTransformer(B.C_JS_CONST4, A.applyHooksTransformer(B.C_JS_CONST5, A.applyHooksTransformer(B.C_JS_CONST6(B.C_JS_CONST), hooks)))))));
      if (typeof dartNativeDispatchHooksTransformer != "undefined") {
        transformers = dartNativeDispatchHooksTransformer;
        if (typeof transformers == "function")
          transformers = [transformers];
        if (transformers.constructor == Array)
          for (i = 0; i < transformers.length; ++i) {
            transformer = transformers[i];
            if (typeof transformer == "function")
              hooks = transformer(hooks) || hooks;
          }
      }
      getTag = hooks.getTag;
      getUnknownTag = hooks.getUnknownTag;
      prototypeForTag = hooks.prototypeForTag;
      $.getTagFunction = new A.initHooks_closure(getTag);
      $.alternateTagFunction = new A.initHooks_closure0(getUnknownTag);
      $.prototypeForTagFunction = new A.initHooks_closure1(prototypeForTag);
    },
    applyHooksTransformer(transformer, hooks) {
      return transformer(hooks) || hooks;
    },
    JSSyntaxRegExp_makeNative(source, multiLine, caseSensitive, unicode, dotAll, global) {
      var m = multiLine ? "m" : "",
        i = caseSensitive ? "" : "i",
        u = unicode ? "u" : "",
        s = dotAll ? "s" : "",
        g = global ? "g" : "",
        regexp = function(source, modifiers) {
          try {
            return new RegExp(source, modifiers);
          } catch (e) {
            return e;
          }
        }(source, m + i + u + s + g);
      if (regexp instanceof RegExp)
        return regexp;
      throw A.wrapException(A.FormatException$("Illegal RegExp pattern (" + String(regexp) + ")", source, null));
    },
    stringContainsUnchecked(receiver, other, startIndex) {
      var t1, t2;
      if (typeof other == "string")
        return receiver.indexOf(other, startIndex) >= 0;
      else if (other instanceof A.JSSyntaxRegExp) {
        t1 = B.JSString_methods.substring$1(receiver, startIndex);
        t2 = other._nativeRegExp;
        return t2.test(t1);
      } else {
        t1 = J.allMatches$1$s(other, B.JSString_methods.substring$1(receiver, startIndex));
        return !t1.get$isEmpty(t1);
      }
    },
    quoteStringForRegExp(string) {
      if (/[[\]{}()*+?.\\^$|]/.test(string))
        return string.replace(/[[\]{}()*+?.\\^$|]/g, "\\$&");
      return string;
    },
    stringReplaceRangeUnchecked(receiver, start, end, replacement) {
      var prefix = receiver.substring(0, start),
        suffix = receiver.substring(end);
      return prefix + replacement + suffix;
    },
    ConstantMapView: function ConstantMapView(t0, t1) {
      this._collection$_map = t0;
      this.$ti = t1;
    },
    ConstantMap: function ConstantMap() {
    },
    ConstantMap_map_closure: function ConstantMap_map_closure(t0, t1, t2) {
      this.$this = t0;
      this.transform = t1;
      this.result = t2;
    },
    ConstantStringMap: function ConstantStringMap(t0, t1, t2, t3) {
      var _ = this;
      _.__js_helper$_length = t0;
      _._jsObject = t1;
      _.__js_helper$_keys = t2;
      _.$ti = t3;
    },
    _ConstantMapKeyIterable: function _ConstantMapKeyIterable(t0, t1) {
      this._map = t0;
      this.$ti = t1;
    },
    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;
      _._arguments = t1;
      _._argumentsExpr = t2;
      _._expr = t3;
      _._method = t4;
      _._receiver = t5;
    },
    NullError: function NullError(t0, t1) {
      this.__js_helper$_message = t0;
      this._method = t1;
    },
    JsNoSuchMethodError: function JsNoSuchMethodError(t0, t1, t2) {
      this.__js_helper$_message = t0;
      this._method = t1;
      this._receiver = t2;
    },
    UnknownJsTypeError: function UnknownJsTypeError(t0) {
      this.__js_helper$_message = t0;
    },
    NullThrownFromJavaScriptException: function NullThrownFromJavaScriptException(t0) {
      this._irritant = t0;
    },
    ExceptionAndStackTrace: function ExceptionAndStackTrace(t0, t1) {
      this.dartException = t0;
      this.stackTrace = t1;
    },
    _StackTrace: function _StackTrace(t0) {
      this._exception = t0;
      this._trace = null;
    },
    Closure: function Closure() {
    },
    Closure0Args: function Closure0Args() {
    },
    Closure2Args: function Closure2Args() {
    },
    TearOffClosure: function TearOffClosure() {
    },
    StaticClosure: function StaticClosure() {
    },
    BoundClosure: function BoundClosure(t0, t1) {
      this._receiver = t0;
      this._interceptor = t1;
    },
    RuntimeError: function RuntimeError(t0) {
      this.message = t0;
    },
    _AssertionError: function _AssertionError(t0) {
      this.message = t0;
    },
    _Required: function _Required() {
    },
    JsLinkedHashMap: function JsLinkedHashMap(t0) {
      var _ = this;
      _.__js_helper$_length = 0;
      _._last = _._first = _.__js_helper$_rest = _._nums = _._strings = null;
      _._modifications = 0;
      _.$ti = t0;
    },
    JsLinkedHashMap_addAll_closure: function JsLinkedHashMap_addAll_closure(t0) {
      this.$this = t0;
    },
    LinkedHashMapCell: function LinkedHashMapCell(t0, t1) {
      var _ = this;
      _.hashMapCellKey = t0;
      _.hashMapCellValue = t1;
      _._previous = _._next = null;
    },
    LinkedHashMapKeyIterable: function LinkedHashMapKeyIterable(t0, t1) {
      this._map = t0;
      this.$ti = t1;
    },
    LinkedHashMapKeyIterator: function LinkedHashMapKeyIterator(t0, t1, t2) {
      var _ = this;
      _._map = t0;
      _._modifications = t1;
      _.__js_helper$_current = _._cell = null;
      _.$ti = t2;
    },
    initHooks_closure: function initHooks_closure(t0) {
      this.getTag = t0;
    },
    initHooks_closure0: function initHooks_closure0(t0) {
      this.getUnknownTag = t0;
    },
    initHooks_closure1: function initHooks_closure1(t0) {
      this.prototypeForTag = t0;
    },
    JSSyntaxRegExp: function JSSyntaxRegExp(t0, t1) {
      var _ = this;
      _.pattern = t0;
      _._nativeRegExp = t1;
      _._nativeAnchoredRegExp = _._nativeGlobalRegExp = null;
    },
    _MatchImplementation: function _MatchImplementation(t0) {
      this._match = t0;
    },
    _AllMatchesIterable: function _AllMatchesIterable(t0, t1, t2) {
      this._re = t0;
      this._string = t1;
      this._start = t2;
    },
    _AllMatchesIterator: function _AllMatchesIterator(t0, t1, t2) {
      var _ = this;
      _._regExp = t0;
      _._string = t1;
      _._nextIndex = t2;
      _.__js_helper$_current = null;
    },
    StringMatch: function StringMatch(t0, t1) {
      this.start = t0;
      this.pattern = t1;
    },
    _StringAllMatchesIterable: function _StringAllMatchesIterable(t0, t1, t2) {
      this._input = t0;
      this._pattern = t1;
      this.__js_helper$_index = t2;
    },
    _StringAllMatchesIterator: function _StringAllMatchesIterator(t0, t1, t2) {
      var _ = this;
      _._input = t0;
      _._pattern = t1;
      _.__js_helper$_index = t2;
      _.__js_helper$_current = null;
    },
    throwLateFieldADI(fieldName) {
      return A.throwExpression(A.LateError$fieldADI(fieldName));
    },
    _Cell$named(_name) {
      var t1 = new A._Cell(_name);
      return t1.__late_helper$_value = t1;
    },
    _lateReadCheck(value, $name) {
      if (value === $)
        throw A.wrapException(A.LateError$fieldNI($name));
      return value;
    },
    _lateWriteOnceCheck(value, $name) {
      if (value !== $)
        throw A.wrapException(new A.LateError("Field '" + $name + "' has already been initialized."));
    },
    _lateInitializeOnceCheck(value, $name) {
      if (value !== $)
        throw A.wrapException(A.LateError$fieldADI($name));
    },
    _Cell: function _Cell(t0) {
      this.__late_helper$_name = t0;
      this.__late_helper$_value = null;
    },
    _checkViewArguments(buffer, offsetInBytes, $length) {
      if (!A._isInt(offsetInBytes))
        throw A.wrapException(A.ArgumentError$("Invalid view offsetInBytes " + A.S(offsetInBytes), null));
    },
    _ensureNativeList(list) {
      return list;
    },
    NativeInt8List__create1(arg) {
      return new Int8Array(arg);
    },
    NativeUint8List_NativeUint8List$view(buffer, offsetInBytes, $length) {
      A._checkViewArguments(buffer, offsetInBytes, $length);
      return $length == null ? new Uint8Array(buffer, offsetInBytes) : new Uint8Array(buffer, offsetInBytes, $length);
    },
    _checkValidIndex(index, list, $length) {
      if (index >>> 0 !== index || index >= $length)
        throw A.wrapException(A.diagnoseIndexError(list, index));
    },
    _checkValidRange(start, end, $length) {
      var t1;
      if (!(start >>> 0 !== start))
        if (end == null)
          t1 = start > $length;
        else
          t1 = end >>> 0 !== end || start > end || end > $length;
      else
        t1 = true;
      if (t1)
        throw A.wrapException(A.diagnoseRangeError(start, end, $length));
      if (end == null)
        return $length;
      return end;
    },
    NativeByteBuffer: function NativeByteBuffer() {
    },
    NativeTypedData: function NativeTypedData() {
    },
    NativeByteData: function NativeByteData() {
    },
    NativeTypedArray: function NativeTypedArray() {
    },
    NativeTypedArrayOfDouble: function NativeTypedArrayOfDouble() {
    },
    NativeTypedArrayOfInt: function NativeTypedArrayOfInt() {
    },
    NativeFloat32List: function NativeFloat32List() {
    },
    NativeFloat64List: function NativeFloat64List() {
    },
    NativeInt16List: function NativeInt16List() {
    },
    NativeInt32List: function NativeInt32List() {
    },
    NativeInt8List: function NativeInt8List() {
    },
    NativeUint16List: function NativeUint16List() {
    },
    NativeUint32List: function NativeUint32List() {
    },
    NativeUint8ClampedList: function NativeUint8ClampedList() {
    },
    NativeUint8List: function NativeUint8List() {
    },
    _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin: function _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin() {
    },
    _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin: function _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin() {
    },
    _NativeTypedArrayOfInt_NativeTypedArray_ListMixin: function _NativeTypedArrayOfInt_NativeTypedArray_ListMixin() {
    },
    _NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin: function _NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin() {
    },
    Rti__getQuestionFromStar(universe, rti) {
      var question = rti._precomputed1;
      return question == null ? rti._precomputed1 = A._Universe__lookupQuestionRti(universe, rti._primary, true) : question;
    },
    Rti__getFutureFromFutureOr(universe, rti) {
      var future = rti._precomputed1;
      return future == null ? rti._precomputed1 = A._Universe__lookupInterfaceRti(universe, "Future", [rti._primary]) : future;
    },
    Rti__isUnionOfFunctionType(rti) {
      var kind = rti._kind;
      if (kind === 6 || kind === 7 || kind === 8)
        return A.Rti__isUnionOfFunctionType(rti._primary);
      return kind === 11 || kind === 12;
    },
    Rti__getCanonicalRecipe(rti) {
      return rti._canonicalRecipe;
    },
    findType(recipe) {
      return A._Universe_eval(init.typeUniverse, recipe, false);
    },
    _substitute(universe, rti, typeArguments, depth) {
      var baseType, substitutedBaseType, interfaceTypeArguments, substitutedInterfaceTypeArguments, base, substitutedBase, $arguments, substitutedArguments, returnType, substitutedReturnType, functionParameters, substitutedFunctionParameters, bounds, substitutedBounds, index, argument,
        kind = rti._kind;
      switch (kind) {
        case 5:
        case 1:
        case 2:
        case 3:
        case 4:
          return rti;
        case 6:
          baseType = rti._primary;
          substitutedBaseType = A._substitute(universe, baseType, typeArguments, depth);
          if (substitutedBaseType === baseType)
            return rti;
          return A._Universe__lookupStarRti(universe, substitutedBaseType, true);
        case 7:
          baseType = rti._primary;
          substitutedBaseType = A._substitute(universe, baseType, typeArguments, depth);
          if (substitutedBaseType === baseType)
            return rti;
          return A._Universe__lookupQuestionRti(universe, substitutedBaseType, true);
        case 8:
          baseType = rti._primary;
          substitutedBaseType = A._substitute(universe, baseType, typeArguments, depth);
          if (substitutedBaseType === baseType)
            return rti;
          return A._Universe__lookupFutureOrRti(universe, substitutedBaseType, true);
        case 9:
          interfaceTypeArguments = rti._rest;
          substitutedInterfaceTypeArguments = A._substituteArray(universe, interfaceTypeArguments, typeArguments, depth);
          if (substitutedInterfaceTypeArguments === interfaceTypeArguments)
            return rti;
          return A._Universe__lookupInterfaceRti(universe, rti._primary, substitutedInterfaceTypeArguments);
        case 10:
          base = rti._primary;
          substitutedBase = A._substitute(universe, base, typeArguments, depth);
          $arguments = rti._rest;
          substitutedArguments = A._substituteArray(universe, $arguments, typeArguments, depth);
          if (substitutedBase === base && substitutedArguments === $arguments)
            return rti;
          return A._Universe__lookupBindingRti(universe, substitutedBase, substitutedArguments);
        case 11:
          returnType = rti._primary;
          substitutedReturnType = A._substitute(universe, returnType, typeArguments, depth);
          functionParameters = rti._rest;
          substitutedFunctionParameters = A._substituteFunctionParameters(universe, functionParameters, typeArguments, depth);
          if (substitutedReturnType === returnType && substitutedFunctionParameters === functionParameters)
            return rti;
          return A._Universe__lookupFunctionRti(universe, substitutedReturnType, substitutedFunctionParameters);
        case 12:
          bounds = rti._rest;
          depth += bounds.length;
          substitutedBounds = A._substituteArray(universe, bounds, typeArguments, depth);
          base = rti._primary;
          substitutedBase = A._substitute(universe, base, typeArguments, depth);
          if (substitutedBounds === bounds && substitutedBase === base)
            return rti;
          return A._Universe__lookupGenericFunctionRti(universe, substitutedBase, substitutedBounds, true);
        case 13:
          index = rti._primary;
          if (index < depth)
            return rti;
          argument = typeArguments[index - depth];
          if (argument == null)
            return rti;
          return argument;
        default:
          throw A.wrapException(A.AssertionError$("Attempted to substitute unexpected RTI kind " + kind));
      }
    },
    _substituteArray(universe, rtiArray, typeArguments, depth) {
      var changed, i, rti, substitutedRti,
        $length = rtiArray.length,
        result = A._Utils_newArrayOrEmpty($length);
      for (changed = false, i = 0; i < $length; ++i) {
        rti = rtiArray[i];
        substitutedRti = A._substitute(universe, rti, typeArguments, depth);
        if (substitutedRti !== rti)
          changed = true;
        result[i] = substitutedRti;
      }
      return changed ? result : rtiArray;
    },
    _substituteNamed(universe, namedArray, typeArguments, depth) {
      var changed, i, t1, t2, rti, substitutedRti,
        $length = namedArray.length,
        result = A._Utils_newArrayOrEmpty($length);
      for (changed = false, i = 0; i < $length; i += 3) {
        t1 = namedArray[i];
        t2 = namedArray[i + 1];
        rti = namedArray[i + 2];
        substitutedRti = A._substitute(universe, rti, typeArguments, depth);
        if (substitutedRti !== rti)
          changed = true;
        result.splice(i, 3, t1, t2, substitutedRti);
      }
      return changed ? result : namedArray;
    },
    _substituteFunctionParameters(universe, functionParameters, typeArguments, depth) {
      var result,
        requiredPositional = functionParameters._requiredPositional,
        substitutedRequiredPositional = A._substituteArray(universe, requiredPositional, typeArguments, depth),
        optionalPositional = functionParameters._optionalPositional,
        substitutedOptionalPositional = A._substituteArray(universe, optionalPositional, typeArguments, depth),
        named = functionParameters._named,
        substitutedNamed = A._substituteNamed(universe, named, typeArguments, depth);
      if (substitutedRequiredPositional === requiredPositional && substitutedOptionalPositional === optionalPositional && substitutedNamed === named)
        return functionParameters;
      result = new A._FunctionParameters();
      result._requiredPositional = substitutedRequiredPositional;
      result._optionalPositional = substitutedOptionalPositional;
      result._named = substitutedNamed;
      return result;
    },
    _setArrayType(target, rti) {
      target[init.arrayRti] = rti;
      return target;
    },
    closureFunctionType(closure) {
      var signature = closure.$signature;
      if (signature != null) {
        if (typeof signature == "number")
          return A.getTypeFromTypesTable(signature);
        return closure.$signature();
      }
      return null;
    },
    instanceOrFunctionType(object, testRti) {
      var rti;
      if (A.Rti__isUnionOfFunctionType(testRti))
        if (object instanceof A.Closure) {
          rti = A.closureFunctionType(object);
          if (rti != null)
            return rti;
        }
      return A.instanceType(object);
    },
    instanceType(object) {
      var rti;
      if (object instanceof A.Object) {
        rti = object.$ti;
        return rti != null ? rti : A._instanceTypeFromConstructor(object);
      }
      if (Array.isArray(object))
        return A._arrayInstanceType(object);
      return A._instanceTypeFromConstructor(J.getInterceptor$(object));
    },
    _arrayInstanceType(object) {
      var rti = object[init.arrayRti],
        defaultRti = type$.JSArray_dynamic;
      if (rti == null)
        return defaultRti;
      if (rti.constructor !== defaultRti.constructor)
        return defaultRti;
      return rti;
    },
    _instanceType(object) {
      var rti = object.$ti;
      return rti != null ? rti : A._instanceTypeFromConstructor(object);
    },
    _instanceTypeFromConstructor(instance) {
      var $constructor = instance.constructor,
        probe = $constructor.$ccache;
      if (probe != null)
        return probe;
      return A._instanceTypeFromConstructorMiss(instance, $constructor);
    },
    _instanceTypeFromConstructorMiss(instance, $constructor) {
      var effectiveConstructor = instance instanceof A.Closure ? instance.__proto__.__proto__.constructor : $constructor,
        rti = A._Universe_findErasedType(init.typeUniverse, effectiveConstructor.name);
      $constructor.$ccache = rti;
      return rti;
    },
    getTypeFromTypesTable(index) {
      var rti,
        table = init.types,
        type = table[index];
      if (typeof type == "string") {
        rti = A._Universe_eval(init.typeUniverse, type, false);
        table[index] = rti;
        return rti;
      }
      return type;
    },
    getRuntimeType(object) {
      var rti = object instanceof A.Closure ? A.closureFunctionType(object) : null;
      return A.createRuntimeType(rti == null ? A.instanceType(object) : rti);
    },
    createRuntimeType(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 A._Type(rti);
      starErasedRti = A._Universe_eval(init.typeUniverse, starErasedRecipe, true);
      type = starErasedRti._cachedRuntimeType;
      return rti._cachedRuntimeType = type == null ? starErasedRti._cachedRuntimeType = new A._Type(starErasedRti) : type;
    },
    typeLiteral(recipe) {
      return A.createRuntimeType(A._Universe_eval(init.typeUniverse, recipe, false));
    },
    _installSpecializedIsTest(object) {
      var unstarred, isFn, $name, testRti = this,
        t1 = type$.Object;
      if (testRti === t1)
        return A._finishIsFn(testRti, object, A._isObject);
      if (!A.isStrongTopType(testRti))
        if (!(testRti === type$.legacy_Object))
          t1 = testRti === t1;
        else
          t1 = true;
      else
        t1 = true;
      if (t1)
        return A._finishIsFn(testRti, object, A._isTop);
      t1 = testRti._kind;
      unstarred = t1 === 6 ? testRti._primary : testRti;
      if (unstarred === type$.int)
        isFn = A._isInt;
      else if (unstarred === type$.double || unstarred === type$.num)
        isFn = A._isNum;
      else if (unstarred === type$.String)
        isFn = A._isString;
      else
        isFn = unstarred === type$.bool ? A._isBool : null;
      if (isFn != null)
        return A._finishIsFn(testRti, object, isFn);
      if (unstarred._kind === 9) {
        $name = unstarred._primary;
        if (unstarred._rest.every(A.isTopType)) {
          testRti._specializedTestResource = "$is" + $name;
          if ($name === "List")
            return A._finishIsFn(testRti, object, A._isListTestViaProperty);
          return A._finishIsFn(testRti, object, A._isTestViaProperty);
        }
      } else if (t1 === 7)
        return A._finishIsFn(testRti, object, A._generalNullableIsTestImplementation);
      return A._finishIsFn(testRti, object, A._generalIsTestImplementation);
    },
    _finishIsFn(testRti, object, isFn) {
      testRti._is = isFn;
      return testRti._is(object);
    },
    _installSpecializedAsCheck(object) {
      var t1, asFn, testRti = this;
      if (!A.isStrongTopType(testRti))
        if (!(testRti === type$.legacy_Object))
          t1 = testRti === type$.Object;
        else
          t1 = true;
      else
        t1 = true;
      if (t1)
        asFn = A._asTop;
      else if (testRti === type$.Object)
        asFn = A._asObject;
      else
        asFn = A._generalNullableAsCheckImplementation;
      testRti._as = asFn;
      return testRti._as(object);
    },
    _nullIs(testRti) {
      var t1,
        kind = testRti._kind;
      if (!A.isStrongTopType(testRti))
        if (!(testRti === type$.legacy_Object))
          if (!(testRti === type$.legacy_Never))
            if (kind !== 7)
              t1 = kind === 8 && A._nullIs(testRti._primary) || testRti === type$.Null || testRti === type$.JSNull;
            else
              t1 = true;
          else
            t1 = true;
        else
          t1 = true;
      else
        t1 = true;
      return t1;
    },
    _generalIsTestImplementation(object) {
      var testRti = this;
      if (object == null)
        return A._nullIs(testRti);
      return A._isSubtype(init.typeUniverse, A.instanceOrFunctionType(object, testRti), null, testRti, null);
    },
    _generalNullableIsTestImplementation(object) {
      if (object == null)
        return true;
      return this._primary._is(object);
    },
    _isTestViaProperty(object) {
      var tag, testRti = this;
      if (object == null)
        return A._nullIs(testRti);
      tag = testRti._specializedTestResource;
      if (object instanceof A.Object)
        return !!object[tag];
      return !!J.getInterceptor$(object)[tag];
    },
    _isListTestViaProperty(object) {
      var tag, testRti = this;
      if (object == null)
        return A._nullIs(testRti);
      if (typeof object != "object")
        return false;
      if (Array.isArray(object))
        return true;
      tag = testRti._specializedTestResource;
      if (object instanceof A.Object)
        return !!object[tag];
      return !!J.getInterceptor$(object)[tag];
    },
    _generalAsCheckImplementation(object) {
      var testRti = this;
      if (object == null)
        return object;
      else if (testRti._is(object))
        return object;
      A._failedAsCheck(object, testRti);
    },
    _generalNullableAsCheckImplementation(object) {
      var testRti = this;
      if (object == null)
        return object;
      else if (testRti._is(object))
        return object;
      A._failedAsCheck(object, testRti);
    },
    _failedAsCheck(object, testRti) {
      throw A.wrapException(A._TypeError$fromMessage(A._Error_compose(object, A.instanceOrFunctionType(object, testRti), A._rtiToString(testRti, null))));
    },
    checkTypeBound(type, bound, variable, methodName) {
      var _null = null;
      if (A._isSubtype(init.typeUniverse, type, _null, bound, _null))
        return type;
      throw A.wrapException(A._TypeError$fromMessage("The type argument '" + A.S(A._rtiToString(type, _null)) + "' is not a subtype of the type variable bound '" + A.S(A._rtiToString(bound, _null)) + "' of type variable '" + A.S(variable) + "' in '" + A.S(methodName) + "'."));
    },
    _Error_compose(object, objectRti, checkedTypeDescription) {
      var objectDescription = A.Error_safeToString(object),
        objectTypeDescription = A._rtiToString(objectRti == null ? A.instanceType(object) : objectRti, null);
      return objectDescription + ": type '" + A.S(objectTypeDescription) + "' is not a subtype of type '" + A.S(checkedTypeDescription) + "'";
    },
    _TypeError$fromMessage(message) {
      return new A._TypeError("TypeError: " + message);
    },
    _TypeError__TypeError$forType(object, type) {
      return new A._TypeError("TypeError: " + A._Error_compose(object, null, type));
    },
    _isObject(object) {
      return object != null;
    },
    _asObject(object) {
      return object;
    },
    _isTop(object) {
      return true;
    },
    _asTop(object) {
      return object;
    },
    _isBool(object) {
      return true === object || false === object;
    },
    _asBool(object) {
      if (true === object)
        return true;
      if (false === object)
        return false;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "bool"));
    },
    _asBoolS(object) {
      if (true === object)
        return true;
      if (false === object)
        return false;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "bool"));
    },
    _asBoolQ(object) {
      if (true === object)
        return true;
      if (false === object)
        return false;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "bool?"));
    },
    _asDouble(object) {
      if (typeof object == "number")
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "double"));
    },
    _asDoubleS(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "double"));
    },
    _asDoubleQ(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "double?"));
    },
    _isInt(object) {
      return typeof object == "number" && Math.floor(object) === object;
    },
    _asInt(object) {
      if (typeof object == "number" && Math.floor(object) === object)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "int"));
    },
    _asIntS(object) {
      if (typeof object == "number" && Math.floor(object) === object)
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "int"));
    },
    _asIntQ(object) {
      if (typeof object == "number" && Math.floor(object) === object)
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "int?"));
    },
    _isNum(object) {
      return typeof object == "number";
    },
    _asNum(object) {
      if (typeof object == "number")
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "num"));
    },
    _asNumS(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "num"));
    },
    _asNumQ(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "num?"));
    },
    _isString(object) {
      return typeof object == "string";
    },
    _asString(object) {
      if (typeof object == "string")
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "String"));
    },
    _asStringS(object) {
      if (typeof object == "string")
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "String"));
    },
    _asStringQ(object) {
      if (typeof object == "string")
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "String?"));
    },
    _rtiArrayToString(array, genericContext) {
      var s, sep, i;
      for (s = "", sep = "", i = 0; i < array.length; ++i, sep = ", ")
        s += B.JSString_methods.$add(sep, A._rtiToString(array[i], genericContext));
      return s;
    },
    _functionRtiToString(functionType, genericContext, bounds) {
      var boundsLength, outerContextLength, offset, i, t1, t2, t3, typeParametersText, typeSep, t4, t5, boundRti, kind, parameters, requiredPositional, requiredPositionalLength, optionalPositional, optionalPositionalLength, named, namedLength, returnTypeText, argumentsText, sep, _s2_ = ", ";
      if (bounds != null) {
        boundsLength = bounds.length;
        if (genericContext == null) {
          genericContext = A._setArrayType([], type$.JSArray_String);
          outerContextLength = null;
        } else
          outerContextLength = genericContext.length;
        offset = genericContext.length;
        for (i = boundsLength; i > 0; --i)
          B.JSArray_methods.add$1(genericContext, "T" + (offset + i));
        for (t1 = type$.nullable_Object, t2 = type$.legacy_Object, t3 = type$.Object, typeParametersText = "<", typeSep = "", i = 0; i < boundsLength; ++i, typeSep = _s2_) {
          typeParametersText += typeSep;
          t4 = genericContext.length;
          t5 = t4 - 1 - i;
          if (!(t5 >= 0))
            return A.ioore(genericContext, t5);
          typeParametersText = B.JSString_methods.$add(typeParametersText, genericContext[t5]);
          boundRti = bounds[i];
          kind = boundRti._kind;
          if (!(kind === 2 || kind === 3 || kind === 4 || kind === 5 || boundRti === t1))
            if (!(boundRti === t2))
              t4 = boundRti === t3;
            else
              t4 = true;
          else
            t4 = true;
          if (!t4)
            typeParametersText += B.JSString_methods.$add(" extends ", A._rtiToString(boundRti, genericContext));
        }
        typeParametersText += ">";
      } else {
        typeParametersText = "";
        outerContextLength = null;
      }
      t1 = functionType._primary;
      parameters = functionType._rest;
      requiredPositional = parameters._requiredPositional;
      requiredPositionalLength = requiredPositional.length;
      optionalPositional = parameters._optionalPositional;
      optionalPositionalLength = optionalPositional.length;
      named = parameters._named;
      namedLength = named.length;
      returnTypeText = A._rtiToString(t1, genericContext);
      for (argumentsText = "", sep = "", i = 0; i < requiredPositionalLength; ++i, sep = _s2_)
        argumentsText += B.JSString_methods.$add(sep, A._rtiToString(requiredPositional[i], genericContext));
      if (optionalPositionalLength > 0) {
        argumentsText += sep + "[";
        for (sep = "", i = 0; i < optionalPositionalLength; ++i, sep = _s2_)
          argumentsText += B.JSString_methods.$add(sep, A._rtiToString(optionalPositional[i], genericContext));
        argumentsText += "]";
      }
      if (namedLength > 0) {
        argumentsText += sep + "{";
        for (sep = "", i = 0; i < namedLength; i += 3, sep = _s2_) {
          argumentsText += sep;
          if (named[i + 1])
            argumentsText += "required ";
          argumentsText += J.$add$ansx(A._rtiToString(named[i + 2], genericContext), " ") + named[i];
        }
        argumentsText += "}";
      }
      if (outerContextLength != null) {
        genericContext.toString;
        genericContext.length = outerContextLength;
      }
      return typeParametersText + "(" + argumentsText + ") => " + A.S(returnTypeText);
    },
    _rtiToString(rti, genericContext) {
      var s, questionArgument, argumentKind, $name, $arguments, t1, t2,
        kind = rti._kind;
      if (kind === 5)
        return "erased";
      if (kind === 2)
        return "dynamic";
      if (kind === 3)
        return "void";
      if (kind === 1)
        return "Never";
      if (kind === 4)
        return "any";
      if (kind === 6) {
        s = A._rtiToString(rti._primary, genericContext);
        return s;
      }
      if (kind === 7) {
        questionArgument = rti._primary;
        s = A._rtiToString(questionArgument, genericContext);
        argumentKind = questionArgument._kind;
        return J.$add$ansx(argumentKind === 11 || argumentKind === 12 ? B.JSString_methods.$add("(", s) + ")" : s, "?");
      }
      if (kind === 8)
        return "FutureOr<" + A.S(A._rtiToString(rti._primary, genericContext)) + ">";
      if (kind === 9) {
        $name = A._unminifyOrTag(rti._primary);
        $arguments = rti._rest;
        return $arguments.length > 0 ? $name + ("<" + A._rtiArrayToString($arguments, genericContext) + ">") : $name;
      }
      if (kind === 11)
        return A._functionRtiToString(rti, genericContext, null);
      if (kind === 12)
        return A._functionRtiToString(rti._primary, genericContext, rti._rest);
      if (kind === 13) {
        genericContext.toString;
        t1 = rti._primary;
        t2 = genericContext.length;
        t1 = t2 - 1 - t1;
        if (!(t1 >= 0 && t1 < t2))
          return A.ioore(genericContext, t1);
        return genericContext[t1];
      }
      return "?";
    },
    _unminifyOrTag(rawClassName) {
      var preserved = init.mangledGlobalNames[rawClassName];
      if (preserved != null)
        return preserved;
      return rawClassName;
    },
    _Universe_findRule(universe, targetType) {
      var rule = universe.tR[targetType];
      for (; typeof rule == "string";)
        rule = universe.tR[rule];
      return rule;
    },
    _Universe_findErasedType(universe, cls) {
      var $length, erased, $arguments, i, $interface,
        metadata = universe.eT,
        probe = metadata[cls];
      if (probe == null)
        return A._Universe_eval(universe, cls, false);
      else if (typeof probe == "number") {
        $length = probe;
        erased = A._Universe__lookupTerminalRti(universe, 5, "#");
        $arguments = A._Utils_newArrayOrEmpty($length);
        for (i = 0; i < $length; ++i)
          $arguments[i] = erased;
        $interface = A._Universe__lookupInterfaceRti(universe, cls, $arguments);
        metadata[cls] = $interface;
        return $interface;
      } else
        return probe;
    },
    _Universe_addRules(universe, rules) {
      return A._Utils_objectAssign(universe.tR, rules);
    },
    _Universe_addErasedTypes(universe, types) {
      return A._Utils_objectAssign(universe.eT, types);
    },
    _Universe_eval(universe, recipe, normalize) {
      var rti,
        cache = universe.eC,
        probe = cache.get(recipe);
      if (probe != null)
        return probe;
      rti = A._Parser_parse(A._Parser_create(universe, null, recipe, normalize));
      cache.set(recipe, rti);
      return rti;
    },
    _Universe_evalInEnvironment(universe, environment, recipe) {
      var probe, rti,
        cache = environment._evalCache;
      if (cache == null)
        cache = environment._evalCache = new Map();
      probe = cache.get(recipe);
      if (probe != null)
        return probe;
      rti = A._Parser_parse(A._Parser_create(universe, environment, recipe, true));
      cache.set(recipe, rti);
      return rti;
    },
    _Universe_bind(universe, environment, argumentsRti) {
      var argumentsRecipe, probe, rti,
        cache = environment._bindCache;
      if (cache == null)
        cache = environment._bindCache = new Map();
      argumentsRecipe = argumentsRti._canonicalRecipe;
      probe = cache.get(argumentsRecipe);
      if (probe != null)
        return probe;
      rti = A._Universe__lookupBindingRti(universe, environment, argumentsRti._kind === 10 ? argumentsRti._rest : [argumentsRti]);
      cache.set(argumentsRecipe, rti);
      return rti;
    },
    _Universe__installTypeTests(universe, rti) {
      rti._as = A._installSpecializedAsCheck;
      rti._is = A._installSpecializedIsTest;
      return rti;
    },
    _Universe__lookupTerminalRti(universe, kind, key) {
      var rti, t1,
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = kind;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupStarRti(universe, baseType, normalize) {
      var t1,
        key = baseType._canonicalRecipe + "*",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = A._Universe__createStarRti(universe, baseType, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createStarRti(universe, baseType, key, normalize) {
      var baseKind, t1, rti;
      if (normalize) {
        baseKind = baseType._kind;
        if (!A.isStrongTopType(baseType))
          t1 = baseType === type$.Null || baseType === type$.JSNull || baseKind === 7 || baseKind === 6;
        else
          t1 = true;
        if (t1)
          return baseType;
      }
      rti = new A.Rti(null, null);
      rti._kind = 6;
      rti._primary = baseType;
      rti._canonicalRecipe = key;
      return A._Universe__installTypeTests(universe, rti);
    },
    _Universe__lookupQuestionRti(universe, baseType, normalize) {
      var t1,
        key = baseType._canonicalRecipe + "?",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = A._Universe__createQuestionRti(universe, baseType, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createQuestionRti(universe, baseType, key, normalize) {
      var baseKind, t1, starArgument, rti;
      if (normalize) {
        baseKind = baseType._kind;
        if (!A.isStrongTopType(baseType))
          if (!(baseType === type$.Null || baseType === type$.JSNull))
            if (baseKind !== 7)
              t1 = baseKind === 8 && A.isNullable(baseType._primary);
            else
              t1 = true;
          else
            t1 = true;
        else
          t1 = true;
        if (t1)
          return baseType;
        else if (baseKind === 1 || baseType === type$.legacy_Never)
          return type$.Null;
        else if (baseKind === 6) {
          starArgument = baseType._primary;
          if (starArgument._kind === 8 && A.isNullable(starArgument._primary))
            return starArgument;
          else
            return A.Rti__getQuestionFromStar(universe, baseType);
        }
      }
      rti = new A.Rti(null, null);
      rti._kind = 7;
      rti._primary = baseType;
      rti._canonicalRecipe = key;
      return A._Universe__installTypeTests(universe, rti);
    },
    _Universe__lookupFutureOrRti(universe, baseType, normalize) {
      var t1,
        key = baseType._canonicalRecipe + "/",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = A._Universe__createFutureOrRti(universe, baseType, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createFutureOrRti(universe, baseType, key, normalize) {
      var t1, t2, rti;
      if (normalize) {
        t1 = baseType._kind;
        if (!A.isStrongTopType(baseType))
          if (!(baseType === type$.legacy_Object))
            t2 = baseType === type$.Object;
          else
            t2 = true;
        else
          t2 = true;
        if (t2 || baseType === type$.Object)
          return baseType;
        else if (t1 === 1)
          return A._Universe__lookupInterfaceRti(universe, "Future", [baseType]);
        else if (baseType === type$.Null || baseType === type$.JSNull)
          return type$.nullable_Future_Null;
      }
      rti = new A.Rti(null, null);
      rti._kind = 8;
      rti._primary = baseType;
      rti._canonicalRecipe = key;
      return A._Universe__installTypeTests(universe, rti);
    },
    _Universe__lookupGenericFunctionParameterRti(universe, index) {
      var rti, t1,
        key = "" + index + "^",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 13;
      rti._primary = index;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__canonicalRecipeJoin($arguments) {
      var s, sep, i,
        $length = $arguments.length;
      for (s = "", sep = "", i = 0; i < $length; ++i, sep = ",")
        s += sep + $arguments[i]._canonicalRecipe;
      return s;
    },
    _Universe__canonicalRecipeJoinNamed($arguments) {
      var s, sep, i, t1, nameSep, s0,
        $length = $arguments.length;
      for (s = "", sep = "", i = 0; i < $length; i += 3, sep = ",") {
        t1 = $arguments[i];
        nameSep = $arguments[i + 1] ? "!" : ":";
        s0 = $arguments[i + 2]._canonicalRecipe;
        s += sep + t1 + nameSep + s0;
      }
      return s;
    },
    _Universe__lookupInterfaceRti(universe, $name, $arguments) {
      var probe, rti, t1,
        s = $name;
      if ($arguments.length > 0)
        s += "<" + A._Universe__canonicalRecipeJoin($arguments) + ">";
      probe = universe.eC.get(s);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 9;
      rti._primary = $name;
      rti._rest = $arguments;
      if ($arguments.length > 0)
        rti._precomputed1 = $arguments[0];
      rti._canonicalRecipe = s;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(s, t1);
      return t1;
    },
    _Universe__lookupBindingRti(universe, base, $arguments) {
      var newBase, newArguments, key, probe, rti, t1;
      if (base._kind === 10) {
        newBase = base._primary;
        newArguments = base._rest.concat($arguments);
      } else {
        newArguments = $arguments;
        newBase = base;
      }
      key = newBase._canonicalRecipe + (";<" + A._Universe__canonicalRecipeJoin(newArguments) + ">");
      probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 10;
      rti._primary = newBase;
      rti._rest = newArguments;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupFunctionRti(universe, returnType, parameters) {
      var sep, t1, key, probe, rti,
        s = returnType._canonicalRecipe,
        requiredPositional = parameters._requiredPositional,
        requiredPositionalLength = requiredPositional.length,
        optionalPositional = parameters._optionalPositional,
        optionalPositionalLength = optionalPositional.length,
        named = parameters._named,
        namedLength = named.length,
        recipe = "(" + A._Universe__canonicalRecipeJoin(requiredPositional);
      if (optionalPositionalLength > 0) {
        sep = requiredPositionalLength > 0 ? "," : "";
        t1 = A._Universe__canonicalRecipeJoin(optionalPositional);
        recipe += sep + "[" + t1 + "]";
      }
      if (namedLength > 0) {
        sep = requiredPositionalLength > 0 ? "," : "";
        t1 = A._Universe__canonicalRecipeJoinNamed(named);
        recipe += sep + "{" + t1 + "}";
      }
      key = s + (recipe + ")");
      probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 11;
      rti._primary = returnType;
      rti._rest = parameters;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupGenericFunctionRti(universe, baseFunctionType, bounds, normalize) {
      var t1,
        key = baseFunctionType._canonicalRecipe + ("<" + A._Universe__canonicalRecipeJoin(bounds) + ">"),
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = A._Universe__createGenericFunctionRti(universe, baseFunctionType, bounds, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createGenericFunctionRti(universe, baseFunctionType, bounds, key, normalize) {
      var $length, typeArguments, count, i, bound, substitutedBase, substitutedBounds, rti;
      if (normalize) {
        $length = bounds.length;
        typeArguments = A._Utils_newArrayOrEmpty($length);
        for (count = 0, i = 0; i < $length; ++i) {
          bound = bounds[i];
          if (bound._kind === 1) {
            typeArguments[i] = bound;
            ++count;
          }
        }
        if (count > 0) {
          substitutedBase = A._substitute(universe, baseFunctionType, typeArguments, 0);
          substitutedBounds = A._substituteArray(universe, bounds, typeArguments, 0);
          return A._Universe__lookupGenericFunctionRti(universe, substitutedBase, substitutedBounds, bounds !== substitutedBounds);
        }
      }
      rti = new A.Rti(null, null);
      rti._kind = 12;
      rti._primary = baseFunctionType;
      rti._rest = bounds;
      rti._canonicalRecipe = key;
      return A._Universe__installTypeTests(universe, rti);
    },
    _Parser_create(universe, environment, recipe, normalize) {
      return {u: universe, e: environment, r: recipe, s: [], p: 0, n: normalize};
    },
    _Parser_parse(parser) {
      var t1, i, ch, universe, array, head, base, u, parameters, optionalPositional, named, item,
        source = parser.r,
        stack = parser.s;
      for (t1 = source.length, i = 0; i < t1;) {
        ch = source.charCodeAt(i);
        if (ch >= 48 && ch <= 57)
          i = A._Parser_handleDigit(i + 1, ch, source, stack);
        else if ((((ch | 32) >>> 0) - 97 & 65535) < 26 || ch === 95 || ch === 36)
          i = A._Parser_handleIdentifier(parser, i, source, stack, false);
        else if (ch === 46)
          i = A._Parser_handleIdentifier(parser, i, source, stack, true);
        else {
          ++i;
          switch (ch) {
            case 44:
              break;
            case 58:
              stack.push(false);
              break;
            case 33:
              stack.push(true);
              break;
            case 59:
              stack.push(A._Parser_toType(parser.u, parser.e, stack.pop()));
              break;
            case 94:
              stack.push(A._Universe__lookupGenericFunctionParameterRti(parser.u, stack.pop()));
              break;
            case 35:
              stack.push(A._Universe__lookupTerminalRti(parser.u, 5, "#"));
              break;
            case 64:
              stack.push(A._Universe__lookupTerminalRti(parser.u, 2, "@"));
              break;
            case 126:
              stack.push(A._Universe__lookupTerminalRti(parser.u, 3, "~"));
              break;
            case 60:
              stack.push(parser.p);
              parser.p = stack.length;
              break;
            case 62:
              universe = parser.u;
              array = stack.splice(parser.p);
              A._Parser_toTypes(parser.u, parser.e, array);
              parser.p = stack.pop();
              head = stack.pop();
              if (typeof head == "string")
                stack.push(A._Universe__lookupInterfaceRti(universe, head, array));
              else {
                base = A._Parser_toType(universe, parser.e, head);
                switch (base._kind) {
                  case 11:
                    stack.push(A._Universe__lookupGenericFunctionRti(universe, base, array, parser.n));
                    break;
                  default:
                    stack.push(A._Universe__lookupBindingRti(universe, base, array));
                    break;
                }
              }
              break;
            case 38:
              A._Parser_handleExtendedOperations(parser, stack);
              break;
            case 42:
              u = parser.u;
              stack.push(A._Universe__lookupStarRti(u, A._Parser_toType(u, parser.e, stack.pop()), parser.n));
              break;
            case 63:
              u = parser.u;
              stack.push(A._Universe__lookupQuestionRti(u, A._Parser_toType(u, parser.e, stack.pop()), parser.n));
              break;
            case 47:
              u = parser.u;
              stack.push(A._Universe__lookupFutureOrRti(u, A._Parser_toType(u, parser.e, stack.pop()), parser.n));
              break;
            case 40:
              stack.push(parser.p);
              parser.p = stack.length;
              break;
            case 41:
              universe = parser.u;
              parameters = new A._FunctionParameters();
              optionalPositional = universe.sEA;
              named = universe.sEA;
              head = stack.pop();
              if (typeof head == "number")
                switch (head) {
                  case -1:
                    optionalPositional = stack.pop();
                    break;
                  case -2:
                    named = stack.pop();
                    break;
                  default:
                    stack.push(head);
                    break;
                }
              else
                stack.push(head);
              array = stack.splice(parser.p);
              A._Parser_toTypes(parser.u, parser.e, array);
              parser.p = stack.pop();
              parameters._requiredPositional = array;
              parameters._optionalPositional = optionalPositional;
              parameters._named = named;
              stack.push(A._Universe__lookupFunctionRti(universe, A._Parser_toType(universe, parser.e, stack.pop()), parameters));
              break;
            case 91:
              stack.push(parser.p);
              parser.p = stack.length;
              break;
            case 93:
              array = stack.splice(parser.p);
              A._Parser_toTypes(parser.u, parser.e, array);
              parser.p = stack.pop();
              stack.push(array);
              stack.push(-1);
              break;
            case 123:
              stack.push(parser.p);
              parser.p = stack.length;
              break;
            case 125:
              array = stack.splice(parser.p);
              A._Parser_toTypesNamed(parser.u, parser.e, array);
              parser.p = stack.pop();
              stack.push(array);
              stack.push(-2);
              break;
            default:
              throw "Bad character " + ch;
          }
        }
      }
      item = stack.pop();
      return A._Parser_toType(parser.u, parser.e, item);
    },
    _Parser_handleDigit(i, digit, source, stack) {
      var t1, ch,
        value = digit - 48;
      for (t1 = source.length; i < t1; ++i) {
        ch = source.charCodeAt(i);
        if (!(ch >= 48 && ch <= 57))
          break;
        value = value * 10 + (ch - 48);
      }
      stack.push(value);
      return i;
    },
    _Parser_handleIdentifier(parser, start, source, stack, hasPeriod) {
      var t1, ch, t2, string, environment, recipe,
        i = start + 1;
      for (t1 = source.length; i < t1; ++i) {
        ch = source.charCodeAt(i);
        if (ch === 46) {
          if (hasPeriod)
            break;
          hasPeriod = true;
        } else {
          if (!((((ch | 32) >>> 0) - 97 & 65535) < 26 || ch === 95 || ch === 36))
            t2 = ch >= 48 && ch <= 57;
          else
            t2 = true;
          if (!t2)
            break;
        }
      }
      string = source.substring(start, i);
      if (hasPeriod) {
        t1 = parser.u;
        environment = parser.e;
        if (environment._kind === 10)
          environment = environment._primary;
        recipe = A._Universe_findRule(t1, environment._primary)[string];
        if (recipe == null)
          A.throwExpression('No "' + string + '" in "' + A.Rti__getCanonicalRecipe(environment) + '"');
        stack.push(A._Universe_evalInEnvironment(t1, environment, recipe));
      } else
        stack.push(string);
      return i;
    },
    _Parser_handleExtendedOperations(parser, stack) {
      var $top = stack.pop();
      if (0 === $top) {
        stack.push(A._Universe__lookupTerminalRti(parser.u, 1, "0&"));
        return;
      }
      if (1 === $top) {
        stack.push(A._Universe__lookupTerminalRti(parser.u, 4, "1&"));
        return;
      }
      throw A.wrapException(A.AssertionError$("Unexpected extended operation " + A.S($top)));
    },
    _Parser_toType(universe, environment, item) {
      if (typeof item == "string")
        return A._Universe__lookupInterfaceRti(universe, item, universe.sEA);
      else if (typeof item == "number")
        return A._Parser_indexToType(universe, environment, item);
      else
        return item;
    },
    _Parser_toTypes(universe, environment, items) {
      var i,
        $length = items.length;
      for (i = 0; i < $length; ++i)
        items[i] = A._Parser_toType(universe, environment, items[i]);
    },
    _Parser_toTypesNamed(universe, environment, items) {
      var i,
        $length = items.length;
      for (i = 2; i < $length; i += 3)
        items[i] = A._Parser_toType(universe, environment, items[i]);
    },
    _Parser_indexToType(universe, environment, index) {
      var typeArguments, len,
        kind = environment._kind;
      if (kind === 10) {
        if (index === 0)
          return environment._primary;
        typeArguments = environment._rest;
        len = typeArguments.length;
        if (index <= len)
          return typeArguments[index - 1];
        index -= len;
        environment = environment._primary;
        kind = environment._kind;
      } else if (index === 0)
        return environment;
      if (kind !== 9)
        throw A.wrapException(A.AssertionError$("Indexed base must be an interface type"));
      typeArguments = environment._rest;
      if (index <= typeArguments.length)
        return typeArguments[index - 1];
      throw A.wrapException(A.AssertionError$("Bad index " + index + " for " + environment.toString$0(0)));
    },
    _isSubtype(universe, s, sEnv, t, tEnv) {
      var t1, sKind, leftTypeVariable, tKind, sBounds, tBounds, sLength, i, sBound, tBound;
      if (s === t)
        return true;
      if (!A.isStrongTopType(t))
        if (!(t === type$.legacy_Object))
          t1 = t === type$.Object;
        else
          t1 = true;
      else
        t1 = true;
      if (t1)
        return true;
      sKind = s._kind;
      if (sKind === 4)
        return true;
      if (A.isStrongTopType(s))
        return false;
      if (s._kind !== 1)
        t1 = s === type$.Null || s === type$.JSNull;
      else
        t1 = true;
      if (t1)
        return true;
      leftTypeVariable = sKind === 13;
      if (leftTypeVariable)
        if (A._isSubtype(universe, sEnv[s._primary], sEnv, t, tEnv))
          return true;
      tKind = t._kind;
      if (sKind === 6)
        return A._isSubtype(universe, s._primary, sEnv, t, tEnv);
      if (tKind === 6) {
        t1 = t._primary;
        return A._isSubtype(universe, s, sEnv, t1, tEnv);
      }
      if (sKind === 8) {
        if (!A._isSubtype(universe, s._primary, sEnv, t, tEnv))
          return false;
        return A._isSubtype(universe, A.Rti__getFutureFromFutureOr(universe, s), sEnv, t, tEnv);
      }
      if (sKind === 7) {
        t1 = A._isSubtype(universe, s._primary, sEnv, t, tEnv);
        return t1;
      }
      if (tKind === 8) {
        if (A._isSubtype(universe, s, sEnv, t._primary, tEnv))
          return true;
        return A._isSubtype(universe, s, sEnv, A.Rti__getFutureFromFutureOr(universe, t), tEnv);
      }
      if (tKind === 7) {
        t1 = A._isSubtype(universe, s, sEnv, t._primary, tEnv);
        return t1;
      }
      if (leftTypeVariable)
        return false;
      t1 = sKind !== 11;
      if ((!t1 || sKind === 12) && t === type$.Function)
        return true;
      if (tKind === 12) {
        if (s === type$.JavaScriptFunction)
          return true;
        if (sKind !== 12)
          return false;
        sBounds = s._rest;
        tBounds = t._rest;
        sLength = sBounds.length;
        if (sLength !== tBounds.length)
          return false;
        sEnv = sEnv == null ? sBounds : sBounds.concat(sEnv);
        tEnv = tEnv == null ? tBounds : tBounds.concat(tEnv);
        for (i = 0; i < sLength; ++i) {
          sBound = sBounds[i];
          tBound = tBounds[i];
          if (!A._isSubtype(universe, sBound, sEnv, tBound, tEnv) || !A._isSubtype(universe, tBound, tEnv, sBound, sEnv))
            return false;
        }
        return A._isFunctionSubtype(universe, s._primary, sEnv, t._primary, tEnv);
      }
      if (tKind === 11) {
        if (s === type$.JavaScriptFunction)
          return true;
        if (t1)
          return false;
        return A._isFunctionSubtype(universe, s, sEnv, t, tEnv);
      }
      if (sKind === 9) {
        if (tKind !== 9)
          return false;
        return A._isInterfaceSubtype(universe, s, sEnv, t, tEnv);
      }
      return false;
    },
    _isFunctionSubtype(universe, s, sEnv, t, tEnv) {
      var sParameters, tParameters, sRequiredPositional, tRequiredPositional, sRequiredPositionalLength, tRequiredPositionalLength, requiredPositionalDelta, sOptionalPositional, tOptionalPositional, sOptionalPositionalLength, tOptionalPositionalLength, i, t1, sNamed, tNamed, sNamedLength, tNamedLength, sIndex, tIndex, tName, sName;
      if (!A._isSubtype(universe, s._primary, sEnv, t._primary, tEnv))
        return false;
      sParameters = s._rest;
      tParameters = t._rest;
      sRequiredPositional = sParameters._requiredPositional;
      tRequiredPositional = tParameters._requiredPositional;
      sRequiredPositionalLength = sRequiredPositional.length;
      tRequiredPositionalLength = tRequiredPositional.length;
      if (sRequiredPositionalLength > tRequiredPositionalLength)
        return false;
      requiredPositionalDelta = tRequiredPositionalLength - sRequiredPositionalLength;
      sOptionalPositional = sParameters._optionalPositional;
      tOptionalPositional = tParameters._optionalPositional;
      sOptionalPositionalLength = sOptionalPositional.length;
      tOptionalPositionalLength = tOptionalPositional.length;
      if (sRequiredPositionalLength + sOptionalPositionalLength < tRequiredPositionalLength + tOptionalPositionalLength)
        return false;
      for (i = 0; i < sRequiredPositionalLength; ++i) {
        t1 = sRequiredPositional[i];
        if (!A._isSubtype(universe, tRequiredPositional[i], tEnv, t1, sEnv))
          return false;
      }
      for (i = 0; i < requiredPositionalDelta; ++i) {
        t1 = sOptionalPositional[i];
        if (!A._isSubtype(universe, tRequiredPositional[sRequiredPositionalLength + i], tEnv, t1, sEnv))
          return false;
      }
      for (i = 0; i < tOptionalPositionalLength; ++i) {
        t1 = sOptionalPositional[requiredPositionalDelta + i];
        if (!A._isSubtype(universe, tOptionalPositional[i], tEnv, t1, sEnv))
          return false;
      }
      sNamed = sParameters._named;
      tNamed = tParameters._named;
      sNamedLength = sNamed.length;
      tNamedLength = tNamed.length;
      for (sIndex = 0, tIndex = 0; tIndex < tNamedLength; tIndex += 3) {
        tName = tNamed[tIndex];
        for (; true;) {
          if (sIndex >= sNamedLength)
            return false;
          sName = sNamed[sIndex];
          sIndex += 3;
          if (tName < sName)
            return false;
          if (sName < tName)
            continue;
          t1 = sNamed[sIndex - 1];
          if (!A._isSubtype(universe, tNamed[tIndex + 2], tEnv, t1, sEnv))
            return false;
          break;
        }
      }
      return true;
    },
    _isInterfaceSubtype(universe, s, sEnv, t, tEnv) {
      var rule, recipes, $length, supertypeArgs, i, t1, t2,
        sName = s._primary,
        tName = t._primary;
      for (; sName !== tName;) {
        rule = universe.tR[sName];
        if (rule == null)
          return false;
        if (typeof rule == "string") {
          sName = rule;
          continue;
        }
        recipes = rule[tName];
        if (recipes == null)
          return false;
        $length = recipes.length;
        supertypeArgs = $length > 0 ? new Array($length) : init.typeUniverse.sEA;
        for (i = 0; i < $length; ++i)
          supertypeArgs[i] = A._Universe_evalInEnvironment(universe, s, recipes[i]);
        return A._areArgumentsSubtypes(universe, supertypeArgs, null, sEnv, t._rest, tEnv);
      }
      t1 = s._rest;
      t2 = t._rest;
      return A._areArgumentsSubtypes(universe, t1, null, sEnv, t2, tEnv);
    },
    _areArgumentsSubtypes(universe, sArgs, sVariances, sEnv, tArgs, tEnv) {
      var i, t1, t2,
        $length = sArgs.length;
      for (i = 0; i < $length; ++i) {
        t1 = sArgs[i];
        t2 = tArgs[i];
        if (!A._isSubtype(universe, t1, sEnv, t2, tEnv))
          return false;
      }
      return true;
    },
    isNullable(t) {
      var t1,
        kind = t._kind;
      if (!(t === type$.Null || t === type$.JSNull))
        if (!A.isStrongTopType(t))
          if (kind !== 7)
            if (!(kind === 6 && A.isNullable(t._primary)))
              t1 = kind === 8 && A.isNullable(t._primary);
            else
              t1 = true;
          else
            t1 = true;
        else
          t1 = true;
      else
        t1 = true;
      return t1;
    },
    isTopType(t) {
      var t1;
      if (!A.isStrongTopType(t))
        if (!(t === type$.legacy_Object))
          t1 = t === type$.Object;
        else
          t1 = true;
      else
        t1 = true;
      return t1;
    },
    isStrongTopType(t) {
      var kind = t._kind;
      return kind === 2 || kind === 3 || kind === 4 || kind === 5 || t === type$.nullable_Object;
    },
    _Utils_objectAssign(o, other) {
      var i, key,
        keys = Object.keys(other),
        $length = keys.length;
      for (i = 0; i < $length; ++i) {
        key = keys[i];
        o[key] = other[key];
      }
    },
    _Utils_newArrayOrEmpty($length) {
      return $length > 0 ? new Array($length) : init.typeUniverse.sEA;
    },
    Rti: function Rti(t0, t1) {
      var _ = this;
      _._as = t0;
      _._is = t1;
      _._cachedRuntimeType = _._specializedTestResource = _._precomputed1 = null;
      _._kind = 0;
      _._canonicalRecipe = _._bindCache = _._evalCache = _._rest = _._primary = null;
    },
    _FunctionParameters: function _FunctionParameters() {
      this._named = this._optionalPositional = this._requiredPositional = null;
    },
    _Type: function _Type(t0) {
      this._rti = t0;
    },
    _Error: function _Error() {
    },
    _TypeError: function _TypeError(t0) {
      this.__rti$_message = t0;
    },
    _AsyncRun__initializeScheduleImmediate() {
      var div, span, t1 = {};
      if (self.scheduleImmediate != null)
        return A.async__AsyncRun__scheduleImmediateJsOverride$closure();
      if (self.MutationObserver != null && self.document != null) {
        div = self.document.createElement("div");
        span = self.document.createElement("span");
        t1.storedCallback = null;
        new self.MutationObserver(A.convertDartClosureToJS(new A._AsyncRun__initializeScheduleImmediate_internalCallback(t1), 1)).observe(div, {childList: true});
        return new A._AsyncRun__initializeScheduleImmediate_closure(t1, div, span);
      } else if (self.setImmediate != null)
        return A.async__AsyncRun__scheduleImmediateWithSetImmediate$closure();
      return A.async__AsyncRun__scheduleImmediateWithTimer$closure();
    },
    _AsyncRun__scheduleImmediateJsOverride(callback) {
      self.scheduleImmediate(A.convertDartClosureToJS(new A._AsyncRun__scheduleImmediateJsOverride_internalCallback(type$.void_Function._as(callback)), 0));
    },
    _AsyncRun__scheduleImmediateWithSetImmediate(callback) {
      self.setImmediate(A.convertDartClosureToJS(new A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback(type$.void_Function._as(callback)), 0));
    },
    _AsyncRun__scheduleImmediateWithTimer(callback) {
      A.Timer__createTimer(B.Duration_0, type$.void_Function._as(callback));
    },
    Timer__createTimer(duration, callback) {
      var milliseconds = B.JSInt_methods._tdivFast$1(duration._duration, 1000);
      return A._TimerImpl$(milliseconds < 0 ? 0 : milliseconds, callback);
    },
    _TimerImpl$(milliseconds, callback) {
      var t1 = new A._TimerImpl(true);
      t1._TimerImpl$2(milliseconds, callback);
      return t1;
    },
    _TimerImpl$periodic(milliseconds, callback) {
      var t1 = new A._TimerImpl(false);
      t1._TimerImpl$periodic$2(milliseconds, callback);
      return t1;
    },
    _makeAsyncAwaitCompleter($T) {
      return new A._AsyncAwaitCompleter(new A._Future($.Zone__current, $T._eval$1("_Future<0>")), $T._eval$1("_AsyncAwaitCompleter<0>"));
    },
    _asyncStartSync(bodyFunction, completer) {
      bodyFunction.call$2(0, null);
      completer.isSync = true;
      return completer._future;
    },
    _asyncAwait(object, bodyFunction) {
      A._awaitOnObject(object, bodyFunction);
    },
    _asyncReturn(object, completer) {
      completer.complete$1(0, object);
    },
    _asyncRethrow(object, completer) {
      completer.completeError$2(A.unwrapException(object), A.getTraceFromException(object));
    },
    _awaitOnObject(object, bodyFunction) {
      var t1, future,
        thenCallback = new A._awaitOnObject_closure(bodyFunction),
        errorCallback = new A._awaitOnObject_closure0(bodyFunction);
      if (object instanceof A._Future)
        object._thenAwait$1$2(thenCallback, errorCallback, type$.dynamic);
      else {
        t1 = type$.dynamic;
        if (type$.Future_dynamic._is(object))
          object.then$1$2$onError(0, thenCallback, errorCallback, t1);
        else {
          future = new A._Future($.Zone__current, type$._Future_dynamic);
          future._state = 8;
          future._resultOrListeners = object;
          future._thenAwait$1$2(thenCallback, errorCallback, t1);
        }
      }
    },
    _wrapJsFunctionForAsync($function) {
      var $protected = function(fn, ERROR) {
        return function(errorCode, result) {
          while (true)
            try {
              fn(errorCode, result);
              break;
            } catch (error) {
              result = error;
              errorCode = ERROR;
            }
        };
      }($function, 1);
      return $.Zone__current.registerBinaryCallback$3$1(new A._wrapJsFunctionForAsync_closure($protected), type$.void, type$.int, type$.dynamic);
    },
    AsyncError$(error, stackTrace) {
      var t1 = A.checkNotNullable(error, "error", type$.Object);
      return new A.AsyncError(t1, stackTrace == null ? A.AsyncError_defaultStackTrace(error) : stackTrace);
    },
    AsyncError_defaultStackTrace(error) {
      var stackTrace;
      if (type$.Error._is(error)) {
        stackTrace = error.get$stackTrace();
        if (stackTrace != null)
          return stackTrace;
      }
      return B._StringStackTrace_3uE;
    },
    Future_Future$microtask(computation, $T) {
      var result = new A._Future($.Zone__current, $T._eval$1("_Future<0>"));
      A.scheduleMicrotask(new A.Future_Future$microtask_closure(result, computation));
      return result;
    },
    Future_Future$sync(computation, $T) {
      var result, error, stackTrace, future, replacement, t1, t2, exception;
      try {
        result = computation.call$0();
        if ($T._eval$1("Future<0>")._is(result))
          return result;
        else {
          t1 = $T._as(result);
          t2 = new A._Future($.Zone__current, $T._eval$1("_Future<0>"));
          t2._state = 8;
          t2._resultOrListeners = t1;
          return t2;
        }
      } catch (exception) {
        error = A.unwrapException(exception);
        stackTrace = A.getTraceFromException(exception);
        t1 = $.Zone__current;
        future = new A._Future(t1, $T._eval$1("_Future<0>"));
        replacement = t1.errorCallback$2(error, stackTrace);
        if (replacement != null)
          future._asyncCompleteError$2(replacement.error, replacement.stackTrace);
        else
          future._asyncCompleteError$2(error, stackTrace);
        return future;
      }
    },
    Future_Future$value(value, $T) {
      var t1 = new A._Future($.Zone__current, $T._eval$1("_Future<0>"));
      t1._asyncComplete$1(value);
      return t1;
    },
    Completer_Completer($T) {
      return new A._AsyncCompleter(new A._Future($.Zone__current, $T._eval$1("_Future<0>")), $T._eval$1("_AsyncCompleter<0>"));
    },
    _completeWithErrorCallback(result, error, stackTrace) {
      var replacement = $.Zone__current.errorCallback$2(error, stackTrace);
      if (replacement != null) {
        error = replacement.error;
        stackTrace = replacement.stackTrace;
      } else if (stackTrace == null)
        stackTrace = A.AsyncError_defaultStackTrace(error);
      result._completeError$2(error, stackTrace);
    },
    _Future__chainCoreFuture(source, target) {
      var t1, t2, listeners;
      for (t1 = type$._Future_dynamic; t2 = source._state, (t2 & 4) !== 0;)
        source = t1._as(source._resultOrListeners);
      if ((t2 & 24) !== 0) {
        listeners = target._removeListeners$0();
        target._cloneResult$1(source);
        A._Future__propagateToListeners(target, listeners);
      } else {
        listeners = type$.nullable__FutureListener_dynamic_dynamic._as(target._resultOrListeners);
        target._state = target._state & 1 | 4;
        target._resultOrListeners = source;
        source._prependListeners$1(listeners);
      }
    },
    _Future__propagateToListeners(source, listeners) {
      var t2, t3, t4, _box_0, t5, t6, hasError, asyncError, nextListener, nextListener0, sourceResult, t7, zone, oldZone, result, current, _box_1 = {},
        t1 = _box_1.source = source;
      for (t2 = type$.AsyncError, t3 = type$.nullable__FutureListener_dynamic_dynamic, t4 = type$.Future_dynamic; true;) {
        _box_0 = {};
        t5 = t1._state;
        t6 = (t5 & 16) === 0;
        hasError = !t6;
        if (listeners == null) {
          if (hasError && (t5 & 1) === 0) {
            asyncError = t2._as(t1._resultOrListeners);
            t1._zone.handleUncaughtError$2(asyncError.error, asyncError.stackTrace);
          }
          return;
        }
        _box_0.listener = listeners;
        nextListener = listeners._nextListener;
        for (t1 = listeners; nextListener != null; t1 = nextListener, nextListener = nextListener0) {
          t1._nextListener = null;
          A._Future__propagateToListeners(_box_1.source, t1);
          _box_0.listener = nextListener;
          nextListener0 = nextListener._nextListener;
        }
        t5 = _box_1.source;
        sourceResult = t5._resultOrListeners;
        _box_0.listenerHasError = hasError;
        _box_0.listenerValueOrError = sourceResult;
        if (t6) {
          t7 = t1.state;
          t7 = (t7 & 1) !== 0 || (t7 & 15) === 8;
        } else
          t7 = true;
        if (t7) {
          zone = t1.result._zone;
          if (hasError) {
            t1 = t5._zone;
            t1.toString;
            t1 = !(t1 === zone || t1.get$errorZone() === zone.get$errorZone());
          } else
            t1 = false;
          if (t1) {
            t1 = _box_1.source;
            asyncError = t2._as(t1._resultOrListeners);
            t1._zone.handleUncaughtError$2(asyncError.error, asyncError.stackTrace);
            return;
          }
          oldZone = $.Zone__current;
          if (oldZone != zone)
            $.Zone__current = zone;
          else
            oldZone = null;
          t1 = _box_0.listener.state;
          if ((t1 & 15) === 8)
            new A._Future__propagateToListeners_handleWhenCompleteCallback(_box_0, _box_1, hasError).call$0();
          else if (t6) {
            if ((t1 & 1) !== 0)
              new A._Future__propagateToListeners_handleValueCallback(_box_0, sourceResult).call$0();
          } else if ((t1 & 2) !== 0)
            new A._Future__propagateToListeners_handleError(_box_1, _box_0).call$0();
          if (oldZone != null)
            $.Zone__current = oldZone;
          t1 = _box_0.listenerValueOrError;
          if (t4._is(t1)) {
            t5 = _box_0.listener.$ti;
            t5 = t5._eval$1("Future<2>")._is(t1) || !t5._rest[1]._is(t1);
          } else
            t5 = false;
          if (t5) {
            t4._as(t1);
            result = _box_0.listener.result;
            if (t1 instanceof A._Future)
              if ((t1._state & 24) !== 0) {
                current = t3._as(result._resultOrListeners);
                result._resultOrListeners = null;
                listeners = result._reverseListeners$1(current);
                result._state = t1._state & 30 | result._state & 1;
                result._resultOrListeners = t1._resultOrListeners;
                _box_1.source = t1;
                continue;
              } else
                A._Future__chainCoreFuture(t1, result);
            else
              result._chainForeignFuture$1(t1);
            return;
          }
        }
        result = _box_0.listener.result;
        current = t3._as(result._resultOrListeners);
        result._resultOrListeners = null;
        listeners = result._reverseListeners$1(current);
        t1 = _box_0.listenerHasError;
        t5 = _box_0.listenerValueOrError;
        if (!t1) {
          result.$ti._precomputed1._as(t5);
          result._state = 8;
          result._resultOrListeners = t5;
        } else {
          t2._as(t5);
          result._state = result._state & 1 | 16;
          result._resultOrListeners = t5;
        }
        _box_1.source = result;
        t1 = result;
      }
    },
    _registerErrorHandler(errorHandler, zone) {
      if (type$.dynamic_Function_Object_StackTrace._is(errorHandler))
        return zone.registerBinaryCallback$3$1(errorHandler, type$.dynamic, type$.Object, type$.StackTrace);
      if (type$.dynamic_Function_Object._is(errorHandler))
        return zone.registerUnaryCallback$2$1(errorHandler, type$.dynamic, type$.Object);
      throw A.wrapException(A.ArgumentError$value(errorHandler, "onError", string$.Error_));
    },
    _microtaskLoop() {
      var entry, next;
      for (entry = $._nextCallback; entry != null; entry = $._nextCallback) {
        $._lastPriorityCallback = null;
        next = entry.next;
        $._nextCallback = next;
        if (next == null)
          $._lastCallback = null;
        entry.callback.call$0();
      }
    },
    _startMicrotaskLoop() {
      $._isInCallbackLoop = true;
      try {
        A._microtaskLoop();
      } finally {
        $._lastPriorityCallback = null;
        $._isInCallbackLoop = false;
        if ($._nextCallback != null)
          $.$get$_AsyncRun__scheduleImmediateClosure().call$1(A.async___startMicrotaskLoop$closure());
      }
    },
    _scheduleAsyncCallback(callback) {
      var newEntry = new A._AsyncCallbackEntry(callback),
        lastCallback = $._lastCallback;
      if (lastCallback == null) {
        $._nextCallback = $._lastCallback = newEntry;
        if (!$._isInCallbackLoop)
          $.$get$_AsyncRun__scheduleImmediateClosure().call$1(A.async___startMicrotaskLoop$closure());
      } else
        $._lastCallback = lastCallback.next = newEntry;
    },
    _schedulePriorityAsyncCallback(callback) {
      var entry, lastPriorityCallback, next,
        t1 = $._nextCallback;
      if (t1 == null) {
        A._scheduleAsyncCallback(callback);
        $._lastPriorityCallback = $._lastCallback;
        return;
      }
      entry = new A._AsyncCallbackEntry(callback);
      lastPriorityCallback = $._lastPriorityCallback;
      if (lastPriorityCallback == null) {
        entry.next = t1;
        $._nextCallback = $._lastPriorityCallback = entry;
      } else {
        next = lastPriorityCallback.next;
        entry.next = next;
        $._lastPriorityCallback = lastPriorityCallback.next = entry;
        if (next == null)
          $._lastCallback = entry;
      }
    },
    scheduleMicrotask(callback) {
      var t1, _null = null,
        currentZone = $.Zone__current;
      if (B.C__RootZone === currentZone) {
        A._rootScheduleMicrotask(_null, _null, B.C__RootZone, callback);
        return;
      }
      if (B.C__RootZone === currentZone.get$_scheduleMicrotask().zone)
        t1 = B.C__RootZone.get$errorZone() === currentZone.get$errorZone();
      else
        t1 = false;
      if (t1) {
        A._rootScheduleMicrotask(_null, _null, currentZone, currentZone.registerCallback$1$1(callback, type$.void));
        return;
      }
      t1 = $.Zone__current;
      t1.scheduleMicrotask$1(t1.bindCallbackGuarded$1(callback));
    },
    StreamIterator_StreamIterator(stream, $T) {
      A.checkNotNullable(stream, "stream", type$.Object);
      return new A._StreamIterator($T._eval$1("_StreamIterator<0>"));
    },
    StreamController_StreamController(onCancel, onListen, sync, $T) {
      var _null = null;
      return sync ? new A._SyncStreamController(onListen, _null, _null, onCancel, $T._eval$1("_SyncStreamController<0>")) : new A._AsyncStreamController(onListen, _null, _null, onCancel, $T._eval$1("_AsyncStreamController<0>"));
    },
    _runGuarded(notificationHandler) {
      var e, s, exception;
      if (notificationHandler == null)
        return;
      try {
        notificationHandler.call$0();
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        $.Zone__current.handleUncaughtError$2(e, s);
      }
    },
    _BufferingStreamSubscription__registerDataHandler(zone, handleData, $T) {
      var t1 = handleData == null ? A.async___nullDataHandler$closure() : handleData;
      return zone.registerUnaryCallback$2$1(t1, type$.void, $T);
    },
    _BufferingStreamSubscription__registerErrorHandler(zone, handleError) {
      if (handleError == null)
        handleError = A.async___nullErrorHandler$closure();
      if (type$.void_Function_Object_StackTrace._is(handleError))
        return zone.registerBinaryCallback$3$1(handleError, type$.dynamic, type$.Object, type$.StackTrace);
      if (type$.void_Function_Object._is(handleError))
        return zone.registerUnaryCallback$2$1(handleError, type$.dynamic, type$.Object);
      throw A.wrapException(A.ArgumentError$("handleError callback must take either an Object (the error), or both an Object (the error) and a StackTrace.", null));
    },
    _nullDataHandler(value) {
    },
    _nullErrorHandler(error, stackTrace) {
      type$.StackTrace._as(stackTrace);
      $.Zone__current.handleUncaughtError$2(error, stackTrace);
    },
    _nullDoneHandler() {
    },
    _cancelAndValue(subscription, future, value) {
      var cancelFuture = subscription.cancel$0(0);
      if (cancelFuture != null && cancelFuture !== $.$get$Future__nullFuture())
        cancelFuture.whenComplete$1(new A._cancelAndValue_closure(future, value));
      else
        future._complete$1(value);
    },
    Timer_Timer(duration, callback) {
      var t1 = $.Zone__current;
      if (t1 === B.C__RootZone)
        return t1.createTimer$2(duration, callback);
      return t1.createTimer$2(duration, t1.bindCallbackGuarded$1(callback));
    },
    ZoneSpecification_ZoneSpecification$from(other, handleUncaughtError) {
      var t1 = handleUncaughtError == null ? other.handleUncaughtError : handleUncaughtError;
      return new A._ZoneSpecification(t1, other.run, other.runUnary, other.runBinary, other.registerCallback, other.registerUnaryCallback, other.registerBinaryCallback, other.errorCallback, other.scheduleMicrotask, other.createTimer, other.createPeriodicTimer, other.print, other.fork);
    },
    _rootHandleUncaughtError($self, $parent, zone, error, stackTrace) {
      A._rootHandleError(error, type$.StackTrace._as(stackTrace));
    },
    _rootHandleError(error, stackTrace) {
      A._schedulePriorityAsyncCallback(new A._rootHandleError_closure(error, stackTrace));
    },
    _rootRun($self, $parent, zone, f, $R) {
      var old, t1;
      type$.nullable_Zone._as($self);
      type$.nullable_ZoneDelegate._as($parent);
      type$.Zone._as(zone);
      $R._eval$1("0()")._as(f);
      t1 = $.Zone__current;
      if (t1 == zone)
        return f.call$0();
      if (!(zone instanceof A._Zone))
        throw A.wrapException(A.ArgumentError$value(zone, "zone", "Can only run in platform zones"));
      $.Zone__current = zone;
      old = t1;
      try {
        t1 = f.call$0();
        return t1;
      } finally {
        $.Zone__current = old;
      }
    },
    _rootRunUnary($self, $parent, zone, f, arg, $R, $T) {
      var old, t1;
      type$.nullable_Zone._as($self);
      type$.nullable_ZoneDelegate._as($parent);
      type$.Zone._as(zone);
      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
      $T._as(arg);
      t1 = $.Zone__current;
      if (t1 == zone)
        return f.call$1(arg);
      if (!(zone instanceof A._Zone))
        throw A.wrapException(A.ArgumentError$value(zone, "zone", "Can only run in platform zones"));
      $.Zone__current = zone;
      old = t1;
      try {
        t1 = f.call$1(arg);
        return t1;
      } finally {
        $.Zone__current = old;
      }
    },
    _rootRunBinary($self, $parent, zone, f, arg1, arg2, $R, T1, T2) {
      var old, t1;
      type$.nullable_Zone._as($self);
      type$.nullable_ZoneDelegate._as($parent);
      type$.Zone._as(zone);
      $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
      T1._as(arg1);
      T2._as(arg2);
      t1 = $.Zone__current;
      if (t1 == zone)
        return f.call$2(arg1, arg2);
      if (!(zone instanceof A._Zone))
        throw A.wrapException(A.ArgumentError$value(zone, "zone", "Can only run in platform zones"));
      $.Zone__current = zone;
      old = t1;
      try {
        t1 = f.call$2(arg1, arg2);
        return t1;
      } finally {
        $.Zone__current = old;
      }
    },
    _rootRegisterCallback($self, $parent, zone, f, $R) {
      return $R._eval$1("0()")._as(f);
    },
    _rootRegisterUnaryCallback($self, $parent, zone, f, $R, $T) {
      return $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
    },
    _rootRegisterBinaryCallback($self, $parent, zone, f, $R, T1, T2) {
      return $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
    },
    _rootErrorCallback($self, $parent, zone, error, stackTrace) {
      type$.nullable_StackTrace._as(stackTrace);
      return null;
    },
    _rootScheduleMicrotask($self, $parent, zone, f) {
      var t1, t2;
      type$.void_Function._as(f);
      if (B.C__RootZone !== zone) {
        t1 = B.C__RootZone.get$errorZone();
        t2 = zone.get$errorZone();
        f = t1 !== t2 ? zone.bindCallbackGuarded$1(f) : zone.bindCallback$1$1(f, type$.void);
      }
      A._scheduleAsyncCallback(f);
    },
    _rootCreateTimer($self, $parent, zone, duration, callback) {
      type$.Duration._as(duration);
      type$.void_Function._as(callback);
      return A.Timer__createTimer(duration, B.C__RootZone !== zone ? zone.bindCallback$1$1(callback, type$.void) : callback);
    },
    _rootCreatePeriodicTimer($self, $parent, zone, duration, callback) {
      var milliseconds;
      type$.Duration._as(duration);
      type$.void_Function_Timer._as(callback);
      if (B.C__RootZone !== zone)
        callback = zone.bindUnaryCallback$2$1(callback, type$.void, type$.Timer);
      milliseconds = B.JSInt_methods._tdivFast$1(duration._duration, 1000);
      return A._TimerImpl$periodic(milliseconds < 0 ? 0 : milliseconds, callback);
    },
    _rootPrint($self, $parent, zone, line) {
      A.printString(A._asStringS(line));
    },
    _printToZone(line) {
      $.Zone__current.print$1(0, line);
    },
    _rootFork($self, $parent, zone, specification, zoneValues) {
      var valueMap, t1, handleUncaughtError;
      type$.nullable_ZoneSpecification._as(specification);
      type$.nullable_Map_of_nullable_Object_and_nullable_Object._as(zoneValues);
      $.printToZone = A.async___printToZone$closure();
      if (specification == null)
        specification = B._ZoneSpecification_ALf;
      valueMap = zone.get$_async$_map();
      t1 = new A._CustomZone(zone.get$_run(), zone.get$_runUnary(), zone.get$_runBinary(), zone.get$_registerCallback(), zone.get$_registerUnaryCallback(), zone.get$_registerBinaryCallback(), zone.get$_errorCallback(), zone.get$_scheduleMicrotask(), zone.get$_createTimer(), zone.get$_createPeriodicTimer(), zone.get$_print(), zone.get$_fork(), zone.get$_handleUncaughtError(), zone, valueMap);
      handleUncaughtError = specification.handleUncaughtError;
      if (handleUncaughtError != null)
        t1.set$_handleUncaughtError(new A._ZoneFunction(t1, handleUncaughtError, type$._ZoneFunction_of_void_Function_Zone_ZoneDelegate_Zone_Object_StackTrace));
      return t1;
    },
    runZonedGuarded(body, onError, $R) {
      var error, stackTrace, parentZone, errorHandler, t1, exception, _null = null, zoneSpecification = null, zoneValues = null;
      A.checkNotNullable(body, "body", $R._eval$1("0()"));
      A.checkNotNullable(onError, "onError", type$.void_Function_Object_StackTrace);
      parentZone = $.Zone__current;
      errorHandler = new A.runZonedGuarded_closure(parentZone, onError);
      if (zoneSpecification == null)
        zoneSpecification = new A._ZoneSpecification(errorHandler, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null);
      else
        zoneSpecification = A.ZoneSpecification_ZoneSpecification$from(zoneSpecification, errorHandler);
      try {
        t1 = parentZone.fork$2$specification$zoneValues(zoneSpecification, zoneValues).run$1$1(body, $R);
        return t1;
      } catch (exception) {
        error = A.unwrapException(exception);
        stackTrace = A.getTraceFromException(exception);
        onError.call$2(error, stackTrace);
      }
      return _null;
    },
    _AsyncRun__initializeScheduleImmediate_internalCallback: function _AsyncRun__initializeScheduleImmediate_internalCallback(t0) {
      this._box_0 = t0;
    },
    _AsyncRun__initializeScheduleImmediate_closure: function _AsyncRun__initializeScheduleImmediate_closure(t0, t1, t2) {
      this._box_0 = t0;
      this.div = t1;
      this.span = t2;
    },
    _AsyncRun__scheduleImmediateJsOverride_internalCallback: function _AsyncRun__scheduleImmediateJsOverride_internalCallback(t0) {
      this.callback = t0;
    },
    _AsyncRun__scheduleImmediateWithSetImmediate_internalCallback: function _AsyncRun__scheduleImmediateWithSetImmediate_internalCallback(t0) {
      this.callback = t0;
    },
    _TimerImpl: function _TimerImpl(t0) {
      this._once = t0;
      this._handle = null;
      this._tick = 0;
    },
    _TimerImpl_internalCallback: function _TimerImpl_internalCallback(t0, t1) {
      this.$this = t0;
      this.callback = t1;
    },
    _TimerImpl$periodic_closure: function _TimerImpl$periodic_closure(t0, t1, t2, t3) {
      var _ = this;
      _.$this = t0;
      _.milliseconds = t1;
      _.start = t2;
      _.callback = t3;
    },
    _AsyncAwaitCompleter: function _AsyncAwaitCompleter(t0, t1) {
      this._future = t0;
      this.isSync = false;
      this.$ti = t1;
    },
    _awaitOnObject_closure: function _awaitOnObject_closure(t0) {
      this.bodyFunction = t0;
    },
    _awaitOnObject_closure0: function _awaitOnObject_closure0(t0) {
      this.bodyFunction = t0;
    },
    _wrapJsFunctionForAsync_closure: function _wrapJsFunctionForAsync_closure(t0) {
      this.$protected = t0;
    },
    AsyncError: function AsyncError(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    },
    Future_Future$microtask_closure: function Future_Future$microtask_closure(t0, t1) {
      this.result = t0;
      this.computation = t1;
    },
    _Completer: function _Completer() {
    },
    _AsyncCompleter: function _AsyncCompleter(t0, t1) {
      this.future = t0;
      this.$ti = t1;
    },
    _SyncCompleter: function _SyncCompleter(t0, t1) {
      this.future = t0;
      this.$ti = t1;
    },
    _FutureListener: function _FutureListener(t0, t1, t2, t3, t4) {
      var _ = this;
      _._nextListener = null;
      _.result = t0;
      _.state = t1;
      _.callback = t2;
      _.errorCallback = t3;
      _.$ti = t4;
    },
    _Future: function _Future(t0, t1) {
      var _ = this;
      _._state = 0;
      _._zone = t0;
      _._resultOrListeners = null;
      _.$ti = t1;
    },
    _Future__addListener_closure: function _Future__addListener_closure(t0, t1) {
      this.$this = t0;
      this.listener = t1;
    },
    _Future__prependListeners_closure: function _Future__prependListeners_closure(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    _Future__chainForeignFuture_closure: function _Future__chainForeignFuture_closure(t0) {
      this.$this = t0;
    },
    _Future__chainForeignFuture_closure0: function _Future__chainForeignFuture_closure0(t0) {
      this.$this = t0;
    },
    _Future__chainForeignFuture_closure1: function _Future__chainForeignFuture_closure1(t0, t1, t2) {
      this.$this = t0;
      this.e = t1;
      this.s = t2;
    },
    _Future__asyncCompleteWithValue_closure: function _Future__asyncCompleteWithValue_closure(t0, t1) {
      this.$this = t0;
      this.value = t1;
    },
    _Future__chainFuture_closure: function _Future__chainFuture_closure(t0, t1) {
      this.$this = t0;
      this.value = t1;
    },
    _Future__asyncCompleteError_closure: function _Future__asyncCompleteError_closure(t0, t1, t2) {
      this.$this = t0;
      this.error = t1;
      this.stackTrace = t2;
    },
    _Future__propagateToListeners_handleWhenCompleteCallback: function _Future__propagateToListeners_handleWhenCompleteCallback(t0, t1, t2) {
      this._box_0 = t0;
      this._box_1 = t1;
      this.hasError = t2;
    },
    _Future__propagateToListeners_handleWhenCompleteCallback_closure: function _Future__propagateToListeners_handleWhenCompleteCallback_closure(t0) {
      this.originalSource = t0;
    },
    _Future__propagateToListeners_handleValueCallback: function _Future__propagateToListeners_handleValueCallback(t0, t1) {
      this._box_0 = t0;
      this.sourceResult = t1;
    },
    _Future__propagateToListeners_handleError: function _Future__propagateToListeners_handleError(t0, t1) {
      this._box_1 = t0;
      this._box_0 = t1;
    },
    _AsyncCallbackEntry: function _AsyncCallbackEntry(t0) {
      this.callback = t0;
      this.next = null;
    },
    Stream: function Stream() {
    },
    Stream_length_closure: function Stream_length_closure(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    Stream_length_closure0: function Stream_length_closure0(t0, t1) {
      this._box_0 = t0;
      this.future = t1;
    },
    Stream_first_closure: function Stream_first_closure(t0) {
      this.future = t0;
    },
    Stream_first_closure0: function Stream_first_closure0(t0, t1, t2) {
      this.$this = t0;
      this.subscription = t1;
      this.future = t2;
    },
    StreamSubscription: function StreamSubscription() {
    },
    StreamTransformerBase: function StreamTransformerBase() {
    },
    _StreamController: function _StreamController() {
    },
    _StreamController__subscribe_closure: function _StreamController__subscribe_closure(t0) {
      this.$this = t0;
    },
    _StreamController__recordCancel_complete: function _StreamController__recordCancel_complete(t0) {
      this.$this = t0;
    },
    _SyncStreamControllerDispatch: function _SyncStreamControllerDispatch() {
    },
    _AsyncStreamControllerDispatch: function _AsyncStreamControllerDispatch() {
    },
    _AsyncStreamController: function _AsyncStreamController(t0, t1, t2, t3, t4) {
      var _ = this;
      _._varData = null;
      _._state = 0;
      _._doneFuture = null;
      _.onListen = t0;
      _.onPause = t1;
      _.onResume = t2;
      _.onCancel = t3;
      _.$ti = t4;
    },
    _SyncStreamController: function _SyncStreamController(t0, t1, t2, t3, t4) {
      var _ = this;
      _._varData = null;
      _._state = 0;
      _._doneFuture = null;
      _.onListen = t0;
      _.onPause = t1;
      _.onResume = t2;
      _.onCancel = t3;
      _.$ti = t4;
    },
    _ControllerStream: function _ControllerStream(t0, t1) {
      this._controller = t0;
      this.$ti = t1;
    },
    _ControllerSubscription: function _ControllerSubscription(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _._controller = t0;
      _._async$_onData = t1;
      _._onError = t2;
      _._onDone = t3;
      _._zone = t4;
      _._state = t5;
      _._pending = _._cancelFuture = null;
      _.$ti = t6;
    },
    _StreamSinkWrapper: function _StreamSinkWrapper(t0, t1) {
      this._async$_target = t0;
      this.$ti = t1;
    },
    _BufferingStreamSubscription: function _BufferingStreamSubscription() {
    },
    _BufferingStreamSubscription_asFuture_closure: function _BufferingStreamSubscription_asFuture_closure(t0, t1) {
      this._box_0 = t0;
      this.result = t1;
    },
    _BufferingStreamSubscription_asFuture_closure0: function _BufferingStreamSubscription_asFuture_closure0(t0, t1) {
      this.$this = t0;
      this.result = t1;
    },
    _BufferingStreamSubscription_asFuture__closure: function _BufferingStreamSubscription_asFuture__closure(t0, t1, t2) {
      this.result = t0;
      this.error = t1;
      this.stackTrace = t2;
    },
    _BufferingStreamSubscription__sendError_sendError: function _BufferingStreamSubscription__sendError_sendError(t0, t1, t2) {
      this.$this = t0;
      this.error = t1;
      this.stackTrace = t2;
    },
    _BufferingStreamSubscription__sendDone_sendDone: function _BufferingStreamSubscription__sendDone_sendDone(t0) {
      this.$this = t0;
    },
    _StreamImpl: function _StreamImpl() {
    },
    _DelayedEvent: function _DelayedEvent() {
    },
    _DelayedData: function _DelayedData(t0, t1) {
      this.value = t0;
      this.next = null;
      this.$ti = t1;
    },
    _DelayedError: function _DelayedError(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
      this.next = null;
    },
    _DelayedDone: function _DelayedDone() {
    },
    _PendingEvents: function _PendingEvents() {
    },
    _PendingEvents_schedule_closure: function _PendingEvents_schedule_closure(t0, t1) {
      this.$this = t0;
      this.dispatch = t1;
    },
    _StreamImplEvents: function _StreamImplEvents(t0) {
      var _ = this;
      _.lastPendingEvent = _.firstPendingEvent = null;
      _._state = 0;
      _.$ti = t0;
    },
    _StreamIterator: function _StreamIterator(t0) {
      this.$ti = t0;
    },
    _cancelAndValue_closure: function _cancelAndValue_closure(t0, t1) {
      this.future = t0;
      this.value = t1;
    },
    _ForwardingStream: function _ForwardingStream() {
    },
    _ForwardingStreamSubscription: function _ForwardingStreamSubscription(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _._stream = t0;
      _._subscription = null;
      _._async$_onData = t1;
      _._onError = t2;
      _._onDone = t3;
      _._zone = t4;
      _._state = t5;
      _._pending = _._cancelFuture = null;
      _.$ti = t6;
    },
    _MapStream: function _MapStream(t0, t1, t2) {
      this._transform = t0;
      this._source = t1;
      this.$ti = t2;
    },
    _ZoneFunction: function _ZoneFunction(t0, t1, t2) {
      this.zone = t0;
      this.$function = t1;
      this.$ti = t2;
    },
    _RunNullaryZoneFunction: function _RunNullaryZoneFunction(t0, t1) {
      this.zone = t0;
      this.$function = t1;
    },
    _RunUnaryZoneFunction: function _RunUnaryZoneFunction(t0, t1) {
      this.zone = t0;
      this.$function = t1;
    },
    _RunBinaryZoneFunction: function _RunBinaryZoneFunction(t0, t1) {
      this.zone = t0;
      this.$function = t1;
    },
    _RegisterNullaryZoneFunction: function _RegisterNullaryZoneFunction(t0, t1) {
      this.zone = t0;
      this.$function = t1;
    },
    _RegisterUnaryZoneFunction: function _RegisterUnaryZoneFunction(t0, t1) {
      this.zone = t0;
      this.$function = t1;
    },
    _RegisterBinaryZoneFunction: function _RegisterBinaryZoneFunction(t0, t1) {
      this.zone = t0;
      this.$function = t1;
    },
    _ZoneSpecification: function _ZoneSpecification(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) {
      var _ = this;
      _.handleUncaughtError = t0;
      _.run = t1;
      _.runUnary = t2;
      _.runBinary = t3;
      _.registerCallback = t4;
      _.registerUnaryCallback = t5;
      _.registerBinaryCallback = t6;
      _.errorCallback = t7;
      _.scheduleMicrotask = t8;
      _.createTimer = t9;
      _.createPeriodicTimer = t10;
      _.print = t11;
      _.fork = t12;
    },
    _ZoneDelegate: function _ZoneDelegate(t0) {
      this._delegationTarget = t0;
    },
    _Zone: function _Zone() {
    },
    _CustomZone: function _CustomZone(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14) {
      var _ = this;
      _._run = t0;
      _._runUnary = t1;
      _._runBinary = t2;
      _._registerCallback = t3;
      _._registerUnaryCallback = t4;
      _._registerBinaryCallback = t5;
      _._errorCallback = t6;
      _._scheduleMicrotask = t7;
      _._createTimer = t8;
      _._createPeriodicTimer = t9;
      _._print = t10;
      _._fork = t11;
      _._handleUncaughtError = t12;
      _._delegateCache = null;
      _.parent = t13;
      _._async$_map = t14;
    },
    _CustomZone_bindCallback_closure: function _CustomZone_bindCallback_closure(t0, t1, t2) {
      this.$this = t0;
      this.registered = t1;
      this.R = t2;
    },
    _CustomZone_bindUnaryCallback_closure: function _CustomZone_bindUnaryCallback_closure(t0, t1, t2, t3) {
      var _ = this;
      _.$this = t0;
      _.registered = t1;
      _.T = t2;
      _.R = t3;
    },
    _CustomZone_bindCallbackGuarded_closure: function _CustomZone_bindCallbackGuarded_closure(t0, t1) {
      this.$this = t0;
      this.registered = t1;
    },
    _CustomZone_bindUnaryCallbackGuarded_closure: function _CustomZone_bindUnaryCallbackGuarded_closure(t0, t1, t2) {
      this.$this = t0;
      this.registered = t1;
      this.T = t2;
    },
    _rootHandleError_closure: function _rootHandleError_closure(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    },
    _RootZone: function _RootZone() {
    },
    _RootZone_bindCallback_closure: function _RootZone_bindCallback_closure(t0, t1, t2) {
      this.$this = t0;
      this.f = t1;
      this.R = t2;
    },
    _RootZone_bindUnaryCallback_closure: function _RootZone_bindUnaryCallback_closure(t0, t1, t2, t3) {
      var _ = this;
      _.$this = t0;
      _.f = t1;
      _.T = t2;
      _.R = t3;
    },
    _RootZone_bindCallbackGuarded_closure: function _RootZone_bindCallbackGuarded_closure(t0, t1) {
      this.$this = t0;
      this.f = t1;
    },
    _RootZone_bindUnaryCallbackGuarded_closure: function _RootZone_bindUnaryCallbackGuarded_closure(t0, t1, t2) {
      this.$this = t0;
      this.f = t1;
      this.T = t2;
    },
    runZonedGuarded_closure: function runZonedGuarded_closure(t0, t1) {
      this.parentZone = t0;
      this.onError = t1;
    },
    HashMap_HashMap(equals, hashCode, isValidKey, $K, $V) {
      if (isValidKey == null)
        if (hashCode == null) {
          if (equals == null)
            return new A._HashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("_HashMap<1,2>"));
          hashCode = A.collection___defaultHashCode$closure();
        } else {
          if (A.core__identityHashCode$closure() === hashCode && A.core__identical$closure() === equals)
            return new A._IdentityHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("_IdentityHashMap<1,2>"));
          if (equals == null)
            equals = A.collection___defaultEquals$closure();
        }
      else {
        if (hashCode == null)
          hashCode = A.collection___defaultHashCode$closure();
        if (equals == null)
          equals = A.collection___defaultEquals$closure();
      }
      return A._CustomHashMap$(equals, hashCode, isValidKey, $K, $V);
    },
    _HashMap__getTableEntry(table, key) {
      var entry = table[key];
      return entry === table ? null : entry;
    },
    _HashMap__setTableEntry(table, key, value) {
      if (value == null)
        table[key] = table;
      else
        table[key] = value;
    },
    _HashMap__newHashTable() {
      var table = Object.create(null);
      A._HashMap__setTableEntry(table, "<non-identifier-key>", table);
      delete table["<non-identifier-key>"];
      return table;
    },
    _CustomHashMap$(_equals, _hashCode, validKey, $K, $V) {
      var t1 = validKey != null ? validKey : new A._CustomHashMap_closure($K);
      return new A._CustomHashMap(_equals, _hashCode, t1, $K._eval$1("@<0>")._bind$1($V)._eval$1("_CustomHashMap<1,2>"));
    },
    LinkedHashMap_LinkedHashMap(hashCode, isValidKey, $K, $V) {
      if (isValidKey == null) {
        if (hashCode == null)
          return new A.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"));
      } else if (hashCode == null)
        hashCode = A.collection___defaultHashCode$closure();
      return A._LinkedCustomHashMap$(A.collection___defaultEquals$closure(), hashCode, isValidKey, $K, $V);
    },
    LinkedHashMap_LinkedHashMap$_literal(keyValuePairs, $K, $V) {
      return $K._eval$1("@<0>")._bind$1($V)._eval$1("LinkedHashMap<1,2>")._as(A.fillLiteralMap(keyValuePairs, new A.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"))));
    },
    LinkedHashMap_LinkedHashMap$_empty($K, $V) {
      return new A.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"));
    },
    _LinkedCustomHashMap$(_equals, _hashCode, validKey, $K, $V) {
      var t1 = validKey != null ? validKey : new A._LinkedCustomHashMap_closure($K);
      return new A._LinkedCustomHashMap(_equals, _hashCode, t1, $K._eval$1("@<0>")._bind$1($V)._eval$1("_LinkedCustomHashMap<1,2>"));
    },
    HashSet_HashSet(equals, hashCode, $E) {
      return new A._HashSet($E._eval$1("_HashSet<0>"));
    },
    _HashSet__newHashTable() {
      var table = Object.create(null);
      table["<non-identifier-key>"] = table;
      delete table["<non-identifier-key>"];
      return table;
    },
    LinkedHashSet_LinkedHashSet($E) {
      return new A._LinkedHashSet($E._eval$1("_LinkedHashSet<0>"));
    },
    LinkedHashSet_LinkedHashSet$_empty($E) {
      return new A._LinkedHashSet($E._eval$1("_LinkedHashSet<0>"));
    },
    _LinkedHashSet__newHashTable() {
      var table = Object.create(null);
      table["<non-identifier-key>"] = table;
      delete table["<non-identifier-key>"];
      return table;
    },
    _LinkedHashSetIterator$(_set, _modifications, $E) {
      var t1 = new A._LinkedHashSetIterator(_set, _modifications, $E._eval$1("_LinkedHashSetIterator<0>"));
      t1._collection$_cell = _set._collection$_first;
      return t1;
    },
    _defaultEquals(a, b) {
      return J.$eq$(a, b);
    },
    _defaultHashCode(a) {
      return J.get$hashCode$(a);
    },
    IterableBase_iterableToShortString(iterable, leftDelimiter, rightDelimiter) {
      var parts, t1;
      if (A._isToStringVisiting(iterable)) {
        if (leftDelimiter === "(" && rightDelimiter === ")")
          return "(...)";
        return leftDelimiter + "..." + rightDelimiter;
      }
      parts = A._setArrayType([], type$.JSArray_String);
      B.JSArray_methods.add$1($._toStringVisiting, iterable);
      try {
        A._iterablePartsToStrings(iterable, parts);
      } finally {
        if (0 >= $._toStringVisiting.length)
          return A.ioore($._toStringVisiting, -1);
        $._toStringVisiting.pop();
      }
      t1 = A.StringBuffer__writeAll(leftDelimiter, type$.Iterable_dynamic._as(parts), ", ") + rightDelimiter;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    IterableBase_iterableToFullString(iterable, leftDelimiter, rightDelimiter) {
      var buffer, t1;
      if (A._isToStringVisiting(iterable))
        return leftDelimiter + "..." + rightDelimiter;
      buffer = new A.StringBuffer(leftDelimiter);
      B.JSArray_methods.add$1($._toStringVisiting, iterable);
      try {
        t1 = buffer;
        t1._contents = A.StringBuffer__writeAll(t1._contents, iterable, ", ");
      } finally {
        if (0 >= $._toStringVisiting.length)
          return A.ioore($._toStringVisiting, -1);
        $._toStringVisiting.pop();
      }
      buffer._contents += rightDelimiter;
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _isToStringVisiting(o) {
      var t1, i;
      for (t1 = $._toStringVisiting.length, i = 0; i < t1; ++i)
        if (o === $._toStringVisiting[i])
          return true;
      return false;
    },
    _iterablePartsToStrings(iterable, parts) {
      var next, ultimateString, penultimateString, penultimate, ultimate, ultimate0, elision,
        it = J.get$iterator$ax(iterable),
        $length = 0, count = 0;
      while (true) {
        if (!($length < 80 || count < 3))
          break;
        if (!it.moveNext$0())
          return;
        next = A.S(it.get$current(it));
        B.JSArray_methods.add$1(parts, next);
        $length += next.length + 2;
        ++count;
      }
      if (!it.moveNext$0()) {
        if (count <= 5)
          return;
        if (0 >= parts.length)
          return A.ioore(parts, -1);
        ultimateString = parts.pop();
        if (0 >= parts.length)
          return A.ioore(parts, -1);
        penultimateString = parts.pop();
      } else {
        penultimate = it.get$current(it);
        ++count;
        if (!it.moveNext$0()) {
          if (count <= 4) {
            B.JSArray_methods.add$1(parts, A.S(penultimate));
            return;
          }
          ultimateString = A.S(penultimate);
          if (0 >= parts.length)
            return A.ioore(parts, -1);
          penultimateString = parts.pop();
          $length += ultimateString.length + 2;
        } else {
          ultimate = it.get$current(it);
          ++count;
          for (; it.moveNext$0(); penultimate = ultimate, ultimate = ultimate0) {
            ultimate0 = it.get$current(it);
            ++count;
            if (count > 100) {
              while (true) {
                if (!($length > 75 && count > 3))
                  break;
                if (0 >= parts.length)
                  return A.ioore(parts, -1);
                $length -= parts.pop().length + 2;
                --count;
              }
              B.JSArray_methods.add$1(parts, "...");
              return;
            }
          }
          penultimateString = A.S(penultimate);
          ultimateString = A.S(ultimate);
          $length += ultimateString.length + penultimateString.length + 4;
        }
      }
      if (count > parts.length + 2) {
        $length += 5;
        elision = "...";
      } else
        elision = null;
      while (true) {
        if (!($length > 80 && parts.length > 3))
          break;
        if (0 >= parts.length)
          return A.ioore(parts, -1);
        $length -= parts.pop().length + 2;
        if (elision == null) {
          $length += 5;
          elision = "...";
        }
      }
      if (elision != null)
        B.JSArray_methods.add$1(parts, elision);
      B.JSArray_methods.add$1(parts, penultimateString);
      B.JSArray_methods.add$1(parts, ultimateString);
    },
    LinkedHashMap_LinkedHashMap$from(other, $K, $V) {
      var result = A.LinkedHashMap_LinkedHashMap(null, null, $K, $V);
      other.forEach$1(0, new A.LinkedHashMap_LinkedHashMap$from_closure(result, $K, $V));
      return result;
    },
    LinkedHashSet_LinkedHashSet$from(elements, $E) {
      var t1, _i,
        result = A.LinkedHashSet_LinkedHashSet($E);
      for (t1 = elements.length, _i = 0; _i < elements.length; elements.length === t1 || (0, A.throwConcurrentModificationError)(elements), ++_i)
        result.add$1(0, $E._as(elements[_i]));
      return result;
    },
    ListMixin__compareAny(a, b) {
      var t1 = type$.Comparable_dynamic;
      return J.compareTo$1$ns(t1._as(a), t1._as(b));
    },
    MapBase_mapToString(m) {
      var result, t1 = {};
      if (A._isToStringVisiting(m))
        return "{...}";
      result = new A.StringBuffer("");
      try {
        B.JSArray_methods.add$1($._toStringVisiting, m);
        result._contents += "{";
        t1.first = true;
        J.forEach$1$ax(m, new A.MapBase_mapToString_closure(t1, result));
        result._contents += "}";
      } finally {
        if (0 >= $._toStringVisiting.length)
          return A.ioore($._toStringVisiting, -1);
        $._toStringVisiting.pop();
      }
      t1 = result._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    ListQueue$($E) {
      return new A.ListQueue(A.List_List$filled(A.ListQueue__calculateCapacity(null), null, false, $E._eval$1("0?")), $E._eval$1("ListQueue<0>"));
    },
    ListQueue__calculateCapacity(initialCapacity) {
      return 8;
    },
    SplayTreeSet$(compare, isValidKey, $E) {
      var t1 = isValidKey == null ? new A.SplayTreeSet_closure($E) : isValidKey;
      return new A.SplayTreeSet(compare, t1, $E._eval$1("SplayTreeSet<0>"));
    },
    _HashMap: function _HashMap(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._keys = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
      _.$ti = t0;
    },
    _IdentityHashMap: function _IdentityHashMap(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._keys = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
      _.$ti = t0;
    },
    _CustomHashMap: function _CustomHashMap(t0, t1, t2, t3) {
      var _ = this;
      _._equals = t0;
      _._hashCode = t1;
      _._validKey = t2;
      _._collection$_length = 0;
      _._keys = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
      _.$ti = t3;
    },
    _CustomHashMap_closure: function _CustomHashMap_closure(t0) {
      this.K = t0;
    },
    _HashMapKeyIterable: function _HashMapKeyIterable(t0, t1) {
      this._collection$_map = t0;
      this.$ti = t1;
    },
    _HashMapKeyIterator: function _HashMapKeyIterator(t0, t1, t2) {
      var _ = this;
      _._collection$_map = t0;
      _._keys = t1;
      _._offset = 0;
      _._collection$_current = null;
      _.$ti = t2;
    },
    _LinkedIdentityHashMap: function _LinkedIdentityHashMap(t0) {
      var _ = this;
      _.__js_helper$_length = 0;
      _._last = _._first = _.__js_helper$_rest = _._nums = _._strings = null;
      _._modifications = 0;
      _.$ti = t0;
    },
    _LinkedCustomHashMap: function _LinkedCustomHashMap(t0, t1, t2, t3) {
      var _ = this;
      _._equals = t0;
      _._hashCode = t1;
      _._validKey = t2;
      _.__js_helper$_length = 0;
      _._last = _._first = _.__js_helper$_rest = _._nums = _._strings = null;
      _._modifications = 0;
      _.$ti = t3;
    },
    _LinkedCustomHashMap_closure: function _LinkedCustomHashMap_closure(t0) {
      this.K = t0;
    },
    _HashSet: function _HashSet(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._elements = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
      _.$ti = t0;
    },
    _HashSetIterator: function _HashSetIterator(t0, t1, t2) {
      var _ = this;
      _._set = t0;
      _._elements = t1;
      _._offset = 0;
      _._collection$_current = null;
      _.$ti = t2;
    },
    _LinkedHashSet: function _LinkedHashSet(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._collection$_last = _._collection$_first = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
      _._collection$_modifications = 0;
      _.$ti = t0;
    },
    _LinkedHashSetCell: function _LinkedHashSetCell(t0) {
      this._collection$_element = t0;
      this._collection$_next = null;
    },
    _LinkedHashSetIterator: function _LinkedHashSetIterator(t0, t1, t2) {
      var _ = this;
      _._set = t0;
      _._collection$_modifications = t1;
      _._collection$_current = _._collection$_cell = null;
      _.$ti = t2;
    },
    UnmodifiableListView: function UnmodifiableListView(t0, t1) {
      this._collection$_source = t0;
      this.$ti = t1;
    },
    IterableMixin: function IterableMixin() {
    },
    IterableBase: function IterableBase() {
    },
    LinkedHashMap_LinkedHashMap$from_closure: function LinkedHashMap_LinkedHashMap$from_closure(t0, t1, t2) {
      this.result = t0;
      this.K = t1;
      this.V = t2;
    },
    ListBase: function ListBase() {
    },
    ListMixin: function ListMixin() {
    },
    MapBase: function MapBase() {
    },
    MapBase_mapToString_closure: function MapBase_mapToString_closure(t0, t1) {
      this._box_0 = t0;
      this.result = t1;
    },
    MapMixin: function MapMixin() {
    },
    _UnmodifiableMapMixin: function _UnmodifiableMapMixin() {
    },
    MapView: function MapView() {
    },
    UnmodifiableMapView: function UnmodifiableMapView(t0, t1) {
      this._collection$_map = t0;
      this.$ti = t1;
    },
    ListQueue: function ListQueue(t0, t1) {
      var _ = this;
      _._table = t0;
      _._modificationCount = _._tail = _._head = 0;
      _.$ti = t1;
    },
    _ListQueueIterator: function _ListQueueIterator(t0, t1, t2, t3, t4) {
      var _ = this;
      _._queue = t0;
      _._end = t1;
      _._modificationCount = t2;
      _._collection$_position = t3;
      _._collection$_current = null;
      _.$ti = t4;
    },
    SetMixin: function SetMixin() {
    },
    _SetBase: function _SetBase() {
    },
    _SplayTreeNode: function _SplayTreeNode() {
    },
    _SplayTreeSetNode: function _SplayTreeSetNode(t0, t1) {
      var _ = this;
      _.key = t0;
      _._right = _._left = null;
      _.$ti = t1;
    },
    _SplayTree: function _SplayTree() {
    },
    _SplayTreeIterator: function _SplayTreeIterator() {
    },
    _SplayTreeKeyIterator: function _SplayTreeKeyIterator(t0, t1, t2, t3) {
      var _ = this;
      _._tree = t0;
      _._path = t1;
      _._modificationCount = null;
      _._splayCount = t2;
      _.$ti = t3;
    },
    SplayTreeSet: function SplayTreeSet(t0, t1, t2) {
      var _ = this;
      _._root = null;
      _._compare = t0;
      _._validKey = t1;
      _._splayCount = _._modificationCount = _._count = 0;
      _.$ti = t2;
    },
    SplayTreeSet_closure: function SplayTreeSet_closure(t0) {
      this.E = t0;
    },
    _ListBase_Object_ListMixin: function _ListBase_Object_ListMixin() {
    },
    _SplayTreeSet__SplayTree_IterableMixin: function _SplayTreeSet__SplayTree_IterableMixin() {
    },
    _SplayTreeSet__SplayTree_IterableMixin_SetMixin: function _SplayTreeSet__SplayTree_IterableMixin_SetMixin() {
    },
    _UnmodifiableMapView_MapView__UnmodifiableMapMixin: function _UnmodifiableMapView_MapView__UnmodifiableMapMixin() {
    },
    __SetBase_Object_SetMixin: function __SetBase_Object_SetMixin() {
    },
    _parseJson(source, reviver) {
      var parsed, e, exception, t1;
      if (typeof source != "string")
        throw A.wrapException(A.argumentErrorValue(source));
      parsed = null;
      try {
        parsed = JSON.parse(source);
      } catch (exception) {
        e = A.unwrapException(exception);
        t1 = A.FormatException$(String(e), null, null);
        throw A.wrapException(t1);
      }
      t1 = A._convertJsonToDartLazy(parsed);
      return t1;
    },
    _convertJsonToDartLazy(object) {
      var i;
      if (object == null)
        return null;
      if (typeof object != "object")
        return object;
      if (Object.getPrototypeOf(object) !== Array.prototype)
        return new A._JsonMap(object, Object.create(null));
      for (i = 0; i < object.length; ++i)
        object[i] = A._convertJsonToDartLazy(object[i]);
      return object;
    },
    Base64Codec__checkPadding(source, sourceIndex, sourceEnd, firstPadding, paddingCount, $length) {
      if (B.JSInt_methods.$mod($length, 4) !== 0)
        throw A.wrapException(A.FormatException$("Invalid base64 padding, padded length must be multiple of four, is " + $length, source, sourceEnd));
      if (firstPadding + paddingCount !== $length)
        throw A.wrapException(A.FormatException$("Invalid base64 padding, '=' not at the end", source, sourceIndex));
      if (paddingCount > 2)
        throw A.wrapException(A.FormatException$("Invalid base64 padding, more than two '=' characters", source, sourceIndex));
    },
    JsonUnsupportedObjectError$(unsupportedObject, cause, partialResult) {
      return new A.JsonUnsupportedObjectError(unsupportedObject, cause);
    },
    _defaultToEncodable(object) {
      return object.toJson$0();
    },
    _JsonStringStringifier$(_sink, _toEncodable) {
      return new A._JsonStringStringifier(_sink, [], A.convert___defaultToEncodable$closure());
    },
    _JsonStringStringifier_stringify(object, toEncodable, indent) {
      var t1,
        output = new A.StringBuffer("");
      A._JsonStringStringifier_printOn(object, output, toEncodable, indent);
      t1 = output._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _JsonStringStringifier_printOn(object, output, toEncodable, indent) {
      var stringifier = A._JsonStringStringifier$(output, toEncodable);
      stringifier.writeObject$1(object);
    },
    _JsonMap: function _JsonMap(t0, t1) {
      this._original = t0;
      this._processed = t1;
      this._data = null;
    },
    _JsonMapKeyIterable: function _JsonMapKeyIterable(t0) {
      this._parent = t0;
    },
    Base64Codec: function Base64Codec() {
    },
    Base64Encoder: function Base64Encoder() {
    },
    Codec: function Codec() {
    },
    Converter: function Converter() {
    },
    Encoding: function Encoding() {
    },
    JsonUnsupportedObjectError: function JsonUnsupportedObjectError(t0, t1) {
      this.unsupportedObject = t0;
      this.cause = t1;
    },
    JsonCyclicError: function JsonCyclicError(t0, t1) {
      this.unsupportedObject = t0;
      this.cause = t1;
    },
    JsonCodec: function JsonCodec() {
    },
    JsonEncoder: function JsonEncoder(t0) {
      this._toEncodable = t0;
    },
    JsonDecoder: function JsonDecoder(t0) {
      this._reviver = t0;
    },
    _JsonStringifier: function _JsonStringifier() {
    },
    _JsonStringifier_writeMap_closure: function _JsonStringifier_writeMap_closure(t0, t1) {
      this._box_0 = t0;
      this.keyValueList = t1;
    },
    _JsonStringStringifier: function _JsonStringStringifier(t0, t1, t2) {
      this._convert$_sink = t0;
      this._seen = t1;
      this._toEncodable = t2;
    },
    Utf8Codec: function Utf8Codec() {
    },
    Utf8Encoder: function Utf8Encoder() {
    },
    _Utf8Encoder: function _Utf8Encoder(t0) {
      this._bufferIndex = this._carry = 0;
      this._buffer = t0;
    },
    _symbolMapToStringMap(map) {
      var result = new A.JsLinkedHashMap(type$.JsLinkedHashMap_String_dynamic);
      map.forEach$1(0, new A._symbolMapToStringMap_closure(result));
      return result;
    },
    identityHashCode(object) {
      return A.objectHashCode(object);
    },
    Function_apply($function, positionalArguments, namedArguments) {
      return A.Primitives_applyFunction($function, positionalArguments, namedArguments == null ? null : A._symbolMapToStringMap(namedArguments));
    },
    Expando__checkType(object) {
      var t1 = typeof object == "number" || false;
      if (t1)
        throw A.wrapException(A.ArgumentError$value(object, string$.Expand, null));
    },
    int_parse(source, radix) {
      var value = A.Primitives_parseInt(source, radix);
      if (value != null)
        return value;
      throw A.wrapException(A.FormatException$(source, null, null));
    },
    Error__objectToString(object) {
      if (object instanceof A.Closure)
        return object.toString$0(0);
      return "Instance of '" + A.S(A.Primitives_objectTypeName(object)) + "'";
    },
    Error__throw(error, stackTrace) {
      error = A.wrapException(error);
      error.stack = J.toString$0$(stackTrace);
      throw error;
      throw A.wrapException("unreachable");
    },
    DateTime$fromMillisecondsSinceEpoch(millisecondsSinceEpoch, isUtc) {
      var t1;
      if (Math.abs(millisecondsSinceEpoch) <= 864e13)
        t1 = false;
      else
        t1 = true;
      if (t1)
        A.throwExpression(A.ArgumentError$("DateTime is outside valid range: " + millisecondsSinceEpoch, null));
      A.checkNotNullable(isUtc, "isUtc", type$.bool);
      return new A.DateTime(millisecondsSinceEpoch, isUtc);
    },
    List_List$filled($length, fill, growable, $E) {
      var i,
        result = growable ? J.JSArray_JSArray$growable($length, $E) : J.JSArray_JSArray$fixed($length, $E);
      if ($length !== 0 && fill != null)
        for (i = 0; i < result.length; ++i)
          result[i] = fill;
      return result;
    },
    List_List$from(elements, growable, $E) {
      var t1,
        list = A._setArrayType([], $E._eval$1("JSArray<0>"));
      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
        B.JSArray_methods.add$1(list, $E._as(t1.get$current(t1)));
      if (growable)
        return list;
      return J.JSArray_markFixedList(list, $E);
    },
    List_List$of(elements, growable, $E) {
      var t1;
      if (growable)
        return A.List_List$_of(elements, $E);
      t1 = J.JSArray_markFixedList(A.List_List$_of(elements, $E), $E);
      return t1;
    },
    List_List$_of(elements, $E) {
      var list, t1;
      if (Array.isArray(elements))
        return A._setArrayType(elements.slice(0), $E._eval$1("JSArray<0>"));
      list = A._setArrayType([], $E._eval$1("JSArray<0>"));
      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
        B.JSArray_methods.add$1(list, t1.get$current(t1));
      return list;
    },
    String_String$fromCharCodes(charCodes, start, end) {
      var array, len;
      if (Array.isArray(charCodes)) {
        array = charCodes;
        len = array.length;
        end = A.RangeError_checkValidRange(start, end, len);
        return A.Primitives_stringFromCharCodes(start > 0 || end < len ? array.slice(start, end) : array);
      }
      if (type$.NativeUint8List._is(charCodes))
        return A.Primitives_stringFromNativeUint8List(charCodes, start, A.RangeError_checkValidRange(start, end, charCodes.length));
      return A.String__stringFromIterable(charCodes, start, end);
    },
    String__stringFromIterable(charCodes, start, end) {
      var t1, it, i, list, _null = null;
      if (start < 0)
        throw A.wrapException(A.RangeError$range(start, 0, J.get$length$asx(charCodes), _null, _null));
      t1 = end == null;
      if (!t1 && end < start)
        throw A.wrapException(A.RangeError$range(end, start, J.get$length$asx(charCodes), _null, _null));
      it = J.get$iterator$ax(charCodes);
      for (i = 0; i < start; ++i)
        if (!it.moveNext$0())
          throw A.wrapException(A.RangeError$range(start, 0, i, _null, _null));
      list = [];
      if (t1)
        for (; it.moveNext$0();)
          list.push(it.get$current(it));
      else
        for (i = start; i < end; ++i) {
          if (!it.moveNext$0())
            throw A.wrapException(A.RangeError$range(end, start, i, _null, _null));
          list.push(it.get$current(it));
        }
      return A.Primitives_stringFromCharCodes(list);
    },
    RegExp_RegExp(source, caseSensitive, multiLine) {
      return new A.JSSyntaxRegExp(source, A.JSSyntaxRegExp_makeNative(source, multiLine, caseSensitive, false, false, false));
    },
    identical(a, b) {
      return a == null ? b == null : a === b;
    },
    StringBuffer__writeAll(string, objects, separator) {
      var iterator = J.get$iterator$ax(objects);
      if (!iterator.moveNext$0())
        return string;
      if (separator.length === 0) {
        do
          string += A.S(iterator.get$current(iterator));
        while (iterator.moveNext$0());
      } else {
        string += A.S(iterator.get$current(iterator));
        for (; iterator.moveNext$0();)
          string = string + separator + A.S(iterator.get$current(iterator));
      }
      return string;
    },
    NoSuchMethodError$(receiver, memberName, positionalArguments, namedArguments) {
      return new A.NoSuchMethodError(receiver, memberName, positionalArguments, namedArguments);
    },
    _Uri__uriEncode(canonicalTable, text, encoding, spaceToPlus) {
      var t1, bytes, i, t2, byte, t3,
        _s16_ = "0123456789ABCDEF";
      if (encoding === B.C_Utf8Codec) {
        t1 = $.$get$_Uri__needsNoEncoding()._nativeRegExp;
        if (typeof text != "string")
          A.throwExpression(A.argumentErrorValue(text));
        t1 = t1.test(text);
      } else
        t1 = false;
      if (t1)
        return text;
      A._instanceType(encoding)._eval$1("Codec.S")._as(text);
      bytes = encoding.get$encoder().convert$1(text);
      for (t1 = bytes.length, i = 0, t2 = ""; i < t1; ++i) {
        byte = bytes[i];
        if (byte < 128) {
          t3 = byte >>> 4;
          if (!(t3 < 8))
            return A.ioore(canonicalTable, t3);
          t3 = (canonicalTable[t3] & 1 << (byte & 15)) !== 0;
        } else
          t3 = false;
        if (t3)
          t2 += A.Primitives_stringFromCharCode(byte);
        else
          t2 = spaceToPlus && byte === 32 ? t2 + "+" : t2 + "%" + _s16_[byte >>> 4 & 15] + _s16_[byte & 15];
      }
      return t2.charCodeAt(0) == 0 ? t2 : t2;
    },
    StackTrace_current() {
      var stackTrace, exception;
      if (A.boolConversionCheck($.$get$_hasErrorStackProperty()))
        return A.getTraceFromException(new Error());
      try {
        throw A.wrapException("");
      } catch (exception) {
        stackTrace = A.getTraceFromException(exception);
        return stackTrace;
      }
    },
    _BigIntImpl__parseDecimal(source, isNegative) {
      var part, i,
        result = $.$get$_BigIntImpl_zero(),
        t1 = source.length,
        digitInPartCount = 4 - t1 % 4;
      if (digitInPartCount === 4)
        digitInPartCount = 0;
      for (part = 0, i = 0; i < t1; ++i) {
        part = part * 10 + B.JSString_methods._codeUnitAt$1(source, i) - 48;
        ++digitInPartCount;
        if (digitInPartCount === 4) {
          result = result.$mul(0, $.$get$_BigIntImpl__bigInt10000()).$add(0, A._BigIntImpl__BigIntImpl$_fromInt(part));
          part = 0;
          digitInPartCount = 0;
        }
      }
      if (isNegative)
        return result.$negate(0);
      return result;
    },
    _BigIntImpl__codeUnitToRadixValue(codeUnit) {
      if (48 <= codeUnit && codeUnit <= 57)
        return codeUnit - 48;
      return (codeUnit | 32) - 97 + 10;
    },
    _BigIntImpl__parseHex(source, startPos, isNegative) {
      var i, chunk, j, i0, digitValue, digitIndex, digitIndex0,
        t1 = source.length,
        sourceLength = t1 - startPos,
        chunkCount = B.JSNumber_methods.ceil$0(sourceLength / 4),
        digits = new Uint16Array(chunkCount),
        t2 = chunkCount - 1,
        lastDigitLength = sourceLength - t2 * 4;
      for (i = startPos, chunk = 0, j = 0; j < lastDigitLength; ++j, i = i0) {
        i0 = i + 1;
        digitValue = A._BigIntImpl__codeUnitToRadixValue(B.JSString_methods._codeUnitAt$1(source, i));
        if (digitValue >= 16)
          return null;
        chunk = chunk * 16 + digitValue;
      }
      digitIndex = t2 - 1;
      if (!(t2 >= 0 && t2 < chunkCount))
        return A.ioore(digits, t2);
      digits[t2] = chunk;
      for (; i < t1; digitIndex = digitIndex0) {
        for (chunk = 0, j = 0; j < 4; ++j, i = i0) {
          i0 = i + 1;
          digitValue = A._BigIntImpl__codeUnitToRadixValue(B.JSString_methods._codeUnitAt$1(source, i));
          if (digitValue >= 16)
            return null;
          chunk = chunk * 16 + digitValue;
        }
        digitIndex0 = digitIndex - 1;
        if (!(digitIndex >= 0 && digitIndex < chunkCount))
          return A.ioore(digits, digitIndex);
        digits[digitIndex] = chunk;
      }
      if (chunkCount === 1) {
        if (0 >= chunkCount)
          return A.ioore(digits, 0);
        t1 = digits[0] === 0;
      } else
        t1 = false;
      if (t1)
        return $.$get$_BigIntImpl_zero();
      t1 = A._BigIntImpl__normalize(chunkCount, digits);
      return new A._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
    },
    _BigIntImpl__tryParse(source, radix) {
      var match, t1, t2, isNegative, decimalMatch, hexMatch;
      if (source === "")
        return null;
      match = $.$get$_BigIntImpl__parseRE().firstMatch$1(source);
      if (match == null)
        return null;
      t1 = match._match;
      t2 = t1.length;
      if (1 >= t2)
        return A.ioore(t1, 1);
      isNegative = t1[1] === "-";
      if (4 >= t2)
        return A.ioore(t1, 4);
      decimalMatch = t1[4];
      hexMatch = t1[3];
      if (5 >= t2)
        return A.ioore(t1, 5);
      if (decimalMatch != null)
        return A._BigIntImpl__parseDecimal(decimalMatch, isNegative);
      if (hexMatch != null)
        return A._BigIntImpl__parseHex(hexMatch, 2, isNegative);
      return null;
    },
    _BigIntImpl__normalize(used, digits) {
      var t2,
        t1 = digits.length;
      while (true) {
        if (typeof used !== "number")
          return used.$gt();
        if (used > 0) {
          t2 = used - 1;
          if (!(t2 < t1))
            return A.ioore(digits, t2);
          t2 = digits[t2] === 0;
        } else
          t2 = false;
        if (!t2)
          break;
        --used;
      }
      return used;
    },
    _BigIntImpl__cloneDigits(digits, from, to, $length) {
      var resultDigits, n, t1, i, t2;
      if (!A._isInt($length))
        A.throwExpression(A.ArgumentError$("Invalid length " + A.S($length), null));
      resultDigits = new Uint16Array($length);
      if (typeof to !== "number")
        return to.$sub();
      if (typeof from !== "number")
        return A.iae(from);
      n = to - from;
      for (t1 = resultDigits.length, i = 0; i < n; ++i) {
        t2 = from + i;
        if (!(t2 >= 0 && t2 < digits.length))
          return A.ioore(digits, t2);
        t2 = digits[t2];
        if (!(i < t1))
          return A.ioore(resultDigits, i);
        resultDigits[i] = t2;
      }
      return resultDigits;
    },
    _BigIntImpl__BigIntImpl$_fromInt(value) {
      var digits, t1, i, i0,
        isNegative = value < 0;
      if (isNegative) {
        if (value === -9223372036854776e3) {
          digits = new Uint16Array(4);
          digits[3] = 32768;
          t1 = A._BigIntImpl__normalize(4, digits);
          return new A._BigIntImpl(t1 !== 0 || false, digits, t1);
        }
        value = -value;
      }
      if (value < 65536) {
        digits = new Uint16Array(1);
        digits[0] = value;
        t1 = A._BigIntImpl__normalize(1, digits);
        return new A._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
      }
      if (value <= 4294967295) {
        digits = new Uint16Array(2);
        digits[0] = value & 65535;
        digits[1] = B.JSInt_methods._shrOtherPositive$1(value, 16);
        t1 = A._BigIntImpl__normalize(2, digits);
        return new A._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
      }
      t1 = B.JSInt_methods._tdivFast$1(B.JSInt_methods.get$bitLength(value) - 1, 16) + 1;
      digits = new Uint16Array(t1);
      for (i = 0; value !== 0; i = i0) {
        i0 = i + 1;
        if (!(i < t1))
          return A.ioore(digits, i);
        digits[i] = value & 65535;
        value = B.JSInt_methods._tdivFast$1(value, 65536);
      }
      t1 = A._BigIntImpl__normalize(t1, digits);
      return new A._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
    },
    _BigIntImpl__dlShiftDigits(xDigits, xUsed, n, resultDigits) {
      var i, t1, t2, t3, t4;
      if (xUsed === 0)
        return 0;
      if (n === 0 && resultDigits === xDigits)
        return xUsed;
      for (i = xUsed - 1, t1 = xDigits.length, t2 = resultDigits.length; i >= 0; --i) {
        t3 = i + n;
        if (!(i < t1))
          return A.ioore(xDigits, i);
        t4 = xDigits[i];
        if (!(t3 >= 0 && t3 < t2))
          return A.ioore(resultDigits, t3);
        resultDigits[t3] = t4;
      }
      for (i = n - 1; i >= 0; --i) {
        if (!(i < t2))
          return A.ioore(resultDigits, i);
        resultDigits[i] = 0;
      }
      return xUsed + n;
    },
    _BigIntImpl__lsh(xDigits, xUsed, n, resultDigits) {
      var i, t1, t2, carry, digit, t3, t4,
        digitShift = B.JSInt_methods._tdivFast$1(n, 16),
        bitShift = B.JSInt_methods.$mod(n, 16),
        carryBitShift = 16 - bitShift,
        bitMask = B.JSInt_methods.$shl(1, carryBitShift) - 1;
      for (i = xUsed - 1, t1 = xDigits.length, t2 = resultDigits.length, carry = 0; i >= 0; --i) {
        if (!(i < t1))
          return A.ioore(xDigits, i);
        digit = xDigits[i];
        t3 = i + digitShift + 1;
        t4 = B.JSInt_methods._shrReceiverPositive$1(digit, carryBitShift);
        if (!(t3 >= 0 && t3 < t2))
          return A.ioore(resultDigits, t3);
        resultDigits[t3] = (t4 | carry) >>> 0;
        carry = B.JSInt_methods.$shl(digit & bitMask, bitShift);
      }
      if (!(digitShift >= 0 && digitShift < t2))
        return A.ioore(resultDigits, digitShift);
      resultDigits[digitShift] = carry;
    },
    _BigIntImpl__lShiftDigits(xDigits, xUsed, n, resultDigits) {
      var resultUsed, t1, i, t2,
        digitsShift = B.JSInt_methods._tdivFast$1(n, 16);
      if (B.JSInt_methods.$mod(n, 16) === 0)
        return A._BigIntImpl__dlShiftDigits(xDigits, xUsed, digitsShift, resultDigits);
      resultUsed = xUsed + digitsShift + 1;
      A._BigIntImpl__lsh(xDigits, xUsed, n, resultDigits);
      for (t1 = resultDigits.length, i = digitsShift; --i, i >= 0;) {
        if (!(i < t1))
          return A.ioore(resultDigits, i);
        resultDigits[i] = 0;
      }
      t2 = resultUsed - 1;
      if (!(t2 >= 0 && t2 < t1))
        return A.ioore(resultDigits, t2);
      if (resultDigits[t2] === 0)
        resultUsed = t2;
      return resultUsed;
    },
    _BigIntImpl__rsh(xDigits, xUsed, n, resultDigits) {
      var carry, last, t2, i, t3, digit,
        digitsShift = B.JSInt_methods._tdivFast$1(n, 16),
        bitShift = B.JSInt_methods.$mod(n, 16),
        carryBitShift = 16 - bitShift,
        bitMask = B.JSInt_methods.$shl(1, bitShift) - 1,
        t1 = xDigits.length;
      if (!(digitsShift >= 0 && digitsShift < t1))
        return A.ioore(xDigits, digitsShift);
      carry = B.JSInt_methods._shrReceiverPositive$1(xDigits[digitsShift], bitShift);
      last = xUsed - digitsShift - 1;
      for (t2 = resultDigits.length, i = 0; i < last; ++i) {
        t3 = i + digitsShift + 1;
        if (!(t3 < t1))
          return A.ioore(xDigits, t3);
        digit = xDigits[t3];
        t3 = B.JSInt_methods.$shl(digit & bitMask, carryBitShift);
        if (!(i < t2))
          return A.ioore(resultDigits, i);
        resultDigits[i] = (t3 | carry) >>> 0;
        carry = B.JSInt_methods._shrReceiverPositive$1(digit, bitShift);
      }
      if (!(last >= 0 && last < t2))
        return A.ioore(resultDigits, last);
      resultDigits[last] = carry;
    },
    _BigIntImpl__compareDigits(digits, used, otherDigits, otherUsed) {
      var i, t1, t2, t3,
        result = used - otherUsed;
      if (result === 0)
        for (i = used - 1, t1 = digits.length, t2 = otherDigits.length; i >= 0; --i) {
          if (!(i < t1))
            return A.ioore(digits, i);
          t3 = digits[i];
          if (!(i < t2))
            return A.ioore(otherDigits, i);
          result = t3 - otherDigits[i];
          if (result !== 0)
            return result;
        }
      return result;
    },
    _BigIntImpl__absAdd(digits, used, otherDigits, otherUsed, resultDigits) {
      var t1, t2, t3, carry, i, t4;
      for (t1 = digits.length, t2 = otherDigits.length, t3 = resultDigits.length, carry = 0, i = 0; i < otherUsed; ++i) {
        if (!(i < t1))
          return A.ioore(digits, i);
        t4 = digits[i];
        if (!(i < t2))
          return A.ioore(otherDigits, i);
        carry += t4 + otherDigits[i];
        if (!(i < t3))
          return A.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = carry >>> 16;
      }
      for (i = otherUsed; i < used; ++i) {
        if (!(i >= 0 && i < t1))
          return A.ioore(digits, i);
        carry += digits[i];
        if (!(i < t3))
          return A.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = carry >>> 16;
      }
      if (!(used >= 0 && used < t3))
        return A.ioore(resultDigits, used);
      resultDigits[used] = carry;
    },
    _BigIntImpl__absSub(digits, used, otherDigits, otherUsed, resultDigits) {
      var t1, t2, t3, carry, i, t4;
      for (t1 = digits.length, t2 = otherDigits.length, t3 = resultDigits.length, carry = 0, i = 0; i < otherUsed; ++i) {
        if (!(i < t1))
          return A.ioore(digits, i);
        t4 = digits[i];
        if (!(i < t2))
          return A.ioore(otherDigits, i);
        carry += t4 - otherDigits[i];
        if (!(i < t3))
          return A.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = 0 - (B.JSInt_methods._shrOtherPositive$1(carry, 16) & 1);
      }
      for (i = otherUsed; i < used; ++i) {
        if (!(i >= 0 && i < t1))
          return A.ioore(digits, i);
        carry += digits[i];
        if (!(i < t3))
          return A.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = 0 - (B.JSInt_methods._shrOtherPositive$1(carry, 16) & 1);
      }
    },
    _BigIntImpl__mulAdd(x, multiplicandDigits, i, accumulatorDigits, j, n) {
      var t1, t2, c, i0, t3, combined, j0, l;
      if (x === 0)
        return;
      for (t1 = multiplicandDigits.length, t2 = accumulatorDigits.length, c = 0; --n, n >= 0; j = j0, i = i0) {
        i0 = i + 1;
        if (!(i < t1))
          return A.ioore(multiplicandDigits, i);
        t3 = multiplicandDigits[i];
        if (!(j >= 0 && j < t2))
          return A.ioore(accumulatorDigits, j);
        combined = x * t3 + accumulatorDigits[j] + c;
        j0 = j + 1;
        accumulatorDigits[j] = combined & 65535;
        c = B.JSInt_methods._tdivFast$1(combined, 65536);
      }
      for (; c !== 0; j = j0) {
        if (!(j >= 0 && j < t2))
          return A.ioore(accumulatorDigits, j);
        l = accumulatorDigits[j] + c;
        j0 = j + 1;
        accumulatorDigits[j] = l & 65535;
        c = B.JSInt_methods._tdivFast$1(l, 65536);
      }
    },
    _BigIntImpl__estimateQuotientDigit(topDigitDivisor, digits, i) {
      var t2, t3, quotientDigit,
        t1 = digits.length;
      if (!(i >= 0 && i < t1))
        return A.ioore(digits, i);
      t2 = digits[i];
      if (t2 === topDigitDivisor)
        return 65535;
      t3 = i - 1;
      if (!(t3 >= 0 && t3 < t1))
        return A.ioore(digits, t3);
      quotientDigit = B.JSInt_methods.$tdiv((t2 << 16 | digits[t3]) >>> 0, topDigitDivisor);
      if (quotientDigit > 65535)
        return 65535;
      return quotientDigit;
    },
    DateTime__fourDigits(n) {
      var absN = Math.abs(n),
        sign = n < 0 ? "-" : "";
      if (absN >= 1000)
        return "" + n;
      if (absN >= 100)
        return sign + "0" + absN;
      if (absN >= 10)
        return sign + "00" + absN;
      return sign + "000" + absN;
    },
    DateTime__threeDigits(n) {
      if (n >= 100)
        return "" + n;
      if (n >= 10)
        return "0" + n;
      return "00" + n;
    },
    DateTime__twoDigits(n) {
      if (n >= 10)
        return "" + n;
      return "0" + n;
    },
    Error_safeToString(object) {
      if (typeof object == "number" || A._isBool(object) || object == null)
        return J.toString$0$(object);
      if (typeof object == "string")
        return JSON.stringify(object);
      return A.Error__objectToString(object);
    },
    Error_throwWithStackTrace(error, stackTrace) {
      A.checkNotNullable(error, "error", type$.Object);
      A.checkNotNullable(stackTrace, "stackTrace", type$.StackTrace);
      A.Error__throw(error, stackTrace);
      A.ReachabilityError$(string$._null_);
    },
    AssertionError$(message) {
      return new A.AssertionError(message);
    },
    ArgumentError$(message, $name) {
      return new A.ArgumentError(false, null, $name, message);
    },
    ArgumentError$value(value, $name, message) {
      return new A.ArgumentError(true, value, $name, message);
    },
    ArgumentError$notNull($name) {
      return new A.ArgumentError(false, null, $name, "Must not be null");
    },
    RangeError$(message) {
      var _null = null;
      return new A.RangeError(_null, _null, false, _null, _null, message);
    },
    RangeError$value(value, $name) {
      return new A.RangeError(null, null, true, value, $name, "Value not in range");
    },
    RangeError$range(invalidValue, minValue, maxValue, $name, message) {
      return new A.RangeError(minValue, maxValue, true, invalidValue, $name, "Invalid value");
    },
    RangeError_checkValidRange(start, end, $length) {
      if (0 > start || start > $length)
        throw A.wrapException(A.RangeError$range(start, 0, $length, "start", null));
      if (end != null) {
        if (start > end || end > $length)
          throw A.wrapException(A.RangeError$range(end, start, $length, "end", null));
        return end;
      }
      return $length;
    },
    RangeError_checkNotNegative(value, $name) {
      if (value < 0)
        throw A.wrapException(A.RangeError$range(value, 0, null, $name, null));
      return value;
    },
    IndexError$(invalidValue, indexable, $name, message, $length) {
      var t1 = A._asIntS($length == null ? J.get$length$asx(indexable) : $length);
      return new A.IndexError(t1, true, invalidValue, $name, "Index out of range");
    },
    UnsupportedError$(message) {
      return new A.UnsupportedError(message);
    },
    UnimplementedError$(message) {
      return new A.UnimplementedError(message);
    },
    StateError$(message) {
      return new A.StateError(message);
    },
    ConcurrentModificationError$(modifiedObject) {
      return new A.ConcurrentModificationError(modifiedObject);
    },
    Exception_Exception(message) {
      return new A._Exception(message);
    },
    FormatException$(message, source, offset) {
      return new A.FormatException(message, source, offset);
    },
    Map_castFrom(source, $K, $V, K2, V2) {
      return new A.CastMap(source, $K._eval$1("@<0>")._bind$1($V)._bind$1(K2)._bind$1(V2)._eval$1("CastMap<1,2,3,4>"));
    },
    Object_hash(object1, object2, object3, object4) {
      var t1;
      if (B.C_SentinelValue === object3) {
        t1 = J.get$hashCode$(object1);
        object2 = J.get$hashCode$(object2);
        return A.SystemHash_finish(A.SystemHash_combine(A.SystemHash_combine($.$get$_hashSeed(), t1), object2));
      }
      if (B.C_SentinelValue === object4) {
        t1 = J.get$hashCode$(object1);
        object2 = J.get$hashCode$(object2);
        object3 = J.get$hashCode$(object3);
        return A.SystemHash_finish(A.SystemHash_combine(A.SystemHash_combine(A.SystemHash_combine($.$get$_hashSeed(), t1), object2), object3));
      }
      t1 = J.get$hashCode$(object1);
      object2 = J.get$hashCode$(object2);
      object3 = J.get$hashCode$(object3);
      object4 = J.get$hashCode$(object4);
      object4 = A.SystemHash_finish(A.SystemHash_combine(A.SystemHash_combine(A.SystemHash_combine(A.SystemHash_combine($.$get$_hashSeed(), t1), object2), object3), object4));
      return object4;
    },
    print(object) {
      var toZone = $.printToZone;
      if (toZone == null)
        A.printString(object);
      else
        toZone.call$1(object);
    },
    Uri_parse(uri) {
      var delta, indices, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, isSimple, scheme, t1, t2, schemeAuth, queryStart0, pathStart0, userInfoStart, userInfo, host, portNumber, port, path, query, _null = null,
        end = uri.length;
      if (end >= 5) {
        delta = ((B.JSString_methods._codeUnitAt$1(uri, 4) ^ 58) * 3 | B.JSString_methods._codeUnitAt$1(uri, 0) ^ 100 | B.JSString_methods._codeUnitAt$1(uri, 1) ^ 97 | B.JSString_methods._codeUnitAt$1(uri, 2) ^ 116 | B.JSString_methods._codeUnitAt$1(uri, 3) ^ 97) >>> 0;
        if (delta === 0)
          return A.UriData__parse(end < end ? B.JSString_methods.substring$2(uri, 0, end) : uri, 5, _null).get$uri();
        else if (delta === 32)
          return A.UriData__parse(B.JSString_methods.substring$2(uri, 5, end), 0, _null).get$uri();
      }
      indices = A.List_List$filled(8, 0, false, type$.int);
      B.JSArray_methods.$indexSet(indices, 0, 0);
      B.JSArray_methods.$indexSet(indices, 1, -1);
      B.JSArray_methods.$indexSet(indices, 2, -1);
      B.JSArray_methods.$indexSet(indices, 7, -1);
      B.JSArray_methods.$indexSet(indices, 3, 0);
      B.JSArray_methods.$indexSet(indices, 4, 0);
      B.JSArray_methods.$indexSet(indices, 5, end);
      B.JSArray_methods.$indexSet(indices, 6, end);
      if (A._scan(uri, 0, end, 0, indices) >= 14)
        B.JSArray_methods.$indexSet(indices, 7, end);
      schemeEnd = indices[1];
      if (schemeEnd >= 0)
        if (A._scan(uri, 0, schemeEnd, 20, indices) === 20)
          indices[7] = schemeEnd;
      hostStart = indices[2] + 1;
      portStart = indices[3];
      pathStart = indices[4];
      queryStart = indices[5];
      fragmentStart = indices[6];
      if (fragmentStart < queryStart)
        queryStart = fragmentStart;
      if (pathStart < hostStart)
        pathStart = queryStart;
      else if (pathStart <= schemeEnd)
        pathStart = schemeEnd + 1;
      if (portStart < hostStart)
        portStart = pathStart;
      isSimple = indices[7] < 0;
      if (isSimple)
        if (hostStart > schemeEnd + 3) {
          scheme = _null;
          isSimple = false;
        } else {
          t1 = portStart > 0;
          if (t1 && portStart + 1 === pathStart) {
            scheme = _null;
            isSimple = false;
          } else {
            if (!(queryStart < end && queryStart === pathStart + 2 && B.JSString_methods.startsWith$2(uri, "..", pathStart)))
              t2 = queryStart > pathStart + 2 && B.JSString_methods.startsWith$2(uri, "/..", queryStart - 3);
            else
              t2 = true;
            if (t2) {
              scheme = _null;
              isSimple = false;
            } else {
              if (schemeEnd === 4)
                if (B.JSString_methods.startsWith$2(uri, "file", 0)) {
                  if (hostStart <= 0) {
                    if (!B.JSString_methods.startsWith$2(uri, "/", pathStart)) {
                      schemeAuth = "file:///";
                      delta = 3;
                    } else {
                      schemeAuth = "file://";
                      delta = 2;
                    }
                    uri = schemeAuth + B.JSString_methods.substring$2(uri, pathStart, end);
                    schemeEnd -= 0;
                    t1 = delta - 0;
                    queryStart += t1;
                    fragmentStart += t1;
                    end = uri.length;
                    hostStart = 7;
                    portStart = 7;
                    pathStart = 7;
                  } else if (pathStart === queryStart) {
                    ++fragmentStart;
                    queryStart0 = queryStart + 1;
                    uri = B.JSString_methods.replaceRange$3(uri, pathStart, queryStart, "/");
                    ++end;
                    queryStart = queryStart0;
                  }
                  scheme = "file";
                } else if (B.JSString_methods.startsWith$2(uri, "http", 0)) {
                  if (t1 && portStart + 3 === pathStart && B.JSString_methods.startsWith$2(uri, "80", portStart + 1)) {
                    fragmentStart -= 3;
                    pathStart0 = pathStart - 3;
                    queryStart -= 3;
                    uri = B.JSString_methods.replaceRange$3(uri, portStart, pathStart, "");
                    end -= 3;
                    pathStart = pathStart0;
                  }
                  scheme = "http";
                } else
                  scheme = _null;
              else if (schemeEnd === 5 && B.JSString_methods.startsWith$2(uri, "https", 0)) {
                if (t1 && portStart + 4 === pathStart && B.JSString_methods.startsWith$2(uri, "443", portStart + 1)) {
                  fragmentStart -= 4;
                  pathStart0 = pathStart - 4;
                  queryStart -= 4;
                  uri = B.JSString_methods.replaceRange$3(uri, portStart, pathStart, "");
                  end -= 3;
                  pathStart = pathStart0;
                }
                scheme = "https";
              } else
                scheme = _null;
              isSimple = true;
            }
          }
        }
      else
        scheme = _null;
      if (isSimple) {
        if (end < uri.length) {
          uri = B.JSString_methods.substring$2(uri, 0, end);
          schemeEnd -= 0;
          hostStart -= 0;
          portStart -= 0;
          pathStart -= 0;
          queryStart -= 0;
          fragmentStart -= 0;
        }
        return new A._SimpleUri(uri, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme);
      }
      if (scheme == null)
        if (schemeEnd > 0)
          scheme = A._Uri__makeScheme(uri, 0, schemeEnd);
        else {
          if (schemeEnd === 0) {
            A._Uri__fail(uri, 0, "Invalid empty scheme");
            A.ReachabilityError$(string$._null_);
          }
          scheme = "";
        }
      if (hostStart > 0) {
        userInfoStart = schemeEnd + 3;
        userInfo = userInfoStart < hostStart ? A._Uri__makeUserInfo(uri, userInfoStart, hostStart - 1) : "";
        host = A._Uri__makeHost(uri, hostStart, portStart, false);
        t1 = portStart + 1;
        if (t1 < pathStart) {
          portNumber = A.Primitives_parseInt(B.JSString_methods.substring$2(uri, t1, pathStart), _null);
          port = A._Uri__makePort(portNumber == null ? A.throwExpression(A.FormatException$("Invalid port", uri, t1)) : portNumber, scheme);
        } else
          port = _null;
      } else {
        port = _null;
        host = port;
        userInfo = "";
      }
      path = A._Uri__makePath(uri, pathStart, queryStart, _null, scheme, host != null);
      query = queryStart < fragmentStart ? A._Uri__makeQuery(uri, queryStart + 1, fragmentStart, _null) : _null;
      return A._Uri$_internal(scheme, userInfo, host, port, path, query, fragmentStart < end ? A._Uri__makeFragment(uri, fragmentStart + 1, end) : _null);
    },
    Uri__parseIPv4Address(host, start, end) {
      var i, partStart, partIndex, char, part, partIndex0,
        _s43_ = "IPv4 address should contain exactly 4 parts",
        _s37_ = "each part must be in the range 0..255",
        error = new A.Uri__parseIPv4Address_error(host),
        result = new Uint8Array(4);
      for (i = start, partStart = i, partIndex = 0; i < end; ++i) {
        char = B.JSString_methods.codeUnitAt$1(host, i);
        if (char !== 46) {
          if ((char ^ 48) > 9)
            error.call$2("invalid character", i);
        } else {
          if (partIndex === 3)
            error.call$2(_s43_, i);
          part = A.int_parse(B.JSString_methods.substring$2(host, partStart, i), null);
          if (part > 255)
            error.call$2(_s37_, partStart);
          partIndex0 = partIndex + 1;
          if (!(partIndex < 4))
            return A.ioore(result, partIndex);
          result[partIndex] = part;
          partStart = i + 1;
          partIndex = partIndex0;
        }
      }
      if (partIndex !== 3)
        error.call$2(_s43_, end);
      part = A.int_parse(B.JSString_methods.substring$2(host, partStart, end), null);
      if (part > 255)
        error.call$2(_s37_, partStart);
      if (!(partIndex < 4))
        return A.ioore(result, partIndex);
      result[partIndex] = part;
      return result;
    },
    Uri_parseIPv6Address(host, start, end) {
      var parts, i, partStart, wildcardSeen, seenDot, char, atEnd, t1, last, bytes, wildCardLength, index, value, j, t2,
        error = new A.Uri_parseIPv6Address_error(host),
        parseHex = new A.Uri_parseIPv6Address_parseHex(error, host);
      if (host.length < 2)
        error.call$1("address is too short");
      parts = A._setArrayType([], type$.JSArray_int);
      for (i = start, partStart = i, wildcardSeen = false, seenDot = false; i < end; ++i) {
        char = B.JSString_methods.codeUnitAt$1(host, i);
        if (char === 58) {
          if (i === start) {
            ++i;
            if (B.JSString_methods.codeUnitAt$1(host, i) !== 58)
              error.call$2("invalid start colon.", i);
            partStart = i;
          }
          if (i === partStart) {
            if (wildcardSeen)
              error.call$2("only one wildcard `::` is allowed", i);
            B.JSArray_methods.add$1(parts, -1);
            wildcardSeen = true;
          } else
            B.JSArray_methods.add$1(parts, parseHex.call$2(partStart, i));
          partStart = i + 1;
        } else if (char === 46)
          seenDot = true;
      }
      if (parts.length === 0)
        error.call$1("too few parts");
      atEnd = partStart === end;
      t1 = B.JSArray_methods.get$last(parts);
      if (atEnd && t1 !== -1)
        error.call$2("expected a part after last `:`", end);
      if (!atEnd)
        if (!seenDot)
          B.JSArray_methods.add$1(parts, parseHex.call$2(partStart, end));
        else {
          last = A.Uri__parseIPv4Address(host, partStart, end);
          B.JSArray_methods.add$1(parts, (last[0] << 8 | last[1]) >>> 0);
          B.JSArray_methods.add$1(parts, (last[2] << 8 | last[3]) >>> 0);
        }
      if (wildcardSeen) {
        if (parts.length > 7)
          error.call$1("an address with a wildcard must have less than 7 parts");
      } else if (parts.length !== 8)
        error.call$1("an address without a wildcard must contain exactly 8 parts");
      bytes = new Uint8Array(16);
      for (t1 = parts.length, wildCardLength = 9 - t1, i = 0, index = 0; i < t1; ++i) {
        value = parts[i];
        if (value === -1)
          for (j = 0; j < wildCardLength; ++j) {
            if (!(index >= 0 && index < 16))
              return A.ioore(bytes, index);
            bytes[index] = 0;
            t2 = index + 1;
            if (!(t2 < 16))
              return A.ioore(bytes, t2);
            bytes[t2] = 0;
            index += 2;
          }
        else {
          t2 = B.JSInt_methods._shrOtherPositive$1(value, 8);
          if (!(index >= 0 && index < 16))
            return A.ioore(bytes, index);
          bytes[index] = t2;
          t2 = index + 1;
          if (!(t2 < 16))
            return A.ioore(bytes, t2);
          bytes[t2] = value & 255;
          index += 2;
        }
      }
      return bytes;
    },
    _Uri$_internal(scheme, _userInfo, _host, _port, path, _query, _fragment) {
      return new A._Uri(scheme, _userInfo, _host, _port, path, _query, _fragment);
    },
    _Uri__defaultPort(scheme) {
      if (scheme === "http")
        return 80;
      if (scheme === "https")
        return 443;
      return 0;
    },
    _Uri__compareScheme(scheme, uri) {
      var t1, i, schemeChar, uriChar, delta, lowerChar;
      for (t1 = scheme.length, i = 0; i < t1; ++i) {
        schemeChar = B.JSString_methods._codeUnitAt$1(scheme, i);
        uriChar = B.JSString_methods._codeUnitAt$1(uri, i);
        delta = schemeChar ^ uriChar;
        if (delta !== 0) {
          if (delta === 32) {
            lowerChar = uriChar | delta;
            if (97 <= lowerChar && lowerChar <= 122)
              continue;
          }
          return false;
        }
      }
      return true;
    },
    _Uri__fail(uri, index, message) {
      throw A.wrapException(A.FormatException$(message, uri, index));
    },
    _Uri__makePort(port, scheme) {
      if (port != null && port === A._Uri__defaultPort(scheme))
        return null;
      return port;
    },
    _Uri__makeHost(host, start, end, strictIPv6) {
      var t1, t2, index, zoneIDstart, zoneID, i;
      if (host == null)
        return null;
      if (start === end)
        return "";
      if (B.JSString_methods.codeUnitAt$1(host, start) === 91) {
        t1 = end - 1;
        if (B.JSString_methods.codeUnitAt$1(host, t1) !== 93) {
          A._Uri__fail(host, start, "Missing end `]` to match `[` in host");
          A.ReachabilityError$(string$._null_);
        }
        t2 = start + 1;
        index = A._Uri__checkZoneID(host, t2, t1);
        if (index < t1) {
          zoneIDstart = index + 1;
          zoneID = A._Uri__normalizeZoneID(host, B.JSString_methods.startsWith$2(host, "25", zoneIDstart) ? index + 3 : zoneIDstart, t1, "%25");
        } else
          zoneID = "";
        A.Uri_parseIPv6Address(host, t2, index);
        return B.JSString_methods.substring$2(host, start, index).toLowerCase() + zoneID + "]";
      }
      for (i = start; i < end; ++i)
        if (B.JSString_methods.codeUnitAt$1(host, i) === 58) {
          index = B.JSString_methods.indexOf$2(host, "%", start);
          index = index >= start && index < end ? index : end;
          if (index < end) {
            zoneIDstart = index + 1;
            zoneID = A._Uri__normalizeZoneID(host, B.JSString_methods.startsWith$2(host, "25", zoneIDstart) ? index + 3 : zoneIDstart, end, "%25");
          } else
            zoneID = "";
          A.Uri_parseIPv6Address(host, start, index);
          return "[" + B.JSString_methods.substring$2(host, start, index) + zoneID + "]";
        }
      return A._Uri__normalizeRegName(host, start, end);
    },
    _Uri__checkZoneID(host, start, end) {
      var index = B.JSString_methods.indexOf$2(host, "%", start);
      return index >= start && index < end ? index : end;
    },
    _Uri__normalizeZoneID(host, start, end, prefix) {
      var index, sectionStart, isNormalized, char, replacement, t1, t2, tail, sourceLength, slice,
        buffer = prefix !== "" ? new A.StringBuffer(prefix) : null;
      for (index = start, sectionStart = index, isNormalized = true; index < end;) {
        char = B.JSString_methods.codeUnitAt$1(host, index);
        if (char === 37) {
          replacement = A._Uri__normalizeEscape(host, index, true);
          t1 = replacement == null;
          if (t1 && isNormalized) {
            index += 3;
            continue;
          }
          if (buffer == null)
            buffer = new A.StringBuffer("");
          t2 = buffer._contents += B.JSString_methods.substring$2(host, sectionStart, index);
          if (t1)
            replacement = B.JSString_methods.substring$2(host, index, index + 3);
          else if (replacement === "%") {
            A._Uri__fail(host, index, "ZoneID should not contain % anymore");
            A.ReachabilityError$(string$._null_);
          }
          buffer._contents = t2 + replacement;
          index += 3;
          sectionStart = index;
          isNormalized = true;
        } else {
          if (char < 127) {
            t1 = char >>> 4;
            if (!(t1 < 8))
              return A.ioore(B.List_nxB, t1);
            t1 = (B.List_nxB[t1] & 1 << (char & 15)) !== 0;
          } else
            t1 = false;
          if (t1) {
            if (isNormalized && 65 <= char && 90 >= char) {
              if (buffer == null)
                buffer = new A.StringBuffer("");
              if (sectionStart < index) {
                buffer._contents += B.JSString_methods.substring$2(host, sectionStart, index);
                sectionStart = index;
              }
              isNormalized = false;
            }
            ++index;
          } else {
            if ((char & 64512) === 55296 && index + 1 < end) {
              tail = B.JSString_methods.codeUnitAt$1(host, index + 1);
              if ((tail & 64512) === 56320) {
                char = (char & 1023) << 10 | tail & 1023 | 65536;
                sourceLength = 2;
              } else
                sourceLength = 1;
            } else
              sourceLength = 1;
            slice = B.JSString_methods.substring$2(host, sectionStart, index);
            if (buffer == null) {
              buffer = new A.StringBuffer("");
              t1 = buffer;
            } else
              t1 = buffer;
            t1._contents += slice;
            t1._contents += A._Uri__escapeChar(char);
            index += sourceLength;
            sectionStart = index;
          }
        }
      }
      if (buffer == null)
        return B.JSString_methods.substring$2(host, start, end);
      if (sectionStart < end)
        buffer._contents += B.JSString_methods.substring$2(host, sectionStart, end);
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _Uri__normalizeRegName(host, start, end) {
      var index, sectionStart, buffer, isNormalized, char, replacement, t1, slice, t2, sourceLength, tail;
      for (index = start, sectionStart = index, buffer = null, isNormalized = true; index < end;) {
        char = B.JSString_methods.codeUnitAt$1(host, index);
        if (char === 37) {
          replacement = A._Uri__normalizeEscape(host, index, true);
          t1 = replacement == null;
          if (t1 && isNormalized) {
            index += 3;
            continue;
          }
          if (buffer == null)
            buffer = new A.StringBuffer("");
          slice = B.JSString_methods.substring$2(host, sectionStart, index);
          t2 = buffer._contents += !isNormalized ? slice.toLowerCase() : slice;
          if (t1) {
            replacement = B.JSString_methods.substring$2(host, index, index + 3);
            sourceLength = 3;
          } else if (replacement === "%") {
            replacement = "%25";
            sourceLength = 1;
          } else
            sourceLength = 3;
          buffer._contents = t2 + replacement;
          index += sourceLength;
          sectionStart = index;
          isNormalized = true;
        } else {
          if (char < 127) {
            t1 = char >>> 4;
            if (!(t1 < 8))
              return A.ioore(B.List_qNA, t1);
            t1 = (B.List_qNA[t1] & 1 << (char & 15)) !== 0;
          } else
            t1 = false;
          if (t1) {
            if (isNormalized && 65 <= char && 90 >= char) {
              if (buffer == null)
                buffer = new A.StringBuffer("");
              if (sectionStart < index) {
                buffer._contents += B.JSString_methods.substring$2(host, sectionStart, index);
                sectionStart = index;
              }
              isNormalized = false;
            }
            ++index;
          } else {
            if (char <= 93) {
              t1 = char >>> 4;
              if (!(t1 < 8))
                return A.ioore(B.List_2Vk, t1);
              t1 = (B.List_2Vk[t1] & 1 << (char & 15)) !== 0;
            } else
              t1 = false;
            if (t1) {
              A._Uri__fail(host, index, "Invalid character");
              A.ReachabilityError$(string$._null_);
            } else {
              if ((char & 64512) === 55296 && index + 1 < end) {
                tail = B.JSString_methods.codeUnitAt$1(host, index + 1);
                if ((tail & 64512) === 56320) {
                  char = (char & 1023) << 10 | tail & 1023 | 65536;
                  sourceLength = 2;
                } else
                  sourceLength = 1;
              } else
                sourceLength = 1;
              slice = B.JSString_methods.substring$2(host, sectionStart, index);
              if (!isNormalized)
                slice = slice.toLowerCase();
              if (buffer == null) {
                buffer = new A.StringBuffer("");
                t1 = buffer;
              } else
                t1 = buffer;
              t1._contents += slice;
              t1._contents += A._Uri__escapeChar(char);
              index += sourceLength;
              sectionStart = index;
            }
          }
        }
      }
      if (buffer == null)
        return B.JSString_methods.substring$2(host, start, end);
      if (sectionStart < end) {
        slice = B.JSString_methods.substring$2(host, sectionStart, end);
        buffer._contents += !isNormalized ? slice.toLowerCase() : slice;
      }
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _Uri__makeScheme(scheme, start, end) {
      var i, containsUpperCase, codeUnit, t1,
        _s67_ = string$._null_;
      if (start === end)
        return "";
      if (!A._Uri__isAlphabeticCharacter(J._codeUnitAt$1$s(scheme, start))) {
        A._Uri__fail(scheme, start, "Scheme not starting with alphabetic character");
        A.ReachabilityError$(_s67_);
      }
      for (i = start, containsUpperCase = false; i < end; ++i) {
        codeUnit = B.JSString_methods._codeUnitAt$1(scheme, i);
        if (codeUnit < 128) {
          t1 = codeUnit >>> 4;
          if (!(t1 < 8))
            return A.ioore(B.List_JYB, t1);
          t1 = (B.List_JYB[t1] & 1 << (codeUnit & 15)) !== 0;
        } else
          t1 = false;
        if (!t1) {
          A._Uri__fail(scheme, i, "Illegal scheme character");
          A.ReachabilityError$(_s67_);
        }
        if (65 <= codeUnit && codeUnit <= 90)
          containsUpperCase = true;
      }
      scheme = B.JSString_methods.substring$2(scheme, start, end);
      return A._Uri__canonicalizeScheme(containsUpperCase ? scheme.toLowerCase() : scheme);
    },
    _Uri__canonicalizeScheme(scheme) {
      if (scheme === "http")
        return "http";
      if (scheme === "file")
        return "file";
      if (scheme === "https")
        return "https";
      if (scheme === "package")
        return "package";
      return scheme;
    },
    _Uri__makeUserInfo(userInfo, start, end) {
      if (userInfo == null)
        return "";
      return A._Uri__normalizeOrSubstring(userInfo, start, end, B.List_gRj, false);
    },
    _Uri__makePath(path, start, end, pathSegments, scheme, hasAuthority) {
      var t1, result,
        isFile = scheme === "file",
        ensureLeadingSlash = isFile || hasAuthority;
      if (path == null) {
        if (pathSegments == null)
          return isFile ? "/" : "";
        t1 = A._arrayInstanceType(pathSegments);
        result = new A.MappedListIterable(pathSegments, t1._eval$1("String(1)")._as(new A._Uri__makePath_closure()), t1._eval$1("MappedListIterable<1,String>")).join$1(0, "/");
      } else if (pathSegments != null)
        throw A.wrapException(A.ArgumentError$("Both path and pathSegments specified", null));
      else
        result = A._Uri__normalizeOrSubstring(path, start, end, B.List_qg4, true);
      if (result.length === 0) {
        if (isFile)
          return "/";
      } else if (ensureLeadingSlash && !B.JSString_methods.startsWith$1(result, "/"))
        result = "/" + result;
      return A._Uri__normalizePath(result, scheme, hasAuthority);
    },
    _Uri__normalizePath(path, scheme, hasAuthority) {
      var t1 = scheme.length === 0;
      if (t1 && !hasAuthority && !B.JSString_methods.startsWith$1(path, "/"))
        return A._Uri__normalizeRelativePath(path, !t1 || hasAuthority);
      return A._Uri__removeDotSegments(path);
    },
    _Uri__makeQuery(query, start, end, queryParameters) {
      if (query != null)
        return A._Uri__normalizeOrSubstring(query, start, end, B.List_CVk, true);
      return null;
    },
    _Uri__makeFragment(fragment, start, end) {
      if (fragment == null)
        return null;
      return A._Uri__normalizeOrSubstring(fragment, start, end, B.List_CVk, true);
    },
    _Uri__normalizeEscape(source, index, lowerCase) {
      var firstDigit, secondDigit, firstDigitValue, secondDigitValue, value,
        t1 = index + 2;
      if (t1 >= source.length)
        return "%";
      firstDigit = B.JSString_methods.codeUnitAt$1(source, index + 1);
      secondDigit = B.JSString_methods.codeUnitAt$1(source, t1);
      firstDigitValue = A.hexDigitValue(firstDigit);
      secondDigitValue = A.hexDigitValue(secondDigit);
      if (firstDigitValue < 0 || secondDigitValue < 0)
        return "%";
      value = firstDigitValue * 16 + secondDigitValue;
      if (value < 127) {
        t1 = B.JSInt_methods._shrOtherPositive$1(value, 4);
        if (!(t1 < 8))
          return A.ioore(B.List_nxB, t1);
        t1 = (B.List_nxB[t1] & 1 << (value & 15)) !== 0;
      } else
        t1 = false;
      if (t1)
        return A.Primitives_stringFromCharCode(lowerCase && 65 <= value && 90 >= value ? (value | 32) >>> 0 : value);
      if (firstDigit >= 97 || secondDigit >= 97)
        return B.JSString_methods.substring$2(source, index, index + 3).toUpperCase();
      return null;
    },
    _Uri__escapeChar(char) {
      var codeUnits, flag, encodedBytes, t1, index, byte, t2, t3,
        _s16_ = "0123456789ABCDEF";
      if (char < 128) {
        codeUnits = new Uint8Array(3);
        codeUnits[0] = 37;
        codeUnits[1] = B.JSString_methods._codeUnitAt$1(_s16_, char >>> 4);
        codeUnits[2] = B.JSString_methods._codeUnitAt$1(_s16_, char & 15);
      } else {
        if (char > 2047)
          if (char > 65535) {
            flag = 240;
            encodedBytes = 4;
          } else {
            flag = 224;
            encodedBytes = 3;
          }
        else {
          flag = 192;
          encodedBytes = 2;
        }
        t1 = 3 * encodedBytes;
        codeUnits = new Uint8Array(t1);
        for (index = 0; --encodedBytes, encodedBytes >= 0; flag = 128) {
          byte = B.JSInt_methods._shrReceiverPositive$1(char, 6 * encodedBytes) & 63 | flag;
          if (!(index < t1))
            return A.ioore(codeUnits, index);
          codeUnits[index] = 37;
          t2 = index + 1;
          t3 = B.JSString_methods._codeUnitAt$1(_s16_, byte >>> 4);
          if (!(t2 < t1))
            return A.ioore(codeUnits, t2);
          codeUnits[t2] = t3;
          t3 = index + 2;
          t2 = B.JSString_methods._codeUnitAt$1(_s16_, byte & 15);
          if (!(t3 < t1))
            return A.ioore(codeUnits, t3);
          codeUnits[t3] = t2;
          index += 3;
        }
      }
      return A.String_String$fromCharCodes(codeUnits, 0, null);
    },
    _Uri__normalizeOrSubstring(component, start, end, charTable, escapeDelimiters) {
      var t1 = A._Uri__normalize(component, start, end, charTable, escapeDelimiters);
      return t1 == null ? B.JSString_methods.substring$2(component, start, end) : t1;
    },
    _Uri__normalize(component, start, end, charTable, escapeDelimiters) {
      var t1, index, sectionStart, buffer, char, t2, replacement, sourceLength, tail, _null = null;
      for (t1 = !escapeDelimiters, index = start, sectionStart = index, buffer = _null; index < end;) {
        char = B.JSString_methods.codeUnitAt$1(component, index);
        if (char < 127) {
          t2 = char >>> 4;
          if (!(t2 < 8))
            return A.ioore(charTable, t2);
          t2 = (charTable[t2] & 1 << (char & 15)) !== 0;
        } else
          t2 = false;
        if (t2)
          ++index;
        else {
          if (char === 37) {
            replacement = A._Uri__normalizeEscape(component, index, false);
            if (replacement == null) {
              index += 3;
              continue;
            }
            if ("%" === replacement) {
              replacement = "%25";
              sourceLength = 1;
            } else
              sourceLength = 3;
          } else {
            if (t1)
              if (char <= 93) {
                t2 = char >>> 4;
                if (!(t2 < 8))
                  return A.ioore(B.List_2Vk, t2);
                t2 = (B.List_2Vk[t2] & 1 << (char & 15)) !== 0;
              } else
                t2 = false;
            else
              t2 = false;
            if (t2) {
              A._Uri__fail(component, index, "Invalid character");
              A.ReachabilityError$(string$._null_);
              sourceLength = _null;
              replacement = sourceLength;
            } else {
              if ((char & 64512) === 55296) {
                t2 = index + 1;
                if (t2 < end) {
                  tail = B.JSString_methods.codeUnitAt$1(component, t2);
                  if ((tail & 64512) === 56320) {
                    char = (char & 1023) << 10 | tail & 1023 | 65536;
                    sourceLength = 2;
                  } else
                    sourceLength = 1;
                } else
                  sourceLength = 1;
              } else
                sourceLength = 1;
              replacement = A._Uri__escapeChar(char);
            }
          }
          if (buffer == null) {
            buffer = new A.StringBuffer("");
            t2 = buffer;
          } else
            t2 = buffer;
          t2._contents += B.JSString_methods.substring$2(component, sectionStart, index);
          t2._contents += A.S(replacement);
          if (typeof sourceLength !== "number")
            return A.iae(sourceLength);
          index += sourceLength;
          sectionStart = index;
        }
      }
      if (buffer == null)
        return _null;
      if (sectionStart < end)
        buffer._contents += B.JSString_methods.substring$2(component, sectionStart, end);
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _Uri__mayContainDotSegments(path) {
      if (B.JSString_methods.startsWith$1(path, "."))
        return true;
      return B.JSString_methods.indexOf$1(path, "/.") !== -1;
    },
    _Uri__removeDotSegments(path) {
      var output, t1, t2, appendSlash, _i, segment, t3;
      if (!A._Uri__mayContainDotSegments(path))
        return path;
      output = A._setArrayType([], type$.JSArray_String);
      for (t1 = path.split("/"), t2 = t1.length, appendSlash = false, _i = 0; _i < t2; ++_i) {
        segment = t1[_i];
        if (J.$eq$(segment, "..")) {
          t3 = output.length;
          if (t3 !== 0) {
            if (0 >= t3)
              return A.ioore(output, -1);
            output.pop();
            if (output.length === 0)
              B.JSArray_methods.add$1(output, "");
          }
          appendSlash = true;
        } else if ("." === segment)
          appendSlash = true;
        else {
          B.JSArray_methods.add$1(output, segment);
          appendSlash = false;
        }
      }
      if (appendSlash)
        B.JSArray_methods.add$1(output, "");
      return B.JSArray_methods.join$1(output, "/");
    },
    _Uri__normalizeRelativePath(path, allowScheme) {
      var output, t1, t2, appendSlash, _i, segment;
      if (!A._Uri__mayContainDotSegments(path))
        return !allowScheme ? A._Uri__escapeScheme(path) : path;
      output = A._setArrayType([], type$.JSArray_String);
      for (t1 = path.split("/"), t2 = t1.length, appendSlash = false, _i = 0; _i < t2; ++_i) {
        segment = t1[_i];
        if (".." === segment)
          if (output.length !== 0 && B.JSArray_methods.get$last(output) !== "..") {
            if (0 >= output.length)
              return A.ioore(output, -1);
            output.pop();
            appendSlash = true;
          } else {
            B.JSArray_methods.add$1(output, "..");
            appendSlash = false;
          }
        else if ("." === segment)
          appendSlash = true;
        else {
          B.JSArray_methods.add$1(output, segment);
          appendSlash = false;
        }
      }
      t1 = output.length;
      if (t1 !== 0)
        if (t1 === 1) {
          if (0 >= t1)
            return A.ioore(output, 0);
          t1 = output[0].length === 0;
        } else
          t1 = false;
      else
        t1 = true;
      if (t1)
        return "./";
      if (appendSlash || B.JSArray_methods.get$last(output) === "..")
        B.JSArray_methods.add$1(output, "");
      if (!allowScheme) {
        if (0 >= output.length)
          return A.ioore(output, 0);
        B.JSArray_methods.$indexSet(output, 0, A._Uri__escapeScheme(output[0]));
      }
      return B.JSArray_methods.join$1(output, "/");
    },
    _Uri__escapeScheme(path) {
      var i, char, t2,
        t1 = path.length;
      if (t1 >= 2 && A._Uri__isAlphabeticCharacter(B.JSString_methods._codeUnitAt$1(path, 0)))
        for (i = 1; i < t1; ++i) {
          char = B.JSString_methods._codeUnitAt$1(path, i);
          if (char === 58)
            return B.JSString_methods.substring$2(path, 0, i) + "%3A" + B.JSString_methods.substring$1(path, i + 1);
          if (char <= 127) {
            t2 = char >>> 4;
            if (!(t2 < 8))
              return A.ioore(B.List_JYB, t2);
            t2 = (B.List_JYB[t2] & 1 << (char & 15)) === 0;
          } else
            t2 = true;
          if (t2)
            break;
        }
      return path;
    },
    _Uri__isAlphabeticCharacter(codeUnit) {
      var lowerCase = codeUnit | 32;
      return 97 <= lowerCase && lowerCase <= 122;
    },
    UriData__parse(text, start, sourceUri) {
      var t1, i, slashIndex, char, equalsIndex, lastSeparator, t2, data,
        _s17_ = "Invalid MIME type",
        indices = A._setArrayType([start - 1], type$.JSArray_int);
      for (t1 = text.length, i = start, slashIndex = -1, char = null; i < t1; ++i) {
        char = B.JSString_methods._codeUnitAt$1(text, i);
        if (char === 44 || char === 59)
          break;
        if (char === 47) {
          if (slashIndex < 0) {
            slashIndex = i;
            continue;
          }
          throw A.wrapException(A.FormatException$(_s17_, text, i));
        }
      }
      if (slashIndex < 0 && i > start)
        throw A.wrapException(A.FormatException$(_s17_, text, i));
      for (; char !== 44;) {
        B.JSArray_methods.add$1(indices, i);
        ++i;
        for (equalsIndex = -1; i < t1; ++i) {
          char = B.JSString_methods._codeUnitAt$1(text, i);
          if (char === 61) {
            if (equalsIndex < 0)
              equalsIndex = i;
          } else if (char === 59 || char === 44)
            break;
        }
        if (equalsIndex >= 0)
          B.JSArray_methods.add$1(indices, equalsIndex);
        else {
          lastSeparator = B.JSArray_methods.get$last(indices);
          if (char !== 44 || i !== lastSeparator + 7 || !B.JSString_methods.startsWith$2(text, "base64", lastSeparator + 1))
            throw A.wrapException(A.FormatException$("Expecting '='", text, i));
          break;
        }
      }
      B.JSArray_methods.add$1(indices, i);
      t2 = i + 1;
      if ((indices.length & 1) === 1)
        text = B.C_Base64Codec.normalize$3(0, text, t2, t1);
      else {
        data = A._Uri__normalize(text, t2, t1, B.List_CVk, true);
        if (data != null)
          text = B.JSString_methods.replaceRange$3(text, t2, t1, data);
      }
      return new A.UriData(text, indices, sourceUri);
    },
    _createTables() {
      var _i, t2, t3, t4, t5,
        _s77_ = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~!$&'()*+,;=",
        _s1_ = ".", _s1_0 = ":", _s1_1 = "/", _s1_2 = "?", _s1_3 = "#",
        t1 = type$.Uint8List,
        tables = J.JSArray_JSArray$allocateGrowable(22, t1);
      for (_i = 0; _i < 22; ++_i)
        tables[_i] = new Uint8Array(96);
      t2 = new A._createTables_build(tables);
      t3 = new A._createTables_setChars();
      t4 = new A._createTables_setRange();
      t5 = t1._as(t2.call$2(0, 225));
      t3.call$3(t5, _s77_, 1);
      t3.call$3(t5, _s1_, 14);
      t3.call$3(t5, _s1_0, 34);
      t3.call$3(t5, _s1_1, 3);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(14, 225));
      t3.call$3(t5, _s77_, 1);
      t3.call$3(t5, _s1_, 15);
      t3.call$3(t5, _s1_0, 34);
      t3.call$3(t5, _s1_1, 234);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(15, 225));
      t3.call$3(t5, _s77_, 1);
      t3.call$3(t5, "%", 225);
      t3.call$3(t5, _s1_0, 34);
      t3.call$3(t5, _s1_1, 9);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(1, 225));
      t3.call$3(t5, _s77_, 1);
      t3.call$3(t5, _s1_0, 34);
      t3.call$3(t5, _s1_1, 10);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(2, 235));
      t3.call$3(t5, _s77_, 139);
      t3.call$3(t5, _s1_1, 131);
      t3.call$3(t5, _s1_, 146);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(3, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_1, 68);
      t3.call$3(t5, _s1_, 18);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(4, 229));
      t3.call$3(t5, _s77_, 5);
      t4.call$3(t5, "AZ", 229);
      t3.call$3(t5, _s1_0, 102);
      t3.call$3(t5, "@", 68);
      t3.call$3(t5, "[", 232);
      t3.call$3(t5, _s1_1, 138);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(5, 229));
      t3.call$3(t5, _s77_, 5);
      t4.call$3(t5, "AZ", 229);
      t3.call$3(t5, _s1_0, 102);
      t3.call$3(t5, "@", 68);
      t3.call$3(t5, _s1_1, 138);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(6, 231));
      t4.call$3(t5, "19", 7);
      t3.call$3(t5, "@", 68);
      t3.call$3(t5, _s1_1, 138);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(7, 231));
      t4.call$3(t5, "09", 7);
      t3.call$3(t5, "@", 68);
      t3.call$3(t5, _s1_1, 138);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t3.call$3(t1._as(t2.call$2(8, 8)), "]", 5);
      t5 = t1._as(t2.call$2(9, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_, 16);
      t3.call$3(t5, _s1_1, 234);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(16, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_, 17);
      t3.call$3(t5, _s1_1, 234);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(17, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_1, 9);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(10, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_, 18);
      t3.call$3(t5, _s1_1, 234);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(18, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_, 19);
      t3.call$3(t5, _s1_1, 234);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(19, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_1, 234);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(11, 235));
      t3.call$3(t5, _s77_, 11);
      t3.call$3(t5, _s1_1, 10);
      t3.call$3(t5, _s1_2, 172);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(12, 236));
      t3.call$3(t5, _s77_, 12);
      t3.call$3(t5, _s1_2, 12);
      t3.call$3(t5, _s1_3, 205);
      t5 = t1._as(t2.call$2(13, 237));
      t3.call$3(t5, _s77_, 13);
      t3.call$3(t5, _s1_2, 13);
      t4.call$3(t1._as(t2.call$2(20, 245)), "az", 21);
      t2 = t1._as(t2.call$2(21, 245));
      t4.call$3(t2, "az", 21);
      t4.call$3(t2, "09", 21);
      t3.call$3(t2, "+-.", 21);
      return tables;
    },
    _scan(uri, start, end, state, indices) {
      var t1, i, table, char, transition,
        tables = $.$get$_scannerTables();
      for (t1 = J.getInterceptor$s(uri), i = start; i < end; ++i) {
        if (!(state >= 0 && state < tables.length))
          return A.ioore(tables, state);
        table = tables[state];
        char = t1._codeUnitAt$1(uri, i) ^ 96;
        transition = table[char > 95 ? 31 : char];
        state = transition & 31;
        B.JSArray_methods.$indexSet(indices, transition >>> 5, i);
      }
      return state;
    },
    _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;
    },
    _BigIntImpl: function _BigIntImpl(t0, t1, t2) {
      this._isNegative = t0;
      this._digits = t1;
      this._used = t2;
    },
    _BigIntImpl_hashCode_combine: function _BigIntImpl_hashCode_combine() {
    },
    _BigIntImpl_hashCode_finish: function _BigIntImpl_hashCode_finish() {
    },
    DateTime: function DateTime(t0, t1) {
      this._value = t0;
      this.isUtc = t1;
    },
    Duration: function Duration(t0) {
      this._duration = t0;
    },
    Error: function Error() {
    },
    AssertionError: function AssertionError(t0) {
      this.message = t0;
    },
    TypeError: function TypeError() {
    },
    NullThrownError: function NullThrownError() {
    },
    ArgumentError: function ArgumentError(t0, t1, t2, t3) {
      var _ = this;
      _._hasValue = t0;
      _.invalidValue = t1;
      _.name = t2;
      _.message = t3;
    },
    RangeError: function RangeError(t0, t1, t2, t3, t4, t5) {
      var _ = this;
      _.start = t0;
      _.end = t1;
      _._hasValue = t2;
      _.invalidValue = t3;
      _.name = t4;
      _.message = t5;
    },
    IndexError: function IndexError(t0, t1, t2, t3, t4) {
      var _ = this;
      _.length = t0;
      _._hasValue = t1;
      _.invalidValue = t2;
      _.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;
    },
    UnimplementedError: function UnimplementedError(t0) {
      this.message = t0;
    },
    StateError: function StateError(t0) {
      this.message = t0;
    },
    ConcurrentModificationError: function ConcurrentModificationError(t0) {
      this.modifiedObject = t0;
    },
    OutOfMemoryError: function OutOfMemoryError() {
    },
    StackOverflowError: function StackOverflowError() {
    },
    CyclicInitializationError: function CyclicInitializationError(t0) {
      this.variableName = t0;
    },
    _Exception: function _Exception(t0) {
      this.message = t0;
    },
    FormatException: function FormatException(t0, t1, t2) {
      this.message = t0;
      this.source = t1;
      this.offset = t2;
    },
    IntegerDivisionByZeroException: function IntegerDivisionByZeroException() {
    },
    Expando: function Expando(t0, t1) {
      this._jsWeakMap = t0;
      this.$ti = t1;
    },
    Iterable: function Iterable() {
    },
    Iterator: function Iterator() {
    },
    Null: function Null() {
    },
    Object: function Object() {
    },
    _StringStackTrace: function _StringStackTrace(t0) {
      this._stackTrace = t0;
    },
    StringBuffer: function StringBuffer(t0) {
      this._contents = t0;
    },
    Uri__parseIPv4Address_error: function Uri__parseIPv4Address_error(t0) {
      this.host = t0;
    },
    Uri_parseIPv6Address_error: function Uri_parseIPv6Address_error(t0) {
      this.host = t0;
    },
    Uri_parseIPv6Address_parseHex: function Uri_parseIPv6Address_parseHex(t0, t1) {
      this.error = t0;
      this.host = t1;
    },
    _Uri: function _Uri(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _.scheme = t0;
      _._userInfo = t1;
      _._host = t2;
      _._port = t3;
      _.path = t4;
      _._query = t5;
      _._fragment = t6;
      _.___Uri_hashCode = _.___Uri_pathSegments = _.___Uri__text = $;
    },
    _Uri__makePath_closure: function _Uri__makePath_closure() {
    },
    UriData: function UriData(t0, t1, t2) {
      this._text = t0;
      this._separatorIndices = t1;
      this._uriCache = t2;
    },
    _createTables_build: function _createTables_build(t0) {
      this.tables = t0;
    },
    _createTables_setChars: function _createTables_setChars() {
    },
    _createTables_setRange: function _createTables_setRange() {
    },
    _SimpleUri: function _SimpleUri(t0, t1, t2, t3, t4, t5, t6, t7) {
      var _ = this;
      _._uri = t0;
      _._schemeEnd = t1;
      _._hostStart = t2;
      _._portStart = t3;
      _._pathStart = t4;
      _._queryStart = t5;
      _._fragmentStart = t6;
      _._schemeCache = t7;
      _._hashCodeCache = null;
    },
    _DataUri: function _DataUri(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _.scheme = t0;
      _._userInfo = t1;
      _._host = t2;
      _._port = t3;
      _.path = t4;
      _._query = t5;
      _._fragment = t6;
      _.___Uri_hashCode = _.___Uri_pathSegments = _.___Uri__text = $;
    },
    CustomEvent_CustomEvent(type) {
      var exception,
        canBubble = true,
        cancelable = true,
        detail = null,
        e = type$.CustomEvent._as(document.createEvent("CustomEvent"));
      e._dartDetail = detail;
      if (type$.List_dynamic._is(detail) || type$.Map_dynamic_dynamic._is(detail) || typeof detail == "string" || typeof detail == "number")
        try {
          detail = new A._StructuredCloneDart2Js([], []).walk$1(detail);
          J._initCustomEvent$4$x(e, type, canBubble, cancelable, detail);
        } catch (exception) {
          J._initCustomEvent$4$x(e, type, canBubble, cancelable, null);
        }
      else
        J._initCustomEvent$4$x(e, type, canBubble, cancelable, null);
      return e;
    },
    Element_Element$html(html, treeSanitizer, validator) {
      var fragment,
        t1 = document.body;
      t1.toString;
      fragment = B.BodyElement_methods.createFragment$3$treeSanitizer$validator(t1, html, treeSanitizer, validator);
      fragment.toString;
      t1 = type$._ChildNodeListLazy;
      t1 = new A.WhereIterable(new A._ChildNodeListLazy(fragment), t1._eval$1("bool(ListMixin.E)")._as(new A.Element_Element$html_closure()), t1._eval$1("WhereIterable<ListMixin.E>"));
      return type$.Element._as(t1.get$single(t1));
    },
    Element__safeTagName(element) {
      var t1, exception,
        result = "element tag unavailable";
      try {
        t1 = J.getInterceptor$x(element);
        if (typeof t1.get$tagName(element) == "string")
          result = t1.get$tagName(element);
      } catch (exception) {
      }
      return result;
    },
    EventSource__factoryEventSource(url, eventSourceInitDict) {
      var t1 = new EventSource(url, A.convertDartToNative_Dictionary(eventSourceInitDict));
      return t1;
    },
    HttpRequest_request(url, method, responseType, sendData, withCredentials) {
      var t2, t3, t4,
        t1 = new A._Future($.Zone__current, type$._Future_HttpRequest),
        completer = new A._AsyncCompleter(t1, type$._AsyncCompleter_HttpRequest),
        xhr = new XMLHttpRequest();
      B.HttpRequest_methods.open$3$async(xhr, method, url, true);
      if (withCredentials != null)
        B.HttpRequest_methods.set$withCredentials(xhr, withCredentials);
      if (responseType != null)
        xhr.responseType = responseType;
      t2 = type$.nullable_void_Function_legacy_ProgressEvent;
      t3 = t2._as(new A.HttpRequest_request_closure(xhr, completer));
      type$.nullable_void_Function._as(null);
      t4 = type$.legacy_ProgressEvent;
      A._EventStreamSubscription$(xhr, "load", t3, false, t4);
      A._EventStreamSubscription$(xhr, "error", t2._as(completer.get$completeError()), false, t4);
      if (sendData != null)
        xhr.send(sendData);
      else
        xhr.send();
      return t1;
    },
    WebSocket_WebSocket(url, protocols) {
      return new WebSocket(url);
    },
    _EventStreamSubscription$(_target, _eventType, onData, _useCapture, $T) {
      var t1 = onData == null ? null : A._wrapZone(new A._EventStreamSubscription_closure(onData), type$.Event);
      t1 = new A._EventStreamSubscription(_target, _eventType, t1, false, $T._eval$1("_EventStreamSubscription<0>"));
      t1._tryResume$0();
      return t1;
    },
    _Html5NodeValidator$(uriPolicy) {
      var e = document.createElement("a"),
        t1 = new A._SameOriginUriPolicy(e, window.location);
      t1 = new A._Html5NodeValidator(t1);
      t1._Html5NodeValidator$1$uriPolicy(uriPolicy);
      return t1;
    },
    _Html5NodeValidator__standardAttributeValidator(element, attributeName, value, context) {
      type$.Element._as(element);
      A._asStringS(attributeName);
      A._asStringS(value);
      type$._Html5NodeValidator._as(context);
      return true;
    },
    _Html5NodeValidator__uriAttributeValidator(element, attributeName, value, context) {
      var t1, t2, t3;
      type$.Element._as(element);
      A._asStringS(attributeName);
      A._asStringS(value);
      t1 = type$._Html5NodeValidator._as(context).uriPolicy;
      t2 = t1._hiddenAnchor;
      B.AnchorElement_methods.set$href(t2, value);
      t3 = t2.hostname;
      t1 = t1._loc;
      if (!(t3 == t1.hostname && t2.port == t1.port && t2.protocol == t1.protocol))
        if (t3 === "")
          if (t2.port === "") {
            t1 = t2.protocol;
            t1 = t1 === ":" || t1 === "";
          } else
            t1 = false;
        else
          t1 = false;
      else
        t1 = true;
      return t1;
    },
    _TemplatingNodeValidator$() {
      var t1 = type$.String,
        t2 = A.LinkedHashSet_LinkedHashSet$from(B.List_wSV, t1),
        t3 = type$.String_Function_legacy_String._as(new A._TemplatingNodeValidator_closure()),
        t4 = A._setArrayType(["TEMPLATE"], type$.JSArray_String);
      t1 = new A._TemplatingNodeValidator(t2, A.LinkedHashSet_LinkedHashSet(t1), A.LinkedHashSet_LinkedHashSet(t1), A.LinkedHashSet_LinkedHashSet(t1), null);
      t1._SimpleNodeValidator$4$allowedAttributes$allowedElements$allowedUriAttributes(null, new A.MappedListIterable(B.List_wSV, t3, type$.MappedListIterable_of_legacy_String_and_String), t4, null);
      return t1;
    },
    _convertNativeToDart_XHR_Response(o) {
      if (type$.Document._is(o))
        return o;
      return new A._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(o, true);
    },
    _DOMWindowCrossFrame__createSafe(w) {
      if (w === window)
        return w;
      else
        return new A._DOMWindowCrossFrame();
    },
    _wrapZone(callback, $T) {
      var t1 = $.Zone__current;
      if (t1 === B.C__RootZone)
        return callback;
      return t1.bindUnaryCallbackGuarded$1$1(callback, $T);
    },
    HtmlElement: function HtmlElement() {
    },
    AccessibleNodeList: function AccessibleNodeList() {
    },
    AnchorElement: function AnchorElement() {
    },
    AreaElement: function AreaElement() {
    },
    BaseElement: function BaseElement() {
    },
    Blob: function Blob() {
    },
    BodyElement: function BodyElement() {
    },
    CharacterData: function CharacterData() {
    },
    CloseEvent: function CloseEvent() {
    },
    CssPerspective: function CssPerspective() {
    },
    CssRule: function CssRule() {
    },
    CssStyleDeclaration: function CssStyleDeclaration() {
    },
    CssStyleDeclarationBase: function CssStyleDeclarationBase() {
    },
    CssStyleValue: function CssStyleValue() {
    },
    CssTransformComponent: function CssTransformComponent() {
    },
    CssTransformValue: function CssTransformValue() {
    },
    CssUnparsedValue: function CssUnparsedValue() {
    },
    CustomEvent: function CustomEvent() {
    },
    DataTransferItemList: function DataTransferItemList() {
    },
    Document: function Document() {
    },
    DomException: function DomException() {
    },
    DomImplementation: function DomImplementation() {
    },
    DomRectList: function DomRectList() {
    },
    DomRectReadOnly: function DomRectReadOnly() {
    },
    DomStringList: function DomStringList() {
    },
    DomTokenList: function DomTokenList() {
    },
    _FrozenElementList: function _FrozenElementList(t0, t1) {
      this._nodeList = t0;
      this.$ti = t1;
    },
    Element: function Element() {
    },
    Element_Element$html_closure: function Element_Element$html_closure() {
    },
    Event: function Event() {
    },
    EventSource: function EventSource() {
    },
    EventTarget: function EventTarget() {
    },
    File: function File() {
    },
    FileList: function FileList() {
    },
    FileWriter: function FileWriter() {
    },
    FormElement: function FormElement() {
    },
    Gamepad: function Gamepad() {
    },
    History: function History() {
    },
    HtmlCollection: function HtmlCollection() {
    },
    HtmlDocument: function HtmlDocument() {
    },
    HttpRequest: function HttpRequest() {
    },
    HttpRequest_request_closure: function HttpRequest_request_closure(t0, t1) {
      this.xhr = t0;
      this.completer = t1;
    },
    HttpRequestEventTarget: function HttpRequestEventTarget() {
    },
    ImageData: function ImageData() {
    },
    KeyboardEvent: function KeyboardEvent() {
    },
    Location: function Location() {
    },
    MediaList: function MediaList() {
    },
    MessageEvent: function MessageEvent() {
    },
    MessagePort: function MessagePort() {
    },
    MidiInputMap: function MidiInputMap() {
    },
    MidiInputMap_keys_closure: function MidiInputMap_keys_closure(t0) {
      this.keys = t0;
    },
    MidiOutputMap: function MidiOutputMap() {
    },
    MidiOutputMap_keys_closure: function MidiOutputMap_keys_closure(t0) {
      this.keys = t0;
    },
    MimeType: function MimeType() {
    },
    MimeTypeArray: function MimeTypeArray() {
    },
    _ChildNodeListLazy: function _ChildNodeListLazy(t0) {
      this._this = t0;
    },
    Node: function Node() {
    },
    NodeList: function NodeList() {
    },
    Plugin: function Plugin() {
    },
    PluginArray: function PluginArray() {
    },
    ProgressEvent: function ProgressEvent() {
    },
    RtcStatsReport: function RtcStatsReport() {
    },
    RtcStatsReport_keys_closure: function RtcStatsReport_keys_closure(t0) {
      this.keys = t0;
    },
    ScriptElement: function ScriptElement() {
    },
    SelectElement: function SelectElement() {
    },
    SourceBuffer: function SourceBuffer() {
    },
    SourceBufferList: function SourceBufferList() {
    },
    SpeechGrammar: function SpeechGrammar() {
    },
    SpeechGrammarList: function SpeechGrammarList() {
    },
    SpeechRecognitionResult: function SpeechRecognitionResult() {
    },
    Storage: function Storage() {
    },
    Storage_keys_closure: function Storage_keys_closure(t0) {
      this.keys = t0;
    },
    StyleSheet: function StyleSheet() {
    },
    TableElement: function TableElement() {
    },
    TableRowElement: function TableRowElement() {
    },
    TableSectionElement: function TableSectionElement() {
    },
    TemplateElement: function TemplateElement() {
    },
    TextTrack: function TextTrack() {
    },
    TextTrackCue: function TextTrackCue() {
    },
    TextTrackCueList: function TextTrackCueList() {
    },
    TextTrackList: function TextTrackList() {
    },
    TimeRanges: function TimeRanges() {
    },
    Touch: function Touch() {
    },
    TouchList: function TouchList() {
    },
    TrackDefaultList: function TrackDefaultList() {
    },
    UIEvent: function UIEvent() {
    },
    Url: function Url() {
    },
    VideoTrackList: function VideoTrackList() {
    },
    WebSocket: function WebSocket() {
    },
    Window: function Window() {
    },
    WorkerGlobalScope: function WorkerGlobalScope() {
    },
    _Attr: function _Attr() {
    },
    _CssRuleList: function _CssRuleList() {
    },
    _DomRect: function _DomRect() {
    },
    _GamepadList: function _GamepadList() {
    },
    _NamedNodeMap: function _NamedNodeMap() {
    },
    _SpeechRecognitionResultList: function _SpeechRecognitionResultList() {
    },
    _StyleSheetList: function _StyleSheetList() {
    },
    _AttributeMap: function _AttributeMap() {
    },
    _ElementAttributeMap: function _ElementAttributeMap(t0) {
      this._element = t0;
    },
    EventStreamProvider: function EventStreamProvider(t0, t1) {
      this._eventType = t0;
      this.$ti = t1;
    },
    _EventStream: function _EventStream(t0, t1, t2, t3) {
      var _ = this;
      _._target = t0;
      _._eventType = t1;
      _._useCapture = t2;
      _.$ti = t3;
    },
    _EventStreamSubscription: function _EventStreamSubscription(t0, t1, t2, t3, t4) {
      var _ = this;
      _._pauseCount = 0;
      _._target = t0;
      _._eventType = t1;
      _._onData = t2;
      _._useCapture = t3;
      _.$ti = t4;
    },
    _EventStreamSubscription_closure: function _EventStreamSubscription_closure(t0) {
      this.onData = t0;
    },
    _EventStreamSubscription_onData_closure: function _EventStreamSubscription_onData_closure(t0) {
      this.handleData = t0;
    },
    _Html5NodeValidator: function _Html5NodeValidator(t0) {
      this.uriPolicy = t0;
    },
    ImmutableListMixin: function ImmutableListMixin() {
    },
    NodeValidatorBuilder: function NodeValidatorBuilder(t0) {
      this._validators = t0;
    },
    NodeValidatorBuilder_allowsElement_closure: function NodeValidatorBuilder_allowsElement_closure(t0) {
      this.element = t0;
    },
    NodeValidatorBuilder_allowsAttribute_closure: function NodeValidatorBuilder_allowsAttribute_closure(t0, t1, t2) {
      this.element = t0;
      this.attributeName = t1;
      this.value = t2;
    },
    _SimpleNodeValidator: function _SimpleNodeValidator() {
    },
    _SimpleNodeValidator_closure: function _SimpleNodeValidator_closure() {
    },
    _SimpleNodeValidator_closure0: function _SimpleNodeValidator_closure0() {
    },
    _TemplatingNodeValidator: function _TemplatingNodeValidator(t0, t1, t2, t3, t4) {
      var _ = this;
      _._templateAttrs = t0;
      _.allowedElements = t1;
      _.allowedAttributes = t2;
      _.allowedUriAttributes = t3;
      _.uriPolicy = t4;
    },
    _TemplatingNodeValidator_closure: function _TemplatingNodeValidator_closure() {
    },
    _SvgNodeValidator: function _SvgNodeValidator() {
    },
    FixedSizeListIterator: function FixedSizeListIterator(t0, t1, t2) {
      var _ = this;
      _._array = t0;
      _._length = t1;
      _._position = -1;
      _._current = null;
      _.$ti = t2;
    },
    _DOMWindowCrossFrame: function _DOMWindowCrossFrame() {
    },
    _SameOriginUriPolicy: function _SameOriginUriPolicy(t0, t1) {
      this._hiddenAnchor = t0;
      this._loc = t1;
    },
    _ValidatingTreeSanitizer: function _ValidatingTreeSanitizer(t0) {
      this.validator = t0;
      this.numTreeModifications = 0;
    },
    _ValidatingTreeSanitizer_sanitizeTree_walk: function _ValidatingTreeSanitizer_sanitizeTree_walk(t0) {
      this.$this = t0;
    },
    _CssStyleDeclaration_Interceptor_CssStyleDeclarationBase: function _CssStyleDeclaration_Interceptor_CssStyleDeclarationBase() {
    },
    _DomRectList_Interceptor_ListMixin: function _DomRectList_Interceptor_ListMixin() {
    },
    _DomRectList_Interceptor_ListMixin_ImmutableListMixin: function _DomRectList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _DomStringList_Interceptor_ListMixin: function _DomStringList_Interceptor_ListMixin() {
    },
    _DomStringList_Interceptor_ListMixin_ImmutableListMixin: function _DomStringList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _FileList_Interceptor_ListMixin: function _FileList_Interceptor_ListMixin() {
    },
    _FileList_Interceptor_ListMixin_ImmutableListMixin: function _FileList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _HtmlCollection_Interceptor_ListMixin: function _HtmlCollection_Interceptor_ListMixin() {
    },
    _HtmlCollection_Interceptor_ListMixin_ImmutableListMixin: function _HtmlCollection_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _MidiInputMap_Interceptor_MapMixin: function _MidiInputMap_Interceptor_MapMixin() {
    },
    _MidiOutputMap_Interceptor_MapMixin: function _MidiOutputMap_Interceptor_MapMixin() {
    },
    _MimeTypeArray_Interceptor_ListMixin: function _MimeTypeArray_Interceptor_ListMixin() {
    },
    _MimeTypeArray_Interceptor_ListMixin_ImmutableListMixin: function _MimeTypeArray_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _NodeList_Interceptor_ListMixin: function _NodeList_Interceptor_ListMixin() {
    },
    _NodeList_Interceptor_ListMixin_ImmutableListMixin: function _NodeList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _PluginArray_Interceptor_ListMixin: function _PluginArray_Interceptor_ListMixin() {
    },
    _PluginArray_Interceptor_ListMixin_ImmutableListMixin: function _PluginArray_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _RtcStatsReport_Interceptor_MapMixin: function _RtcStatsReport_Interceptor_MapMixin() {
    },
    _SourceBufferList_EventTarget_ListMixin: function _SourceBufferList_EventTarget_ListMixin() {
    },
    _SourceBufferList_EventTarget_ListMixin_ImmutableListMixin: function _SourceBufferList_EventTarget_ListMixin_ImmutableListMixin() {
    },
    _SpeechGrammarList_Interceptor_ListMixin: function _SpeechGrammarList_Interceptor_ListMixin() {
    },
    _SpeechGrammarList_Interceptor_ListMixin_ImmutableListMixin: function _SpeechGrammarList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _Storage_Interceptor_MapMixin: function _Storage_Interceptor_MapMixin() {
    },
    _TextTrackCueList_Interceptor_ListMixin: function _TextTrackCueList_Interceptor_ListMixin() {
    },
    _TextTrackCueList_Interceptor_ListMixin_ImmutableListMixin: function _TextTrackCueList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _TextTrackList_EventTarget_ListMixin: function _TextTrackList_EventTarget_ListMixin() {
    },
    _TextTrackList_EventTarget_ListMixin_ImmutableListMixin: function _TextTrackList_EventTarget_ListMixin_ImmutableListMixin() {
    },
    _TouchList_Interceptor_ListMixin: function _TouchList_Interceptor_ListMixin() {
    },
    _TouchList_Interceptor_ListMixin_ImmutableListMixin: function _TouchList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    __CssRuleList_Interceptor_ListMixin: function __CssRuleList_Interceptor_ListMixin() {
    },
    __CssRuleList_Interceptor_ListMixin_ImmutableListMixin: function __CssRuleList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    __GamepadList_Interceptor_ListMixin: function __GamepadList_Interceptor_ListMixin() {
    },
    __GamepadList_Interceptor_ListMixin_ImmutableListMixin: function __GamepadList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    __NamedNodeMap_Interceptor_ListMixin: function __NamedNodeMap_Interceptor_ListMixin() {
    },
    __NamedNodeMap_Interceptor_ListMixin_ImmutableListMixin: function __NamedNodeMap_Interceptor_ListMixin_ImmutableListMixin() {
    },
    __SpeechRecognitionResultList_Interceptor_ListMixin: function __SpeechRecognitionResultList_Interceptor_ListMixin() {
    },
    __SpeechRecognitionResultList_Interceptor_ListMixin_ImmutableListMixin: function __SpeechRecognitionResultList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    __StyleSheetList_Interceptor_ListMixin: function __StyleSheetList_Interceptor_ListMixin() {
    },
    __StyleSheetList_Interceptor_ListMixin_ImmutableListMixin: function __StyleSheetList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _convertNativeToDart_Value(value) {
      var values, i;
      if (value == null)
        return value;
      if (typeof value == "string" || typeof value == "number" || A._isBool(value))
        return value;
      if (A.isJavaScriptSimpleObject(value))
        return A.convertNativeToDart_Dictionary(value);
      if (Array.isArray(value)) {
        values = [];
        for (i = 0; i < value.length; ++i)
          values.push(A._convertNativeToDart_Value(value[i]));
        return values;
      }
      return value;
    },
    convertNativeToDart_Dictionary(object) {
      var dict, keys, t1, _i, key;
      if (object == null)
        return null;
      dict = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic);
      keys = Object.getOwnPropertyNames(object);
      for (t1 = keys.length, _i = 0; _i < keys.length; keys.length === t1 || (0, A.throwConcurrentModificationError)(keys), ++_i) {
        key = keys[_i];
        dict.$indexSet(0, key, A._convertNativeToDart_Value(object[key]));
      }
      return dict;
    },
    _convertDartToNative_Value(value) {
      var array;
      if (value == null)
        return value;
      if (typeof value == "string" || typeof value == "number" || A._isBool(value))
        return value;
      if (type$.Map_dynamic_dynamic._is(value))
        return A.convertDartToNative_Dictionary(value);
      if (type$.List_dynamic._is(value)) {
        array = [];
        J.forEach$1$ax(value, new A._convertDartToNative_Value_closure(array));
        value = array;
      }
      return value;
    },
    convertDartToNative_Dictionary(dict) {
      var object = {};
      J.forEach$1$ax(dict, new A.convertDartToNative_Dictionary_closure(object));
      return object;
    },
    isJavaScriptSimpleObject(value) {
      var proto = Object.getPrototypeOf(value);
      return proto === Object.prototype || proto === null;
    },
    _StructuredClone: function _StructuredClone() {
    },
    _StructuredClone_walk_closure: function _StructuredClone_walk_closure(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    _StructuredClone_walk_closure0: function _StructuredClone_walk_closure0(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    _AcceptStructuredClone: function _AcceptStructuredClone() {
    },
    _AcceptStructuredClone_walk_closure: function _AcceptStructuredClone_walk_closure(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    _convertDartToNative_Value_closure: function _convertDartToNative_Value_closure(t0) {
      this.array = t0;
    },
    convertDartToNative_Dictionary_closure: function convertDartToNative_Dictionary_closure(t0) {
      this.object = t0;
    },
    _StructuredCloneDart2Js: function _StructuredCloneDart2Js(t0, t1) {
      this.values = t0;
      this.copies = t1;
    },
    _AcceptStructuredCloneDart2Js: function _AcceptStructuredCloneDart2Js(t0, t1) {
      this.values = t0;
      this.copies = t1;
      this.mustCopy = false;
    },
    KeyRange: function KeyRange() {
    },
    _callDartFunction(callback, captureThis, $self, $arguments) {
      var arguments0, t1, dartArgs;
      A._asBoolS(captureThis);
      type$.List_dynamic._as($arguments);
      if (A.boolConversionCheck(captureThis)) {
        arguments0 = [$self];
        B.JSArray_methods.addAll$1(arguments0, $arguments);
        $arguments = arguments0;
      }
      t1 = type$.dynamic;
      dartArgs = A.List_List$from(J.map$1$1$ax($arguments, A.js___convertToDart$closure(), t1), true, t1);
      return A._convertToJS(A.Function_apply(type$.Function._as(callback), dartArgs, null));
    },
    JsObject__convertDataTree(data) {
      return new A.JsObject__convertDataTree__convert(new A._IdentityHashMap(type$._IdentityHashMap_dynamic_dynamic)).call$1(data);
    },
    _castToJsObject(o) {
      return o;
    },
    _defineProperty(o, $name, value) {
      var exception;
      try {
        if (Object.isExtensible(o) && !Object.prototype.hasOwnProperty.call(o, $name)) {
          Object.defineProperty(o, $name, {value: value});
          return true;
        }
      } catch (exception) {
      }
      return false;
    },
    _getOwnProperty(o, $name) {
      if (Object.prototype.hasOwnProperty.call(o, $name))
        return o[$name];
      return null;
    },
    _convertToJS(o) {
      if (o == null || typeof o == "string" || typeof o == "number" || A._isBool(o))
        return o;
      if (o instanceof A.JsObject)
        return o._js$_jsObject;
      if (A.isBrowserObject(o))
        return o;
      if (type$.TypedData._is(o))
        return o;
      if (o instanceof A.DateTime)
        return A.Primitives_lazyAsJsDate(o);
      if (type$.Function._is(o))
        return A._getJsProxy(o, "$dart_jsFunction", new A._convertToJS_closure());
      return A._getJsProxy(o, "_$dart_jsObject", new A._convertToJS_closure0($.$get$_dartProxyCtor()));
    },
    _getJsProxy(o, propertyName, createProxy) {
      var jsProxy = A._getOwnProperty(o, propertyName);
      if (jsProxy == null) {
        jsProxy = createProxy.call$1(o);
        A._defineProperty(o, propertyName, jsProxy);
      }
      return jsProxy;
    },
    _convertToDart(o) {
      if (o == null || typeof o == "string" || typeof o == "number" || typeof o == "boolean")
        return o;
      else if (o instanceof Object && A.isBrowserObject(o))
        return o;
      else if (o instanceof Object && type$.TypedData._is(o))
        return o;
      else if (o instanceof Date)
        return A.DateTime$fromMillisecondsSinceEpoch(A._asIntS(o.getTime()), false);
      else if (o.constructor === $.$get$_dartProxyCtor())
        return o.o;
      else
        return A._wrapToDart(o);
    },
    _wrapToDart(o) {
      if (typeof o == "function")
        return A._getDartProxy(o, $.$get$DART_CLOSURE_PROPERTY_NAME(), new A._wrapToDart_closure());
      if (o instanceof Array)
        return A._getDartProxy(o, $.$get$_DART_OBJECT_PROPERTY_NAME(), new A._wrapToDart_closure0());
      return A._getDartProxy(o, $.$get$_DART_OBJECT_PROPERTY_NAME(), new A._wrapToDart_closure1());
    },
    _getDartProxy(o, propertyName, createProxy) {
      var dartProxy = A._getOwnProperty(o, propertyName);
      if (dartProxy == null || !(o instanceof Object)) {
        dartProxy = createProxy.call$1(o);
        A._defineProperty(o, propertyName, dartProxy);
      }
      return dartProxy;
    },
    _convertDartFunctionFast(f) {
      var ret,
        existing = f.$dart_jsFunction;
      if (existing != null)
        return existing;
      ret = function(_call, f) {
        return function() {
          return _call(f, Array.prototype.slice.apply(arguments));
        };
      }(A._callDartFunctionFast, f);
      ret[$.$get$DART_CLOSURE_PROPERTY_NAME()] = f;
      f.$dart_jsFunction = ret;
      return ret;
    },
    _callDartFunctionFast(callback, $arguments) {
      type$.List_dynamic._as($arguments);
      return A.Function_apply(type$.Function._as(callback), $arguments, null);
    },
    allowInterop(f, $F) {
      if (typeof f == "function")
        return f;
      else
        return $F._as(A._convertDartFunctionFast(f));
    },
    JsObject__convertDataTree__convert: function JsObject__convertDataTree__convert(t0) {
      this._convertedObjects = t0;
    },
    _convertToJS_closure: function _convertToJS_closure() {
    },
    _convertToJS_closure0: function _convertToJS_closure0(t0) {
      this.ctor = t0;
    },
    _wrapToDart_closure: function _wrapToDart_closure() {
    },
    _wrapToDart_closure0: function _wrapToDart_closure0() {
    },
    _wrapToDart_closure1: function _wrapToDart_closure1() {
    },
    JsObject: function JsObject(t0) {
      this._js$_jsObject = t0;
    },
    JsFunction: function JsFunction(t0) {
      this._js$_jsObject = t0;
    },
    JsArray: function JsArray(t0, t1) {
      this._js$_jsObject = t0;
      this.$ti = t1;
    },
    _JsArray_JsObject_ListMixin: function _JsArray_JsObject_ListMixin() {
    },
    promiseToFuture(jsPromise, $T) {
      var t1 = new A._Future($.Zone__current, $T._eval$1("_Future<0>")),
        completer = new A._AsyncCompleter(t1, $T._eval$1("_AsyncCompleter<0>"));
      jsPromise.then(A.convertDartClosureToJS(new A.promiseToFuture_closure(completer, $T), 1), A.convertDartClosureToJS(new A.promiseToFuture_closure0(completer), 1));
      return t1;
    },
    NullRejectionException: function NullRejectionException(t0) {
      this.isUndefined = t0;
    },
    promiseToFuture_closure: function promiseToFuture_closure(t0, t1) {
      this.completer = t0;
      this.T = t1;
    },
    promiseToFuture_closure0: function promiseToFuture_closure0(t0) {
      this.completer = t0;
    },
    Random_Random(seed) {
      var t1;
      if (seed == null)
        t1 = B.C__JSRandom;
      else {
        t1 = new A._Random();
        t1._Random$1(seed);
      }
      return t1;
    },
    _JSRandom: function _JSRandom() {
    },
    _Random: function _Random() {
      this._hi = this._lo = 0;
    },
    Length: function Length() {
    },
    LengthList: function LengthList() {
    },
    Number: function Number() {
    },
    NumberList: function NumberList() {
    },
    PointList: function PointList() {
    },
    ScriptElement0: function ScriptElement0() {
    },
    StringList: function StringList() {
    },
    SvgElement: function SvgElement() {
    },
    Transform: function Transform() {
    },
    TransformList: function TransformList() {
    },
    _LengthList_Interceptor_ListMixin: function _LengthList_Interceptor_ListMixin() {
    },
    _LengthList_Interceptor_ListMixin_ImmutableListMixin: function _LengthList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _NumberList_Interceptor_ListMixin: function _NumberList_Interceptor_ListMixin() {
    },
    _NumberList_Interceptor_ListMixin_ImmutableListMixin: function _NumberList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _StringList_Interceptor_ListMixin: function _StringList_Interceptor_ListMixin() {
    },
    _StringList_Interceptor_ListMixin_ImmutableListMixin: function _StringList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    _TransformList_Interceptor_ListMixin: function _TransformList_Interceptor_ListMixin() {
    },
    _TransformList_Interceptor_ListMixin_ImmutableListMixin: function _TransformList_Interceptor_ListMixin_ImmutableListMixin() {
    },
    AudioBuffer: function AudioBuffer() {
    },
    AudioParamMap: function AudioParamMap() {
    },
    AudioParamMap_keys_closure: function AudioParamMap_keys_closure(t0) {
      this.keys = t0;
    },
    AudioTrackList: function AudioTrackList() {
    },
    BaseAudioContext: function BaseAudioContext() {
    },
    OfflineAudioContext: function OfflineAudioContext() {
    },
    _AudioParamMap_Interceptor_MapMixin: function _AudioParamMap_Interceptor_MapMixin() {
    },
    AsyncMemoizer: function AsyncMemoizer(t0, t1) {
      this._completer = t0;
      this.$ti = t1;
    },
    DelegatingStreamSink: function DelegatingStreamSink() {
    },
    CopyOnWriteList: function CopyOnWriteList(t0, t1, t2) {
      var _ = this;
      _._copyBeforeWrite = true;
      _._growable = t0;
      _._copy_on_write_list$_list = t1;
      _.$ti = t2;
    },
    hashObjects(objects) {
      return A._finish(B.JSArray_methods.fold$1$2(objects, 0, new A.hashObjects_closure(), type$.int));
    },
    _combine(hash, value) {
      if (typeof hash !== "number")
        return hash.$add();
      if (typeof value !== "number")
        return A.iae(value);
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    _finish(hash) {
      if (typeof hash !== "number")
        return A.iae(hash);
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    hashObjects_closure: function hashObjects_closure() {
    },
    BuiltList_BuiltList$from(iterable, $E) {
      var t1;
      if (iterable instanceof A._BuiltList) {
        t1 = A.createRuntimeType($E);
        t1 = A.createRuntimeType(iterable.$ti._precomputed1) === t1;
      } else
        t1 = false;
      if (t1)
        return $E._eval$1("BuiltList<0>")._as(iterable);
      else {
        t1 = new A._BuiltList(A.List_List$from(iterable, false, $E), $E._eval$1("_BuiltList<0>"));
        t1._list$_maybeCheckForNull$0();
        return t1;
      }
    },
    ListBuilder_ListBuilder(iterable, $E) {
      var t1 = new A.ListBuilder($E._eval$1("ListBuilder<0>"));
      t1.replace$1(0, iterable);
      return t1;
    },
    BuiltList: function BuiltList() {
    },
    _BuiltList: function _BuiltList(t0, t1) {
      this._list = t0;
      this._list$_hashCode = null;
      this.$ti = t1;
    },
    ListBuilder: function ListBuilder(t0) {
      this.__ListBuilder__list = $;
      this._listOwner = null;
      this.$ti = t0;
    },
    BuiltListMultimap_BuiltListMultimap($K, $V) {
      var t1 = A._BuiltListMultimap$copy(B.Map_empty.get$keys(B.Map_empty), new A.BuiltListMultimap_BuiltListMultimap_closure(B.Map_empty), $K, $V);
      return t1;
    },
    _BuiltListMultimap$copy(keys, lookup, $K, $V) {
      var t1 = new A._BuiltListMultimap(A.LinkedHashMap_LinkedHashMap$_empty($K, $V._eval$1("BuiltList<0>")), A.BuiltList_BuiltList$from(B.List_empty0, $V), $K._eval$1("@<0>")._bind$1($V)._eval$1("_BuiltListMultimap<1,2>"));
      t1._BuiltListMultimap$copy$2(keys, lookup, $K, $V);
      return t1;
    },
    ListMultimapBuilder_ListMultimapBuilder($K, $V) {
      var t1 = new A.ListMultimapBuilder($K._eval$1("@<0>")._bind$1($V)._eval$1("ListMultimapBuilder<1,2>"));
      t1.replace$1(0, B.Map_empty);
      return t1;
    },
    BuiltListMultimap: function BuiltListMultimap() {
    },
    BuiltListMultimap_BuiltListMultimap_closure: function BuiltListMultimap_BuiltListMultimap_closure(t0) {
      this.multimap = t0;
    },
    BuiltListMultimap_hashCode_closure: function BuiltListMultimap_hashCode_closure(t0) {
      this.$this = t0;
    },
    _BuiltListMultimap: function _BuiltListMultimap(t0, t1, t2) {
      var _ = this;
      _._list_multimap$_map = t0;
      _._emptyList = t1;
      _._list_multimap$_keys = _._list_multimap$_hashCode = null;
      _.$ti = t2;
    },
    ListMultimapBuilder: function ListMultimapBuilder(t0) {
      var _ = this;
      _.__ListMultimapBuilder__builtMap = $;
      _._list_multimap$_builtMapOwner = null;
      _.__ListMultimapBuilder__builderMap = $;
      _.$ti = t0;
    },
    ListMultimapBuilder_replace_closure: function ListMultimapBuilder_replace_closure(t0) {
      this.multimap = t0;
    },
    BuiltMap_BuiltMap($K, $V) {
      var t1 = new A._BuiltMap(null, A.LinkedHashMap_LinkedHashMap$_empty($K, $V), $K._eval$1("@<0>")._bind$1($V)._eval$1("_BuiltMap<1,2>"));
      t1._BuiltMap$copyAndCheckTypes$2(B.Map_empty.get$keys(B.Map_empty), new A.BuiltMap_BuiltMap_closure(B.Map_empty), $K, $V);
      return t1;
    },
    MapBuilder_MapBuilder($K, $V) {
      var t1 = new A.MapBuilder(null, $, null, $K._eval$1("@<0>")._bind$1($V)._eval$1("MapBuilder<1,2>"));
      t1.replace$1(0, B.Map_empty);
      return t1;
    },
    BuiltMap: function BuiltMap() {
    },
    BuiltMap_BuiltMap_closure: function BuiltMap_BuiltMap_closure(t0) {
      this.map = t0;
    },
    BuiltMap_hashCode_closure: function BuiltMap_hashCode_closure(t0) {
      this.$this = t0;
    },
    _BuiltMap: function _BuiltMap(t0, t1, t2) {
      var _ = this;
      _._mapFactory = t0;
      _._map$_map = t1;
      _._map$_keys = _._map$_hashCode = null;
      _.$ti = t2;
    },
    MapBuilder: function MapBuilder(t0, t1, t2, t3) {
      var _ = this;
      _._mapFactory = t0;
      _.__MapBuilder__map = t1;
      _._mapOwner = t2;
      _.$ti = t3;
    },
    MapBuilder_replace_closure: function MapBuilder_replace_closure(t0, t1) {
      this.$this = t0;
      this.replacement = t1;
    },
    BuiltSet_BuiltSet$from(iterable, $E) {
      var t1 = new A._BuiltSet(null, A.LinkedHashSet_LinkedHashSet$from(iterable, $E), $E._eval$1("_BuiltSet<0>"));
      t1._maybeCheckForNull$0();
      return t1;
    },
    SetBuilder_SetBuilder($E) {
      var t1 = new A.SetBuilder(null, $, null, $E._eval$1("SetBuilder<0>"));
      t1.replace$1(0, B.List_empty0);
      return t1;
    },
    BuiltSet: function BuiltSet() {
    },
    BuiltSet_hashCode_closure: function BuiltSet_hashCode_closure(t0) {
      this.$this = t0;
    },
    _BuiltSet: function _BuiltSet(t0, t1, t2) {
      var _ = this;
      _._setFactory = t0;
      _._set$_set = t1;
      _._set$_hashCode = null;
      _.$ti = t2;
    },
    SetBuilder: function SetBuilder(t0, t1, t2, t3) {
      var _ = this;
      _._setFactory = t0;
      _.__SetBuilder__set = t1;
      _._setOwner = t2;
      _.$ti = t3;
    },
    SetMultimapBuilder_SetMultimapBuilder($K, $V) {
      var t1 = new A.SetMultimapBuilder($K._eval$1("@<0>")._bind$1($V)._eval$1("SetMultimapBuilder<1,2>"));
      t1.replace$1(0, B.Map_empty);
      return t1;
    },
    BuiltSetMultimap: function BuiltSetMultimap() {
    },
    BuiltSetMultimap_hashCode_closure: function BuiltSetMultimap_hashCode_closure(t0) {
      this.$this = t0;
    },
    _BuiltSetMultimap: function _BuiltSetMultimap(t0, t1, t2) {
      var _ = this;
      _._set_multimap$_map = t0;
      _._emptySet = t1;
      _._set_multimap$_keys = _._set_multimap$_hashCode = null;
      _.$ti = t2;
    },
    SetMultimapBuilder: function SetMultimapBuilder(t0) {
      var _ = this;
      _.__SetMultimapBuilder__builtMap = $;
      _._builtMapOwner = null;
      _.__SetMultimapBuilder__builderMap = $;
      _.$ti = t0;
    },
    SetMultimapBuilder_replace_closure: function SetMultimapBuilder_replace_closure(t0) {
      this.multimap = t0;
    },
    $jc(hash, value) {
      if (typeof value !== "number")
        return A.iae(value);
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    $jf(hash) {
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    BuiltValueNullFieldError$(type, field) {
      return new A.BuiltValueNullFieldError(type, field);
    },
    EnumClass: function EnumClass() {
    },
    newBuiltValueToStringHelper_closure: function newBuiltValueToStringHelper_closure() {
    },
    IndentingBuiltValueToStringHelper: function IndentingBuiltValueToStringHelper(t0) {
      this._result = t0;
    },
    BuiltValueNullFieldError: function BuiltValueNullFieldError(t0, t1) {
      this.type = t0;
      this.field = t1;
    },
    BuiltValueNestedFieldError: function BuiltValueNestedFieldError(t0, t1, t2) {
      this.type = t0;
      this.field = t1;
      this.error = t2;
    },
    JsonObject_JsonObject(value) {
      if (typeof value == "number")
        return new A.NumJsonObject(value);
      else if (typeof value == "string")
        return new A.StringJsonObject(value);
      else if (A._isBool(value))
        return new A.BoolJsonObject(value);
      else if (type$.List_nullable_Object._is(value))
        return new A.ListJsonObject(new A.UnmodifiableListView(value, type$.UnmodifiableListView_nullable_Object));
      else if (type$.Map_of_String_and_nullable_Object._is(value))
        return new A.MapJsonObject(new A.UnmodifiableMapView(value, type$.UnmodifiableMapView_of_String_and_nullable_Object));
      else if (type$.Map_dynamic_dynamic._is(value))
        return new A.MapJsonObject(new A.UnmodifiableMapView(J.cast$2$0$ax(value, type$.String, type$.nullable_Object), type$.UnmodifiableMapView_of_String_and_nullable_Object));
      else
        throw A.wrapException(A.ArgumentError$value(value, "value", "Must be bool, List<Object?>, Map<String?, Object?>, num or String"));
    },
    JsonObject: function JsonObject() {
    },
    BoolJsonObject: function BoolJsonObject(t0) {
      this.value = t0;
    },
    ListJsonObject: function ListJsonObject(t0) {
      this.value = t0;
    },
    MapJsonObject: function MapJsonObject(t0) {
      this.value = t0;
    },
    NumJsonObject: function NumJsonObject(t0) {
      this.value = t0;
    },
    StringJsonObject: function StringJsonObject(t0) {
      this.value = t0;
    },
    Serializers_Serializers() {
      var t1 = type$.Type,
        t2 = type$.Serializer_dynamic,
        t3 = type$.String;
      t2 = new A.BuiltJsonSerializersBuilder(A.MapBuilder_MapBuilder(t1, t2), A.MapBuilder_MapBuilder(t3, t2), A.MapBuilder_MapBuilder(t3, t2), A.MapBuilder_MapBuilder(type$.FullType, type$.Function), A.ListBuilder_ListBuilder(B.List_empty0, type$.SerializerPlugin));
      t2.add$1(0, new A.BigIntSerializer(A.BuiltList_BuiltList$from([B.Type_BigInt_8OV, J.get$runtimeType$($.$get$_BigIntImpl_zero())], t1)));
      t2.add$1(0, new A.BoolSerializer(A.BuiltList_BuiltList$from([B.Type_bool_lhE], t1)));
      t3 = type$.Object;
      t2.add$1(0, new A.BuiltListSerializer(A.BuiltList_BuiltList$from([B.Type_BuiltList_iTR, A.getRuntimeType(A.BuiltList_BuiltList$from(B.List_empty0, t3))], t1)));
      t2.add$1(0, new A.BuiltListMultimapSerializer(A.BuiltList_BuiltList$from([B.Type_BuiltListMultimap_2Mt, A.getRuntimeType(A.BuiltListMultimap_BuiltListMultimap(t3, t3))], t1)));
      t2.add$1(0, new A.BuiltMapSerializer(A.BuiltList_BuiltList$from([B.Type_BuiltMap_qd4, A.getRuntimeType(A.BuiltMap_BuiltMap(t3, t3))], t1)));
      t2.add$1(0, new A.BuiltSetSerializer(A.BuiltList_BuiltList$from([B.Type_BuiltSet_fcN, A.getRuntimeType(A.BuiltSet_BuiltSet$from(B.List_empty0, t3))], t1)));
      t2.add$1(0, new A.BuiltSetMultimapSerializer(A.BuiltSet_BuiltSet$from([B.Type_BuiltSetMultimap_9Fi], t1)));
      t2.add$1(0, new A.DateTimeSerializer(A.BuiltList_BuiltList$from([B.Type_DateTime_8AS], t1)));
      t2.add$1(0, new A.DoubleSerializer(A.BuiltList_BuiltList$from([B.Type_double_K1J], t1)));
      t2.add$1(0, new A.DurationSerializer(A.BuiltList_BuiltList$from([B.Type_Duration_SnA], t1)));
      t2.add$1(0, new A.IntSerializer(A.BuiltList_BuiltList$from([B.Type_int_tHn], t1)));
      t2.add$1(0, new A.Int64Serializer(A.BuiltList_BuiltList$from([B.Type_Int64_gc6], t1)));
      t2.add$1(0, new A.JsonObjectSerializer(A.BuiltList_BuiltList$from([B.Type_JsonObject_gyf, B.Type_BoolJsonObject_8HQ, B.Type_ListJsonObject_yPV, B.Type_MapJsonObject_bBG, B.Type_NumJsonObject_H9C, B.Type_StringJsonObject_GAC], t1)));
      t2.add$1(0, new A.NullSerializer(A.BuiltList_BuiltList$from([B.Type_Null_Yyn], t1)));
      t2.add$1(0, new A.NumSerializer(A.BuiltList_BuiltList$from([B.Type_num_cv7], t1)));
      t2.add$1(0, new A.RegExpSerializer(A.BuiltList_BuiltList$from([B.Type_RegExp_Eeh, $.$get$_runtimeType()], t1)));
      t2.add$1(0, new A.StringSerializer(A.BuiltList_BuiltList$from([B.Type_String_k8F], t1)));
      t2.add$1(0, new A.UriSerializer(A.BuiltList_BuiltList$from([B.Type_Uri_EFX, A.getRuntimeType(A.Uri_parse("http://example.com")), A.getRuntimeType(A.Uri_parse("http://example.com:"))], t1)));
      t2.addBuilderFactory$2(B.FullType_eLJ, new A.Serializers_Serializers_closure());
      t2.addBuilderFactory$2(B.FullType_4Wf, new A.Serializers_Serializers_closure0());
      t2.addBuilderFactory$2(B.FullType_wIv, new A.Serializers_Serializers_closure1());
      t2.addBuilderFactory$2(B.FullType_4e8, new A.Serializers_Serializers_closure2());
      t2.addBuilderFactory$2(B.FullType_Ofx, new A.Serializers_Serializers_closure3());
      return t2.build$0();
    },
    FullType__getRawName(type) {
      var $name = J.toString$0$(type),
        genericsStart = J.indexOf$1$s($name, "<");
      return genericsStart === -1 ? $name : B.JSString_methods.substring$2($name, 0, genericsStart);
    },
    DeserializationError_DeserializationError(json, type, error) {
      var limitedJson = J.toString$0$(json),
        t1 = limitedJson.length;
      return new A.DeserializationError(t1 > 80 ? B.JSString_methods.replaceRange$3(limitedJson, 77, t1, "...") : limitedJson, type, error);
    },
    Serializers_Serializers_closure: function Serializers_Serializers_closure() {
    },
    Serializers_Serializers_closure0: function Serializers_Serializers_closure0() {
    },
    Serializers_Serializers_closure1: function Serializers_Serializers_closure1() {
    },
    Serializers_Serializers_closure2: function Serializers_Serializers_closure2() {
    },
    Serializers_Serializers_closure3: function Serializers_Serializers_closure3() {
    },
    FullType: function FullType(t0, t1, t2) {
      this.root = t0;
      this.parameters = t1;
      this.nullable = t2;
    },
    DeserializationError: function DeserializationError(t0, t1, t2) {
      this.json = t0;
      this.type = t1;
      this.error = t2;
    },
    BigIntSerializer: function BigIntSerializer(t0) {
      this.types = t0;
    },
    BoolSerializer: function BoolSerializer(t0) {
      this.types = t0;
    },
    BuiltJsonSerializersBuilder$_(_typeToSerializer, _wireNameToSerializer, _typeNameToSerializer, _builderFactories, _plugins) {
      return new A.BuiltJsonSerializersBuilder(_typeToSerializer, _wireNameToSerializer, _typeNameToSerializer, _builderFactories, _plugins);
    },
    _getRawName(type) {
      var $name = J.toString$0$(type),
        genericsStart = J.indexOf$1$s($name, "<");
      return genericsStart === -1 ? $name : B.JSString_methods.substring$2($name, 0, genericsStart);
    },
    BuiltJsonSerializers: function BuiltJsonSerializers(t0, t1, t2, t3, t4) {
      var _ = this;
      _._typeToSerializer = t0;
      _._wireNameToSerializer = t1;
      _._typeNameToSerializer = t2;
      _.builderFactories = t3;
      _.serializerPlugins = t4;
    },
    BuiltJsonSerializersBuilder: function BuiltJsonSerializersBuilder(t0, t1, t2, t3, t4) {
      var _ = this;
      _._typeToSerializer = t0;
      _._wireNameToSerializer = t1;
      _._typeNameToSerializer = t2;
      _._builderFactories = t3;
      _._plugins = t4;
    },
    BuiltListMultimapSerializer: function BuiltListMultimapSerializer(t0) {
      this.types = t0;
    },
    BuiltListMultimapSerializer_serialize_closure: function BuiltListMultimapSerializer_serialize_closure(t0, t1) {
      this.serializers = t0;
      this.valueType = t1;
    },
    BuiltListMultimapSerializer_deserialize_closure: function BuiltListMultimapSerializer_deserialize_closure(t0, t1) {
      this.serializers = t0;
      this.valueType = t1;
    },
    BuiltListSerializer: function BuiltListSerializer(t0) {
      this.types = t0;
    },
    BuiltListSerializer_serialize_closure: function BuiltListSerializer_serialize_closure(t0, t1) {
      this.serializers = t0;
      this.elementType = t1;
    },
    BuiltListSerializer_deserialize_closure: function BuiltListSerializer_deserialize_closure(t0, t1) {
      this.serializers = t0;
      this.elementType = t1;
    },
    BuiltMapSerializer: function BuiltMapSerializer(t0) {
      this.types = t0;
    },
    BuiltSetMultimapSerializer: function BuiltSetMultimapSerializer(t0) {
      this.types = t0;
    },
    BuiltSetMultimapSerializer_serialize_closure: function BuiltSetMultimapSerializer_serialize_closure(t0, t1) {
      this.serializers = t0;
      this.valueType = t1;
    },
    BuiltSetMultimapSerializer_deserialize_closure: function BuiltSetMultimapSerializer_deserialize_closure(t0, t1) {
      this.serializers = t0;
      this.valueType = t1;
    },
    BuiltSetSerializer: function BuiltSetSerializer(t0) {
      this.types = t0;
    },
    BuiltSetSerializer_serialize_closure: function BuiltSetSerializer_serialize_closure(t0, t1) {
      this.serializers = t0;
      this.elementType = t1;
    },
    BuiltSetSerializer_deserialize_closure: function BuiltSetSerializer_deserialize_closure(t0, t1) {
      this.serializers = t0;
      this.elementType = t1;
    },
    DateTimeSerializer: function DateTimeSerializer(t0) {
      this.types = t0;
    },
    DoubleSerializer: function DoubleSerializer(t0) {
      this.types = t0;
    },
    DurationSerializer: function DurationSerializer(t0) {
      this.types = t0;
    },
    Int64Serializer: function Int64Serializer(t0) {
      this.types = t0;
    },
    IntSerializer: function IntSerializer(t0) {
      this.types = t0;
    },
    JsonObjectSerializer: function JsonObjectSerializer(t0) {
      this.types = t0;
    },
    NullSerializer: function NullSerializer(t0) {
      this.types = t0;
    },
    NumSerializer: function NumSerializer(t0) {
      this.types = t0;
    },
    RegExpSerializer: function RegExpSerializer(t0) {
      this.types = t0;
    },
    StringSerializer: function StringSerializer(t0) {
      this.types = t0;
    },
    UriSerializer: function UriSerializer(t0) {
      this.types = t0;
    },
    DefaultEquality: function DefaultEquality(t0) {
      this.$ti = t0;
    },
    IterableEquality: function IterableEquality(t0, t1) {
      this._elementEquality = t0;
      this.$ti = t1;
    },
    ListEquality: function ListEquality(t0, t1) {
      this._elementEquality = t0;
      this.$ti = t1;
    },
    _UnorderedEquality: function _UnorderedEquality() {
    },
    SetEquality: function SetEquality(t0, t1) {
      this._elementEquality = t0;
      this.$ti = t1;
    },
    _MapEntry: function _MapEntry(t0, t1, t2) {
      this.equality = t0;
      this.key = t1;
      this.value = t2;
    },
    MapEquality: function MapEquality(t0, t1, t2) {
      this._keyEquality = t0;
      this._valueEquality = t1;
      this.$ti = t2;
    },
    DeepCollectionEquality: function DeepCollectionEquality() {
    },
    _$valueOf($name) {
      switch ($name) {
        case "started":
          return B.BuildStatus_started;
        case "succeeded":
          return B.BuildStatus_succeeded;
        case "failed":
          return B.BuildStatus_failed;
        default:
          throw A.wrapException(A.ArgumentError$($name, null));
      }
    },
    BuildStatus: function BuildStatus(t0) {
      this.name = t0;
    },
    BuildResult: function BuildResult() {
    },
    _$BuildStatusSerializer: function _$BuildStatusSerializer() {
    },
    _$BuildResultSerializer: function _$BuildResultSerializer() {
    },
    _$BuildResult: function _$BuildResult(t0) {
      this.status = t0;
    },
    BuildResultBuilder: function BuildResultBuilder() {
      this._status = this._build_result$_$v = null;
    },
    ConnectRequest: function ConnectRequest() {
    },
    _$ConnectRequestSerializer: function _$ConnectRequestSerializer() {
    },
    _$ConnectRequest: function _$ConnectRequest(t0, t1, t2) {
      this.appId = t0;
      this.instanceId = t1;
      this.entrypointPath = t2;
    },
    ConnectRequestBuilder: function ConnectRequestBuilder() {
      var _ = this;
      _._entrypointPath = _._instanceId = _._appId = _._$v = null;
    },
    DebugEvent: function DebugEvent() {
    },
    _$DebugEventSerializer: function _$DebugEventSerializer() {
    },
    _$DebugEvent: function _$DebugEvent(t0, t1, t2) {
      this.kind = t0;
      this.eventData = t1;
      this.timestamp = t2;
    },
    DebugEventBuilder: function DebugEventBuilder() {
      var _ = this;
      _._timestamp = _._eventData = _._debug_event$_kind = _._debug_event$_$v = null;
    },
    DevToolsRequest: function DevToolsRequest() {
    },
    DevToolsResponse: function DevToolsResponse() {
    },
    _$DevToolsRequestSerializer: function _$DevToolsRequestSerializer() {
    },
    _$DevToolsResponseSerializer: function _$DevToolsResponseSerializer() {
    },
    _$DevToolsRequest: function _$DevToolsRequest(t0, t1, t2, t3) {
      var _ = this;
      _.appId = t0;
      _.instanceId = t1;
      _.contextId = t2;
      _.tabUrl = t3;
    },
    DevToolsRequestBuilder: function DevToolsRequestBuilder() {
      var _ = this;
      _._tabUrl = _._contextId = _._devtools_request$_instanceId = _._devtools_request$_appId = _._devtools_request$_$v = null;
    },
    _$DevToolsResponse: function _$DevToolsResponse(t0, t1, t2) {
      this.success = t0;
      this.promptExtension = t1;
      this.error = t2;
    },
    DevToolsResponseBuilder: function DevToolsResponseBuilder() {
      var _ = this;
      _._error = _._promptExtension = _._success = _._devtools_request$_$v = null;
    },
    ErrorResponse: function ErrorResponse() {
    },
    _$ErrorResponseSerializer: function _$ErrorResponseSerializer() {
    },
    _$ErrorResponse: function _$ErrorResponse(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    },
    ErrorResponseBuilder: function ErrorResponseBuilder() {
      this._error_response$_stackTrace = this._error_response$_error = this._error_response$_$v = null;
    },
    ExtensionRequest: function ExtensionRequest() {
    },
    ExtensionResponse: function ExtensionResponse() {
    },
    ExtensionEvent: function ExtensionEvent() {
    },
    BatchedEvents: function BatchedEvents() {
    },
    _$ExtensionRequestSerializer: function _$ExtensionRequestSerializer() {
    },
    _$ExtensionResponseSerializer: function _$ExtensionResponseSerializer() {
    },
    _$ExtensionEventSerializer: function _$ExtensionEventSerializer() {
    },
    _$BatchedEventsSerializer: function _$BatchedEventsSerializer() {
    },
    _$ExtensionRequest: function _$ExtensionRequest(t0, t1, t2) {
      this.id = t0;
      this.command = t1;
      this.commandParams = t2;
    },
    ExtensionRequestBuilder: function ExtensionRequestBuilder() {
      var _ = this;
      _._commandParams = _._command = _._id = _._extension_request$_$v = null;
    },
    _$ExtensionResponse: function _$ExtensionResponse(t0, t1, t2, t3) {
      var _ = this;
      _.id = t0;
      _.success = t1;
      _.result = t2;
      _.error = t3;
    },
    ExtensionResponseBuilder: function ExtensionResponseBuilder() {
      var _ = this;
      _._extension_request$_error = _._extension_request$_result = _._extension_request$_success = _._id = _._extension_request$_$v = null;
    },
    _$ExtensionEvent: function _$ExtensionEvent(t0, t1) {
      this.params = t0;
      this.method = t1;
    },
    ExtensionEventBuilder: function ExtensionEventBuilder() {
      this._extension_request$_method = this._params = this._extension_request$_$v = null;
    },
    _$BatchedEvents: function _$BatchedEvents(t0) {
      this.events = t0;
    },
    BatchedEventsBuilder: function BatchedEventsBuilder() {
      this._events = this._extension_request$_$v = null;
    },
    IsolateExit: function IsolateExit() {
    },
    IsolateStart: function IsolateStart() {
    },
    _$IsolateExitSerializer: function _$IsolateExitSerializer() {
    },
    _$IsolateStartSerializer: function _$IsolateStartSerializer() {
    },
    _$IsolateExit: function _$IsolateExit() {
    },
    IsolateExitBuilder: function IsolateExitBuilder() {
      this._isolate_events$_$v = null;
    },
    _$IsolateStart: function _$IsolateStart() {
    },
    IsolateStartBuilder: function IsolateStartBuilder() {
      this._isolate_events$_$v = null;
    },
    RegisterEvent: function RegisterEvent() {
    },
    _$RegisterEventSerializer: function _$RegisterEventSerializer() {
    },
    _$RegisterEvent: function _$RegisterEvent(t0, t1) {
      this.eventData = t0;
      this.timestamp = t1;
    },
    RegisterEventBuilder: function RegisterEventBuilder() {
      this._register_event$_timestamp = this._register_event$_eventData = this._register_event$_$v = null;
    },
    RunRequest: function RunRequest() {
    },
    _$RunRequestSerializer: function _$RunRequestSerializer() {
    },
    _$RunRequest: function _$RunRequest() {
    },
    _$serializers_closure: function _$serializers_closure() {
    },
    SocketClient: function SocketClient() {
    },
    SseSocketClient: function SseSocketClient(t0) {
      this._sockets$_client = t0;
    },
    WebSocketClient: function WebSocketClient(t0) {
      this._channel = t0;
    },
    WebSocketClient_stream_closure: function WebSocketClient_stream_closure() {
    },
    Int32__decodeDigit(c) {
      if (c >= 48 && c <= 57)
        return c - 48;
      else if (c >= 97 && c <= 122)
        return c - 97 + 10;
      else if (c >= 65 && c <= 90)
        return c - 65 + 10;
      else
        return -1;
    },
    Int64__parseRadix(s, radix) {
      var i, negative, d0, d1, d2, c, digit, d00, d10, _null = null,
        t1 = s.length;
      if (0 < t1 && s[0] === "-") {
        i = 1;
        negative = true;
      } else {
        i = 0;
        negative = false;
      }
      if (i >= t1)
        throw A.wrapException(A.FormatException$("No digits in '" + s + "'", _null, _null));
      for (d0 = 0, d1 = 0, d2 = 0; i < t1; ++i, d1 = d10, d0 = d00) {
        c = B.JSString_methods._codeUnitAt$1(s, i);
        digit = A.Int32__decodeDigit(c);
        if (digit < 0 || digit >= radix)
          throw A.wrapException(A.FormatException$("Non-radix char code: " + c, _null, _null));
        d0 = d0 * radix + digit;
        d00 = d0 & 4194303;
        d1 = d1 * radix + B.JSInt_methods._shrOtherPositive$1(d0, 22);
        d10 = d1 & 4194303;
        d2 = d2 * radix + (d1 >>> 22) & 1048575;
      }
      if (negative)
        return A.Int64__sub(0, 0, 0, d0, d1, d2);
      return new A.Int64(d0 & 4194303, d1 & 4194303, d2 & 1048575);
    },
    Int64_Int64(value) {
      var negative, v2, v1, t1, t2, t3;
      if (value < 0) {
        value = -value;
        negative = true;
      } else
        negative = false;
      v2 = B.JSInt_methods._tdivFast$1(value, 17592186044416);
      value -= v2 * 17592186044416;
      v1 = B.JSInt_methods._tdivFast$1(value, 4194304);
      t1 = v1 & 4194303;
      t2 = v2 & 1048575;
      t3 = value - v1 * 4194304 & 4194303;
      return negative ? A.Int64__sub(0, 0, 0, t3, t1, t2) : new A.Int64(t3, t1, t2);
    },
    Int64__promote(value) {
      if (value instanceof A.Int64)
        return value;
      else if (A._isInt(value))
        return A.Int64_Int64(value);
      throw A.wrapException(A.ArgumentError$value(value, null, null));
    },
    Int64__toRadixStringUnsigned(radix, d0, d1, d2, sign) {
      var d4, d3, fatRadix, chunk1, chunk2, chunk3, q, q0, q1, q2, q3, chunk10, residue;
      if (d0 === 0 && d1 === 0 && d2 === 0)
        return "0";
      d4 = (d2 << 4 | d1 >>> 18) >>> 0;
      d3 = d1 >>> 8 & 1023;
      d2 = (d1 << 2 | d0 >>> 20) & 1023;
      d1 = d0 >>> 10 & 1023;
      d0 &= 1023;
      if (!(radix < 37))
        return A.ioore(B.List_WrN, radix);
      fatRadix = B.List_WrN[radix];
      chunk1 = "";
      chunk2 = "";
      chunk3 = "";
      while (true) {
        if (!!(d4 === 0 && d3 === 0))
          break;
        q = B.JSInt_methods.$tdiv(d4, fatRadix);
        d3 += d4 - q * fatRadix << 10 >>> 0;
        q0 = B.JSInt_methods.$tdiv(d3, fatRadix);
        d2 += d3 - q0 * fatRadix << 10 >>> 0;
        q1 = B.JSInt_methods.$tdiv(d2, fatRadix);
        d1 += d2 - q1 * fatRadix << 10 >>> 0;
        q2 = B.JSInt_methods.$tdiv(d1, fatRadix);
        d0 += d1 - q2 * fatRadix << 10 >>> 0;
        q3 = B.JSInt_methods.$tdiv(d0, fatRadix);
        chunk10 = B.JSString_methods.substring$1(B.JSInt_methods.toRadixString$1(fatRadix + (d0 - q3 * fatRadix), radix), 1);
        chunk3 = chunk2;
        chunk2 = chunk1;
        chunk1 = chunk10;
        d3 = q0;
        d4 = q;
        d2 = q1;
        d1 = q2;
        d0 = q3;
      }
      residue = (d2 << 20 >>> 0) + (d1 << 10 >>> 0) + d0;
      return sign + (residue === 0 ? "" : B.JSInt_methods.toRadixString$1(residue, radix)) + chunk1 + chunk2 + chunk3;
    },
    Int64__sub(a0, a1, a2, b0, b1, b2) {
      var diff0 = a0 - b0,
        diff1 = a1 - b1 - (B.JSInt_methods._shrOtherPositive$1(diff0, 22) & 1);
      return new A.Int64(diff0 & 4194303, diff1 & 4194303, a2 - b2 - (B.JSInt_methods._shrOtherPositive$1(diff1, 22) & 1) & 1048575);
    },
    Int64: function Int64(t0, t1, t2) {
      this._l = t0;
      this._m = t1;
      this._h = t2;
    },
    stronglyConnectedComponents(nodes, edges, $T) {
      var node, _null = null, _box_0 = {},
        result = A._setArrayType([], $T._eval$1("JSArray<List<0>>")),
        t1 = type$.int,
        lowLinks = A.HashMap_HashMap(_null, _null, _null, $T, t1),
        indexes = A.HashMap_HashMap(_null, _null, _null, $T, t1),
        onStack = A.HashSet_HashSet(_null, _null, $T),
        _i = _box_0.index = 0,
        strongConnect = new A.stronglyConnectedComponents_strongConnect(_box_0, indexes, lowLinks, A.ListQueue$($T), onStack, edges, A.strongly_connected_components___defaultEquals$closure(), result, $T);
      for (t1 = nodes.length; _i < nodes.length; nodes.length === t1 || (0, A.throwConcurrentModificationError)(nodes), ++_i) {
        node = nodes[_i];
        if (!indexes.containsKey$1(0, node))
          strongConnect.call$1(node);
      }
      return result;
    },
    _defaultEquals0(a, b) {
      return J.$eq$(a, b);
    },
    stronglyConnectedComponents_strongConnect: function stronglyConnectedComponents_strongConnect(t0, t1, t2, t3, t4, t5, t6, t7, t8) {
      var _ = this;
      _._box_0 = t0;
      _.indexes = t1;
      _.lowLinks = t2;
      _.lastVisited = t3;
      _.onStack = t4;
      _.edges = t5;
      _.nonNullEquals = t6;
      _.result = t7;
      _.T = t8;
    },
    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;
    },
    Logger_Logger($name) {
      return $.Logger__loggers.putIfAbsent$2(0, $name, new A.Logger_Logger_closure($name));
    },
    Logger: function Logger(t0, t1, t2) {
      var _ = this;
      _.name = t0;
      _.parent = t1;
      _._level = null;
      _._children = t2;
    },
    Logger_Logger_closure: function Logger_Logger_closure(t0) {
      this.name = t0;
    },
    Pool: function Pool(t0, t1, t2, t3, t4) {
      var _ = this;
      _._requestedResources = t0;
      _._onReleaseCallbacks = t1;
      _._onReleaseCompleters = t2;
      _._maxAllocatedResources = t3;
      _._allocatedResources = 0;
      _._timer = null;
      _._closeMemo = t4;
    },
    Pool__runOnRelease_closure: function Pool__runOnRelease_closure(t0) {
      this.$this = t0;
    },
    Pool__runOnRelease_closure0: function Pool__runOnRelease_closure0(t0) {
      this.$this = t0;
    },
    PoolResource: function PoolResource(t0) {
      this._pool = t0;
      this._released = false;
    },
    SseClient$(serverUrl) {
      var _null = null,
        t1 = type$.String;
      t1 = new A.SseClient(A.StreamController_StreamController(_null, _null, false, t1), A.StreamController_StreamController(_null, _null, false, t1), A.Logger_Logger("SseClient"), new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_dynamic), type$._AsyncCompleter_dynamic));
      t1.SseClient$1(serverUrl);
      return t1;
    },
    SseClient: function SseClient(t0, t1, t2, t3) {
      var _ = this;
      _._incomingController = t0;
      _._outgoingController = t1;
      _._logger = t2;
      _._onConnected = t3;
      _._lastMessageId = -1;
      _.__SseClient__serverUrl = _.__SseClient__eventSource = $;
      _._errorTimer = null;
    },
    SseClient_closure: function SseClient_closure(t0) {
      this.$this = t0;
    },
    SseClient_closure0: function SseClient_closure0(t0) {
      this.$this = t0;
    },
    SseClient_closure1: function SseClient_closure1(t0) {
      this.$this = t0;
    },
    SseClient__closure: function SseClient__closure(t0, t1) {
      this.$this = t0;
      this.error = t1;
    },
    SseClient__onOutgoingMessage_closure: function SseClient__onOutgoingMessage_closure(t0, t1, t2) {
      this._box_0 = t0;
      this.$this = t1;
      this.message = t2;
    },
    generateUuidV4() {
      var t1 = new A.generateUuidV4__printDigits(),
        t2 = new A.generateUuidV4__bitsDigits(t1, new A.generateUuidV4__generateBits(B.C__JSRandom)),
        t3 = B.C__JSRandom.nextInt$1(4);
      return A.S(t2.call$2(16, 4)) + A.S(t2.call$2(16, 4)) + "-" + A.S(t2.call$2(16, 4)) + "-4" + A.S(t2.call$2(12, 3)) + "-" + A.S(t1.call$2(8 + t3, 1)) + A.S(t2.call$2(12, 3)) + "-" + A.S(t2.call$2(16, 4)) + A.S(t2.call$2(16, 4)) + A.S(t2.call$2(16, 4));
    },
    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;
    },
    GuaranteeChannel$(innerStream, innerSink, allowSinkErrors, $T) {
      var t2, t1 = {};
      t1.innerStream = innerStream;
      t2 = new A.GuaranteeChannel($T._eval$1("GuaranteeChannel<0>"));
      t2.GuaranteeChannel$3$allowSinkErrors(innerSink, allowSinkErrors, t1, $T);
      return t2;
    },
    GuaranteeChannel: function GuaranteeChannel(t0) {
      var _ = this;
      _.__GuaranteeChannel__streamController = _.__GuaranteeChannel__sink = $;
      _._guarantee_channel$_subscription = null;
      _._disconnected = false;
      _.$ti = t0;
    },
    GuaranteeChannel_closure: function GuaranteeChannel_closure(t0, t1, t2) {
      this._box_0 = t0;
      this.$this = t1;
      this.T = t2;
    },
    GuaranteeChannel__closure: function GuaranteeChannel__closure(t0) {
      this.$this = t0;
    },
    _GuaranteeSink: function _GuaranteeSink(t0, t1, t2, t3, t4) {
      var _ = this;
      _._inner = t0;
      _._guarantee_channel$_channel = t1;
      _._doneCompleter = t2;
      _._closed = _._disconnected = false;
      _._addStreamCompleter = _._addStreamSubscription = null;
      _._allowErrors = t3;
      _.$ti = t4;
    },
    _GuaranteeSink__addError_closure: function _GuaranteeSink__addError_closure() {
    },
    StreamChannelController: function StreamChannelController(t0) {
      this.__StreamChannelController__foreign = this.__StreamChannelController__local = $;
      this.$ti = t0;
    },
    StreamChannelMixin: function StreamChannelMixin() {
    },
    Uuid: function Uuid() {
    },
    HtmlWebSocketChannel$connect(url, protocols) {
      var t2, t3, localToForeignController, foreignToLocalController, t4, t5, t6, _null = null,
        t1 = A.WebSocket_WebSocket(url.toString$0(0), protocols);
      B.WebSocket_methods.set$binaryType(t1, "arraybuffer");
      t2 = new A.StreamChannelController(type$.StreamChannelController_dynamic);
      t3 = type$.dynamic;
      localToForeignController = A.StreamController_StreamController(_null, _null, true, t3);
      foreignToLocalController = A.StreamController_StreamController(_null, _null, true, t3);
      t4 = A._instanceType(foreignToLocalController);
      t5 = A._instanceType(localToForeignController);
      t6 = A.GuaranteeChannel$(new A._ControllerStream(foreignToLocalController, t4._eval$1("_ControllerStream<1>")), new A._StreamSinkWrapper(localToForeignController, t5._eval$1("_StreamSinkWrapper<1>")), true, t3);
      A._lateWriteOnceCheck($, "_local");
      t2.set$__StreamChannelController__local(t6);
      t3 = A.GuaranteeChannel$(new A._ControllerStream(localToForeignController, t5._eval$1("_ControllerStream<1>")), new A._StreamSinkWrapper(foreignToLocalController, t4._eval$1("_StreamSinkWrapper<1>")), false, t3);
      A._lateWriteOnceCheck(t2.__StreamChannelController__foreign, "_foreign");
      t2.set$__StreamChannelController__foreign(t3);
      t2 = new A.HtmlWebSocketChannel(t1, t2);
      t2.HtmlWebSocketChannel$1(t1);
      return t2;
    },
    HtmlWebSocketChannel: function HtmlWebSocketChannel(t0, t1) {
      var _ = this;
      _._webSocket = t0;
      _._localCloseReason = _._localCloseCode = null;
      _._html$_controller = t1;
      _.__HtmlWebSocketChannel_sink = $;
    },
    HtmlWebSocketChannel_closure: function HtmlWebSocketChannel_closure(t0) {
      this.$this = t0;
    },
    HtmlWebSocketChannel_closure0: function HtmlWebSocketChannel_closure0(t0) {
      this.$this = t0;
    },
    HtmlWebSocketChannel_closure1: function HtmlWebSocketChannel_closure1(t0) {
      this.$this = t0;
    },
    HtmlWebSocketChannel_closure2: function HtmlWebSocketChannel_closure2(t0) {
      this.$this = t0;
    },
    HtmlWebSocketChannel__listen_closure: function HtmlWebSocketChannel__listen_closure(t0) {
      this.$this = t0;
    },
    _HtmlWebSocketSink: function _HtmlWebSocketSink(t0, t1) {
      this._html$_channel = t0;
      this._sink = t1;
    },
    WebSocketChannel: function WebSocketChannel(t0) {
      this._channel$_webSocket = t0;
    },
    WebSocketChannelException: function WebSocketChannelException(t0) {
      this.message = t0;
    },
    main() {
      return A.runZonedGuarded(new A.main_closure(), new A.main_closure0(), type$.legacy_Future_void);
    },
    main_closure: function main_closure() {
    },
    main__closure: function main__closure(t0) {
      this.manager = t0;
    },
    main__closure0: function main__closure0(t0) {
      this.client = t0;
    },
    main___closure1: function main___closure1(t0, t1) {
      this.kind = t0;
      this.eventData = t1;
    },
    main__closure1: function main__closure1(t0) {
      this.client = t0;
    },
    main___closure0: function main___closure0(t0) {
      this.eventData = t0;
    },
    main__closure2: function main__closure2(t0) {
      this.client = t0;
    },
    main___closure: function main___closure() {
    },
    main__closure3: function main__closure3(t0) {
      this.manager = t0;
    },
    main__closure4: function main__closure4() {
    },
    main__closure5: function main__closure5() {
    },
    main__closure6: function main__closure6() {
    },
    main_closure0: function main_closure0() {
    },
    LegacyRestarter: function LegacyRestarter() {
    },
    LegacyRestarter_restart_closure: function LegacyRestarter_restart_closure(t0, t1) {
      this._box_0 = t0;
      this.reloadCompleter = t1;
    },
    ReloadingManager: function ReloadingManager(t0, t1) {
      this._client = t0;
      this._restarter = t1;
    },
    toPromise(future, $T) {
      return new self.Promise(A.allowInterop(new A.toPromise_closure(future, $T), $T._eval$1("~(~(0*)*,~(@)*)*")), $T._eval$1("0*"));
    },
    Promise: function Promise() {
    },
    toPromise_closure: function toPromise_closure(t0, t1) {
      this.future = t0;
      this.T = t1;
    },
    HotReloadFailedException$(_s) {
      return new A.HotReloadFailedException(_s);
    },
    RequireRestarter_create() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.legacy_RequireRestarter),
        $async$returnValue, reloader, t1, t2, t3;
      var $async$RequireRestarter_create = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = type$.legacy_String;
              t2 = A.HashMap_HashMap(null, null, null, t1, type$.legacy_int);
              t3 = new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_legacy_bool), type$._AsyncCompleter_legacy_bool);
              t3.complete$0(0);
              reloader = new A.RequireRestarter(t2, t3);
              reloader.set$_dirtyModules(A.SplayTreeSet$(reloader.get$_moduleTopologicalCompare(), null, t1));
              $async$goto = 3;
              return A._asyncAwait(reloader._initialize$0(), $async$RequireRestarter_create);
            case 3:
              // returning from await.
              $async$returnValue = reloader;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$RequireRestarter_create, $async$completer);
    },
    RequireLoader: function RequireLoader() {
    },
    HotReloadFailedException: function HotReloadFailedException(t0) {
      this._s = t0;
    },
    JsError: function JsError() {
    },
    JsMap: function JsMap() {
    },
    RequireRestarter: function RequireRestarter(t0, t1) {
      this._moduleOrdering = t0;
      this._dirtyModules = null;
      this._running = t1;
    },
    RequireRestarter__reload_closure: function RequireRestarter__reload_closure(t0) {
      this.childModule = t0;
    },
    RequireRestarter__reloadModule_closure: function RequireRestarter__reloadModule_closure(t0) {
      this.completer = t0;
    },
    RequireRestarter__reloadModule_closure0: function RequireRestarter__reloadModule_closure0(t0, t1) {
      this.completer = t0;
      this.stackTrace = t1;
    },
    _findNonce() {
      var t2, elements, t3, nonceValue,
        t1 = window.document;
      A.checkTypeBound(type$.legacy_Element, type$.Element, "T", "querySelectorAll");
      t2 = type$._FrozenElementList_legacy_Element;
      elements = new A._FrozenElementList(t1.querySelectorAll("script"), t2);
      for (t1 = new A.ListIterator(elements, elements.get$length(elements), t2._eval$1("ListIterator<ListMixin.E>")), t2 = type$.legacy_HtmlElement; t1.moveNext$0();) {
        t3 = t2._as(t1.__internal$_current);
        nonceValue = t3.nonce;
        if (nonceValue == null)
          nonceValue = t3.getAttribute("nonce");
        if (nonceValue != null) {
          t3 = $.$get$_noncePattern()._nativeRegExp;
          t3 = t3.test(nonceValue);
        } else
          t3 = false;
        if (t3)
          return nonceValue;
      }
      return null;
    },
    runMain() {
      var t1,
        scriptElement = $.$get$_createScript().call$0();
      scriptElement.toString;
      t1 = J.getInterceptor$x(scriptElement);
      t1.setInnerHtml$1(scriptElement, "window.$dartRunMain();");
      document.body.appendChild(scriptElement);
      A.Future_Future$microtask(t1.get$remove(scriptElement), type$.void);
    },
    _createScript_closure: function _createScript_closure() {
    },
    _createScript__closure: function _createScript__closure() {
    },
    _createScript__closure0: function _createScript__closure0(t0) {
      this.nonce = t0;
    },
    isBrowserObject(o) {
      return type$.Blob._is(o) || type$.Event._is(o) || type$.KeyRange._is(o) || type$.ImageData._is(o) || type$.Node._is(o) || type$.Window._is(o) || type$.WorkerGlobalScope._is(o);
    },
    printString(string) {
      if (typeof dartPrint == "function") {
        dartPrint(string);
        return;
      }
      if (typeof console == "object" && typeof console.log != "undefined") {
        console.log(string);
        return;
      }
      if (typeof window == "object")
        return;
      if (typeof print == "function") {
        print(string);
        return;
      }
      throw "Unable to print message: " + String(string);
    },
    UuidUtil_mathRNG() {
      var i, t1,
        b = new Uint8Array(16),
        rand = $.$get$UuidUtil__random();
      for (i = 0; i < 16; ++i) {
        t1 = rand.nextInt$1(256);
        if (!(i < 16))
          return A.ioore(b, i);
        b[i] = t1;
      }
      return b;
    }
  },
  J = {
    makeDispatchRecord(interceptor, proto, extension, indexability) {
      return {i: interceptor, p: proto, e: extension, x: indexability};
    },
    getNativeInterceptor(object) {
      var proto, objectProto, $constructor, interceptor, t1,
        record = object[init.dispatchPropertyName];
      if (record == null)
        if ($.initNativeDispatchFlag == null) {
          A.initNativeDispatch();
          record = object[init.dispatchPropertyName];
        }
      if (record != null) {
        proto = record.p;
        if (false === proto)
          return record.i;
        if (true === proto)
          return object;
        objectProto = Object.getPrototypeOf(object);
        if (proto === objectProto)
          return record.i;
        if (record.e === objectProto)
          throw A.wrapException(A.UnimplementedError$("Return interceptor for " + A.S(proto(object, record))));
      }
      $constructor = object.constructor;
      if ($constructor == null)
        interceptor = null;
      else {
        t1 = $._JS_INTEROP_INTERCEPTOR_TAG;
        if (t1 == null)
          t1 = $._JS_INTEROP_INTERCEPTOR_TAG = init.getIsolateTag("_$dart_js");
        interceptor = $constructor[t1];
      }
      if (interceptor != null)
        return interceptor;
      interceptor = A.lookupAndCacheInterceptor(object);
      if (interceptor != null)
        return interceptor;
      if (typeof object == "function")
        return B.JavaScriptFunction_methods;
      proto = Object.getPrototypeOf(object);
      if (proto == null)
        return B.PlainJavaScriptObject_methods;
      if (proto === Object.prototype)
        return B.PlainJavaScriptObject_methods;
      if (typeof $constructor == "function") {
        t1 = $._JS_INTEROP_INTERCEPTOR_TAG;
        if (t1 == null)
          t1 = $._JS_INTEROP_INTERCEPTOR_TAG = init.getIsolateTag("_$dart_js");
        Object.defineProperty($constructor, t1, {value: B.UnknownJavaScriptObject_methods, enumerable: false, writable: true, configurable: true});
        return B.UnknownJavaScriptObject_methods;
      }
      return B.UnknownJavaScriptObject_methods;
    },
    JSArray_JSArray$fixed($length, $E) {
      if (!A._isInt($length))
        throw A.wrapException(A.ArgumentError$value($length, "length", "is not an integer"));
      if ($length < 0 || $length > 4294967295)
        throw A.wrapException(A.RangeError$range($length, 0, 4294967295, "length", null));
      return J.JSArray_JSArray$markFixed(new Array($length), $E);
    },
    JSArray_JSArray$growable($length, $E) {
      if (!A._isInt($length) || $length < 0)
        throw A.wrapException(A.ArgumentError$("Length must be a non-negative integer: " + A.S($length), null));
      return A._setArrayType(new Array($length), $E._eval$1("JSArray<0>"));
    },
    JSArray_JSArray$allocateGrowable($length, $E) {
      return A._setArrayType(new Array($length), $E._eval$1("JSArray<0>"));
    },
    JSArray_JSArray$markFixed(allocation, $E) {
      return J.JSArray_markFixedList(A._setArrayType(allocation, $E._eval$1("JSArray<0>")), $E);
    },
    JSArray_markFixedList(list, $T) {
      list.fixed$length = Array;
      return list;
    },
    JSArray_markUnmodifiableList(list) {
      list.fixed$length = Array;
      list.immutable$list = Array;
      return list;
    },
    JSArray__compareAny(a, b) {
      var t1 = type$.Comparable_dynamic;
      return J.compareTo$1$ns(t1._as(a), t1._as(b));
    },
    getInterceptor$(receiver) {
      if (typeof receiver == "number") {
        if (Math.floor(receiver) == receiver)
          return J.JSInt.prototype;
        return J.JSNumNotInt.prototype;
      }
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return J.JSNull.prototype;
      if (typeof receiver == "boolean")
        return J.JSBool.prototype;
      if (receiver.constructor == Array)
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        return receiver;
      }
      if (receiver instanceof A.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$ansx(receiver) {
      if (typeof receiver == "number")
        return J.JSNumber.prototype;
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (receiver.constructor == Array)
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        return receiver;
      }
      if (receiver instanceof A.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$asx(receiver) {
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (receiver.constructor == Array)
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        return receiver;
      }
      if (receiver instanceof A.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$ax(receiver) {
      if (receiver == null)
        return receiver;
      if (receiver.constructor == Array)
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        return receiver;
      }
      if (receiver instanceof A.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$n(receiver) {
      if (typeof receiver == "number")
        return J.JSNumber.prototype;
      if (receiver == null)
        return receiver;
      if (!(receiver instanceof A.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    getInterceptor$ns(receiver) {
      if (typeof receiver == "number")
        return J.JSNumber.prototype;
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (!(receiver instanceof A.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    getInterceptor$s(receiver) {
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (!(receiver instanceof A.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    getInterceptor$x(receiver) {
      if (receiver == null)
        return receiver;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        return receiver;
      }
      if (receiver instanceof A.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$z(receiver) {
      if (receiver == null)
        return receiver;
      if (!(receiver instanceof A.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    set$_innerHtml$x(receiver, value) {
      return J.getInterceptor$x(receiver).set$_innerHtml(receiver, value);
    },
    get$attributes$x(receiver) {
      return J.getInterceptor$x(receiver).get$attributes(receiver);
    },
    get$digestsPath$x(receiver) {
      return J.getInterceptor$x(receiver).get$digestsPath(receiver);
    },
    get$first$ax(receiver) {
      return J.getInterceptor$ax(receiver).get$first(receiver);
    },
    get$hashCode$(receiver) {
      return J.getInterceptor$(receiver).get$hashCode(receiver);
    },
    get$isEmpty$asx(receiver) {
      return J.getInterceptor$asx(receiver).get$isEmpty(receiver);
    },
    get$isNotEmpty$asx(receiver) {
      return J.getInterceptor$asx(receiver).get$isNotEmpty(receiver);
    },
    get$iterator$ax(receiver) {
      return J.getInterceptor$ax(receiver).get$iterator(receiver);
    },
    get$keys$x(receiver) {
      return J.getInterceptor$x(receiver).get$keys(receiver);
    },
    get$length$asx(receiver) {
      return J.getInterceptor$asx(receiver).get$length(receiver);
    },
    get$message$x(receiver) {
      return J.getInterceptor$x(receiver).get$message(receiver);
    },
    get$moduleParentsGraph$x(receiver) {
      return J.getInterceptor$x(receiver).get$moduleParentsGraph(receiver);
    },
    get$parent$z(receiver) {
      return J.getInterceptor$z(receiver).get$parent(receiver);
    },
    get$runtimeType$(receiver) {
      return J.getInterceptor$(receiver).get$runtimeType(receiver);
    },
    $add$ansx(receiver, a0) {
      if (typeof receiver == "number" && typeof a0 == "number")
        return receiver + a0;
      return J.getInterceptor$ansx(receiver).$add(receiver, a0);
    },
    $eq$(receiver, a0) {
      if (receiver == null)
        return a0 == null;
      if (typeof receiver != "object")
        return a0 != null && receiver === a0;
      return J.getInterceptor$(receiver).$eq(receiver, a0);
    },
    $get$1$x(receiver, a0) {
      return J.getInterceptor$x(receiver).$get$1(receiver, a0);
    },
    $index$asx(receiver, a0) {
      if (typeof a0 === "number")
        if (receiver.constructor == Array || typeof receiver == "string" || A.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(receiver, a0, a1) {
      return J.getInterceptor$ax(receiver).$indexSet(receiver, a0, a1);
    },
    $sub$n(receiver, a0) {
      if (typeof receiver == "number" && typeof a0 == "number")
        return receiver - a0;
      return J.getInterceptor$n(receiver).$sub(receiver, a0);
    },
    _clearChildren$0$x(receiver) {
      return J.getInterceptor$x(receiver)._clearChildren$0(receiver);
    },
    _codeUnitAt$1$s(receiver, a0) {
      return J.getInterceptor$s(receiver)._codeUnitAt$1(receiver, a0);
    },
    _initCustomEvent$4$x(receiver, a0, a1, a2, a3) {
      return J.getInterceptor$x(receiver)._initCustomEvent$4(receiver, a0, a1, a2, a3);
    },
    _removeEventListener$3$x(receiver, a0, a1, a2) {
      return J.getInterceptor$x(receiver)._removeEventListener$3(receiver, a0, a1, a2);
    },
    add$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).add$1(receiver, a0);
    },
    addEventListener$3$x(receiver, a0, a1, a2) {
      return J.getInterceptor$x(receiver).addEventListener$3(receiver, a0, a1, a2);
    },
    allMatches$1$s(receiver, a0) {
      return J.getInterceptor$s(receiver).allMatches$1(receiver, a0);
    },
    cast$1$0$ax(receiver, $T1) {
      return J.getInterceptor$ax(receiver).cast$1$0(receiver, $T1);
    },
    cast$2$0$ax(receiver, $T1, $T2) {
      return J.getInterceptor$ax(receiver).cast$2$0(receiver, $T1, $T2);
    },
    codeUnitAt$1$s(receiver, a0) {
      return J.getInterceptor$s(receiver).codeUnitAt$1(receiver, a0);
    },
    compareTo$1$ns(receiver, a0) {
      return J.getInterceptor$ns(receiver).compareTo$1(receiver, a0);
    },
    complete$1$z(receiver, a0) {
      return J.getInterceptor$z(receiver).complete$1(receiver, a0);
    },
    contains$1$asx(receiver, a0) {
      return J.getInterceptor$asx(receiver).contains$1(receiver, a0);
    },
    containsKey$1$x(receiver, a0) {
      return J.getInterceptor$x(receiver).containsKey$1(receiver, a0);
    },
    elementAt$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).elementAt$1(receiver, a0);
    },
    forEach$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).forEach$1(receiver, a0);
    },
    forceLoadModule$3$x(receiver, a0, a1, a2) {
      return J.getInterceptor$x(receiver).forceLoadModule$3(receiver, a0, a1, a2);
    },
    getRange$2$ax(receiver, a0, a1) {
      return J.getInterceptor$ax(receiver).getRange$2(receiver, a0, a1);
    },
    indexOf$1$s(receiver, a0) {
      return J.getInterceptor$s(receiver).indexOf$1(receiver, a0);
    },
    keys$0$x(receiver) {
      return J.getInterceptor$x(receiver).keys$0(receiver);
    },
    map$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).map$1(receiver, a0);
    },
    map$1$1$ax(receiver, a0, $T1) {
      return J.getInterceptor$ax(receiver).map$1$1(receiver, a0, $T1);
    },
    map$2$1$ax(receiver, a0, $T1, $T2) {
      return J.getInterceptor$ax(receiver).map$2$1(receiver, a0, $T1, $T2);
    },
    matchAsPrefix$2$s(receiver, a0, a1) {
      return J.getInterceptor$s(receiver).matchAsPrefix$2(receiver, a0, a1);
    },
    noSuchMethod$1$(receiver, a0) {
      return J.getInterceptor$(receiver).noSuchMethod$1(receiver, a0);
    },
    remove$0$x(receiver) {
      return J.getInterceptor$x(receiver).remove$0(receiver);
    },
    remove$1$x(receiver, a0) {
      return J.getInterceptor$x(receiver).remove$1(receiver, a0);
    },
    skip$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).skip$1(receiver, a0);
    },
    sort$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).sort$1(receiver, a0);
    },
    sublist$2$ax(receiver, a0, a1) {
      return J.getInterceptor$ax(receiver).sublist$2(receiver, a0, a1);
    },
    then$1$1$x(receiver, a0, $T1) {
      return J.getInterceptor$x(receiver).then$1$1(receiver, a0, $T1);
    },
    then$2$x(receiver, a0, a1) {
      return J.getInterceptor$x(receiver).then$2(receiver, a0, a1);
    },
    toList$0$ax(receiver) {
      return J.getInterceptor$ax(receiver).toList$0(receiver);
    },
    toList$1$growable$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).toList$1$growable(receiver, a0);
    },
    toLowerCase$0$s(receiver) {
      return J.getInterceptor$s(receiver).toLowerCase$0(receiver);
    },
    toString$0$(receiver) {
      return J.getInterceptor$(receiver).toString$0(receiver);
    },
    Interceptor: function Interceptor() {
    },
    JSBool: function JSBool() {
    },
    JSNull: function JSNull() {
    },
    JavaScriptObject: function JavaScriptObject() {
    },
    PlainJavaScriptObject: function PlainJavaScriptObject() {
    },
    UnknownJavaScriptObject: function UnknownJavaScriptObject() {
    },
    JavaScriptFunction: function JavaScriptFunction() {
    },
    JSArray: function JSArray(t0) {
      this.$ti = t0;
    },
    JSUnmodifiableArray: function JSUnmodifiableArray(t0) {
      this.$ti = t0;
    },
    ArrayIterator: function ArrayIterator(t0, t1, t2) {
      var _ = this;
      _._iterable = t0;
      _.__interceptors$_length = t1;
      _._index = 0;
      _.__interceptors$_current = null;
      _.$ti = t2;
    },
    JSNumber: function JSNumber() {
    },
    JSInt: function JSInt() {
    },
    JSNumNotInt: function JSNumNotInt() {
    },
    JSString: function JSString() {
    }
  },
  B = {};
  var holders = [A, J, B];
  hunkHelpers.setFunctionNamesIfNecessary(holders);
  var $ = {};
  A.JS_CONST.prototype = {};
  J.Interceptor.prototype = {
    $eq(receiver, other) {
      return receiver === other;
    },
    get$hashCode(receiver) {
      return A.Primitives_objectHashCode(receiver);
    },
    toString$0(receiver) {
      return "Instance of '" + A.S(A.Primitives_objectTypeName(receiver)) + "'";
    },
    noSuchMethod$1(receiver, invocation) {
      type$.Invocation._as(invocation);
      throw A.wrapException(A.NoSuchMethodError$(receiver, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments()));
    },
    get$runtimeType(receiver) {
      return A.getRuntimeType(receiver);
    }
  };
  J.JSBool.prototype = {
    toString$0(receiver) {
      return String(receiver);
    },
    get$hashCode(receiver) {
      return receiver ? 519018 : 218159;
    },
    get$runtimeType(receiver) {
      return B.Type_bool_lhE;
    },
    $isbool: 1
  };
  J.JSNull.prototype = {
    $eq(receiver, other) {
      return null == other;
    },
    toString$0(receiver) {
      return "null";
    },
    get$hashCode(receiver) {
      return 0;
    },
    get$runtimeType(receiver) {
      return B.Type_Null_Yyn;
    },
    noSuchMethod$1(receiver, invocation) {
      return this.super$Interceptor$noSuchMethod(receiver, type$.Invocation._as(invocation));
    },
    $isNull: 1
  };
  J.JavaScriptObject.prototype = {
    get$hashCode(receiver) {
      return 0;
    },
    get$runtimeType(receiver) {
      return B.Type_JSObject_8k0;
    },
    toString$0(receiver) {
      return String(receiver);
    },
    $isJSObject: 1,
    $isPromise: 1,
    $isJsError: 1,
    then$1$1(receiver, p0) {
      return receiver.then(p0);
    },
    then$2(receiver, p0, p1) {
      return receiver.then(p0, p1);
    },
    get$digestsPath(obj) {
      return obj.digestsPath;
    },
    get$moduleParentsGraph(obj) {
      return obj.moduleParentsGraph;
    },
    forceLoadModule$3(receiver, p0, p1, p2) {
      return receiver.forceLoadModule(p0, p1, p2);
    },
    get$message(obj) {
      return obj.message;
    },
    $get$1(receiver, p0) {
      return receiver.get(p0);
    },
    get$keys(obj) {
      return obj.keys;
    },
    keys$0(receiver) {
      return receiver.keys();
    }
  };
  J.PlainJavaScriptObject.prototype = {};
  J.UnknownJavaScriptObject.prototype = {};
  J.JavaScriptFunction.prototype = {
    toString$0(receiver) {
      var dartClosure = receiver[$.$get$DART_CLOSURE_PROPERTY_NAME()];
      if (dartClosure == null)
        return this.super$JavaScriptObject$toString(receiver);
      return "JavaScript function for " + A.S(J.toString$0$(dartClosure));
    },
    $isFunction: 1
  };
  J.JSArray.prototype = {
    cast$1$0(receiver, $R) {
      return new A.CastList(receiver, A._arrayInstanceType(receiver)._eval$1("@<1>")._bind$1($R)._eval$1("CastList<1,2>"));
    },
    add$1(receiver, value) {
      A._arrayInstanceType(receiver)._precomputed1._as(value);
      if (!!receiver.fixed$length)
        A.throwExpression(A.UnsupportedError$("add"));
      receiver.push(value);
    },
    addAll$1(receiver, collection) {
      var t1;
      A._arrayInstanceType(receiver)._eval$1("Iterable<1>")._as(collection);
      if (!!receiver.fixed$length)
        A.throwExpression(A.UnsupportedError$("addAll"));
      if (Array.isArray(collection)) {
        this._addAllFromArray$1(receiver, collection);
        return;
      }
      for (t1 = J.get$iterator$ax(collection); t1.moveNext$0();)
        receiver.push(t1.get$current(t1));
    },
    _addAllFromArray$1(receiver, array) {
      var len, i;
      type$.JSArray_dynamic._as(array);
      len = array.length;
      if (len === 0)
        return;
      if (receiver === array)
        throw A.wrapException(A.ConcurrentModificationError$(receiver));
      for (i = 0; i < len; ++i)
        receiver.push(array[i]);
    },
    forEach$1(receiver, f) {
      var end, i;
      A._arrayInstanceType(receiver)._eval$1("~(1)")._as(f);
      end = receiver.length;
      for (i = 0; i < end; ++i) {
        f.call$1(receiver[i]);
        if (receiver.length !== end)
          throw A.wrapException(A.ConcurrentModificationError$(receiver));
      }
    },
    map$1$1(receiver, f, $T) {
      var t1 = A._arrayInstanceType(receiver);
      return new A.MappedListIterable(receiver, t1._bind$1($T)._eval$1("1(2)")._as(f), t1._eval$1("@<1>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    join$1(receiver, separator) {
      var i,
        list = A.List_List$filled(receiver.length, "", false, type$.String);
      for (i = 0; i < receiver.length; ++i)
        this.$indexSet(list, i, A.S(receiver[i]));
      return list.join(separator);
    },
    skip$1(receiver, n) {
      return A.SubListIterable$(receiver, n, null, A._arrayInstanceType(receiver)._precomputed1);
    },
    fold$1$2(receiver, initialValue, combine, $T) {
      var $length, value, i;
      $T._as(initialValue);
      A._arrayInstanceType(receiver)._bind$1($T)._eval$1("1(1,2)")._as(combine);
      $length = receiver.length;
      for (value = initialValue, i = 0; i < $length; ++i) {
        value = combine.call$2(value, receiver[i]);
        if (receiver.length !== $length)
          throw A.wrapException(A.ConcurrentModificationError$(receiver));
      }
      return value;
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      var t1 = receiver.length;
      if (start > t1)
        throw A.wrapException(A.RangeError$range(start, 0, t1, "start", null));
      if (start === t1)
        return A._setArrayType([], A._arrayInstanceType(receiver));
      return A._setArrayType(receiver.slice(start, t1), A._arrayInstanceType(receiver));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    getRange$2(receiver, start, end) {
      A.RangeError_checkValidRange(start, end, receiver.length);
      return A.SubListIterable$(receiver, start, end, A._arrayInstanceType(receiver)._precomputed1);
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.IterableElementError_noElement());
    },
    get$last(receiver) {
      var t1 = receiver.length;
      if (t1 > 0)
        return receiver[t1 - 1];
      throw A.wrapException(A.IterableElementError_noElement());
    },
    setRange$4(receiver, start, end, iterable, skipCount) {
      var $length, otherList, otherStart, t1, i;
      A._arrayInstanceType(receiver)._eval$1("Iterable<1>")._as(iterable);
      if (!!receiver.immutable$list)
        A.throwExpression(A.UnsupportedError$("setRange"));
      A.RangeError_checkValidRange(start, end, receiver.length);
      $length = end - start;
      if ($length === 0)
        return;
      A.RangeError_checkNotNegative(skipCount, "skipCount");
      if (type$.List_dynamic._is(iterable)) {
        otherList = iterable;
        otherStart = skipCount;
      } else {
        otherList = J.skip$1$ax(iterable, skipCount).toList$1$growable(0, false);
        otherStart = 0;
      }
      t1 = J.getInterceptor$asx(otherList);
      if (otherStart + $length > t1.get$length(otherList))
        throw A.wrapException(A.IterableElementError_tooFew());
      if (otherStart < start)
        for (i = $length - 1; i >= 0; --i)
          receiver[start + i] = t1.$index(otherList, otherStart + i);
      else
        for (i = 0; i < $length; ++i)
          receiver[start + i] = t1.$index(otherList, otherStart + i);
    },
    any$1(receiver, test) {
      var end, i;
      A._arrayInstanceType(receiver)._eval$1("bool(1)")._as(test);
      end = receiver.length;
      for (i = 0; i < end; ++i) {
        if (A.boolConversionCheck(test.call$1(receiver[i])))
          return true;
        if (receiver.length !== end)
          throw A.wrapException(A.ConcurrentModificationError$(receiver));
      }
      return false;
    },
    sort$1(receiver, compare) {
      var t2,
        t1 = A._arrayInstanceType(receiver);
      t1._eval$1("int(1,1)?")._as(compare);
      if (!!receiver.immutable$list)
        A.throwExpression(A.UnsupportedError$("sort"));
      t2 = compare == null ? J._interceptors_JSArray__compareAny$closure() : compare;
      A.Sort_sort(receiver, t2, t1._precomputed1);
    },
    sort$0($receiver) {
      return this.sort$1($receiver, null);
    },
    contains$1(receiver, other) {
      var i;
      for (i = 0; i < receiver.length; ++i)
        if (J.$eq$(receiver[i], other))
          return true;
      return false;
    },
    get$isEmpty(receiver) {
      return receiver.length === 0;
    },
    get$isNotEmpty(receiver) {
      return receiver.length !== 0;
    },
    toString$0(receiver) {
      return A.IterableBase_iterableToFullString(receiver, "[", "]");
    },
    toList$1$growable(receiver, growable) {
      var t1 = A._setArrayType(receiver.slice(0), A._arrayInstanceType(receiver));
      return t1;
    },
    toList$0($receiver) {
      return this.toList$1$growable($receiver, true);
    },
    get$iterator(receiver) {
      return new J.ArrayIterator(receiver, receiver.length, A._arrayInstanceType(receiver)._eval$1("ArrayIterator<1>"));
    },
    get$hashCode(receiver) {
      return A.Primitives_objectHashCode(receiver);
    },
    get$length(receiver) {
      return receiver.length;
    },
    set$length(receiver, newLength) {
      if (!!receiver.fixed$length)
        A.throwExpression(A.UnsupportedError$("set length"));
      if (newLength < 0)
        throw A.wrapException(A.RangeError$range(newLength, 0, null, "newLength", null));
      receiver.length = newLength;
    },
    $index(receiver, index) {
      if (!A._isInt(index))
        throw A.wrapException(A.diagnoseIndexError(receiver, index));
      if (!(index >= 0 && index < receiver.length))
        throw A.wrapException(A.diagnoseIndexError(receiver, index));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      A._arrayInstanceType(receiver)._precomputed1._as(value);
      if (!!receiver.immutable$list)
        A.throwExpression(A.UnsupportedError$("indexed set"));
      if (!A._isInt(index))
        throw A.wrapException(A.diagnoseIndexError(receiver, index));
      if (!(index >= 0 && index < receiver.length))
        throw A.wrapException(A.diagnoseIndexError(receiver, index));
      receiver[index] = value;
    },
    $add(receiver, other) {
      var t1 = A._arrayInstanceType(receiver);
      t1._eval$1("List<1>")._as(other);
      t1 = A.List_List$of(receiver, true, t1._precomputed1);
      this.addAll$1(t1, other);
      return t1;
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  J.JSUnmodifiableArray.prototype = {};
  J.ArrayIterator.prototype = {
    get$current(_) {
      return this.__interceptors$_current;
    },
    moveNext$0() {
      var t2, _this = this,
        t1 = _this._iterable,
        $length = t1.length;
      if (_this.__interceptors$_length !== $length)
        throw A.wrapException(A.throwConcurrentModificationError(t1));
      t2 = _this._index;
      if (t2 >= $length) {
        _this.set$__interceptors$_current(null);
        return false;
      }
      _this.set$__interceptors$_current(t1[t2]);
      ++_this._index;
      return true;
    },
    set$__interceptors$_current(_current) {
      this.__interceptors$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  J.JSNumber.prototype = {
    compareTo$1(receiver, b) {
      var bIsNegative;
      A._asNumS(b);
      if (typeof b != "number")
        throw A.wrapException(A.argumentErrorValue(b));
      if (receiver < b)
        return -1;
      else if (receiver > b)
        return 1;
      else if (receiver === b) {
        if (receiver === 0) {
          bIsNegative = this.get$isNegative(b);
          if (this.get$isNegative(receiver) === bIsNegative)
            return 0;
          if (this.get$isNegative(receiver))
            return -1;
          return 1;
        }
        return 0;
      } else if (isNaN(receiver)) {
        if (isNaN(b))
          return 0;
        return 1;
      } else
        return -1;
    },
    get$isNegative(receiver) {
      return receiver === 0 ? 1 / receiver < 0 : receiver < 0;
    },
    ceil$0(receiver) {
      var truncated, d;
      if (receiver >= 0) {
        if (receiver <= 2147483647) {
          truncated = receiver | 0;
          return receiver === truncated ? truncated : truncated + 1;
        }
      } else if (receiver >= -2147483648)
        return receiver | 0;
      d = Math.ceil(receiver);
      if (isFinite(d))
        return d;
      throw A.wrapException(A.UnsupportedError$("" + receiver + ".ceil()"));
    },
    floor$0(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 A.wrapException(A.UnsupportedError$("" + receiver + ".floor()"));
    },
    round$0(receiver) {
      if (receiver > 0) {
        if (receiver !== 1 / 0)
          return Math.round(receiver);
      } else if (receiver > -1 / 0)
        return 0 - Math.round(0 - receiver);
      throw A.wrapException(A.UnsupportedError$("" + receiver + ".round()"));
    },
    toRadixString$1(receiver, radix) {
      var result, match, t1, exponent;
      if (radix < 2 || radix > 36)
        throw A.wrapException(A.RangeError$range(radix, 2, 36, "radix", null));
      result = receiver.toString(radix);
      if (B.JSString_methods.codeUnitAt$1(result, result.length - 1) !== 41)
        return result;
      match = /^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(result);
      if (match == null)
        A.throwExpression(A.UnsupportedError$("Unexpected toString result: " + result));
      t1 = match.length;
      if (1 >= t1)
        return A.ioore(match, 1);
      result = match[1];
      if (3 >= t1)
        return A.ioore(match, 3);
      exponent = +match[3];
      t1 = match[2];
      if (t1 != null) {
        result += t1;
        exponent -= t1.length;
      }
      return result + B.JSString_methods.$mul("0", exponent);
    },
    toString$0(receiver) {
      if (receiver === 0 && 1 / receiver < 0)
        return "-0.0";
      else
        return "" + receiver;
    },
    get$hashCode(receiver) {
      var absolute, floorLog2, factor, scaled,
        intValue = receiver | 0;
      if (receiver === 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 ((scaled * 9007199254740992 | 0) + (scaled * 3542243181176521 | 0)) * 599197 + floorLog2 * 1259 & 536870911;
    },
    $add(receiver, other) {
      if (typeof other != "number")
        throw A.wrapException(A.argumentErrorValue(other));
      return receiver + other;
    },
    $sub(receiver, other) {
      A._asNumS(other);
      if (typeof other != "number")
        throw A.wrapException(A.argumentErrorValue(other));
      return receiver - other;
    },
    $mod(receiver, other) {
      var result = receiver % other;
      if (result === 0)
        return 0;
      if (result > 0)
        return result;
      return result + other;
    },
    $tdiv(receiver, other) {
      if ((receiver | 0) === receiver)
        if (other >= 1 || other < -1)
          return receiver / other | 0;
      return this._tdivSlow$1(receiver, other);
    },
    _tdivFast$1(receiver, other) {
      return (receiver | 0) === receiver ? receiver / other | 0 : this._tdivSlow$1(receiver, other);
    },
    _tdivSlow$1(receiver, other) {
      var quotient = receiver / other;
      if (quotient >= -2147483648 && quotient <= 2147483647)
        return quotient | 0;
      if (quotient > 0) {
        if (quotient !== 1 / 0)
          return Math.floor(quotient);
      } else if (quotient > -1 / 0)
        return Math.ceil(quotient);
      throw A.wrapException(A.UnsupportedError$("Result of truncating division is " + A.S(quotient) + ": " + A.S(receiver) + " ~/ " + other));
    },
    $shl(receiver, other) {
      if (other < 0)
        throw A.wrapException(A.argumentErrorValue(other));
      return other > 31 ? 0 : receiver << other >>> 0;
    },
    _shlPositive$1(receiver, other) {
      return other > 31 ? 0 : receiver << other >>> 0;
    },
    _shrOtherPositive$1(receiver, other) {
      var t1;
      if (receiver > 0)
        t1 = this._shrBothPositive$1(receiver, other);
      else {
        t1 = other > 31 ? 31 : other;
        t1 = receiver >> t1 >>> 0;
      }
      return t1;
    },
    _shrReceiverPositive$1(receiver, other) {
      if (0 > other)
        throw A.wrapException(A.argumentErrorValue(other));
      return this._shrBothPositive$1(receiver, other);
    },
    _shrBothPositive$1(receiver, other) {
      return other > 31 ? 0 : receiver >>> other;
    },
    get$runtimeType(receiver) {
      return B.Type_num_cv7;
    },
    $isComparable: 1,
    $isdouble: 1,
    $isnum: 1
  };
  J.JSInt.prototype = {
    get$bitLength(receiver) {
      var wordBits, i,
        t1 = receiver < 0 ? -receiver - 1 : receiver,
        nonneg = t1;
      for (wordBits = 32; nonneg >= 4294967296;) {
        nonneg = this._tdivFast$1(nonneg, 4294967296);
        wordBits += 32;
      }
      i = nonneg | nonneg >> 1;
      i |= i >> 2;
      i |= i >> 4;
      i |= i >> 8;
      i = (i | i >> 16) >>> 0;
      i = (i >>> 0) - (i >>> 1 & 1431655765);
      i = (i & 858993459) + (i >>> 2 & 858993459);
      i = i + (i >>> 4) & 252645135;
      i += i >>> 8;
      return wordBits - (32 - (i + (i >>> 16) & 63));
    },
    get$runtimeType(receiver) {
      return B.Type_int_tHn;
    },
    $isint: 1
  };
  J.JSNumNotInt.prototype = {
    get$runtimeType(receiver) {
      return B.Type_double_K1J;
    }
  };
  J.JSString.prototype = {
    codeUnitAt$1(receiver, index) {
      if (index < 0)
        throw A.wrapException(A.diagnoseIndexError(receiver, index));
      if (index >= receiver.length)
        A.throwExpression(A.diagnoseIndexError(receiver, index));
      return receiver.charCodeAt(index);
    },
    _codeUnitAt$1(receiver, index) {
      if (index >= receiver.length)
        throw A.wrapException(A.diagnoseIndexError(receiver, index));
      return receiver.charCodeAt(index);
    },
    allMatches$2(receiver, string, start) {
      var t1;
      if (typeof string != "string")
        A.throwExpression(A.argumentErrorValue(string));
      t1 = string.length;
      if (start > t1)
        throw A.wrapException(A.RangeError$range(start, 0, t1, null, null));
      return new A._StringAllMatchesIterable(string, receiver, start);
    },
    allMatches$1($receiver, string) {
      return this.allMatches$2($receiver, string, 0);
    },
    matchAsPrefix$2(receiver, string, start) {
      var t1, i, _null = null;
      if (start < 0 || start > string.length)
        throw A.wrapException(A.RangeError$range(start, 0, string.length, _null, _null));
      t1 = receiver.length;
      if (start + t1 > string.length)
        return _null;
      for (i = 0; i < t1; ++i)
        if (this.codeUnitAt$1(string, start + i) !== this._codeUnitAt$1(receiver, i))
          return _null;
      return new A.StringMatch(start, receiver);
    },
    $add(receiver, other) {
      A._asStringS(other);
      if (typeof other != "string")
        throw A.wrapException(A.ArgumentError$value(other, null, null));
      return receiver + other;
    },
    replaceRange$3(receiver, start, end, replacement) {
      var e = A.RangeError_checkValidRange(start, end, receiver.length);
      return A.stringReplaceRangeUnchecked(receiver, start, e, replacement);
    },
    startsWith$2(receiver, pattern, index) {
      var endIndex;
      if (index < 0 || index > receiver.length)
        throw A.wrapException(A.RangeError$range(index, 0, receiver.length, null, null));
      if (typeof pattern == "string") {
        endIndex = index + pattern.length;
        if (endIndex > receiver.length)
          return false;
        return pattern === receiver.substring(index, endIndex);
      }
      return J.matchAsPrefix$2$s(pattern, receiver, index) != null;
    },
    startsWith$1($receiver, pattern) {
      return this.startsWith$2($receiver, pattern, 0);
    },
    substring$2(receiver, start, end) {
      return receiver.substring(start, A.RangeError_checkValidRange(start, end, receiver.length));
    },
    substring$1($receiver, start) {
      return this.substring$2($receiver, start, null);
    },
    toLowerCase$0(receiver) {
      return receiver.toLowerCase();
    },
    $mul(receiver, times) {
      var s, result;
      if (0 >= times)
        return "";
      if (times === 1 || receiver.length === 0)
        return receiver;
      if (times !== times >>> 0)
        throw A.wrapException(B.C_OutOfMemoryError);
      for (s = receiver, result = ""; true;) {
        if ((times & 1) === 1)
          result = s + result;
        times = times >>> 1;
        if (times === 0)
          break;
        s += s;
      }
      return result;
    },
    padLeft$2(receiver, width, padding) {
      var delta = width - receiver.length;
      if (delta <= 0)
        return receiver;
      return this.$mul(padding, delta) + receiver;
    },
    indexOf$2(receiver, pattern, start) {
      var t1;
      if (start < 0 || start > receiver.length)
        throw A.wrapException(A.RangeError$range(start, 0, receiver.length, null, null));
      t1 = receiver.indexOf(pattern, start);
      return t1;
    },
    indexOf$1($receiver, pattern) {
      return this.indexOf$2($receiver, pattern, 0);
    },
    lastIndexOf$2(receiver, pattern, start) {
      var t1, t2;
      if (start == null)
        start = receiver.length;
      else if (start < 0 || start > receiver.length)
        throw A.wrapException(A.RangeError$range(start, 0, receiver.length, null, null));
      t1 = pattern.length;
      t2 = receiver.length;
      if (start + t1 > t2)
        start = t2 - t1;
      return receiver.lastIndexOf(pattern, start);
    },
    lastIndexOf$1($receiver, pattern) {
      return this.lastIndexOf$2($receiver, pattern, null);
    },
    contains$1(receiver, other) {
      if (other == null)
        A.throwExpression(A.argumentErrorValue(other));
      return A.stringContainsUnchecked(receiver, other, 0);
    },
    compareTo$1(receiver, other) {
      var t1;
      A._asStringS(other);
      if (typeof other != "string")
        throw A.wrapException(A.argumentErrorValue(other));
      if (receiver === other)
        t1 = 0;
      else
        t1 = receiver < other ? -1 : 1;
      return t1;
    },
    toString$0(receiver) {
      return receiver;
    },
    get$hashCode(receiver) {
      var t1, hash, i;
      for (t1 = receiver.length, hash = 0, i = 0; i < t1; ++i) {
        hash = hash + receiver.charCodeAt(i) & 536870911;
        hash = hash + ((hash & 524287) << 10) & 536870911;
        hash ^= hash >> 6;
      }
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    get$runtimeType(receiver) {
      return B.Type_String_k8F;
    },
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >= receiver.length)
        throw A.wrapException(A.diagnoseIndexError(receiver, index));
      return receiver[index];
    },
    $isComparable: 1,
    $isPattern: 1,
    $isString: 1
  };
  A._CastIterableBase.prototype = {
    get$iterator(_) {
      var t1 = A._instanceType(this);
      return new A.CastIterator(J.get$iterator$ax(this.get$__internal$_source()), t1._eval$1("@<1>")._bind$1(t1._rest[1])._eval$1("CastIterator<1,2>"));
    },
    get$length(_) {
      return J.get$length$asx(this.get$__internal$_source());
    },
    get$isEmpty(_) {
      return J.get$isEmpty$asx(this.get$__internal$_source());
    },
    get$isNotEmpty(_) {
      return J.get$isNotEmpty$asx(this.get$__internal$_source());
    },
    skip$1(_, count) {
      var t1 = A._instanceType(this);
      return A.CastIterable_CastIterable(J.skip$1$ax(this.get$__internal$_source(), count), t1._precomputed1, t1._rest[1]);
    },
    elementAt$1(_, index) {
      return A._instanceType(this)._rest[1]._as(J.elementAt$1$ax(this.get$__internal$_source(), index));
    },
    get$first(_) {
      return A._instanceType(this)._rest[1]._as(J.get$first$ax(this.get$__internal$_source()));
    },
    contains$1(_, other) {
      return J.contains$1$asx(this.get$__internal$_source(), other);
    },
    toString$0(_) {
      return J.toString$0$(this.get$__internal$_source());
    }
  };
  A.CastIterator.prototype = {
    moveNext$0() {
      return this.__internal$_source.moveNext$0();
    },
    get$current(_) {
      var t1 = this.__internal$_source;
      return this.$ti._rest[1]._as(t1.get$current(t1));
    },
    $isIterator: 1
  };
  A.CastIterable.prototype = {
    cast$1$0(_, $R) {
      return A.CastIterable_CastIterable(this.__internal$_source, A._instanceType(this)._precomputed1, $R);
    },
    get$__internal$_source() {
      return this.__internal$_source;
    }
  };
  A._EfficientLengthCastIterable.prototype = {$isEfficientLengthIterable: 1};
  A._CastListBase.prototype = {
    $index(_, index) {
      return this.$ti._rest[1]._as(J.$index$asx(this.__internal$_source, index));
    },
    $indexSet(_, index, value) {
      var t1 = this.$ti;
      J.$indexSet$ax(this.__internal$_source, A._asIntS(index), t1._precomputed1._as(t1._rest[1]._as(value)));
    },
    sort$1(_, compare) {
      var t1;
      this.$ti._eval$1("int(2,2)?")._as(compare);
      t1 = compare == null ? null : new A._CastListBase_sort_closure(this, compare);
      J.sort$1$ax(this.__internal$_source, t1);
    },
    getRange$2(_, start, end) {
      var t1 = this.$ti;
      return A.CastIterable_CastIterable(J.getRange$2$ax(this.__internal$_source, start, end), t1._precomputed1, t1._rest[1]);
    },
    $isEfficientLengthIterable: 1,
    $isList: 1
  };
  A._CastListBase_sort_closure.prototype = {
    call$2(v1, v2) {
      var t1 = this.$this.$ti,
        t2 = t1._precomputed1;
      t2._as(v1);
      t2._as(v2);
      t1 = t1._rest[1];
      return this.compare.call$2(t1._as(v1), t1._as(v2));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1,1)");
    }
  };
  A.CastList.prototype = {
    cast$1$0(_, $R) {
      return new A.CastList(this.__internal$_source, this.$ti._eval$1("@<1>")._bind$1($R)._eval$1("CastList<1,2>"));
    },
    get$__internal$_source() {
      return this.__internal$_source;
    }
  };
  A.CastMap.prototype = {
    cast$2$0(_, RK, RV) {
      var t1 = this.$ti;
      return new A.CastMap(this.__internal$_source, t1._eval$1("@<1>")._bind$1(t1._rest[1])._bind$1(RK)._bind$1(RV)._eval$1("CastMap<1,2,3,4>"));
    },
    containsKey$1(_, key) {
      return J.containsKey$1$x(this.__internal$_source, key);
    },
    $index(_, key) {
      return this.$ti._eval$1("4?")._as(J.$index$asx(this.__internal$_source, key));
    },
    $indexSet(_, key, value) {
      var t1 = this.$ti;
      t1._rest[2]._as(key);
      t1._rest[3]._as(value);
      J.$indexSet$ax(this.__internal$_source, t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    forEach$1(_, f) {
      J.forEach$1$ax(this.__internal$_source, new A.CastMap_forEach_closure(this, this.$ti._eval$1("~(3,4)")._as(f)));
    },
    get$keys(_) {
      var t1 = this.$ti;
      return A.CastIterable_CastIterable(J.get$keys$x(this.__internal$_source), t1._precomputed1, t1._rest[2]);
    },
    get$length(_) {
      return J.get$length$asx(this.__internal$_source);
    },
    get$isEmpty(_) {
      return J.get$isEmpty$asx(this.__internal$_source);
    }
  };
  A.CastMap_forEach_closure.prototype = {
    call$2(key, value) {
      var t1 = this.$this.$ti;
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      this.f.call$2(t1._rest[2]._as(key), t1._rest[3]._as(value));
    },
    $signature() {
      return this.$this.$ti._eval$1("~(1,2)");
    }
  };
  A.LateError.prototype = {
    toString$0(_) {
      var t1 = "LateInitializationError: " + this._message;
      return t1;
    }
  };
  A.ReachabilityError.prototype = {
    toString$0(_) {
      var t1 = "ReachabilityError: " + this._message;
      return t1;
    }
  };
  A.nullFuture_closure.prototype = {
    call$0() {
      return A.Future_Future$value(null, type$.Null);
    },
    $signature: 24
  };
  A.SentinelValue.prototype = {};
  A.NotNullableError.prototype = {
    toString$0(_) {
      return "Null is not a valid value for '" + this._name + "' of type '" + A.createRuntimeType(this.$ti._precomputed1).toString$0(0) + "'";
    },
    $isTypeError: 1
  };
  A.EfficientLengthIterable.prototype = {};
  A.ListIterable.prototype = {
    get$iterator(_) {
      var _this = this;
      return new A.ListIterator(_this, _this.get$length(_this), A._instanceType(_this)._eval$1("ListIterator<ListIterable.E>"));
    },
    get$isEmpty(_) {
      return this.get$length(this) === 0;
    },
    get$first(_) {
      if (this.get$length(this) === 0)
        throw A.wrapException(A.IterableElementError_noElement());
      return this.elementAt$1(0, 0);
    },
    contains$1(_, element) {
      var i, _this = this,
        $length = _this.get$length(_this);
      for (i = 0; i < $length; ++i) {
        if (J.$eq$(_this.elementAt$1(0, i), element))
          return true;
        if ($length !== _this.get$length(_this))
          throw A.wrapException(A.ConcurrentModificationError$(_this));
      }
      return false;
    },
    join$1(_, separator) {
      var first, t1, i, _this = this,
        $length = _this.get$length(_this);
      if (separator.length !== 0) {
        if ($length === 0)
          return "";
        first = A.S(_this.elementAt$1(0, 0));
        if ($length !== _this.get$length(_this))
          throw A.wrapException(A.ConcurrentModificationError$(_this));
        for (t1 = first, i = 1; i < $length; ++i) {
          t1 = t1 + separator + A.S(_this.elementAt$1(0, i));
          if ($length !== _this.get$length(_this))
            throw A.wrapException(A.ConcurrentModificationError$(_this));
        }
        return t1.charCodeAt(0) == 0 ? t1 : t1;
      } else {
        for (i = 0, t1 = ""; i < $length; ++i) {
          t1 += A.S(_this.elementAt$1(0, i));
          if ($length !== _this.get$length(_this))
            throw A.wrapException(A.ConcurrentModificationError$(_this));
        }
        return t1.charCodeAt(0) == 0 ? t1 : t1;
      }
    },
    join$0($receiver) {
      return this.join$1($receiver, "");
    },
    where$1(_, test) {
      return this.super$Iterable$where(0, A._instanceType(this)._eval$1("bool(ListIterable.E)")._as(test));
    },
    map$1$1(_, toElement, $T) {
      var t1 = A._instanceType(this);
      return new A.MappedListIterable(this, t1._bind$1($T)._eval$1("1(ListIterable.E)")._as(toElement), t1._eval$1("@<ListIterable.E>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1($receiver, toElement) {
      return this.map$1$1($receiver, toElement, type$.dynamic);
    },
    skip$1(_, count) {
      return A.SubListIterable$(this, count, null, A._instanceType(this)._eval$1("ListIterable.E"));
    },
    toList$1$growable(_, growable) {
      return A.List_List$of(this, true, A._instanceType(this)._eval$1("ListIterable.E"));
    },
    toList$0($receiver) {
      return this.toList$1$growable($receiver, true);
    }
  };
  A.SubListIterable.prototype = {
    get$_endIndex() {
      var $length = J.get$length$asx(this.__internal$_iterable),
        endOrLength = this._endOrLength;
      if (endOrLength == null || endOrLength > $length)
        return $length;
      return endOrLength;
    },
    get$_startIndex() {
      var $length = J.get$length$asx(this.__internal$_iterable),
        t1 = this.__internal$_start;
      if (t1 > $length)
        return $length;
      return t1;
    },
    get$length(_) {
      var endOrLength,
        $length = J.get$length$asx(this.__internal$_iterable),
        t1 = this.__internal$_start;
      if (t1 >= $length)
        return 0;
      endOrLength = this._endOrLength;
      if (endOrLength == null || endOrLength >= $length)
        return $length - t1;
      if (typeof endOrLength !== "number")
        return endOrLength.$sub();
      return endOrLength - t1;
    },
    elementAt$1(_, index) {
      var _this = this,
        realIndex = _this.get$_startIndex() + index;
      if (index < 0 || realIndex >= _this.get$_endIndex())
        throw A.wrapException(A.IndexError$(index, _this, "index", null, null));
      return J.elementAt$1$ax(_this.__internal$_iterable, realIndex);
    },
    skip$1(_, count) {
      var newStart, endOrLength, _this = this;
      A.RangeError_checkNotNegative(count, "count");
      newStart = _this.__internal$_start + count;
      endOrLength = _this._endOrLength;
      if (endOrLength != null && newStart >= endOrLength)
        return new A.EmptyIterable(_this.$ti._eval$1("EmptyIterable<1>"));
      return A.SubListIterable$(_this.__internal$_iterable, newStart, endOrLength, _this.$ti._precomputed1);
    },
    toList$1$growable(_, growable) {
      var $length, result, i, _this = this,
        start = _this.__internal$_start,
        t1 = _this.__internal$_iterable,
        t2 = J.getInterceptor$asx(t1),
        end = t2.get$length(t1),
        endOrLength = _this._endOrLength;
      if (endOrLength != null && endOrLength < end)
        end = endOrLength;
      if (typeof end !== "number")
        return end.$sub();
      $length = end - start;
      if ($length <= 0) {
        t1 = _this.$ti._precomputed1;
        return growable ? J.JSArray_JSArray$growable(0, t1) : J.JSArray_JSArray$fixed(0, t1);
      }
      result = A.List_List$filled($length, t2.elementAt$1(t1, start), growable, _this.$ti._precomputed1);
      for (i = 1; i < $length; ++i) {
        B.JSArray_methods.$indexSet(result, i, t2.elementAt$1(t1, start + i));
        if (t2.get$length(t1) < end)
          throw A.wrapException(A.ConcurrentModificationError$(_this));
      }
      return result;
    },
    toList$0($receiver) {
      return this.toList$1$growable($receiver, true);
    }
  };
  A.ListIterator.prototype = {
    get$current(_) {
      return this.__internal$_current;
    },
    moveNext$0() {
      var t3, _this = this,
        t1 = _this.__internal$_iterable,
        t2 = J.getInterceptor$asx(t1),
        $length = t2.get$length(t1);
      if (_this.__internal$_length !== $length)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      t3 = _this.__internal$_index;
      if (t3 >= $length) {
        _this.set$__internal$_current(null);
        return false;
      }
      _this.set$__internal$_current(t2.elementAt$1(t1, t3));
      ++_this.__internal$_index;
      return true;
    },
    set$__internal$_current(_current) {
      this.__internal$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A.MappedIterable.prototype = {
    get$iterator(_) {
      var t1 = A._instanceType(this);
      return new A.MappedIterator(J.get$iterator$ax(this.__internal$_iterable), this._f, t1._eval$1("@<1>")._bind$1(t1._rest[1])._eval$1("MappedIterator<1,2>"));
    },
    get$length(_) {
      return J.get$length$asx(this.__internal$_iterable);
    },
    get$isEmpty(_) {
      return J.get$isEmpty$asx(this.__internal$_iterable);
    },
    get$first(_) {
      return this._f.call$1(J.get$first$ax(this.__internal$_iterable));
    },
    elementAt$1(_, index) {
      return this._f.call$1(J.elementAt$1$ax(this.__internal$_iterable, index));
    }
  };
  A.EfficientLengthMappedIterable.prototype = {$isEfficientLengthIterable: 1};
  A.MappedIterator.prototype = {
    moveNext$0() {
      var _this = this,
        t1 = _this._iterator;
      if (t1.moveNext$0()) {
        _this.set$__internal$_current(_this._f.call$1(t1.get$current(t1)));
        return true;
      }
      _this.set$__internal$_current(null);
      return false;
    },
    get$current(_) {
      return this.__internal$_current;
    },
    set$__internal$_current(_current) {
      this.__internal$_current = this.$ti._eval$1("2?")._as(_current);
    }
  };
  A.MappedListIterable.prototype = {
    get$length(_) {
      return J.get$length$asx(this.__internal$_source);
    },
    elementAt$1(_, index) {
      return this._f.call$1(J.elementAt$1$ax(this.__internal$_source, index));
    }
  };
  A.WhereIterable.prototype = {
    get$iterator(_) {
      return new A.WhereIterator(J.get$iterator$ax(this.__internal$_iterable), this._f, this.$ti._eval$1("WhereIterator<1>"));
    },
    map$1$1(_, toElement, $T) {
      var t1 = this.$ti;
      return new A.MappedIterable(this, t1._bind$1($T)._eval$1("1(2)")._as(toElement), t1._eval$1("@<1>")._bind$1($T)._eval$1("MappedIterable<1,2>"));
    },
    map$1($receiver, toElement) {
      return this.map$1$1($receiver, toElement, type$.dynamic);
    }
  };
  A.WhereIterator.prototype = {
    moveNext$0() {
      var t1, t2;
      for (t1 = this._iterator, t2 = this._f; t1.moveNext$0();)
        if (A.boolConversionCheck(t2.call$1(t1.get$current(t1))))
          return true;
      return false;
    },
    get$current(_) {
      var t1 = this._iterator;
      return t1.get$current(t1);
    }
  };
  A.SkipIterable.prototype = {
    skip$1(_, count) {
      A.RangeError_checkNotNegative(count, "count");
      return new A.SkipIterable(this.__internal$_iterable, this._skipCount + count, A._instanceType(this)._eval$1("SkipIterable<1>"));
    },
    get$iterator(_) {
      return new A.SkipIterator(J.get$iterator$ax(this.__internal$_iterable), this._skipCount, A._instanceType(this)._eval$1("SkipIterator<1>"));
    }
  };
  A.EfficientLengthSkipIterable.prototype = {
    get$length(_) {
      var $length = J.get$length$asx(this.__internal$_iterable) - this._skipCount;
      if ($length >= 0)
        return $length;
      return 0;
    },
    skip$1(_, count) {
      A.RangeError_checkNotNegative(count, "count");
      return new A.EfficientLengthSkipIterable(this.__internal$_iterable, this._skipCount + count, this.$ti);
    },
    $isEfficientLengthIterable: 1
  };
  A.SkipIterator.prototype = {
    moveNext$0() {
      var t1, i;
      for (t1 = this._iterator, i = 0; i < this._skipCount; ++i)
        t1.moveNext$0();
      this._skipCount = 0;
      return t1.moveNext$0();
    },
    get$current(_) {
      var t1 = this._iterator;
      return t1.get$current(t1);
    }
  };
  A.EmptyIterable.prototype = {
    get$iterator(_) {
      return B.C_EmptyIterator;
    },
    get$isEmpty(_) {
      return true;
    },
    get$length(_) {
      return 0;
    },
    get$first(_) {
      throw A.wrapException(A.IterableElementError_noElement());
    },
    elementAt$1(_, index) {
      throw A.wrapException(A.RangeError$range(index, 0, 0, "index", null));
    },
    contains$1(_, element) {
      return false;
    },
    map$1$1(_, toElement, $T) {
      this.$ti._bind$1($T)._eval$1("1(2)")._as(toElement);
      return new A.EmptyIterable($T._eval$1("EmptyIterable<0>"));
    },
    map$1($receiver, toElement) {
      return this.map$1$1($receiver, toElement, type$.dynamic);
    },
    skip$1(_, count) {
      A.RangeError_checkNotNegative(count, "count");
      return this;
    },
    toList$1$growable(_, growable) {
      var t1 = J.JSArray_JSArray$growable(0, this.$ti._precomputed1);
      return t1;
    },
    toList$0($receiver) {
      return this.toList$1$growable($receiver, true);
    }
  };
  A.EmptyIterator.prototype = {
    moveNext$0() {
      return false;
    },
    get$current(_) {
      throw A.wrapException(A.IterableElementError_noElement());
    },
    $isIterator: 1
  };
  A.FixedLengthListMixin.prototype = {};
  A.UnmodifiableListMixin.prototype = {
    $indexSet(_, index, value) {
      A._asIntS(index);
      A._instanceType(this)._eval$1("UnmodifiableListMixin.E")._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot modify an unmodifiable list"));
    },
    sort$1(_, compare) {
      A._instanceType(this)._eval$1("int(UnmodifiableListMixin.E,UnmodifiableListMixin.E)?")._as(compare);
      throw A.wrapException(A.UnsupportedError$("Cannot modify an unmodifiable list"));
    }
  };
  A.UnmodifiableListBase.prototype = {};
  A.ReversedListIterable.prototype = {
    get$length(_) {
      return J.get$length$asx(this.__internal$_source);
    },
    elementAt$1(_, index) {
      var t1 = this.__internal$_source,
        t2 = J.getInterceptor$asx(t1);
      return t2.elementAt$1(t1, t2.get$length(t1) - 1 - index);
    }
  };
  A.Symbol.prototype = {
    get$hashCode(_) {
      var hash = this._hashCode;
      if (hash != null)
        return hash;
      hash = 664597 * J.get$hashCode$(this._name) & 536870911;
      this._hashCode = hash;
      return hash;
    },
    toString$0(_) {
      return 'Symbol("' + A.S(this._name) + '")';
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.Symbol && this._name == other._name;
    },
    $isSymbol0: 1
  };
  A.__CastListBase__CastIterableBase_ListMixin.prototype = {};
  A.ConstantMapView.prototype = {};
  A.ConstantMap.prototype = {
    cast$2$0(_, RK, RV) {
      var t1 = A._instanceType(this);
      return A.Map_castFrom(this, t1._precomputed1, t1._rest[1], RK, RV);
    },
    get$isEmpty(_) {
      return this.get$length(this) === 0;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this);
    },
    $indexSet(_, key, val) {
      var t1 = A._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(val);
      A.ConstantMap__throwUnmodifiable();
      A.ReachabilityError$(string$._null_);
    },
    map$2$1(_, transform, K2, V2) {
      var result = A.LinkedHashMap_LinkedHashMap$_empty(K2, V2);
      this.forEach$1(0, new A.ConstantMap_map_closure(this, A._instanceType(this)._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(3,4)")._as(transform), result));
      return result;
    },
    map$1($receiver, transform) {
      return this.map$2$1($receiver, transform, type$.dynamic, type$.dynamic);
    },
    $isMap: 1
  };
  A.ConstantMap_map_closure.prototype = {
    call$2(key, value) {
      var t1 = A._instanceType(this.$this),
        entry = this.transform.call$2(t1._precomputed1._as(key), t1._rest[1]._as(value));
      this.result.$indexSet(0, entry.get$key(entry), entry.get$value(entry));
    },
    $signature() {
      return A._instanceType(this.$this)._eval$1("~(1,2)");
    }
  };
  A.ConstantStringMap.prototype = {
    get$length(_) {
      return this.__js_helper$_length;
    },
    containsKey$1(_, key) {
      if (typeof key != "string")
        return false;
      if ("__proto__" === key)
        return false;
      return this._jsObject.hasOwnProperty(key);
    },
    $index(_, key) {
      if (!this.containsKey$1(0, key))
        return null;
      return this._jsObject[A._asStringS(key)];
    },
    forEach$1(_, f) {
      var keys, t2, t3, i, t4,
        t1 = this.$ti;
      t1._eval$1("~(1,2)")._as(f);
      keys = this.__js_helper$_keys;
      for (t2 = keys.length, t3 = this._jsObject, t1 = t1._rest[1], i = 0; i < t2; ++i) {
        t4 = A._asStringS(keys[i]);
        f.call$2(t4, t1._as(t3[t4]));
      }
    },
    get$keys(_) {
      return new A._ConstantMapKeyIterable(this, this.$ti._eval$1("_ConstantMapKeyIterable<1>"));
    }
  };
  A._ConstantMapKeyIterable.prototype = {
    get$iterator(_) {
      var t1 = this._map.__js_helper$_keys;
      return new J.ArrayIterator(t1, t1.length, A._arrayInstanceType(t1)._eval$1("ArrayIterator<1>"));
    },
    get$length(_) {
      return this._map.__js_helper$_keys.length;
    }
  };
  A.JSInvocationMirror.prototype = {
    get$memberName() {
      var t1 = this._memberName;
      return t1;
    },
    get$positionalArguments() {
      var t1, argumentCount, list, index, _this = this;
      if (_this.__js_helper$_kind === 1)
        return B.List_empty0;
      t1 = _this._arguments;
      argumentCount = t1.length - _this._namedArgumentNames.length - _this._typeArgumentCount;
      if (argumentCount === 0)
        return B.List_empty0;
      list = [];
      for (index = 0; index < argumentCount; ++index) {
        if (!(index < t1.length))
          return A.ioore(t1, index);
        list.push(t1[index]);
      }
      return J.JSArray_markUnmodifiableList(list);
    },
    get$namedArguments() {
      var t1, namedArgumentCount, t2, namedArgumentsStartIndex, map, i, t3, t4, _this = this;
      if (_this.__js_helper$_kind !== 0)
        return B.Map_empty0;
      t1 = _this._namedArgumentNames;
      namedArgumentCount = t1.length;
      t2 = _this._arguments;
      namedArgumentsStartIndex = t2.length - namedArgumentCount - _this._typeArgumentCount;
      if (namedArgumentCount === 0)
        return B.Map_empty0;
      map = new A.JsLinkedHashMap(type$.JsLinkedHashMap_Symbol_dynamic);
      for (i = 0; i < namedArgumentCount; ++i) {
        if (!(i < t1.length))
          return A.ioore(t1, i);
        t3 = t1[i];
        t4 = namedArgumentsStartIndex + i;
        if (!(t4 >= 0 && t4 < t2.length))
          return A.ioore(t2, t4);
        map.$indexSet(0, new A.Symbol(t3), t2[t4]);
      }
      return new A.ConstantMapView(map, type$.ConstantMapView_Symbol_dynamic);
    },
    $isInvocation: 1
  };
  A.Primitives_functionNoSuchMethod_closure.prototype = {
    call$2($name, argument) {
      var t1;
      A._asStringS($name);
      t1 = this._box_0;
      t1.names = t1.names + "$" + A.S($name);
      B.JSArray_methods.add$1(this.namedArgumentList, $name);
      B.JSArray_methods.add$1(this.$arguments, argument);
      ++t1.argumentCount;
    },
    $signature: 6
  };
  A.TypeErrorDecoder.prototype = {
    matchTypeError$1(message) {
      var result, t1, _this = this,
        match = new RegExp(_this._pattern).exec(message);
      if (match == null)
        return null;
      result = Object.create(null);
      t1 = _this._arguments;
      if (t1 !== -1)
        result.arguments = match[t1 + 1];
      t1 = _this._argumentsExpr;
      if (t1 !== -1)
        result.argumentsExpr = match[t1 + 1];
      t1 = _this._expr;
      if (t1 !== -1)
        result.expr = match[t1 + 1];
      t1 = _this._method;
      if (t1 !== -1)
        result.method = match[t1 + 1];
      t1 = _this._receiver;
      if (t1 !== -1)
        result.receiver = match[t1 + 1];
      return result;
    }
  };
  A.NullError.prototype = {
    toString$0(_) {
      var t1 = this._method;
      if (t1 == null)
        return "NoSuchMethodError: " + A.S(this.__js_helper$_message);
      return "NoSuchMethodError: method not found: '" + t1 + "' on null";
    }
  };
  A.JsNoSuchMethodError.prototype = {
    toString$0(_) {
      var t2, _this = this,
        _s38_ = "NoSuchMethodError: method not found: '",
        t1 = _this._method;
      if (t1 == null)
        return "NoSuchMethodError: " + A.S(_this.__js_helper$_message);
      t2 = _this._receiver;
      if (t2 == null)
        return _s38_ + t1 + "' (" + A.S(_this.__js_helper$_message) + ")";
      return _s38_ + t1 + "' on '" + t2 + "' (" + A.S(_this.__js_helper$_message) + ")";
    }
  };
  A.UnknownJsTypeError.prototype = {
    toString$0(_) {
      var t1 = this.__js_helper$_message;
      return t1.length === 0 ? "Error" : "Error: " + t1;
    }
  };
  A.NullThrownFromJavaScriptException.prototype = {
    toString$0(_) {
      return "Throw of null ('" + (this._irritant === null ? "null" : "undefined") + "' from JavaScript)";
    }
  };
  A.ExceptionAndStackTrace.prototype = {};
  A._StackTrace.prototype = {
    toString$0(_) {
      var trace,
        t1 = this._trace;
      if (t1 != null)
        return t1;
      t1 = this._exception;
      trace = t1 !== null && typeof t1 === "object" ? t1.stack : null;
      return this._trace = trace == null ? "" : trace;
    },
    $isStackTrace: 1
  };
  A.Closure.prototype = {
    toString$0(_) {
      var $constructor = this.constructor,
        $name = $constructor == null ? null : $constructor.name;
      return "Closure '" + A.unminifyOrTag($name == null ? "unknown" : $name) + "'";
    },
    $isFunction: 1,
    get$$call() {
      return this;
    },
    "call*": "call$1",
    $requiredArgCount: 1,
    $defaultValues: null
  };
  A.Closure0Args.prototype = {"call*": "call$0", $requiredArgCount: 0};
  A.Closure2Args.prototype = {"call*": "call$2", $requiredArgCount: 2};
  A.TearOffClosure.prototype = {};
  A.StaticClosure.prototype = {
    toString$0(_) {
      var $name = this.$static_name;
      if ($name == null)
        return "Closure of unknown static method";
      return "Closure '" + A.unminifyOrTag($name) + "'";
    }
  };
  A.BoundClosure.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (this === other)
        return true;
      if (!(other instanceof A.BoundClosure))
        return false;
      return this.$_target === other.$_target && this._receiver === other._receiver;
    },
    get$hashCode(_) {
      var receiverHashCode = A.objectHashCode(this._receiver),
        t1 = A.Primitives_objectHashCode(this.$_target);
      if (typeof receiverHashCode !== "number")
        return receiverHashCode.$xor();
      return (receiverHashCode ^ t1) >>> 0;
    },
    toString$0(_) {
      return "Closure '" + A.S(this.$_name) + "' of " + ("Instance of '" + A.S(A.Primitives_objectTypeName(this._receiver)) + "'");
    }
  };
  A.RuntimeError.prototype = {
    toString$0(_) {
      return "RuntimeError: " + this.message;
    }
  };
  A._AssertionError.prototype = {
    toString$0(_) {
      return "Assertion failed: " + A.Error_safeToString(this.message);
    }
  };
  A._Required.prototype = {};
  A.JsLinkedHashMap.prototype = {
    get$length(_) {
      return this.__js_helper$_length;
    },
    get$isEmpty(_) {
      return this.__js_helper$_length === 0;
    },
    get$isNotEmpty(_) {
      return !this.get$isEmpty(this);
    },
    get$keys(_) {
      return new A.LinkedHashMapKeyIterable(this, A._instanceType(this)._eval$1("LinkedHashMapKeyIterable<1>"));
    },
    containsKey$1(_, 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(key) {
      var _this = this,
        rest = _this.__js_helper$_rest;
      if (rest == null)
        return false;
      return _this.internalFindBucketIndex$2(_this._getTableBucket$2(rest, _this.internalComputeHashCode$1(key)), key) >= 0;
    },
    addAll$1(_, other) {
      A._instanceType(this)._eval$1("Map<1,2>")._as(other).forEach$1(0, new A.JsLinkedHashMap_addAll_closure(this));
    },
    $index(_, key) {
      var strings, cell, t1, nums, _this = this, _null = null;
      if (typeof key == "string") {
        strings = _this._strings;
        if (strings == null)
          return _null;
        cell = _this._getTableCell$2(strings, key);
        t1 = cell == null ? _null : cell.hashMapCellValue;
        return t1;
      } else if (typeof key == "number" && (key & 0x3ffffff) === key) {
        nums = _this._nums;
        if (nums == null)
          return _null;
        cell = _this._getTableCell$2(nums, key);
        t1 = cell == null ? _null : cell.hashMapCellValue;
        return t1;
      } else
        return _this.internalGet$1(key);
    },
    internalGet$1(key) {
      var bucket, index, _this = this,
        rest = _this.__js_helper$_rest;
      if (rest == null)
        return null;
      bucket = _this._getTableBucket$2(rest, _this.internalComputeHashCode$1(key));
      index = _this.internalFindBucketIndex$2(bucket, key);
      if (index < 0)
        return null;
      return bucket[index].hashMapCellValue;
    },
    $indexSet(_, key, value) {
      var strings, nums, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      if (typeof key == "string") {
        strings = _this._strings;
        _this._addHashTableEntry$3(strings == null ? _this._strings = _this._newHashTable$0() : strings, key, value);
      } else if (typeof key == "number" && (key & 0x3ffffff) === key) {
        nums = _this._nums;
        _this._addHashTableEntry$3(nums == null ? _this._nums = _this._newHashTable$0() : nums, key, value);
      } else
        _this.internalSet$2(key, value);
    },
    internalSet$2(key, value) {
      var rest, hash, bucket, index, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      rest = _this.__js_helper$_rest;
      if (rest == null)
        rest = _this.__js_helper$_rest = _this._newHashTable$0();
      hash = _this.internalComputeHashCode$1(key);
      bucket = _this._getTableBucket$2(rest, hash);
      if (bucket == null)
        _this._setTableEntry$3(rest, hash, [_this._newLinkedCell$2(key, value)]);
      else {
        index = _this.internalFindBucketIndex$2(bucket, key);
        if (index >= 0)
          bucket[index].hashMapCellValue = value;
        else
          bucket.push(_this._newLinkedCell$2(key, value));
      }
    },
    putIfAbsent$2(_, key, ifAbsent) {
      var value, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._eval$1("2()")._as(ifAbsent);
      if (_this.containsKey$1(0, key))
        return _this.$index(0, key);
      value = ifAbsent.call$0();
      _this.$indexSet(0, key, value);
      return value;
    },
    remove$1(_, key) {
      var _this = this;
      if (typeof key == "string")
        return _this._removeHashTableEntry$2(_this._strings, key);
      else if (typeof key == "number" && (key & 0x3ffffff) === key)
        return _this._removeHashTableEntry$2(_this._nums, key);
      else
        return _this.internalRemove$1(key);
    },
    internalRemove$1(key) {
      var hash, bucket, index, cell, _this = this,
        rest = _this.__js_helper$_rest;
      if (rest == null)
        return null;
      hash = _this.internalComputeHashCode$1(key);
      bucket = _this._getTableBucket$2(rest, hash);
      index = _this.internalFindBucketIndex$2(bucket, key);
      if (index < 0)
        return null;
      cell = bucket.splice(index, 1)[0];
      _this._unlinkCell$1(cell);
      if (bucket.length === 0)
        _this._deleteTableEntry$2(rest, hash);
      return cell.hashMapCellValue;
    },
    forEach$1(_, action) {
      var cell, modifications, _this = this;
      A._instanceType(_this)._eval$1("~(1,2)")._as(action);
      cell = _this._first;
      modifications = _this._modifications;
      for (; cell != null;) {
        action.call$2(cell.hashMapCellKey, cell.hashMapCellValue);
        if (modifications !== _this._modifications)
          throw A.wrapException(A.ConcurrentModificationError$(_this));
        cell = cell._next;
      }
    },
    _addHashTableEntry$3(table, key, value) {
      var cell, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      cell = _this._getTableCell$2(table, key);
      if (cell == null)
        _this._setTableEntry$3(table, key, _this._newLinkedCell$2(key, value));
      else
        cell.hashMapCellValue = value;
    },
    _removeHashTableEntry$2(table, key) {
      var cell;
      if (table == null)
        return null;
      cell = this._getTableCell$2(table, key);
      if (cell == null)
        return null;
      this._unlinkCell$1(cell);
      this._deleteTableEntry$2(table, key);
      return cell.hashMapCellValue;
    },
    _modified$0() {
      this._modifications = this._modifications + 1 & 67108863;
    },
    _newLinkedCell$2(key, value) {
      var _this = this,
        t1 = A._instanceType(_this),
        cell = new A.LinkedHashMapCell(t1._precomputed1._as(key), t1._rest[1]._as(value));
      if (_this._first == null)
        _this._first = _this._last = cell;
      else {
        t1 = _this._last;
        t1.toString;
        cell._previous = t1;
        _this._last = t1._next = cell;
      }
      ++_this.__js_helper$_length;
      _this._modified$0();
      return cell;
    },
    _unlinkCell$1(cell) {
      var _this = this,
        previous = cell._previous,
        next = cell._next;
      if (previous == null)
        _this._first = next;
      else
        previous._next = next;
      if (next == null)
        _this._last = previous;
      else
        next._previous = previous;
      --_this.__js_helper$_length;
      _this._modified$0();
    },
    internalComputeHashCode$1(key) {
      return J.get$hashCode$(key) & 0x3ffffff;
    },
    internalFindBucketIndex$2(bucket, key) {
      var $length, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; ++i)
        if (J.$eq$(bucket[i].hashMapCellKey, key))
          return i;
      return -1;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this);
    },
    _getTableCell$2(table, key) {
      return table[key];
    },
    _getTableBucket$2(table, key) {
      return table[key];
    },
    _setTableEntry$3(table, key, value) {
      table[key] = value;
    },
    _deleteTableEntry$2(table, key) {
      delete table[key];
    },
    _containsTableEntry$2(table, key) {
      return this._getTableCell$2(table, key) != null;
    },
    _newHashTable$0() {
      var _s20_ = "<non-identifier-key>",
        table = Object.create(null);
      this._setTableEntry$3(table, _s20_, table);
      this._deleteTableEntry$2(table, _s20_);
      return table;
    },
    $isLinkedHashMap: 1
  };
  A.JsLinkedHashMap_addAll_closure.prototype = {
    call$2(key, value) {
      var t1 = this.$this,
        t2 = A._instanceType(t1);
      t1.$indexSet(0, t2._precomputed1._as(key), t2._rest[1]._as(value));
    },
    $signature() {
      return A._instanceType(this.$this)._eval$1("~(1,2)");
    }
  };
  A.LinkedHashMapCell.prototype = {};
  A.LinkedHashMapKeyIterable.prototype = {
    get$length(_) {
      return this._map.__js_helper$_length;
    },
    get$isEmpty(_) {
      return this._map.__js_helper$_length === 0;
    },
    get$iterator(_) {
      var t1 = this._map,
        t2 = new A.LinkedHashMapKeyIterator(t1, t1._modifications, this.$ti._eval$1("LinkedHashMapKeyIterator<1>"));
      t2._cell = t1._first;
      return t2;
    },
    contains$1(_, element) {
      return this._map.containsKey$1(0, element);
    }
  };
  A.LinkedHashMapKeyIterator.prototype = {
    get$current(_) {
      return this.__js_helper$_current;
    },
    moveNext$0() {
      var cell, _this = this,
        t1 = _this._map;
      if (_this._modifications !== t1._modifications)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      cell = _this._cell;
      if (cell == null) {
        _this.set$__js_helper$_current(null);
        return false;
      } else {
        _this.set$__js_helper$_current(cell.hashMapCellKey);
        _this._cell = cell._next;
        return true;
      }
    },
    set$__js_helper$_current(_current) {
      this.__js_helper$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A.initHooks_closure.prototype = {
    call$1(o) {
      return this.getTag(o);
    },
    $signature: 1
  };
  A.initHooks_closure0.prototype = {
    call$2(o, tag) {
      return this.getUnknownTag(o, tag);
    },
    $signature: 35
  };
  A.initHooks_closure1.prototype = {
    call$1(tag) {
      return this.prototypeForTag(A._asStringS(tag));
    },
    $signature: 33
  };
  A.JSSyntaxRegExp.prototype = {
    toString$0(_) {
      return "RegExp/" + this.pattern + "/" + this._nativeRegExp.flags;
    },
    get$_nativeGlobalVersion() {
      var _this = this,
        t1 = _this._nativeGlobalRegExp;
      if (t1 != null)
        return t1;
      t1 = _this._nativeRegExp;
      return _this._nativeGlobalRegExp = A.JSSyntaxRegExp_makeNative(_this.pattern, t1.multiline, !t1.ignoreCase, t1.unicode, t1.dotAll, true);
    },
    get$_nativeAnchoredVersion() {
      var _this = this,
        t1 = _this._nativeAnchoredRegExp;
      if (t1 != null)
        return t1;
      t1 = _this._nativeRegExp;
      return _this._nativeAnchoredRegExp = A.JSSyntaxRegExp_makeNative(_this.pattern + "|()", t1.multiline, !t1.ignoreCase, t1.unicode, t1.dotAll, true);
    },
    firstMatch$1(string) {
      var m;
      if (typeof string != "string")
        A.throwExpression(A.argumentErrorValue(string));
      m = this._nativeRegExp.exec(string);
      if (m == null)
        return null;
      return new A._MatchImplementation(m);
    },
    allMatches$2(_, string, start) {
      var t1 = string.length;
      if (start > t1)
        throw A.wrapException(A.RangeError$range(start, 0, t1, null, null));
      return new A._AllMatchesIterable(this, string, start);
    },
    allMatches$1($receiver, string) {
      return this.allMatches$2($receiver, string, 0);
    },
    _execGlobal$2(string, start) {
      var match,
        regexp = this.get$_nativeGlobalVersion();
      regexp.lastIndex = start;
      match = regexp.exec(string);
      if (match == null)
        return null;
      return new A._MatchImplementation(match);
    },
    _execAnchored$2(string, start) {
      var match,
        regexp = this.get$_nativeAnchoredVersion();
      regexp.lastIndex = start;
      match = regexp.exec(string);
      if (match == null)
        return null;
      if (0 >= match.length)
        return A.ioore(match, -1);
      if (match.pop() != null)
        return null;
      return new A._MatchImplementation(match);
    },
    matchAsPrefix$2(_, string, start) {
      if (start < 0 || start > string.length)
        throw A.wrapException(A.RangeError$range(start, 0, string.length, null, null));
      return this._execAnchored$2(string, start);
    },
    $isPattern: 1,
    $isRegExp: 1
  };
  A._MatchImplementation.prototype = {
    get$end(_) {
      var t1 = this._match;
      return t1.index + t1[0].length;
    },
    $index(_, index) {
      var t1 = this._match;
      if (!(index < t1.length))
        return A.ioore(t1, index);
      return t1[index];
    },
    $isMatch: 1,
    $isRegExpMatch: 1
  };
  A._AllMatchesIterable.prototype = {
    get$iterator(_) {
      return new A._AllMatchesIterator(this._re, this._string, this._start);
    }
  };
  A._AllMatchesIterator.prototype = {
    get$current(_) {
      return this.__js_helper$_current;
    },
    moveNext$0() {
      var t1, t2, t3, match, nextIndex, _this = this,
        string = _this._string;
      if (string == null)
        return false;
      t1 = _this._nextIndex;
      t2 = string.length;
      if (t1 <= t2) {
        t3 = _this._regExp;
        match = t3._execGlobal$2(string, t1);
        if (match != null) {
          _this.__js_helper$_current = match;
          nextIndex = match.get$end(match);
          if (match._match.index === nextIndex) {
            if (t3._nativeRegExp.unicode) {
              t1 = _this._nextIndex;
              t3 = t1 + 1;
              if (t3 < t2) {
                t1 = B.JSString_methods.codeUnitAt$1(string, t1);
                if (t1 >= 55296 && t1 <= 56319) {
                  t1 = B.JSString_methods.codeUnitAt$1(string, t3);
                  t1 = t1 >= 56320 && t1 <= 57343;
                } else
                  t1 = false;
              } else
                t1 = false;
            } else
              t1 = false;
            nextIndex = (t1 ? nextIndex + 1 : nextIndex) + 1;
          }
          _this._nextIndex = nextIndex;
          return true;
        }
      }
      _this._string = _this.__js_helper$_current = null;
      return false;
    },
    $isIterator: 1
  };
  A.StringMatch.prototype = {
    $index(_, g) {
      if (g !== 0)
        A.throwExpression(A.RangeError$value(g, null));
      return this.pattern;
    },
    $isMatch: 1
  };
  A._StringAllMatchesIterable.prototype = {
    get$iterator(_) {
      return new A._StringAllMatchesIterator(this._input, this._pattern, this.__js_helper$_index);
    },
    get$first(_) {
      var t1 = this._pattern,
        index = this._input.indexOf(t1, this.__js_helper$_index);
      if (index >= 0)
        return new A.StringMatch(index, t1);
      throw A.wrapException(A.IterableElementError_noElement());
    }
  };
  A._StringAllMatchesIterator.prototype = {
    moveNext$0() {
      var index, end, _this = this,
        t1 = _this.__js_helper$_index,
        t2 = _this._pattern,
        t3 = t2.length,
        t4 = _this._input,
        t5 = t4.length;
      if (t1 + t3 > t5) {
        _this.__js_helper$_current = null;
        return false;
      }
      index = t4.indexOf(t2, t1);
      if (index < 0) {
        _this.__js_helper$_index = t5 + 1;
        _this.__js_helper$_current = null;
        return false;
      }
      end = index + t3;
      _this.__js_helper$_current = new A.StringMatch(index, t2);
      _this.__js_helper$_index = end === _this.__js_helper$_index ? end + 1 : end;
      return true;
    },
    get$current(_) {
      var t1 = this.__js_helper$_current;
      t1.toString;
      return t1;
    },
    $isIterator: 1
  };
  A._Cell.prototype = {
    _readField$0() {
      var t1 = this.__late_helper$_value;
      if (t1 === this)
        throw A.wrapException(A.LateError$fieldNI(this.__late_helper$_name));
      return t1;
    }
  };
  A.NativeByteBuffer.prototype = {
    get$runtimeType(receiver) {
      return B.Type_ByteBuffer_RkP;
    },
    $isNativeByteBuffer: 1,
    $isByteBuffer: 1
  };
  A.NativeTypedData.prototype = {$isNativeTypedData: 1, $isTypedData: 1};
  A.NativeByteData.prototype = {
    get$runtimeType(receiver) {
      return B.Type_ByteData_zNC;
    }
  };
  A.NativeTypedArray.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $isJavaScriptIndexingBehavior: 1
  };
  A.NativeTypedArrayOfDouble.prototype = {
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      A._asDoubleS(value);
      A._checkValidIndex(index, receiver, receiver.length);
      receiver[index] = value;
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.NativeTypedArrayOfInt.prototype = {
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      A._asIntS(value);
      A._checkValidIndex(index, receiver, receiver.length);
      receiver[index] = value;
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.NativeFloat32List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Float32List_LB7;
    },
    sublist$2(receiver, start, end) {
      return new Float32Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    }
  };
  A.NativeFloat64List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Float64List_LB7;
    },
    sublist$2(receiver, start, end) {
      return new Float64Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    }
  };
  A.NativeInt16List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Int16List_uXf;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Int16Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    }
  };
  A.NativeInt32List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Int32List_O50;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Int32Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    }
  };
  A.NativeInt8List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Int8List_ekJ;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Int8Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    }
  };
  A.NativeUint16List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Uint16List_2bx;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Uint16Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    $isUint16List: 1
  };
  A.NativeUint32List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Uint32List_2bx;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Uint32Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    }
  };
  A.NativeUint8ClampedList.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Uint8ClampedList_Jik;
    },
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Uint8ClampedArray(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    }
  };
  A.NativeUint8List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Uint8List_WLA;
    },
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Uint8Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    $isNativeUint8List: 1,
    $isUint8List: 1
  };
  A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin.prototype = {};
  A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin.prototype = {};
  A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin.prototype = {};
  A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin.prototype = {};
  A.Rti.prototype = {
    _eval$1(recipe) {
      return A._Universe_evalInEnvironment(init.typeUniverse, this, recipe);
    },
    _bind$1(typeOrTuple) {
      return A._Universe_bind(init.typeUniverse, this, typeOrTuple);
    }
  };
  A._FunctionParameters.prototype = {};
  A._Type.prototype = {
    toString$0(_) {
      return A._rtiToString(this._rti, null);
    },
    $isType: 1
  };
  A._Error.prototype = {
    toString$0(_) {
      return this.__rti$_message;
    }
  };
  A._TypeError.prototype = {$isTypeError: 1};
  A._AsyncRun__initializeScheduleImmediate_internalCallback.prototype = {
    call$1(_) {
      var t1 = this._box_0,
        f = t1.storedCallback;
      t1.storedCallback = null;
      f.call$0();
    },
    $signature: 7
  };
  A._AsyncRun__initializeScheduleImmediate_closure.prototype = {
    call$1(callback) {
      var t1, t2;
      this._box_0.storedCallback = type$.void_Function._as(callback);
      t1 = this.div;
      t2 = this.span;
      t1.firstChild ? t1.removeChild(t2) : t1.appendChild(t2);
    },
    $signature: 36
  };
  A._AsyncRun__scheduleImmediateJsOverride_internalCallback.prototype = {
    call$0() {
      this.callback.call$0();
    },
    $signature: 2
  };
  A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback.prototype = {
    call$0() {
      this.callback.call$0();
    },
    $signature: 2
  };
  A._TimerImpl.prototype = {
    _TimerImpl$2(milliseconds, callback) {
      if (self.setTimeout != null)
        this._handle = self.setTimeout(A.convertDartClosureToJS(new A._TimerImpl_internalCallback(this, callback), 0), milliseconds);
      else
        throw A.wrapException(A.UnsupportedError$("`setTimeout()` not found."));
    },
    _TimerImpl$periodic$2(milliseconds, callback) {
      if (self.setTimeout != null)
        this._handle = self.setInterval(A.convertDartClosureToJS(new A._TimerImpl$periodic_closure(this, milliseconds, Date.now(), callback), 0), milliseconds);
      else
        throw A.wrapException(A.UnsupportedError$("Periodic timer."));
    },
    get$isActive() {
      return this._handle != null;
    },
    cancel$0(_) {
      var t1;
      if (self.setTimeout != null) {
        t1 = this._handle;
        if (t1 == null)
          return;
        if (this._once)
          self.clearTimeout(t1);
        else
          self.clearInterval(t1);
        this._handle = null;
      } else
        throw A.wrapException(A.UnsupportedError$("Canceling a timer."));
    },
    $isTimer: 1
  };
  A._TimerImpl_internalCallback.prototype = {
    call$0() {
      var t1 = this.$this;
      t1._handle = null;
      t1._tick = 1;
      this.callback.call$0();
    },
    $signature: 0
  };
  A._TimerImpl$periodic_closure.prototype = {
    call$0() {
      var duration, _this = this,
        t1 = _this.$this,
        tick = t1._tick + 1,
        t2 = _this.milliseconds;
      if (t2 > 0) {
        duration = Date.now() - _this.start;
        if (duration > (tick + 1) * t2)
          tick = B.JSInt_methods.$tdiv(duration, t2);
      }
      t1._tick = tick;
      _this.callback.call$1(t1);
    },
    $signature: 2
  };
  A._AsyncAwaitCompleter.prototype = {
    complete$1(_, value) {
      var t2, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1/?")._as(value);
      if (!_this.isSync)
        _this._future._asyncComplete$1(value);
      else {
        t2 = _this._future;
        if (t1._eval$1("Future<1>")._is(value))
          t2._chainFuture$1(value);
        else
          t2._completeWithValue$1(t1._precomputed1._as(value));
      }
    },
    completeError$2(e, st) {
      var t1;
      if (st == null)
        st = A.AsyncError_defaultStackTrace(e);
      t1 = this._future;
      if (this.isSync)
        t1._completeError$2(e, st);
      else
        t1._asyncCompleteError$2(e, st);
    },
    $isCompleter: 1
  };
  A._awaitOnObject_closure.prototype = {
    call$1(result) {
      return this.bodyFunction.call$2(0, result);
    },
    $signature: 4
  };
  A._awaitOnObject_closure0.prototype = {
    call$2(error, stackTrace) {
      this.bodyFunction.call$2(1, new A.ExceptionAndStackTrace(error, type$.StackTrace._as(stackTrace)));
    },
    $signature: 51
  };
  A._wrapJsFunctionForAsync_closure.prototype = {
    call$2(errorCode, result) {
      this.$protected(A._asIntS(errorCode), result);
    },
    $signature: 52
  };
  A.AsyncError.prototype = {
    toString$0(_) {
      return A.S(this.error);
    },
    $isError: 1,
    get$stackTrace() {
      return this.stackTrace;
    }
  };
  A.Future_Future$microtask_closure.prototype = {
    call$0() {
      var e, s, exception;
      try {
        this.result._complete$1(this.computation.call$0());
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A._completeWithErrorCallback(this.result, e, s);
      }
    },
    $signature: 0
  };
  A._Completer.prototype = {
    completeError$2(error, stackTrace) {
      var replacement;
      type$.nullable_StackTrace._as(stackTrace);
      A.checkNotNullable(error, "error", type$.Object);
      if ((this.future._state & 30) !== 0)
        throw A.wrapException(A.StateError$("Future already completed"));
      replacement = $.Zone__current.errorCallback$2(error, stackTrace);
      if (replacement != null) {
        error = replacement.error;
        stackTrace = replacement.stackTrace;
      } else if (stackTrace == null)
        stackTrace = A.AsyncError_defaultStackTrace(error);
      this._completeError$2(error, stackTrace);
    },
    completeError$1(error) {
      return this.completeError$2(error, null);
    },
    $isCompleter: 1
  };
  A._AsyncCompleter.prototype = {
    complete$1(_, value) {
      var t2,
        t1 = this.$ti;
      t1._eval$1("1/?")._as(value);
      t2 = this.future;
      if ((t2._state & 30) !== 0)
        throw A.wrapException(A.StateError$("Future already completed"));
      t2._asyncComplete$1(t1._eval$1("1/")._as(value));
    },
    complete$0($receiver) {
      return this.complete$1($receiver, null);
    },
    _completeError$2(error, stackTrace) {
      this.future._asyncCompleteError$2(error, stackTrace);
    }
  };
  A._SyncCompleter.prototype = {
    complete$1(_, value) {
      var t2,
        t1 = this.$ti;
      t1._eval$1("1/?")._as(value);
      t2 = this.future;
      if ((t2._state & 30) !== 0)
        throw A.wrapException(A.StateError$("Future already completed"));
      t2._complete$1(t1._eval$1("1/")._as(value));
    },
    _completeError$2(error, stackTrace) {
      this.future._completeError$2(error, stackTrace);
    }
  };
  A._FutureListener.prototype = {
    matchesErrorTest$1(asyncError) {
      if ((this.state & 15) !== 6)
        return true;
      return this.result._zone.runUnary$2$2(type$.bool_Function_Object._as(this.callback), asyncError.error, type$.bool, type$.Object);
    },
    handleError$1(asyncError) {
      var exception, _this = this,
        errorCallback = _this.errorCallback,
        result = null,
        t1 = type$.dynamic,
        t2 = type$.Object,
        t3 = _this.result._zone;
      if (type$.dynamic_Function_Object_StackTrace._is(errorCallback))
        result = t3.runBinary$3$3(errorCallback, asyncError.error, asyncError.stackTrace, t1, t2, type$.StackTrace);
      else
        result = t3.runUnary$2$2(type$.dynamic_Function_Object._as(errorCallback), asyncError.error, t1, t2);
      try {
        t1 = _this.$ti._eval$1("2/")._as(result);
        return t1;
      } catch (exception) {
        if (type$.TypeError._is(A.unwrapException(exception))) {
          if ((_this.state & 1) !== 0)
            throw A.wrapException(A.ArgumentError$("The error handler of Future.then must return a value of the returned future's type", "onError"));
          throw A.wrapException(A.ArgumentError$("The error handler of Future.catchError must return a value of the future's type", "onError"));
        } else
          throw exception;
      }
    }
  };
  A._Future.prototype = {
    then$1$2$onError(_, f, onError, $R) {
      var currentZone, result, t2,
        t1 = this.$ti;
      t1._bind$1($R)._eval$1("1/(2)")._as(f);
      currentZone = $.Zone__current;
      if (currentZone === B.C__RootZone) {
        if (onError != null && !type$.dynamic_Function_Object_StackTrace._is(onError) && !type$.dynamic_Function_Object._is(onError))
          throw A.wrapException(A.ArgumentError$value(onError, "onError", string$.Error_));
      } else {
        f = currentZone.registerUnaryCallback$2$1(f, $R._eval$1("0/"), t1._precomputed1);
        if (onError != null)
          onError = A._registerErrorHandler(onError, currentZone);
      }
      result = new A._Future($.Zone__current, $R._eval$1("_Future<0>"));
      t2 = onError == null ? 1 : 3;
      this._addListener$1(new A._FutureListener(result, t2, f, onError, t1._eval$1("@<1>")._bind$1($R)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    then$1$1($receiver, f, $R) {
      return this.then$1$2$onError($receiver, f, null, $R);
    },
    _thenAwait$1$2(f, onError, $E) {
      var result,
        t1 = this.$ti;
      t1._bind$1($E)._eval$1("1/(2)")._as(f);
      result = new A._Future($.Zone__current, $E._eval$1("_Future<0>"));
      this._addListener$1(new A._FutureListener(result, 19, f, onError, t1._eval$1("@<1>")._bind$1($E)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    catchError$1(onError) {
      var t1 = this.$ti,
        t2 = $.Zone__current,
        result = new A._Future(t2, t1);
      if (t2 !== B.C__RootZone)
        onError = A._registerErrorHandler(onError, t2);
      this._addListener$1(new A._FutureListener(result, 2, null, onError, t1._eval$1("@<1>")._bind$1(t1._precomputed1)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    whenComplete$1(action) {
      var t1, t2, result;
      type$.dynamic_Function._as(action);
      t1 = this.$ti;
      t2 = $.Zone__current;
      result = new A._Future(t2, t1);
      if (t2 !== B.C__RootZone)
        action = t2.registerCallback$1$1(action, type$.dynamic);
      this._addListener$1(new A._FutureListener(result, 8, action, null, t1._eval$1("@<1>")._bind$1(t1._precomputed1)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    _setErrorObject$1(error) {
      this._state = this._state & 1 | 16;
      this._resultOrListeners = error;
    },
    _cloneResult$1(source) {
      this._state = source._state & 30 | this._state & 1;
      this._resultOrListeners = source._resultOrListeners;
    },
    _addListener$1(listener) {
      var source, _this = this,
        t1 = _this._state;
      if (t1 <= 3) {
        listener._nextListener = type$.nullable__FutureListener_dynamic_dynamic._as(_this._resultOrListeners);
        _this._resultOrListeners = listener;
      } else {
        if ((t1 & 4) !== 0) {
          source = type$._Future_dynamic._as(_this._resultOrListeners);
          if ((source._state & 24) === 0) {
            source._addListener$1(listener);
            return;
          }
          _this._cloneResult$1(source);
        }
        _this._zone.scheduleMicrotask$1(new A._Future__addListener_closure(_this, listener));
      }
    },
    _prependListeners$1(listeners) {
      var t1, existingListeners, next, cursor, next0, source, _this = this, _box_0 = {};
      _box_0.listeners = listeners;
      if (listeners == null)
        return;
      t1 = _this._state;
      if (t1 <= 3) {
        existingListeners = type$.nullable__FutureListener_dynamic_dynamic._as(_this._resultOrListeners);
        _this._resultOrListeners = listeners;
        if (existingListeners != null) {
          next = listeners._nextListener;
          for (cursor = listeners; next != null; cursor = next, next = next0)
            next0 = next._nextListener;
          cursor._nextListener = existingListeners;
        }
      } else {
        if ((t1 & 4) !== 0) {
          source = type$._Future_dynamic._as(_this._resultOrListeners);
          if ((source._state & 24) === 0) {
            source._prependListeners$1(listeners);
            return;
          }
          _this._cloneResult$1(source);
        }
        _box_0.listeners = _this._reverseListeners$1(listeners);
        _this._zone.scheduleMicrotask$1(new A._Future__prependListeners_closure(_box_0, _this));
      }
    },
    _removeListeners$0() {
      var current = type$.nullable__FutureListener_dynamic_dynamic._as(this._resultOrListeners);
      this._resultOrListeners = null;
      return this._reverseListeners$1(current);
    },
    _reverseListeners$1(listeners) {
      var current, prev, next;
      for (current = listeners, prev = null; current != null; prev = current, current = next) {
        next = current._nextListener;
        current._nextListener = prev;
      }
      return prev;
    },
    _chainForeignFuture$1(source) {
      var e, s, exception, _this = this;
      _this._state ^= 2;
      try {
        source.then$1$2$onError(0, new A._Future__chainForeignFuture_closure(_this), new A._Future__chainForeignFuture_closure0(_this), type$.Null);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A.scheduleMicrotask(new A._Future__chainForeignFuture_closure1(_this, e, s));
      }
    },
    _complete$1(value) {
      var listeners, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1/")._as(value);
      if (t1._eval$1("Future<1>")._is(value))
        if (t1._is(value))
          A._Future__chainCoreFuture(value, _this);
        else
          _this._chainForeignFuture$1(value);
      else {
        listeners = _this._removeListeners$0();
        t1._precomputed1._as(value);
        _this._state = 8;
        _this._resultOrListeners = value;
        A._Future__propagateToListeners(_this, listeners);
      }
    },
    _completeWithValue$1(value) {
      var listeners, _this = this;
      _this.$ti._precomputed1._as(value);
      listeners = _this._removeListeners$0();
      _this._state = 8;
      _this._resultOrListeners = value;
      A._Future__propagateToListeners(_this, listeners);
    },
    _completeError$2(error, stackTrace) {
      var listeners;
      type$.StackTrace._as(stackTrace);
      listeners = this._removeListeners$0();
      this._setErrorObject$1(A.AsyncError$(error, stackTrace));
      A._Future__propagateToListeners(this, listeners);
    },
    _asyncComplete$1(value) {
      var t1 = this.$ti;
      t1._eval$1("1/")._as(value);
      if (t1._eval$1("Future<1>")._is(value)) {
        this._chainFuture$1(value);
        return;
      }
      this._asyncCompleteWithValue$1(t1._precomputed1._as(value));
    },
    _asyncCompleteWithValue$1(value) {
      var _this = this;
      _this.$ti._precomputed1._as(value);
      _this._state ^= 2;
      _this._zone.scheduleMicrotask$1(new A._Future__asyncCompleteWithValue_closure(_this, value));
    },
    _chainFuture$1(value) {
      var _this = this,
        t1 = _this.$ti;
      t1._eval$1("Future<1>")._as(value);
      if (t1._is(value)) {
        if ((value._state & 16) !== 0) {
          _this._state ^= 2;
          _this._zone.scheduleMicrotask$1(new A._Future__chainFuture_closure(_this, value));
        } else
          A._Future__chainCoreFuture(value, _this);
        return;
      }
      _this._chainForeignFuture$1(value);
    },
    _asyncCompleteError$2(error, stackTrace) {
      type$.StackTrace._as(stackTrace);
      this._state ^= 2;
      this._zone.scheduleMicrotask$1(new A._Future__asyncCompleteError_closure(this, error, stackTrace));
    },
    $isFuture: 1
  };
  A._Future__addListener_closure.prototype = {
    call$0() {
      A._Future__propagateToListeners(this.$this, this.listener);
    },
    $signature: 0
  };
  A._Future__prependListeners_closure.prototype = {
    call$0() {
      A._Future__propagateToListeners(this.$this, this._box_0.listeners);
    },
    $signature: 0
  };
  A._Future__chainForeignFuture_closure.prototype = {
    call$1(value) {
      var error, stackTrace, exception,
        t1 = this.$this;
      t1._state ^= 2;
      try {
        t1._completeWithValue$1(t1.$ti._precomputed1._as(value));
      } catch (exception) {
        error = A.unwrapException(exception);
        stackTrace = A.getTraceFromException(exception);
        t1._completeError$2(error, stackTrace);
      }
    },
    $signature: 7
  };
  A._Future__chainForeignFuture_closure0.prototype = {
    call$2(error, stackTrace) {
      this.$this._completeError$2(error, type$.StackTrace._as(stackTrace));
    },
    $signature: 9
  };
  A._Future__chainForeignFuture_closure1.prototype = {
    call$0() {
      this.$this._completeError$2(this.e, this.s);
    },
    $signature: 0
  };
  A._Future__asyncCompleteWithValue_closure.prototype = {
    call$0() {
      this.$this._completeWithValue$1(this.value);
    },
    $signature: 0
  };
  A._Future__chainFuture_closure.prototype = {
    call$0() {
      A._Future__chainCoreFuture(this.value, this.$this);
    },
    $signature: 0
  };
  A._Future__asyncCompleteError_closure.prototype = {
    call$0() {
      this.$this._completeError$2(this.error, this.stackTrace);
    },
    $signature: 0
  };
  A._Future__propagateToListeners_handleWhenCompleteCallback.prototype = {
    call$0() {
      var e, s, t1, exception, t2, originalSource, _this = this, completeResult = null;
      try {
        t1 = _this._box_0.listener;
        completeResult = t1.result._zone.run$1$1(type$.dynamic_Function._as(t1.callback), type$.dynamic);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        if (_this.hasError) {
          t1 = type$.AsyncError._as(_this._box_1.source._resultOrListeners).error;
          t2 = e;
          t2 = t1 == null ? t2 == null : t1 === t2;
          t1 = t2;
        } else
          t1 = false;
        t2 = _this._box_0;
        if (t1)
          t2.listenerValueOrError = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
        else
          t2.listenerValueOrError = A.AsyncError$(e, s);
        t2.listenerHasError = true;
        return;
      }
      if (completeResult instanceof A._Future && (completeResult._state & 24) !== 0) {
        if ((completeResult._state & 16) !== 0) {
          t1 = _this._box_0;
          t1.listenerValueOrError = type$.AsyncError._as(completeResult._resultOrListeners);
          t1.listenerHasError = true;
        }
        return;
      }
      if (type$.Future_dynamic._is(completeResult)) {
        originalSource = _this._box_1.source;
        t1 = _this._box_0;
        t1.listenerValueOrError = J.then$1$1$x(completeResult, new A._Future__propagateToListeners_handleWhenCompleteCallback_closure(originalSource), type$.dynamic);
        t1.listenerHasError = false;
      }
    },
    $signature: 0
  };
  A._Future__propagateToListeners_handleWhenCompleteCallback_closure.prototype = {
    call$1(_) {
      return this.originalSource;
    },
    $signature: 98
  };
  A._Future__propagateToListeners_handleValueCallback.prototype = {
    call$0() {
      var e, s, t1, t2, t3, t4, t5, exception;
      try {
        t1 = this._box_0;
        t2 = t1.listener;
        t3 = t2.$ti;
        t4 = t3._precomputed1;
        t5 = t4._as(this.sourceResult);
        t1.listenerValueOrError = t2.result._zone.runUnary$2$2(t3._eval$1("2/(1)")._as(t2.callback), t5, t3._eval$1("2/"), t4);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        t1 = this._box_0;
        t1.listenerValueOrError = A.AsyncError$(e, s);
        t1.listenerHasError = true;
      }
    },
    $signature: 0
  };
  A._Future__propagateToListeners_handleError.prototype = {
    call$0() {
      var asyncError, e, s, t1, exception, t2, t3, t4, _this = this;
      try {
        asyncError = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
        t1 = _this._box_0;
        if (A.boolConversionCheck(t1.listener.matchesErrorTest$1(asyncError)) && t1.listener.errorCallback != null) {
          t1.listenerValueOrError = t1.listener.handleError$1(asyncError);
          t1.listenerHasError = false;
        }
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        t1 = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
        t2 = t1.error;
        t3 = e;
        t4 = _this._box_0;
        if (t2 == null ? t3 == null : t2 === t3)
          t4.listenerValueOrError = t1;
        else
          t4.listenerValueOrError = A.AsyncError$(e, s);
        t4.listenerHasError = true;
      }
    },
    $signature: 0
  };
  A._AsyncCallbackEntry.prototype = {};
  A.Stream.prototype = {
    map$1$1(_, convert, $S) {
      var t1 = A._instanceType(this);
      return new A._MapStream(t1._bind$1($S)._eval$1("1(Stream.T)")._as(convert), this, t1._eval$1("@<Stream.T>")._bind$1($S)._eval$1("_MapStream<1,2>"));
    },
    map$1($receiver, convert) {
      return this.map$1$1($receiver, convert, type$.dynamic);
    },
    get$length(_) {
      var t1 = {},
        future = new A._Future($.Zone__current, type$._Future_int);
      t1.count = 0;
      this.listen$4$cancelOnError$onDone$onError(new A.Stream_length_closure(t1, this), true, new A.Stream_length_closure0(t1, future), future.get$_completeError());
      return future;
    },
    get$first(_) {
      var future = new A._Future($.Zone__current, A._instanceType(this)._eval$1("_Future<Stream.T>")),
        subscription = this.listen$4$cancelOnError$onDone$onError(null, true, new A.Stream_first_closure(future), future.get$_completeError());
      subscription.onData$1(new A.Stream_first_closure0(this, subscription, future));
      return future;
    }
  };
  A.Stream_length_closure.prototype = {
    call$1(_) {
      A._instanceType(this.$this)._eval$1("Stream.T")._as(_);
      ++this._box_0.count;
    },
    $signature() {
      return A._instanceType(this.$this)._eval$1("~(Stream.T)");
    }
  };
  A.Stream_length_closure0.prototype = {
    call$0() {
      this.future._complete$1(this._box_0.count);
    },
    $signature: 0
  };
  A.Stream_first_closure.prototype = {
    call$0() {
      var e, s, t1, exception;
      try {
        t1 = A.IterableElementError_noElement();
        throw A.wrapException(t1);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A._completeWithErrorCallback(this.future, e, s);
      }
    },
    $signature: 0
  };
  A.Stream_first_closure0.prototype = {
    call$1(value) {
      A._cancelAndValue(this.subscription, this.future, A._instanceType(this.$this)._eval$1("Stream.T")._as(value));
    },
    $signature() {
      return A._instanceType(this.$this)._eval$1("~(Stream.T)");
    }
  };
  A.StreamSubscription.prototype = {};
  A.StreamTransformerBase.prototype = {$isStreamTransformer: 1};
  A._StreamController.prototype = {
    get$_pendingEvents() {
      var t1, _this = this;
      if ((_this._state & 8) === 0)
        return A._instanceType(_this)._eval$1("_PendingEvents<1>?")._as(_this._varData);
      t1 = A._instanceType(_this);
      return t1._eval$1("_PendingEvents<1>?")._as(t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).get$varData());
    },
    _ensurePendingEvents$0() {
      var events, t1, _this = this;
      if ((_this._state & 8) === 0) {
        events = _this._varData;
        if (events == null)
          events = _this._varData = new A._StreamImplEvents(A._instanceType(_this)._eval$1("_StreamImplEvents<1>"));
        return A._instanceType(_this)._eval$1("_StreamImplEvents<1>")._as(events);
      }
      t1 = A._instanceType(_this);
      events = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).get$varData();
      return t1._eval$1("_StreamImplEvents<1>")._as(events);
    },
    get$_subscription() {
      var varData = this._varData;
      if ((this._state & 8) !== 0)
        varData = type$._StreamControllerAddStreamState_nullable_Object._as(varData).get$varData();
      return A._instanceType(this)._eval$1("_ControllerSubscription<1>")._as(varData);
    },
    _badEventState$0() {
      if ((this._state & 4) !== 0)
        return new A.StateError("Cannot add event after closing");
      return new A.StateError("Cannot add event while adding a stream");
    },
    _ensureDoneFuture$0() {
      var t1 = this._doneFuture;
      if (t1 == null)
        t1 = this._doneFuture = (this._state & 2) !== 0 ? $.$get$Future__nullFuture() : new A._Future($.Zone__current, type$._Future_void);
      return t1;
    },
    add$1(_, value) {
      var t2, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(value);
      t2 = _this._state;
      if (t2 >= 4)
        throw A.wrapException(_this._badEventState$0());
      if ((t2 & 1) !== 0)
        _this._sendData$1(value);
      else if ((t2 & 3) === 0)
        _this._ensurePendingEvents$0().add$1(0, new A._DelayedData(value, t1._eval$1("_DelayedData<1>")));
    },
    addError$2(error, stackTrace) {
      var replacement, t1, _this = this;
      type$.nullable_StackTrace._as(stackTrace);
      A.checkNotNullable(error, "error", type$.Object);
      if (_this._state >= 4)
        throw A.wrapException(_this._badEventState$0());
      replacement = $.Zone__current.errorCallback$2(error, stackTrace);
      if (replacement != null) {
        error = replacement.error;
        stackTrace = replacement.stackTrace;
      } else if (stackTrace == null)
        stackTrace = A.AsyncError_defaultStackTrace(error);
      t1 = _this._state;
      if ((t1 & 1) !== 0)
        _this._sendError$2(error, stackTrace);
      else if ((t1 & 3) === 0)
        _this._ensurePendingEvents$0().add$1(0, new A._DelayedError(error, stackTrace));
    },
    addError$1(error) {
      return this.addError$2(error, null);
    },
    close$0(_) {
      var _this = this,
        t1 = _this._state;
      if ((t1 & 4) !== 0)
        return _this._ensureDoneFuture$0();
      if (t1 >= 4)
        throw A.wrapException(_this._badEventState$0());
      t1 = _this._state = t1 | 4;
      if ((t1 & 1) !== 0)
        _this._sendDone$0();
      else if ((t1 & 3) === 0)
        _this._ensurePendingEvents$0().add$1(0, B.C__DelayedDone);
      return _this._ensureDoneFuture$0();
    },
    _subscribe$4(onData, onError, onDone, cancelOnError) {
      var t2, t3, t4, t5, t6, subscription, pendingEvents, addState, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      if ((_this._state & 3) !== 0)
        throw A.wrapException(A.StateError$("Stream has already been listened to."));
      t2 = $.Zone__current;
      t3 = cancelOnError ? 1 : 0;
      t4 = A._BufferingStreamSubscription__registerDataHandler(t2, onData, t1._precomputed1);
      t5 = A._BufferingStreamSubscription__registerErrorHandler(t2, onError);
      t6 = onDone == null ? A.async___nullDoneHandler$closure() : onDone;
      subscription = new A._ControllerSubscription(_this, t4, t5, t2.registerCallback$1$1(t6, type$.void), t2, t3, t1._eval$1("_ControllerSubscription<1>"));
      pendingEvents = _this.get$_pendingEvents();
      t3 = _this._state |= 1;
      if ((t3 & 8) !== 0) {
        addState = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData);
        addState.set$varData(subscription);
        addState.resume$0(0);
      } else
        _this._varData = subscription;
      subscription._setPendingEvents$1(pendingEvents);
      subscription._guardCallback$1(new A._StreamController__subscribe_closure(_this));
      return subscription;
    },
    _recordCancel$1(subscription) {
      var result, onCancel, cancelResult, e, s, exception, result0, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("StreamSubscription<1>")._as(subscription);
      result = null;
      if ((_this._state & 8) !== 0)
        result = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).cancel$0(0);
      _this._varData = null;
      _this._state = _this._state & 4294967286 | 2;
      onCancel = _this.onCancel;
      if (onCancel != null)
        if (result == null)
          try {
            cancelResult = onCancel.call$0();
            if (type$.Future_void._is(cancelResult))
              result = cancelResult;
          } catch (exception) {
            e = A.unwrapException(exception);
            s = A.getTraceFromException(exception);
            result0 = new A._Future($.Zone__current, type$._Future_void);
            result0._asyncCompleteError$2(e, s);
            result = result0;
          }
        else
          result = result.whenComplete$1(onCancel);
      t1 = new A._StreamController__recordCancel_complete(_this);
      if (result != null)
        result = result.whenComplete$1(t1);
      else
        t1.call$0();
      return result;
    },
    $isStreamSink: 1,
    $isStreamController: 1,
    $is_StreamControllerLifecycle: 1,
    $is_EventSink: 1,
    $is_EventDispatch: 1
  };
  A._StreamController__subscribe_closure.prototype = {
    call$0() {
      A._runGuarded(this.$this.onListen);
    },
    $signature: 0
  };
  A._StreamController__recordCancel_complete.prototype = {
    call$0() {
      var doneFuture = this.$this._doneFuture;
      if (doneFuture != null && (doneFuture._state & 30) === 0)
        doneFuture._asyncComplete$1(null);
    },
    $signature: 0
  };
  A._SyncStreamControllerDispatch.prototype = {
    _sendData$1(data) {
      this.$ti._precomputed1._as(data);
      this.get$_subscription()._add$1(0, data);
    },
    _sendError$2(error, stackTrace) {
      this.get$_subscription()._addError$2(error, stackTrace);
    },
    _sendDone$0() {
      this.get$_subscription()._close$0();
    }
  };
  A._AsyncStreamControllerDispatch.prototype = {
    _sendData$1(data) {
      var t1 = this.$ti;
      t1._precomputed1._as(data);
      this.get$_subscription()._addPending$1(new A._DelayedData(data, t1._eval$1("_DelayedData<1>")));
    },
    _sendError$2(error, stackTrace) {
      this.get$_subscription()._addPending$1(new A._DelayedError(error, stackTrace));
    },
    _sendDone$0() {
      this.get$_subscription()._addPending$1(B.C__DelayedDone);
    }
  };
  A._AsyncStreamController.prototype = {};
  A._SyncStreamController.prototype = {};
  A._ControllerStream.prototype = {
    get$hashCode(_) {
      return (A.Primitives_objectHashCode(this._controller) ^ 892482866) >>> 0;
    },
    $eq(_, other) {
      if (other == null)
        return false;
      if (this === other)
        return true;
      return other instanceof A._ControllerStream && other._controller === this._controller;
    }
  };
  A._ControllerSubscription.prototype = {
    _onCancel$0() {
      return this._controller._recordCancel$1(this);
    },
    _onPause$0() {
      var t1 = this._controller,
        t2 = A._instanceType(t1);
      t2._eval$1("StreamSubscription<1>")._as(this);
      if ((t1._state & 8) !== 0)
        t2._eval$1("_StreamControllerAddStreamState<1>")._as(t1._varData).pause$0(0);
      A._runGuarded(t1.onPause);
    },
    _onResume$0() {
      var t1 = this._controller,
        t2 = A._instanceType(t1);
      t2._eval$1("StreamSubscription<1>")._as(this);
      if ((t1._state & 8) !== 0)
        t2._eval$1("_StreamControllerAddStreamState<1>")._as(t1._varData).resume$0(0);
      A._runGuarded(t1.onResume);
    }
  };
  A._StreamSinkWrapper.prototype = {
    add$1(_, data) {
      this._async$_target.add$1(0, this.$ti._precomputed1._as(data));
    },
    $isStreamSink: 1
  };
  A._BufferingStreamSubscription.prototype = {
    _setPendingEvents$1(pendingEvents) {
      var _this = this;
      A._instanceType(_this)._eval$1("_PendingEvents<_BufferingStreamSubscription.T>?")._as(pendingEvents);
      if (pendingEvents == null)
        return;
      _this.set$_pending(pendingEvents);
      if (pendingEvents.lastPendingEvent != null) {
        _this._state = (_this._state | 64) >>> 0;
        pendingEvents.schedule$1(_this);
      }
    },
    onData$1(handleData) {
      var t1 = A._instanceType(this);
      this.set$_async$_onData(A._BufferingStreamSubscription__registerDataHandler(this._zone, t1._eval$1("~(_BufferingStreamSubscription.T)?")._as(handleData), t1._eval$1("_BufferingStreamSubscription.T")));
    },
    pause$0(_) {
      var t2, t3, _this = this,
        t1 = _this._state;
      if ((t1 & 8) !== 0)
        return;
      t2 = (t1 + 128 | 4) >>> 0;
      _this._state = t2;
      if (t1 < 128) {
        t3 = _this._pending;
        if (t3 != null)
          if (t3._state === 1)
            t3._state = 3;
      }
      if ((t1 & 4) === 0 && (t2 & 32) === 0)
        _this._guardCallback$1(_this.get$_onPause());
    },
    resume$0(_) {
      var _this = this,
        t1 = _this._state;
      if ((t1 & 8) !== 0)
        return;
      if (t1 >= 128) {
        t1 = _this._state = t1 - 128;
        if (t1 < 128)
          if ((t1 & 64) !== 0 && _this._pending.lastPendingEvent != null)
            _this._pending.schedule$1(_this);
          else {
            t1 = (t1 & 4294967291) >>> 0;
            _this._state = t1;
            if ((t1 & 32) === 0)
              _this._guardCallback$1(_this.get$_onResume());
          }
      }
    },
    cancel$0(_) {
      var _this = this,
        t1 = (_this._state & 4294967279) >>> 0;
      _this._state = t1;
      if ((t1 & 8) === 0)
        _this._cancel$0();
      t1 = _this._cancelFuture;
      return t1 == null ? $.$get$Future__nullFuture() : t1;
    },
    asFuture$1$1(futureValue, $E) {
      var result, t1 = {};
      $E._eval$1("0?")._as(futureValue);
      t1.resultValue = null;
      t1.resultValue = $E._as(futureValue);
      result = new A._Future($.Zone__current, $E._eval$1("_Future<0>"));
      this.set$_onDone(new A._BufferingStreamSubscription_asFuture_closure(t1, result));
      this._onError = new A._BufferingStreamSubscription_asFuture_closure0(this, result);
      return result;
    },
    _cancel$0() {
      var t2, _this = this,
        t1 = _this._state = (_this._state | 8) >>> 0;
      if ((t1 & 64) !== 0) {
        t2 = _this._pending;
        if (t2._state === 1)
          t2._state = 3;
      }
      if ((t1 & 32) === 0)
        _this.set$_pending(null);
      _this._cancelFuture = _this._onCancel$0();
    },
    _add$1(_, data) {
      var t2, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("_BufferingStreamSubscription.T")._as(data);
      t2 = _this._state;
      if ((t2 & 8) !== 0)
        return;
      if (t2 < 32)
        _this._sendData$1(data);
      else
        _this._addPending$1(new A._DelayedData(data, t1._eval$1("_DelayedData<_BufferingStreamSubscription.T>")));
    },
    _addError$2(error, stackTrace) {
      var t1 = this._state;
      if ((t1 & 8) !== 0)
        return;
      if (t1 < 32)
        this._sendError$2(error, stackTrace);
      else
        this._addPending$1(new A._DelayedError(error, stackTrace));
    },
    _close$0() {
      var _this = this,
        t1 = _this._state;
      if ((t1 & 8) !== 0)
        return;
      t1 = (t1 | 2) >>> 0;
      _this._state = t1;
      if (t1 < 32)
        _this._sendDone$0();
      else
        _this._addPending$1(B.C__DelayedDone);
    },
    _onPause$0() {
    },
    _onResume$0() {
    },
    _onCancel$0() {
      return null;
    },
    _addPending$1($event) {
      var _this = this,
        t1 = A._instanceType(_this),
        pending = t1._eval$1("_StreamImplEvents<_BufferingStreamSubscription.T>?")._as(_this._pending);
      if (pending == null)
        pending = new A._StreamImplEvents(t1._eval$1("_StreamImplEvents<_BufferingStreamSubscription.T>"));
      _this.set$_pending(pending);
      pending.add$1(0, $event);
      t1 = _this._state;
      if ((t1 & 64) === 0) {
        t1 = (t1 | 64) >>> 0;
        _this._state = t1;
        if (t1 < 128)
          pending.schedule$1(_this);
      }
    },
    _sendData$1(data) {
      var t2, _this = this,
        t1 = A._instanceType(_this)._eval$1("_BufferingStreamSubscription.T");
      t1._as(data);
      t2 = _this._state;
      _this._state = (t2 | 32) >>> 0;
      _this._zone.runUnaryGuarded$1$2(_this._async$_onData, data, t1);
      _this._state = (_this._state & 4294967263) >>> 0;
      _this._checkState$1((t2 & 4) !== 0);
    },
    _sendError$2(error, stackTrace) {
      var cancelFuture, _this = this,
        t1 = _this._state,
        t2 = new A._BufferingStreamSubscription__sendError_sendError(_this, error, stackTrace);
      if ((t1 & 1) !== 0) {
        _this._state = (t1 | 16) >>> 0;
        _this._cancel$0();
        cancelFuture = _this._cancelFuture;
        if (cancelFuture != null && cancelFuture !== $.$get$Future__nullFuture())
          cancelFuture.whenComplete$1(t2);
        else
          t2.call$0();
      } else {
        t2.call$0();
        _this._checkState$1((t1 & 4) !== 0);
      }
    },
    _sendDone$0() {
      var cancelFuture, _this = this,
        t1 = new A._BufferingStreamSubscription__sendDone_sendDone(_this);
      _this._cancel$0();
      _this._state = (_this._state | 16) >>> 0;
      cancelFuture = _this._cancelFuture;
      if (cancelFuture != null && cancelFuture !== $.$get$Future__nullFuture())
        cancelFuture.whenComplete$1(t1);
      else
        t1.call$0();
    },
    _guardCallback$1(callback) {
      var t1, _this = this;
      type$.void_Function._as(callback);
      t1 = _this._state;
      _this._state = (t1 | 32) >>> 0;
      callback.call$0();
      _this._state = (_this._state & 4294967263) >>> 0;
      _this._checkState$1((t1 & 4) !== 0);
    },
    _checkState$1(wasInputPaused) {
      var t2, isInputPaused, _this = this,
        t1 = _this._state;
      if ((t1 & 64) !== 0 && _this._pending.lastPendingEvent == null) {
        t1 = _this._state = (t1 & 4294967231) >>> 0;
        if ((t1 & 4) !== 0)
          if (t1 < 128) {
            t2 = _this._pending;
            t2 = t2 == null ? null : t2.lastPendingEvent == null;
            t2 = t2 !== false;
          } else
            t2 = false;
        else
          t2 = false;
        if (t2) {
          t1 = (t1 & 4294967291) >>> 0;
          _this._state = t1;
        }
      }
      for (; true; wasInputPaused = isInputPaused) {
        if ((t1 & 8) !== 0) {
          _this.set$_pending(null);
          return;
        }
        isInputPaused = (t1 & 4) !== 0;
        if (wasInputPaused === isInputPaused)
          break;
        _this._state = (t1 ^ 32) >>> 0;
        if (isInputPaused)
          _this._onPause$0();
        else
          _this._onResume$0();
        t1 = (_this._state & 4294967263) >>> 0;
        _this._state = t1;
      }
      if ((t1 & 64) !== 0 && t1 < 128)
        _this._pending.schedule$1(_this);
    },
    set$_async$_onData(_onData) {
      this._async$_onData = A._instanceType(this)._eval$1("~(_BufferingStreamSubscription.T)")._as(_onData);
    },
    set$_onDone(_onDone) {
      this._onDone = type$.void_Function._as(_onDone);
    },
    set$_pending(_pending) {
      this._pending = A._instanceType(this)._eval$1("_PendingEvents<_BufferingStreamSubscription.T>?")._as(_pending);
    },
    $isStreamSubscription: 1,
    $is_EventSink: 1,
    $is_EventDispatch: 1
  };
  A._BufferingStreamSubscription_asFuture_closure.prototype = {
    call$0() {
      this.result._complete$1(this._box_0.resultValue);
    },
    $signature: 0
  };
  A._BufferingStreamSubscription_asFuture_closure0.prototype = {
    call$2(error, stackTrace) {
      var cancelFuture, t1;
      type$.StackTrace._as(stackTrace);
      cancelFuture = this.$this.cancel$0(0);
      t1 = this.result;
      if (cancelFuture != $.$get$Future__nullFuture())
        cancelFuture.whenComplete$1(new A._BufferingStreamSubscription_asFuture__closure(t1, error, stackTrace));
      else
        t1._completeError$2(error, stackTrace);
    },
    $signature: 9
  };
  A._BufferingStreamSubscription_asFuture__closure.prototype = {
    call$0() {
      this.result._completeError$2(this.error, this.stackTrace);
    },
    $signature: 2
  };
  A._BufferingStreamSubscription__sendError_sendError.prototype = {
    call$0() {
      var onError, t3, t4,
        t1 = this.$this,
        t2 = t1._state;
      if ((t2 & 8) !== 0 && (t2 & 16) === 0)
        return;
      t1._state = (t2 | 32) >>> 0;
      onError = t1._onError;
      t2 = this.error;
      t3 = type$.Object;
      t4 = t1._zone;
      if (type$.void_Function_Object_StackTrace._is(onError))
        t4.runBinaryGuarded$2$3(onError, t2, this.stackTrace, t3, type$.StackTrace);
      else
        t4.runUnaryGuarded$1$2(type$.void_Function_Object._as(onError), t2, t3);
      t1._state = (t1._state & 4294967263) >>> 0;
    },
    $signature: 0
  };
  A._BufferingStreamSubscription__sendDone_sendDone.prototype = {
    call$0() {
      var t1 = this.$this,
        t2 = t1._state;
      if ((t2 & 16) === 0)
        return;
      t1._state = (t2 | 42) >>> 0;
      t1._zone.runGuarded$1(t1._onDone);
      t1._state = (t1._state & 4294967263) >>> 0;
    },
    $signature: 0
  };
  A._StreamImpl.prototype = {
    listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError) {
      var t1 = this.$ti;
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      return this._controller._subscribe$4(t1._eval$1("~(1)?")._as(onData), onError, onDone, cancelOnError === true);
    },
    listen$2$onError(onData, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, onError);
    },
    listen$3$onDone$onError(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    },
    listen$2$cancelOnError(onData, cancelOnError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, cancelOnError, null, null);
    },
    listen$2$onDone(onData, onDone) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, null);
    }
  };
  A._DelayedEvent.prototype = {
    set$next(_, next) {
      this.next = type$.nullable__DelayedEvent_dynamic._as(next);
    },
    get$next(receiver) {
      return this.next;
    }
  };
  A._DelayedData.prototype = {
    perform$1(dispatch) {
      this.$ti._eval$1("_EventDispatch<1>")._as(dispatch)._sendData$1(this.value);
    }
  };
  A._DelayedError.prototype = {
    perform$1(dispatch) {
      dispatch._sendError$2(this.error, this.stackTrace);
    }
  };
  A._DelayedDone.prototype = {
    perform$1(dispatch) {
      dispatch._sendDone$0();
    },
    get$next(_) {
      return null;
    },
    set$next(_, _0) {
      throw A.wrapException(A.StateError$("No events after a done."));
    },
    $is_DelayedEvent: 1
  };
  A._PendingEvents.prototype = {
    schedule$1(dispatch) {
      var t1, _this = this;
      _this.$ti._eval$1("_EventDispatch<1>")._as(dispatch);
      t1 = _this._state;
      if (t1 === 1)
        return;
      if (t1 >= 1) {
        _this._state = 1;
        return;
      }
      A.scheduleMicrotask(new A._PendingEvents_schedule_closure(_this, dispatch));
      _this._state = 1;
    }
  };
  A._PendingEvents_schedule_closure.prototype = {
    call$0() {
      var t2, $event, nextEvent,
        t1 = this.$this,
        oldState = t1._state;
      t1._state = 0;
      if (oldState === 3)
        return;
      t2 = t1.$ti._eval$1("_EventDispatch<1>")._as(this.dispatch);
      $event = t1.firstPendingEvent;
      nextEvent = $event.get$next($event);
      t1.firstPendingEvent = nextEvent;
      if (nextEvent == null)
        t1.lastPendingEvent = null;
      $event.perform$1(t2);
    },
    $signature: 0
  };
  A._StreamImplEvents.prototype = {
    add$1(_, $event) {
      var _this = this,
        lastEvent = _this.lastPendingEvent;
      if (lastEvent == null)
        _this.firstPendingEvent = _this.lastPendingEvent = $event;
      else {
        lastEvent.set$next(0, $event);
        _this.lastPendingEvent = $event;
      }
    }
  };
  A._StreamIterator.prototype = {};
  A._cancelAndValue_closure.prototype = {
    call$0() {
      return this.future._complete$1(this.value);
    },
    $signature: 0
  };
  A._ForwardingStream.prototype = {
    listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError) {
      var t2, t3, t4, t5, t6, t7,
        t1 = this.$ti;
      t1._eval$1("~(2)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      t2 = t1._rest[1];
      t3 = $.Zone__current;
      t4 = cancelOnError === true ? 1 : 0;
      t5 = A._BufferingStreamSubscription__registerDataHandler(t3, onData, t2);
      t6 = A._BufferingStreamSubscription__registerErrorHandler(t3, onError);
      t7 = onDone == null ? A.async___nullDoneHandler$closure() : onDone;
      t2 = new A._ForwardingStreamSubscription(this, t5, t6, t3.registerCallback$1$1(t7, type$.void), t3, t4, t1._eval$1("@<1>")._bind$1(t2)._eval$1("_ForwardingStreamSubscription<1,2>"));
      t2.set$_subscription(this._source.listen$3$onDone$onError(t2.get$_handleData(), t2.get$_handleDone(), t2.get$_handleError()));
      return t2;
    },
    listen$2$onError(onData, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, onError);
    },
    listen$3$onDone$onError(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    }
  };
  A._ForwardingStreamSubscription.prototype = {
    _add$1(_, data) {
      this.$ti._rest[1]._as(data);
      if ((this._state & 2) !== 0)
        return;
      this.super$_BufferingStreamSubscription$_add(0, data);
    },
    _addError$2(error, stackTrace) {
      if ((this._state & 2) !== 0)
        return;
      this.super$_BufferingStreamSubscription$_addError(error, stackTrace);
    },
    _onPause$0() {
      var t1 = this._subscription;
      if (t1 != null)
        t1.pause$0(0);
    },
    _onResume$0() {
      var t1 = this._subscription;
      if (t1 != null)
        t1.resume$0(0);
    },
    _onCancel$0() {
      var subscription = this._subscription;
      if (subscription != null) {
        this.set$_subscription(null);
        return subscription.cancel$0(0);
      }
      return null;
    },
    _handleData$1(data) {
      this._stream._handleData$2(this.$ti._precomputed1._as(data), this);
    },
    _handleError$2(error, stackTrace) {
      type$.StackTrace._as(stackTrace);
      this._stream.$ti._eval$1("_EventSink<2>")._as(this)._addError$2(error, stackTrace);
    },
    _handleDone$0() {
      this._stream.$ti._eval$1("_EventSink<2>")._as(this)._close$0();
    },
    set$_subscription(_subscription) {
      this._subscription = this.$ti._eval$1("StreamSubscription<1>?")._as(_subscription);
    }
  };
  A._MapStream.prototype = {
    _handleData$2(inputEvent, sink) {
      var outputEvent, e, s, exception, error, stackTrace, replacement,
        t1 = this.$ti;
      t1._precomputed1._as(inputEvent);
      t1._eval$1("_EventSink<2>")._as(sink);
      outputEvent = null;
      try {
        outputEvent = this._transform.call$1(inputEvent);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        error = e;
        stackTrace = s;
        replacement = $.Zone__current.errorCallback$2(error, stackTrace);
        if (replacement != null) {
          error = replacement.error;
          stackTrace = replacement.stackTrace;
        }
        sink._addError$2(error, stackTrace);
        return;
      }
      sink._add$1(0, outputEvent);
    }
  };
  A._ZoneFunction.prototype = {};
  A._RunNullaryZoneFunction.prototype = {};
  A._RunUnaryZoneFunction.prototype = {};
  A._RunBinaryZoneFunction.prototype = {};
  A._RegisterNullaryZoneFunction.prototype = {};
  A._RegisterUnaryZoneFunction.prototype = {};
  A._RegisterBinaryZoneFunction.prototype = {};
  A._ZoneSpecification.prototype = {$isZoneSpecification: 1};
  A._ZoneDelegate.prototype = {$isZoneDelegate: 1};
  A._Zone.prototype = {
    _processUncaughtError$3(zone, error, stackTrace) {
      var implZone, handler, parentDelegate, parentZone, currentZone, e, s, implementation, t1, exception;
      type$.StackTrace._as(stackTrace);
      implementation = this.get$_handleUncaughtError();
      implZone = implementation.zone;
      if (implZone === B.C__RootZone) {
        A._rootHandleError(error, stackTrace);
        return;
      }
      handler = implementation.$function;
      parentDelegate = implZone.get$_parentDelegate();
      t1 = J.get$parent$z(implZone);
      t1.toString;
      parentZone = t1;
      currentZone = $.Zone__current;
      try {
        $.Zone__current = parentZone;
        handler.call$5(implZone, parentDelegate, zone, error, stackTrace);
        $.Zone__current = currentZone;
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        $.Zone__current = currentZone;
        t1 = e;
        t1 = (error == null ? t1 == null : error === t1) ? stackTrace : s;
        parentZone._processUncaughtError$3(implZone, e, t1);
      }
    },
    $isZone: 1
  };
  A._CustomZone.prototype = {
    get$_delegate() {
      var t1 = this._delegateCache;
      return t1 == null ? this._delegateCache = new A._ZoneDelegate(this) : t1;
    },
    get$_parentDelegate() {
      return this.parent.get$_delegate();
    },
    get$errorZone() {
      return this._handleUncaughtError.zone;
    },
    runGuarded$1(f) {
      var e, s, exception;
      type$.void_Function._as(f);
      try {
        this.run$1$1(f, type$.void);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        this._processUncaughtError$3(this, e, type$.StackTrace._as(s));
      }
    },
    runUnaryGuarded$1$2(f, arg, $T) {
      var e, s, exception;
      $T._eval$1("~(0)")._as(f);
      $T._as(arg);
      try {
        this.runUnary$2$2(f, arg, type$.void, $T);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        this._processUncaughtError$3(this, e, type$.StackTrace._as(s));
      }
    },
    runBinaryGuarded$2$3(f, arg1, arg2, T1, T2) {
      var e, s, exception;
      T1._eval$1("@<0>")._bind$1(T2)._eval$1("~(1,2)")._as(f);
      T1._as(arg1);
      T2._as(arg2);
      try {
        this.runBinary$3$3(f, arg1, arg2, type$.void, T1, T2);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        this._processUncaughtError$3(this, e, type$.StackTrace._as(s));
      }
    },
    bindCallback$1$1(f, $R) {
      return new A._CustomZone_bindCallback_closure(this, this.registerCallback$1$1($R._eval$1("0()")._as(f), $R), $R);
    },
    bindUnaryCallback$2$1(f, $R, $T) {
      return new A._CustomZone_bindUnaryCallback_closure(this, this.registerUnaryCallback$2$1($R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f), $R, $T), $T, $R);
    },
    bindCallbackGuarded$1(f) {
      return new A._CustomZone_bindCallbackGuarded_closure(this, this.registerCallback$1$1(type$.void_Function._as(f), type$.void));
    },
    bindUnaryCallbackGuarded$1$1(f, $T) {
      return new A._CustomZone_bindUnaryCallbackGuarded_closure(this, this.registerUnaryCallback$2$1($T._eval$1("~(0)")._as(f), type$.void, $T), $T);
    },
    $index(_, key) {
      var value,
        t1 = this._async$_map,
        result = t1.$index(0, key);
      if (result != null || t1.containsKey$1(0, key))
        return result;
      value = this.parent.$index(0, key);
      if (value != null)
        t1.$indexSet(0, key, value);
      return value;
    },
    handleUncaughtError$2(error, stackTrace) {
      this._processUncaughtError$3(this, error, type$.StackTrace._as(stackTrace));
    },
    fork$2$specification$zoneValues(specification, zoneValues) {
      var implementation = this._fork,
        t1 = implementation.zone;
      return implementation.$function.call$5(t1, t1.get$_parentDelegate(), this, specification, zoneValues);
    },
    run$1$1(f, $R) {
      var implementation, t1;
      $R._eval$1("0()")._as(f);
      implementation = this._run;
      t1 = implementation.zone;
      return implementation.$function.call$1$4(t1, t1.get$_parentDelegate(), this, f, $R);
    },
    runUnary$2$2(f, arg, $R, $T) {
      var implementation, t1;
      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
      $T._as(arg);
      implementation = this._runUnary;
      t1 = implementation.zone;
      return implementation.$function.call$2$5(t1, t1.get$_parentDelegate(), this, f, arg, $R, $T);
    },
    runBinary$3$3(f, arg1, arg2, $R, T1, T2) {
      var implementation, t1;
      $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
      T1._as(arg1);
      T2._as(arg2);
      implementation = this._runBinary;
      t1 = implementation.zone;
      return implementation.$function.call$3$6(t1, t1.get$_parentDelegate(), this, f, arg1, arg2, $R, T1, T2);
    },
    registerCallback$1$1(callback, $R) {
      var implementation, t1;
      $R._eval$1("0()")._as(callback);
      implementation = this._registerCallback;
      t1 = implementation.zone;
      return implementation.$function.call$1$4(t1, t1.get$_parentDelegate(), this, callback, $R);
    },
    registerUnaryCallback$2$1(callback, $R, $T) {
      var implementation, t1;
      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(callback);
      implementation = this._registerUnaryCallback;
      t1 = implementation.zone;
      return implementation.$function.call$2$4(t1, t1.get$_parentDelegate(), this, callback, $R, $T);
    },
    registerBinaryCallback$3$1(callback, $R, T1, T2) {
      var implementation, t1;
      $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(callback);
      implementation = this._registerBinaryCallback;
      t1 = implementation.zone;
      return implementation.$function.call$3$4(t1, t1.get$_parentDelegate(), this, callback, $R, T1, T2);
    },
    errorCallback$2(error, stackTrace) {
      var implementation, implementationZone;
      type$.nullable_StackTrace._as(stackTrace);
      A.checkNotNullable(error, "error", type$.Object);
      implementation = this._errorCallback;
      implementationZone = implementation.zone;
      if (implementationZone === B.C__RootZone)
        return null;
      return implementation.$function.call$5(implementationZone, implementationZone.get$_parentDelegate(), this, error, stackTrace);
    },
    scheduleMicrotask$1(f) {
      var implementation, t1;
      type$.void_Function._as(f);
      implementation = this._scheduleMicrotask;
      t1 = implementation.zone;
      return implementation.$function.call$4(t1, t1.get$_parentDelegate(), this, f);
    },
    createTimer$2(duration, f) {
      var implementation, t1;
      type$.void_Function._as(f);
      implementation = this._createTimer;
      t1 = implementation.zone;
      return implementation.$function.call$5(t1, t1.get$_parentDelegate(), this, duration, f);
    },
    print$1(_, line) {
      var implementation = this._print,
        t1 = implementation.zone;
      return implementation.$function.call$4(t1, t1.get$_parentDelegate(), this, line);
    },
    set$_handleUncaughtError(_handleUncaughtError) {
      this._handleUncaughtError = type$._ZoneFunction_of_void_Function_Zone_ZoneDelegate_Zone_Object_StackTrace._as(_handleUncaughtError);
    },
    get$_run() {
      return this._run;
    },
    get$_runUnary() {
      return this._runUnary;
    },
    get$_runBinary() {
      return this._runBinary;
    },
    get$_registerCallback() {
      return this._registerCallback;
    },
    get$_registerUnaryCallback() {
      return this._registerUnaryCallback;
    },
    get$_registerBinaryCallback() {
      return this._registerBinaryCallback;
    },
    get$_errorCallback() {
      return this._errorCallback;
    },
    get$_scheduleMicrotask() {
      return this._scheduleMicrotask;
    },
    get$_createTimer() {
      return this._createTimer;
    },
    get$_createPeriodicTimer() {
      return this._createPeriodicTimer;
    },
    get$_print() {
      return this._print;
    },
    get$_fork() {
      return this._fork;
    },
    get$_handleUncaughtError() {
      return this._handleUncaughtError;
    },
    get$parent(receiver) {
      return this.parent;
    },
    get$_async$_map() {
      return this._async$_map;
    }
  };
  A._CustomZone_bindCallback_closure.prototype = {
    call$0() {
      return this.$this.run$1$1(this.registered, this.R);
    },
    $signature() {
      return this.R._eval$1("0()");
    }
  };
  A._CustomZone_bindUnaryCallback_closure.prototype = {
    call$1(arg) {
      var _this = this,
        t1 = _this.T;
      return _this.$this.runUnary$2$2(_this.registered, t1._as(arg), _this.R, t1);
    },
    $signature() {
      return this.R._eval$1("@<0>")._bind$1(this.T)._eval$1("1(2)");
    }
  };
  A._CustomZone_bindCallbackGuarded_closure.prototype = {
    call$0() {
      return this.$this.runGuarded$1(this.registered);
    },
    $signature: 0
  };
  A._CustomZone_bindUnaryCallbackGuarded_closure.prototype = {
    call$1(arg) {
      var t1 = this.T;
      return this.$this.runUnaryGuarded$1$2(this.registered, t1._as(arg), t1);
    },
    $signature() {
      return this.T._eval$1("~(0)");
    }
  };
  A._rootHandleError_closure.prototype = {
    call$0() {
      A.Error_throwWithStackTrace(this.error, this.stackTrace);
      A.ReachabilityError$(string$._null_);
    },
    $signature: 0
  };
  A._RootZone.prototype = {
    get$_run() {
      return B._RunNullaryZoneFunction__RootZone__rootRun;
    },
    get$_runUnary() {
      return B._RunUnaryZoneFunction__RootZone__rootRunUnary;
    },
    get$_runBinary() {
      return B._RunBinaryZoneFunction__RootZone__rootRunBinary;
    },
    get$_registerCallback() {
      return B._RegisterNullaryZoneFunction__RootZone__rootRegisterCallback;
    },
    get$_registerUnaryCallback() {
      return B._RegisterUnaryZoneFunction_Bqo;
    },
    get$_registerBinaryCallback() {
      return B._RegisterBinaryZoneFunction_kGu;
    },
    get$_errorCallback() {
      return B._ZoneFunction__RootZone__rootErrorCallback;
    },
    get$_scheduleMicrotask() {
      return B._ZoneFunction__RootZone__rootScheduleMicrotask;
    },
    get$_createTimer() {
      return B._ZoneFunction__RootZone__rootCreateTimer;
    },
    get$_createPeriodicTimer() {
      return B._ZoneFunction_3bB;
    },
    get$_print() {
      return B._ZoneFunction__RootZone__rootPrint;
    },
    get$_fork() {
      return B._ZoneFunction__RootZone__rootFork;
    },
    get$_handleUncaughtError() {
      return B._ZoneFunction_NMc;
    },
    get$parent(_) {
      return null;
    },
    get$_async$_map() {
      return $.$get$_RootZone__rootMap();
    },
    get$_delegate() {
      var t1 = $._RootZone__rootDelegate;
      return t1 == null ? $._RootZone__rootDelegate = new A._ZoneDelegate(this) : t1;
    },
    get$_parentDelegate() {
      var t1 = $._RootZone__rootDelegate;
      return t1 == null ? $._RootZone__rootDelegate = new A._ZoneDelegate(this) : t1;
    },
    get$errorZone() {
      return this;
    },
    runGuarded$1(f) {
      var e, s, exception;
      type$.void_Function._as(f);
      try {
        if (B.C__RootZone === $.Zone__current) {
          f.call$0();
          return;
        }
        A._rootRun(null, null, this, f, type$.void);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A._rootHandleError(e, type$.StackTrace._as(s));
      }
    },
    runUnaryGuarded$1$2(f, arg, $T) {
      var e, s, exception;
      $T._eval$1("~(0)")._as(f);
      $T._as(arg);
      try {
        if (B.C__RootZone === $.Zone__current) {
          f.call$1(arg);
          return;
        }
        A._rootRunUnary(null, null, this, f, arg, type$.void, $T);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A._rootHandleError(e, type$.StackTrace._as(s));
      }
    },
    runBinaryGuarded$2$3(f, arg1, arg2, T1, T2) {
      var e, s, exception;
      T1._eval$1("@<0>")._bind$1(T2)._eval$1("~(1,2)")._as(f);
      T1._as(arg1);
      T2._as(arg2);
      try {
        if (B.C__RootZone === $.Zone__current) {
          f.call$2(arg1, arg2);
          return;
        }
        A._rootRunBinary(null, null, this, f, arg1, arg2, type$.void, T1, T2);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A._rootHandleError(e, type$.StackTrace._as(s));
      }
    },
    bindCallback$1$1(f, $R) {
      return new A._RootZone_bindCallback_closure(this, $R._eval$1("0()")._as(f), $R);
    },
    bindUnaryCallback$2$1(f, $R, $T) {
      return new A._RootZone_bindUnaryCallback_closure(this, $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f), $T, $R);
    },
    bindCallbackGuarded$1(f) {
      return new A._RootZone_bindCallbackGuarded_closure(this, type$.void_Function._as(f));
    },
    bindUnaryCallbackGuarded$1$1(f, $T) {
      return new A._RootZone_bindUnaryCallbackGuarded_closure(this, $T._eval$1("~(0)")._as(f), $T);
    },
    $index(_, key) {
      return null;
    },
    handleUncaughtError$2(error, stackTrace) {
      A._rootHandleError(error, type$.StackTrace._as(stackTrace));
    },
    fork$2$specification$zoneValues(specification, zoneValues) {
      return A._rootFork(null, null, this, specification, zoneValues);
    },
    run$1$1(f, $R) {
      $R._eval$1("0()")._as(f);
      if ($.Zone__current === B.C__RootZone)
        return f.call$0();
      return A._rootRun(null, null, this, f, $R);
    },
    runUnary$2$2(f, arg, $R, $T) {
      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
      $T._as(arg);
      if ($.Zone__current === B.C__RootZone)
        return f.call$1(arg);
      return A._rootRunUnary(null, null, this, f, arg, $R, $T);
    },
    runBinary$3$3(f, arg1, arg2, $R, T1, T2) {
      $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
      T1._as(arg1);
      T2._as(arg2);
      if ($.Zone__current === B.C__RootZone)
        return f.call$2(arg1, arg2);
      return A._rootRunBinary(null, null, this, f, arg1, arg2, $R, T1, T2);
    },
    registerCallback$1$1(f, $R) {
      return $R._eval$1("0()")._as(f);
    },
    registerUnaryCallback$2$1(f, $R, $T) {
      return $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
    },
    registerBinaryCallback$3$1(f, $R, T1, T2) {
      return $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
    },
    errorCallback$2(error, stackTrace) {
      type$.nullable_StackTrace._as(stackTrace);
      return null;
    },
    scheduleMicrotask$1(f) {
      A._rootScheduleMicrotask(null, null, this, type$.void_Function._as(f));
    },
    createTimer$2(duration, f) {
      return A.Timer__createTimer(duration, type$.void_Function._as(f));
    },
    print$1(_, line) {
      A.printString(line);
    }
  };
  A._RootZone_bindCallback_closure.prototype = {
    call$0() {
      return this.$this.run$1$1(this.f, this.R);
    },
    $signature() {
      return this.R._eval$1("0()");
    }
  };
  A._RootZone_bindUnaryCallback_closure.prototype = {
    call$1(arg) {
      var _this = this,
        t1 = _this.T;
      return _this.$this.runUnary$2$2(_this.f, t1._as(arg), _this.R, t1);
    },
    $signature() {
      return this.R._eval$1("@<0>")._bind$1(this.T)._eval$1("1(2)");
    }
  };
  A._RootZone_bindCallbackGuarded_closure.prototype = {
    call$0() {
      return this.$this.runGuarded$1(this.f);
    },
    $signature: 0
  };
  A._RootZone_bindUnaryCallbackGuarded_closure.prototype = {
    call$1(arg) {
      var t1 = this.T;
      return this.$this.runUnaryGuarded$1$2(this.f, t1._as(arg), t1);
    },
    $signature() {
      return this.T._eval$1("~(0)");
    }
  };
  A.runZonedGuarded_closure.prototype = {
    call$5($self, $parent, zone, error, stackTrace) {
      var e, s, exception, t2, t3,
        t1 = type$.StackTrace;
      t1._as(stackTrace);
      try {
        this.parentZone.runBinary$3$3(this.onError, error, stackTrace, type$.void, type$.Object, t1);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        t2 = e;
        t3 = $parent._delegationTarget;
        if (t2 == null ? error == null : t2 === error)
          t3._processUncaughtError$3(zone, error, stackTrace);
        else
          t3._processUncaughtError$3(zone, e, t1._as(s));
      }
    },
    $signature: 80
  };
  A._HashMap.prototype = {
    get$length(_) {
      return this._collection$_length;
    },
    get$isEmpty(_) {
      return this._collection$_length === 0;
    },
    get$keys(_) {
      return new A._HashMapKeyIterable(this, A._instanceType(this)._eval$1("_HashMapKeyIterable<1>"));
    },
    containsKey$1(_, key) {
      var strings, nums;
      if (typeof key == "string" && key !== "__proto__") {
        strings = this._collection$_strings;
        return strings == null ? false : strings[key] != null;
      } else if (typeof key == "number" && (key & 1073741823) === key) {
        nums = this._collection$_nums;
        return nums == null ? false : nums[key] != null;
      } else
        return this._containsKey$1(key);
    },
    _containsKey$1(key) {
      var rest = this._collection$_rest;
      if (rest == null)
        return false;
      return this._findBucketIndex$2(this._getBucket$2(rest, key), key) >= 0;
    },
    $index(_, key) {
      var strings, t1, nums;
      if (typeof key == "string" && key !== "__proto__") {
        strings = this._collection$_strings;
        t1 = strings == null ? null : A._HashMap__getTableEntry(strings, key);
        return t1;
      } else if (typeof key == "number" && (key & 1073741823) === key) {
        nums = this._collection$_nums;
        t1 = nums == null ? null : A._HashMap__getTableEntry(nums, key);
        return t1;
      } else
        return this._get$1(0, key);
    },
    _get$1(_, key) {
      var bucket, index,
        rest = this._collection$_rest;
      if (rest == null)
        return null;
      bucket = this._getBucket$2(rest, key);
      index = this._findBucketIndex$2(bucket, key);
      return index < 0 ? null : bucket[index + 1];
    },
    $indexSet(_, key, value) {
      var strings, nums, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      if (typeof key == "string" && key !== "__proto__") {
        strings = _this._collection$_strings;
        _this._collection$_addHashTableEntry$3(strings == null ? _this._collection$_strings = A._HashMap__newHashTable() : strings, key, value);
      } else if (typeof key == "number" && (key & 1073741823) === key) {
        nums = _this._collection$_nums;
        _this._collection$_addHashTableEntry$3(nums == null ? _this._collection$_nums = A._HashMap__newHashTable() : nums, key, value);
      } else
        _this._set$2(key, value);
    },
    _set$2(key, value) {
      var rest, hash, bucket, index, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      rest = _this._collection$_rest;
      if (rest == null)
        rest = _this._collection$_rest = A._HashMap__newHashTable();
      hash = _this._computeHashCode$1(key);
      bucket = rest[hash];
      if (bucket == null) {
        A._HashMap__setTableEntry(rest, hash, [key, value]);
        ++_this._collection$_length;
        _this._keys = null;
      } else {
        index = _this._findBucketIndex$2(bucket, key);
        if (index >= 0)
          bucket[index + 1] = value;
        else {
          bucket.push(key, value);
          ++_this._collection$_length;
          _this._keys = null;
        }
      }
    },
    forEach$1(_, action) {
      var keys, $length, i, key, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("~(1,2)")._as(action);
      keys = _this._computeKeys$0();
      for ($length = keys.length, t1 = t1._precomputed1, i = 0; i < $length; ++i) {
        key = keys[i];
        action.call$2(t1._as(key), _this.$index(0, key));
        if (keys !== _this._keys)
          throw A.wrapException(A.ConcurrentModificationError$(_this));
      }
    },
    _computeKeys$0() {
      var strings, names, entries, index, i, nums, rest, bucket, $length, i0, _this = this,
        result = _this._keys;
      if (result != null)
        return result;
      result = A.List_List$filled(_this._collection$_length, null, false, type$.dynamic);
      strings = _this._collection$_strings;
      if (strings != null) {
        names = Object.getOwnPropertyNames(strings);
        entries = names.length;
        for (index = 0, i = 0; i < entries; ++i) {
          result[index] = names[i];
          ++index;
        }
      } else
        index = 0;
      nums = _this._collection$_nums;
      if (nums != null) {
        names = Object.getOwnPropertyNames(nums);
        entries = names.length;
        for (i = 0; i < entries; ++i) {
          result[index] = +names[i];
          ++index;
        }
      }
      rest = _this._collection$_rest;
      if (rest != null) {
        names = Object.getOwnPropertyNames(rest);
        entries = names.length;
        for (i = 0; i < entries; ++i) {
          bucket = rest[names[i]];
          $length = bucket.length;
          for (i0 = 0; i0 < $length; i0 += 2) {
            result[index] = bucket[i0];
            ++index;
          }
        }
      }
      return _this._keys = result;
    },
    _collection$_addHashTableEntry$3(table, key, value) {
      var t1 = A._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      if (table[key] == null) {
        ++this._collection$_length;
        this._keys = null;
      }
      A._HashMap__setTableEntry(table, key, value);
    },
    _computeHashCode$1(key) {
      return J.get$hashCode$(key) & 1073741823;
    },
    _getBucket$2(table, key) {
      return table[this._computeHashCode$1(key)];
    },
    _findBucketIndex$2(bucket, key) {
      var $length, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; i += 2)
        if (J.$eq$(bucket[i], key))
          return i;
      return -1;
    },
    $isHashMap: 1
  };
  A._IdentityHashMap.prototype = {
    _computeHashCode$1(key) {
      return A.objectHashCode(key) & 1073741823;
    },
    _findBucketIndex$2(bucket, key) {
      var $length, i, t1;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; i += 2) {
        t1 = bucket[i];
        if (t1 == null ? key == null : t1 === key)
          return i;
      }
      return -1;
    }
  };
  A._CustomHashMap.prototype = {
    $index(_, key) {
      if (!A.boolConversionCheck(this._validKey.call$1(key)))
        return null;
      return this.super$_HashMap$_get(0, key);
    },
    $indexSet(_, key, value) {
      var t1 = this.$ti;
      this.super$_HashMap$_set(t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    containsKey$1(_, key) {
      if (!A.boolConversionCheck(this._validKey.call$1(key)))
        return false;
      return this.super$_HashMap$_containsKey(key);
    },
    _computeHashCode$1(key) {
      return this._hashCode.call$1(this.$ti._precomputed1._as(key)) & 1073741823;
    },
    _findBucketIndex$2(bucket, key) {
      var $length, t1, t2, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (t1 = this.$ti._precomputed1, t2 = this._equals, i = 0; i < $length; i += 2)
        if (A.boolConversionCheck(t2.call$2(bucket[i], t1._as(key))))
          return i;
      return -1;
    }
  };
  A._CustomHashMap_closure.prototype = {
    call$1(v) {
      return this.K._is(v);
    },
    $signature: 11
  };
  A._HashMapKeyIterable.prototype = {
    get$length(_) {
      return this._collection$_map._collection$_length;
    },
    get$isEmpty(_) {
      return this._collection$_map._collection$_length === 0;
    },
    get$iterator(_) {
      var t1 = this._collection$_map;
      return new A._HashMapKeyIterator(t1, t1._computeKeys$0(), this.$ti._eval$1("_HashMapKeyIterator<1>"));
    },
    contains$1(_, element) {
      return this._collection$_map.containsKey$1(0, element);
    }
  };
  A._HashMapKeyIterator.prototype = {
    get$current(_) {
      return this._collection$_current;
    },
    moveNext$0() {
      var _this = this,
        keys = _this._keys,
        offset = _this._offset,
        t1 = _this._collection$_map;
      if (keys !== t1._keys)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      else if (offset >= keys.length) {
        _this.set$_collection$_current(null);
        return false;
      } else {
        _this.set$_collection$_current(keys[offset]);
        _this._offset = offset + 1;
        return true;
      }
    },
    set$_collection$_current(_current) {
      this._collection$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A._LinkedIdentityHashMap.prototype = {
    internalComputeHashCode$1(key) {
      return A.objectHashCode(key) & 1073741823;
    },
    internalFindBucketIndex$2(bucket, key) {
      var $length, i, t1;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; ++i) {
        t1 = bucket[i].hashMapCellKey;
        if (t1 == null ? key == null : t1 === key)
          return i;
      }
      return -1;
    }
  };
  A._LinkedCustomHashMap.prototype = {
    $index(_, key) {
      if (!A.boolConversionCheck(this._validKey.call$1(key)))
        return null;
      return this.super$JsLinkedHashMap$internalGet(key);
    },
    $indexSet(_, key, value) {
      var t1 = this.$ti;
      this.super$JsLinkedHashMap$internalSet(t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    containsKey$1(_, key) {
      if (!A.boolConversionCheck(this._validKey.call$1(key)))
        return false;
      return this.super$JsLinkedHashMap$internalContainsKey(key);
    },
    remove$1(_, key) {
      if (!A.boolConversionCheck(this._validKey.call$1(key)))
        return null;
      return this.super$JsLinkedHashMap$internalRemove(key);
    },
    internalComputeHashCode$1(key) {
      return this._hashCode.call$1(this.$ti._precomputed1._as(key)) & 1073741823;
    },
    internalFindBucketIndex$2(bucket, key) {
      var $length, t1, t2, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (t1 = this.$ti._precomputed1, t2 = this._equals, i = 0; i < $length; ++i)
        if (A.boolConversionCheck(t2.call$2(t1._as(bucket[i].hashMapCellKey), t1._as(key))))
          return i;
      return -1;
    }
  };
  A._LinkedCustomHashMap_closure.prototype = {
    call$1(v) {
      return this.K._is(v);
    },
    $signature: 11
  };
  A._HashSet.prototype = {
    get$iterator(_) {
      return new A._HashSetIterator(this, this._computeElements$0(), A._instanceType(this)._eval$1("_HashSetIterator<1>"));
    },
    get$length(_) {
      return this._collection$_length;
    },
    get$isEmpty(_) {
      return this._collection$_length === 0;
    },
    get$isNotEmpty(_) {
      return this._collection$_length !== 0;
    },
    contains$1(_, object) {
      var strings, nums;
      if (typeof object == "string" && object !== "__proto__") {
        strings = this._collection$_strings;
        return strings == null ? false : strings[object] != null;
      } else if (typeof object == "number" && (object & 1073741823) === object) {
        nums = this._collection$_nums;
        return nums == null ? false : nums[object] != null;
      } else
        return this._contains$1(object);
    },
    _contains$1(object) {
      var rest = this._collection$_rest;
      if (rest == null)
        return false;
      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
    },
    add$1(_, element) {
      var strings, nums, _this = this;
      A._instanceType(_this)._precomputed1._as(element);
      if (typeof element == "string" && element !== "__proto__") {
        strings = _this._collection$_strings;
        return _this._collection$_addHashTableEntry$2(strings == null ? _this._collection$_strings = A._HashSet__newHashTable() : strings, element);
      } else if (typeof element == "number" && (element & 1073741823) === element) {
        nums = _this._collection$_nums;
        return _this._collection$_addHashTableEntry$2(nums == null ? _this._collection$_nums = A._HashSet__newHashTable() : nums, element);
      } else
        return _this._collection$_add$1(0, element);
    },
    _collection$_add$1(_, element) {
      var rest, hash, bucket, _this = this;
      A._instanceType(_this)._precomputed1._as(element);
      rest = _this._collection$_rest;
      if (rest == null)
        rest = _this._collection$_rest = A._HashSet__newHashTable();
      hash = _this._computeHashCode$1(element);
      bucket = rest[hash];
      if (bucket == null)
        rest[hash] = [element];
      else {
        if (_this._findBucketIndex$2(bucket, element) >= 0)
          return false;
        bucket.push(element);
      }
      ++_this._collection$_length;
      _this._elements = null;
      return true;
    },
    remove$1(_, object) {
      var _this = this;
      if (typeof object == "string" && object !== "__proto__")
        return _this._collection$_removeHashTableEntry$2(_this._collection$_strings, object);
      else if (typeof object == "number" && (object & 1073741823) === object)
        return _this._collection$_removeHashTableEntry$2(_this._collection$_nums, object);
      else
        return _this._remove$1(0, object);
    },
    _remove$1(_, object) {
      var hash, bucket, index, _this = this,
        rest = _this._collection$_rest;
      if (rest == null)
        return false;
      hash = _this._computeHashCode$1(object);
      bucket = rest[hash];
      index = _this._findBucketIndex$2(bucket, object);
      if (index < 0)
        return false;
      --_this._collection$_length;
      _this._elements = null;
      bucket.splice(index, 1);
      if (0 === bucket.length)
        delete rest[hash];
      return true;
    },
    _computeElements$0() {
      var strings, names, entries, index, i, nums, rest, bucket, $length, i0, _this = this,
        result = _this._elements;
      if (result != null)
        return result;
      result = A.List_List$filled(_this._collection$_length, null, false, type$.dynamic);
      strings = _this._collection$_strings;
      if (strings != null) {
        names = Object.getOwnPropertyNames(strings);
        entries = names.length;
        for (index = 0, i = 0; i < entries; ++i) {
          result[index] = names[i];
          ++index;
        }
      } else
        index = 0;
      nums = _this._collection$_nums;
      if (nums != null) {
        names = Object.getOwnPropertyNames(nums);
        entries = names.length;
        for (i = 0; i < entries; ++i) {
          result[index] = +names[i];
          ++index;
        }
      }
      rest = _this._collection$_rest;
      if (rest != null) {
        names = Object.getOwnPropertyNames(rest);
        entries = names.length;
        for (i = 0; i < entries; ++i) {
          bucket = rest[names[i]];
          $length = bucket.length;
          for (i0 = 0; i0 < $length; ++i0) {
            result[index] = bucket[i0];
            ++index;
          }
        }
      }
      return _this._elements = result;
    },
    _collection$_addHashTableEntry$2(table, element) {
      A._instanceType(this)._precomputed1._as(element);
      if (table[element] != null)
        return false;
      table[element] = 0;
      ++this._collection$_length;
      this._elements = null;
      return true;
    },
    _collection$_removeHashTableEntry$2(table, element) {
      if (table != null && table[element] != null) {
        delete table[element];
        --this._collection$_length;
        this._elements = null;
        return true;
      } else
        return false;
    },
    _computeHashCode$1(element) {
      return J.get$hashCode$(element) & 1073741823;
    },
    _findBucketIndex$2(bucket, element) {
      var $length, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; ++i)
        if (J.$eq$(bucket[i], element))
          return i;
      return -1;
    }
  };
  A._HashSetIterator.prototype = {
    get$current(_) {
      return this._collection$_current;
    },
    moveNext$0() {
      var _this = this,
        elements = _this._elements,
        offset = _this._offset,
        t1 = _this._set;
      if (elements !== t1._elements)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      else if (offset >= elements.length) {
        _this.set$_collection$_current(null);
        return false;
      } else {
        _this.set$_collection$_current(elements[offset]);
        _this._offset = offset + 1;
        return true;
      }
    },
    set$_collection$_current(_current) {
      this._collection$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A._LinkedHashSet.prototype = {
    get$iterator(_) {
      var _this = this,
        t1 = new A._LinkedHashSetIterator(_this, _this._collection$_modifications, A._instanceType(_this)._eval$1("_LinkedHashSetIterator<1>"));
      t1._collection$_cell = _this._collection$_first;
      return t1;
    },
    get$length(_) {
      return this._collection$_length;
    },
    get$isEmpty(_) {
      return this._collection$_length === 0;
    },
    get$isNotEmpty(_) {
      return this._collection$_length !== 0;
    },
    contains$1(_, object) {
      var strings, nums;
      if (typeof object == "string" && object !== "__proto__") {
        strings = this._collection$_strings;
        if (strings == null)
          return false;
        return type$.nullable__LinkedHashSetCell._as(strings[object]) != null;
      } else if (typeof object == "number" && (object & 1073741823) === object) {
        nums = this._collection$_nums;
        if (nums == null)
          return false;
        return type$.nullable__LinkedHashSetCell._as(nums[object]) != null;
      } else
        return this._contains$1(object);
    },
    _contains$1(object) {
      var rest = this._collection$_rest;
      if (rest == null)
        return false;
      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
    },
    get$first(_) {
      var first = this._collection$_first;
      if (first == null)
        throw A.wrapException(A.StateError$("No elements"));
      return A._instanceType(this)._precomputed1._as(first._collection$_element);
    },
    add$1(_, element) {
      var strings, nums, _this = this;
      A._instanceType(_this)._precomputed1._as(element);
      if (typeof element == "string" && element !== "__proto__") {
        strings = _this._collection$_strings;
        return _this._collection$_addHashTableEntry$2(strings == null ? _this._collection$_strings = A._LinkedHashSet__newHashTable() : strings, element);
      } else if (typeof element == "number" && (element & 1073741823) === element) {
        nums = _this._collection$_nums;
        return _this._collection$_addHashTableEntry$2(nums == null ? _this._collection$_nums = A._LinkedHashSet__newHashTable() : nums, element);
      } else
        return _this._collection$_add$1(0, element);
    },
    _collection$_add$1(_, element) {
      var rest, hash, bucket, _this = this;
      A._instanceType(_this)._precomputed1._as(element);
      rest = _this._collection$_rest;
      if (rest == null)
        rest = _this._collection$_rest = A._LinkedHashSet__newHashTable();
      hash = _this._computeHashCode$1(element);
      bucket = rest[hash];
      if (bucket == null)
        rest[hash] = [_this._collection$_newLinkedCell$1(element)];
      else {
        if (_this._findBucketIndex$2(bucket, element) >= 0)
          return false;
        bucket.push(_this._collection$_newLinkedCell$1(element));
      }
      return true;
    },
    _collection$_addHashTableEntry$2(table, element) {
      A._instanceType(this)._precomputed1._as(element);
      if (type$.nullable__LinkedHashSetCell._as(table[element]) != null)
        return false;
      table[element] = this._collection$_newLinkedCell$1(element);
      return true;
    },
    _collection$_newLinkedCell$1(element) {
      var _this = this,
        cell = new A._LinkedHashSetCell(A._instanceType(_this)._precomputed1._as(element));
      if (_this._collection$_first == null)
        _this._collection$_first = _this._collection$_last = cell;
      else
        _this._collection$_last = _this._collection$_last._collection$_next = cell;
      ++_this._collection$_length;
      _this._collection$_modifications = _this._collection$_modifications + 1 & 1073741823;
      return cell;
    },
    _computeHashCode$1(element) {
      return J.get$hashCode$(element) & 1073741823;
    },
    _findBucketIndex$2(bucket, element) {
      var $length, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; ++i)
        if (J.$eq$(bucket[i]._collection$_element, element))
          return i;
      return -1;
    }
  };
  A._LinkedHashSetCell.prototype = {};
  A._LinkedHashSetIterator.prototype = {
    get$current(_) {
      return this._collection$_current;
    },
    moveNext$0() {
      var _this = this,
        cell = _this._collection$_cell,
        t1 = _this._set;
      if (_this._collection$_modifications !== t1._collection$_modifications)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      else if (cell == null) {
        _this.set$_collection$_current(null);
        return false;
      } else {
        _this.set$_collection$_current(_this.$ti._eval$1("1?")._as(cell._collection$_element));
        _this._collection$_cell = cell._collection$_next;
        return true;
      }
    },
    set$_collection$_current(_current) {
      this._collection$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A.UnmodifiableListView.prototype = {
    cast$1$0(_, $R) {
      return new A.UnmodifiableListView(J.cast$1$0$ax(this._collection$_source, $R), $R._eval$1("UnmodifiableListView<0>"));
    },
    get$length(_) {
      return J.get$length$asx(this._collection$_source);
    },
    $index(_, index) {
      return J.elementAt$1$ax(this._collection$_source, index);
    }
  };
  A.IterableMixin.prototype = {
    map$1$1(_, toElement, $T) {
      var t1 = this.$ti;
      return A.MappedIterable_MappedIterable(this, t1._bind$1($T)._eval$1("1(2)")._as(toElement), t1._precomputed1, $T);
    },
    map$1($receiver, toElement) {
      return this.map$1$1($receiver, toElement, type$.dynamic);
    },
    contains$1(_, element) {
      var t1;
      for (t1 = this.$ti, t1 = new A._SplayTreeKeyIterator(this, A._setArrayType([], t1._eval$1("JSArray<_SplayTreeSetNode<1>>")), this._splayCount, t1._eval$1("@<1>")._bind$1(t1._eval$1("_SplayTreeSetNode<1>"))._eval$1("_SplayTreeKeyIterator<1,2>")); t1.moveNext$0();)
        if (J.$eq$(t1.get$current(t1), element))
          return true;
      return false;
    },
    toList$1$growable(_, growable) {
      return A.List_List$from(this, true, this.$ti._precomputed1);
    },
    toList$0($receiver) {
      return this.toList$1$growable($receiver, true);
    },
    get$length(_) {
      var count,
        t1 = this.$ti,
        it = new A._SplayTreeKeyIterator(this, A._setArrayType([], t1._eval$1("JSArray<_SplayTreeSetNode<1>>")), this._splayCount, t1._eval$1("@<1>")._bind$1(t1._eval$1("_SplayTreeSetNode<1>"))._eval$1("_SplayTreeKeyIterator<1,2>"));
      for (count = 0; it.moveNext$0();)
        ++count;
      return count;
    },
    get$isEmpty(_) {
      var t1 = this.$ti;
      return !new A._SplayTreeKeyIterator(this, A._setArrayType([], t1._eval$1("JSArray<_SplayTreeSetNode<1>>")), this._splayCount, t1._eval$1("@<1>")._bind$1(t1._eval$1("_SplayTreeSetNode<1>"))._eval$1("_SplayTreeKeyIterator<1,2>")).moveNext$0();
    },
    get$isNotEmpty(_) {
      return this._root != null;
    },
    skip$1(_, count) {
      return A.SkipIterable_SkipIterable(this, count, this.$ti._precomputed1);
    },
    get$first(_) {
      var t1 = this.$ti,
        it = new A._SplayTreeKeyIterator(this, A._setArrayType([], t1._eval$1("JSArray<_SplayTreeSetNode<1>>")), this._splayCount, t1._eval$1("@<1>")._bind$1(t1._eval$1("_SplayTreeSetNode<1>"))._eval$1("_SplayTreeKeyIterator<1,2>"));
      if (!it.moveNext$0())
        throw A.wrapException(A.IterableElementError_noElement());
      return it.get$current(it);
    },
    elementAt$1(_, index) {
      var t1, elementIndex, element, _this = this, _s5_ = "index";
      A.checkNotNullable(index, _s5_, type$.int);
      A.RangeError_checkNotNegative(index, _s5_);
      for (t1 = _this.$ti, t1 = new A._SplayTreeKeyIterator(_this, A._setArrayType([], t1._eval$1("JSArray<_SplayTreeSetNode<1>>")), _this._splayCount, t1._eval$1("@<1>")._bind$1(t1._eval$1("_SplayTreeSetNode<1>"))._eval$1("_SplayTreeKeyIterator<1,2>")), elementIndex = 0; t1.moveNext$0();) {
        element = t1.get$current(t1);
        if (index === elementIndex)
          return element;
        ++elementIndex;
      }
      throw A.wrapException(A.IndexError$(index, _this, _s5_, null, elementIndex));
    },
    toString$0(_) {
      return A.IterableBase_iterableToShortString(this, "(", ")");
    }
  };
  A.IterableBase.prototype = {};
  A.LinkedHashMap_LinkedHashMap$from_closure.prototype = {
    call$2(k, v) {
      this.result.$indexSet(0, this.K._as(k), this.V._as(v));
    },
    $signature: 8
  };
  A.ListBase.prototype = {$isEfficientLengthIterable: 1, $isIterable: 1, $isList: 1};
  A.ListMixin.prototype = {
    get$iterator(receiver) {
      return new A.ListIterator(receiver, this.get$length(receiver), A.instanceType(receiver)._eval$1("ListIterator<ListMixin.E>"));
    },
    elementAt$1(receiver, index) {
      return this.$index(receiver, index);
    },
    forEach$1(receiver, action) {
      var $length, i;
      A.instanceType(receiver)._eval$1("~(ListMixin.E)")._as(action);
      $length = this.get$length(receiver);
      for (i = 0; i < $length; ++i) {
        action.call$1(this.$index(receiver, i));
        if ($length !== this.get$length(receiver))
          throw A.wrapException(A.ConcurrentModificationError$(receiver));
      }
    },
    get$isEmpty(receiver) {
      return this.get$length(receiver) === 0;
    },
    get$isNotEmpty(receiver) {
      return !this.get$isEmpty(receiver);
    },
    get$first(receiver) {
      if (this.get$length(receiver) === 0)
        throw A.wrapException(A.IterableElementError_noElement());
      return this.$index(receiver, 0);
    },
    contains$1(receiver, element) {
      var i,
        $length = this.get$length(receiver);
      for (i = 0; i < $length; ++i) {
        if (J.$eq$(this.$index(receiver, i), element))
          return true;
        if ($length !== this.get$length(receiver))
          throw A.wrapException(A.ConcurrentModificationError$(receiver));
      }
      return false;
    },
    map$1$1(receiver, f, $T) {
      var t1 = A.instanceType(receiver);
      return new A.MappedListIterable(receiver, t1._bind$1($T)._eval$1("1(ListMixin.E)")._as(f), t1._eval$1("@<ListMixin.E>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    skip$1(receiver, count) {
      return A.SubListIterable$(receiver, count, null, A.instanceType(receiver)._eval$1("ListMixin.E"));
    },
    toList$1$growable(receiver, growable) {
      var t1, first, result, i, _this = this;
      if (_this.get$isEmpty(receiver)) {
        t1 = J.JSArray_JSArray$growable(0, A.instanceType(receiver)._eval$1("ListMixin.E"));
        return t1;
      }
      first = _this.$index(receiver, 0);
      result = A.List_List$filled(_this.get$length(receiver), first, true, A.instanceType(receiver)._eval$1("ListMixin.E"));
      for (i = 1; i < _this.get$length(receiver); ++i)
        B.JSArray_methods.$indexSet(result, i, _this.$index(receiver, i));
      return result;
    },
    toList$0($receiver) {
      return this.toList$1$growable($receiver, true);
    },
    cast$1$0(receiver, $R) {
      return new A.CastList(receiver, A.instanceType(receiver)._eval$1("@<ListMixin.E>")._bind$1($R)._eval$1("CastList<1,2>"));
    },
    sort$1(receiver, compare) {
      var t2,
        t1 = A.instanceType(receiver);
      t1._eval$1("int(ListMixin.E,ListMixin.E)?")._as(compare);
      t2 = compare == null ? A.collection_ListMixin__compareAny$closure() : compare;
      A.Sort_sort(receiver, t2, t1._eval$1("ListMixin.E"));
    },
    $add(receiver, other) {
      var t1 = A.instanceType(receiver);
      t1._eval$1("List<ListMixin.E>")._as(other);
      t1 = A.List_List$of(receiver, true, t1._eval$1("ListMixin.E"));
      B.JSArray_methods.addAll$1(t1, other);
      return t1;
    },
    sublist$2(receiver, start, end) {
      var listLength = this.get$length(receiver);
      if (end == null)
        end = listLength;
      A.RangeError_checkValidRange(start, end, listLength);
      return A.List_List$from(this.getRange$2(receiver, start, end), true, A.instanceType(receiver)._eval$1("ListMixin.E"));
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    getRange$2(receiver, start, end) {
      A.RangeError_checkValidRange(start, end, this.get$length(receiver));
      return A.SubListIterable$(receiver, start, end, A.instanceType(receiver)._eval$1("ListMixin.E"));
    },
    fillRange$3(receiver, start, end, fill) {
      var i;
      A.instanceType(receiver)._eval$1("ListMixin.E?")._as(fill);
      A.RangeError_checkValidRange(start, end, this.get$length(receiver));
      for (i = start; i < end; ++i)
        this.$indexSet(receiver, i, fill);
    },
    toString$0(receiver) {
      return A.IterableBase_iterableToFullString(receiver, "[", "]");
    }
  };
  A.MapBase.prototype = {};
  A.MapBase_mapToString_closure.prototype = {
    call$2(k, v) {
      var t2,
        t1 = this._box_0;
      if (!t1.first)
        this.result._contents += ", ";
      t1.first = false;
      t1 = this.result;
      t2 = t1._contents += A.S(k);
      t1._contents = t2 + ": ";
      t1._contents += A.S(v);
    },
    $signature: 18
  };
  A.MapMixin.prototype = {
    cast$2$0(receiver, RK, RV) {
      var t1 = A.instanceType(receiver);
      return A.Map_castFrom(receiver, t1._eval$1("MapMixin.K"), t1._eval$1("MapMixin.V"), RK, RV);
    },
    forEach$1(receiver, action) {
      var t1, key;
      A.instanceType(receiver)._eval$1("~(MapMixin.K,MapMixin.V)")._as(action);
      for (t1 = J.get$iterator$ax(this.get$keys(receiver)); t1.moveNext$0();) {
        key = t1.get$current(t1);
        action.call$2(key, this.$index(receiver, key));
      }
    },
    map$2$1(receiver, transform, K2, V2) {
      var result, t1, key, entry;
      A.instanceType(receiver)._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(MapMixin.K,MapMixin.V)")._as(transform);
      result = A.LinkedHashMap_LinkedHashMap$_empty(K2, V2);
      for (t1 = J.get$iterator$ax(this.get$keys(receiver)); t1.moveNext$0();) {
        key = t1.get$current(t1);
        entry = transform.call$2(key, this.$index(receiver, key));
        result.$indexSet(0, entry.get$key(entry), entry.get$value(entry));
      }
      return result;
    },
    map$1($receiver, transform) {
      return this.map$2$1($receiver, transform, type$.dynamic, type$.dynamic);
    },
    containsKey$1(receiver, key) {
      return J.contains$1$asx(this.get$keys(receiver), key);
    },
    get$length(receiver) {
      return J.get$length$asx(this.get$keys(receiver));
    },
    get$isEmpty(receiver) {
      return J.get$isEmpty$asx(this.get$keys(receiver));
    },
    toString$0(receiver) {
      return A.MapBase_mapToString(receiver);
    },
    $isMap: 1
  };
  A._UnmodifiableMapMixin.prototype = {
    $indexSet(_, key, value) {
      var t1 = A._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot modify unmodifiable map"));
    }
  };
  A.MapView.prototype = {
    cast$2$0(_, RK, RV) {
      return J.cast$2$0$ax(this._collection$_map, RK, RV);
    },
    $index(_, key) {
      return J.$index$asx(this._collection$_map, key);
    },
    $indexSet(_, key, value) {
      var t1 = A._instanceType(this);
      J.$indexSet$ax(this._collection$_map, t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    containsKey$1(_, key) {
      return J.containsKey$1$x(this._collection$_map, key);
    },
    forEach$1(_, action) {
      J.forEach$1$ax(this._collection$_map, A._instanceType(this)._eval$1("~(1,2)")._as(action));
    },
    get$isEmpty(_) {
      return J.get$isEmpty$asx(this._collection$_map);
    },
    get$length(_) {
      return J.get$length$asx(this._collection$_map);
    },
    get$keys(_) {
      return J.get$keys$x(this._collection$_map);
    },
    toString$0(_) {
      return J.toString$0$(this._collection$_map);
    },
    map$2$1(_, transform, K2, V2) {
      return J.map$2$1$ax(this._collection$_map, A._instanceType(this)._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(3,4)")._as(transform), K2, V2);
    },
    map$1($receiver, transform) {
      return this.map$2$1($receiver, transform, type$.dynamic, type$.dynamic);
    },
    $isMap: 1
  };
  A.UnmodifiableMapView.prototype = {
    cast$2$0(_, RK, RV) {
      return new A.UnmodifiableMapView(J.cast$2$0$ax(this._collection$_map, RK, RV), RK._eval$1("@<0>")._bind$1(RV)._eval$1("UnmodifiableMapView<1,2>"));
    }
  };
  A.ListQueue.prototype = {
    get$iterator(_) {
      var _this = this;
      return new A._ListQueueIterator(_this, _this._tail, _this._modificationCount, _this._head, _this.$ti._eval$1("_ListQueueIterator<1>"));
    },
    get$isEmpty(_) {
      return this._head === this._tail;
    },
    get$length(_) {
      return (this._tail - this._head & this._table.length - 1) >>> 0;
    },
    get$first(_) {
      var t2,
        t1 = this._head;
      if (t1 === this._tail)
        throw A.wrapException(A.IterableElementError_noElement());
      t2 = this._table;
      if (!(t1 < t2.length))
        return A.ioore(t2, t1);
      return t2[t1];
    },
    elementAt$1(_, index) {
      var t1, t2, t3, _this = this,
        $length = _this.get$length(_this);
      if (0 > index || index >= $length)
        A.throwExpression(A.IndexError$(index, _this, "index", null, $length));
      t1 = _this._table;
      t2 = t1.length;
      t3 = (_this._head + index & t2 - 1) >>> 0;
      if (!(t3 >= 0 && t3 < t2))
        return A.ioore(t1, t3);
      return t1[t3];
    },
    toList$1$growable(_, growable) {
      var t1, list, i, t2, _this = this,
        mask = _this._table.length - 1,
        $length = (_this._tail - _this._head & mask) >>> 0;
      if ($length === 0) {
        t1 = J.JSArray_JSArray$growable(0, _this.$ti._precomputed1);
        return t1;
      }
      list = A.List_List$filled($length, _this.get$first(_this), true, _this.$ti._precomputed1);
      for (i = 0; i < $length; ++i) {
        t1 = _this._table;
        t2 = (_this._head + i & mask) >>> 0;
        if (!(t2 < t1.length))
          return A.ioore(t1, t2);
        B.JSArray_methods.$indexSet(list, i, t1[t2]);
      }
      return list;
    },
    toList$0($receiver) {
      return this.toList$1$growable($receiver, true);
    },
    toString$0(_) {
      return A.IterableBase_iterableToFullString(this, "{", "}");
    },
    removeFirst$0() {
      var t2, result, _this = this,
        t1 = _this._head;
      if (t1 === _this._tail)
        throw A.wrapException(A.IterableElementError_noElement());
      ++_this._modificationCount;
      t2 = _this._table;
      if (!(t1 < t2.length))
        return A.ioore(t2, t1);
      result = t2[t1];
      B.JSArray_methods.$indexSet(t2, t1, null);
      _this._head = (_this._head + 1 & _this._table.length - 1) >>> 0;
      return result;
    },
    _collection$_add$1(_, element) {
      var t2, t3, newTable, split, _this = this,
        t1 = _this.$ti;
      t1._precomputed1._as(element);
      B.JSArray_methods.$indexSet(_this._table, _this._tail, element);
      t2 = _this._tail;
      t3 = _this._table.length;
      t2 = (t2 + 1 & t3 - 1) >>> 0;
      _this._tail = t2;
      if (_this._head === t2) {
        newTable = A.List_List$filled(t3 * 2, null, false, t1._eval$1("1?"));
        t1 = _this._table;
        t2 = _this._head;
        split = t1.length - t2;
        B.JSArray_methods.setRange$4(newTable, 0, split, t1, t2);
        B.JSArray_methods.setRange$4(newTable, split, split + _this._head, _this._table, 0);
        _this._head = 0;
        _this._tail = _this._table.length;
        _this.set$_table(newTable);
      }
      ++_this._modificationCount;
    },
    set$_table(_table) {
      this._table = this.$ti._eval$1("List<1?>")._as(_table);
    },
    $isQueue: 1
  };
  A._ListQueueIterator.prototype = {
    get$current(_) {
      return this._collection$_current;
    },
    moveNext$0() {
      var t2, t3, _this = this,
        t1 = _this._queue;
      if (_this._modificationCount !== t1._modificationCount)
        A.throwExpression(A.ConcurrentModificationError$(t1));
      t2 = _this._collection$_position;
      if (t2 === _this._end) {
        _this.set$_collection$_current(null);
        return false;
      }
      t3 = t1._table;
      if (!(t2 < t3.length))
        return A.ioore(t3, t2);
      _this.set$_collection$_current(t3[t2]);
      _this._collection$_position = (_this._collection$_position + 1 & t1._table.length - 1) >>> 0;
      return true;
    },
    set$_collection$_current(_current) {
      this._collection$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A.SetMixin.prototype = {
    get$isEmpty(_) {
      return this.get$length(this) === 0;
    },
    get$isNotEmpty(_) {
      return this.get$length(this) !== 0;
    },
    addAll$1(_, elements) {
      var t1;
      for (t1 = J.get$iterator$ax(A._instanceType(this)._eval$1("Iterable<1>")._as(elements)); t1.moveNext$0();)
        this.add$1(0, t1.get$current(t1));
    },
    containsAll$1(other) {
      var t1;
      for (t1 = other._set$_set, t1 = A._LinkedHashSetIterator$(t1, t1._collection$_modifications, A._instanceType(t1)._precomputed1); t1.moveNext$0();)
        if (!this.contains$1(0, t1._collection$_current))
          return false;
      return true;
    },
    toList$1$growable(_, growable) {
      return A.List_List$of(this, true, A._instanceType(this)._precomputed1);
    },
    toList$0($receiver) {
      return this.toList$1$growable($receiver, true);
    },
    map$1$1(_, f, $T) {
      var t1 = A._instanceType(this);
      return new A.EfficientLengthMappedIterable(this, t1._bind$1($T)._eval$1("1(2)")._as(f), t1._eval$1("@<1>")._bind$1($T)._eval$1("EfficientLengthMappedIterable<1,2>"));
    },
    map$1($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    toString$0(_) {
      return A.IterableBase_iterableToFullString(this, "{", "}");
    },
    skip$1(_, n) {
      return A.SkipIterable_SkipIterable(this, n, A._instanceType(this)._precomputed1);
    },
    get$first(_) {
      var it = this.get$iterator(this);
      if (!it.moveNext$0())
        throw A.wrapException(A.IterableElementError_noElement());
      return it.get$current(it);
    },
    elementAt$1(_, index) {
      var t1, elementIndex, element, _s5_ = "index";
      A.checkNotNullable(index, _s5_, type$.int);
      A.RangeError_checkNotNegative(index, _s5_);
      for (t1 = this.get$iterator(this), elementIndex = 0; t1.moveNext$0();) {
        element = t1.get$current(t1);
        if (index === elementIndex)
          return element;
        ++elementIndex;
      }
      throw A.wrapException(A.IndexError$(index, this, _s5_, null, elementIndex));
    }
  };
  A._SetBase.prototype = {$isEfficientLengthIterable: 1, $isIterable: 1, $isSet: 1};
  A._SplayTreeNode.prototype = {
    set$_left(_, _left) {
      this._left = this.$ti._eval$1("_SplayTreeNode.1?")._as(_left);
    },
    set$_right(_, _right) {
      this._right = this.$ti._eval$1("_SplayTreeNode.1?")._as(_right);
    }
  };
  A._SplayTreeSetNode.prototype = {};
  A._SplayTree.prototype = {
    _splay$1(key) {
      var root, compare, comp, current, newTreeLeft, left, newTreeRight, right, currentLeft, currentLeft0, currentRight, currentRight0, _this = this, _null = null;
      _this.$ti._eval$1("_SplayTree.K")._as(key);
      root = _this._root;
      if (root == null) {
        _this._compare.call$2(key, key);
        return -1;
      }
      compare = _this._compare;
      for (comp = _null, current = root, newTreeLeft = comp, left = newTreeLeft, newTreeRight = left, right = newTreeRight; true;) {
        comp = compare.call$2(current.key, key);
        if (typeof comp !== "number")
          return comp.$gt();
        if (comp > 0) {
          currentLeft = current._left;
          if (currentLeft == null)
            break;
          comp = compare.call$2(currentLeft.key, key);
          if (typeof comp !== "number")
            return comp.$gt();
          if (comp > 0) {
            current.set$_left(0, currentLeft._right);
            currentLeft.set$_right(0, current);
            currentLeft0 = currentLeft._left;
            if (currentLeft0 == null) {
              current = currentLeft;
              break;
            }
            current = currentLeft;
            currentLeft = currentLeft0;
          }
          if (right == null)
            newTreeRight = current;
          else
            right.set$_left(0, current);
          right = current;
          current = currentLeft;
        } else {
          if (comp < 0) {
            currentRight = current._right;
            if (currentRight == null)
              break;
            comp = compare.call$2(currentRight.key, key);
            if (typeof comp !== "number")
              return comp.$lt();
            if (comp < 0) {
              current.set$_right(0, currentRight._left);
              currentRight.set$_left(0, current);
              currentRight0 = currentRight._right;
              if (currentRight0 == null) {
                current = currentRight;
                break;
              }
              current = currentRight;
              currentRight = currentRight0;
            }
            if (left == null)
              newTreeLeft = current;
            else
              left.set$_right(0, current);
          } else
            break;
          left = current;
          current = currentRight;
        }
      }
      if (left != null) {
        left.set$_right(0, current._left);
        current.set$_left(0, newTreeLeft);
      }
      if (right != null) {
        right.set$_left(0, current._right);
        current.set$_right(0, newTreeRight);
      }
      if (_this._root !== current) {
        _this.set$_root(current);
        ++_this._splayCount;
      }
      return comp;
    },
    _splayMin$1(node) {
      var nextLeft, current, nextLeft0;
      this.$ti._eval$1("_SplayTree.1")._as(node);
      nextLeft = node._left;
      for (current = node; nextLeft != null; current = nextLeft, nextLeft = nextLeft0) {
        current.set$_left(0, nextLeft._right);
        nextLeft.set$_right(0, current);
        nextLeft0 = nextLeft._left;
      }
      return current;
    },
    _splayMax$1(node) {
      var nextRight, current, nextRight0;
      this.$ti._eval$1("_SplayTree.1")._as(node);
      nextRight = node._right;
      for (current = node; nextRight != null; current = nextRight, nextRight = nextRight0) {
        current.set$_right(0, nextRight._left);
        nextRight.set$_left(0, current);
        nextRight0 = nextRight._right;
      }
      return current;
    },
    _remove$1(_, key) {
      var root, left, t1, root0, _this = this;
      _this.$ti._eval$1("_SplayTree.K")._as(key);
      if (_this._root == null)
        return null;
      if (_this._splay$1(key) !== 0)
        return null;
      root = _this._root;
      left = root._left;
      --_this._count;
      t1 = root._right;
      if (left == null)
        _this.set$_root(t1);
      else {
        root0 = _this._splayMax$1(left);
        root0.set$_right(0, t1);
        _this.set$_root(root0);
      }
      ++_this._modificationCount;
      return root;
    },
    _addNewRoot$2(node, comp) {
      var root, _this = this;
      _this.$ti._eval$1("_SplayTree.1")._as(node);
      ++_this._count;
      ++_this._modificationCount;
      root = _this._root;
      if (root == null) {
        _this.set$_root(node);
        return;
      }
      if (typeof comp !== "number")
        return comp.$lt();
      if (comp < 0) {
        node.set$_left(0, root);
        node.set$_right(0, root._right);
        root.set$_right(0, null);
      } else {
        node.set$_right(0, root);
        node.set$_left(0, root._left);
        root.set$_left(0, null);
      }
      _this.set$_root(node);
    },
    get$_collection$_first() {
      var _this = this,
        root = _this._root;
      if (root == null)
        return null;
      _this.set$_root(_this._splayMin$1(root));
      return _this._root;
    }
  };
  A._SplayTreeIterator.prototype = {
    get$current(_) {
      var t1 = this._path;
      if (t1.length === 0)
        return null;
      return this.$ti._rest[1]._as(B.JSArray_methods.get$last(t1)).key;
    },
    moveNext$0() {
      var node, next, _this = this,
        t1 = _this._modificationCount,
        t2 = _this._tree,
        t3 = t2._modificationCount;
      if (t1 !== t3) {
        if (t1 == null) {
          _this._modificationCount = t3;
          node = t2._root;
          for (t1 = _this._path; node != null;) {
            B.JSArray_methods.add$1(t1, node);
            node = node._left;
          }
          return t1.length !== 0;
        }
        throw A.wrapException(A.ConcurrentModificationError$(t2));
      }
      t1 = _this._path;
      if (t1.length === 0)
        return false;
      if (_this._splayCount !== t2._splayCount) {
        t3 = _this.$ti._eval$1("_SplayTreeIterator.K")._as(B.JSArray_methods.get$last(t1).key);
        B.JSArray_methods.set$length(t1, 0);
        t2._splay$1(t3);
        t3 = t2._root;
        t3.toString;
        B.JSArray_methods.add$1(t1, t3);
        _this._splayCount = t2._splayCount;
      }
      node = B.JSArray_methods.get$last(t1);
      next = node._right;
      if (next != null) {
        for (; next != null;) {
          B.JSArray_methods.add$1(t1, next);
          next = next._left;
        }
        return true;
      }
      if (0 >= t1.length)
        return A.ioore(t1, -1);
      t1.pop();
      while (true) {
        if (!(t1.length !== 0 && B.JSArray_methods.get$last(t1)._right == node))
          break;
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        node = t1.pop();
      }
      return t1.length !== 0;
    },
    $isIterator: 1
  };
  A._SplayTreeKeyIterator.prototype = {};
  A.SplayTreeSet.prototype = {
    get$iterator(_) {
      var t1 = this.$ti;
      return new A._SplayTreeKeyIterator(this, A._setArrayType([], t1._eval$1("JSArray<_SplayTreeSetNode<1>>")), this._splayCount, t1._eval$1("@<1>")._bind$1(t1._eval$1("_SplayTreeSetNode<1>"))._eval$1("_SplayTreeKeyIterator<1,2>"));
    },
    get$length(_) {
      return this._count;
    },
    get$isEmpty(_) {
      return this._root == null;
    },
    get$isNotEmpty(_) {
      return this._root != null;
    },
    get$first(_) {
      if (this._count === 0)
        throw A.wrapException(A.IterableElementError_noElement());
      return this.get$_collection$_first().key;
    },
    contains$1(_, element) {
      return A.boolConversionCheck(this._validKey.call$1(element)) && this._splay$1(this.$ti._precomputed1._as(element)) === 0;
    },
    add$1(_, element) {
      return this._collection$_add$1(0, this.$ti._precomputed1._as(element));
    },
    _collection$_add$1(_, element) {
      var compare,
        t1 = this.$ti;
      t1._precomputed1._as(element);
      compare = this._splay$1(element);
      if (compare === 0)
        return false;
      this._addNewRoot$2(new A._SplayTreeSetNode(element, t1._eval$1("_SplayTreeSetNode<1>")), compare);
      return true;
    },
    remove$1(_, object) {
      if (!A.boolConversionCheck(this._validKey.call$1(object)))
        return false;
      return this._remove$1(0, this.$ti._precomputed1._as(object)) != null;
    },
    addAll$1(_, elements) {
      var t1;
      for (t1 = J.get$iterator$ax(this.$ti._eval$1("Iterable<1>")._as(elements)); t1.moveNext$0();)
        this._collection$_add$1(0, t1.get$current(t1));
    },
    toString$0(_) {
      return A.IterableBase_iterableToFullString(this, "{", "}");
    },
    set$_root(_root) {
      this._root = this.$ti._eval$1("_SplayTreeSetNode<1>?")._as(_root);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isSet: 1
  };
  A.SplayTreeSet_closure.prototype = {
    call$1(v) {
      return this.E._is(v);
    },
    $signature: 11
  };
  A._ListBase_Object_ListMixin.prototype = {};
  A._SplayTreeSet__SplayTree_IterableMixin.prototype = {};
  A._SplayTreeSet__SplayTree_IterableMixin_SetMixin.prototype = {};
  A._UnmodifiableMapView_MapView__UnmodifiableMapMixin.prototype = {};
  A.__SetBase_Object_SetMixin.prototype = {};
  A._JsonMap.prototype = {
    $index(_, key) {
      var result,
        t1 = this._processed;
      if (t1 == null)
        return this._data.$index(0, key);
      else if (typeof key != "string")
        return null;
      else {
        result = t1[key];
        return typeof result == "undefined" ? this._process$1(key) : result;
      }
    },
    get$length(_) {
      var t1;
      if (this._processed == null) {
        t1 = this._data;
        t1 = t1.get$length(t1);
      } else
        t1 = this._convert$_computeKeys$0().length;
      return t1;
    },
    get$isEmpty(_) {
      return this.get$length(this) === 0;
    },
    get$keys(_) {
      var t1;
      if (this._processed == null) {
        t1 = this._data;
        return t1.get$keys(t1);
      }
      return new A._JsonMapKeyIterable(this);
    },
    $indexSet(_, key, value) {
      var processed, original, _this = this;
      A._asStringS(key);
      if (_this._processed == null)
        _this._data.$indexSet(0, key, value);
      else if (_this.containsKey$1(0, key)) {
        processed = _this._processed;
        processed[key] = value;
        original = _this._original;
        if (original == null ? processed != null : original !== processed)
          original[key] = null;
      } else
        _this._upgrade$0().$indexSet(0, key, value);
    },
    containsKey$1(_, key) {
      if (this._processed == null)
        return this._data.containsKey$1(0, key);
      if (typeof key != "string")
        return false;
      return Object.prototype.hasOwnProperty.call(this._original, key);
    },
    forEach$1(_, f) {
      var keys, i, key, value, _this = this;
      type$.void_Function_String_dynamic._as(f);
      if (_this._processed == null)
        return _this._data.forEach$1(0, f);
      keys = _this._convert$_computeKeys$0();
      for (i = 0; i < keys.length; ++i) {
        key = keys[i];
        value = _this._processed[key];
        if (typeof value == "undefined") {
          value = A._convertJsonToDartLazy(_this._original[key]);
          _this._processed[key] = value;
        }
        f.call$2(key, value);
        if (keys !== _this._data)
          throw A.wrapException(A.ConcurrentModificationError$(_this));
      }
    },
    _convert$_computeKeys$0() {
      var keys = type$.nullable_List_dynamic._as(this._data);
      if (keys == null)
        keys = this._data = A._setArrayType(Object.keys(this._original), type$.JSArray_String);
      return keys;
    },
    _upgrade$0() {
      var result, keys, i, t1, key, _this = this;
      if (_this._processed == null)
        return _this._data;
      result = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic);
      keys = _this._convert$_computeKeys$0();
      for (i = 0; t1 = keys.length, i < t1; ++i) {
        key = keys[i];
        result.$indexSet(0, key, _this.$index(0, key));
      }
      if (t1 === 0)
        B.JSArray_methods.add$1(keys, "");
      else
        B.JSArray_methods.set$length(keys, 0);
      _this._original = _this._processed = null;
      return _this._data = result;
    },
    _process$1(key) {
      var result;
      if (!Object.prototype.hasOwnProperty.call(this._original, key))
        return null;
      result = A._convertJsonToDartLazy(this._original[key]);
      return this._processed[key] = result;
    }
  };
  A._JsonMapKeyIterable.prototype = {
    get$length(_) {
      var t1 = this._parent;
      return t1.get$length(t1);
    },
    elementAt$1(_, index) {
      var t1 = this._parent;
      if (t1._processed == null)
        t1 = t1.get$keys(t1).elementAt$1(0, index);
      else {
        t1 = t1._convert$_computeKeys$0();
        if (!(index >= 0 && index < t1.length))
          return A.ioore(t1, index);
        t1 = t1[index];
      }
      return t1;
    },
    get$iterator(_) {
      var t1 = this._parent;
      if (t1._processed == null) {
        t1 = t1.get$keys(t1);
        t1 = t1.get$iterator(t1);
      } else {
        t1 = t1._convert$_computeKeys$0();
        t1 = new J.ArrayIterator(t1, t1.length, A._arrayInstanceType(t1)._eval$1("ArrayIterator<1>"));
      }
      return t1;
    },
    contains$1(_, key) {
      return this._parent.containsKey$1(0, key);
    }
  };
  A.Base64Codec.prototype = {
    normalize$3(_, source, start, end) {
      var inverseAlphabet, i, sliceStart, buffer, firstPadding, firstPaddingSourceIndex, paddingCount, i0, char, i1, digit1, digit2, char0, value, t1, t2, endLength, $length,
        _s31_ = "Invalid base64 encoding length ";
      end = A.RangeError_checkValidRange(start, end, source.length);
      inverseAlphabet = $.$get$_Base64Decoder__inverseAlphabet();
      for (i = start, sliceStart = i, buffer = null, firstPadding = -1, firstPaddingSourceIndex = -1, paddingCount = 0; i < end; i = i0) {
        i0 = i + 1;
        char = B.JSString_methods._codeUnitAt$1(source, i);
        if (char === 37) {
          i1 = i0 + 2;
          if (i1 <= end) {
            digit1 = A.hexDigitValue(B.JSString_methods._codeUnitAt$1(source, i0));
            digit2 = A.hexDigitValue(B.JSString_methods._codeUnitAt$1(source, i0 + 1));
            char0 = digit1 * 16 + digit2 - (digit2 & 256);
            if (char0 === 37)
              char0 = -1;
            i0 = i1;
          } else
            char0 = -1;
        } else
          char0 = char;
        if (0 <= char0 && char0 <= 127) {
          if (!(char0 >= 0 && char0 < inverseAlphabet.length))
            return A.ioore(inverseAlphabet, char0);
          value = inverseAlphabet[char0];
          if (value >= 0) {
            char0 = B.JSString_methods.codeUnitAt$1("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", value);
            if (char0 === char)
              continue;
            char = char0;
          } else {
            if (value === -1) {
              if (firstPadding < 0) {
                t1 = buffer == null ? null : buffer._contents.length;
                if (t1 == null)
                  t1 = 0;
                firstPadding = t1 + (i - sliceStart);
                firstPaddingSourceIndex = i;
              }
              ++paddingCount;
              if (char === 61)
                continue;
            }
            char = char0;
          }
          if (value !== -2) {
            if (buffer == null) {
              buffer = new A.StringBuffer("");
              t1 = buffer;
            } else
              t1 = buffer;
            t2 = t1._contents += B.JSString_methods.substring$2(source, sliceStart, i);
            t1._contents = t2 + A.Primitives_stringFromCharCode(char);
            sliceStart = i0;
            continue;
          }
        }
        throw A.wrapException(A.FormatException$("Invalid base64 data", source, i));
      }
      if (buffer != null) {
        t1 = buffer._contents += B.JSString_methods.substring$2(source, sliceStart, end);
        t2 = t1.length;
        if (firstPadding >= 0)
          A.Base64Codec__checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, t2);
        else {
          endLength = B.JSInt_methods.$mod(t2 - 1, 4) + 1;
          if (endLength === 1)
            throw A.wrapException(A.FormatException$(_s31_, source, end));
          for (; endLength < 4;) {
            t1 += "=";
            buffer._contents = t1;
            ++endLength;
          }
        }
        t1 = buffer._contents;
        return B.JSString_methods.replaceRange$3(source, start, end, t1.charCodeAt(0) == 0 ? t1 : t1);
      }
      $length = end - start;
      if (firstPadding >= 0)
        A.Base64Codec__checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, $length);
      else {
        endLength = B.JSInt_methods.$mod($length, 4);
        if (endLength === 1)
          throw A.wrapException(A.FormatException$(_s31_, source, end));
        if (endLength > 1)
          source = B.JSString_methods.replaceRange$3(source, end, end, endLength === 2 ? "==" : "=");
      }
      return source;
    }
  };
  A.Base64Encoder.prototype = {};
  A.Codec.prototype = {};
  A.Converter.prototype = {};
  A.Encoding.prototype = {};
  A.JsonUnsupportedObjectError.prototype = {
    toString$0(_) {
      var safeString = A.Error_safeToString(this.unsupportedObject);
      return (this.cause != null ? "Converting object to an encodable object failed:" : "Converting object did not return an encodable object:") + " " + safeString;
    }
  };
  A.JsonCyclicError.prototype = {
    toString$0(_) {
      return "Cyclic error in JSON stringify";
    }
  };
  A.JsonCodec.prototype = {
    decode$2$reviver(_, source, reviver) {
      var t1;
      type$.nullable_nullable_Object_Function_2_nullable_Object_and_nullable_Object._as(reviver);
      t1 = A._parseJson(source, this.get$decoder()._reviver);
      return t1;
    },
    encode$2$toEncodable(value, toEncodable) {
      var t1;
      type$.nullable_nullable_Object_Function_dynamic._as(toEncodable);
      t1 = A._JsonStringStringifier_stringify(value, this.get$encoder()._toEncodable, null);
      return t1;
    },
    get$encoder() {
      return B.JsonEncoder_null;
    },
    get$decoder() {
      return B.JsonDecoder_null;
    }
  };
  A.JsonEncoder.prototype = {};
  A.JsonDecoder.prototype = {};
  A._JsonStringifier.prototype = {
    writeStringContent$1(s) {
      var offset, i, charCode, t1, t2, _this = this,
        $length = s.length;
      for (offset = 0, i = 0; i < $length; ++i) {
        charCode = B.JSString_methods._codeUnitAt$1(s, i);
        if (charCode > 92) {
          if (charCode >= 55296) {
            t1 = charCode & 64512;
            if (t1 === 55296) {
              t2 = i + 1;
              t2 = !(t2 < $length && (B.JSString_methods._codeUnitAt$1(s, t2) & 64512) === 56320);
            } else
              t2 = false;
            if (!t2)
              if (t1 === 56320) {
                t1 = i - 1;
                t1 = !(t1 >= 0 && (B.JSString_methods.codeUnitAt$1(s, t1) & 64512) === 55296);
              } else
                t1 = false;
            else
              t1 = true;
            if (t1) {
              if (i > offset)
                _this.writeStringSlice$3(s, offset, i);
              offset = i + 1;
              _this.writeCharCode$1(92);
              _this.writeCharCode$1(117);
              _this.writeCharCode$1(100);
              t1 = charCode >>> 8 & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
              t1 = charCode >>> 4 & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
              t1 = charCode & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
            }
          }
          continue;
        }
        if (charCode < 32) {
          if (i > offset)
            _this.writeStringSlice$3(s, offset, i);
          offset = i + 1;
          _this.writeCharCode$1(92);
          switch (charCode) {
            case 8:
              _this.writeCharCode$1(98);
              break;
            case 9:
              _this.writeCharCode$1(116);
              break;
            case 10:
              _this.writeCharCode$1(110);
              break;
            case 12:
              _this.writeCharCode$1(102);
              break;
            case 13:
              _this.writeCharCode$1(114);
              break;
            default:
              _this.writeCharCode$1(117);
              _this.writeCharCode$1(48);
              _this.writeCharCode$1(48);
              t1 = charCode >>> 4 & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
              t1 = charCode & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
              break;
          }
        } else if (charCode === 34 || charCode === 92) {
          if (i > offset)
            _this.writeStringSlice$3(s, offset, i);
          offset = i + 1;
          _this.writeCharCode$1(92);
          _this.writeCharCode$1(charCode);
        }
      }
      if (offset === 0)
        _this.writeString$1(s);
      else if (offset < $length)
        _this.writeStringSlice$3(s, offset, $length);
    },
    _checkCycle$1(object) {
      var t1, t2, i, t3;
      for (t1 = this._seen, t2 = t1.length, i = 0; i < t2; ++i) {
        t3 = t1[i];
        if (object == null ? t3 == null : object === t3)
          throw A.wrapException(new A.JsonCyclicError(object, null));
      }
      B.JSArray_methods.add$1(t1, object);
    },
    writeObject$1(object) {
      var customJson, e, t1, exception, _this = this;
      if (_this.writeJsonValue$1(object))
        return;
      _this._checkCycle$1(object);
      try {
        customJson = _this._toEncodable.call$1(object);
        if (!_this.writeJsonValue$1(customJson)) {
          t1 = A.JsonUnsupportedObjectError$(object, null, _this.get$_partialResult());
          throw A.wrapException(t1);
        }
        t1 = _this._seen;
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        t1.pop();
      } catch (exception) {
        e = A.unwrapException(exception);
        t1 = A.JsonUnsupportedObjectError$(object, e, _this.get$_partialResult());
        throw A.wrapException(t1);
      }
    },
    writeJsonValue$1(object) {
      var t1, success, _this = this;
      if (typeof object == "number") {
        if (!isFinite(object))
          return false;
        _this.writeNumber$1(object);
        return true;
      } else if (object === true) {
        _this.writeString$1("true");
        return true;
      } else if (object === false) {
        _this.writeString$1("false");
        return true;
      } else if (object == null) {
        _this.writeString$1("null");
        return true;
      } else if (typeof object == "string") {
        _this.writeString$1('"');
        _this.writeStringContent$1(object);
        _this.writeString$1('"');
        return true;
      } else if (type$.List_dynamic._is(object)) {
        _this._checkCycle$1(object);
        _this.writeList$1(object);
        t1 = _this._seen;
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        t1.pop();
        return true;
      } else if (type$.Map_dynamic_dynamic._is(object)) {
        _this._checkCycle$1(object);
        success = _this.writeMap$1(object);
        t1 = _this._seen;
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        t1.pop();
        return success;
      } else
        return false;
    },
    writeList$1(list) {
      var t1, i, _this = this;
      _this.writeString$1("[");
      t1 = J.getInterceptor$asx(list);
      if (t1.get$isNotEmpty(list)) {
        _this.writeObject$1(t1.$index(list, 0));
        for (i = 1; i < t1.get$length(list); ++i) {
          _this.writeString$1(",");
          _this.writeObject$1(t1.$index(list, i));
        }
      }
      _this.writeString$1("]");
    },
    writeMap$1(map) {
      var t2, keyValueList, i, separator, _this = this, _box_0 = {},
        t1 = J.getInterceptor$asx(map);
      if (t1.get$isEmpty(map)) {
        _this.writeString$1("{}");
        return true;
      }
      t2 = t1.get$length(map);
      if (typeof t2 !== "number")
        return t2.$mul();
      t2 *= 2;
      keyValueList = A.List_List$filled(t2, null, false, type$.nullable_Object);
      i = _box_0.i = 0;
      _box_0.allStringKeys = true;
      t1.forEach$1(map, new A._JsonStringifier_writeMap_closure(_box_0, keyValueList));
      if (!_box_0.allStringKeys)
        return false;
      _this.writeString$1("{");
      for (separator = '"'; i < t2; i += 2, separator = ',"') {
        _this.writeString$1(separator);
        _this.writeStringContent$1(A._asStringS(keyValueList[i]));
        _this.writeString$1('":');
        t1 = i + 1;
        if (!(t1 < t2))
          return A.ioore(keyValueList, t1);
        _this.writeObject$1(keyValueList[t1]);
      }
      _this.writeString$1("}");
      return true;
    }
  };
  A._JsonStringifier_writeMap_closure.prototype = {
    call$2(key, value) {
      var t1, t2;
      if (typeof key != "string")
        this._box_0.allStringKeys = false;
      t1 = this.keyValueList;
      t2 = this._box_0;
      B.JSArray_methods.$indexSet(t1, t2.i++, key);
      B.JSArray_methods.$indexSet(t1, t2.i++, value);
    },
    $signature: 18
  };
  A._JsonStringStringifier.prototype = {
    get$_partialResult() {
      var t1 = this._convert$_sink;
      return t1 instanceof A.StringBuffer ? t1.toString$0(0) : null;
    },
    writeNumber$1(number) {
      this._convert$_sink.write$1(0, B.JSNumber_methods.toString$0(number));
    },
    writeString$1(string) {
      this._convert$_sink.write$1(0, string);
    },
    writeStringSlice$3(string, start, end) {
      this._convert$_sink.write$1(0, B.JSString_methods.substring$2(string, start, end));
    },
    writeCharCode$1(charCode) {
      this._convert$_sink.writeCharCode$1(charCode);
    }
  };
  A.Utf8Codec.prototype = {
    get$encoder() {
      return B.C_Utf8Encoder;
    }
  };
  A.Utf8Encoder.prototype = {
    convert$1(string) {
      var end, $length, t1, encoder;
      A._asStringS(string);
      end = A.RangeError_checkValidRange(0, null, string.length);
      $length = end - 0;
      if ($length === 0)
        return new Uint8Array(0);
      t1 = new Uint8Array($length * 3);
      encoder = new A._Utf8Encoder(t1);
      if (encoder._fillBuffer$3(string, 0, end) !== end) {
        B.JSString_methods.codeUnitAt$1(string, end - 1);
        encoder._writeReplacementCharacter$0();
      }
      return B.NativeUint8List_methods.sublist$2(t1, 0, encoder._bufferIndex);
    }
  };
  A._Utf8Encoder.prototype = {
    _writeReplacementCharacter$0() {
      var _this = this,
        t1 = _this._buffer,
        t2 = _this._bufferIndex,
        t3 = _this._bufferIndex = t2 + 1,
        t4 = t1.length;
      if (!(t2 < t4))
        return A.ioore(t1, t2);
      t1[t2] = 239;
      t2 = _this._bufferIndex = t3 + 1;
      if (!(t3 < t4))
        return A.ioore(t1, t3);
      t1[t3] = 191;
      _this._bufferIndex = t2 + 1;
      if (!(t2 < t4))
        return A.ioore(t1, t2);
      t1[t2] = 189;
    },
    _writeSurrogate$2(leadingSurrogate, nextCodeUnit) {
      var rune, t1, t2, t3, t4, _this = this;
      if ((nextCodeUnit & 64512) === 56320) {
        rune = 65536 + ((leadingSurrogate & 1023) << 10) | nextCodeUnit & 1023;
        t1 = _this._buffer;
        t2 = _this._bufferIndex;
        t3 = _this._bufferIndex = t2 + 1;
        t4 = t1.length;
        if (!(t2 < t4))
          return A.ioore(t1, t2);
        t1[t2] = rune >>> 18 | 240;
        t2 = _this._bufferIndex = t3 + 1;
        if (!(t3 < t4))
          return A.ioore(t1, t3);
        t1[t3] = rune >>> 12 & 63 | 128;
        t3 = _this._bufferIndex = t2 + 1;
        if (!(t2 < t4))
          return A.ioore(t1, t2);
        t1[t2] = rune >>> 6 & 63 | 128;
        _this._bufferIndex = t3 + 1;
        if (!(t3 < t4))
          return A.ioore(t1, t3);
        t1[t3] = rune & 63 | 128;
        return true;
      } else {
        _this._writeReplacementCharacter$0();
        return false;
      }
    },
    _fillBuffer$3(str, start, end) {
      var t1, t2, t3, stringIndex, codeUnit, t4, stringIndex0, t5, _this = this;
      if (start !== end && (J.codeUnitAt$1$s(str, end - 1) & 64512) === 55296)
        --end;
      for (t1 = _this._buffer, t2 = t1.length, t3 = J.getInterceptor$s(str), stringIndex = start; stringIndex < end; ++stringIndex) {
        codeUnit = t3._codeUnitAt$1(str, stringIndex);
        if (codeUnit <= 127) {
          t4 = _this._bufferIndex;
          if (t4 >= t2)
            break;
          _this._bufferIndex = t4 + 1;
          t1[t4] = codeUnit;
        } else {
          t4 = codeUnit & 64512;
          if (t4 === 55296) {
            if (_this._bufferIndex + 4 > t2)
              break;
            stringIndex0 = stringIndex + 1;
            if (_this._writeSurrogate$2(codeUnit, B.JSString_methods._codeUnitAt$1(str, stringIndex0)))
              stringIndex = stringIndex0;
          } else if (t4 === 56320) {
            if (_this._bufferIndex + 3 > t2)
              break;
            _this._writeReplacementCharacter$0();
          } else if (codeUnit <= 2047) {
            t4 = _this._bufferIndex;
            t5 = t4 + 1;
            if (t5 >= t2)
              break;
            _this._bufferIndex = t5;
            if (!(t4 < t2))
              return A.ioore(t1, t4);
            t1[t4] = codeUnit >>> 6 | 192;
            _this._bufferIndex = t5 + 1;
            t1[t5] = codeUnit & 63 | 128;
          } else {
            t4 = _this._bufferIndex;
            if (t4 + 2 >= t2)
              break;
            t5 = _this._bufferIndex = t4 + 1;
            if (!(t4 < t2))
              return A.ioore(t1, t4);
            t1[t4] = codeUnit >>> 12 | 224;
            t4 = _this._bufferIndex = t5 + 1;
            if (!(t5 < t2))
              return A.ioore(t1, t5);
            t1[t5] = codeUnit >>> 6 & 63 | 128;
            _this._bufferIndex = t4 + 1;
            if (!(t4 < t2))
              return A.ioore(t1, t4);
            t1[t4] = codeUnit & 63 | 128;
          }
        }
      }
      return stringIndex;
    }
  };
  A._symbolMapToStringMap_closure.prototype = {
    call$2(key, value) {
      this.result.$indexSet(0, type$.Symbol._as(key)._name, value);
    },
    $signature: 19
  };
  A.NoSuchMethodError_toString_closure.prototype = {
    call$2(key, value) {
      var t1, t2, t3;
      type$.Symbol._as(key);
      t1 = this.sb;
      t2 = this._box_0;
      t1._contents += t2.comma;
      t3 = t1._contents += A.S(key._name);
      t1._contents = t3 + ": ";
      t1._contents += A.Error_safeToString(value);
      t2.comma = ", ";
    },
    $signature: 19
  };
  A._BigIntImpl.prototype = {
    $negate(_) {
      var t2, t3, _this = this,
        t1 = _this._used;
      if (t1 === 0)
        return _this;
      t2 = !_this._isNegative;
      t3 = _this._digits;
      t1 = A._BigIntImpl__normalize(t1, t3);
      return new A._BigIntImpl(t1 === 0 ? false : t2, t3, t1);
    },
    _drShift$1(n) {
      var resultUsed, digits, resultDigits, t1, i, t2, t3, result, _this = this,
        used = _this._used;
      if (used === 0)
        return $.$get$_BigIntImpl_zero();
      resultUsed = used - n;
      if (resultUsed <= 0)
        return _this._isNegative ? $.$get$_BigIntImpl__minusOne() : $.$get$_BigIntImpl_zero();
      digits = _this._digits;
      resultDigits = new Uint16Array(resultUsed);
      for (t1 = digits.length, i = n; i < used; ++i) {
        t2 = i - n;
        if (!(i >= 0 && i < t1))
          return A.ioore(digits, i);
        t3 = digits[i];
        if (!(t2 < resultUsed))
          return A.ioore(resultDigits, t2);
        resultDigits[t2] = t3;
      }
      t2 = _this._isNegative;
      t3 = A._BigIntImpl__normalize(resultUsed, resultDigits);
      result = new A._BigIntImpl(t3 === 0 ? false : t2, resultDigits, t3);
      if (t2)
        for (i = 0; i < n; ++i) {
          if (!(i < t1))
            return A.ioore(digits, i);
          if (digits[i] !== 0)
            return result.$sub(0, $.$get$_BigIntImpl_one());
        }
      return result;
    },
    $shr(_, shiftAmount) {
      var t1, digitShift, bitShift, resultUsed, digits, resultDigits, t2, result, i, _this = this;
      if (typeof shiftAmount !== "number")
        return shiftAmount.$lt();
      if (shiftAmount < 0)
        throw A.wrapException(A.ArgumentError$("shift-amount must be posititve " + shiftAmount, null));
      t1 = _this._used;
      if (t1 === 0)
        return _this;
      digitShift = B.JSInt_methods._tdivFast$1(shiftAmount, 16);
      bitShift = B.JSInt_methods.$mod(shiftAmount, 16);
      if (bitShift === 0)
        return _this._drShift$1(digitShift);
      resultUsed = t1 - digitShift;
      if (resultUsed <= 0)
        return _this._isNegative ? $.$get$_BigIntImpl__minusOne() : $.$get$_BigIntImpl_zero();
      digits = _this._digits;
      resultDigits = new Uint16Array(resultUsed);
      A._BigIntImpl__rsh(digits, t1, shiftAmount, resultDigits);
      t1 = _this._isNegative;
      t2 = A._BigIntImpl__normalize(resultUsed, resultDigits);
      result = new A._BigIntImpl(t2 === 0 ? false : t1, resultDigits, t2);
      if (t1) {
        t1 = digits.length;
        if (!(digitShift >= 0 && digitShift < t1))
          return A.ioore(digits, digitShift);
        if ((digits[digitShift] & B.JSInt_methods.$shl(1, bitShift) - 1) !== 0)
          return result.$sub(0, $.$get$_BigIntImpl_one());
        for (i = 0; i < digitShift; ++i) {
          if (!(i < t1))
            return A.ioore(digits, i);
          if (digits[i] !== 0)
            return result.$sub(0, $.$get$_BigIntImpl_one());
        }
      }
      return result;
    },
    compareTo$1(_, other) {
      var t1, result;
      type$._BigIntImpl._as(other);
      t1 = this._isNegative;
      if (t1 === other._isNegative) {
        result = A._BigIntImpl__compareDigits(this._digits, this._used, other._digits, other._used);
        return t1 ? 0 - result : result;
      }
      return t1 ? -1 : 1;
    },
    _absAddSetSign$2(other, isNegative) {
      var resultUsed, resultDigits, t1, _this = this,
        used = _this._used,
        otherUsed = other._used;
      if (used < otherUsed)
        return other._absAddSetSign$2(_this, isNegative);
      if (used === 0)
        return $.$get$_BigIntImpl_zero();
      if (otherUsed === 0)
        return _this._isNegative === isNegative ? _this : _this.$negate(0);
      resultUsed = used + 1;
      resultDigits = new Uint16Array(resultUsed);
      A._BigIntImpl__absAdd(_this._digits, used, other._digits, otherUsed, resultDigits);
      t1 = A._BigIntImpl__normalize(resultUsed, resultDigits);
      return new A._BigIntImpl(t1 === 0 ? false : isNegative, resultDigits, t1);
    },
    _absSubSetSign$2(other, isNegative) {
      var otherUsed, resultDigits, t1, _this = this,
        used = _this._used;
      if (used === 0)
        return $.$get$_BigIntImpl_zero();
      otherUsed = other._used;
      if (otherUsed === 0)
        return _this._isNegative === isNegative ? _this : _this.$negate(0);
      resultDigits = new Uint16Array(used);
      A._BigIntImpl__absSub(_this._digits, used, other._digits, otherUsed, resultDigits);
      t1 = A._BigIntImpl__normalize(used, resultDigits);
      return new A._BigIntImpl(t1 === 0 ? false : isNegative, resultDigits, t1);
    },
    $add(_, other) {
      var t1, t2, isNegative, _this = this;
      type$._BigIntImpl._as(other);
      t1 = _this._used;
      if (t1 === 0)
        return other;
      t2 = other._used;
      if (t2 === 0)
        return _this;
      isNegative = _this._isNegative;
      if (isNegative === other._isNegative)
        return _this._absAddSetSign$2(other, isNegative);
      if (A._BigIntImpl__compareDigits(_this._digits, t1, other._digits, t2) >= 0)
        return _this._absSubSetSign$2(other, isNegative);
      return other._absSubSetSign$2(_this, !isNegative);
    },
    $sub(_, other) {
      var t1, t2, isNegative, _this = this;
      type$._BigIntImpl._as(other);
      t1 = _this._used;
      if (t1 === 0)
        return other.$negate(0);
      t2 = other._used;
      if (t2 === 0)
        return _this;
      isNegative = _this._isNegative;
      if (isNegative !== other._isNegative)
        return _this._absAddSetSign$2(other, isNegative);
      if (A._BigIntImpl__compareDigits(_this._digits, t1, other._digits, t2) >= 0)
        return _this._absSubSetSign$2(other, isNegative);
      return other._absSubSetSign$2(_this, !isNegative);
    },
    $mul(_, other) {
      var resultUsed, digits, otherDigits, resultDigits, t1, i, t2,
        used = this._used,
        otherUsed = other._used;
      if (used === 0 || otherUsed === 0)
        return $.$get$_BigIntImpl_zero();
      resultUsed = used + otherUsed;
      digits = this._digits;
      otherDigits = other._digits;
      resultDigits = new Uint16Array(resultUsed);
      for (t1 = otherDigits.length, i = 0; i < otherUsed;) {
        if (!(i < t1))
          return A.ioore(otherDigits, i);
        A._BigIntImpl__mulAdd(otherDigits[i], digits, 0, resultDigits, i, used);
        ++i;
      }
      t1 = this._isNegative !== other._isNegative;
      t2 = A._BigIntImpl__normalize(resultUsed, resultDigits);
      return new A._BigIntImpl(t2 === 0 ? false : t1, resultDigits, t2);
    },
    _div$1(other) {
      var t1, t2, lastQuo_used, quo_digits, quo;
      if (this._used < other._used)
        return $.$get$_BigIntImpl_zero();
      this._divRem$1(other);
      t1 = $._BigIntImpl____lastQuoRemUsed._readField$0();
      t2 = $._BigIntImpl____lastRemUsed._readField$0();
      if (typeof t1 !== "number")
        return t1.$sub();
      if (typeof t2 !== "number")
        return A.iae(t2);
      lastQuo_used = t1 - t2;
      quo_digits = A._BigIntImpl__cloneDigits($._BigIntImpl____lastQuoRemDigits._readField$0(), $._BigIntImpl____lastRemUsed._readField$0(), $._BigIntImpl____lastQuoRemUsed._readField$0(), lastQuo_used);
      t2 = A._BigIntImpl__normalize(lastQuo_used, quo_digits);
      quo = new A._BigIntImpl(false, quo_digits, t2);
      return this._isNegative !== other._isNegative && t2 > 0 ? quo.$negate(0) : quo;
    },
    _rem$1(other) {
      var remDigits, t1, rem, _this = this;
      if (_this._used < other._used)
        return _this;
      _this._divRem$1(other);
      remDigits = A._BigIntImpl__cloneDigits($._BigIntImpl____lastQuoRemDigits._readField$0(), 0, $._BigIntImpl____lastRemUsed._readField$0(), $._BigIntImpl____lastRemUsed._readField$0());
      t1 = A._BigIntImpl__normalize($._BigIntImpl____lastRemUsed._readField$0(), remDigits);
      rem = new A._BigIntImpl(false, remDigits, t1);
      t1 = $._BigIntImpl____lastRem_nsh._readField$0();
      if (typeof t1 !== "number")
        return t1.$gt();
      if (t1 > 0)
        rem = rem.$shr(0, $._BigIntImpl____lastRem_nsh._readField$0());
      return _this._isNegative && rem._used > 0 ? rem.$negate(0) : rem;
    },
    _divRem$1(other) {
      var yDigits, yUsed, t1, nsh, yDigits0, yUsed0, resultDigits, resultUsed0, topDigitDivisor, j, tmpDigits, tmpUsed, resultUsed1, t2, nyDigits, i, estimatedQuotientDigit, _this = this,
        resultUsed = _this._used;
      if (resultUsed === $._BigIntImpl__lastDividendUsed && other._used === $._BigIntImpl__lastDivisorUsed && _this._digits === $._BigIntImpl__lastDividendDigits && other._digits === $._BigIntImpl__lastDivisorDigits)
        return;
      yDigits = other._digits;
      yUsed = other._used;
      t1 = yUsed - 1;
      if (!(t1 >= 0 && t1 < yDigits.length))
        return A.ioore(yDigits, t1);
      nsh = 16 - B.JSInt_methods.get$bitLength(yDigits[t1]);
      if (nsh > 0) {
        yDigits0 = new Uint16Array(yUsed + 5);
        yUsed0 = A._BigIntImpl__lShiftDigits(yDigits, yUsed, nsh, yDigits0);
        resultDigits = new Uint16Array(resultUsed + 5);
        resultUsed0 = A._BigIntImpl__lShiftDigits(_this._digits, resultUsed, nsh, resultDigits);
      } else {
        resultDigits = A._BigIntImpl__cloneDigits(_this._digits, 0, resultUsed, resultUsed + 2);
        yUsed0 = yUsed;
        yDigits0 = yDigits;
        resultUsed0 = resultUsed;
      }
      t1 = yUsed0 - 1;
      if (!(t1 >= 0 && t1 < yDigits0.length))
        return A.ioore(yDigits0, t1);
      topDigitDivisor = yDigits0[t1];
      j = resultUsed0 - yUsed0;
      tmpDigits = new Uint16Array(resultUsed0);
      tmpUsed = A._BigIntImpl__dlShiftDigits(yDigits0, yUsed0, j, tmpDigits);
      resultUsed1 = resultUsed0 + 1;
      t1 = resultDigits.length;
      if (A._BigIntImpl__compareDigits(resultDigits, resultUsed0, tmpDigits, tmpUsed) >= 0) {
        if (!(resultUsed0 >= 0 && resultUsed0 < t1))
          return A.ioore(resultDigits, resultUsed0);
        resultDigits[resultUsed0] = 1;
        A._BigIntImpl__absSub(resultDigits, resultUsed1, tmpDigits, tmpUsed, resultDigits);
      } else {
        if (!(resultUsed0 >= 0 && resultUsed0 < t1))
          return A.ioore(resultDigits, resultUsed0);
        resultDigits[resultUsed0] = 0;
      }
      t2 = yUsed0 + 2;
      nyDigits = new Uint16Array(t2);
      if (!(yUsed0 >= 0 && yUsed0 < t2))
        return A.ioore(nyDigits, yUsed0);
      nyDigits[yUsed0] = 1;
      A._BigIntImpl__absSub(nyDigits, yUsed0 + 1, yDigits0, yUsed0, nyDigits);
      i = resultUsed0 - 1;
      for (; j > 0;) {
        estimatedQuotientDigit = A._BigIntImpl__estimateQuotientDigit(topDigitDivisor, resultDigits, i);
        --j;
        A._BigIntImpl__mulAdd(estimatedQuotientDigit, nyDigits, 0, resultDigits, j, yUsed0);
        if (!(i >= 0 && i < t1))
          return A.ioore(resultDigits, i);
        if (resultDigits[i] < estimatedQuotientDigit) {
          tmpUsed = A._BigIntImpl__dlShiftDigits(nyDigits, yUsed0, j, tmpDigits);
          A._BigIntImpl__absSub(resultDigits, resultUsed1, tmpDigits, tmpUsed, resultDigits);
          for (; --estimatedQuotientDigit, resultDigits[i] < estimatedQuotientDigit;)
            A._BigIntImpl__absSub(resultDigits, resultUsed1, tmpDigits, tmpUsed, resultDigits);
        }
        --i;
      }
      $._BigIntImpl__lastDividendDigits = _this._digits;
      $._BigIntImpl__lastDividendUsed = resultUsed;
      $._BigIntImpl__lastDivisorDigits = yDigits;
      $._BigIntImpl__lastDivisorUsed = yUsed;
      $._BigIntImpl____lastQuoRemDigits.__late_helper$_value = resultDigits;
      $._BigIntImpl____lastQuoRemUsed.__late_helper$_value = resultUsed1;
      $._BigIntImpl____lastRemUsed.__late_helper$_value = yUsed0;
      $._BigIntImpl____lastRem_nsh.__late_helper$_value = nsh;
    },
    get$hashCode(_) {
      var hash, t2, t3, i,
        combine = new A._BigIntImpl_hashCode_combine(),
        t1 = this._used;
      if (t1 === 0)
        return 6707;
      hash = this._isNegative ? 83585 : 429689;
      for (t2 = this._digits, t3 = t2.length, i = 0; i < t1; ++i) {
        if (!(i < t3))
          return A.ioore(t2, i);
        hash = combine.call$2(hash, t2[i]);
      }
      return new A._BigIntImpl_hashCode_finish().call$1(hash);
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A._BigIntImpl && this.compareTo$1(0, other) === 0;
    },
    toString$0(_) {
      var decimalDigitChunks, rest, t2, digits4, t3, _this = this,
        t1 = _this._used;
      if (t1 === 0)
        return "0";
      if (t1 === 1) {
        if (_this._isNegative) {
          t1 = _this._digits;
          if (0 >= t1.length)
            return A.ioore(t1, 0);
          return B.JSInt_methods.toString$0(-t1[0]);
        }
        t1 = _this._digits;
        if (0 >= t1.length)
          return A.ioore(t1, 0);
        return B.JSInt_methods.toString$0(t1[0]);
      }
      decimalDigitChunks = A._setArrayType([], type$.JSArray_String);
      t1 = _this._isNegative;
      rest = t1 ? _this.$negate(0) : _this;
      for (; rest._used > 1;) {
        t2 = $.$get$_BigIntImpl__bigInt10000();
        if (t2._used === 0)
          A.throwExpression(B.C_IntegerDivisionByZeroException);
        digits4 = J.toString$0$(rest._rem$1(t2));
        B.JSArray_methods.add$1(decimalDigitChunks, digits4);
        t3 = digits4.length;
        if (t3 === 1)
          B.JSArray_methods.add$1(decimalDigitChunks, "000");
        if (t3 === 2)
          B.JSArray_methods.add$1(decimalDigitChunks, "00");
        if (t3 === 3)
          B.JSArray_methods.add$1(decimalDigitChunks, "0");
        rest = rest._div$1(t2);
      }
      t2 = rest._digits;
      if (0 >= t2.length)
        return A.ioore(t2, 0);
      B.JSArray_methods.add$1(decimalDigitChunks, B.JSInt_methods.toString$0(t2[0]));
      if (t1)
        B.JSArray_methods.add$1(decimalDigitChunks, "-");
      return new A.ReversedListIterable(decimalDigitChunks, type$.ReversedListIterable_String).join$0(0);
    },
    $isBigInt: 1,
    $isComparable: 1
  };
  A._BigIntImpl_hashCode_combine.prototype = {
    call$2(hash, value) {
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    $signature: 20
  };
  A._BigIntImpl_hashCode_finish.prototype = {
    call$1(hash) {
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    $signature: 21
  };
  A.DateTime.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.DateTime && this._value === other._value && this.isUtc === other.isUtc;
    },
    compareTo$1(_, other) {
      return B.JSInt_methods.compareTo$1(this._value, type$.DateTime._as(other)._value);
    },
    get$hashCode(_) {
      var t1 = this._value;
      return (t1 ^ B.JSInt_methods._shrOtherPositive$1(t1, 30)) & 1073741823;
    },
    toString$0(_) {
      var _this = this,
        y = A.DateTime__fourDigits(A.Primitives_getYear(_this)),
        m = A.DateTime__twoDigits(A.Primitives_getMonth(_this)),
        d = A.DateTime__twoDigits(A.Primitives_getDay(_this)),
        h = A.DateTime__twoDigits(A.Primitives_getHours(_this)),
        min = A.DateTime__twoDigits(A.Primitives_getMinutes(_this)),
        sec = A.DateTime__twoDigits(A.Primitives_getSeconds(_this)),
        ms = A.DateTime__threeDigits(A.Primitives_getMilliseconds(_this));
      if (_this.isUtc)
        return y + "-" + m + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms + "Z";
      else
        return y + "-" + m + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms;
    },
    $isComparable: 1
  };
  A.Duration.prototype = {
    $add(_, other) {
      return new A.Duration(B.JSInt_methods.$add(this._duration, type$.Duration._as(other).get$_duration()));
    },
    $sub(_, other) {
      return new A.Duration(B.JSInt_methods.$sub(this._duration, type$.Duration._as(other).get$_duration()));
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.Duration && this._duration === other._duration;
    },
    get$hashCode(_) {
      return B.JSInt_methods.get$hashCode(this._duration);
    },
    compareTo$1(_, other) {
      return B.JSInt_methods.compareTo$1(this._duration, type$.Duration._as(other)._duration);
    },
    toString$0(_) {
      var minutes, minutesPadding, seconds, secondsPadding, paddedMicroseconds,
        microseconds = this._duration,
        hours = B.JSInt_methods._tdivFast$1(microseconds, 3600000000);
      microseconds %= 3600000000;
      if (microseconds < 0)
        microseconds = -microseconds;
      minutes = B.JSInt_methods._tdivFast$1(microseconds, 60000000);
      microseconds %= 60000000;
      minutesPadding = minutes < 10 ? "0" : "";
      seconds = B.JSInt_methods._tdivFast$1(microseconds, 1000000);
      secondsPadding = seconds < 10 ? "0" : "";
      paddedMicroseconds = B.JSString_methods.padLeft$2(B.JSInt_methods.toString$0(microseconds % 1000000), 6, "0");
      return "" + hours + ":" + minutesPadding + minutes + ":" + secondsPadding + seconds + "." + paddedMicroseconds;
    },
    $isComparable: 1
  };
  A.Error.prototype = {
    get$stackTrace() {
      return A.getTraceFromException(this.$thrownJsError);
    }
  };
  A.AssertionError.prototype = {
    toString$0(_) {
      var t1 = this.message;
      if (t1 != null)
        return "Assertion failed: " + A.Error_safeToString(t1);
      return "Assertion failed";
    }
  };
  A.TypeError.prototype = {};
  A.NullThrownError.prototype = {
    toString$0(_) {
      return "Throw of null.";
    }
  };
  A.ArgumentError.prototype = {
    get$_errorName() {
      return "Invalid argument" + (!this._hasValue ? "(s)" : "");
    },
    get$_errorExplanation() {
      return "";
    },
    toString$0(_) {
      var explanation, errorValue, _this = this,
        $name = _this.name,
        nameString = $name == null ? "" : " (" + $name + ")",
        message = _this.message,
        messageString = message == null ? "" : ": " + A.S(message),
        prefix = _this.get$_errorName() + nameString + messageString;
      if (!_this._hasValue)
        return prefix;
      explanation = _this.get$_errorExplanation();
      errorValue = A.Error_safeToString(_this.invalidValue);
      return prefix + explanation + ": " + errorValue;
    }
  };
  A.RangeError.prototype = {
    get$_errorName() {
      return "RangeError";
    },
    get$_errorExplanation() {
      var explanation,
        start = this.start,
        end = this.end;
      if (start == null)
        explanation = end != null ? ": Not less than or equal to " + A.S(end) : "";
      else if (end == null)
        explanation = ": Not greater than or equal to " + A.S(start);
      else if (end > start)
        explanation = ": Not in inclusive range " + A.S(start) + ".." + A.S(end);
      else
        explanation = end < start ? ": Valid value range is empty" : ": Only valid value is " + A.S(start);
      return explanation;
    }
  };
  A.IndexError.prototype = {
    get$_errorName() {
      return "RangeError";
    },
    get$_errorExplanation() {
      var t1,
        invalidValue = A._asIntS(this.invalidValue);
      if (typeof invalidValue !== "number")
        return invalidValue.$lt();
      if (invalidValue < 0)
        return ": index must not be negative";
      t1 = this.length;
      if (t1 === 0)
        return ": no indices are valid";
      return ": index should be less than " + A.S(t1);
    },
    get$length(receiver) {
      return this.length;
    }
  };
  A.NoSuchMethodError.prototype = {
    toString$0(_) {
      var $arguments, t1, _i, t2, t3, argument, receiverText, actualParameters, _this = this, _box_0 = {},
        sb = new A.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 += A.Error_safeToString(argument);
        _box_0.comma = ", ";
      }
      _this._namedArguments.forEach$1(0, new A.NoSuchMethodError_toString_closure(_box_0, sb));
      receiverText = A.Error_safeToString(_this._core$_receiver);
      actualParameters = sb.toString$0(0);
      t1 = "NoSuchMethodError: method not found: '" + A.S(_this._core$_memberName._name) + "'\nReceiver: " + receiverText + "\nArguments: [" + actualParameters + "]";
      return t1;
    }
  };
  A.UnsupportedError.prototype = {
    toString$0(_) {
      return "Unsupported operation: " + this.message;
    }
  };
  A.UnimplementedError.prototype = {
    toString$0(_) {
      var message = this.message;
      return message != null ? "UnimplementedError: " + message : "UnimplementedError";
    }
  };
  A.StateError.prototype = {
    toString$0(_) {
      return "Bad state: " + this.message;
    }
  };
  A.ConcurrentModificationError.prototype = {
    toString$0(_) {
      var t1 = this.modifiedObject;
      if (t1 == null)
        return "Concurrent modification during iteration.";
      return "Concurrent modification during iteration: " + A.Error_safeToString(t1) + ".";
    }
  };
  A.OutOfMemoryError.prototype = {
    toString$0(_) {
      return "Out of Memory";
    },
    get$stackTrace() {
      return null;
    },
    $isError: 1
  };
  A.StackOverflowError.prototype = {
    toString$0(_) {
      return "Stack Overflow";
    },
    get$stackTrace() {
      return null;
    },
    $isError: 1
  };
  A.CyclicInitializationError.prototype = {
    toString$0(_) {
      var variableName = this.variableName;
      return variableName == null ? "Reading static variable during its initialization" : "Reading static variable '" + variableName + "' during its initialization";
    }
  };
  A._Exception.prototype = {
    toString$0(_) {
      return "Exception: " + this.message;
    }
  };
  A.FormatException.prototype = {
    toString$0(_) {
      var t1, lineNum, lineStart, previousCharWasCR, i, char, lineEnd, end, start, prefix, postfix, slice,
        message = this.message,
        report = message != null && "" !== message ? "FormatException: " + A.S(message) : "FormatException",
        offset = this.offset,
        source = this.source;
      if (typeof source == "string") {
        if (offset != null)
          t1 = offset < 0 || offset > source.length;
        else
          t1 = false;
        if (t1)
          offset = null;
        if (offset == null) {
          if (source.length > 78)
            source = B.JSString_methods.substring$2(source, 0, 75) + "...";
          return report + "\n" + source;
        }
        for (lineNum = 1, lineStart = 0, previousCharWasCR = false, i = 0; i < offset; ++i) {
          char = B.JSString_methods._codeUnitAt$1(source, i);
          if (char === 10) {
            if (lineStart !== i || !previousCharWasCR)
              ++lineNum;
            lineStart = i + 1;
            previousCharWasCR = false;
          } else if (char === 13) {
            ++lineNum;
            lineStart = i + 1;
            previousCharWasCR = true;
          }
        }
        report = lineNum > 1 ? report + (" (at line " + lineNum + ", character " + (offset - lineStart + 1) + ")\n") : report + (" (at character " + (offset + 1) + ")\n");
        lineEnd = source.length;
        for (i = offset; i < lineEnd; ++i) {
          char = B.JSString_methods.codeUnitAt$1(source, i);
          if (char === 10 || char === 13) {
            lineEnd = i;
            break;
          }
        }
        if (lineEnd - lineStart > 78)
          if (offset - lineStart < 75) {
            end = lineStart + 75;
            start = lineStart;
            prefix = "";
            postfix = "...";
          } else {
            if (lineEnd - offset < 75) {
              start = lineEnd - 75;
              end = lineEnd;
              postfix = "";
            } else {
              start = offset - 36;
              end = offset + 36;
              postfix = "...";
            }
            prefix = "...";
          }
        else {
          end = lineEnd;
          start = lineStart;
          prefix = "";
          postfix = "";
        }
        slice = B.JSString_methods.substring$2(source, start, end);
        return report + prefix + slice + postfix + "\n" + B.JSString_methods.$mul(" ", offset - start + prefix.length) + "^\n";
      } else
        return offset != null ? report + (" (at offset " + A.S(offset) + ")") : report;
    }
  };
  A.IntegerDivisionByZeroException.prototype = {
    get$stackTrace() {
      return null;
    },
    toString$0(_) {
      return "IntegerDivisionByZeroException";
    },
    $isError: 1
  };
  A.Expando.prototype = {
    $index(_, object) {
      var t1 = typeof object == "number" || false;
      if (t1)
        A.throwExpression(A.ArgumentError$value(object, string$.Expand, null));
      return this._jsWeakMap.get(object);
    },
    toString$0(_) {
      return "Expando:null";
    }
  };
  A.Iterable.prototype = {
    cast$1$0(_, $R) {
      return A.CastIterable_CastIterable(this, A._instanceType(this)._eval$1("Iterable.E"), $R);
    },
    map$1$1(_, toElement, $T) {
      var t1 = A._instanceType(this);
      return A.MappedIterable_MappedIterable(this, t1._bind$1($T)._eval$1("1(Iterable.E)")._as(toElement), t1._eval$1("Iterable.E"), $T);
    },
    map$1($receiver, toElement) {
      return this.map$1$1($receiver, toElement, type$.dynamic);
    },
    where$1(_, test) {
      var t1 = A._instanceType(this);
      return new A.WhereIterable(this, t1._eval$1("bool(Iterable.E)")._as(test), t1._eval$1("WhereIterable<Iterable.E>"));
    },
    contains$1(_, element) {
      var t1;
      for (t1 = this.get$iterator(this); t1.moveNext$0();)
        if (J.$eq$(t1.get$current(t1), element))
          return true;
      return false;
    },
    forEach$1(_, action) {
      var t1;
      A._instanceType(this)._eval$1("~(Iterable.E)")._as(action);
      for (t1 = this.get$iterator(this); t1.moveNext$0();)
        action.call$1(t1.get$current(t1));
    },
    toList$1$growable(_, growable) {
      return A.List_List$of(this, growable, A._instanceType(this)._eval$1("Iterable.E"));
    },
    toList$0($receiver) {
      return this.toList$1$growable($receiver, true);
    },
    get$length(_) {
      var count,
        it = this.get$iterator(this);
      for (count = 0; it.moveNext$0();)
        ++count;
      return count;
    },
    get$isEmpty(_) {
      return !this.get$iterator(this).moveNext$0();
    },
    get$isNotEmpty(_) {
      return !this.get$isEmpty(this);
    },
    skip$1(_, count) {
      return A.SkipIterable_SkipIterable(this, count, A._instanceType(this)._eval$1("Iterable.E"));
    },
    get$first(_) {
      var it = this.get$iterator(this);
      if (!it.moveNext$0())
        throw A.wrapException(A.IterableElementError_noElement());
      return it.get$current(it);
    },
    get$single(_) {
      var result,
        it = this.get$iterator(this);
      if (!it.moveNext$0())
        throw A.wrapException(A.IterableElementError_noElement());
      result = it.get$current(it);
      if (it.moveNext$0())
        throw A.wrapException(A.IterableElementError_tooMany());
      return result;
    },
    elementAt$1(_, index) {
      var t1, elementIndex, element;
      A.RangeError_checkNotNegative(index, "index");
      for (t1 = this.get$iterator(this), elementIndex = 0; t1.moveNext$0();) {
        element = t1.get$current(t1);
        if (index === elementIndex)
          return element;
        ++elementIndex;
      }
      throw A.wrapException(A.IndexError$(index, this, "index", null, elementIndex));
    },
    toString$0(_) {
      return A.IterableBase_iterableToShortString(this, "(", ")");
    }
  };
  A.Iterator.prototype = {};
  A.Null.prototype = {
    get$hashCode(_) {
      return A.Object.prototype.get$hashCode.call(this, this);
    },
    toString$0(_) {
      return "null";
    }
  };
  A.Object.prototype = {$isObject: 1,
    $eq(_, other) {
      return this === other;
    },
    get$hashCode(_) {
      return A.Primitives_objectHashCode(this);
    },
    toString$0(_) {
      return "Instance of '" + A.S(A.Primitives_objectTypeName(this)) + "'";
    },
    noSuchMethod$1(_, invocation) {
      type$.Invocation._as(invocation);
      throw A.wrapException(A.NoSuchMethodError$(this, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments()));
    },
    get$runtimeType(_) {
      return A.getRuntimeType(this);
    },
    toString() {
      return this.toString$0(this);
    }
  };
  A._StringStackTrace.prototype = {
    toString$0(_) {
      return this._stackTrace;
    },
    $isStackTrace: 1
  };
  A.StringBuffer.prototype = {
    get$length(_) {
      return this._contents.length;
    },
    write$1(_, obj) {
      this._contents += A.S(obj);
    },
    writeCharCode$1(charCode) {
      this._contents += A.Primitives_stringFromCharCode(charCode);
    },
    toString$0(_) {
      var t1 = this._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    $isStringSink: 1
  };
  A.Uri__parseIPv4Address_error.prototype = {
    call$2(msg, position) {
      throw A.wrapException(A.FormatException$("Illegal IPv4 address, " + msg, this.host, position));
    },
    $signature: 53
  };
  A.Uri_parseIPv6Address_error.prototype = {
    call$2(msg, position) {
      throw A.wrapException(A.FormatException$("Illegal IPv6 address, " + msg, this.host, position));
    },
    call$1(msg) {
      return this.call$2(msg, null);
    },
    $signature: 54
  };
  A.Uri_parseIPv6Address_parseHex.prototype = {
    call$2(start, end) {
      var value;
      if (end - start > 4)
        this.error.call$2("an IPv6 part can only contain a maximum of 4 hex digits", start);
      value = A.int_parse(B.JSString_methods.substring$2(this.host, start, end), 16);
      if (value < 0 || value > 65535)
        this.error.call$2("each part must be in the range of `0x0..0xFFFF`", start);
      return value;
    },
    $signature: 20
  };
  A._Uri.prototype = {
    get$_text() {
      var t1, t2, t3, t4, _this = this,
        value = _this.___Uri__text;
      if (value === $) {
        t1 = _this.scheme;
        t2 = t1.length !== 0 ? t1 + ":" : "";
        t3 = _this._host;
        t4 = t3 == null;
        if (!t4 || t1 === "file") {
          t1 = t2 + "//";
          t2 = _this._userInfo;
          if (t2.length !== 0)
            t1 = t1 + t2 + "@";
          if (!t4)
            t1 += t3;
          t2 = _this._port;
          if (t2 != null)
            t1 = t1 + ":" + A.S(t2);
        } else
          t1 = t2;
        t1 += _this.path;
        t2 = _this._query;
        if (t2 != null)
          t1 = t1 + "?" + t2;
        t2 = _this._fragment;
        if (t2 != null)
          t1 = t1 + "#" + t2;
        A._lateInitializeOnceCheck(_this.___Uri__text, "_text");
        value = _this.___Uri__text = t1.charCodeAt(0) == 0 ? t1 : t1;
      }
      return value;
    },
    get$hashCode(_) {
      var result, _this = this,
        value = _this.___Uri_hashCode;
      if (value === $) {
        result = B.JSString_methods.get$hashCode(_this.get$_text());
        A._lateInitializeOnceCheck(_this.___Uri_hashCode, "hashCode");
        _this.___Uri_hashCode = result;
        value = result;
      }
      return value;
    },
    get$userInfo() {
      return this._userInfo;
    },
    get$host(_) {
      var host = this._host;
      if (host == null)
        return "";
      if (B.JSString_methods.startsWith$1(host, "["))
        return B.JSString_methods.substring$2(host, 1, host.length - 1);
      return host;
    },
    get$port(_) {
      var t1 = this._port;
      return t1 == null ? A._Uri__defaultPort(this.scheme) : t1;
    },
    get$query(_) {
      var t1 = this._query;
      return t1 == null ? "" : t1;
    },
    get$fragment() {
      var t1 = this._fragment;
      return t1 == null ? "" : t1;
    },
    isScheme$1(scheme) {
      var thisScheme = this.scheme;
      if (scheme.length !== thisScheme.length)
        return false;
      return A._Uri__compareScheme(scheme, thisScheme);
    },
    replace$1$scheme(_, scheme) {
      var isFile, userInfo, port, host, currentPath, t1, path, _this = this;
      scheme = A._Uri__makeScheme(scheme, 0, scheme.length);
      isFile = scheme === "file";
      userInfo = _this._userInfo;
      port = _this._port;
      if (scheme !== _this.scheme)
        port = A._Uri__makePort(port, scheme);
      host = _this._host;
      if (!(host != null))
        host = userInfo.length !== 0 || port != null || isFile ? "" : null;
      currentPath = _this.path;
      if (!isFile)
        t1 = host != null && currentPath.length !== 0;
      else
        t1 = true;
      if (t1 && !B.JSString_methods.startsWith$1(currentPath, "/"))
        currentPath = "/" + currentPath;
      path = currentPath;
      return A._Uri$_internal(scheme, userInfo, host, port, path, _this._query, _this._fragment);
    },
    get$hasAuthority() {
      return this._host != null;
    },
    get$hasQuery() {
      return this._query != null;
    },
    get$hasFragment() {
      return this._fragment != null;
    },
    toString$0(_) {
      return this.get$_text();
    },
    $eq(_, other) {
      var t1, t2, _this = this;
      if (other == null)
        return false;
      if (_this === other)
        return true;
      if (type$.Uri._is(other))
        if (_this.scheme === other.get$scheme())
          if (_this._host != null === other.get$hasAuthority())
            if (_this._userInfo === other.get$userInfo())
              if (_this.get$host(_this) === other.get$host(other))
                if (_this.get$port(_this) === other.get$port(other))
                  if (_this.path === other.get$path(other)) {
                    t1 = _this._query;
                    t2 = t1 == null;
                    if (!t2 === other.get$hasQuery()) {
                      if (t2)
                        t1 = "";
                      if (t1 === other.get$query(other)) {
                        t1 = _this._fragment;
                        t2 = t1 == null;
                        if (!t2 === other.get$hasFragment()) {
                          if (t2)
                            t1 = "";
                          t1 = t1 === other.get$fragment();
                        } else
                          t1 = false;
                      } else
                        t1 = false;
                    } else
                      t1 = false;
                  } else
                    t1 = false;
                else
                  t1 = false;
              else
                t1 = false;
            else
              t1 = false;
          else
            t1 = false;
        else
          t1 = false;
      else
        t1 = false;
      return t1;
    },
    $isUri: 1,
    get$scheme() {
      return this.scheme;
    },
    get$path(receiver) {
      return this.path;
    }
  };
  A._Uri__makePath_closure.prototype = {
    call$1(s) {
      return A._Uri__uriEncode(B.List_qg40, A._asStringS(s), B.C_Utf8Codec, false);
    },
    $signature: 22
  };
  A.UriData.prototype = {
    get$uri() {
      var t2, queryIndex, end, query, _this = this, _null = null,
        t1 = _this._uriCache;
      if (t1 == null) {
        t1 = _this._separatorIndices;
        if (0 >= t1.length)
          return A.ioore(t1, 0);
        t2 = _this._text;
        t1 = t1[0] + 1;
        queryIndex = B.JSString_methods.indexOf$2(t2, "?", t1);
        end = t2.length;
        if (queryIndex >= 0) {
          query = A._Uri__normalizeOrSubstring(t2, queryIndex + 1, end, B.List_CVk, false);
          end = queryIndex;
        } else
          query = _null;
        t1 = _this._uriCache = new A._DataUri("data", "", _null, _null, A._Uri__normalizeOrSubstring(t2, t1, end, B.List_qg4, false), query, _null);
      }
      return t1;
    },
    toString$0(_) {
      var t2,
        t1 = this._separatorIndices;
      if (0 >= t1.length)
        return A.ioore(t1, 0);
      t2 = this._text;
      return t1[0] === -1 ? "data:" + t2 : t2;
    }
  };
  A._createTables_build.prototype = {
    call$2(state, defaultTransition) {
      var t1 = this.tables;
      if (!(state < t1.length))
        return A.ioore(t1, state);
      t1 = t1[state];
      B.NativeUint8List_methods.fillRange$3(t1, 0, 96, defaultTransition);
      return t1;
    },
    $signature: 61
  };
  A._createTables_setChars.prototype = {
    call$3(target, chars, transition) {
      var t1, i, t2;
      for (t1 = chars.length, i = 0; i < t1; ++i) {
        t2 = B.JSString_methods._codeUnitAt$1(chars, i) ^ 96;
        if (!(t2 < 96))
          return A.ioore(target, t2);
        target[t2] = transition;
      }
    },
    $signature: 23
  };
  A._createTables_setRange.prototype = {
    call$3(target, range, transition) {
      var i, n, t1;
      for (i = B.JSString_methods._codeUnitAt$1(range, 0), n = B.JSString_methods._codeUnitAt$1(range, 1); i <= n; ++i) {
        t1 = (i ^ 96) >>> 0;
        if (!(t1 < 96))
          return A.ioore(target, t1);
        target[t1] = transition;
      }
    },
    $signature: 23
  };
  A._SimpleUri.prototype = {
    get$hasAuthority() {
      return this._hostStart > 0;
    },
    get$hasPort() {
      return this._hostStart > 0 && this._portStart + 1 < this._pathStart;
    },
    get$hasQuery() {
      return this._queryStart < this._fragmentStart;
    },
    get$hasFragment() {
      return this._fragmentStart < this._uri.length;
    },
    isScheme$1(scheme) {
      var t1 = scheme.length;
      if (t1 === 0)
        return this._schemeEnd < 0;
      if (t1 !== this._schemeEnd)
        return false;
      return A._Uri__compareScheme(scheme, this._uri);
    },
    get$scheme() {
      var t1 = this._schemeCache;
      return t1 == null ? this._schemeCache = this._computeScheme$0() : t1;
    },
    _computeScheme$0() {
      var t2, _this = this,
        t1 = _this._schemeEnd;
      if (t1 <= 0)
        return "";
      t2 = t1 === 4;
      if (t2 && B.JSString_methods.startsWith$1(_this._uri, "http"))
        return "http";
      if (t1 === 5 && B.JSString_methods.startsWith$1(_this._uri, "https"))
        return "https";
      if (t2 && B.JSString_methods.startsWith$1(_this._uri, "file"))
        return "file";
      if (t1 === 7 && B.JSString_methods.startsWith$1(_this._uri, "package"))
        return "package";
      return B.JSString_methods.substring$2(_this._uri, 0, t1);
    },
    get$userInfo() {
      var t1 = this._hostStart,
        t2 = this._schemeEnd + 3;
      return t1 > t2 ? B.JSString_methods.substring$2(this._uri, t2, t1 - 1) : "";
    },
    get$host(_) {
      var t1 = this._hostStart;
      return t1 > 0 ? B.JSString_methods.substring$2(this._uri, t1, this._portStart) : "";
    },
    get$port(_) {
      var t1, _this = this;
      if (_this.get$hasPort())
        return A.int_parse(B.JSString_methods.substring$2(_this._uri, _this._portStart + 1, _this._pathStart), null);
      t1 = _this._schemeEnd;
      if (t1 === 4 && B.JSString_methods.startsWith$1(_this._uri, "http"))
        return 80;
      if (t1 === 5 && B.JSString_methods.startsWith$1(_this._uri, "https"))
        return 443;
      return 0;
    },
    get$path(_) {
      return B.JSString_methods.substring$2(this._uri, this._pathStart, this._queryStart);
    },
    get$query(_) {
      var t1 = this._queryStart,
        t2 = this._fragmentStart;
      return t1 < t2 ? B.JSString_methods.substring$2(this._uri, t1 + 1, t2) : "";
    },
    get$fragment() {
      var t1 = this._fragmentStart,
        t2 = this._uri;
      return t1 < t2.length ? B.JSString_methods.substring$1(t2, t1 + 1) : "";
    },
    replace$1$scheme(_, scheme) {
      var schemeChanged, isFile, t1, userInfo, port, host, t2, path, t3, query, fragment, _this = this, _null = null;
      scheme = A._Uri__makeScheme(scheme, 0, scheme.length);
      schemeChanged = !(_this._schemeEnd === scheme.length && B.JSString_methods.startsWith$1(_this._uri, scheme));
      isFile = scheme === "file";
      t1 = _this._hostStart;
      userInfo = t1 > 0 ? B.JSString_methods.substring$2(_this._uri, _this._schemeEnd + 3, t1) : "";
      port = _this.get$hasPort() ? _this.get$port(_this) : _null;
      if (schemeChanged)
        port = A._Uri__makePort(port, scheme);
      t1 = _this._hostStart;
      if (t1 > 0)
        host = B.JSString_methods.substring$2(_this._uri, t1, _this._portStart);
      else
        host = userInfo.length !== 0 || port != null || isFile ? "" : _null;
      t1 = _this._uri;
      t2 = _this._queryStart;
      path = B.JSString_methods.substring$2(t1, _this._pathStart, t2);
      if (!isFile)
        t3 = host != null && path.length !== 0;
      else
        t3 = true;
      if (t3 && !B.JSString_methods.startsWith$1(path, "/"))
        path = "/" + path;
      t3 = _this._fragmentStart;
      query = t2 < t3 ? B.JSString_methods.substring$2(t1, t2 + 1, t3) : _null;
      t2 = _this._fragmentStart;
      fragment = t2 < t1.length ? B.JSString_methods.substring$1(t1, t2 + 1) : _null;
      return A._Uri$_internal(scheme, userInfo, host, port, path, query, fragment);
    },
    get$hashCode(_) {
      var t1 = this._hashCodeCache;
      return t1 == null ? this._hashCodeCache = B.JSString_methods.get$hashCode(this._uri) : t1;
    },
    $eq(_, other) {
      if (other == null)
        return false;
      if (this === other)
        return true;
      return type$.Uri._is(other) && this._uri === other.toString$0(0);
    },
    toString$0(_) {
      return this._uri;
    },
    $isUri: 1
  };
  A._DataUri.prototype = {};
  A.HtmlElement.prototype = {$isHtmlElement: 1};
  A.AccessibleNodeList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.AnchorElement.prototype = {
    set$href(receiver, value) {
      receiver.href = value;
    },
    toString$0(receiver) {
      return String(receiver);
    },
    $isAnchorElement: 1
  };
  A.AreaElement.prototype = {
    toString$0(receiver) {
      return String(receiver);
    }
  };
  A.BaseElement.prototype = {$isBaseElement: 1};
  A.Blob.prototype = {$isBlob: 1};
  A.BodyElement.prototype = {$isBodyElement: 1};
  A.CharacterData.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.CloseEvent.prototype = {$isCloseEvent: 1};
  A.CssPerspective.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.CssRule.prototype = {$isCssRule: 1};
  A.CssStyleDeclaration.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.CssStyleDeclarationBase.prototype = {};
  A.CssStyleValue.prototype = {};
  A.CssTransformComponent.prototype = {};
  A.CssTransformValue.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.CssUnparsedValue.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.CustomEvent.prototype = {
    _initCustomEvent$4(receiver, type, bubbles, cancelable, detail) {
      return receiver.initCustomEvent(type, true, true, detail);
    },
    $isCustomEvent: 1
  };
  A.DataTransferItemList.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      return receiver[index];
    }
  };
  A.Document.prototype = {$isDocument: 1};
  A.DomException.prototype = {
    toString$0(receiver) {
      return String(receiver);
    }
  };
  A.DomImplementation.prototype = {
    createHtmlDocument$1(receiver, title) {
      return receiver.createHTMLDocument(title);
    }
  };
  A.DomRectList.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.Rectangle_num._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.DomRectReadOnly.prototype = {
    toString$0(receiver) {
      var t2,
        t1 = receiver.left;
      t1.toString;
      t1 = "Rectangle (" + A.S(t1) + ", ";
      t2 = receiver.top;
      t2.toString;
      return t1 + A.S(t2) + ") " + A.S(this.get$width(receiver)) + " x " + A.S(this.get$height(receiver));
    },
    $eq(receiver, other) {
      var t1, t2;
      if (other == null)
        return false;
      if (type$.Rectangle_num._is(other)) {
        t1 = receiver.left;
        t1.toString;
        t2 = other.left;
        t2.toString;
        if (t1 === t2) {
          t1 = receiver.top;
          t1.toString;
          t2 = other.top;
          t2.toString;
          if (t1 === t2) {
            t1 = J.getInterceptor$x(other);
            t1 = this.get$width(receiver) == t1.get$width(other) && this.get$height(receiver) == t1.get$height(other);
          } else
            t1 = false;
        } else
          t1 = false;
      } else
        t1 = false;
      return t1;
    },
    get$hashCode(receiver) {
      var t2,
        t1 = receiver.left;
      t1.toString;
      t2 = receiver.top;
      t2.toString;
      return A.Object_hash(t1, t2, this.get$width(receiver), this.get$height(receiver));
    },
    get$_height(receiver) {
      return receiver.height;
    },
    get$height(receiver) {
      var t1 = this.get$_height(receiver);
      t1.toString;
      return t1;
    },
    get$_width(receiver) {
      return receiver.width;
    },
    get$width(receiver) {
      var t1 = this.get$_width(receiver);
      t1.toString;
      return t1;
    },
    $isRectangle: 1
  };
  A.DomStringList.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      A._asStringS(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.DomTokenList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A._FrozenElementList.prototype = {
    get$length(_) {
      return this._nodeList.length;
    },
    $index(_, index) {
      var t1 = this._nodeList;
      if (!(index >= 0 && index < t1.length))
        return A.ioore(t1, index);
      return this.$ti._precomputed1._as(t1[index]);
    },
    $indexSet(_, index, value) {
      A._asIntS(index);
      this.$ti._precomputed1._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot modify list"));
    },
    sort$1(_, compare) {
      this.$ti._eval$1("int(1,1)?")._as(compare);
      throw A.wrapException(A.UnsupportedError$("Cannot sort list"));
    },
    get$first(_) {
      return this.$ti._precomputed1._as(B.NodeList_methods.get$first(this._nodeList));
    }
  };
  A.Element.prototype = {
    get$attributes(receiver) {
      return new A._ElementAttributeMap(receiver);
    },
    toString$0(receiver) {
      return receiver.localName;
    },
    createFragment$3$treeSanitizer$validator(receiver, html, treeSanitizer, validator) {
      var t1, t2, contextElement, fragment;
      if (treeSanitizer == null) {
        t1 = $.Element__defaultValidator;
        if (t1 == null) {
          t1 = A._setArrayType([], type$.JSArray_NodeValidator);
          t2 = new A.NodeValidatorBuilder(t1);
          B.JSArray_methods.add$1(t1, A._Html5NodeValidator$(null));
          B.JSArray_methods.add$1(t1, A._TemplatingNodeValidator$());
          $.Element__defaultValidator = t2;
          validator = t2;
        } else
          validator = t1;
        t1 = $.Element__defaultSanitizer;
        if (t1 == null) {
          t1 = new A._ValidatingTreeSanitizer(validator);
          $.Element__defaultSanitizer = t1;
          treeSanitizer = t1;
        } else {
          t1.validator = validator;
          treeSanitizer = t1;
        }
      }
      if ($.Element__parseDocument == null) {
        t1 = document;
        t2 = t1.implementation;
        t2.toString;
        t2 = B.DomImplementation_methods.createHtmlDocument$1(t2, "");
        $.Element__parseDocument = t2;
        $.Element__parseRange = t2.createRange();
        t2 = $.Element__parseDocument.createElement("base");
        type$.BaseElement._as(t2);
        t1 = t1.baseURI;
        t1.toString;
        t2.href = t1;
        $.Element__parseDocument.head.appendChild(t2);
      }
      t1 = $.Element__parseDocument;
      if (t1.body == null) {
        t2 = t1.createElement("body");
        B.HtmlDocument_methods.set$body(t1, type$.BodyElement._as(t2));
      }
      t1 = $.Element__parseDocument;
      if (type$.BodyElement._is(receiver)) {
        t1 = t1.body;
        t1.toString;
        contextElement = t1;
      } else {
        t1.toString;
        contextElement = t1.createElement(receiver.tagName);
        $.Element__parseDocument.body.appendChild(contextElement);
      }
      if ("createContextualFragment" in window.Range.prototype && !B.JSArray_methods.contains$1(B.List_ego, receiver.tagName)) {
        $.Element__parseRange.selectNodeContents(contextElement);
        t1 = $.Element__parseRange;
        fragment = t1.createContextualFragment(html);
      } else {
        J.set$_innerHtml$x(contextElement, html);
        fragment = $.Element__parseDocument.createDocumentFragment();
        for (; t1 = contextElement.firstChild, t1 != null;)
          fragment.appendChild(t1);
      }
      if (contextElement !== $.Element__parseDocument.body)
        J.remove$0$x(contextElement);
      treeSanitizer.sanitizeTree$1(fragment);
      document.adoptNode(fragment);
      return fragment;
    },
    createFragment$2$treeSanitizer($receiver, html, treeSanitizer) {
      return this.createFragment$3$treeSanitizer$validator($receiver, html, treeSanitizer, null);
    },
    setInnerHtml$1(receiver, html) {
      this.set$text(receiver, null);
      receiver.appendChild(this.createFragment$3$treeSanitizer$validator(receiver, html, null, null));
    },
    set$_innerHtml(receiver, value) {
      receiver.innerHTML = value;
    },
    get$tagName(receiver) {
      return receiver.tagName;
    },
    $isElement: 1
  };
  A.Element_Element$html_closure.prototype = {
    call$1(e) {
      return type$.Element._is(type$.Node._as(e));
    },
    $signature: 81
  };
  A.Event.prototype = {$isEvent: 1};
  A.EventSource.prototype = {$isEventSource: 1};
  A.EventTarget.prototype = {
    addEventListener$3(receiver, type, listener, useCapture) {
      type$.nullable_dynamic_Function_Event._as(listener);
      if (listener != null)
        this._addEventListener$3(receiver, type, listener, useCapture);
    },
    addEventListener$2($receiver, type, listener) {
      return this.addEventListener$3($receiver, type, listener, null);
    },
    _addEventListener$3(receiver, type, listener, options) {
      return receiver.addEventListener(type, A.convertDartClosureToJS(type$.nullable_dynamic_Function_Event._as(listener), 1), options);
    },
    _removeEventListener$3(receiver, type, listener, options) {
      return receiver.removeEventListener(type, A.convertDartClosureToJS(type$.nullable_dynamic_Function_Event._as(listener), 1), false);
    },
    $isEventTarget: 1
  };
  A.File.prototype = {$isFile: 1};
  A.FileList.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.File._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1,
    $isFileList: 1
  };
  A.FileWriter.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.FormElement.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.Gamepad.prototype = {$isGamepad: 1};
  A.History.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.HtmlCollection.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.Node._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.HtmlDocument.prototype = {
    set$body(receiver, value) {
      receiver.body = value;
    }
  };
  A.HttpRequest.prototype = {
    open$3$async(receiver, method, url, async) {
      return receiver.open(method, url, true);
    },
    set$withCredentials(receiver, value) {
      receiver.withCredentials = true;
    },
    $isHttpRequest: 1
  };
  A.HttpRequest_request_closure.prototype = {
    call$1(e) {
      var t1, t2, accepted, unknownRedirect, t3;
      type$.ProgressEvent._as(e);
      t1 = this.xhr;
      t2 = t1.status;
      t2.toString;
      accepted = t2 >= 200 && t2 < 300;
      unknownRedirect = t2 > 307 && t2 < 400;
      t2 = accepted || t2 === 0 || t2 === 304 || unknownRedirect;
      t3 = this.completer;
      if (t2)
        t3.complete$1(0, t1);
      else
        t3.completeError$1(e);
    },
    $signature: 97
  };
  A.HttpRequestEventTarget.prototype = {};
  A.ImageData.prototype = {$isImageData: 1};
  A.KeyboardEvent.prototype = {$isKeyboardEvent: 1};
  A.Location.prototype = {
    toString$0(receiver) {
      return String(receiver);
    },
    $isLocation: 1
  };
  A.MediaList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.MessageEvent.prototype = {$isMessageEvent: 1};
  A.MessagePort.prototype = {$isMessagePort: 1};
  A.MidiInputMap.prototype = {
    containsKey$1(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(key)) != null;
    },
    $index(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(A._asStringS(key)));
    },
    forEach$1(receiver, f) {
      var entries, entry;
      type$.void_Function_String_dynamic._as(f);
      entries = receiver.entries();
      for (; true;) {
        entry = entries.next();
        if (entry.done)
          return;
        f.call$2(entry.value[0], A.convertNativeToDart_Dictionary(entry.value[1]));
      }
    },
    get$keys(receiver) {
      var keys = A._setArrayType([], type$.JSArray_String);
      this.forEach$1(receiver, new A.MidiInputMap_keys_closure(keys));
      return keys;
    },
    get$length(receiver) {
      return receiver.size;
    },
    get$isEmpty(receiver) {
      return receiver.size === 0;
    },
    $indexSet(receiver, key, value) {
      A._asStringS(key);
      throw A.wrapException(A.UnsupportedError$("Not supported"));
    },
    $isMap: 1
  };
  A.MidiInputMap_keys_closure.prototype = {
    call$2(k, v) {
      return B.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 6
  };
  A.MidiOutputMap.prototype = {
    containsKey$1(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(key)) != null;
    },
    $index(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(A._asStringS(key)));
    },
    forEach$1(receiver, f) {
      var entries, entry;
      type$.void_Function_String_dynamic._as(f);
      entries = receiver.entries();
      for (; true;) {
        entry = entries.next();
        if (entry.done)
          return;
        f.call$2(entry.value[0], A.convertNativeToDart_Dictionary(entry.value[1]));
      }
    },
    get$keys(receiver) {
      var keys = A._setArrayType([], type$.JSArray_String);
      this.forEach$1(receiver, new A.MidiOutputMap_keys_closure(keys));
      return keys;
    },
    get$length(receiver) {
      return receiver.size;
    },
    get$isEmpty(receiver) {
      return receiver.size === 0;
    },
    $indexSet(receiver, key, value) {
      A._asStringS(key);
      throw A.wrapException(A.UnsupportedError$("Not supported"));
    },
    $isMap: 1
  };
  A.MidiOutputMap_keys_closure.prototype = {
    call$2(k, v) {
      return B.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 6
  };
  A.MimeType.prototype = {$isMimeType: 1};
  A.MimeTypeArray.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.MimeType._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._ChildNodeListLazy.prototype = {
    get$first(_) {
      var result = this._this.firstChild;
      if (result == null)
        throw A.wrapException(A.StateError$("No elements"));
      return result;
    },
    get$single(_) {
      var t1 = this._this,
        l = t1.childNodes.length;
      if (l === 0)
        throw A.wrapException(A.StateError$("No elements"));
      if (l > 1)
        throw A.wrapException(A.StateError$("More than one element"));
      t1 = t1.firstChild;
      t1.toString;
      return t1;
    },
    addAll$1(_, iterable) {
      var t1, t2, len, i, t3;
      type$.Iterable_Node._as(iterable);
      if (iterable instanceof A._ChildNodeListLazy) {
        t1 = iterable._this;
        t2 = this._this;
        if (t1 !== t2)
          for (len = t1.childNodes.length, i = 0; i < len; ++i) {
            t3 = t1.firstChild;
            t3.toString;
            t2.appendChild(t3);
          }
        return;
      }
      for (t1 = iterable.get$iterator(iterable), t2 = this._this; t1.moveNext$0();)
        t2.appendChild(t1.get$current(t1));
    },
    $indexSet(_, index, value) {
      var t1;
      A._asIntS(index);
      t1 = this._this;
      t1.replaceChild(type$.Node._as(value), B.NodeList_methods.$index(t1.childNodes, index));
    },
    get$iterator(_) {
      var t1 = this._this.childNodes;
      return new A.FixedSizeListIterator(t1, t1.length, A.instanceType(t1)._eval$1("FixedSizeListIterator<ImmutableListMixin.E>"));
    },
    sort$1(_, compare) {
      type$.nullable_int_Function_Node_Node._as(compare);
      throw A.wrapException(A.UnsupportedError$("Cannot sort Node list"));
    },
    get$length(_) {
      return this._this.childNodes.length;
    },
    $index(_, index) {
      return B.NodeList_methods.$index(this._this.childNodes, index);
    }
  };
  A.Node.prototype = {
    remove$0(receiver) {
      var t1 = receiver.parentNode;
      if (t1 != null)
        t1.removeChild(receiver);
    },
    _clearChildren$0(receiver) {
      var t1;
      for (; t1 = receiver.firstChild, t1 != null;)
        receiver.removeChild(t1);
    },
    toString$0(receiver) {
      var value = receiver.nodeValue;
      return value == null ? this.super$Interceptor$toString(receiver) : value;
    },
    set$text(receiver, value) {
      receiver.textContent = value;
    },
    $isNode: 1
  };
  A.NodeList.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.Node._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.Plugin.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $isPlugin: 1
  };
  A.PluginArray.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.Plugin._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.ProgressEvent.prototype = {$isProgressEvent: 1};
  A.RtcStatsReport.prototype = {
    containsKey$1(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(key)) != null;
    },
    $index(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(A._asStringS(key)));
    },
    forEach$1(receiver, f) {
      var entries, entry;
      type$.void_Function_String_dynamic._as(f);
      entries = receiver.entries();
      for (; true;) {
        entry = entries.next();
        if (entry.done)
          return;
        f.call$2(entry.value[0], A.convertNativeToDart_Dictionary(entry.value[1]));
      }
    },
    get$keys(receiver) {
      var keys = A._setArrayType([], type$.JSArray_String);
      this.forEach$1(receiver, new A.RtcStatsReport_keys_closure(keys));
      return keys;
    },
    get$length(receiver) {
      return receiver.size;
    },
    get$isEmpty(receiver) {
      return receiver.size === 0;
    },
    $indexSet(receiver, key, value) {
      A._asStringS(key);
      throw A.wrapException(A.UnsupportedError$("Not supported"));
    },
    $isMap: 1
  };
  A.RtcStatsReport_keys_closure.prototype = {
    call$2(k, v) {
      return B.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 6
  };
  A.ScriptElement.prototype = {$isScriptElement: 1};
  A.SelectElement.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.SourceBuffer.prototype = {$isSourceBuffer: 1};
  A.SourceBufferList.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.SourceBuffer._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.SpeechGrammar.prototype = {$isSpeechGrammar: 1};
  A.SpeechGrammarList.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.SpeechGrammar._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.SpeechRecognitionResult.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $isSpeechRecognitionResult: 1
  };
  A.Storage.prototype = {
    containsKey$1(receiver, key) {
      return receiver.getItem(key) != null;
    },
    $index(receiver, key) {
      return receiver.getItem(A._asStringS(key));
    },
    $indexSet(receiver, key, value) {
      receiver.setItem(A._asStringS(key), A._asStringS(value));
    },
    forEach$1(receiver, f) {
      var i, key, t1;
      type$.void_Function_String_String._as(f);
      for (i = 0; true; ++i) {
        key = receiver.key(i);
        if (key == null)
          return;
        t1 = receiver.getItem(key);
        t1.toString;
        f.call$2(key, t1);
      }
    },
    get$keys(receiver) {
      var keys = A._setArrayType([], type$.JSArray_String);
      this.forEach$1(receiver, new A.Storage_keys_closure(keys));
      return keys;
    },
    get$length(receiver) {
      return receiver.length;
    },
    get$isEmpty(receiver) {
      return receiver.key(0) == null;
    },
    $isMap: 1
  };
  A.Storage_keys_closure.prototype = {
    call$2(k, v) {
      return B.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 32
  };
  A.StyleSheet.prototype = {$isStyleSheet: 1};
  A.TableElement.prototype = {
    createFragment$3$treeSanitizer$validator(receiver, html, treeSanitizer, validator) {
      var table, fragment;
      if ("createContextualFragment" in window.Range.prototype)
        return this.super$Element$createFragment(receiver, html, treeSanitizer, validator);
      table = A.Element_Element$html("<table>" + html + "</table>", treeSanitizer, validator);
      fragment = document.createDocumentFragment();
      fragment.toString;
      table.toString;
      new A._ChildNodeListLazy(fragment).addAll$1(0, new A._ChildNodeListLazy(table));
      return fragment;
    }
  };
  A.TableRowElement.prototype = {
    createFragment$3$treeSanitizer$validator(receiver, html, treeSanitizer, validator) {
      var t1, fragment, section, row;
      if ("createContextualFragment" in window.Range.prototype)
        return this.super$Element$createFragment(receiver, html, treeSanitizer, validator);
      t1 = document;
      fragment = t1.createDocumentFragment();
      t1 = B.TableElement_methods.createFragment$3$treeSanitizer$validator(t1.createElement("table"), html, treeSanitizer, validator);
      t1.toString;
      t1 = new A._ChildNodeListLazy(t1);
      section = t1.get$single(t1);
      section.toString;
      t1 = new A._ChildNodeListLazy(section);
      row = t1.get$single(t1);
      fragment.toString;
      row.toString;
      new A._ChildNodeListLazy(fragment).addAll$1(0, new A._ChildNodeListLazy(row));
      return fragment;
    }
  };
  A.TableSectionElement.prototype = {
    createFragment$3$treeSanitizer$validator(receiver, html, treeSanitizer, validator) {
      var t1, fragment, section;
      if ("createContextualFragment" in window.Range.prototype)
        return this.super$Element$createFragment(receiver, html, treeSanitizer, validator);
      t1 = document;
      fragment = t1.createDocumentFragment();
      t1 = B.TableElement_methods.createFragment$3$treeSanitizer$validator(t1.createElement("table"), html, treeSanitizer, validator);
      t1.toString;
      t1 = new A._ChildNodeListLazy(t1);
      section = t1.get$single(t1);
      fragment.toString;
      section.toString;
      new A._ChildNodeListLazy(fragment).addAll$1(0, new A._ChildNodeListLazy(section));
      return fragment;
    }
  };
  A.TemplateElement.prototype = {
    setInnerHtml$1(receiver, html) {
      var t1, fragment;
      this.set$text(receiver, null);
      t1 = receiver.content;
      t1.toString;
      J._clearChildren$0$x(t1);
      fragment = this.createFragment$3$treeSanitizer$validator(receiver, html, null, null);
      receiver.content.appendChild(fragment);
    },
    $isTemplateElement: 1
  };
  A.TextTrack.prototype = {$isTextTrack: 1};
  A.TextTrackCue.prototype = {$isTextTrackCue: 1};
  A.TextTrackCueList.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.TextTrackCue._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.TextTrackList.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.TextTrack._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.TimeRanges.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.Touch.prototype = {$isTouch: 1};
  A.TouchList.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.Touch._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.TrackDefaultList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.UIEvent.prototype = {};
  A.Url.prototype = {
    toString$0(receiver) {
      return String(receiver);
    }
  };
  A.VideoTrackList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.WebSocket.prototype = {
    set$binaryType(receiver, value) {
      receiver.binaryType = value;
    },
    send$1(receiver, data) {
      return receiver.send(data);
    },
    $isWebSocket: 1
  };
  A.Window.prototype = {
    open$2(receiver, url, $name) {
      var t1 = A._DOMWindowCrossFrame__createSafe(receiver.open(url, $name));
      return t1;
    },
    alert$1(receiver, message) {
      return receiver.alert(message);
    },
    confirm$1(receiver, message) {
      return receiver.confirm(message);
    },
    $isWindow: 1
  };
  A.WorkerGlobalScope.prototype = {$isWorkerGlobalScope: 1};
  A._Attr.prototype = {$is_Attr: 1};
  A._CssRuleList.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.CssRule._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._DomRect.prototype = {
    toString$0(receiver) {
      var t2,
        t1 = receiver.left;
      t1.toString;
      t1 = "Rectangle (" + A.S(t1) + ", ";
      t2 = receiver.top;
      t2.toString;
      t2 = t1 + A.S(t2) + ") ";
      t1 = receiver.width;
      t1.toString;
      t1 = t2 + A.S(t1) + " x ";
      t2 = receiver.height;
      t2.toString;
      return t1 + A.S(t2);
    },
    $eq(receiver, other) {
      var t1, t2;
      if (other == null)
        return false;
      if (type$.Rectangle_num._is(other)) {
        t1 = receiver.left;
        t1.toString;
        t2 = other.left;
        t2.toString;
        if (t1 === t2) {
          t1 = receiver.top;
          t1.toString;
          t2 = other.top;
          t2.toString;
          if (t1 === t2) {
            t1 = receiver.width;
            t1.toString;
            t2 = J.getInterceptor$x(other);
            if (t1 === t2.get$width(other)) {
              t1 = receiver.height;
              t1.toString;
              t2 = t1 === t2.get$height(other);
              t1 = t2;
            } else
              t1 = false;
          } else
            t1 = false;
        } else
          t1 = false;
      } else
        t1 = false;
      return t1;
    },
    get$hashCode(receiver) {
      var t2, t3, t4,
        t1 = receiver.left;
      t1.toString;
      t2 = receiver.top;
      t2.toString;
      t3 = receiver.width;
      t3.toString;
      t4 = receiver.height;
      t4.toString;
      return A.Object_hash(t1, t2, t3, t4);
    },
    get$_height(receiver) {
      return receiver.height;
    },
    get$height(receiver) {
      var t1 = receiver.height;
      t1.toString;
      return t1;
    },
    get$_width(receiver) {
      return receiver.width;
    },
    get$width(receiver) {
      var t1 = receiver.width;
      t1.toString;
      return t1;
    }
  };
  A._GamepadList.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.nullable_Gamepad._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._NamedNodeMap.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.Node._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._SpeechRecognitionResultList.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.SpeechRecognitionResult._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._StyleSheetList.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.StyleSheet._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._AttributeMap.prototype = {
    cast$2$0(_, $K, $V) {
      var t1 = type$.String;
      return A.Map_castFrom(this, t1, t1, $K, $V);
    },
    forEach$1(_, f) {
      var t1, t2, t3, _i, t4;
      type$.void_Function_String_String._as(f);
      for (t1 = this.get$keys(this), t2 = t1.length, t3 = this._element, _i = 0; _i < t1.length; t1.length === t2 || (0, A.throwConcurrentModificationError)(t1), ++_i) {
        t4 = A._asStringS(t1[_i]);
        f.call$2(t4, t3.getAttribute(t4));
      }
    },
    get$keys(_) {
      var keys, len, t2, i, attr, t3,
        t1 = this._element.attributes;
      t1.toString;
      keys = A._setArrayType([], type$.JSArray_String);
      for (len = t1.length, t2 = type$._Attr, i = 0; i < len; ++i) {
        if (!(i < t1.length))
          return A.ioore(t1, i);
        attr = t2._as(t1[i]);
        if (attr.namespaceURI == null) {
          t3 = attr.name;
          t3.toString;
          B.JSArray_methods.add$1(keys, t3);
        }
      }
      return keys;
    },
    get$isEmpty(_) {
      return this.get$keys(this).length === 0;
    }
  };
  A._ElementAttributeMap.prototype = {
    containsKey$1(_, key) {
      return typeof key == "string" && A.boolConversionCheck(this._element.hasAttribute(key));
    },
    $index(_, key) {
      return this._element.getAttribute(A._asStringS(key));
    },
    $indexSet(_, key, value) {
      this._element.setAttribute(A._asStringS(key), A._asStringS(value));
    },
    get$length(_) {
      return this.get$keys(this).length;
    }
  };
  A.EventStreamProvider.prototype = {};
  A._EventStream.prototype = {
    listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError) {
      var t1 = this.$ti;
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      return A._EventStreamSubscription$(this._target, this._eventType, onData, false, t1._precomputed1);
    },
    listen$3$onDone$onError(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    }
  };
  A._EventStreamSubscription.prototype = {
    cancel$0(_) {
      var _this = this;
      if (_this._target == null)
        return $.$get$nullFuture();
      _this._unlisten$0();
      _this._target = null;
      _this.set$_onData(null);
      return $.$get$nullFuture();
    },
    onData$1(handleData) {
      var t1, _this = this;
      _this.$ti._eval$1("~(1)?")._as(handleData);
      if (_this._target == null)
        throw A.wrapException(A.StateError$("Subscription has been canceled."));
      _this._unlisten$0();
      t1 = A._wrapZone(new A._EventStreamSubscription_onData_closure(handleData), type$.Event);
      _this.set$_onData(t1);
      _this._tryResume$0();
    },
    pause$0(_) {
      if (this._target == null)
        return;
      ++this._pauseCount;
      this._unlisten$0();
    },
    resume$0(_) {
      var _this = this;
      if (_this._target == null || _this._pauseCount <= 0)
        return;
      --_this._pauseCount;
      _this._tryResume$0();
    },
    _tryResume$0() {
      var t2, _this = this,
        t1 = _this._onData;
      if (t1 != null && _this._pauseCount <= 0) {
        t2 = _this._target;
        t2.toString;
        J.addEventListener$3$x(t2, _this._eventType, t1, false);
      }
    },
    _unlisten$0() {
      var t2,
        t1 = this._onData;
      if (t1 != null) {
        t2 = this._target;
        t2.toString;
        J._removeEventListener$3$x(t2, this._eventType, type$.nullable_dynamic_Function_Event._as(t1), false);
      }
    },
    set$_onData(_onData) {
      this._onData = type$.nullable_dynamic_Function_Event._as(_onData);
    }
  };
  A._EventStreamSubscription_closure.prototype = {
    call$1(e) {
      return this.onData.call$1(type$.Event._as(e));
    },
    $signature: 5
  };
  A._EventStreamSubscription_onData_closure.prototype = {
    call$1(e) {
      return this.handleData.call$1(type$.Event._as(e));
    },
    $signature: 5
  };
  A._Html5NodeValidator.prototype = {
    _Html5NodeValidator$1$uriPolicy(uriPolicy) {
      var _i;
      if ($._Html5NodeValidator__attributeValidators.get$isEmpty($._Html5NodeValidator__attributeValidators)) {
        for (_i = 0; _i < 262; ++_i)
          $._Html5NodeValidator__attributeValidators.$indexSet(0, B.List_2Zi[_i], A.html0__Html5NodeValidator__standardAttributeValidator$closure());
        for (_i = 0; _i < 12; ++_i)
          $._Html5NodeValidator__attributeValidators.$indexSet(0, B.List_yrN[_i], A.html0__Html5NodeValidator__uriAttributeValidator$closure());
      }
    },
    allowsElement$1(element) {
      return $.$get$_Html5NodeValidator__allowedElements().contains$1(0, A.Element__safeTagName(element));
    },
    allowsAttribute$3(element, attributeName, value) {
      var validator = $._Html5NodeValidator__attributeValidators.$index(0, A.S(A.Element__safeTagName(element)) + "::" + attributeName);
      if (validator == null)
        validator = $._Html5NodeValidator__attributeValidators.$index(0, "*::" + attributeName);
      if (validator == null)
        return false;
      return A._asBoolS(validator.call$4(element, attributeName, value, this));
    },
    $isNodeValidator: 1
  };
  A.ImmutableListMixin.prototype = {
    get$iterator(receiver) {
      return new A.FixedSizeListIterator(receiver, this.get$length(receiver), A.instanceType(receiver)._eval$1("FixedSizeListIterator<ImmutableListMixin.E>"));
    },
    sort$1(receiver, compare) {
      A.instanceType(receiver)._eval$1("int(ImmutableListMixin.E,ImmutableListMixin.E)?")._as(compare);
      throw A.wrapException(A.UnsupportedError$("Cannot sort immutable List."));
    }
  };
  A.NodeValidatorBuilder.prototype = {
    allowsElement$1(element) {
      return B.JSArray_methods.any$1(this._validators, new A.NodeValidatorBuilder_allowsElement_closure(element));
    },
    allowsAttribute$3(element, attributeName, value) {
      return B.JSArray_methods.any$1(this._validators, new A.NodeValidatorBuilder_allowsAttribute_closure(element, attributeName, value));
    },
    $isNodeValidator: 1
  };
  A.NodeValidatorBuilder_allowsElement_closure.prototype = {
    call$1(v) {
      return type$.NodeValidator._as(v).allowsElement$1(this.element);
    },
    $signature: 25
  };
  A.NodeValidatorBuilder_allowsAttribute_closure.prototype = {
    call$1(v) {
      return type$.NodeValidator._as(v).allowsAttribute$3(this.element, this.attributeName, this.value);
    },
    $signature: 25
  };
  A._SimpleNodeValidator.prototype = {
    _SimpleNodeValidator$4$allowedAttributes$allowedElements$allowedUriAttributes(uriPolicy, allowedAttributes, allowedElements, allowedUriAttributes) {
      var legalAttributes, extraUriAttributes, t1;
      this.allowedElements.addAll$1(0, allowedElements);
      legalAttributes = allowedAttributes.where$1(0, new A._SimpleNodeValidator_closure());
      extraUriAttributes = allowedAttributes.where$1(0, new A._SimpleNodeValidator_closure0());
      this.allowedAttributes.addAll$1(0, legalAttributes);
      t1 = this.allowedUriAttributes;
      t1.addAll$1(0, B.List_empty);
      t1.addAll$1(0, extraUriAttributes);
    },
    allowsElement$1(element) {
      return this.allowedElements.contains$1(0, A.Element__safeTagName(element));
    },
    allowsAttribute$3(element, attributeName, value) {
      var _this = this,
        tagName = A.Element__safeTagName(element),
        t1 = _this.allowedUriAttributes;
      if (t1.contains$1(0, A.S(tagName) + "::" + attributeName))
        return _this.uriPolicy.allowsUri$1(value);
      else if (t1.contains$1(0, "*::" + attributeName))
        return _this.uriPolicy.allowsUri$1(value);
      else {
        t1 = _this.allowedAttributes;
        if (t1.contains$1(0, A.S(tagName) + "::" + attributeName))
          return true;
        else if (t1.contains$1(0, "*::" + attributeName))
          return true;
        else if (t1.contains$1(0, A.S(tagName) + "::*"))
          return true;
        else if (t1.contains$1(0, "*::*"))
          return true;
      }
      return false;
    },
    $isNodeValidator: 1
  };
  A._SimpleNodeValidator_closure.prototype = {
    call$1(x) {
      return !B.JSArray_methods.contains$1(B.List_yrN, A._asStringS(x));
    },
    $signature: 26
  };
  A._SimpleNodeValidator_closure0.prototype = {
    call$1(x) {
      return B.JSArray_methods.contains$1(B.List_yrN, A._asStringS(x));
    },
    $signature: 26
  };
  A._TemplatingNodeValidator.prototype = {
    allowsAttribute$3(element, attributeName, value) {
      if (this.super$_SimpleNodeValidator$allowsAttribute(element, attributeName, value))
        return true;
      if (attributeName === "template" && value === "")
        return true;
      if (element.getAttribute("template") === "")
        return this._templateAttrs.contains$1(0, attributeName);
      return false;
    }
  };
  A._TemplatingNodeValidator_closure.prototype = {
    call$1(attr) {
      return "TEMPLATE::" + A.S(A._asStringS(attr));
    },
    $signature: 22
  };
  A._SvgNodeValidator.prototype = {
    allowsElement$1(element) {
      var t1;
      if (type$.ScriptElement._is(element))
        return false;
      t1 = type$.SvgElement._is(element);
      if (t1 && A.Element__safeTagName(element) === "foreignObject")
        return false;
      if (t1)
        return true;
      return false;
    },
    allowsAttribute$3(element, attributeName, value) {
      if (attributeName === "is" || B.JSString_methods.startsWith$1(attributeName, "on"))
        return false;
      return this.allowsElement$1(element);
    },
    $isNodeValidator: 1
  };
  A.FixedSizeListIterator.prototype = {
    moveNext$0() {
      var _this = this,
        nextPosition = _this._position + 1,
        t1 = _this._length;
      if (nextPosition < t1) {
        _this.set$_current(J.$index$asx(_this._array, nextPosition));
        _this._position = nextPosition;
        return true;
      }
      _this.set$_current(null);
      _this._position = t1;
      return false;
    },
    get$current(_) {
      return this._current;
    },
    set$_current(_current) {
      this._current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A._DOMWindowCrossFrame.prototype = {$isEventTarget: 1};
  A._SameOriginUriPolicy.prototype = {$isUriPolicy: 1};
  A._ValidatingTreeSanitizer.prototype = {
    sanitizeTree$1(node) {
      var previousTreeModifications,
        walk = new A._ValidatingTreeSanitizer_sanitizeTree_walk(this);
      do {
        previousTreeModifications = this.numTreeModifications;
        walk.call$2(node, null);
      } while (previousTreeModifications !== this.numTreeModifications);
    },
    _removeNode$2(node, $parent) {
      ++this.numTreeModifications;
      if ($parent == null || $parent !== node.parentNode)
        J.remove$0$x(node);
      else
        $parent.removeChild(node);
    },
    _sanitizeUntrustedElement$2(element, $parent) {
      var corruptedTest1, elementText, elementTagName, exception, t1,
        corrupted = true,
        attrs = null, isAttr = null;
      try {
        attrs = J.get$attributes$x(element);
        isAttr = attrs._element.getAttribute("is");
        type$.Element._as(element);
        corruptedTest1 = function(element) {
          if (!(element.attributes instanceof NamedNodeMap))
            return true;
          if (element.id == "lastChild" || element.name == "lastChild" || element.id == "previousSibling" || element.name == "previousSibling" || element.id == "children" || element.name == "children")
            return true;
          var childNodes = element.childNodes;
          if (element.lastChild && element.lastChild !== childNodes[childNodes.length - 1])
            return true;
          if (element.children)
            if (!(element.children instanceof HTMLCollection || element.children instanceof NodeList))
              return true;
          var length = 0;
          if (element.children)
            length = element.children.length;
          for (var i = 0; i < length; i++) {
            var child = element.children[i];
            if (child.id == "attributes" || child.name == "attributes" || child.id == "lastChild" || child.name == "lastChild" || child.id == "previousSibling" || child.name == "previousSibling" || child.id == "children" || child.name == "children")
              return true;
          }
          return false;
        }(element);
        corrupted = A.boolConversionCheck(corruptedTest1) ? true : !(element.attributes instanceof NamedNodeMap);
      } catch (exception) {
      }
      elementText = "element unprintable";
      try {
        elementText = J.toString$0$(element);
      } catch (exception) {
      }
      try {
        elementTagName = A.Element__safeTagName(element);
        this._sanitizeElement$7(type$.Element._as(element), $parent, corrupted, elementText, elementTagName, type$.Map_dynamic_dynamic._as(attrs), A._asStringQ(isAttr));
      } catch (exception) {
        if (A.unwrapException(exception) instanceof A.ArgumentError)
          throw exception;
        else {
          this._removeNode$2(element, $parent);
          window;
          t1 = "Removing corrupted element " + A.S(elementText);
          if (typeof console != "undefined")
            window.console.warn(t1);
        }
      }
    },
    _sanitizeElement$7(element, $parent, corrupted, text, tag, attrs, isAttr) {
      var t1, keys, i, $name, t2, t3, _this = this;
      if (corrupted) {
        _this._removeNode$2(element, $parent);
        window;
        t1 = "Removing element due to corrupted attributes on <" + text + ">";
        if (typeof console != "undefined")
          window.console.warn(t1);
        return;
      }
      if (!_this.validator.allowsElement$1(element)) {
        _this._removeNode$2(element, $parent);
        window;
        t1 = "Removing disallowed element <" + A.S(tag) + "> from " + A.S($parent);
        if (typeof console != "undefined")
          window.console.warn(t1);
        return;
      }
      if (isAttr != null)
        if (!_this.validator.allowsAttribute$3(element, "is", isAttr)) {
          _this._removeNode$2(element, $parent);
          window;
          t1 = "Removing disallowed type extension <" + A.S(tag) + ' is="' + isAttr + '">';
          if (typeof console != "undefined")
            window.console.warn(t1);
          return;
        }
      t1 = attrs.get$keys(attrs);
      keys = A._setArrayType(t1.slice(0), A._arrayInstanceType(t1));
      for (i = attrs.get$keys(attrs).length - 1, t1 = attrs._element; i >= 0; --i) {
        if (!(i < keys.length))
          return A.ioore(keys, i);
        $name = keys[i];
        t2 = _this.validator;
        t3 = J.toLowerCase$0$s($name);
        A._asStringS($name);
        if (!t2.allowsAttribute$3(element, t3, t1.getAttribute($name))) {
          window;
          t2 = "Removing disallowed attribute <" + A.S(tag) + " " + $name + '="' + A.S(t1.getAttribute($name)) + '">';
          if (typeof console != "undefined")
            window.console.warn(t2);
          t1.removeAttribute($name);
        }
      }
      if (type$.TemplateElement._is(element)) {
        t1 = element.content;
        t1.toString;
        _this.sanitizeTree$1(t1);
      }
    },
    $isNodeTreeSanitizer: 1
  };
  A._ValidatingTreeSanitizer_sanitizeTree_walk.prototype = {
    call$2(node, $parent) {
      var child, nextChild, t2, t3, t4, exception,
        t1 = this.$this;
      switch (node.nodeType) {
        case 1:
          t1._sanitizeUntrustedElement$2(node, $parent);
          break;
        case 8:
        case 11:
        case 3:
        case 4:
          break;
        default:
          t1._removeNode$2(node, $parent);
      }
      child = node.lastChild;
      for (t2 = type$.Node; child != null;) {
        nextChild = null;
        try {
          nextChild = child.previousSibling;
          if (nextChild != null) {
            t3 = nextChild.nextSibling;
            t4 = child;
            t4 = t3 == null ? t4 != null : t3 !== t4;
            t3 = t4;
          } else
            t3 = false;
          if (t3) {
            t3 = A.StateError$("Corrupt HTML");
            throw A.wrapException(t3);
          }
        } catch (exception) {
          t3 = t2._as(child);
          ++t1.numTreeModifications;
          t4 = t3.parentNode;
          if (node == null ? t4 != null : node !== t4) {
            if (t4 != null)
              t4.removeChild(t3);
          } else
            node.removeChild(t3);
          child = null;
          nextChild = node.lastChild;
        }
        if (child != null)
          this.call$2(child, node);
        child = nextChild;
      }
    },
    $signature: 37
  };
  A._CssStyleDeclaration_Interceptor_CssStyleDeclarationBase.prototype = {};
  A._DomRectList_Interceptor_ListMixin.prototype = {};
  A._DomRectList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A._DomStringList_Interceptor_ListMixin.prototype = {};
  A._DomStringList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A._FileList_Interceptor_ListMixin.prototype = {};
  A._FileList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A._HtmlCollection_Interceptor_ListMixin.prototype = {};
  A._HtmlCollection_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A._MidiInputMap_Interceptor_MapMixin.prototype = {};
  A._MidiOutputMap_Interceptor_MapMixin.prototype = {};
  A._MimeTypeArray_Interceptor_ListMixin.prototype = {};
  A._MimeTypeArray_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A._NodeList_Interceptor_ListMixin.prototype = {};
  A._NodeList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A._PluginArray_Interceptor_ListMixin.prototype = {};
  A._PluginArray_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A._RtcStatsReport_Interceptor_MapMixin.prototype = {};
  A._SourceBufferList_EventTarget_ListMixin.prototype = {};
  A._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin.prototype = {};
  A._SpeechGrammarList_Interceptor_ListMixin.prototype = {};
  A._SpeechGrammarList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A._Storage_Interceptor_MapMixin.prototype = {};
  A._TextTrackCueList_Interceptor_ListMixin.prototype = {};
  A._TextTrackCueList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A._TextTrackList_EventTarget_ListMixin.prototype = {};
  A._TextTrackList_EventTarget_ListMixin_ImmutableListMixin.prototype = {};
  A._TouchList_Interceptor_ListMixin.prototype = {};
  A._TouchList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A.__CssRuleList_Interceptor_ListMixin.prototype = {};
  A.__CssRuleList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A.__GamepadList_Interceptor_ListMixin.prototype = {};
  A.__GamepadList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A.__NamedNodeMap_Interceptor_ListMixin.prototype = {};
  A.__NamedNodeMap_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A.__SpeechRecognitionResultList_Interceptor_ListMixin.prototype = {};
  A.__SpeechRecognitionResultList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A.__StyleSheetList_Interceptor_ListMixin.prototype = {};
  A.__StyleSheetList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A._StructuredClone.prototype = {
    findSlot$1(value) {
      var i,
        t1 = this.values,
        $length = t1.length;
      for (i = 0; i < $length; ++i)
        if (t1[i] === value)
          return i;
      B.JSArray_methods.add$1(t1, value);
      B.JSArray_methods.add$1(this.copies, null);
      return $length;
    },
    walk$1(e) {
      var slot, t2, copy, _this = this, t1 = {};
      if (e == null)
        return e;
      if (A._isBool(e))
        return e;
      if (typeof e == "number")
        return e;
      if (typeof e == "string")
        return e;
      if (e instanceof A.DateTime)
        return new Date(e._value);
      if (type$.RegExp._is(e))
        throw A.wrapException(A.UnimplementedError$("structured clone of RegExp"));
      if (type$.File._is(e))
        return e;
      if (type$.Blob._is(e))
        return e;
      if (type$.FileList._is(e))
        return e;
      if (type$.ImageData._is(e))
        return e;
      if (type$.NativeByteBuffer._is(e) || type$.NativeTypedData._is(e) || type$.MessagePort._is(e))
        return e;
      if (type$.Map_dynamic_dynamic._is(e)) {
        slot = _this.findSlot$1(e);
        t2 = _this.copies;
        if (!(slot < t2.length))
          return A.ioore(t2, slot);
        copy = t1.copy = t2[slot];
        if (copy != null)
          return copy;
        copy = {};
        t1.copy = copy;
        B.JSArray_methods.$indexSet(t2, slot, copy);
        J.forEach$1$ax(e, new A._StructuredClone_walk_closure(t1, _this));
        return t1.copy;
      }
      if (type$.List_dynamic._is(e)) {
        slot = _this.findSlot$1(e);
        t1 = _this.copies;
        if (!(slot < t1.length))
          return A.ioore(t1, slot);
        copy = t1[slot];
        if (copy != null)
          return copy;
        return _this.copyList$2(e, slot);
      }
      if (type$.JSObject._is(e)) {
        slot = _this.findSlot$1(e);
        t2 = _this.copies;
        if (!(slot < t2.length))
          return A.ioore(t2, slot);
        copy = t1.copy = t2[slot];
        if (copy != null)
          return copy;
        copy = {};
        t1.copy = copy;
        B.JSArray_methods.$indexSet(t2, slot, copy);
        _this.forEachObjectKey$2(e, new A._StructuredClone_walk_closure0(t1, _this));
        return t1.copy;
      }
      throw A.wrapException(A.UnimplementedError$("structured clone of other type"));
    },
    copyList$2(e, slot) {
      var i,
        t1 = J.getInterceptor$asx(e),
        $length = t1.get$length(e),
        copy = new Array($length);
      B.JSArray_methods.$indexSet(this.copies, slot, copy);
      for (i = 0; i < $length; ++i)
        B.JSArray_methods.$indexSet(copy, i, this.walk$1(t1.$index(e, i)));
      return copy;
    }
  };
  A._StructuredClone_walk_closure.prototype = {
    call$2(key, value) {
      this._box_0.copy[key] = this.$this.walk$1(value);
    },
    $signature: 8
  };
  A._StructuredClone_walk_closure0.prototype = {
    call$2(key, value) {
      this._box_0.copy[key] = this.$this.walk$1(value);
    },
    $signature: 38
  };
  A._AcceptStructuredClone.prototype = {
    findSlot$1(value) {
      var i,
        t1 = this.values,
        $length = t1.length;
      for (i = 0; i < $length; ++i)
        if (t1[i] === value)
          return i;
      B.JSArray_methods.add$1(t1, value);
      B.JSArray_methods.add$1(this.copies, null);
      return $length;
    },
    walk$1(e) {
      var slot, t1, copy, t2, l, $length, i, _this = this, _box_0 = {};
      if (e == null)
        return e;
      if (A._isBool(e))
        return e;
      if (typeof e == "number")
        return e;
      if (typeof e == "string")
        return e;
      if (e instanceof Date)
        return A.DateTime$fromMillisecondsSinceEpoch(e.getTime(), true);
      if (e instanceof RegExp)
        throw A.wrapException(A.UnimplementedError$("structured clone of RegExp"));
      if (typeof Promise != "undefined" && e instanceof Promise)
        return A.promiseToFuture(e, type$.dynamic);
      if (A.isJavaScriptSimpleObject(e)) {
        slot = _this.findSlot$1(e);
        t1 = _this.copies;
        if (!(slot < t1.length))
          return A.ioore(t1, slot);
        copy = _box_0.copy = t1[slot];
        if (copy != null)
          return copy;
        t2 = type$.dynamic;
        copy = A.LinkedHashMap_LinkedHashMap$_empty(t2, t2);
        _box_0.copy = copy;
        B.JSArray_methods.$indexSet(t1, slot, copy);
        _this.forEachJsField$2(e, new A._AcceptStructuredClone_walk_closure(_box_0, _this));
        return _box_0.copy;
      }
      if (e instanceof Array) {
        l = e;
        slot = _this.findSlot$1(l);
        t1 = _this.copies;
        if (!(slot < t1.length))
          return A.ioore(t1, slot);
        copy = t1[slot];
        if (copy != null)
          return copy;
        t2 = J.getInterceptor$asx(l);
        $length = t2.get$length(l);
        copy = _this.mustCopy ? new Array($length) : l;
        B.JSArray_methods.$indexSet(t1, slot, copy);
        for (t1 = J.getInterceptor$ax(copy), i = 0; i < $length; ++i)
          t1.$indexSet(copy, i, _this.walk$1(t2.$index(l, i)));
        return copy;
      }
      return e;
    },
    convertNativeToDart_AcceptStructuredClone$2$mustCopy(object, mustCopy) {
      this.mustCopy = true;
      return this.walk$1(object);
    }
  };
  A._AcceptStructuredClone_walk_closure.prototype = {
    call$2(key, value) {
      var t1 = this._box_0.copy,
        t2 = this.$this.walk$1(value);
      J.$indexSet$ax(t1, key, t2);
      return t2;
    },
    $signature: 39
  };
  A._convertDartToNative_Value_closure.prototype = {
    call$1(element) {
      this.array.push(A._convertDartToNative_Value(element));
    },
    $signature: 4
  };
  A.convertDartToNative_Dictionary_closure.prototype = {
    call$2(key, value) {
      this.object[key] = A._convertDartToNative_Value(value);
    },
    $signature: 8
  };
  A._StructuredCloneDart2Js.prototype = {
    forEachObjectKey$2(object, action) {
      var t1, t2, _i, key;
      type$.dynamic_Function_dynamic_dynamic._as(action);
      for (t1 = Object.keys(object), t2 = t1.length, _i = 0; _i < t2; ++_i) {
        key = t1[_i];
        action.call$2(key, object[key]);
      }
    }
  };
  A._AcceptStructuredCloneDart2Js.prototype = {
    forEachJsField$2(object, action) {
      var t1, t2, _i, key;
      type$.dynamic_Function_dynamic_dynamic._as(action);
      for (t1 = Object.keys(object), t2 = t1.length, _i = 0; _i < t1.length; t1.length === t2 || (0, A.throwConcurrentModificationError)(t1), ++_i) {
        key = t1[_i];
        action.call$2(key, object[key]);
      }
    }
  };
  A.KeyRange.prototype = {$isKeyRange: 1};
  A.JsObject__convertDataTree__convert.prototype = {
    call$1(o) {
      var convertedMap, t2, key, convertedList,
        t1 = this._convertedObjects;
      if (t1.containsKey$1(0, o))
        return t1.$index(0, o);
      if (type$.Map_dynamic_dynamic._is(o)) {
        convertedMap = {};
        t1.$indexSet(0, o, convertedMap);
        for (t1 = J.getInterceptor$x(o), t2 = J.get$iterator$ax(t1.get$keys(o)); t2.moveNext$0();) {
          key = t2.get$current(t2);
          convertedMap[key] = this.call$1(t1.$index(o, key));
        }
        return convertedMap;
      } else if (type$.Iterable_dynamic._is(o)) {
        convertedList = [];
        t1.$indexSet(0, o, convertedList);
        B.JSArray_methods.addAll$1(convertedList, J.map$1$1$ax(o, this, type$.dynamic));
        return convertedList;
      } else
        return A._convertToJS(o);
    },
    $signature: 40
  };
  A._convertToJS_closure.prototype = {
    call$1(o) {
      var jsFunction;
      type$.Function._as(o);
      jsFunction = function(_call, f, captureThis) {
        return function() {
          return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));
        };
      }(A._callDartFunction, o, false);
      A._defineProperty(jsFunction, $.$get$DART_CLOSURE_PROPERTY_NAME(), o);
      return jsFunction;
    },
    $signature: 1
  };
  A._convertToJS_closure0.prototype = {
    call$1(o) {
      return new this.ctor(o);
    },
    $signature: 1
  };
  A._wrapToDart_closure.prototype = {
    call$1(o) {
      return new A.JsFunction(o);
    },
    $signature: 41
  };
  A._wrapToDart_closure0.prototype = {
    call$1(o) {
      return new A.JsArray(o, type$.JsArray_dynamic);
    },
    $signature: 42
  };
  A._wrapToDart_closure1.prototype = {
    call$1(o) {
      return new A.JsObject(o);
    },
    $signature: 43
  };
  A.JsObject.prototype = {
    $index(_, property) {
      if (typeof property != "string" && typeof property != "number")
        throw A.wrapException(A.ArgumentError$("property is not a String or num", null));
      return A._convertToDart(this._js$_jsObject[property]);
    },
    $indexSet(_, property, value) {
      if (typeof property != "string" && typeof property != "number")
        throw A.wrapException(A.ArgumentError$("property is not a String or num", null));
      this._js$_jsObject[property] = A._convertToJS(value);
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.JsObject && this._js$_jsObject === other._js$_jsObject;
    },
    toString$0(_) {
      var t1, exception;
      try {
        t1 = String(this._js$_jsObject);
        return t1;
      } catch (exception) {
        t1 = this.super$Object$toString(0);
        return t1;
      }
    },
    callMethod$2(method, args) {
      var t2,
        t1 = this._js$_jsObject;
      if (args == null)
        t2 = null;
      else {
        t2 = A._arrayInstanceType(args);
        t2 = A.List_List$from(new A.MappedListIterable(args, t2._eval$1("@(1)")._as(A.js___convertToJS$closure()), t2._eval$1("MappedListIterable<1,@>")), true, type$.dynamic);
      }
      return A._convertToDart(t1[method].apply(t1, t2));
    },
    callMethod$1(method) {
      return this.callMethod$2(method, null);
    },
    get$hashCode(_) {
      return 0;
    }
  };
  A.JsFunction.prototype = {};
  A.JsArray.prototype = {
    _checkIndex$1(index) {
      var _this = this,
        t1 = index < 0 || index >= _this.get$length(_this);
      if (t1)
        throw A.wrapException(A.RangeError$range(index, 0, _this.get$length(_this), null, null));
    },
    $index(_, index) {
      if (A._isInt(index))
        this._checkIndex$1(index);
      return this.$ti._precomputed1._as(this.super$JsObject$$index(0, index));
    },
    $indexSet(_, index, value) {
      if (A._isInt(index))
        this._checkIndex$1(index);
      this.super$_JsArray_JsObject_ListMixin$$indexSet(0, index, value);
    },
    get$length(_) {
      var len = this._js$_jsObject.length;
      if (typeof len === "number" && len >>> 0 === len)
        return len;
      throw A.wrapException(A.StateError$("Bad JsArray length"));
    },
    sort$1(_, compare) {
      this.$ti._eval$1("int(1,1)?")._as(compare);
      this.callMethod$2("sort", compare == null ? [] : [compare]);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._JsArray_JsObject_ListMixin.prototype = {
    $indexSet(_, property, value) {
      return this.super$JsObject$$indexSet(0, property, value);
    }
  };
  A.NullRejectionException.prototype = {
    toString$0(_) {
      return "Promise was rejected with a value of `" + (this.isUndefined ? "undefined" : "null") + "`.";
    }
  };
  A.promiseToFuture_closure.prototype = {
    call$1(r) {
      return this.completer.complete$1(0, this.T._eval$1("0/?")._as(r));
    },
    $signature: 4
  };
  A.promiseToFuture_closure0.prototype = {
    call$1(e) {
      if (e == null)
        return this.completer.completeError$1(new A.NullRejectionException(e === undefined));
      return this.completer.completeError$1(e);
    },
    $signature: 4
  };
  A._JSRandom.prototype = {
    nextInt$1(max) {
      if (max <= 0 || max > 4294967296)
        throw A.wrapException(A.RangeError$(string$.max_mu + max));
      return Math.random() * max >>> 0;
    }
  };
  A._Random.prototype = {
    _Random$1(seed) {
      var low, high, tmplow, low0, t1, t2, t3, _this = this, _4294967296 = 4294967296,
        empty_seed = seed < 0 ? -1 : 0;
      do {
        low = seed >>> 0;
        seed = B.JSInt_methods._tdivFast$1(seed - low, _4294967296);
        high = seed >>> 0;
        seed = B.JSInt_methods._tdivFast$1(seed - high, _4294967296);
        tmplow = (~low >>> 0) + (low << 21 >>> 0);
        low0 = tmplow >>> 0;
        high = (~high >>> 0) + ((high << 21 | low >>> 11) >>> 0) + B.JSInt_methods._tdivFast$1(tmplow - low0, _4294967296) >>> 0;
        tmplow = ((low0 ^ (low0 >>> 24 | high << 8)) >>> 0) * 265;
        low = tmplow >>> 0;
        high = ((high ^ high >>> 24) >>> 0) * 265 + B.JSInt_methods._tdivFast$1(tmplow - low, _4294967296) >>> 0;
        tmplow = ((low ^ (low >>> 14 | high << 18)) >>> 0) * 21;
        low = tmplow >>> 0;
        high = ((high ^ high >>> 14) >>> 0) * 21 + B.JSInt_methods._tdivFast$1(tmplow - low, _4294967296) >>> 0;
        low = (low ^ (low >>> 28 | high << 4)) >>> 0;
        high = (high ^ high >>> 28) >>> 0;
        tmplow = (low << 31 >>> 0) + low;
        low0 = tmplow >>> 0;
        t1 = B.JSInt_methods._tdivFast$1(tmplow - low0, _4294967296);
        tmplow = _this._lo * 1037;
        t2 = _this._lo = tmplow >>> 0;
        t3 = _this._hi * 1037 + B.JSInt_methods._tdivFast$1(tmplow - t2, _4294967296) >>> 0;
        _this._hi = t3;
        t2 = (t2 ^ low0) >>> 0;
        _this._lo = t2;
        t1 = (t3 ^ high + ((high << 31 | low >>> 1) >>> 0) + t1 >>> 0) >>> 0;
        _this._hi = t1;
      } while (seed !== empty_seed);
      if (t1 === 0 && t2 === 0)
        _this._lo = 23063;
      _this._nextState$0();
      _this._nextState$0();
      _this._nextState$0();
      _this._nextState$0();
    },
    _nextState$0() {
      var _this = this,
        t1 = _this._lo,
        tmpHi = 4294901760 * t1,
        tmpHiLo = tmpHi >>> 0,
        tmpLo = 55905 * t1,
        tmpLoLo = tmpLo >>> 0,
        newLo = tmpLoLo + tmpHiLo + _this._hi;
      t1 = newLo >>> 0;
      _this._lo = t1;
      _this._hi = B.JSInt_methods._tdivFast$1(tmpLo - tmpLoLo + (tmpHi - tmpHiLo) + (newLo - t1), 4294967296) >>> 0;
    },
    nextInt$1(max) {
      var t1, rnd32, result, _this = this;
      if (max <= 0 || max > 4294967296)
        throw A.wrapException(A.RangeError$(string$.max_mu + max));
      t1 = max - 1;
      if ((max & t1) >>> 0 === 0) {
        _this._nextState$0();
        return (_this._lo & t1) >>> 0;
      }
      do {
        _this._nextState$0();
        rnd32 = _this._lo;
        result = rnd32 % max;
      } while (rnd32 - result + max >= 4294967296);
      return result;
    }
  };
  A.Length.prototype = {$isLength: 1};
  A.LengthList.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver.getItem(index);
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.Length._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      return this.$index(receiver, index);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.Number.prototype = {$isNumber: 1};
  A.NumberList.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver.getItem(index);
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.Number._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      return this.$index(receiver, index);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.PointList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.ScriptElement0.prototype = {$isScriptElement0: 1};
  A.StringList.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver.getItem(index);
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      A._asStringS(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      return this.$index(receiver, index);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.SvgElement.prototype = {
    createFragment$3$treeSanitizer$validator(receiver, svg, treeSanitizer, validator) {
      var html, t2, fragment, svgFragment, root,
        t1 = A._setArrayType([], type$.JSArray_NodeValidator);
      B.JSArray_methods.add$1(t1, A._Html5NodeValidator$(null));
      B.JSArray_methods.add$1(t1, A._TemplatingNodeValidator$());
      B.JSArray_methods.add$1(t1, new A._SvgNodeValidator());
      treeSanitizer = new A._ValidatingTreeSanitizer(new A.NodeValidatorBuilder(t1));
      html = '<svg version="1.1">' + svg + "</svg>";
      t1 = document;
      t2 = t1.body;
      t2.toString;
      fragment = B.BodyElement_methods.createFragment$2$treeSanitizer(t2, html, treeSanitizer);
      svgFragment = t1.createDocumentFragment();
      fragment.toString;
      t1 = new A._ChildNodeListLazy(fragment);
      root = t1.get$single(t1);
      for (; t1 = root.firstChild, t1 != null;)
        svgFragment.appendChild(t1);
      return svgFragment;
    },
    $isSvgElement: 1
  };
  A.Transform.prototype = {$isTransform: 1};
  A.TransformList.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (index >>> 0 !== index || index >= receiver.length)
        throw A.wrapException(A.IndexError$(index, receiver, null, null, null));
      return receiver.getItem(index);
    },
    $indexSet(receiver, index, value) {
      A._asIntS(index);
      type$.Transform._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      return this.$index(receiver, index);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._LengthList_Interceptor_ListMixin.prototype = {};
  A._LengthList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A._NumberList_Interceptor_ListMixin.prototype = {};
  A._NumberList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A._StringList_Interceptor_ListMixin.prototype = {};
  A._StringList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A._TransformList_Interceptor_ListMixin.prototype = {};
  A._TransformList_Interceptor_ListMixin_ImmutableListMixin.prototype = {};
  A.AudioBuffer.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.AudioParamMap.prototype = {
    containsKey$1(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(key)) != null;
    },
    $index(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(A._asStringS(key)));
    },
    forEach$1(receiver, f) {
      var entries, entry;
      type$.void_Function_String_dynamic._as(f);
      entries = receiver.entries();
      for (; true;) {
        entry = entries.next();
        if (entry.done)
          return;
        f.call$2(entry.value[0], A.convertNativeToDart_Dictionary(entry.value[1]));
      }
    },
    get$keys(receiver) {
      var keys = A._setArrayType([], type$.JSArray_String);
      this.forEach$1(receiver, new A.AudioParamMap_keys_closure(keys));
      return keys;
    },
    get$length(receiver) {
      return receiver.size;
    },
    get$isEmpty(receiver) {
      return receiver.size === 0;
    },
    $indexSet(receiver, key, value) {
      A._asStringS(key);
      throw A.wrapException(A.UnsupportedError$("Not supported"));
    },
    $isMap: 1
  };
  A.AudioParamMap_keys_closure.prototype = {
    call$2(k, v) {
      return B.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 6
  };
  A.AudioTrackList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.BaseAudioContext.prototype = {};
  A.OfflineAudioContext.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A._AudioParamMap_Interceptor_MapMixin.prototype = {};
  A.AsyncMemoizer.prototype = {};
  A.DelegatingStreamSink.prototype = {
    add$1(_, data) {
      this._sink.add$1(0, A._instanceType(this)._eval$1("DelegatingStreamSink.T")._as(data));
    },
    $isStreamSink: 1
  };
  A.CopyOnWriteList.prototype = {
    get$length(_) {
      return J.get$length$asx(this._copy_on_write_list$_list);
    },
    $index(_, index) {
      return J.$index$asx(this._copy_on_write_list$_list, index);
    },
    $add(_, other) {
      this.$ti._eval$1("List<1>")._as(other);
      return J.$add$ansx(this._copy_on_write_list$_list, other);
    },
    cast$1$0(_, $T) {
      return new A.CopyOnWriteList(true, J.cast$1$0$ax(this._copy_on_write_list$_list, $T), $T._eval$1("CopyOnWriteList<0>"));
    },
    contains$1(_, element) {
      return J.contains$1$asx(this._copy_on_write_list$_list, element);
    },
    elementAt$1(_, index) {
      return J.elementAt$1$ax(this._copy_on_write_list$_list, index);
    },
    get$first(_) {
      return J.get$first$ax(this._copy_on_write_list$_list);
    },
    forEach$1(_, f) {
      this.$ti._eval$1("~(1)")._as(f);
      return J.forEach$1$ax(this._copy_on_write_list$_list, f);
    },
    get$isEmpty(_) {
      return J.get$isEmpty$asx(this._copy_on_write_list$_list);
    },
    get$isNotEmpty(_) {
      return J.get$isNotEmpty$asx(this._copy_on_write_list$_list);
    },
    get$iterator(_) {
      return J.get$iterator$ax(this._copy_on_write_list$_list);
    },
    map$1$1(_, f, $T) {
      this.$ti._bind$1($T)._eval$1("1(2)")._as(f);
      return J.map$1$1$ax(this._copy_on_write_list$_list, f, $T);
    },
    map$1($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    skip$1(_, count) {
      return J.skip$1$ax(this._copy_on_write_list$_list, count);
    },
    sublist$2(_, start, end) {
      return J.sublist$2$ax(this._copy_on_write_list$_list, start, end);
    },
    sublist$1($receiver, start) {
      return this.sublist$2($receiver, start, null);
    },
    toList$1$growable(_, growable) {
      return J.toList$1$growable$ax(this._copy_on_write_list$_list, true);
    },
    toList$0($receiver) {
      return this.toList$1$growable($receiver, true);
    },
    $indexSet(_, index, element) {
      A._asIntS(index);
      this.$ti._precomputed1._as(element);
      this._maybeCopyBeforeWrite$0();
      J.$indexSet$ax(this._copy_on_write_list$_list, index, element);
    },
    sort$1(_, compare) {
      this.$ti._eval$1("int(1,1)?")._as(compare);
      this._maybeCopyBeforeWrite$0();
      J.sort$1$ax(this._copy_on_write_list$_list, compare);
    },
    toString$0(_) {
      return J.toString$0$(this._copy_on_write_list$_list);
    },
    _maybeCopyBeforeWrite$0() {
      var _this = this;
      if (!_this._copyBeforeWrite)
        return;
      _this._copyBeforeWrite = false;
      _this.set$_copy_on_write_list$_list(A.List_List$from(_this._copy_on_write_list$_list, true, _this.$ti._precomputed1));
    },
    set$_copy_on_write_list$_list(_list) {
      this._copy_on_write_list$_list = this.$ti._eval$1("List<1>")._as(_list);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.hashObjects_closure.prototype = {
    call$2(h, i) {
      return A._combine(A._asIntS(h), J.get$hashCode$(i));
    },
    $signature: 44
  };
  A.BuiltList.prototype = {
    toBuilder$0() {
      return A.ListBuilder_ListBuilder(this, this.$ti._precomputed1);
    },
    get$hashCode(_) {
      var t1 = this._list$_hashCode;
      return t1 == null ? this._list$_hashCode = A.hashObjects(this._list) : t1;
    },
    $eq(_, other) {
      var t1, t2, i, t3, t4, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A.BuiltList))
        return false;
      t1 = other._list;
      t2 = _this._list;
      if (t1.length !== t2.length)
        return false;
      if (other.get$hashCode(other) != _this.get$hashCode(_this))
        return false;
      for (i = 0; t3 = t2.length, i !== t3; ++i) {
        if (!(i < t1.length))
          return A.ioore(t1, i);
        t4 = t1[i];
        if (!(i < t3))
          return A.ioore(t2, i);
        if (!J.$eq$(t4, t2[i]))
          return false;
      }
      return true;
    },
    toString$0(_) {
      return A.IterableBase_iterableToFullString(this._list, "[", "]");
    },
    $index(_, index) {
      var t1 = this._list;
      if (!(index < t1.length))
        return A.ioore(t1, index);
      return t1[index];
    },
    $add(_, other) {
      var t1 = this.$ti;
      return new A._BuiltList(B.JSArray_methods.$add(this._list, t1._eval$1("BuiltList<1>")._as(other).get$_list()), t1._eval$1("_BuiltList<1>"));
    },
    get$length(_) {
      return this._list.length;
    },
    get$iterator(_) {
      var t1 = this._list;
      return new J.ArrayIterator(t1, t1.length, A._arrayInstanceType(t1)._eval$1("ArrayIterator<1>"));
    },
    map$1$1(_, f, $T) {
      var t1 = this._list,
        t2 = A._arrayInstanceType(t1);
      return new A.MappedListIterable(t1, t2._bind$1($T)._eval$1("1(2)")._as(this.$ti._bind$1($T)._eval$1("1(2)")._as(f)), t2._eval$1("@<1>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    contains$1(_, element) {
      return B.JSArray_methods.contains$1(this._list, element);
    },
    toList$1$growable(_, growable) {
      return new A.CopyOnWriteList(true, this._list, this.$ti._eval$1("CopyOnWriteList<1>"));
    },
    toList$0($receiver) {
      return this.toList$1$growable($receiver, true);
    },
    get$isEmpty(_) {
      return this._list.length === 0;
    },
    get$isNotEmpty(_) {
      return this._list.length !== 0;
    },
    skip$1(_, n) {
      var t1 = this._list;
      return A.SubListIterable$(t1, n, null, A._arrayInstanceType(t1)._precomputed1);
    },
    get$first(_) {
      return B.JSArray_methods.get$first(this._list);
    },
    elementAt$1(_, index) {
      var t1 = this._list;
      if (!(index >= 0 && index < t1.length))
        return A.ioore(t1, index);
      return t1[index];
    },
    $isIterable: 1
  };
  A._BuiltList.prototype = {
    _list$_maybeCheckForNull$0() {
      var t1, t2, _i;
      if (!(!$.$get$isSoundMode() && !this.$ti._precomputed1._is(null)))
        return;
      for (t1 = this._list, t2 = t1.length, _i = 0; _i < t2; ++_i)
        if (t1[_i] == null)
          throw A.wrapException(A.ArgumentError$("iterable contained invalid element: null", null));
    }
  };
  A.ListBuilder.prototype = {
    build$0() {
      var t1, t2, t3, _this = this;
      if (_this._listOwner == null) {
        t1 = A._lateReadCheck(_this.__ListBuilder__list, "_list");
        t2 = _this.$ti;
        t3 = t2._eval$1("_BuiltList<1>");
        t3 = t3._as(new A._BuiltList(t1, t3));
        _this.set$__ListBuilder__list(t2._eval$1("List<1>")._as(t1));
        _this.set$_listOwner(t3);
      }
      t1 = _this._listOwner;
      t1.toString;
      return t1;
    },
    replace$1(_, iterable) {
      var _this = this,
        t1 = _this.$ti,
        t2 = t1._eval$1("_BuiltList<1>"),
        t3 = t1._eval$1("List<1>");
      if (t2._is(iterable)) {
        t2._as(iterable);
        _this.set$__ListBuilder__list(t3._as(iterable._list));
        _this.set$_listOwner(iterable);
      } else {
        _this.set$__ListBuilder__list(t3._as(A.List_List$from(iterable, true, t1._precomputed1)));
        _this.set$_listOwner(null);
      }
    },
    $index(_, index) {
      return J.$index$asx(A._lateReadCheck(this.__ListBuilder__list, "_list"), index);
    },
    get$length(_) {
      return J.get$length$asx(A._lateReadCheck(this.__ListBuilder__list, "_list"));
    },
    map$1(_, f) {
      var t2, t3, t4, t5, result, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1(1)")._as(f);
      t2 = A._lateReadCheck(_this.__ListBuilder__list, "_list");
      t3 = t1._precomputed1;
      t4 = A.instanceType(t2);
      t5 = t4._eval$1("@<1>")._bind$1(t3)._eval$1("MappedListIterable<1,2>");
      result = A.List_List$of(new A.MappedListIterable(t2, t4._bind$1(t3)._eval$1("1(2)")._as(f), t5), true, t5._eval$1("ListIterable.E"));
      _this._list$_maybeCheckElements$1(result);
      _this.set$__ListBuilder__list(t1._eval$1("List<1>")._as(result));
      _this.set$_listOwner(null);
    },
    _list$_maybeCheckElements$1(elements) {
      var t2, _i,
        t1 = this.$ti;
      t1._eval$1("Iterable<1>")._as(elements);
      if (!(!$.$get$isSoundMode() && !t1._precomputed1._is(null)))
        return;
      for (t2 = elements.length, t1 = t1._precomputed1, _i = 0; _i < t2; ++_i)
        if (t1._as(elements[_i]) == null)
          A.throwExpression(A.ArgumentError$("null element", null));
    },
    set$__ListBuilder__list(__ListBuilder__list) {
      this.__ListBuilder__list = this.$ti._eval$1("List<1>")._as(__ListBuilder__list);
    },
    set$_listOwner(_listOwner) {
      this._listOwner = this.$ti._eval$1("_BuiltList<1>?")._as(_listOwner);
    }
  };
  A.BuiltListMultimap.prototype = {
    get$hashCode(_) {
      var t2, _this = this,
        t1 = _this._list_multimap$_hashCode;
      if (t1 == null) {
        t1 = _this._list_multimap$_map;
        t1 = t1.get$keys(t1);
        t2 = A._instanceType(t1);
        t2 = A.MappedIterable_MappedIterable(t1, t2._eval$1("int(Iterable.E)")._as(new A.BuiltListMultimap_hashCode_closure(_this)), t2._eval$1("Iterable.E"), type$.int);
        t2 = A.List_List$of(t2, false, A._instanceType(t2)._eval$1("Iterable.E"));
        B.JSArray_methods.sort$0(t2);
        t2 = _this._list_multimap$_hashCode = A.hashObjects(t2);
        t1 = t2;
      }
      return t1;
    },
    $eq(_, other) {
      var t1, t2, t3, t4, t5, key, result, t6, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A.BuiltListMultimap))
        return false;
      t1 = other._list_multimap$_map;
      t2 = _this._list_multimap$_map;
      if (t1.get$length(t1) !== t2.get$length(t2))
        return false;
      if (other.get$hashCode(other) != _this.get$hashCode(_this))
        return false;
      for (t3 = _this.get$keys(_this), t3 = t3.get$iterator(t3), t4 = other._emptyList, t5 = _this._emptyList; t3.moveNext$0();) {
        key = t3.get$current(t3);
        result = t1.$index(0, key);
        t6 = result == null ? t4 : result;
        result = t2.$index(0, key);
        if (!t6.$eq(0, result == null ? t5 : result))
          return false;
      }
      return true;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this._list_multimap$_map);
    },
    $index(_, key) {
      var result = this._list_multimap$_map.$index(0, key);
      return result == null ? this._emptyList : result;
    },
    get$keys(_) {
      var t1, _this = this;
      if (_this._list_multimap$_keys == null) {
        t1 = _this._list_multimap$_map;
        _this.set$_list_multimap$_keys(t1.get$keys(t1));
      }
      t1 = _this._list_multimap$_keys;
      t1.toString;
      return t1;
    },
    get$length(_) {
      var t1 = this._list_multimap$_map;
      return t1.get$length(t1);
    },
    set$_list_multimap$_keys(_keys) {
      this._list_multimap$_keys = this.$ti._eval$1("Iterable<1>?")._as(_keys);
    }
  };
  A.BuiltListMultimap_BuiltListMultimap_closure.prototype = {
    call$1(k) {
      return this.multimap.$index(0, k);
    },
    $signature: 1
  };
  A.BuiltListMultimap_hashCode_closure.prototype = {
    call$1(key) {
      var t2,
        t1 = this.$this;
      t1.$ti._precomputed1._as(key);
      t2 = J.get$hashCode$(key);
      t1 = J.get$hashCode$(t1._list_multimap$_map.$index(0, key));
      return A._finish(A._combine(A._combine(0, J.get$hashCode$(t2)), J.get$hashCode$(t1)));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1)");
    }
  };
  A._BuiltListMultimap.prototype = {
    _BuiltListMultimap$copy$2(keys, lookup, $K, $V) {
      var t1, t2, t3, key;
      for (t1 = J.get$iterator$ax(keys), t2 = this._list_multimap$_map, t3 = type$.Iterable_dynamic; t1.moveNext$0();) {
        key = t1.get$current(t1);
        if ($K._is(key))
          t2.$indexSet(0, key, A.BuiltList_BuiltList$from(t3._as(lookup.call$1(key)), $V));
        else
          throw A.wrapException(A.ArgumentError$("map contained invalid key: " + A.S(key), null));
      }
    }
  };
  A.ListMultimapBuilder.prototype = {
    build$0() {
      var t1, key, t2, t3, t4, t5, builtList, _this = this,
        _s11_ = "_builderMap",
        _s9_ = "_builtMap";
      if (_this._list_multimap$_builtMapOwner == null) {
        for (t1 = J.get$keys$x(A._lateReadCheck(_this.__ListMultimapBuilder__builderMap, _s11_)), t1 = t1.get$iterator(t1); t1.moveNext$0();) {
          key = t1.get$current(t1);
          t2 = J.$index$asx(A._lateReadCheck(_this.__ListMultimapBuilder__builderMap, _s11_), key);
          if (t2._listOwner == null) {
            t3 = A._lateReadCheck(t2.__ListBuilder__list, "_list");
            t4 = A._instanceType(t2);
            t5 = t4._eval$1("_BuiltList<1>");
            t5 = t5._as(new A._BuiltList(t3, t5));
            t2.set$__ListBuilder__list(t4._eval$1("List<1>")._as(t3));
            t2.set$_listOwner(t5);
          }
          builtList = t2._listOwner;
          t2 = builtList._list.length;
          t3 = _this.__ListMultimapBuilder__builtMap;
          if (t2 === 0)
            J.remove$1$x(A._lateReadCheck(t3, _s9_), key);
          else
            J.$indexSet$ax(A._lateReadCheck(t3, _s9_), key, builtList);
        }
        t1 = _this.$ti;
        t2 = t1._rest[1];
        _this.set$_list_multimap$_builtMapOwner(new A._BuiltListMultimap(A._lateReadCheck(_this.__ListMultimapBuilder__builtMap, _s9_), A.BuiltList_BuiltList$from(B.List_empty0, t2), t1._eval$1("@<1>")._bind$1(t2)._eval$1("_BuiltListMultimap<1,2>")));
      }
      t1 = _this._list_multimap$_builtMapOwner;
      t1.toString;
      return t1;
    },
    replace$1(_, multimap) {
      this._list_multimap$_setWithCopyAndCheck$2(multimap.get$keys(multimap), new A.ListMultimapBuilder_replace_closure(multimap));
    },
    $index(_, key) {
      var t1;
      this._makeWriteableCopy$0();
      t1 = this.$ti;
      return t1._precomputed1._is(key) ? this._list_multimap$_getValuesBuilder$1(key) : A.ListBuilder_ListBuilder(B.List_empty0, t1._rest[1]);
    },
    _list_multimap$_getValuesBuilder$1(key) {
      var result, builtValues, _this = this,
        _s11_ = "_builderMap",
        t1 = _this.$ti;
      t1._precomputed1._as(key);
      result = J.$index$asx(A._lateReadCheck(_this.__ListMultimapBuilder__builderMap, _s11_), key);
      if (result == null) {
        builtValues = J.$index$asx(A._lateReadCheck(_this.__ListMultimapBuilder__builtMap, "_builtMap"), key);
        result = builtValues == null ? A.ListBuilder_ListBuilder(B.List_empty0, t1._rest[1]) : A.ListBuilder_ListBuilder(builtValues, builtValues.$ti._precomputed1);
        J.$indexSet$ax(A._lateReadCheck(_this.__ListMultimapBuilder__builderMap, _s11_), key, result);
      }
      return result;
    },
    _makeWriteableCopy$0() {
      var t1, _this = this;
      if (_this._list_multimap$_builtMapOwner != null) {
        t1 = _this.$ti;
        _this.set$__ListMultimapBuilder__builtMap(t1._eval$1("Map<1,BuiltList<2>>")._as(A.LinkedHashMap_LinkedHashMap$from(A._lateReadCheck(_this.__ListMultimapBuilder__builtMap, "_builtMap"), t1._precomputed1, t1._eval$1("BuiltList<2>"))));
        _this.set$_list_multimap$_builtMapOwner(null);
      }
    },
    _list_multimap$_setWithCopyAndCheck$2(keys, lookup) {
      var t1, t2, t3, t4, t5, t6, key, t7, value, t8, t9, t10, _this = this, _null = null;
      _this.set$_list_multimap$_builtMapOwner(_null);
      t1 = _this.$ti;
      t2 = t1._precomputed1;
      t3 = t1._eval$1("BuiltList<2>");
      t4 = t1._eval$1("Map<1,BuiltList<2>>");
      _this.set$__ListMultimapBuilder__builtMap(t4._as(A.LinkedHashMap_LinkedHashMap$_empty(t2, t3)));
      _this.set$__ListMultimapBuilder__builderMap(t1._eval$1("Map<1,ListBuilder<2>>")._as(A.LinkedHashMap_LinkedHashMap$_empty(t2, t1._eval$1("ListBuilder<2>"))));
      for (t5 = J.get$iterator$ax(keys), t6 = type$.Iterable_dynamic, t1 = t1._rest[1]; t5.moveNext$0();) {
        key = t5.get$current(t5);
        if (t2._is(key))
          for (t7 = J.get$iterator$ax(t6._as(lookup.call$1(key))); t7.moveNext$0();) {
            value = t7.get$current(t7);
            if (t1._is(value)) {
              t2._as(key);
              t1._as(value);
              if (_this._list_multimap$_builtMapOwner != null) {
                _this.set$__ListMultimapBuilder__builtMap(t4._as(A.LinkedHashMap_LinkedHashMap$from(A._lateReadCheck(_this.__ListMultimapBuilder__builtMap, "_builtMap"), t2, t3)));
                _this.set$_list_multimap$_builtMapOwner(_null);
              }
              _this._list_multimap$_checkKey$1(key);
              _this._list_multimap$_checkValue$1(value);
              t8 = _this._list_multimap$_getValuesBuilder$1(key);
              t9 = t8.$ti;
              t10 = t9._precomputed1;
              t10._as(value);
              if (!$.$get$isSoundMode() && !t10._is(null))
                if (value == null)
                  A.throwExpression(A.ArgumentError$("null element", _null));
              if (t8._listOwner != null) {
                t8.set$__ListBuilder__list(t9._eval$1("List<1>")._as(A.List_List$from(A._lateReadCheck(t8.__ListBuilder__list, "_list"), true, t10)));
                t8.set$_listOwner(_null);
              }
              J.add$1$ax(A._lateReadCheck(t8.__ListBuilder__list, "_list"), value);
            } else
              throw A.wrapException(A.ArgumentError$("map contained invalid value: " + A.S(value) + ", for key " + A.S(key), _null));
          }
        else
          throw A.wrapException(A.ArgumentError$("map contained invalid key: " + A.S(key), _null));
      }
    },
    _list_multimap$_checkKey$1(key) {
      var t1 = this.$ti._precomputed1;
      t1._as(key);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (key == null)
        throw A.wrapException(A.ArgumentError$("null key", null));
    },
    _list_multimap$_checkValue$1(value) {
      var t1 = this.$ti._rest[1];
      t1._as(value);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (value == null)
        throw A.wrapException(A.ArgumentError$("null value", null));
    },
    set$__ListMultimapBuilder__builtMap(__ListMultimapBuilder__builtMap) {
      this.__ListMultimapBuilder__builtMap = this.$ti._eval$1("Map<1,BuiltList<2>>")._as(__ListMultimapBuilder__builtMap);
    },
    set$_list_multimap$_builtMapOwner(_builtMapOwner) {
      this._list_multimap$_builtMapOwner = this.$ti._eval$1("_BuiltListMultimap<1,2>?")._as(_builtMapOwner);
    },
    set$__ListMultimapBuilder__builderMap(__ListMultimapBuilder__builderMap) {
      this.__ListMultimapBuilder__builderMap = this.$ti._eval$1("Map<1,ListBuilder<2>>")._as(__ListMultimapBuilder__builderMap);
    }
  };
  A.ListMultimapBuilder_replace_closure.prototype = {
    call$1(k) {
      return this.multimap.$index(0, k);
    },
    $signature: 1
  };
  A.BuiltMap.prototype = {
    toBuilder$0() {
      var t1 = this.$ti;
      t1._eval$1("_BuiltMap<1,2>")._as(this);
      return new A.MapBuilder(this._mapFactory, this._map$_map, this, t1._eval$1("@<1>")._bind$1(t1._rest[1])._eval$1("MapBuilder<1,2>"));
    },
    get$hashCode(_) {
      var t2, _this = this,
        t1 = _this._map$_hashCode;
      if (t1 == null) {
        t1 = _this._map$_map;
        t1 = t1.get$keys(t1);
        t2 = A._instanceType(t1);
        t2 = A.MappedIterable_MappedIterable(t1, t2._eval$1("int(Iterable.E)")._as(new A.BuiltMap_hashCode_closure(_this)), t2._eval$1("Iterable.E"), type$.int);
        t2 = A.List_List$of(t2, false, A._instanceType(t2)._eval$1("Iterable.E"));
        B.JSArray_methods.sort$0(t2);
        t2 = _this._map$_hashCode = A.hashObjects(t2);
        t1 = t2;
      }
      return t1;
    },
    $eq(_, other) {
      var t1, t2, t3, key, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A.BuiltMap))
        return false;
      t1 = other._map$_map;
      t2 = _this._map$_map;
      if (t1.get$length(t1) !== t2.get$length(t2))
        return false;
      if (other.get$hashCode(other) != _this.get$hashCode(_this))
        return false;
      for (t3 = _this.get$keys(_this), t3 = t3.get$iterator(t3); t3.moveNext$0();) {
        key = t3.get$current(t3);
        if (!J.$eq$(t1.$index(0, key), t2.$index(0, key)))
          return false;
      }
      return true;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this._map$_map);
    },
    $index(_, key) {
      return this._map$_map.$index(0, key);
    },
    get$keys(_) {
      var t1, _this = this;
      if (_this._map$_keys == null) {
        t1 = _this._map$_map;
        _this.set$_map$_keys(t1.get$keys(t1));
      }
      t1 = _this._map$_keys;
      t1.toString;
      return t1;
    },
    get$length(_) {
      var t1 = this._map$_map;
      return t1.get$length(t1);
    },
    map$1(_, f) {
      var t1 = type$.dynamic,
        t2 = this._map$_map;
      return new A._BuiltMap(null, t2.map$2$1(t2, this.$ti._eval$1("MapEntry<@,@>(1,2)")._as(f), t1, t1), type$._BuiltMap_dynamic_dynamic);
    },
    set$_map$_keys(_keys) {
      this._map$_keys = this.$ti._eval$1("Iterable<1>?")._as(_keys);
    }
  };
  A.BuiltMap_BuiltMap_closure.prototype = {
    call$1(k) {
      return this.map.$index(0, k);
    },
    $signature: 1
  };
  A.BuiltMap_hashCode_closure.prototype = {
    call$1(key) {
      var t2,
        t1 = this.$this;
      t1.$ti._precomputed1._as(key);
      t2 = J.get$hashCode$(key);
      t1 = J.get$hashCode$(t1._map$_map.$index(0, key));
      return A._finish(A._combine(A._combine(0, J.get$hashCode$(t2)), J.get$hashCode$(t1)));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1)");
    }
  };
  A._BuiltMap.prototype = {
    _BuiltMap$copyAndCheckTypes$2(keys, lookup, $K, $V) {
      var t1, t2, key, value;
      for (t1 = J.get$iterator$ax(keys), t2 = this._map$_map; t1.moveNext$0();) {
        key = t1.get$current(t1);
        if ($K._is(key)) {
          value = lookup.call$1(key);
          if ($V._is(value))
            t2.$indexSet(0, key, value);
          else
            throw A.wrapException(A.ArgumentError$("map contained invalid value: " + A.S(value), null));
        } else
          throw A.wrapException(A.ArgumentError$("map contained invalid key: " + A.S(key), null));
      }
    }
  };
  A.MapBuilder.prototype = {
    build$0() {
      var t1, _this = this;
      if (_this._mapOwner == null) {
        t1 = _this.$ti;
        _this.set$_mapOwner(new A._BuiltMap(_this._mapFactory, A._lateReadCheck(_this.__MapBuilder__map, "_map"), t1._eval$1("@<1>")._bind$1(t1._rest[1])._eval$1("_BuiltMap<1,2>")));
      }
      t1 = _this._mapOwner;
      t1.toString;
      return t1;
    },
    replace$1(_, map) {
      var _this = this,
        replacement = _this._createMap$0();
      map.forEach$1(0, new A.MapBuilder_replace_closure(_this, replacement));
      _this.$ti._eval$1("Map<1,2>")._as(replacement);
      _this.set$_mapOwner(null);
      _this.set$__MapBuilder__map(replacement);
    },
    $index(_, key) {
      return J.$index$asx(A._lateReadCheck(this.__MapBuilder__map, "_map"), key);
    },
    $indexSet(_, key, value) {
      var t2, _this = this,
        t1 = _this.$ti;
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      _this._checkKey$1(key);
      _this._checkValue$1(value);
      if (_this._mapOwner != null) {
        t2 = _this._createMap$0();
        t2.addAll$1(0, A._lateReadCheck(_this.__MapBuilder__map, "_map"));
        _this.set$__MapBuilder__map(t1._eval$1("Map<1,2>")._as(t2));
        _this.set$_mapOwner(null);
      }
      J.$indexSet$ax(A._lateReadCheck(_this.__MapBuilder__map, "_map"), key, value);
    },
    get$length(_) {
      return J.get$length$asx(A._lateReadCheck(this.__MapBuilder__map, "_map"));
    },
    get$_safeMap() {
      var t1, _this = this;
      if (_this._mapOwner != null) {
        t1 = _this._createMap$0();
        t1.addAll$1(0, A._lateReadCheck(_this.__MapBuilder__map, "_map"));
        _this.set$__MapBuilder__map(_this.$ti._eval$1("Map<1,2>")._as(t1));
        _this.set$_mapOwner(null);
      }
      return A._lateReadCheck(_this.__MapBuilder__map, "_map");
    },
    _createMap$0() {
      var t1 = this.$ti;
      return A.LinkedHashMap_LinkedHashMap$_empty(t1._precomputed1, t1._rest[1]);
    },
    _checkKey$1(key) {
      var t1 = this.$ti._precomputed1;
      t1._as(key);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (key == null)
        throw A.wrapException(A.ArgumentError$("null key", null));
    },
    _checkValue$1(value) {
      var t1 = this.$ti._rest[1];
      t1._as(value);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (value == null)
        throw A.wrapException(A.ArgumentError$("null value", null));
    },
    set$__MapBuilder__map(__MapBuilder__map) {
      this.__MapBuilder__map = this.$ti._eval$1("Map<1,2>")._as(__MapBuilder__map);
    },
    set$_mapOwner(_mapOwner) {
      this._mapOwner = this.$ti._eval$1("_BuiltMap<1,2>?")._as(_mapOwner);
    }
  };
  A.MapBuilder_replace_closure.prototype = {
    call$2(key, value) {
      var t1 = this.$this.$ti;
      this.replacement.$indexSet(0, t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    $signature: 8
  };
  A.BuiltSet.prototype = {
    get$hashCode(_) {
      var t2, t3, _this = this,
        t1 = _this._set$_hashCode;
      if (t1 == null) {
        t1 = _this._set$_set;
        t2 = A._instanceType(t1);
        t3 = t2._eval$1("EfficientLengthMappedIterable<1,int>");
        t3 = A.List_List$of(new A.EfficientLengthMappedIterable(t1, t2._eval$1("int(1)")._as(new A.BuiltSet_hashCode_closure(_this)), t3), false, t3._eval$1("Iterable.E"));
        B.JSArray_methods.sort$0(t3);
        t3 = _this._set$_hashCode = A.hashObjects(t3);
        t1 = t3;
      }
      return t1;
    },
    $eq(_, other) {
      var t1, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A.BuiltSet))
        return false;
      t1 = _this._set$_set;
      if (other._set$_set._collection$_length !== t1._collection$_length)
        return false;
      if (other.get$hashCode(other) != _this.get$hashCode(_this))
        return false;
      return t1.containsAll$1(other);
    },
    toString$0(_) {
      return A.IterableBase_iterableToFullString(this._set$_set, "{", "}");
    },
    get$length(_) {
      return this._set$_set._collection$_length;
    },
    get$iterator(_) {
      var t1 = this._set$_set;
      return A._LinkedHashSetIterator$(t1, t1._collection$_modifications, A._instanceType(t1)._precomputed1);
    },
    map$1$1(_, f, $T) {
      var t1 = this._set$_set,
        t2 = A._instanceType(t1);
      return new A.EfficientLengthMappedIterable(t1, t2._bind$1($T)._eval$1("1(2)")._as(this.$ti._bind$1($T)._eval$1("1(2)")._as(f)), t2._eval$1("@<1>")._bind$1($T)._eval$1("EfficientLengthMappedIterable<1,2>"));
    },
    map$1($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    contains$1(_, element) {
      return this._set$_set.contains$1(0, element);
    },
    toList$1$growable(_, growable) {
      var t1 = this._set$_set;
      return A.List_List$of(t1, true, A._instanceType(t1)._precomputed1);
    },
    toList$0($receiver) {
      return this.toList$1$growable($receiver, true);
    },
    get$isEmpty(_) {
      return this._set$_set._collection$_length === 0;
    },
    get$isNotEmpty(_) {
      return this._set$_set._collection$_length !== 0;
    },
    skip$1(_, n) {
      var t1 = this._set$_set;
      return A.SkipIterable_SkipIterable(t1, n, A._instanceType(t1)._precomputed1);
    },
    get$first(_) {
      var t1 = this._set$_set;
      return t1.get$first(t1);
    },
    elementAt$1(_, index) {
      return this._set$_set.elementAt$1(0, index);
    },
    $isIterable: 1
  };
  A.BuiltSet_hashCode_closure.prototype = {
    call$1(e) {
      return J.get$hashCode$(this.$this.$ti._precomputed1._as(e));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1)");
    }
  };
  A._BuiltSet.prototype = {
    _maybeCheckForNull$0() {
      if (!(!$.$get$isSoundMode() && !this.$ti._precomputed1._is(null)))
        return;
      for (var t1 = this._set$_set, t1 = A._LinkedHashSetIterator$(t1, t1._collection$_modifications, A._instanceType(t1)._precomputed1); t1.moveNext$0();)
        if (t1._collection$_current == null)
          throw A.wrapException(A.ArgumentError$("iterable contained invalid element: null", null));
    }
  };
  A.SetBuilder.prototype = {
    build$0() {
      var t1, _this = this;
      if (_this._setOwner == null)
        _this.set$_setOwner(new A._BuiltSet(_this._setFactory, A._lateReadCheck(_this.__SetBuilder__set, "_set"), _this.$ti._eval$1("_BuiltSet<1>")));
      t1 = _this._setOwner;
      t1.toString;
      return t1;
    },
    replace$1(_, iterable) {
      var t1, t2, t3, element, _this = this,
        set = _this._createSet$0();
      for (t1 = J.get$iterator$ax(iterable), t2 = _this.$ti, t3 = t2._precomputed1; t1.moveNext$0();) {
        element = t1.get$current(t1);
        if (t3._is(element))
          set.add$1(0, element);
        else
          throw A.wrapException(A.ArgumentError$("iterable contained invalid element: " + A.S(element), null));
      }
      t2._eval$1("Set<1>")._as(set);
      _this.set$_setOwner(null);
      _this.set$__SetBuilder__set(set);
    },
    get$length(_) {
      return A._lateReadCheck(this.__SetBuilder__set, "_set")._collection$_length;
    },
    map$1(_, f) {
      var result, t2, t3, t4, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1(1)")._as(f);
      result = _this._createSet$0();
      t2 = A._lateReadCheck(_this.__SetBuilder__set, "_set");
      t3 = t1._precomputed1;
      t4 = A._instanceType(t2);
      result.addAll$1(0, new A.EfficientLengthMappedIterable(t2, t4._bind$1(t3)._eval$1("1(2)")._as(f), t4._eval$1("@<1>")._bind$1(t3)._eval$1("EfficientLengthMappedIterable<1,2>")));
      _this._maybeCheckElements$1(result);
      t1._eval$1("Set<1>")._as(result);
      _this.set$_setOwner(null);
      _this.set$__SetBuilder__set(result);
    },
    get$_safeSet() {
      var t1, _this = this;
      if (_this._setOwner != null) {
        t1 = _this._createSet$0();
        t1.addAll$1(0, A._lateReadCheck(_this.__SetBuilder__set, "_set"));
        _this.set$__SetBuilder__set(_this.$ti._eval$1("Set<1>")._as(t1));
        _this.set$_setOwner(null);
      }
      return A._lateReadCheck(_this.__SetBuilder__set, "_set");
    },
    _createSet$0() {
      return A.LinkedHashSet_LinkedHashSet$_empty(this.$ti._precomputed1);
    },
    _maybeCheckElements$1(elements) {
      var t2,
        t1 = this.$ti;
      t1._eval$1("Iterable<1>")._as(elements);
      if (!(!$.$get$isSoundMode() && !t1._precomputed1._is(null)))
        return;
      for (t2 = A._LinkedHashSetIterator$(elements, elements._collection$_modifications, A._instanceType(elements)._precomputed1), t1 = t1._precomputed1; t2.moveNext$0();)
        if (t1._as(t2._collection$_current) == null)
          A.throwExpression(A.ArgumentError$("null element", null));
    },
    set$__SetBuilder__set(__SetBuilder__set) {
      this.__SetBuilder__set = this.$ti._eval$1("Set<1>")._as(__SetBuilder__set);
    },
    set$_setOwner(_setOwner) {
      this._setOwner = this.$ti._eval$1("_BuiltSet<1>?")._as(_setOwner);
    }
  };
  A.BuiltSetMultimap.prototype = {
    get$hashCode(_) {
      var t2, _this = this,
        t1 = _this._set_multimap$_hashCode;
      if (t1 == null) {
        t1 = _this._set_multimap$_map;
        t1 = t1.get$keys(t1);
        t2 = A._instanceType(t1);
        t2 = A.MappedIterable_MappedIterable(t1, t2._eval$1("int(Iterable.E)")._as(new A.BuiltSetMultimap_hashCode_closure(_this)), t2._eval$1("Iterable.E"), type$.int);
        t2 = A.List_List$of(t2, false, A._instanceType(t2)._eval$1("Iterable.E"));
        B.JSArray_methods.sort$0(t2);
        t2 = _this._set_multimap$_hashCode = A.hashObjects(t2);
        t1 = t2;
      }
      return t1;
    },
    $eq(_, other) {
      var t1, t2, t3, t4, t5, key, result, t6, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A.BuiltSetMultimap))
        return false;
      t1 = other._set_multimap$_map;
      t2 = _this._set_multimap$_map;
      if (t1.get$length(t1) !== t2.get$length(t2))
        return false;
      if (other.get$hashCode(other) != _this.get$hashCode(_this))
        return false;
      for (t3 = _this.get$keys(_this), t3 = t3.get$iterator(t3), t4 = other._emptySet, t5 = _this._emptySet; t3.moveNext$0();) {
        key = t3.get$current(t3);
        result = t1.$index(0, key);
        t6 = result == null ? t4 : result;
        result = t2.$index(0, key);
        if (!t6.$eq(0, result == null ? t5 : result))
          return false;
      }
      return true;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this._set_multimap$_map);
    },
    $index(_, key) {
      var result = this._set_multimap$_map.$index(0, key);
      return result == null ? this._emptySet : result;
    },
    get$keys(_) {
      var t1, _this = this;
      if (_this._set_multimap$_keys == null) {
        t1 = _this._set_multimap$_map;
        _this.set$_set_multimap$_keys(t1.get$keys(t1));
      }
      t1 = _this._set_multimap$_keys;
      t1.toString;
      return t1;
    },
    get$length(_) {
      var t1 = this._set_multimap$_map;
      return t1.get$length(t1);
    },
    set$_set_multimap$_keys(_keys) {
      this._set_multimap$_keys = this.$ti._eval$1("Iterable<1>?")._as(_keys);
    }
  };
  A.BuiltSetMultimap_hashCode_closure.prototype = {
    call$1(key) {
      var t2,
        t1 = this.$this;
      t1.$ti._precomputed1._as(key);
      t2 = J.get$hashCode$(key);
      t1 = J.get$hashCode$(t1._set_multimap$_map.$index(0, key));
      return A._finish(A._combine(A._combine(0, J.get$hashCode$(t2)), J.get$hashCode$(t1)));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1)");
    }
  };
  A._BuiltSetMultimap.prototype = {};
  A.SetMultimapBuilder.prototype = {
    build$0() {
      var t1, key, t2, builtSet, t3, _this = this,
        _s11_ = "_builderMap",
        _s9_ = "_builtMap";
      if (_this._builtMapOwner == null) {
        for (t1 = J.get$keys$x(A._lateReadCheck(_this.__SetMultimapBuilder__builderMap, _s11_)), t1 = t1.get$iterator(t1); t1.moveNext$0();) {
          key = t1.get$current(t1);
          t2 = J.$index$asx(A._lateReadCheck(_this.__SetMultimapBuilder__builderMap, _s11_), key);
          if (t2._setOwner == null)
            t2.set$_setOwner(new A._BuiltSet(t2._setFactory, A._lateReadCheck(t2.__SetBuilder__set, "_set"), A._instanceType(t2)._eval$1("_BuiltSet<1>")));
          builtSet = t2._setOwner;
          t2 = builtSet._set$_set._collection$_length;
          t3 = _this.__SetMultimapBuilder__builtMap;
          if (t2 === 0)
            J.remove$1$x(A._lateReadCheck(t3, _s9_), key);
          else
            J.$indexSet$ax(A._lateReadCheck(t3, _s9_), key, builtSet);
        }
        t1 = _this.$ti;
        t2 = t1._rest[1];
        _this.set$_builtMapOwner(new A._BuiltSetMultimap(A._lateReadCheck(_this.__SetMultimapBuilder__builtMap, _s9_), A.BuiltSet_BuiltSet$from(B.List_empty0, t2), t1._eval$1("@<1>")._bind$1(t2)._eval$1("_BuiltSetMultimap<1,2>")));
      }
      t1 = _this._builtMapOwner;
      t1.toString;
      return t1;
    },
    replace$1(_, multimap) {
      this._setWithCopyAndCheck$2(multimap.get$keys(multimap), new A.SetMultimapBuilder_replace_closure(multimap));
    },
    _getValuesBuilder$1(key) {
      var result, builtValues, _this = this,
        _s11_ = "_builderMap",
        t1 = _this.$ti;
      t1._precomputed1._as(key);
      result = J.$index$asx(A._lateReadCheck(_this.__SetMultimapBuilder__builderMap, _s11_), key);
      if (result == null) {
        builtValues = J.$index$asx(A._lateReadCheck(_this.__SetMultimapBuilder__builtMap, "_builtMap"), key);
        if (builtValues == null)
          result = A.SetBuilder_SetBuilder(t1._rest[1]);
        else {
          t1 = builtValues.$ti;
          t1._eval$1("_BuiltSet<1>")._as(builtValues);
          result = new A.SetBuilder(builtValues._setFactory, builtValues._set$_set, builtValues, t1._eval$1("SetBuilder<1>"));
        }
        J.$indexSet$ax(A._lateReadCheck(_this.__SetMultimapBuilder__builderMap, _s11_), key, result);
      }
      return result;
    },
    _setWithCopyAndCheck$2(keys, lookup) {
      var t1, t2, t3, t4, t5, t6, key, t7, value, t8, t9, _this = this, _null = null;
      _this.set$_builtMapOwner(_null);
      t1 = _this.$ti;
      t2 = t1._precomputed1;
      t3 = t1._eval$1("BuiltSet<2>");
      t4 = t1._eval$1("Map<1,BuiltSet<2>>");
      _this.set$__SetMultimapBuilder__builtMap(t4._as(A.LinkedHashMap_LinkedHashMap$_empty(t2, t3)));
      _this.set$__SetMultimapBuilder__builderMap(t1._eval$1("Map<1,SetBuilder<2>>")._as(A.LinkedHashMap_LinkedHashMap$_empty(t2, t1._eval$1("SetBuilder<2>"))));
      for (t5 = J.get$iterator$ax(keys), t6 = type$.Iterable_dynamic, t1 = t1._rest[1]; t5.moveNext$0();) {
        key = t5.get$current(t5);
        if (t2._is(key))
          for (t7 = J.get$iterator$ax(t6._as(lookup.call$1(key))); t7.moveNext$0();) {
            value = t7.get$current(t7);
            if (t1._is(value)) {
              t2._as(key);
              t1._as(value);
              if (_this._builtMapOwner != null) {
                _this.set$__SetMultimapBuilder__builtMap(t4._as(A.LinkedHashMap_LinkedHashMap$from(A._lateReadCheck(_this.__SetMultimapBuilder__builtMap, "_builtMap"), t2, t3)));
                _this.set$_builtMapOwner(_null);
              }
              _this._set_multimap$_checkKey$1(key);
              _this._set_multimap$_checkValue$1(value);
              t8 = _this._getValuesBuilder$1(key);
              t9 = t8.$ti._precomputed1;
              t9._as(value);
              if (!$.$get$isSoundMode() && !t9._is(null))
                if (value == null)
                  A.throwExpression(A.ArgumentError$("null element", _null));
              t8.get$_safeSet().add$1(0, value);
            } else
              throw A.wrapException(A.ArgumentError$("map contained invalid value: " + A.S(value) + ", for key " + A.S(key), _null));
          }
        else
          throw A.wrapException(A.ArgumentError$("map contained invalid key: " + A.S(key), _null));
      }
    },
    _set_multimap$_checkKey$1(key) {
      var t1 = this.$ti._precomputed1;
      t1._as(key);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (key == null)
        throw A.wrapException(A.ArgumentError$("invalid key: " + A.S(key), null));
    },
    _set_multimap$_checkValue$1(value) {
      var t1 = this.$ti._rest[1];
      t1._as(value);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (value == null)
        throw A.wrapException(A.ArgumentError$("invalid value: " + A.S(value), null));
    },
    set$__SetMultimapBuilder__builtMap(__SetMultimapBuilder__builtMap) {
      this.__SetMultimapBuilder__builtMap = this.$ti._eval$1("Map<1,BuiltSet<2>>")._as(__SetMultimapBuilder__builtMap);
    },
    set$_builtMapOwner(_builtMapOwner) {
      this._builtMapOwner = this.$ti._eval$1("_BuiltSetMultimap<1,2>?")._as(_builtMapOwner);
    },
    set$__SetMultimapBuilder__builderMap(__SetMultimapBuilder__builderMap) {
      this.__SetMultimapBuilder__builderMap = this.$ti._eval$1("Map<1,SetBuilder<2>>")._as(__SetMultimapBuilder__builderMap);
    }
  };
  A.SetMultimapBuilder_replace_closure.prototype = {
    call$1(k) {
      return this.multimap.$index(0, k);
    },
    $signature: 1
  };
  A.EnumClass.prototype = {
    toString$0(_) {
      return this.name;
    }
  };
  A.newBuiltValueToStringHelper_closure.prototype = {
    call$1(className) {
      var t1 = new A.StringBuffer("");
      t1._contents = className;
      t1._contents = className + " {\n";
      $._indentingBuiltValueToStringHelperIndent = $._indentingBuiltValueToStringHelperIndent + 2;
      return new A.IndentingBuiltValueToStringHelper(t1);
    },
    $signature: 45
  };
  A.IndentingBuiltValueToStringHelper.prototype = {
    add$2(_, field, value) {
      var t1, t2;
      if (value != null) {
        t1 = this._result;
        t1.toString;
        t2 = t1._contents += B.JSString_methods.$mul(" ", $._indentingBuiltValueToStringHelperIndent);
        t2 += field;
        t1._contents = t2;
        t1._contents = t2 + "=";
        t2 = t1._contents += A.S(value);
        t1._contents = t2 + ",\n";
      }
    },
    toString$0(_) {
      var t2, stringResult,
        t1 = $._indentingBuiltValueToStringHelperIndent - 2;
      $._indentingBuiltValueToStringHelperIndent = t1;
      t2 = this._result;
      t2.toString;
      t1 = t2._contents += B.JSString_methods.$mul(" ", t1);
      t2._contents = t1 + "}";
      stringResult = J.toString$0$(this._result);
      this._result = null;
      return stringResult;
    }
  };
  A.BuiltValueNullFieldError.prototype = {
    toString$0(_) {
      var t1 = this.field;
      return 'Tried to construct class "' + this.type + '" with null field "' + t1 + '". This is forbidden; to allow it, mark "' + t1 + '" with @nullable.';
    }
  };
  A.BuiltValueNestedFieldError.prototype = {
    toString$0(_) {
      return 'Tried to build class "' + this.type + '" but nested builder for field "' + A.S(this.field) + '" threw: ' + A.S(this.error);
    }
  };
  A.JsonObject.prototype = {
    toString$0(_) {
      return J.toString$0$(this.get$value(this));
    }
  };
  A.BoolJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.BoolJsonObject))
        return false;
      return this.value === other.value;
    },
    get$hashCode(_) {
      return B.JSBool_methods.get$hashCode(this.value);
    },
    get$value(receiver) {
      return this.value;
    }
  };
  A.ListJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.ListJsonObject))
        return false;
      return B.C_DeepCollectionEquality.equals$2(this.value, other.value);
    },
    get$hashCode(_) {
      return B.C_DeepCollectionEquality.hash$1(0, this.value);
    },
    get$value(receiver) {
      return this.value;
    }
  };
  A.MapJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.MapJsonObject))
        return false;
      return B.C_DeepCollectionEquality.equals$2(this.value, other.value);
    },
    get$hashCode(_) {
      return B.C_DeepCollectionEquality.hash$1(0, this.value);
    },
    get$value(receiver) {
      return this.value;
    }
  };
  A.NumJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.NumJsonObject))
        return false;
      return this.value === other.value;
    },
    get$hashCode(_) {
      return B.JSNumber_methods.get$hashCode(this.value);
    },
    get$value(receiver) {
      return this.value;
    }
  };
  A.StringJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.StringJsonObject))
        return false;
      return this.value === other.value;
    },
    get$hashCode(_) {
      return B.JSString_methods.get$hashCode(this.value);
    },
    get$value(receiver) {
      return this.value;
    }
  };
  A.Serializers_Serializers_closure.prototype = {
    call$0() {
      return A.ListBuilder_ListBuilder(B.List_empty0, type$.Object);
    },
    $signature: 46
  };
  A.Serializers_Serializers_closure0.prototype = {
    call$0() {
      var t1 = type$.Object;
      return A.ListMultimapBuilder_ListMultimapBuilder(t1, t1);
    },
    $signature: 47
  };
  A.Serializers_Serializers_closure1.prototype = {
    call$0() {
      var t1 = type$.Object;
      return A.MapBuilder_MapBuilder(t1, t1);
    },
    $signature: 48
  };
  A.Serializers_Serializers_closure2.prototype = {
    call$0() {
      return A.SetBuilder_SetBuilder(type$.Object);
    },
    $signature: 49
  };
  A.Serializers_Serializers_closure3.prototype = {
    call$0() {
      var t1 = type$.Object;
      return A.SetMultimapBuilder_SetMultimapBuilder(t1, t1);
    },
    $signature: 50
  };
  A.FullType.prototype = {
    $eq(_, other) {
      var t1, t2, t3, t4, i, t5, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A.FullType))
        return false;
      if (_this.root != other.root)
        return false;
      if (_this.nullable !== other.nullable)
        return false;
      t1 = _this.parameters;
      t2 = t1.length;
      t3 = other.parameters;
      t4 = t3.length;
      if (t2 !== t4)
        return false;
      for (i = 0; i !== t2; ++i) {
        if (!(i < t2))
          return A.ioore(t1, i);
        t5 = t1[i];
        if (!(i < t4))
          return A.ioore(t3, i);
        if (!t5.$eq(0, t3[i]))
          return false;
      }
      return true;
    },
    get$hashCode(_) {
      var t1 = A.hashObjects(this.parameters);
      t1 = A._finish(A._combine(A._combine(0, J.get$hashCode$(this.root)), B.JSInt_methods.get$hashCode(t1)));
      return t1 ^ (this.nullable ? 1768878041 : 0);
    },
    toString$0(_) {
      var t2,
        t1 = this.root;
      if (t1 == null)
        t1 = "unspecified";
      else {
        t2 = this.parameters;
        t1 = t2.length === 0 ? A.FullType__getRawName(t1) : A.FullType__getRawName(t1) + "<" + B.JSArray_methods.join$1(t2, ", ") + ">";
        t1 += this.nullable ? "?" : "";
      }
      return t1;
    }
  };
  A.DeserializationError.prototype = {
    toString$0(_) {
      return "Deserializing '" + this.json + "' to '" + this.type.toString$0(0) + "' failed due to: " + this.error.toString$0(0);
    }
  };
  A.BigIntSerializer.prototype = {
    serialize$3$specifiedType(serializers, bigInt, specifiedType) {
      return type$.BigInt._as(bigInt).toString$0(0);
    },
    serialize$2(serializers, bigInt) {
      return this.serialize$3$specifiedType(serializers, bigInt, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var result;
      A._asStringS(serialized);
      result = A._BigIntImpl__tryParse(serialized, null);
      if (result == null)
        A.throwExpression(A.FormatException$("Could not parse BigInt", serialized, null));
      return result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "BigInt";
    }
  };
  A.BoolSerializer.prototype = {
    serialize$3$specifiedType(serializers, boolean, specifiedType) {
      return A._asBoolS(boolean);
    },
    serialize$2(serializers, boolean) {
      return this.serialize$3$specifiedType(serializers, boolean, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A._asBoolS(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "bool";
    }
  };
  A.BuiltJsonSerializers.prototype = {
    serialize$2$specifiedType(object, specifiedType) {
      var t1, t2, t3, transformedObject, result;
      for (t1 = this.serializerPlugins._list, t2 = A._arrayInstanceType(t1)._eval$1("ArrayIterator<1>"), t3 = new J.ArrayIterator(t1, t1.length, t2), transformedObject = object; t3.moveNext$0();)
        transformedObject = t3.__interceptors$_current.beforeSerialize$2(transformedObject, specifiedType);
      result = this._serialize$2(transformedObject, specifiedType);
      for (t1 = new J.ArrayIterator(t1, t1.length, t2); t1.moveNext$0();)
        result = t1.__interceptors$_current.afterSerialize$2(result, specifiedType);
      return result;
    },
    serialize$1(object) {
      return this.serialize$2$specifiedType(object, B.FullType_null_List_empty_false);
    },
    _serialize$2(object, specifiedType) {
      var serializer, result, _this = this,
        _s62_ = string$.serial,
        t1 = specifiedType.root;
      if (t1 == null) {
        t1 = J.getInterceptor$(object);
        serializer = _this.serializerForType$1(t1.get$runtimeType(object));
        if (serializer == null)
          throw A.wrapException(A.StateError$("No serializer for '" + t1.get$runtimeType(object).toString$0(0) + "'."));
        if (type$.StructuredSerializer_dynamic._is(serializer)) {
          result = [serializer.get$wireName()];
          B.JSArray_methods.addAll$1(result, serializer.serialize$2(_this, object));
          return result;
        } else if (type$.PrimitiveSerializer_dynamic._is(serializer))
          return object == null ? [serializer.get$wireName(), null] : A._setArrayType([serializer.get$wireName(), serializer.serialize$2(_this, object)], type$.JSArray_Object);
        else
          throw A.wrapException(A.StateError$(_s62_));
      } else {
        serializer = _this.serializerForType$1(t1);
        if (serializer == null)
          return _this.serialize$1(object);
        if (type$.StructuredSerializer_dynamic._is(serializer))
          return object == null ? null : J.toList$0$ax(serializer.serialize$3$specifiedType(_this, object, specifiedType));
        else if (type$.PrimitiveSerializer_dynamic._is(serializer))
          return object == null ? null : serializer.serialize$3$specifiedType(_this, object, specifiedType);
        else
          throw A.wrapException(A.StateError$(_s62_));
      }
    },
    deserialize$2$specifiedType(object, specifiedType) {
      var t1, t2, t3, transformedObject, result;
      for (t1 = this.serializerPlugins._list, t2 = A._arrayInstanceType(t1)._eval$1("ArrayIterator<1>"), t3 = new J.ArrayIterator(t1, t1.length, t2), transformedObject = object; t3.moveNext$0();)
        transformedObject = t3.__interceptors$_current.beforeDeserialize$2(transformedObject, specifiedType);
      result = this._deserialize$3(object, transformedObject, specifiedType);
      for (t1 = new J.ArrayIterator(t1, t1.length, t2); t1.moveNext$0();)
        result = t1.__interceptors$_current.afterDeserialize$2(result, specifiedType);
      return result;
    },
    deserialize$1(object) {
      return this.deserialize$2$specifiedType(object, B.FullType_null_List_empty_false);
    },
    _deserialize$3(objectBeforePlugins, object, specifiedType) {
      var serializer, error, primitive, error0, serializer0, error1, error2, wireName, exception, _this = this,
        _s19_ = "No serializer for '",
        _s62_ = string$.serial,
        t1 = specifiedType.root;
      if (t1 == null) {
        type$.List_nullable_Object._as(object);
        t1 = J.getInterceptor$ax(object);
        wireName = A._asStringS(t1.get$first(object));
        serializer = _this._wireNameToSerializer._map$_map.$index(0, wireName);
        if (serializer == null)
          throw A.wrapException(A.StateError$(_s19_ + A.S(wireName) + "'."));
        if (type$.StructuredSerializer_dynamic._is(serializer))
          try {
            t1 = serializer.deserialize$2(_this, t1.sublist$1(object, 1));
            return t1;
          } catch (exception) {
            t1 = A.unwrapException(exception);
            if (type$.Error._is(t1)) {
              error = t1;
              throw A.wrapException(A.DeserializationError_DeserializationError(object, specifiedType, error));
            } else
              throw exception;
          }
        else if (type$.PrimitiveSerializer_dynamic._is(serializer))
          try {
            primitive = t1.$index(object, 1);
            t1 = primitive == null ? null : serializer.deserialize$2(_this, primitive);
            return t1;
          } catch (exception) {
            t1 = A.unwrapException(exception);
            if (type$.Error._is(t1)) {
              error0 = t1;
              throw A.wrapException(A.DeserializationError_DeserializationError(object, specifiedType, error0));
            } else
              throw exception;
          }
        else
          throw A.wrapException(A.StateError$(_s62_));
      } else {
        serializer0 = _this.serializerForType$1(t1);
        if (serializer0 == null)
          if (type$.List_dynamic._is(object) && typeof J.get$first$ax(object) == "string")
            return _this.deserialize$1(objectBeforePlugins);
          else
            throw A.wrapException(A.StateError$(_s19_ + t1.toString$0(0) + "'."));
        if (type$.StructuredSerializer_dynamic._is(serializer0))
          try {
            t1 = object == null ? null : serializer0.deserialize$3$specifiedType(_this, type$.Iterable_nullable_Object._as(object), specifiedType);
            return t1;
          } catch (exception) {
            t1 = A.unwrapException(exception);
            if (type$.Error._is(t1)) {
              error1 = t1;
              throw A.wrapException(A.DeserializationError_DeserializationError(object, specifiedType, error1));
            } else
              throw exception;
          }
        else if (type$.PrimitiveSerializer_dynamic._is(serializer0))
          try {
            t1 = object == null ? null : serializer0.deserialize$3$specifiedType(_this, object, specifiedType);
            return t1;
          } catch (exception) {
            t1 = A.unwrapException(exception);
            if (type$.Error._is(t1)) {
              error2 = t1;
              throw A.wrapException(A.DeserializationError_DeserializationError(object, specifiedType, error2));
            } else
              throw exception;
          }
        else
          throw A.wrapException(A.StateError$(_s62_));
      }
    },
    serializerForType$1(type) {
      var t1 = this._typeToSerializer._map$_map.$index(0, type);
      if (t1 == null) {
        t1 = A._getRawName(type);
        t1 = this._typeNameToSerializer._map$_map.$index(0, t1);
      }
      return t1;
    },
    newBuilder$1(fullType) {
      var builderFactory = this.builderFactories._map$_map.$index(0, fullType);
      if (builderFactory == null) {
        this._throwMissingBuilderFactory$1(fullType);
        A.ReachabilityError$(string$._null_);
      }
      return builderFactory.call$0();
    },
    expectBuilder$1(fullType) {
      if (!this.builderFactories._map$_map.containsKey$1(0, fullType)) {
        this._throwMissingBuilderFactory$1(fullType);
        A.ReachabilityError$(string$._null_);
      }
    },
    _throwMissingBuilderFactory$1(fullType) {
      throw A.wrapException(A.StateError$("No builder factory for " + fullType.toString$0(0) + ". Fix by adding one, see SerializersBuilder.addBuilderFactory."));
    },
    $isSerializers: 1
  };
  A.BuiltJsonSerializersBuilder.prototype = {
    add$1(_, serializer) {
      var t1, t2, t3, t4, t5, t6, $name, genericsStart, t7;
      if (!type$.StructuredSerializer_dynamic._is(serializer) && !type$.PrimitiveSerializer_dynamic._is(serializer))
        throw A.wrapException(A.ArgumentError$(string$.serial, null));
      this._wireNameToSerializer.$indexSet(0, serializer.get$wireName(), serializer);
      for (t1 = J.get$iterator$ax(serializer.get$types(serializer)), t2 = this._typeToSerializer, t3 = t2.$ti, t4 = t3._precomputed1, t3 = t3._rest[1], t5 = this._typeNameToSerializer; t1.moveNext$0();) {
        t6 = t1.get$current(t1);
        t4._as(t6);
        t3._as(serializer);
        t2._checkKey$1(t6);
        t2._checkValue$1(serializer);
        t2.get$_safeMap().$indexSet(0, t6, serializer);
        $name = J.toString$0$(t6);
        genericsStart = J.indexOf$1$s($name, "<");
        t6 = genericsStart === -1 ? $name : B.JSString_methods.substring$2($name, 0, genericsStart);
        t7 = t5.$ti;
        t7._precomputed1._as(t6);
        t7._rest[1]._as(serializer);
        t5._checkKey$1(t6);
        t5._checkValue$1(serializer);
        t5.get$_safeMap().$indexSet(0, t6, serializer);
      }
    },
    addBuilderFactory$2(types, $function) {
      var t2, t3,
        t1 = this._builderFactories;
      t1.$indexSet(0, types, $function);
      t2 = types.root;
      t3 = types.parameters;
      t1.$indexSet(0, !types.nullable ? new A.FullType(t2, t3, true) : new A.FullType(t2, t3, false), $function);
    },
    build$0() {
      var _this = this;
      return new A.BuiltJsonSerializers(_this._typeToSerializer.build$0(), _this._wireNameToSerializer.build$0(), _this._typeNameToSerializer.build$0(), _this._builderFactories.build$0(), _this._plugins.build$0());
    }
  };
  A.BuiltListMultimapSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtListMultimap, specifiedType) {
      var t1, t2, t3, keyType, valueType, result, key, result0, t4, t5, t6, t7;
      type$.BuiltListMultimap_dynamic_dynamic._as(builtListMultimap);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        serializers.expectBuilder$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t2)
          return A.ioore(t1, 1);
        valueType = t1[1];
      }
      result = [];
      for (t1 = builtListMultimap.get$keys(builtListMultimap), t1 = t1.get$iterator(t1), t2 = builtListMultimap._list_multimap$_map, t3 = builtListMultimap._emptyList; t1.moveNext$0();) {
        key = t1.get$current(t1);
        result.push(serializers.serialize$2$specifiedType(key, keyType));
        result0 = t2.$index(0, key);
        t4 = result0 == null ? t3 : result0;
        t5 = t4._list;
        t6 = A._arrayInstanceType(t5);
        t7 = t6._eval$1("MappedListIterable<1,Object?>");
        result.push(A.List_List$of(new A.MappedListIterable(t5, t6._eval$1("Object?(1)")._as(t4.$ti._eval$1("Object?(1)")._as(new A.BuiltListMultimapSerializer_serialize_closure(serializers, valueType))), t7), true, t7._eval$1("ListIterable.E")));
      }
      return result;
    },
    serialize$2(serializers, builtListMultimap) {
      return this.serialize$3$specifiedType(serializers, builtListMultimap, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t2, t3, t4, keyType, valueType, result, i, key, values, value, t5, t6, t7, _null = null,
        t1 = type$.Iterable_nullable_Object;
      t1._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t2 = specifiedType.parameters;
      t3 = t2.length;
      t4 = t3 === 0;
      if (t4)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t3)
          return A.ioore(t2, 0);
        keyType = t2[0];
      }
      if (t4)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t3)
          return A.ioore(t2, 1);
        valueType = t2[1];
      }
      if (isUnderspecified) {
        t2 = type$.Object;
        result = A.ListMultimapBuilder_ListMultimapBuilder(t2, t2);
      } else
        result = type$.ListMultimapBuilder_dynamic_dynamic._as(serializers.newBuilder$1(specifiedType));
      t2 = J.getInterceptor$asx(serialized);
      if (B.JSInt_methods.$mod(t2.get$length(serialized), 2) === 1)
        throw A.wrapException(A.ArgumentError$("odd length", _null));
      for (t3 = type$.nullable_Object, i = 0; i !== t2.get$length(serialized); i += 2) {
        key = serializers.deserialize$2$specifiedType(t2.elementAt$1(serialized, i), keyType);
        values = J.map$1$1$ax(t1._as(t2.elementAt$1(serialized, i + 1)), new A.BuiltListMultimapSerializer_deserialize_closure(serializers, valueType), t3);
        for (t4 = values.get$iterator(values); t4.moveNext$0();) {
          value = t4.get$current(t4);
          result.toString;
          t5 = result.$ti;
          t6 = t5._precomputed1;
          t6._as(key);
          t5._rest[1]._as(value);
          if (result._list_multimap$_builtMapOwner != null) {
            result.set$__ListMultimapBuilder__builtMap(t5._eval$1("Map<1,BuiltList<2>>")._as(A.LinkedHashMap_LinkedHashMap$from(A._lateReadCheck(result.__ListMultimapBuilder__builtMap, "_builtMap"), t6, t5._eval$1("BuiltList<2>"))));
            result.set$_list_multimap$_builtMapOwner(_null);
          }
          result._list_multimap$_checkKey$1(key);
          result._list_multimap$_checkValue$1(value);
          t5 = result._list_multimap$_getValuesBuilder$1(key);
          t6 = t5.$ti;
          t7 = t6._precomputed1;
          t7._as(value);
          if (!$.$get$isSoundMode() && !t7._is(null))
            if (value == null)
              A.throwExpression(A.ArgumentError$("null element", _null));
          if (t5._listOwner != null) {
            t5.set$__ListBuilder__list(t6._eval$1("List<1>")._as(A.List_List$from(A._lateReadCheck(t5.__ListBuilder__list, "_list"), true, t7)));
            t5.set$_listOwner(_null);
          }
          J.add$1$ax(A._lateReadCheck(t5.__ListBuilder__list, "_list"), value);
        }
      }
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "listMultimap";
    }
  };
  A.BuiltListMultimapSerializer_serialize_closure.prototype = {
    call$1(value) {
      return this.serializers.serialize$2$specifiedType(value, this.valueType);
    },
    $signature: 3
  };
  A.BuiltListMultimapSerializer_deserialize_closure.prototype = {
    call$1(value) {
      return this.serializers.deserialize$2$specifiedType(value, this.valueType);
    },
    $signature: 27
  };
  A.BuiltListSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtList, specifiedType) {
      var t1, t2, elementType;
      type$.BuiltList_dynamic._as(builtList);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        serializers.expectBuilder$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      builtList.toString;
      t1 = builtList._list;
      t2 = A._arrayInstanceType(t1);
      return new A.MappedListIterable(t1, t2._eval$1("Object?(1)")._as(builtList.$ti._eval$1("Object?(1)")._as(new A.BuiltListSerializer_serialize_closure(serializers, elementType))), t2._eval$1("MappedListIterable<1,Object?>"));
    },
    serialize$2(serializers, builtList) {
      return this.serialize$3$specifiedType(serializers, builtList, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t1, t2, elementType, result;
      type$.Iterable_dynamic._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      result = isUnderspecified ? A.ListBuilder_ListBuilder(B.List_empty0, type$.Object) : type$.ListBuilder_dynamic._as(serializers.newBuilder$1(specifiedType));
      result.replace$1(0, J.map$1$1$ax(serialized, new A.BuiltListSerializer_deserialize_closure(serializers, elementType), type$.dynamic));
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "list";
    }
  };
  A.BuiltListSerializer_serialize_closure.prototype = {
    call$1(item) {
      return this.serializers.serialize$2$specifiedType(item, this.elementType);
    },
    $signature: 3
  };
  A.BuiltListSerializer_deserialize_closure.prototype = {
    call$1(item) {
      return this.serializers.deserialize$2$specifiedType(item, this.elementType);
    },
    $signature: 3
  };
  A.BuiltMapSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtMap, specifiedType) {
      var t1, t2, t3, keyType, valueType, result, key;
      type$.BuiltMap_dynamic_dynamic._as(builtMap);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        serializers.expectBuilder$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t2)
          return A.ioore(t1, 1);
        valueType = t1[1];
      }
      result = [];
      for (t1 = builtMap.get$keys(builtMap), t1 = t1.get$iterator(t1), t2 = builtMap._map$_map; t1.moveNext$0();) {
        key = t1.get$current(t1);
        result.push(serializers.serialize$2$specifiedType(key, keyType));
        result.push(serializers.serialize$2$specifiedType(t2.$index(0, key), valueType));
      }
      return result;
    },
    serialize$2(serializers, builtMap) {
      return this.serialize$3$specifiedType(serializers, builtMap, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t1, t2, t3, keyType, valueType, result, i, key, value;
      type$.Iterable_dynamic._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t2)
          return A.ioore(t1, 1);
        valueType = t1[1];
      }
      if (isUnderspecified) {
        t1 = type$.Object;
        result = A.MapBuilder_MapBuilder(t1, t1);
      } else
        result = type$.MapBuilder_dynamic_dynamic._as(serializers.newBuilder$1(specifiedType));
      t1 = J.getInterceptor$asx(serialized);
      if (B.JSInt_methods.$mod(t1.get$length(serialized), 2) === 1)
        throw A.wrapException(A.ArgumentError$("odd length", null));
      for (i = 0; i !== t1.get$length(serialized); i += 2) {
        key = serializers.deserialize$2$specifiedType(t1.elementAt$1(serialized, i), keyType);
        value = serializers.deserialize$2$specifiedType(t1.elementAt$1(serialized, i + 1), valueType);
        result.toString;
        t2 = result.$ti;
        t2._precomputed1._as(key);
        t2._rest[1]._as(value);
        result._checkKey$1(key);
        result._checkValue$1(value);
        result.get$_safeMap().$indexSet(0, key, value);
      }
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "map";
    }
  };
  A.BuiltSetMultimapSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtSetMultimap, specifiedType) {
      var t1, t2, t3, keyType, valueType, result, key, result0, t4, t5, t6, t7;
      type$.BuiltSetMultimap_dynamic_dynamic._as(builtSetMultimap);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        serializers.expectBuilder$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t2)
          return A.ioore(t1, 1);
        valueType = t1[1];
      }
      result = [];
      for (t1 = builtSetMultimap.get$keys(builtSetMultimap), t1 = t1.get$iterator(t1), t2 = builtSetMultimap._set_multimap$_map, t3 = builtSetMultimap._emptySet; t1.moveNext$0();) {
        key = t1.get$current(t1);
        result.push(serializers.serialize$2$specifiedType(key, keyType));
        result0 = t2.$index(0, key);
        t4 = result0 == null ? t3 : result0;
        t5 = t4._set$_set;
        t6 = A._instanceType(t5);
        t7 = t6._eval$1("EfficientLengthMappedIterable<1,Object?>");
        result.push(A.List_List$of(new A.EfficientLengthMappedIterable(t5, t6._eval$1("Object?(1)")._as(t4.$ti._eval$1("Object?(1)")._as(new A.BuiltSetMultimapSerializer_serialize_closure(serializers, valueType))), t7), true, t7._eval$1("Iterable.E")));
      }
      return result;
    },
    serialize$2(serializers, builtSetMultimap) {
      return this.serialize$3$specifiedType(serializers, builtSetMultimap, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t2, t3, t4, keyType, valueType, result, i, key, value, t5,
        t1 = type$.Iterable_dynamic;
      t1._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t2 = specifiedType.parameters;
      t3 = t2.length;
      t4 = t3 === 0;
      if (t4)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t3)
          return A.ioore(t2, 0);
        keyType = t2[0];
      }
      if (t4)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t3)
          return A.ioore(t2, 1);
        valueType = t2[1];
      }
      if (isUnderspecified) {
        t2 = type$.Object;
        result = A.SetMultimapBuilder_SetMultimapBuilder(t2, t2);
      } else
        result = type$.SetMultimapBuilder_dynamic_dynamic._as(serializers.newBuilder$1(specifiedType));
      t2 = J.getInterceptor$asx(serialized);
      if (B.JSInt_methods.$mod(t2.get$length(serialized), 2) === 1)
        throw A.wrapException(A.ArgumentError$("odd length", null));
      for (i = 0; i !== t2.get$length(serialized); i += 2) {
        key = serializers.deserialize$2$specifiedType(t2.elementAt$1(serialized, i), keyType);
        for (t3 = J.get$iterator$ax(t1._as(J.map$1$ax(t2.elementAt$1(serialized, i + 1), new A.BuiltSetMultimapSerializer_deserialize_closure(serializers, valueType)))); t3.moveNext$0();) {
          value = t3.get$current(t3);
          result.toString;
          t4 = result.$ti;
          t5 = t4._precomputed1;
          t5._as(key);
          t4._rest[1]._as(value);
          if (result._builtMapOwner != null) {
            result.set$__SetMultimapBuilder__builtMap(t4._eval$1("Map<1,BuiltSet<2>>")._as(A.LinkedHashMap_LinkedHashMap$from(A._lateReadCheck(result.__SetMultimapBuilder__builtMap, "_builtMap"), t5, t4._eval$1("BuiltSet<2>"))));
            result.set$_builtMapOwner(null);
          }
          result._set_multimap$_checkKey$1(key);
          result._set_multimap$_checkValue$1(value);
          t4 = result._getValuesBuilder$1(key);
          t5 = t4.$ti._precomputed1;
          t5._as(value);
          if (!$.$get$isSoundMode() && !t5._is(null))
            if (value == null)
              A.throwExpression(A.ArgumentError$("null element", null));
          t4.get$_safeSet().add$1(0, value);
        }
      }
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "setMultimap";
    }
  };
  A.BuiltSetMultimapSerializer_serialize_closure.prototype = {
    call$1(value) {
      return this.serializers.serialize$2$specifiedType(value, this.valueType);
    },
    $signature: 3
  };
  A.BuiltSetMultimapSerializer_deserialize_closure.prototype = {
    call$1(value) {
      return this.serializers.deserialize$2$specifiedType(value, this.valueType);
    },
    $signature: 3
  };
  A.BuiltSetSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtSet, specifiedType) {
      var t1, t2, elementType;
      type$.BuiltSet_dynamic._as(builtSet);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        serializers.expectBuilder$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      builtSet.toString;
      t1 = builtSet._set$_set;
      t2 = A._instanceType(t1);
      return new A.EfficientLengthMappedIterable(t1, t2._eval$1("Object?(1)")._as(builtSet.$ti._eval$1("Object?(1)")._as(new A.BuiltSetSerializer_serialize_closure(serializers, elementType))), t2._eval$1("EfficientLengthMappedIterable<1,Object?>"));
    },
    serialize$2(serializers, builtSet) {
      return this.serialize$3$specifiedType(serializers, builtSet, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t1, t2, elementType, result;
      type$.Iterable_dynamic._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      result = isUnderspecified ? A.SetBuilder_SetBuilder(type$.Object) : type$.SetBuilder_dynamic._as(serializers.newBuilder$1(specifiedType));
      result.replace$1(0, J.map$1$1$ax(serialized, new A.BuiltSetSerializer_deserialize_closure(serializers, elementType), type$.dynamic));
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "set";
    }
  };
  A.BuiltSetSerializer_serialize_closure.prototype = {
    call$1(item) {
      return this.serializers.serialize$2$specifiedType(item, this.elementType);
    },
    $signature: 3
  };
  A.BuiltSetSerializer_deserialize_closure.prototype = {
    call$1(item) {
      return this.serializers.deserialize$2$specifiedType(item, this.elementType);
    },
    $signature: 3
  };
  A.DateTimeSerializer.prototype = {
    serialize$3$specifiedType(serializers, dateTime, specifiedType) {
      type$.DateTime._as(dateTime);
      if (!dateTime.isUtc)
        throw A.wrapException(A.ArgumentError$value(dateTime, "dateTime", "Must be in utc for serialization."));
      return 1000 * dateTime._value;
    },
    serialize$2(serializers, dateTime) {
      return this.serialize$3$specifiedType(serializers, dateTime, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t2,
        t1 = B.JSNumber_methods.round$0(A._asIntS(serialized) / 1000);
      if (Math.abs(t1) <= 864e13)
        t2 = false;
      else
        t2 = true;
      if (t2)
        A.throwExpression(A.ArgumentError$("DateTime is outside valid range: " + t1, null));
      A.checkNotNullable(true, "isUtc", type$.bool);
      return new A.DateTime(t1, true);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "DateTime";
    }
  };
  A.DoubleSerializer.prototype = {
    serialize$3$specifiedType(serializers, aDouble, specifiedType) {
      A._asDoubleS(aDouble);
      if (isNaN(aDouble))
        return "NaN";
      else if (aDouble == 1 / 0 || aDouble == -1 / 0)
        return B.JSNumber_methods.get$isNegative(aDouble) ? "-INF" : "INF";
      else
        return aDouble;
    },
    serialize$2(serializers, aDouble) {
      return this.serialize$3$specifiedType(serializers, aDouble, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1 = J.getInterceptor$(serialized);
      if (t1.$eq(serialized, "NaN"))
        return 0 / 0;
      else if (t1.$eq(serialized, "-INF"))
        return -1 / 0;
      else if (t1.$eq(serialized, "INF"))
        return 1 / 0;
      else
        return A._asNumS(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "double";
    }
  };
  A.DurationSerializer.prototype = {
    serialize$3$specifiedType(serializers, duration, specifiedType) {
      return type$.Duration._as(duration)._duration;
    },
    serialize$2(serializers, duration) {
      return this.serialize$3$specifiedType(serializers, duration, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return new A.Duration(A._asIntS(serialized));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "Duration";
    }
  };
  A.Int64Serializer.prototype = {
    serialize$3$specifiedType(serializers, int64, specifiedType) {
      return type$.Int64._as(int64)._toRadixString$1(10);
    },
    serialize$2(serializers, int64) {
      return this.serialize$3$specifiedType(serializers, int64, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A.Int64__parseRadix(A._asStringS(serialized), 10);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "Int64";
    }
  };
  A.IntSerializer.prototype = {
    serialize$3$specifiedType(serializers, integer, specifiedType) {
      return A._asIntS(integer);
    },
    serialize$2(serializers, integer) {
      return this.serialize$3$specifiedType(serializers, integer, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A._asIntS(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "int";
    }
  };
  A.JsonObjectSerializer.prototype = {
    serialize$3$specifiedType(serializers, jsonObject, specifiedType) {
      type$.JsonObject._as(jsonObject);
      return jsonObject.get$value(jsonObject);
    },
    serialize$2(serializers, jsonObject) {
      return this.serialize$3$specifiedType(serializers, jsonObject, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A.JsonObject_JsonObject(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "JsonObject";
    }
  };
  A.NullSerializer.prototype = {
    serialize$3$specifiedType(serializers, value, specifiedType) {
      type$.Null._as(value);
      throw A.wrapException(A.UnimplementedError$(null));
    },
    serialize$2(serializers, value) {
      return this.serialize$3$specifiedType(serializers, value, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      throw A.wrapException(A.UnimplementedError$(null));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "Null";
    }
  };
  A.NumSerializer.prototype = {
    serialize$3$specifiedType(serializers, number, specifiedType) {
      A._asNumS(number);
      if (isNaN(number))
        return "NaN";
      else if (number == 1 / 0 || number == -1 / 0)
        return B.JSNumber_methods.get$isNegative(number) ? "-INF" : "INF";
      else
        return number;
    },
    serialize$2(serializers, number) {
      return this.serialize$3$specifiedType(serializers, number, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1 = J.getInterceptor$(serialized);
      if (t1.$eq(serialized, "NaN"))
        return 0 / 0;
      else if (t1.$eq(serialized, "-INF"))
        return -1 / 0;
      else if (t1.$eq(serialized, "INF"))
        return 1 / 0;
      else
        return A._asNumS(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "num";
    }
  };
  A.RegExpSerializer.prototype = {
    serialize$3$specifiedType(serializers, value, specifiedType) {
      return type$.RegExp._as(value).pattern;
    },
    serialize$2(serializers, value) {
      return this.serialize$3$specifiedType(serializers, value, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A.RegExp_RegExp(A._asStringS(serialized), true, false);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "RegExp";
    }
  };
  A.StringSerializer.prototype = {
    serialize$3$specifiedType(serializers, string, specifiedType) {
      return A._asStringS(string);
    },
    serialize$2(serializers, string) {
      return this.serialize$3$specifiedType(serializers, string, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A._asStringS(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "String";
    }
  };
  A.UriSerializer.prototype = {
    serialize$3$specifiedType(serializers, uri, specifiedType) {
      return type$.Uri._as(uri).toString$0(0);
    },
    serialize$2(serializers, uri) {
      return this.serialize$3$specifiedType(serializers, uri, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A.Uri_parse(A._asStringS(serialized));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "Uri";
    }
  };
  A.DefaultEquality.prototype = {$isEquality: 1};
  A.IterableEquality.prototype = {
    equals$2(elements1, elements2) {
      var it1, it2, hasNext,
        t1 = this.$ti._eval$1("Iterable<1>?");
      t1._as(elements1);
      t1._as(elements2);
      if (elements1 === elements2)
        return true;
      it1 = J.get$iterator$ax(elements1);
      it2 = J.get$iterator$ax(elements2);
      for (t1 = this._elementEquality; true;) {
        hasNext = it1.moveNext$0();
        if (hasNext !== it2.moveNext$0())
          return false;
        if (!hasNext)
          return true;
        if (!t1.equals$2(it1.get$current(it1), it2.get$current(it2)))
          return false;
      }
    },
    hash$1(_, elements) {
      var t1, t2, hash, c;
      this.$ti._eval$1("Iterable<1>?")._as(elements);
      for (t1 = J.get$iterator$ax(elements), t2 = this._elementEquality, hash = 0; t1.moveNext$0();) {
        c = t2.hash$1(0, t1.get$current(t1));
        if (typeof c !== "number")
          return A.iae(c);
        hash = hash + c & 2147483647;
        hash = hash + (hash << 10 >>> 0) & 2147483647;
        hash ^= hash >>> 6;
      }
      hash = hash + (hash << 3 >>> 0) & 2147483647;
      hash ^= hash >>> 11;
      return hash + (hash << 15 >>> 0) & 2147483647;
    },
    $isEquality: 1
  };
  A.ListEquality.prototype = {
    equals$2(list1, list2) {
      var $length, t2, t3, i,
        t1 = this.$ti._eval$1("List<1>?");
      t1._as(list1);
      t1._as(list2);
      if (list1 === list2)
        return true;
      t1 = J.getInterceptor$asx(list1);
      $length = t1.get$length(list1);
      t2 = J.getInterceptor$asx(list2);
      if ($length !== t2.get$length(list2))
        return false;
      for (t3 = this._elementEquality, i = 0; i < $length; ++i)
        if (!t3.equals$2(t1.$index(list1, i), t2.$index(list2, i)))
          return false;
      return true;
    },
    hash$1(_, list) {
      var t1, t2, hash, i, c;
      this.$ti._eval$1("List<1>?")._as(list);
      for (t1 = J.getInterceptor$asx(list), t2 = this._elementEquality, hash = 0, i = 0; i < t1.get$length(list); ++i) {
        c = t2.hash$1(0, t1.$index(list, i));
        if (typeof c !== "number")
          return A.iae(c);
        hash = hash + c & 2147483647;
        hash = hash + (hash << 10 >>> 0) & 2147483647;
        hash ^= hash >>> 6;
      }
      hash = hash + (hash << 3 >>> 0) & 2147483647;
      hash ^= hash >>> 11;
      return hash + (hash << 15 >>> 0) & 2147483647;
    },
    $isEquality: 1
  };
  A._UnorderedEquality.prototype = {
    equals$2(elements1, elements2) {
      var counts, $length, e, count,
        t1 = A._instanceType(this),
        t2 = t1._eval$1("_UnorderedEquality.T");
      t2._as(elements1);
      t2._as(elements2);
      if (elements1 === elements2)
        return true;
      t2 = this._elementEquality;
      counts = A.HashMap_HashMap(t1._eval$1("bool(_UnorderedEquality.E,_UnorderedEquality.E)")._as(t2.get$equals()), t1._eval$1("int(_UnorderedEquality.E)")._as(t2.get$hash(t2)), t2.get$isValidKey(), t1._eval$1("_UnorderedEquality.E"), type$.dynamic);
      for (t1 = J.get$iterator$ax(elements1), $length = 0; t1.moveNext$0();) {
        e = t1.get$current(t1);
        count = counts.$index(0, e);
        counts.$indexSet(0, e, J.$add$ansx(count == null ? 0 : count, 1));
        ++$length;
      }
      for (t1 = J.get$iterator$ax(elements2); t1.moveNext$0();) {
        e = t1.get$current(t1);
        count = counts.$index(0, e);
        if (count == null || J.$eq$(count, 0))
          return false;
        counts.$indexSet(0, e, J.$sub$n(count, 1));
        --$length;
      }
      return $length === 0;
    },
    hash$1(_, elements) {
      var t1, t2, hash, c;
      A._instanceType(this)._eval$1("_UnorderedEquality.T")._as(elements);
      for (t1 = J.get$iterator$ax(elements), t2 = this._elementEquality, hash = 0; t1.moveNext$0();) {
        c = t2.hash$1(0, t1.get$current(t1));
        if (typeof c !== "number")
          return A.iae(c);
        hash = hash + c & 2147483647;
      }
      hash = hash + (hash << 3 >>> 0) & 2147483647;
      hash ^= hash >>> 11;
      return hash + (hash << 15 >>> 0) & 2147483647;
    },
    $isEquality: 1
  };
  A.SetEquality.prototype = {};
  A._MapEntry.prototype = {
    get$hashCode(_) {
      var t1 = this.equality,
        t2 = t1._keyEquality.hash$1(0, this.key);
      if (typeof t2 !== "number")
        return A.iae(t2);
      t1 = t1._valueEquality.hash$1(0, this.value);
      if (typeof t1 !== "number")
        return A.iae(t1);
      return 3 * t2 + 7 * t1 & 2147483647;
    },
    $eq(_, other) {
      var t1;
      if (other == null)
        return false;
      if (other instanceof A._MapEntry) {
        t1 = this.equality;
        t1 = t1._keyEquality.equals$2(this.key, other.key) && t1._valueEquality.equals$2(this.value, other.value);
      } else
        t1 = false;
      return t1;
    }
  };
  A.MapEquality.prototype = {
    equals$2(map1, map2) {
      var t2, equalElementCounts, t3, key, entry, count,
        t1 = this.$ti._eval$1("Map<1,2>?");
      t1._as(map1);
      t1._as(map2);
      if (map1 === map2)
        return true;
      t1 = J.getInterceptor$asx(map1);
      t2 = J.getInterceptor$asx(map2);
      if (t1.get$length(map1) != t2.get$length(map2))
        return false;
      equalElementCounts = A.HashMap_HashMap(null, null, null, type$._MapEntry, type$.int);
      for (t3 = J.get$iterator$ax(t1.get$keys(map1)); t3.moveNext$0();) {
        key = t3.get$current(t3);
        entry = new A._MapEntry(this, key, t1.$index(map1, key));
        count = equalElementCounts.$index(0, entry);
        equalElementCounts.$indexSet(0, entry, (count == null ? 0 : count) + 1);
      }
      for (t1 = J.get$iterator$ax(t2.get$keys(map2)); t1.moveNext$0();) {
        key = t1.get$current(t1);
        entry = new A._MapEntry(this, key, t2.$index(map2, key));
        count = equalElementCounts.$index(0, entry);
        if (count == null || count === 0)
          return false;
        if (typeof count !== "number")
          return count.$sub();
        equalElementCounts.$indexSet(0, entry, count - 1);
      }
      return true;
    },
    hash$1(_, map) {
      var t1, t2, t3, t4, hash, key, keyHash, valueHash;
      this.$ti._eval$1("Map<1,2>?")._as(map);
      for (t1 = J.getInterceptor$x(map), t2 = J.get$iterator$ax(t1.get$keys(map)), t3 = this._keyEquality, t4 = this._valueEquality, hash = 0; t2.moveNext$0();) {
        key = t2.get$current(t2);
        keyHash = t3.hash$1(0, key);
        valueHash = t4.hash$1(0, t1.$index(map, key));
        if (typeof keyHash !== "number")
          return A.iae(keyHash);
        if (typeof valueHash !== "number")
          return A.iae(valueHash);
        hash = hash + 3 * keyHash + 7 * valueHash & 2147483647;
      }
      hash = hash + (hash << 3 >>> 0) & 2147483647;
      hash ^= hash >>> 11;
      return hash + (hash << 15 >>> 0) & 2147483647;
    },
    $isEquality: 1
  };
  A.DeepCollectionEquality.prototype = {
    equals$2(e1, e2) {
      var _this = this,
        t1 = type$.Set_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && new A.SetEquality(_this, type$.SetEquality_dynamic).equals$2(e1, e2);
      t1 = type$.Map_dynamic_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && new A.MapEquality(_this, _this, type$.MapEquality_dynamic_dynamic).equals$2(e1, e2);
      t1 = type$.List_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && new A.ListEquality(_this, type$.ListEquality_dynamic).equals$2(e1, e2);
      t1 = type$.Iterable_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && A.boolConversionCheck(new A.IterableEquality(_this, type$.IterableEquality_dynamic).equals$2(e1, e2));
      return J.$eq$(e1, e2);
    },
    hash$1(_, o) {
      var _this = this;
      if (type$.Set_dynamic._is(o))
        return new A.SetEquality(_this, type$.SetEquality_dynamic).hash$1(0, o);
      if (type$.Map_dynamic_dynamic._is(o))
        return new A.MapEquality(_this, _this, type$.MapEquality_dynamic_dynamic).hash$1(0, o);
      if (type$.List_dynamic._is(o))
        return new A.ListEquality(_this, type$.ListEquality_dynamic).hash$1(0, o);
      if (type$.Iterable_dynamic._is(o))
        return new A.IterableEquality(_this, type$.IterableEquality_dynamic).hash$1(0, o);
      return J.get$hashCode$(o);
    },
    isValidKey$1(o) {
      !type$.Iterable_dynamic._is(o);
      return true;
    },
    $isEquality: 1
  };
  A.BuildStatus.prototype = {};
  A.BuildResult.prototype = {};
  A._$BuildStatusSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      return type$.legacy_BuildStatus._as(object).name;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A._$valueOf(A._asStringS(serialized));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types() {
      return B.List_Type_BuildStatus_ahk;
    },
    get$wireName() {
      return "BuildStatus";
    }
  };
  A._$BuildResultSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      return A._setArrayType(["status", serializers.serialize$2$specifiedType(type$.legacy_BuildResult._as(object).status, B.FullType_FuN)], type$.JSArray_legacy_Object);
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, key, value, t2, $$v, _$result,
        result = new A.BuildResultBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (t1 = type$.legacy_BuildStatus; iterator.moveNext$0();) {
        key = A._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "status":
            t2 = t1._as(serializers.deserialize$2$specifiedType(value, B.FullType_FuN));
            $$v = result._build_result$_$v;
            if ($$v != null) {
              result._status = $$v.status;
              result._build_result$_$v = null;
            }
            result._status = t2;
            break;
        }
      }
      _$result = result._build_result$_$v;
      if (_$result == null) {
        t1 = result.get$_build_result$_$this()._status;
        if (t1 == null)
          A.throwExpression(A.BuiltValueNullFieldError$("BuildResult", "status"));
        _$result = new A._$BuildResult(t1);
      }
      return result._build_result$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_OHe;
    },
    get$wireName() {
      return "BuildResult";
    }
  };
  A._$BuildResult.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A.BuildResult && this.status === other.status;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(0, A.Primitives_objectHashCode(this.status)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("BuildResult"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "status", this.status);
      return t2.toString$0(t1);
    }
  };
  A.BuildResultBuilder.prototype = {
    get$_build_result$_$this() {
      var _this = this,
        $$v = _this._build_result$_$v;
      if ($$v != null) {
        _this._status = $$v.status;
        _this._build_result$_$v = null;
      }
      return _this;
    }
  };
  A.ConnectRequest.prototype = {};
  A._$ConnectRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.legacy_ConnectRequest._as(object);
      return A._setArrayType(["appId", serializers.serialize$2$specifiedType(object.appId, B.FullType_h8g), "instanceId", serializers.serialize$2$specifiedType(object.instanceId, B.FullType_h8g), "entrypointPath", serializers.serialize$2$specifiedType(object.entrypointPath, B.FullType_h8g)], type$.JSArray_legacy_Object);
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var key, value, t1,
        result = new A.ConnectRequestBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        key = A._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "appId":
            t1 = A._asStringS(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._appId = t1;
            break;
          case "instanceId":
            t1 = A._asStringS(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._instanceId = t1;
            break;
          case "entrypointPath":
            t1 = A._asStringS(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._entrypointPath = t1;
            break;
        }
      }
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_ssp;
    },
    get$wireName() {
      return "ConnectRequest";
    }
  };
  A._$ConnectRequest.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A.ConnectRequest && _this.appId === other.appId && _this.instanceId === other.instanceId && _this.entrypointPath === other.entrypointPath;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.appId)), B.JSString_methods.get$hashCode(this.instanceId)), B.JSString_methods.get$hashCode(this.entrypointPath)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("ConnectRequest"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "appId", this.appId);
      t2.add$2(t1, "instanceId", this.instanceId);
      t2.add$2(t1, "entrypointPath", this.entrypointPath);
      return t2.toString$0(t1);
    }
  };
  A.ConnectRequestBuilder.prototype = {
    get$_$this() {
      var _this = this,
        $$v = _this._$v;
      if ($$v != null) {
        _this._appId = $$v.appId;
        _this._instanceId = $$v.instanceId;
        _this._entrypointPath = $$v.entrypointPath;
        _this._$v = null;
      }
      return _this;
    },
    build$0() {
      var t1, t2, t3, _this = this,
        _s14_ = "ConnectRequest",
        _$result = _this._$v;
      if (_$result == null) {
        t1 = _this.get$_$this()._appId;
        if (t1 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s14_, "appId"));
        t2 = _this.get$_$this()._instanceId;
        if (t2 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s14_, "instanceId"));
        t3 = _this.get$_$this()._entrypointPath;
        if (t3 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s14_, "entrypointPath"));
        _$result = new A._$ConnectRequest(t1, t2, t3);
      }
      return _this._$v = _$result;
    }
  };
  A.DebugEvent.prototype = {};
  A._$DebugEventSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.legacy_DebugEvent._as(object);
      return A._setArrayType(["kind", serializers.serialize$2$specifiedType(object.kind, B.FullType_h8g), "eventData", serializers.serialize$2$specifiedType(object.eventData, B.FullType_h8g), "timestamp", serializers.serialize$2$specifiedType(object.timestamp, B.FullType_kjq)], type$.JSArray_legacy_Object);
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var key, value, t1,
        result = new A.DebugEventBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        key = A._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "kind":
            t1 = A._asStringS(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_debug_event$_$this()._debug_event$_kind = t1;
            break;
          case "eventData":
            t1 = A._asStringS(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_debug_event$_$this()._eventData = t1;
            break;
          case "timestamp":
            t1 = A._asIntS(serializers.deserialize$2$specifiedType(value, B.FullType_kjq));
            result.get$_debug_event$_$this()._timestamp = t1;
            break;
        }
      }
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_Cpu;
    },
    get$wireName() {
      return "DebugEvent";
    }
  };
  A._$DebugEvent.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A.DebugEvent && _this.kind === other.kind && _this.eventData === other.eventData && _this.timestamp === other.timestamp;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.kind)), B.JSString_methods.get$hashCode(this.eventData)), B.JSInt_methods.get$hashCode(this.timestamp)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("DebugEvent"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "kind", this.kind);
      t2.add$2(t1, "eventData", this.eventData);
      t2.add$2(t1, "timestamp", this.timestamp);
      return t2.toString$0(t1);
    }
  };
  A.DebugEventBuilder.prototype = {
    get$_debug_event$_$this() {
      var _this = this,
        $$v = _this._debug_event$_$v;
      if ($$v != null) {
        _this._debug_event$_kind = $$v.kind;
        _this._eventData = $$v.eventData;
        _this._timestamp = $$v.timestamp;
        _this._debug_event$_$v = null;
      }
      return _this;
    },
    build$0() {
      var t1, t2, t3, _this = this,
        _s10_ = "DebugEvent",
        _$result = _this._debug_event$_$v;
      if (_$result == null) {
        t1 = _this.get$_debug_event$_$this()._debug_event$_kind;
        if (t1 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s10_, "kind"));
        t2 = _this.get$_debug_event$_$this()._eventData;
        if (t2 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s10_, "eventData"));
        t3 = _this.get$_debug_event$_$this()._timestamp;
        if (t3 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s10_, "timestamp"));
        _$result = new A._$DebugEvent(t1, t2, t3);
      }
      return _this._debug_event$_$v = _$result;
    }
  };
  A.DevToolsRequest.prototype = {};
  A.DevToolsResponse.prototype = {};
  A._$DevToolsRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.legacy_DevToolsRequest._as(object);
      result = A._setArrayType(["appId", serializers.serialize$2$specifiedType(object.appId, B.FullType_h8g), "instanceId", serializers.serialize$2$specifiedType(object.instanceId, B.FullType_h8g)], type$.JSArray_legacy_Object);
      value = object.contextId;
      if (value != null) {
        B.JSArray_methods.add$1(result, "contextId");
        B.JSArray_methods.add$1(result, serializers.serialize$2$specifiedType(value, B.FullType_kjq));
      }
      value = object.tabUrl;
      if (value != null) {
        B.JSArray_methods.add$1(result, "tabUrl");
        B.JSArray_methods.add$1(result, serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var key, value, t1,
        result = new A.DevToolsRequestBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        key = A._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "appId":
            t1 = A._asStringS(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_devtools_request$_$this()._devtools_request$_appId = t1;
            break;
          case "instanceId":
            t1 = A._asStringS(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_devtools_request$_$this()._devtools_request$_instanceId = t1;
            break;
          case "contextId":
            t1 = A._asIntS(serializers.deserialize$2$specifiedType(value, B.FullType_kjq));
            result.get$_devtools_request$_$this()._contextId = t1;
            break;
          case "tabUrl":
            t1 = A._asStringS(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_devtools_request$_$this()._tabUrl = t1;
            break;
        }
      }
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_BCG;
    },
    get$wireName() {
      return "DevToolsRequest";
    }
  };
  A._$DevToolsResponseSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.legacy_DevToolsResponse._as(object);
      result = A._setArrayType(["success", serializers.serialize$2$specifiedType(object.success, B.FullType_MtR), "promptExtension", serializers.serialize$2$specifiedType(object.promptExtension, B.FullType_MtR)], type$.JSArray_legacy_Object);
      value = object.error;
      if (value != null) {
        B.JSArray_methods.add$1(result, "error");
        B.JSArray_methods.add$1(result, serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var key, value, t1, _$result, t2,
        _s16_ = "DevToolsResponse",
        result = new A.DevToolsResponseBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        key = A._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "success":
            t1 = A._asBoolS(serializers.deserialize$2$specifiedType(value, B.FullType_MtR));
            result.get$_devtools_request$_$this()._success = t1;
            break;
          case "promptExtension":
            t1 = A._asBoolS(serializers.deserialize$2$specifiedType(value, B.FullType_MtR));
            result.get$_devtools_request$_$this()._promptExtension = t1;
            break;
          case "error":
            t1 = A._asStringS(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_devtools_request$_$this()._error = t1;
            break;
        }
      }
      _$result = result._devtools_request$_$v;
      if (_$result == null) {
        t1 = result.get$_devtools_request$_$this()._success;
        if (t1 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s16_, "success"));
        t2 = result.get$_devtools_request$_$this()._promptExtension;
        if (t2 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s16_, "promptExtension"));
        _$result = new A._$DevToolsResponse(t1, t2, result.get$_devtools_request$_$this()._error);
      }
      return result._devtools_request$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_41A;
    },
    get$wireName() {
      return "DevToolsResponse";
    }
  };
  A._$DevToolsRequest.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A.DevToolsRequest && _this.appId === other.appId && _this.instanceId === other.instanceId && _this.contextId == other.contextId && _this.tabUrl == other.tabUrl;
    },
    get$hashCode(_) {
      var _this = this;
      return A.$jf(A.$jc(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(_this.appId)), B.JSString_methods.get$hashCode(_this.instanceId)), J.get$hashCode$(_this.contextId)), J.get$hashCode$(_this.tabUrl)));
    },
    toString$0(_) {
      var _this = this,
        t1 = $.$get$newBuiltValueToStringHelper().call$1("DevToolsRequest"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "appId", _this.appId);
      t2.add$2(t1, "instanceId", _this.instanceId);
      t2.add$2(t1, "contextId", _this.contextId);
      t2.add$2(t1, "tabUrl", _this.tabUrl);
      return t2.toString$0(t1);
    }
  };
  A.DevToolsRequestBuilder.prototype = {
    get$_devtools_request$_$this() {
      var _this = this,
        $$v = _this._devtools_request$_$v;
      if ($$v != null) {
        _this._devtools_request$_appId = $$v.appId;
        _this._devtools_request$_instanceId = $$v.instanceId;
        _this._contextId = $$v.contextId;
        _this._tabUrl = $$v.tabUrl;
        _this._devtools_request$_$v = null;
      }
      return _this;
    },
    build$0() {
      var t1, t2, _this = this,
        _s15_ = "DevToolsRequest",
        _$result = _this._devtools_request$_$v;
      if (_$result == null) {
        t1 = _this.get$_devtools_request$_$this()._devtools_request$_appId;
        if (t1 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s15_, "appId"));
        t2 = _this.get$_devtools_request$_$this()._devtools_request$_instanceId;
        if (t2 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s15_, "instanceId"));
        _$result = new A._$DevToolsRequest(t1, t2, _this.get$_devtools_request$_$this()._contextId, _this.get$_devtools_request$_$this()._tabUrl);
      }
      return _this._devtools_request$_$v = _$result;
    }
  };
  A._$DevToolsResponse.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A.DevToolsResponse && _this.success === other.success && _this.promptExtension === other.promptExtension && _this.error == other.error;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSBool_methods.get$hashCode(this.success)), B.JSBool_methods.get$hashCode(this.promptExtension)), J.get$hashCode$(this.error)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("DevToolsResponse"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "success", this.success);
      t2.add$2(t1, "promptExtension", this.promptExtension);
      t2.add$2(t1, "error", this.error);
      return t2.toString$0(t1);
    }
  };
  A.DevToolsResponseBuilder.prototype = {
    get$_devtools_request$_$this() {
      var _this = this,
        $$v = _this._devtools_request$_$v;
      if ($$v != null) {
        _this._success = $$v.success;
        _this._promptExtension = $$v.promptExtension;
        _this._error = $$v.error;
        _this._devtools_request$_$v = null;
      }
      return _this;
    }
  };
  A.ErrorResponse.prototype = {};
  A._$ErrorResponseSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.legacy_ErrorResponse._as(object);
      return A._setArrayType(["error", serializers.serialize$2$specifiedType(object.error, B.FullType_h8g), "stackTrace", serializers.serialize$2$specifiedType(object.stackTrace, B.FullType_h8g)], type$.JSArray_legacy_Object);
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var key, value, t1, $$v, _$result, t2,
        _s13_ = "ErrorResponse",
        result = new A.ErrorResponseBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        key = A._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "error":
            t1 = A._asStringS(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            $$v = result._error_response$_$v;
            if ($$v != null) {
              result._error_response$_error = $$v.error;
              result._error_response$_stackTrace = $$v.stackTrace;
              result._error_response$_$v = null;
            }
            result._error_response$_error = t1;
            break;
          case "stackTrace":
            t1 = A._asStringS(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            $$v = result._error_response$_$v;
            if ($$v != null) {
              result._error_response$_error = $$v.error;
              result._error_response$_stackTrace = $$v.stackTrace;
              result._error_response$_$v = null;
            }
            result._error_response$_stackTrace = t1;
            break;
        }
      }
      _$result = result._error_response$_$v;
      if (_$result == null) {
        t1 = result.get$_error_response$_$this()._error_response$_error;
        if (t1 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s13_, "error"));
        t2 = result.get$_error_response$_$this()._error_response$_stackTrace;
        if (t2 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s13_, "stackTrace"));
        _$result = new A._$ErrorResponse(t1, t2);
      }
      return result._error_response$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_gQA;
    },
    get$wireName() {
      return "ErrorResponse";
    }
  };
  A._$ErrorResponse.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A.ErrorResponse && this.error === other.error && this.stackTrace === other.stackTrace;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.error)), B.JSString_methods.get$hashCode(this.stackTrace)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("ErrorResponse"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "error", this.error);
      t2.add$2(t1, "stackTrace", this.stackTrace);
      return t2.toString$0(t1);
    }
  };
  A.ErrorResponseBuilder.prototype = {
    get$_error_response$_$this() {
      var _this = this,
        $$v = _this._error_response$_$v;
      if ($$v != null) {
        _this._error_response$_error = $$v.error;
        _this._error_response$_stackTrace = $$v.stackTrace;
        _this._error_response$_$v = null;
      }
      return _this;
    }
  };
  A.ExtensionRequest.prototype = {};
  A.ExtensionResponse.prototype = {};
  A.ExtensionEvent.prototype = {};
  A.BatchedEvents.prototype = {};
  A._$ExtensionRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.legacy_ExtensionRequest._as(object);
      result = A._setArrayType(["id", serializers.serialize$2$specifiedType(object.id, B.FullType_kjq), "command", serializers.serialize$2$specifiedType(object.command, B.FullType_h8g)], type$.JSArray_legacy_Object);
      value = object.commandParams;
      if (value != null) {
        B.JSArray_methods.add$1(result, "commandParams");
        B.JSArray_methods.add$1(result, serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var key, value, t1, _$result, t2,
        _s16_ = "ExtensionRequest",
        result = new A.ExtensionRequestBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        key = A._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "id":
            t1 = A._asIntS(serializers.deserialize$2$specifiedType(value, B.FullType_kjq));
            result.get$_extension_request$_$this()._id = t1;
            break;
          case "command":
            t1 = A._asStringS(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_extension_request$_$this()._command = t1;
            break;
          case "commandParams":
            t1 = A._asStringS(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_extension_request$_$this()._commandParams = t1;
            break;
        }
      }
      _$result = result._extension_request$_$v;
      if (_$result == null) {
        t1 = result.get$_extension_request$_$this()._id;
        if (t1 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s16_, "id"));
        t2 = result.get$_extension_request$_$this()._command;
        if (t2 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s16_, "command"));
        _$result = new A._$ExtensionRequest(t1, t2, result.get$_extension_request$_$this()._commandParams);
      }
      return result._extension_request$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_evd;
    },
    get$wireName() {
      return "ExtensionRequest";
    }
  };
  A._$ExtensionResponseSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.legacy_ExtensionResponse._as(object);
      result = A._setArrayType(["id", serializers.serialize$2$specifiedType(object.id, B.FullType_kjq), "success", serializers.serialize$2$specifiedType(object.success, B.FullType_MtR), "result", serializers.serialize$2$specifiedType(object.result, B.FullType_h8g)], type$.JSArray_legacy_Object);
      value = object.error;
      if (value != null) {
        B.JSArray_methods.add$1(result, "error");
        B.JSArray_methods.add$1(result, serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var key, value, t1, _$result, t2, t3,
        _s17_ = "ExtensionResponse",
        result = new A.ExtensionResponseBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        key = A._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "id":
            t1 = A._asIntS(serializers.deserialize$2$specifiedType(value, B.FullType_kjq));
            result.get$_extension_request$_$this()._id = t1;
            break;
          case "success":
            t1 = A._asBoolS(serializers.deserialize$2$specifiedType(value, B.FullType_MtR));
            result.get$_extension_request$_$this()._extension_request$_success = t1;
            break;
          case "result":
            t1 = A._asStringS(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_extension_request$_$this()._extension_request$_result = t1;
            break;
          case "error":
            t1 = A._asStringS(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_extension_request$_$this()._extension_request$_error = t1;
            break;
        }
      }
      _$result = result._extension_request$_$v;
      if (_$result == null) {
        t1 = result.get$_extension_request$_$this()._id;
        if (t1 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s17_, "id"));
        t2 = result.get$_extension_request$_$this()._extension_request$_success;
        if (t2 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s17_, "success"));
        t3 = result.get$_extension_request$_$this()._extension_request$_result;
        if (t3 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s17_, "result"));
        _$result = new A._$ExtensionResponse(t1, t2, t3, result.get$_extension_request$_$this()._extension_request$_error);
      }
      return result._extension_request$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_tQ0;
    },
    get$wireName() {
      return "ExtensionResponse";
    }
  };
  A._$ExtensionEventSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.legacy_ExtensionEvent._as(object);
      return A._setArrayType(["params", serializers.serialize$2$specifiedType(object.params, B.FullType_h8g), "method", serializers.serialize$2$specifiedType(object.method, B.FullType_h8g)], type$.JSArray_legacy_Object);
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var key, value, t1, $$v, _$result, t2,
        _s14_ = "ExtensionEvent",
        result = new A.ExtensionEventBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        key = A._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "params":
            t1 = A._asStringS(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            $$v = result._extension_request$_$v;
            if ($$v != null) {
              result._params = $$v.params;
              result._extension_request$_method = $$v.method;
              result._extension_request$_$v = null;
            }
            result._params = t1;
            break;
          case "method":
            t1 = A._asStringS(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            $$v = result._extension_request$_$v;
            if ($$v != null) {
              result._params = $$v.params;
              result._extension_request$_method = $$v.method;
              result._extension_request$_$v = null;
            }
            result._extension_request$_method = t1;
            break;
        }
      }
      _$result = result._extension_request$_$v;
      if (_$result == null) {
        t1 = result.get$_extension_request$_$this()._params;
        if (t1 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s14_, "params"));
        t2 = result.get$_extension_request$_$this()._extension_request$_method;
        if (t2 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s14_, "method"));
        _$result = new A._$ExtensionEvent(t1, t2);
      }
      return result._extension_request$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_pnF;
    },
    get$wireName() {
      return "ExtensionEvent";
    }
  };
  A._$BatchedEventsSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      return A._setArrayType(["events", serializers.serialize$2$specifiedType(type$.legacy_BatchedEvents._as(object).events, B.FullType_w24)], type$.JSArray_legacy_Object);
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, t2, t3, t4, key, value, $$v, t5, t6, t7, t8, t9,
        result = new A.BatchedEventsBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (t1 = type$.legacy_BuiltList_legacy_Object, t2 = type$.legacy_ExtensionEvent, t3 = type$.List_legacy_ExtensionEvent, t4 = type$.ListBuilder_legacy_ExtensionEvent; iterator.moveNext$0();) {
        key = A._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "events":
            $$v = result._extension_request$_$v;
            if ($$v != null) {
              t5 = $$v.events;
              t5.toString;
              t6 = t5.$ti;
              t7 = new A.ListBuilder(t6._eval$1("ListBuilder<1>"));
              t8 = t6._eval$1("_BuiltList<1>");
              t9 = t6._eval$1("List<1>");
              if (t8._is(t5)) {
                t8._as(t5);
                t7.set$__ListBuilder__list(t9._as(t5._list));
                t7.set$_listOwner(t5);
              } else {
                t7.set$__ListBuilder__list(t9._as(A.List_List$from(t5, true, t6._precomputed1)));
                t7.set$_listOwner(null);
              }
              result.set$_events(t7);
              result._extension_request$_$v = null;
            }
            t5 = result._events;
            if (t5 == null) {
              t5 = new A.ListBuilder(t4);
              t5.set$__ListBuilder__list(t3._as(A.List_List$from(B.List_empty0, true, t2)));
              t5.set$_listOwner(null);
              result.set$_events(t5);
            }
            t6 = t1._as(serializers.deserialize$2$specifiedType(value, B.FullType_w24));
            t7 = t5.$ti;
            t8 = t7._eval$1("_BuiltList<1>");
            t9 = t7._eval$1("List<1>");
            if (t8._is(t6)) {
              t8._as(t6);
              t5.set$__ListBuilder__list(t9._as(t6._list));
              t5.set$_listOwner(t6);
            } else {
              t5.set$__ListBuilder__list(t9._as(A.List_List$from(t6, true, t7._precomputed1)));
              t5.set$_listOwner(null);
            }
            break;
        }
      }
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_w8N;
    },
    get$wireName() {
      return "BatchedEvents";
    }
  };
  A._$ExtensionRequest.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A.ExtensionRequest && _this.id === other.id && _this.command === other.command && _this.commandParams == other.commandParams;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSInt_methods.get$hashCode(this.id)), B.JSString_methods.get$hashCode(this.command)), J.get$hashCode$(this.commandParams)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("ExtensionRequest"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "id", this.id);
      t2.add$2(t1, "command", this.command);
      t2.add$2(t1, "commandParams", this.commandParams);
      return t2.toString$0(t1);
    }
  };
  A.ExtensionRequestBuilder.prototype = {
    get$_extension_request$_$this() {
      var _this = this,
        $$v = _this._extension_request$_$v;
      if ($$v != null) {
        _this._id = $$v.id;
        _this._command = $$v.command;
        _this._commandParams = $$v.commandParams;
        _this._extension_request$_$v = null;
      }
      return _this;
    }
  };
  A._$ExtensionResponse.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A.ExtensionResponse && _this.id === other.id && _this.success === other.success && _this.result === other.result && _this.error == other.error;
    },
    get$hashCode(_) {
      var _this = this;
      return A.$jf(A.$jc(A.$jc(A.$jc(A.$jc(0, B.JSInt_methods.get$hashCode(_this.id)), B.JSBool_methods.get$hashCode(_this.success)), B.JSString_methods.get$hashCode(_this.result)), J.get$hashCode$(_this.error)));
    },
    toString$0(_) {
      var _this = this,
        t1 = $.$get$newBuiltValueToStringHelper().call$1("ExtensionResponse"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "id", _this.id);
      t2.add$2(t1, "success", _this.success);
      t2.add$2(t1, "result", _this.result);
      t2.add$2(t1, "error", _this.error);
      return t2.toString$0(t1);
    }
  };
  A.ExtensionResponseBuilder.prototype = {
    get$_extension_request$_$this() {
      var _this = this,
        $$v = _this._extension_request$_$v;
      if ($$v != null) {
        _this._id = $$v.id;
        _this._extension_request$_success = $$v.success;
        _this._extension_request$_result = $$v.result;
        _this._extension_request$_error = $$v.error;
        _this._extension_request$_$v = null;
      }
      return _this;
    }
  };
  A._$ExtensionEvent.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A.ExtensionEvent && this.params === other.params && this.method === other.method;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.params)), B.JSString_methods.get$hashCode(this.method)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("ExtensionEvent"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "params", this.params);
      t2.add$2(t1, "method", this.method);
      return t2.toString$0(t1);
    }
  };
  A.ExtensionEventBuilder.prototype = {
    get$_extension_request$_$this() {
      var _this = this,
        $$v = _this._extension_request$_$v;
      if ($$v != null) {
        _this._params = $$v.params;
        _this._extension_request$_method = $$v.method;
        _this._extension_request$_$v = null;
      }
      return _this;
    }
  };
  A._$BatchedEvents.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A.BatchedEvents && J.$eq$(this.events, other.events);
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(0, J.get$hashCode$(this.events)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("BatchedEvents"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "events", this.events);
      return t2.toString$0(t1);
    }
  };
  A.BatchedEventsBuilder.prototype = {
    get$events() {
      var t1, _this = this,
        $$v = _this._extension_request$_$v;
      if ($$v != null) {
        t1 = $$v.events;
        t1.toString;
        _this.set$_events(A.ListBuilder_ListBuilder(t1, t1.$ti._precomputed1));
        _this._extension_request$_$v = null;
      }
      t1 = _this._events;
      if (t1 == null) {
        t1 = A.ListBuilder_ListBuilder(B.List_empty0, type$.legacy_ExtensionEvent);
        _this.set$_events(t1);
      }
      return t1;
    },
    build$0() {
      var _$failedField, e, _$result0, t1, exception, t2, _this = this,
        _s13_ = "BatchedEvents",
        _$result = null;
      try {
        _$result0 = _this._extension_request$_$v;
        if (_$result0 == null) {
          t1 = _this.get$events().build$0();
          _$result0 = new A._$BatchedEvents(t1);
          if (t1 == null)
            A.throwExpression(A.BuiltValueNullFieldError$(_s13_, "events"));
        }
        _$result = _$result0;
      } catch (exception) {
        _$failedField = null;
        try {
          _$failedField = "events";
          _this.get$events().build$0();
        } catch (exception) {
          e = A.unwrapException(exception);
          t1 = _$failedField;
          t2 = J.toString$0$(e);
          throw A.wrapException(new A.BuiltValueNestedFieldError(_s13_, t1, t2));
        }
        throw exception;
      }
      t1 = type$.legacy_BatchedEvents._as(_$result);
      if (t1 == null)
        A.throwExpression(A.ArgumentError$notNull("other"));
      _this._extension_request$_$v = t1;
      return _$result;
    },
    set$_events(_events) {
      this._events = type$.legacy_ListBuilder_legacy_ExtensionEvent._as(_events);
    }
  };
  A.IsolateExit.prototype = {};
  A.IsolateStart.prototype = {};
  A._$IsolateExitSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.legacy_IsolateExit._as(object);
      return A._setArrayType([], type$.JSArray_legacy_Object);
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      type$.legacy_Iterable_legacy_Object._as(serialized);
      return new A.IsolateExitBuilder().build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_LT1;
    },
    get$wireName() {
      return "IsolateExit";
    }
  };
  A._$IsolateStartSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.legacy_IsolateStart._as(object);
      return A._setArrayType([], type$.JSArray_legacy_Object);
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      type$.legacy_Iterable_legacy_Object._as(serialized);
      return new A.IsolateStartBuilder().build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_6TA;
    },
    get$wireName() {
      return "IsolateStart";
    }
  };
  A._$IsolateExit.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A.IsolateExit;
    },
    get$hashCode(_) {
      return 814065794;
    },
    toString$0(_) {
      return J.toString$0$($.$get$newBuiltValueToStringHelper().call$1("IsolateExit"));
    }
  };
  A.IsolateExitBuilder.prototype = {
    build$0() {
      var _$result = this._isolate_events$_$v;
      if (_$result == null)
        _$result = new A._$IsolateExit();
      return this._isolate_events$_$v = _$result;
    }
  };
  A._$IsolateStart.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A.IsolateStart;
    },
    get$hashCode(_) {
      return 97463111;
    },
    toString$0(_) {
      return J.toString$0$($.$get$newBuiltValueToStringHelper().call$1("IsolateStart"));
    }
  };
  A.IsolateStartBuilder.prototype = {
    build$0() {
      var _$result = this._isolate_events$_$v;
      if (_$result == null)
        _$result = new A._$IsolateStart();
      return this._isolate_events$_$v = _$result;
    }
  };
  A.RegisterEvent.prototype = {};
  A._$RegisterEventSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.legacy_RegisterEvent._as(object);
      return A._setArrayType(["eventData", serializers.serialize$2$specifiedType(object.eventData, B.FullType_h8g), "timestamp", serializers.serialize$2$specifiedType(object.timestamp, B.FullType_kjq)], type$.JSArray_legacy_Object);
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var key, value, t1, $$v,
        result = new A.RegisterEventBuilder(),
        iterator = J.get$iterator$ax(type$.legacy_Iterable_legacy_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        key = A._asStringS(iterator.get$current(iterator));
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (key) {
          case "eventData":
            t1 = A._asStringS(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            $$v = result._register_event$_$v;
            if ($$v != null) {
              result._register_event$_eventData = $$v.eventData;
              result._register_event$_timestamp = $$v.timestamp;
              result._register_event$_$v = null;
            }
            result._register_event$_eventData = t1;
            break;
          case "timestamp":
            t1 = A._asIntS(serializers.deserialize$2$specifiedType(value, B.FullType_kjq));
            $$v = result._register_event$_$v;
            if ($$v != null) {
              result._register_event$_eventData = $$v.eventData;
              result._register_event$_timestamp = $$v.timestamp;
              result._register_event$_$v = null;
            }
            result._register_event$_timestamp = t1;
            break;
        }
      }
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_42K;
    },
    get$wireName() {
      return "RegisterEvent";
    }
  };
  A._$RegisterEvent.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A.RegisterEvent && this.eventData === other.eventData && this.timestamp === other.timestamp;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.eventData)), B.JSInt_methods.get$hashCode(this.timestamp)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("RegisterEvent"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "eventData", this.eventData);
      t2.add$2(t1, "timestamp", this.timestamp);
      return t2.toString$0(t1);
    }
  };
  A.RegisterEventBuilder.prototype = {
    get$_register_event$_$this() {
      var _this = this,
        $$v = _this._register_event$_$v;
      if ($$v != null) {
        _this._register_event$_eventData = $$v.eventData;
        _this._register_event$_timestamp = $$v.timestamp;
        _this._register_event$_$v = null;
      }
      return _this;
    },
    build$0() {
      var t1, t2, _this = this,
        _s13_ = "RegisterEvent",
        _$result = _this._register_event$_$v;
      if (_$result == null) {
        t1 = _this.get$_register_event$_$this()._register_event$_eventData;
        if (t1 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s13_, "eventData"));
        t2 = _this.get$_register_event$_$this()._register_event$_timestamp;
        if (t2 == null)
          A.throwExpression(A.BuiltValueNullFieldError$(_s13_, "timestamp"));
        _$result = new A._$RegisterEvent(t1, t2);
      }
      return _this._register_event$_$v = _$result;
    }
  };
  A.RunRequest.prototype = {};
  A._$RunRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.legacy_RunRequest._as(object);
      return A._setArrayType([], type$.JSArray_legacy_Object);
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      type$.legacy_Iterable_legacy_Object._as(serialized);
      return new A._$RunRequest();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_wsa;
    },
    get$wireName() {
      return "RunRequest";
    }
  };
  A._$RunRequest.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A.RunRequest;
    },
    get$hashCode(_) {
      return 248087772;
    },
    toString$0(_) {
      return J.toString$0$($.$get$newBuiltValueToStringHelper().call$1("RunRequest"));
    }
  };
  A._$serializers_closure.prototype = {
    call$0() {
      return A.ListBuilder_ListBuilder(B.List_empty0, type$.legacy_ExtensionEvent);
    },
    $signature: 56
  };
  A.SocketClient.prototype = {};
  A.SseSocketClient.prototype = {
    get$sink() {
      var t1 = this._sockets$_client._outgoingController;
      return new A._StreamSinkWrapper(t1, A._instanceType(t1)._eval$1("_StreamSinkWrapper<1>"));
    },
    get$stream(_) {
      var t1 = this._sockets$_client._incomingController;
      return new A._ControllerStream(t1, A._instanceType(t1)._eval$1("_ControllerStream<1>"));
    }
  };
  A.WebSocketClient.prototype = {
    get$sink() {
      var t2,
        t1 = this._channel,
        value = t1.__HtmlWebSocketChannel_sink;
      if (value === $) {
        t2 = A._lateReadCheck(A._lateReadCheck(t1._html$_controller.__StreamChannelController__foreign, "_foreign").__GuaranteeChannel__sink, "_sink");
        A._lateInitializeOnceCheck(t1.__HtmlWebSocketChannel_sink, "sink");
        value = t1.__HtmlWebSocketChannel_sink = new A._HtmlWebSocketSink(t1, t2);
      }
      return value;
    },
    get$stream(_) {
      var t1 = A._lateReadCheck(A._lateReadCheck(this._channel._html$_controller.__StreamChannelController__foreign, "_foreign").__GuaranteeChannel__streamController, "_streamController"),
        t2 = A._instanceType(t1)._eval$1("_ControllerStream<1>");
      return new A._MapStream(t2._eval$1("String*(Stream.T)")._as(new A.WebSocketClient_stream_closure()), new A._ControllerStream(t1, t2), t2._eval$1("_MapStream<Stream.T,String*>"));
    }
  };
  A.WebSocketClient_stream_closure.prototype = {
    call$1(o) {
      return o == null ? null : J.toString$0$(o);
    },
    $signature: 57
  };
  A.Int64.prototype = {
    $add(_, other) {
      var o = A.Int64__promote(other),
        sum0 = this._l + o._l,
        sum1 = this._m + o._m + (sum0 >>> 22);
      return new A.Int64(sum0 & 4194303, sum1 & 4194303, this._h + o._h + (sum1 >>> 22) & 1048575);
    },
    $sub(_, other) {
      var o = A.Int64__promote(other);
      return A.Int64__sub(this._l, this._m, this._h, o._l, o._m, o._h);
    },
    $eq(_, other) {
      var o, _this = this;
      if (other == null)
        return false;
      if (other instanceof A.Int64)
        o = other;
      else if (A._isInt(other)) {
        if (_this._h === 0 && _this._m === 0)
          return _this._l === other;
        if ((other & 4194303) === other)
          return false;
        o = A.Int64_Int64(other);
      } else
        o = null;
      if (o != null)
        return _this._l === o._l && _this._m === o._m && _this._h === o._h;
      return false;
    },
    compareTo$1(_, other) {
      return this._compareTo$1(other);
    },
    _compareTo$1(other) {
      var o = A.Int64__promote(other),
        t1 = this._h,
        signa = t1 >>> 19,
        t2 = o._h;
      if (signa !== t2 >>> 19)
        return signa === 0 ? 1 : -1;
      if (t1 > t2)
        return 1;
      else if (t1 < t2)
        return -1;
      t1 = this._m;
      t2 = o._m;
      if (t1 > t2)
        return 1;
      else if (t1 < t2)
        return -1;
      t1 = this._l;
      t2 = o._l;
      if (t1 > t2)
        return 1;
      else if (t1 < t2)
        return -1;
      return 0;
    },
    get$hashCode(_) {
      var t1 = this._m;
      return (((t1 & 1023) << 22 | this._l) ^ (this._h << 12 | t1 >>> 10 & 4095)) >>> 0;
    },
    toString$0(_) {
      var d00, d10, sign,
        d0 = this._l,
        d1 = this._m,
        d2 = this._h;
      if ((d2 & 524288) !== 0) {
        d0 = 0 - d0;
        d00 = d0 & 4194303;
        d1 = 0 - d1 - (B.JSInt_methods._shrOtherPositive$1(d0, 22) & 1);
        d10 = d1 & 4194303;
        d2 = 0 - d2 - (B.JSInt_methods._shrOtherPositive$1(d1, 22) & 1) & 1048575;
        d1 = d10;
        d0 = d00;
        sign = "-";
      } else
        sign = "";
      return A.Int64__toRadixStringUnsigned(10, d0, d1, d2, sign);
    },
    _toRadixString$1(radix) {
      var d00, d10, sign,
        d0 = this._l,
        d1 = this._m,
        d2 = this._h;
      if ((d2 & 524288) !== 0) {
        d0 = 0 - d0;
        d00 = d0 & 4194303;
        d1 = 0 - d1 - (B.JSInt_methods._shrOtherPositive$1(d0, 22) & 1);
        d10 = d1 & 4194303;
        d2 = 0 - d2 - (B.JSInt_methods._shrOtherPositive$1(d1, 22) & 1) & 1048575;
        d1 = d10;
        d0 = d00;
        sign = "-";
      } else
        sign = "";
      return A.Int64__toRadixStringUnsigned(radix, d0, d1, d2, sign);
    },
    $isComparable: 1
  };
  A.stronglyConnectedComponents_strongConnect.prototype = {
    call$1(node) {
      var t2, t3, lowLink, t4, t5, t6, next, t7, component, result, _this = this,
        t1 = _this.T;
      t1._as(node);
      t2 = _this.indexes;
      t3 = _this._box_0;
      t2.$indexSet(0, node, t3.index);
      lowLink = t3.index;
      t4 = _this.lowLinks;
      t4.$indexSet(0, node, lowLink);
      ++t3.index;
      t3 = _this.lastVisited;
      t3._collection$_add$1(0, t3.$ti._precomputed1._as(node));
      t5 = _this.onStack;
      t5.add$1(0, node);
      for (t6 = J.get$iterator$ax(_this.edges.call$1(node)); t6.moveNext$0();) {
        next = t6.get$current(t6);
        if (!t2.containsKey$1(0, next)) {
          _this.call$1(next);
          t7 = t4.$index(0, next);
          t7.toString;
          lowLink = Math.min(lowLink, A.checkNum(t7));
          t4.$indexSet(0, node, lowLink);
        } else if (t5.contains$1(0, next)) {
          t7 = t2.$index(0, next);
          t7.toString;
          lowLink = Math.min(lowLink, A.checkNum(t7));
          t4.$indexSet(0, node, lowLink);
        }
      }
      if (J.$eq$(t4.$index(0, node), t2.$index(0, node))) {
        component = A._setArrayType([], t1._eval$1("JSArray<0>"));
        t1 = _this.nonNullEquals;
        do {
          t2 = t3._head;
          t4 = t3._tail;
          if (t2 === t4)
            A.throwExpression(A.IterableElementError_noElement());
          ++t3._modificationCount;
          t2 = t3._table;
          t6 = t2.length;
          t4 = (t4 - 1 & t6 - 1) >>> 0;
          t3._tail = t4;
          if (!(t4 >= 0 && t4 < t6))
            return A.ioore(t2, t4);
          result = t2[t4];
          B.JSArray_methods.$indexSet(t2, t4, null);
          t5.remove$1(0, result);
          B.JSArray_methods.add$1(component, result);
        } while (!A.boolConversionCheck(t1.call$2(result, node)));
        B.JSArray_methods.add$1(_this.result, component);
      }
    },
    $signature() {
      return this.T._eval$1("~(0)");
    }
  };
  A.Level.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.Level && this.value === other.value;
    },
    compareTo$1(_, other) {
      return this.value - type$.Level._as(other).value;
    },
    get$hashCode(_) {
      return this.value;
    },
    toString$0(_) {
      return this.name;
    },
    $isComparable: 1
  };
  A.LogRecord.prototype = {
    toString$0(_) {
      return "[" + this.level.name + "] " + this.loggerName + ": " + this.message;
    }
  };
  A.Logger.prototype = {
    get$fullName() {
      var t1 = this.parent,
        t2 = t1 == null ? null : t1.name.length !== 0,
        t3 = this.name;
      return t2 === true ? t1.get$fullName() + "." + t3 : t3;
    },
    get$level(_) {
      var t1, effectiveLevel;
      if (this.parent == null) {
        t1 = this._level;
        t1.toString;
        effectiveLevel = t1;
      } else {
        t1 = $.$get$Logger_root()._level;
        t1.toString;
        effectiveLevel = t1;
      }
      return effectiveLevel;
    },
    log$4(logLevel, message, error, stackTrace) {
      var record, _this = this,
        t1 = logLevel.value;
      if (t1 >= _this.get$level(_this).value) {
        if (t1 >= 2000) {
          A.StackTrace_current();
          logLevel.toString$0(0);
        }
        t1 = _this.get$fullName();
        Date.now();
        $.LogRecord__nextNumber = $.LogRecord__nextNumber + 1;
        record = new A.LogRecord(logLevel, message, t1);
        if (_this.parent == null)
          _this._publish$1(record);
        else
          $.$get$Logger_root()._publish$1(record);
      }
    },
    _publish$1(record) {
      return null;
    }
  };
  A.Logger_Logger_closure.prototype = {
    call$0() {
      var dot, $parent, t1,
        thisName = this.name;
      if (B.JSString_methods.startsWith$1(thisName, "."))
        A.throwExpression(A.ArgumentError$("name shouldn't start with a '.'", null));
      dot = B.JSString_methods.lastIndexOf$1(thisName, ".");
      if (dot === -1)
        $parent = thisName !== "" ? A.Logger_Logger("") : null;
      else {
        $parent = A.Logger_Logger(B.JSString_methods.substring$2(thisName, 0, dot));
        thisName = B.JSString_methods.substring$1(thisName, dot + 1);
      }
      t1 = new A.Logger(thisName, $parent, A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.Logger));
      if ($parent == null)
        t1._level = B.Level_INFO_800;
      else
        $parent._children.$indexSet(0, thisName, t1);
      return t1;
    },
    $signature: 58
  };
  A.Pool.prototype = {
    request$0(_) {
      var t1, t2, _this = this;
      if ((_this._closeMemo._completer.future._state & 30) !== 0)
        throw A.wrapException(A.StateError$("request() may not be called on a closed Pool."));
      t1 = _this._allocatedResources;
      if (t1 < _this._maxAllocatedResources) {
        _this._allocatedResources = t1 + 1;
        return A.Future_Future$value(new A.PoolResource(_this), type$.PoolResource);
      } else {
        t1 = _this._onReleaseCallbacks;
        if (!t1.get$isEmpty(t1))
          return _this._runOnRelease$1(t1.removeFirst$0());
        else {
          t1 = new A._Future($.Zone__current, type$._Future_PoolResource);
          t2 = _this._requestedResources;
          t2._collection$_add$1(0, t2.$ti._precomputed1._as(new A._AsyncCompleter(t1, type$._AsyncCompleter_PoolResource)));
          _this._resetTimer$0();
          return t1;
        }
      }
    },
    withResource$1$1(callback, $T) {
      return this.withResource$body$Pool($T._eval$1("0/()")._as(callback), $T, $T);
    },
    withResource$body$Pool(callback, $T, $async$type) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter($async$type),
        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, resource, t1, t2;
      var $async$withResource$1$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$currentError = $async$result;
          $async$goto = $async$handler;
        }
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              if (($async$self._closeMemo._completer.future._state & 30) !== 0)
                throw A.wrapException(A.StateError$("withResource() may not be called on a closed Pool."));
              $async$goto = 3;
              return A._asyncAwait($async$self.request$0(0), $async$withResource$1$1);
            case 3:
              // returning from await.
              resource = $async$result;
              $async$handler = 4;
              $async$goto = 7;
              return A._asyncAwait(callback.call$0(), $async$withResource$1$1);
            case 7:
              // returning from await.
              t1 = $async$result;
              $async$returnValue = t1;
              $async$next = [1];
              // goto finally
              $async$goto = 5;
              break;
              $async$next.push(6);
              // goto finally
              $async$goto = 5;
              break;
            case 4:
              // uncaught
              $async$next = [2];
            case 5:
              // finally
              $async$handler = 2;
              t1 = resource;
              if (t1._released)
                A.throwExpression(A.StateError$("A PoolResource may only be released once."));
              t1._released = true;
              t1 = t1._pool;
              t1._resetTimer$0();
              t2 = t1._requestedResources;
              if (!t2.get$isEmpty(t2))
                t2.removeFirst$0().complete$1(0, new A.PoolResource(t1));
              else {
                t2 = --t1._allocatedResources;
                if ((t1._closeMemo._completer.future._state & 30) !== 0 && t2 === 0)
                  null.close$0(0);
              }
              // goto the next finally handler
              $async$goto = $async$next.pop();
              break;
            case 6:
              // after finally
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
            case 2:
              // rethrow
              return A._asyncRethrow($async$currentError, $async$completer);
          }
      });
      return A._asyncStartSync($async$withResource$1$1, $async$completer);
    },
    _runOnRelease$1(onRelease) {
      var t1, t2;
      A.Future_Future$sync(type$.dynamic_Function._as(onRelease), type$.dynamic).then$1$1(0, new A.Pool__runOnRelease_closure(this), type$.Null).catchError$1(new A.Pool__runOnRelease_closure0(this));
      t1 = new A._Future($.Zone__current, type$._Future_PoolResource);
      t2 = this._onReleaseCompleters;
      t2._collection$_add$1(0, t2.$ti._precomputed1._as(new A._SyncCompleter(t1, type$._SyncCompleter_PoolResource)));
      return t1;
    },
    _resetTimer$0() {
      var t2,
        t1 = this._timer;
      if (t1 == null)
        return;
      t2 = this._requestedResources;
      if (t2._head === t2._tail)
        t1._restartable_timer$_timer.cancel$0(0);
      else {
        t1._restartable_timer$_timer.cancel$0(0);
        t1._restartable_timer$_timer = A.Timer_Timer(t1._restartable_timer$_duration, t1._callback);
      }
    }
  };
  A.Pool__runOnRelease_closure.prototype = {
    call$1(value) {
      var t1 = this.$this;
      J.complete$1$z(t1._onReleaseCompleters.removeFirst$0(), new A.PoolResource(t1));
    },
    $signature: 7
  };
  A.Pool__runOnRelease_closure0.prototype = {
    call$2(error, stackTrace) {
      type$.StackTrace._as(stackTrace);
      this.$this._onReleaseCompleters.removeFirst$0().completeError$2(error, stackTrace);
    },
    $signature: 9
  };
  A.PoolResource.prototype = {};
  A.SseClient.prototype = {
    SseClient$1(serverUrl) {
      var t2, t3, t4, _this = this,
        _s12_ = "_eventSource",
        clientId = A.generateUuidV4(),
        t1 = A.EventSource__factoryEventSource(serverUrl + "?sseClientId=" + clientId, A.LinkedHashMap_LinkedHashMap$_literal(["withCredentials", true], type$.String, type$.dynamic));
      _this.__SseClient__eventSource = t1;
      _this.__SseClient__serverUrl = serverUrl + "?sseClientId=" + clientId;
      t1 = new A._EventStream(A._lateReadCheck(t1, _s12_), "open", false, type$._EventStream_legacy_Event);
      t1.get$first(t1).whenComplete$1(new A.SseClient_closure(_this));
      t1 = A._lateReadCheck(_this.__SseClient__eventSource, _s12_);
      (t1 && B.EventSource_methods).addEventListener$2(t1, "message", _this.get$_onIncomingMessage());
      t1 = A._lateReadCheck(_this.__SseClient__eventSource, _s12_);
      (t1 && B.EventSource_methods).addEventListener$2(t1, "control", _this.get$_onIncomingControlMessage());
      t1 = A._lateReadCheck(_this.__SseClient__eventSource, _s12_);
      t2 = type$.nullable_void_Function_legacy_Event;
      t3 = t2._as(new A.SseClient_closure0(_this));
      type$.nullable_void_Function._as(null);
      t4 = type$.legacy_Event;
      A._EventStreamSubscription$(t1, "open", t3, false, t4);
      A._EventStreamSubscription$(A._lateReadCheck(_this.__SseClient__eventSource, _s12_), "error", t2._as(new A.SseClient_closure1(_this)), false, t4);
    },
    close$0(_) {
      var t1, _this = this;
      A._lateReadCheck(_this.__SseClient__eventSource, "_eventSource").close();
      if ((_this._onConnected.future._state & 30) === 0) {
        t1 = _this._outgoingController;
        new A._ControllerStream(t1, A._instanceType(t1)._eval$1("_ControllerStream<1>")).listen$2$cancelOnError(null, true).asFuture$1$1(null, type$.dynamic);
      }
      _this._incomingController.close$0(0);
      _this._outgoingController.close$0(0);
    },
    _onIncomingControlMessage$1(message) {
      var data = new A._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.MessageEvent._as(type$.Event._as(message)).data, true);
      if (J.$eq$(data, "close"))
        this.close$0(0);
      else
        throw A.wrapException(A.UnsupportedError$('Illegal Control Message "' + A.S(data) + '"'));
    },
    _onIncomingMessage$1(message) {
      this._incomingController.add$1(0, A._asStringS(B.C_JsonCodec.decode$2$reviver(0, A._asStringS(new A._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.MessageEvent._as(type$.Event._as(message)).data, true)), null)));
    },
    _onOutgoingDone$0() {
      this.close$0(0);
    },
    _onOutgoingMessage$1(message) {
      return this._onOutgoingMessage$body$SseClient(A._asStringQ(message));
    },
    _onOutgoingMessage$body$SseClient(message) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.dynamic),
        $async$self = this, t1;
      var $async$_onOutgoingMessage$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = {};
              t1.encodedMessage = null;
              $async$goto = 2;
              return A._asyncAwait($.$get$_requestPool().withResource$1$1(new A.SseClient__onOutgoingMessage_closure(t1, $async$self, message), type$.Null), $async$_onOutgoingMessage$1);
            case 2:
              // returning from await.
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$_onOutgoingMessage$1, $async$completer);
    }
  };
  A.SseClient_closure.prototype = {
    call$0() {
      var t2,
        t1 = this.$this;
      t1._onConnected.complete$0(0);
      t2 = t1._outgoingController;
      new A._ControllerStream(t2, A._instanceType(t2)._eval$1("_ControllerStream<1>")).listen$2$onDone(t1.get$_onOutgoingMessage(), t1.get$_onOutgoingDone());
    },
    $signature: 2
  };
  A.SseClient_closure0.prototype = {
    call$1(_) {
      var t1 = this.$this._errorTimer;
      if (t1 != null)
        t1.cancel$0(0);
    },
    $signature: 5
  };
  A.SseClient_closure1.prototype = {
    call$1(error) {
      var t1 = this.$this,
        t2 = t1._errorTimer;
      t2 = t2 == null ? null : t2.get$isActive();
      if (t2 !== true)
        t1._errorTimer = A.Timer_Timer(B.Duration_5000000, new A.SseClient__closure(t1, error));
    },
    $signature: 5
  };
  A.SseClient__closure.prototype = {
    call$0() {
      var t1 = this.$this,
        t2 = this.error;
      t1._incomingController.addError$1(t2);
      t1.close$0(0);
      t1 = t1._onConnected;
      if ((t1.future._state & 30) === 0)
        t1.completeError$1(t2);
    },
    $signature: 0
  };
  A.SseClient__onOutgoingMessage_closure.prototype = {
    call$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.Null),
        $async$handler = 1, $async$currentError, $async$next = [], $async$self = this, e, e0, e1, exception, t1, $async$exception;
      var $async$call$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$currentError = $async$result;
          $async$goto = $async$handler;
        }
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              try {
                $async$self._box_0.encodedMessage = B.C_JsonCodec.encode$2$toEncodable($async$self.message, null);
              } catch (exception) {
                t1 = A.unwrapException(exception);
                if (t1 instanceof A.JsonUnsupportedObjectError) {
                  e = t1;
                  $async$self.$this._logger.log$4(B.Level_WARNING_900, "Unable to encode outgoing message: " + A.S(e), null, null);
                } else if (t1 instanceof A.ArgumentError) {
                  e0 = t1;
                  $async$self.$this._logger.log$4(B.Level_WARNING_900, "Invalid argument: " + A.S(e0), null, null);
                } else
                  throw exception;
              }
              $async$handler = 3;
              t1 = $async$self.$this;
              $async$goto = 6;
              return A._asyncAwait(A.HttpRequest_request(A.S(A._lateReadCheck(t1.__SseClient__serverUrl, "_serverUrl")) + "&messageId=" + ++t1._lastMessageId, "POST", null, $async$self._box_0.encodedMessage, true), $async$call$0);
            case 6:
              // returning from await.
              $async$handler = 1;
              // goto after finally
              $async$goto = 5;
              break;
            case 3:
              // catch
              $async$handler = 2;
              $async$exception = $async$currentError;
              e1 = A.unwrapException($async$exception);
              t1 = $async$self.$this;
              t1._logger.log$4(B.Level_SEVERE_1000, "Failed to send " + A.S($async$self.message) + ":\n " + A.S(e1), null, null);
              t1.close$0(0);
              // goto after finally
              $async$goto = 5;
              break;
            case 2:
              // uncaught
              // goto rethrow
              $async$goto = 1;
              break;
            case 5:
              // after finally
              // implicit return
              return A._asyncReturn(null, $async$completer);
            case 1:
              // rethrow
              return A._asyncRethrow($async$currentError, $async$completer);
          }
      });
      return A._asyncStartSync($async$call$0, $async$completer);
    },
    $signature: 24
  };
  A.generateUuidV4__generateBits.prototype = {
    call$1(bitCount) {
      return this.random.nextInt$1(B.JSInt_methods._shlPositive$1(1, bitCount));
    },
    $signature: 21
  };
  A.generateUuidV4__printDigits.prototype = {
    call$2(value, count) {
      return B.JSString_methods.padLeft$2(B.JSInt_methods.toRadixString$1(value, 16), count, "0");
    },
    $signature: 28
  };
  A.generateUuidV4__bitsDigits.prototype = {
    call$2(bitCount, digitCount) {
      return this._printDigits.call$2(this._generateBits.call$1(bitCount), digitCount);
    },
    $signature: 28
  };
  A.GuaranteeChannel.prototype = {
    GuaranteeChannel$3$allowSinkErrors(innerSink, allowSinkErrors, _box_0, $T) {
      var _this = this,
        t1 = _this.$ti,
        t2 = t1._eval$1("_GuaranteeSink<1>")._as(new A._GuaranteeSink(innerSink, _this, new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_dynamic), type$._AsyncCompleter_dynamic), allowSinkErrors, $T._eval$1("_GuaranteeSink<0>")));
      A._lateWriteOnceCheck(_this.__GuaranteeChannel__sink, "_sink");
      _this.set$__GuaranteeChannel__sink(t2);
      t1 = t1._eval$1("StreamController<1>")._as(A.StreamController_StreamController(null, new A.GuaranteeChannel_closure(_box_0, _this, $T), true, $T));
      A._lateWriteOnceCheck(_this.__GuaranteeChannel__streamController, "_streamController");
      _this.set$__GuaranteeChannel__streamController(t1);
    },
    _onSinkDisconnected$0() {
      this._disconnected = true;
      var subscription = this._guarantee_channel$_subscription;
      if (subscription != null)
        subscription.cancel$0(0);
      A._lateReadCheck(this.__GuaranteeChannel__streamController, "_streamController").close$0(0);
    },
    set$__GuaranteeChannel__sink(__GuaranteeChannel__sink) {
      this.__GuaranteeChannel__sink = this.$ti._eval$1("_GuaranteeSink<1>")._as(__GuaranteeChannel__sink);
    },
    set$__GuaranteeChannel__streamController(__GuaranteeChannel__streamController) {
      this.__GuaranteeChannel__streamController = this.$ti._eval$1("StreamController<1>")._as(__GuaranteeChannel__streamController);
    },
    set$_guarantee_channel$_subscription(_subscription) {
      this._guarantee_channel$_subscription = this.$ti._eval$1("StreamSubscription<1>?")._as(_subscription);
    }
  };
  A.GuaranteeChannel_closure.prototype = {
    call$0() {
      var t2, t3,
        _s17_ = "_streamController",
        t1 = this.$this;
      if (t1._disconnected)
        return;
      t2 = this._box_0.innerStream;
      t3 = A._lateReadCheck(t1.__GuaranteeChannel__streamController, _s17_);
      t1.set$_guarantee_channel$_subscription(t2.listen$3$onDone$onError(this.T._eval$1("~(0)")._as(t3.get$add(t3)), new A.GuaranteeChannel__closure(t1), A._lateReadCheck(t1.__GuaranteeChannel__streamController, _s17_).get$addError()));
    },
    $signature: 0
  };
  A.GuaranteeChannel__closure.prototype = {
    call$0() {
      var t1 = this.$this;
      A._lateReadCheck(t1.__GuaranteeChannel__sink, "_sink")._onStreamDisconnected$0();
      A._lateReadCheck(t1.__GuaranteeChannel__streamController, "_streamController").close$0(0);
    },
    $signature: 0
  };
  A._GuaranteeSink.prototype = {
    add$1(_, data) {
      var t1, _this = this;
      _this.$ti._precomputed1._as(data);
      if (_this._closed)
        throw A.wrapException(A.StateError$("Cannot add event after closing."));
      if (_this._disconnected)
        return;
      t1 = _this._inner;
      t1._async$_target.add$1(0, t1.$ti._precomputed1._as(data));
    },
    addError$2(error, stackTrace) {
      if (this._closed)
        throw A.wrapException(A.StateError$("Cannot add event after closing."));
      if (this._disconnected)
        return;
      this._guarantee_channel$_addError$2(error, stackTrace);
    },
    addError$1(error) {
      return this.addError$2(error, null);
    },
    _guarantee_channel$_addError$2(error, stackTrace) {
      var _this = this;
      if (_this._allowErrors) {
        _this._inner._async$_target.addError$2(error, stackTrace);
        return;
      }
      _this._doneCompleter.completeError$2(error, stackTrace);
      _this._onStreamDisconnected$0();
      _this._guarantee_channel$_channel._onSinkDisconnected$0();
      _this._inner._async$_target.close$0(0).catchError$1(new A._GuaranteeSink__addError_closure());
    },
    close$0(_) {
      var _this = this;
      if (_this._closed)
        return _this._doneCompleter.future;
      _this._closed = true;
      if (!_this._disconnected) {
        _this._guarantee_channel$_channel._onSinkDisconnected$0();
        _this._doneCompleter.complete$1(0, _this._inner._async$_target.close$0(0));
      }
      return _this._doneCompleter.future;
    },
    _onStreamDisconnected$0() {
      this._disconnected = true;
      var t1 = this._doneCompleter;
      if ((t1.future._state & 30) === 0)
        t1.complete$0(0);
      return;
    },
    $isStreamSink: 1
  };
  A._GuaranteeSink__addError_closure.prototype = {
    call$1(_) {
    },
    $signature: 7
  };
  A.StreamChannelController.prototype = {
    set$__StreamChannelController__local(__StreamChannelController__local) {
      this.__StreamChannelController__local = this.$ti._eval$1("StreamChannel<1>")._as(__StreamChannelController__local);
    },
    set$__StreamChannelController__foreign(__StreamChannelController__foreign) {
      this.__StreamChannelController__foreign = this.$ti._eval$1("StreamChannel<1>")._as(__StreamChannelController__foreign);
    }
  };
  A.StreamChannelMixin.prototype = {$isStreamChannel: 1};
  A.Uuid.prototype = {
    get$_uuid$_state() {
      var t2, t3,
        t1 = $.$get$Uuid__stateExpando();
      t1.toString;
      A.Expando__checkType(this);
      t2 = t1._jsWeakMap;
      t3 = t2.get(this);
      if (t3 == null) {
        t3 = A.LinkedHashMap_LinkedHashMap$_literal(["seedBytes", null, "node", null, "clockSeq", null, "mSecs", 0, "nSecs", 0, "hasInitV1", false, "hasInitV4", false], type$.String, type$.dynamic);
        t2.set(this, t1.$ti._eval$1("1?")._as(t3));
        t1 = t3;
      } else
        t1 = t3;
      return t1;
    },
    v1$0() {
      var seedBytes, nodeId, t2, t3, t4, clockSeq, mSecs, nSecs, tl, tmh, node, n, _this = this,
        _s9_ = "hasInitV1",
        _s9_0 = "seedBytes",
        _s4_ = "node",
        _s8_ = "clockSeq",
        _s5_ = "mSecs", _s5_0 = "nSecs",
        buf = new Uint8Array(16),
        options = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic),
        t1 = J.$index$asx(_this.get$_uuid$_state(), _s9_);
      t1.toString;
      if (!A._asBoolS(t1)) {
        B.Map_empty.$index(0, "v1rngPositionalArgs");
        B.Map_empty.$index(0, "v1rngNamedArgs");
        B.Map_empty.$index(0, "v1rng");
        seedBytes = A.UuidUtil_mathRNG();
        if (J.$index$asx(_this.get$_uuid$_state(), _s9_0) != null)
          J.$index$asx(_this.get$_uuid$_state(), _s9_0);
        else
          J.$indexSet$ax(_this.get$_uuid$_state(), _s9_0, seedBytes);
        nodeId = A._setArrayType([seedBytes[0] | 1, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]], type$.JSArray_int);
        if (J.$index$asx(_this.get$_uuid$_state(), _s4_) != null)
          J.$index$asx(_this.get$_uuid$_state(), _s4_);
        else
          J.$indexSet$ax(_this.get$_uuid$_state(), _s4_, nodeId);
        t1 = seedBytes[6];
        t2 = seedBytes[7];
        t3 = _this.get$_uuid$_state();
        t4 = J.getInterceptor$asx(t3);
        if (t4.$index(t3, _s8_) == null)
          t4.$indexSet(t3, _s8_, (t1 << 8 | t2) & 262143);
        J.$indexSet$ax(_this.get$_uuid$_state(), _s5_, 0);
        J.$indexSet$ax(_this.get$_uuid$_state(), _s5_0, 0);
        J.$indexSet$ax(_this.get$_uuid$_state(), _s9_, true);
      }
      options.$index(0, _s8_);
      clockSeq = A._asIntS(J.$index$asx(_this.get$_uuid$_state(), _s8_));
      options.$index(0, _s5_);
      mSecs = Date.now();
      options.$index(0, _s5_0);
      t1 = J.$index$asx(_this.get$_uuid$_state(), _s5_0);
      t1.toString;
      nSecs = A._asIntS(t1) + 1;
      t1 = J.$index$asx(_this.get$_uuid$_state(), _s5_);
      if (typeof t1 !== "number")
        return A.iae(t1);
      t2 = J.$index$asx(_this.get$_uuid$_state(), _s5_0);
      if (typeof t2 !== "number")
        return A.iae(t2);
      t1 = mSecs - t1 + (nSecs - t2) / 10000 < 0;
      if (t1) {
        options.$index(0, _s8_);
        t2 = true;
      } else
        t2 = false;
      if (t2) {
        if (typeof clockSeq !== "number")
          return clockSeq.$add();
        clockSeq = clockSeq + 1 & 16383;
      }
      if (!t1) {
        t1 = J.$index$asx(_this.get$_uuid$_state(), _s5_);
        if (typeof t1 !== "number")
          return A.iae(t1);
        t1 = mSecs > t1;
      } else
        t1 = true;
      if (t1) {
        options.$index(0, _s5_0);
        t1 = true;
      } else
        t1 = false;
      if (t1)
        nSecs = 0;
      if (nSecs >= 10000)
        throw A.wrapException(A.Exception_Exception("uuid.v1(): Can't create more than 10M uuids/sec"));
      J.$indexSet$ax(_this.get$_uuid$_state(), _s5_, mSecs);
      J.$indexSet$ax(_this.get$_uuid$_state(), _s5_0, nSecs);
      J.$indexSet$ax(_this.get$_uuid$_state(), _s8_, clockSeq);
      mSecs += 122192928e5;
      tl = B.JSInt_methods.$mod((mSecs & 268435455) * 10000 + nSecs, 4294967296);
      buf[0] = B.JSInt_methods._shrOtherPositive$1(tl, 24) & 255;
      buf[1] = B.JSInt_methods._shrOtherPositive$1(tl, 16) & 255;
      buf[2] = B.JSInt_methods._shrOtherPositive$1(tl, 8) & 255;
      buf[3] = tl & 255;
      tmh = B.JSNumber_methods.floor$0(mSecs / 4294967296 * 10000) & 268435455;
      buf[4] = tmh >>> 8 & 255;
      buf[5] = tmh & 255;
      buf[6] = tmh >>> 24 & 15 | 16;
      buf[7] = tmh >>> 16 & 255;
      if (typeof clockSeq !== "number")
        return clockSeq.$and();
      buf[8] = clockSeq >>> 8 & 63 | 128;
      buf[9] = clockSeq & 255;
      options.$index(0, _s4_);
      node = J.$index$asx(_this.get$_uuid$_state(), _s4_);
      for (t1 = J.getInterceptor$asx(node), n = 0; n < 6; ++n)
        B.NativeUint8List_methods.$indexSet(buf, 10 + n, A._asIntS(t1.$index(node, n)));
      t1 = $.$get$Uuid__byteToHex();
      t2 = buf[0];
      if (!(t2 < 256))
        return A.ioore(t1, t2);
      t2 = t1[t2];
      t3 = buf[1];
      if (!(t3 < 256))
        return A.ioore(t1, t3);
      t3 = t2 + t1[t3];
      t2 = buf[2];
      if (!(t2 < 256))
        return A.ioore(t1, t2);
      t2 = t3 + t1[t2];
      t3 = buf[3];
      if (!(t3 < 256))
        return A.ioore(t1, t3);
      t3 = t2 + t1[t3] + "-";
      t2 = buf[4];
      if (!(t2 < 256))
        return A.ioore(t1, t2);
      t2 = t3 + t1[t2];
      t3 = buf[5];
      if (!(t3 < 256))
        return A.ioore(t1, t3);
      t3 = t2 + t1[t3] + "-";
      t2 = buf[6];
      if (!(t2 < 256))
        return A.ioore(t1, t2);
      t2 = t3 + t1[t2];
      t3 = buf[7];
      if (!(t3 < 256))
        return A.ioore(t1, t3);
      t3 = t2 + t1[t3] + "-";
      t2 = buf[8];
      if (!(t2 < 256))
        return A.ioore(t1, t2);
      t2 = t3 + t1[t2];
      t3 = buf[9];
      if (!(t3 < 256))
        return A.ioore(t1, t3);
      t3 = t2 + t1[t3] + "-";
      t2 = buf[10];
      if (!(t2 < 256))
        return A.ioore(t1, t2);
      t2 = t3 + t1[t2];
      t3 = buf[11];
      if (!(t3 < 256))
        return A.ioore(t1, t3);
      t3 = t2 + t1[t3];
      t2 = buf[12];
      if (!(t2 < 256))
        return A.ioore(t1, t2);
      t2 = t3 + t1[t2];
      t3 = buf[13];
      if (!(t3 < 256))
        return A.ioore(t1, t3);
      t3 = t2 + t1[t3];
      t2 = buf[14];
      if (!(t2 < 256))
        return A.ioore(t1, t2);
      t2 = t3 + t1[t2];
      t3 = buf[15];
      if (!(t3 < 256))
        return A.ioore(t1, t3);
      return t2 + t1[t3];
    }
  };
  A.HtmlWebSocketChannel.prototype = {
    HtmlWebSocketChannel$1(_webSocket) {
      var t2, t3, _this = this,
        t1 = _this._webSocket;
      if (t1.readyState === 1)
        _this._listen$0();
      else {
        t2 = new A._EventStream(t1, "open", false, type$._EventStream_legacy_Event);
        t2.get$first(t2).then$1$1(0, new A.HtmlWebSocketChannel_closure(_this), type$.Null);
      }
      t2 = new A._EventStream(t1, "error", false, type$._EventStream_legacy_Event);
      t3 = type$.Null;
      t2.get$first(t2).then$1$1(0, new A.HtmlWebSocketChannel_closure0(_this), t3);
      t2 = type$.nullable_void_Function_legacy_MessageEvent._as(new A.HtmlWebSocketChannel_closure1(_this));
      type$.nullable_void_Function._as(null);
      A._EventStreamSubscription$(t1, "message", t2, false, type$.legacy_MessageEvent);
      t1 = new A._EventStream(t1, "close", false, type$._EventStream_legacy_CloseEvent);
      t1.get$first(t1).then$1$1(0, new A.HtmlWebSocketChannel_closure2(_this), t3);
    },
    _listen$0() {
      var t1 = A._lateReadCheck(A._lateReadCheck(this._html$_controller.__StreamChannelController__local, "_local").__GuaranteeChannel__streamController, "_streamController");
      new A._ControllerStream(t1, A._instanceType(t1)._eval$1("_ControllerStream<1>")).listen$2$onDone(B.WebSocket_methods.get$send(this._webSocket), new A.HtmlWebSocketChannel__listen_closure(this));
    },
    $isWebSocketChannel: 1
  };
  A.HtmlWebSocketChannel_closure.prototype = {
    call$1(_) {
      type$.Event._as(_);
      this.$this._listen$0();
    },
    $signature: 29
  };
  A.HtmlWebSocketChannel_closure0.prototype = {
    call$1(_) {
      var t1;
      type$.Event._as(_);
      t1 = this.$this._html$_controller;
      A._lateReadCheck(A._lateReadCheck(t1.__StreamChannelController__local, "_local").__GuaranteeChannel__sink, "_sink").addError$1(new A.WebSocketChannelException("WebSocket connection failed."));
      A._lateReadCheck(A._lateReadCheck(t1.__StreamChannelController__local, "_local").__GuaranteeChannel__sink, "_sink").close$0(0);
    },
    $signature: 29
  };
  A.HtmlWebSocketChannel_closure1.prototype = {
    call$1($event) {
      var data = new A._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.MessageEvent._as($event).data, true);
      if (type$.ByteBuffer._is(data))
        data = A.NativeUint8List_NativeUint8List$view(data, 0, null);
      A._lateReadCheck(A._lateReadCheck(this.$this._html$_controller.__StreamChannelController__local, "_local").__GuaranteeChannel__sink, "_sink").add$1(0, data);
    },
    $signature: 62
  };
  A.HtmlWebSocketChannel_closure2.prototype = {
    call$1($event) {
      type$.CloseEvent._as($event);
      $event.code;
      $event.reason;
      A._lateReadCheck(A._lateReadCheck(this.$this._html$_controller.__StreamChannelController__local, "_local").__GuaranteeChannel__sink, "_sink").close$0(0);
    },
    $signature: 63
  };
  A.HtmlWebSocketChannel__listen_closure.prototype = {
    call$0() {
      this.$this._webSocket.close();
    },
    $signature: 0
  };
  A._HtmlWebSocketSink.prototype = {$isWebSocketSink: 1};
  A.WebSocketChannel.prototype = {};
  A.WebSocketChannelException.prototype = {
    toString$0(_) {
      var t1 = "WebSocketChannelException: " + this.message;
      return t1;
    }
  };
  A.main_closure.prototype = {
    call$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.Null),
        uri, fixedPath, fixedUri, client, restarter, manager, t1, t2, t3;
      var $async$call$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              if (self.$dartAppInstanceId == null)
                self.$dartAppInstanceId = B.C_Uuid.v1$0();
              uri = A.Uri_parse(self.$dwdsDevHandlerPath);
              if (window.location.protocol === "https:" && uri.get$scheme() === "http" && uri.get$host(uri) !== "localhost")
                uri = uri.replace$1$scheme(0, "https");
              else if (window.location.protocol === "wss:" && uri.get$scheme() === "ws" && uri.get$host(uri) !== "localhost")
                uri = uri.replace$1$scheme(0, "wss");
              fixedPath = uri.toString$0(0);
              fixedUri = A.Uri_parse(fixedPath);
              client = fixedUri.isScheme$1("ws") || fixedUri.isScheme$1("wss") ? new A.WebSocketClient(A.HtmlWebSocketChannel$connect(fixedUri, null)) : new A.SseSocketClient(A.SseClient$(fixedPath));
              $async$goto = J.$eq$(self.$dartModuleStrategy, "require-js") ? 2 : 4;
              break;
            case 2:
              // then
              $async$goto = 5;
              return A._asyncAwait(A.RequireRestarter_create(), $async$call$0);
            case 5:
              // returning from await.
              restarter = $async$result;
              // goto join
              $async$goto = 3;
              break;
            case 4:
              // else
              if (J.$eq$(self.$dartModuleStrategy, "legacy"))
                restarter = new A.LegacyRestarter();
              else
                throw A.wrapException(A.StateError$("Unknown module strategy: " + A.S(self.$dartModuleStrategy)));
            case 3:
              // join
              manager = new A.ReloadingManager(client, restarter);
              self.$dartHotRestartDwds = A.allowInterop(new A.main__closure(manager), type$.legacy_legacy_Promise_legacy_bool_Function_legacy_String);
              self.$emitDebugEvent = A.allowInterop(new A.main__closure0(client), type$.legacy_void_Function_2_legacy_String_and_legacy_String);
              self.$emitRegisterEvent = A.allowInterop(new A.main__closure1(client), type$.legacy_void_Function_legacy_String);
              self.$launchDevTools = A.allowInterop(new A.main__closure2(client), type$.legacy_void_Function);
              client.get$stream(client).listen$2$onError(new A.main__closure3(manager), new A.main__closure4());
              if (A.boolConversionCheck(self.$dwdsEnableDevtoolsLaunch)) {
                t1 = window;
                t2 = type$.nullable_void_Function_legacy_KeyboardEvent._as(new A.main__closure5());
                type$.nullable_void_Function._as(null);
                A._EventStreamSubscription$(t1, "keydown", t2, false, type$.legacy_KeyboardEvent);
              }
              if (J.contains$1$asx(window.navigator.vendor, "Google")) {
                t1 = client.get$sink();
                t2 = $.$get$serializers();
                t3 = new A.ConnectRequestBuilder();
                type$.legacy_void_Function_legacy_ConnectRequestBuilder._as(new A.main__closure6()).call$1(t3);
                t1.add$1(0, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3.build$0()), null));
              } else
                A.runMain();
              self.window.top.document.dispatchEvent(A.CustomEvent_CustomEvent("dart-app-ready"));
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$call$0, $async$completer);
    },
    $signature: 64
  };
  A.main__closure.prototype = {
    call$1(runId) {
      return A.toPromise(this.manager.hotRestart$1$runId(A._asStringS(runId)), type$.legacy_bool);
    },
    $signature: 82
  };
  A.main__closure0.prototype = {
    call$2(kind, eventData) {
      var t1, t2, t3;
      A._asStringS(kind);
      A._asStringS(eventData);
      t1 = this.client.get$sink();
      t2 = $.$get$serializers();
      t3 = new A.DebugEventBuilder();
      type$.legacy_void_Function_legacy_DebugEventBuilder._as(new A.main___closure1(kind, eventData)).call$1(t3);
      t1.add$1(0, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3.build$0()), null));
    },
    $signature: 66
  };
  A.main___closure1.prototype = {
    call$1(b) {
      var t1 = Date.now();
      b.get$_debug_event$_$this()._timestamp = t1;
      b.get$_debug_event$_$this()._debug_event$_kind = this.kind;
      b.get$_debug_event$_$this()._eventData = this.eventData;
      return b;
    },
    $signature: 67
  };
  A.main__closure1.prototype = {
    call$1(eventData) {
      var t1, t2, t3;
      A._asStringS(eventData);
      t1 = this.client.get$sink();
      t2 = $.$get$serializers();
      t3 = new A.RegisterEventBuilder();
      type$.legacy_void_Function_legacy_RegisterEventBuilder._as(new A.main___closure0(eventData)).call$1(t3);
      t1.add$1(0, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3.build$0()), null));
    },
    $signature: 68
  };
  A.main___closure0.prototype = {
    call$1(b) {
      var t1 = Date.now();
      b.get$_register_event$_$this()._register_event$_timestamp = t1;
      b.get$_register_event$_$this()._register_event$_eventData = this.eventData;
      return b;
    },
    $signature: 69
  };
  A.main__closure2.prototype = {
    call$0() {
      var t1, t2, t3;
      if (!J.contains$1$asx(window.navigator.vendor, "Google")) {
        B.Window_methods.alert$1(window, "Dart DevTools is only supported on Chromium based browsers.");
        return;
      }
      t1 = this.client.get$sink();
      t2 = $.$get$serializers();
      t3 = new A.DevToolsRequestBuilder();
      type$.legacy_void_Function_legacy_DevToolsRequestBuilder._as(new A.main___closure()).call$1(t3);
      t1.add$1(0, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3.build$0()), null));
    },
    $signature: 2
  };
  A.main___closure.prototype = {
    call$1(b) {
      var t1 = A._asStringS(self.$dartAppId);
      b.get$_devtools_request$_$this()._devtools_request$_appId = t1;
      t1 = A._asStringS(self.$dartAppInstanceId);
      b.get$_devtools_request$_$this()._devtools_request$_instanceId = t1;
      return b;
    },
    $signature: 70
  };
  A.main__closure3.prototype = {
    call$1(serialized) {
      return this.$call$body$main__closure(A._asStringS(serialized));
    },
    $call$body$main__closure(serialized) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.Null),
        $async$self = this, $alert, t1, $event;
      var $async$call$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              $event = $.$get$serializers().deserialize$1(B.C_JsonCodec.decode$2$reviver(0, serialized, null));
              $async$goto = $event instanceof A.BuildResult ? 2 : 4;
              break;
            case 2:
              // then
              $async$goto = J.$eq$(self.$dartReloadConfiguration, "ReloadConfiguration.liveReload") ? 5 : 7;
              break;
            case 5:
              // then
              window.location.reload();
              // goto join
              $async$goto = 6;
              break;
            case 7:
              // else
              $async$goto = J.$eq$(self.$dartReloadConfiguration, "ReloadConfiguration.hotRestart") ? 8 : 10;
              break;
            case 8:
              // then
              $async$goto = 11;
              return A._asyncAwait($async$self.manager.hotRestart$0(), $async$call$1);
            case 11:
              // returning from await.
              // goto join
              $async$goto = 9;
              break;
            case 10:
              // else
              if (J.$eq$(self.$dartReloadConfiguration, "ReloadConfiguration.hotReload"))
                A.print("Hot reload is currently unsupported. Ignoring change.");
            case 9:
              // join
            case 6:
              // join
              // goto join
              $async$goto = 3;
              break;
            case 4:
              // else
              if ($event instanceof A.DevToolsResponse) {
                if (!$event.success) {
                  $alert = "DevTools failed to open with:\n" + A.S($event.error);
                  if ($event.promptExtension && A.boolConversionCheck(B.Window_methods.confirm$1(window, $alert)))
                    B.Window_methods.open$2(window, "https://goo.gle/dart-debug-extension", "_blank");
                  else
                    B.Window_methods.alert$1(window, $alert);
                }
              } else if ($event instanceof A.RunRequest)
                A.runMain();
              else if ($event instanceof A.ErrorResponse) {
                t1 = "Error from backend:\n\nError: " + $event.error + "\n\nStack Trace:\n" + $event.stackTrace;
                if (typeof console != "undefined")
                  window.console.error(t1);
              }
            case 3:
              // join
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$call$1, $async$completer);
    },
    $signature: 71
  };
  A.main__closure4.prototype = {
    call$1(error) {
    },
    $signature: 7
  };
  A.main__closure5.prototype = {
    call$1(e) {
      if (type$.legacy_KeyboardEvent._is(e) && B.JSArray_methods.contains$1(B.List_zgw, e.key) && A.boolConversionCheck(e.altKey) && !A.boolConversionCheck(e.ctrlKey) && !A.boolConversionCheck(e.metaKey)) {
        e.preventDefault();
        self.$launchDevTools.call$0();
      }
    },
    $signature: 72
  };
  A.main__closure6.prototype = {
    call$1(b) {
      var t1 = A._asStringS(self.$dartAppId);
      b.get$_$this()._appId = t1;
      t1 = A._asStringS(self.$dartAppInstanceId);
      b.get$_$this()._instanceId = t1;
      t1 = A._asStringS(self.$dartEntrypointPath);
      b.get$_$this()._entrypointPath = t1;
      return b;
    },
    $signature: 73
  };
  A.main_closure0.prototype = {
    call$2(error, stackTrace) {
      type$.legacy_StackTrace._as(stackTrace);
      A.print("Unhandled error detected in the injected client.js script.\n\nYou can disable this script in webdev by passing --no-injected-client if it\nis preventing your app from loading, but note that this will also prevent\nall debugging and hot reload/restart functionality from working.\n\nThe original error is below, please file an issue at\nhttps://github.com/dart-lang/webdev/issues/new and attach this output:\n\n" + A.S(error) + "\n" + A.S(stackTrace) + "\n");
    },
    $signature: 74
  };
  A.LegacyRestarter.prototype = {
    restart$1$runId(runId) {
      return this.restart$body$LegacyRestarter(runId);
    },
    restart$body$LegacyRestarter(runId) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.legacy_bool),
        $async$returnValue, t2, t3, t4, t1, dartLibrary;
      var $async$restart$1$runId = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = {};
              dartLibrary = type$.legacy_JsObject._as($.$get$_context().$index(0, "dart_library"));
              if (runId == null)
                dartLibrary.callMethod$1("reload");
              else {
                t2 = type$.legacy_String;
                t2 = A.LinkedHashMap_LinkedHashMap$_literal(["runId", runId], t2, t2);
                dartLibrary.callMethod$2("reload", [A._wrapToDart(A.JsObject__convertDataTree(t2))]);
              }
              t2 = new A._Future($.Zone__current, type$._Future_legacy_bool);
              t1.sub = null;
              t3 = window;
              t4 = type$.nullable_void_Function_legacy_MessageEvent._as(new A.LegacyRestarter_restart_closure(t1, new A._AsyncCompleter(t2, type$._AsyncCompleter_legacy_bool)));
              type$.nullable_void_Function._as(null);
              t1.sub = A._EventStreamSubscription$(t3, "message", t4, false, type$.legacy_MessageEvent);
              $async$returnValue = t2;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$restart$1$runId, $async$completer);
    },
    $isRestarter: 1
  };
  A.LegacyRestarter_restart_closure.prototype = {
    call$1($event) {
      var t1,
        message = new A._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.legacy_MessageEvent._as($event).data, true);
      if (type$.legacy_Map_dynamic_dynamic._is(message)) {
        t1 = J.getInterceptor$asx(message);
        t1 = J.$eq$(t1.$index(message, "type"), "DDC_STATE_CHANGE") && J.$eq$(t1.$index(message, "state"), "restart_end");
      } else
        t1 = false;
      if (t1) {
        this.reloadCompleter.complete$1(0, true);
        this._box_0.sub.cancel$0(0);
      }
    },
    $signature: 75
  };
  A.ReloadingManager.prototype = {
    hotRestart$1$runId(runId) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.legacy_bool),
        $async$returnValue, $async$self = this, result, t1, t2;
      var $async$hotRestart$1$runId = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = $async$self._client.get$sink();
              t2 = $.$get$serializers();
              type$.legacy_void_Function_legacy_IsolateExitBuilder._as(null);
              t1.add$1(0, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(new A.IsolateExitBuilder().build$0()), null));
              $async$goto = 3;
              return A._asyncAwait($async$self._restarter.restart$1$runId(runId), $async$hotRestart$1$runId);
            case 3:
              // returning from await.
              result = $async$result;
              $async$self._afterRestart$1(result);
              $async$returnValue = result;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$hotRestart$1$runId, $async$completer);
    },
    hotRestart$0() {
      return this.hotRestart$1$runId(null);
    },
    _afterRestart$1(succeeded) {
      var t1, t2;
      if (!A.boolConversionCheck(succeeded))
        return;
      t1 = this._client.get$sink();
      t2 = $.$get$serializers();
      type$.legacy_void_Function_legacy_IsolateStartBuilder._as(null);
      t1.add$1(0, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(new A.IsolateStartBuilder().build$0()), null));
    }
  };
  A.Promise.prototype = {};
  A.toPromise_closure.prototype = {
    call$2(resolve, reject) {
      this.T._eval$1("~(0*)*")._as(resolve);
      type$.legacy_void_Function_dynamic._as(reject);
      this.future.then$1$1(0, resolve, type$.void).catchError$1(reject);
    },
    $signature() {
      return this.T._eval$1("Null(~(0*)*,~(@)*)");
    }
  };
  A.RequireLoader.prototype = {};
  A.HotReloadFailedException.prototype = {
    toString$0(_) {
      return "HotReloadFailedException: '" + A.S(this._s) + "'";
    }
  };
  A.JsError.prototype = {};
  A.JsMap.prototype = {};
  A.RequireRestarter.prototype = {
    restart$1$runId(runId) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.legacy_bool),
        $async$returnValue, $async$self = this, t1, t2, completer, newDigests, modulesToLoad, t3, line, toZone, result, developer;
      var $async$restart$1$runId = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              developer = self.$loadModuleConfig.call$1("dart_sdk").developer;
              $async$goto = A.boolConversionCheck(A._asBoolS(developer._extensions.containsKey("ext.flutter.disassemble"))) ? 3 : 4;
              break;
            case 3:
              // then
              t1 = type$.legacy_Promise_void._as(developer.invokeExtension("ext.flutter.disassemble", "{}"));
              t2 = new A._Future($.Zone__current, type$._Future_void);
              completer = new A._AsyncCompleter(t2, type$._AsyncCompleter_void);
              J.then$2$x(t1, A.allowInterop(completer.get$complete(completer), type$.legacy_dynamic_Function_void), A.allowInterop(completer.get$completeError(), type$.legacy_dynamic_Function_dynamic));
              $async$goto = 5;
              return A._asyncAwait(t2, $async$restart$1$runId);
            case 5:
              // returning from await.
            case 4:
              // join
              $async$goto = 6;
              return A._asyncAwait($async$self._getDigests$0(), $async$restart$1$runId);
            case 6:
              // returning from await.
              newDigests = $async$result;
              modulesToLoad = A._setArrayType([], type$.JSArray_legacy_String);
              for (t1 = J.getInterceptor$x(newDigests), t2 = J.get$iterator$ax(t1.get$keys(newDigests)); t2.moveNext$0();) {
                t3 = t2.get$current(t2);
                if (!J.containsKey$1$x($._lastKnownDigests, t3)) {
                  line = "Error during script reloading, refreshing the page. \nUnable to find an existing digest for module: " + A.S(t3) + ".";
                  toZone = $.printToZone;
                  if (toZone == null)
                    A.printString(line);
                  else
                    toZone.call$1(line);
                  window.location.reload();
                } else if (!J.$eq$(J.$index$asx($._lastKnownDigests, t3), t1.$index(newDigests, t3))) {
                  J.$indexSet$ax($._lastKnownDigests, t3, t1.$index(newDigests, t3));
                  B.JSArray_methods.add$1(modulesToLoad, t3);
                }
              }
              $async$goto = modulesToLoad.length !== 0 ? 7 : 9;
              break;
            case 7:
              // then
              $async$self._updateGraph$0();
              $async$goto = 10;
              return A._asyncAwait($async$self._reload$1(modulesToLoad), $async$restart$1$runId);
            case 10:
              // returning from await.
              result = $async$result;
              // goto join
              $async$goto = 8;
              break;
            case 9:
              // else
              result = true;
            case 8:
              // join
              self.$loadModuleConfig.call$1("dart_sdk").dart.hotRestart();
              A.runMain();
              $async$returnValue = result;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$restart$1$runId, $async$completer);
    },
    _getDigests$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.legacy_Map_of_legacy_String_and_legacy_String),
        $async$returnValue, t1, $async$temp1, $async$temp2, $async$temp3;
      var $async$_getDigests$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = type$.legacy_String;
              $async$temp1 = J;
              $async$temp2 = type$.legacy_Map_dynamic_dynamic;
              $async$temp3 = A;
              $async$goto = 3;
              return A._asyncAwait(A.HttpRequest_request(J.get$digestsPath$x(self.$requireLoader), "GET", "json", null, null), $async$_getDigests$0);
            case 3:
              // returning from await.
              $async$returnValue = $async$temp1.cast$2$0$ax($async$temp2._as($async$temp3._convertNativeToDart_XHR_Response($async$result.response)), t1, t1);
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$_getDigests$0, $async$completer);
    },
    _initialize$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$self = this, $async$temp1;
      var $async$_initialize$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              $async$temp1 = $;
              $async$goto = 2;
              return A._asyncAwait($async$self._getDigests$0(), $async$_initialize$0);
            case 2:
              // returning from await.
              $async$temp1._lastKnownDigests = $async$result;
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$_initialize$0, $async$completer);
    },
    _moduleParents$1(module) {
      var t1;
      A._asStringS(module);
      t1 = J.$get$1$x(J.get$moduleParentsGraph$x(self.$requireLoader), module);
      t1 = t1 == null ? null : J.cast$1$0$ax(t1, type$.legacy_String);
      return t1 == null ? A._setArrayType([], type$.JSArray_legacy_String) : t1;
    },
    _moduleTopologicalCompare$2(module1, module2) {
      var t1, order1, order2, t2, topological;
      A._asStringS(module1);
      A._asStringS(module2);
      t1 = this._moduleOrdering;
      order1 = t1.$index(0, module1);
      order2 = t1.$index(0, module2);
      t2 = order1 == null;
      if (t2 || order2 == null)
        throw A.wrapException(A.HotReloadFailedException$("Unable to fetch ordering info for module: " + A.S(t2 ? module1 : module2)));
      topological = J.compareTo$1$ns(t1.$index(0, module2), t1.$index(0, module1));
      return topological === 0 ? J.compareTo$1$ns(module1, module2) : topological;
    },
    _reload$1(modules) {
      return this._reload$body$RequireRestarter(type$.legacy_List_legacy_String._as(modules));
    },
    _reload$body$RequireRestarter(modules) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.legacy_bool),
        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, reloadedModules, previousModuleId, moduleId, parentIds, childModule, e, t2, t3, t4, t5, exception, t1, $async$exception;
      var $async$_reload$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$currentError = $async$result;
          $async$goto = $async$handler;
        }
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = $async$self._running.future;
              $async$goto = (t1._state & 30) === 0 ? 3 : 4;
              break;
            case 3:
              // then
              $async$goto = 5;
              return A._asyncAwait(t1, $async$_reload$1);
            case 5:
              // returning from await.
              $async$returnValue = $async$result;
              // goto return
              $async$goto = 1;
              break;
            case 4:
              // join
              $async$self.set$_running(new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_legacy_bool), type$._AsyncCompleter_legacy_bool));
              reloadedModules = 0;
              $async$handler = 7;
              $async$self._dirtyModules.addAll$1(0, modules);
              previousModuleId = null;
              t1 = $async$self.get$_moduleTopologicalCompare(), t2 = type$.legacy_String, t3 = type$.JSArray_legacy_String, t4 = type$.legacy_dynamic_Function;
            case 10:
              // for condition
              if (!(t5 = $async$self._dirtyModules, t5._root != null)) {
                // goto after for
                $async$goto = 11;
                break;
              }
              if (t5._count === 0)
                A.throwExpression(A.IterableElementError_noElement());
              moduleId = t5.get$_collection$_first().key;
              $async$self._dirtyModules.remove$1(0, moduleId);
              t5 = A._asStringS(moduleId);
              t5 = J.$get$1$x(J.get$moduleParentsGraph$x(self.$requireLoader), t5);
              t5 = t5 == null ? null : J.cast$1$0$ax(t5, t2);
              parentIds = t5 == null ? A._setArrayType([], t3) : t5;
              $async$goto = parentIds == null || J.get$isEmpty$asx(parentIds) ? 12 : 14;
              break;
            case 12:
              // then
              childModule = self.$loadModuleConfig.call$1("dart_sdk").dart.getModuleLibraries(previousModuleId);
              self.$dartRunMain = A.allowInterop(new A.RequireRestarter__reload_closure(childModule), t4);
              // goto join
              $async$goto = 13;
              break;
            case 14:
              // else
              t5 = reloadedModules;
              if (typeof t5 !== "number") {
                $async$returnValue = t5.$add();
                // goto return
                $async$goto = 1;
                break;
              }
              reloadedModules = t5 + 1;
              $async$goto = 15;
              return A._asyncAwait($async$self._reloadModule$1(moduleId), $async$_reload$1);
            case 15:
              // returning from await.
              J.sort$1$ax(parentIds, t1);
              $async$self._dirtyModules.addAll$1(0, parentIds);
              previousModuleId = moduleId;
            case 13:
              // join
              // goto for condition
              $async$goto = 10;
              break;
            case 11:
              // after for
              A.print(A.S(reloadedModules) + " module(s) were hot-reloaded.");
              $async$self._running.complete$1(0, true);
              $async$handler = 2;
              // goto after finally
              $async$goto = 9;
              break;
            case 7:
              // catch
              $async$handler = 6;
              $async$exception = $async$currentError;
              t1 = A.unwrapException($async$exception);
              if (t1 instanceof A.HotReloadFailedException) {
                e = t1;
                A.print("Error during script reloading. Firing full page reload. " + A.S(e));
                window.location.reload();
                $async$self._running.complete$1(0, false);
              } else
                throw $async$exception;
              // goto after finally
              $async$goto = 9;
              break;
            case 6:
              // uncaught
              // goto rethrow
              $async$goto = 2;
              break;
            case 9:
              // after finally
              $async$returnValue = $async$self._running.future;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
            case 2:
              // rethrow
              return A._asyncRethrow($async$currentError, $async$completer);
          }
      });
      return A._asyncStartSync($async$_reload$1, $async$completer);
    },
    _reloadModule$1(moduleId) {
      var t1 = new A._Future($.Zone__current, type$._Future_dynamic),
        completer = new A._AsyncCompleter(t1, type$._AsyncCompleter_dynamic),
        stackTrace = A.StackTrace_current();
      J.forceLoadModule$3$x(self.$requireLoader, moduleId, A.allowInterop(new A.RequireRestarter__reloadModule_closure(completer), type$.legacy_void_Function), A.allowInterop(new A.RequireRestarter__reloadModule_closure0(completer, stackTrace), type$.legacy_void_Function_legacy_JsError));
      return t1;
    },
    _updateGraph$0() {
      var i, t2, t3, _i,
        t1 = type$.legacy_String,
        stronglyConnectedComponents = A.stronglyConnectedComponents(A.List_List$from(self.Array.from(J.keys$0$x(J.get$moduleParentsGraph$x(self.$requireLoader))), true, t1), this.get$_moduleParents(), t1);
      t1 = this._moduleOrdering;
      if (t1._collection$_length > 0) {
        t1._collection$_strings = t1._collection$_nums = t1._collection$_rest = t1._keys = null;
        t1._collection$_length = 0;
      }
      for (i = 0; i < stronglyConnectedComponents.length; ++i)
        for (t2 = stronglyConnectedComponents[i], t3 = t2.length, _i = 0; _i < t2.length; t2.length === t3 || (0, A.throwConcurrentModificationError)(t2), ++_i)
          t1.$indexSet(0, t2[_i], i);
    },
    set$_dirtyModules(_dirtyModules) {
      this._dirtyModules = type$.legacy_SplayTreeSet_legacy_String._as(_dirtyModules);
    },
    set$_running(_running) {
      this._running = type$.legacy_Completer_legacy_bool._as(_running);
    },
    $isRestarter: 1
  };
  A.RequireRestarter__reload_closure.prototype = {
    call$0() {
      J.get$first$ax(self.Object.values(this.childModule)).main();
    },
    $signature: 2
  };
  A.RequireRestarter__reloadModule_closure.prototype = {
    call$0() {
      this.completer.complete$0(0);
    },
    $signature: 2
  };
  A.RequireRestarter__reloadModule_closure0.prototype = {
    call$1(e) {
      return this.completer.completeError$2(new A.HotReloadFailedException(J.get$message$x(type$.legacy_JsError._as(e))), this.stackTrace);
    },
    $signature: 78
  };
  A._createScript_closure.prototype = {
    call$0() {
      var nonce = A._findNonce();
      if (nonce == null)
        return new A._createScript__closure();
      return new A._createScript__closure0(nonce);
    },
    $signature: 79
  };
  A._createScript__closure.prototype = {
    call$0() {
      return document.createElement("script");
    },
    $signature: 30
  };
  A._createScript__closure0.prototype = {
    call$0() {
      var t1 = document.createElement("script");
      t1.setAttribute("nonce", this.nonce);
      return t1;
    },
    $signature: 30
  };
  (function aliases() {
    var _ = J.Interceptor.prototype;
    _.super$Interceptor$toString = _.toString$0;
    _.super$Interceptor$noSuchMethod = _.noSuchMethod$1;
    _ = J.JavaScriptObject.prototype;
    _.super$JavaScriptObject$toString = _.toString$0;
    _ = A.JsLinkedHashMap.prototype;
    _.super$JsLinkedHashMap$internalContainsKey = _.internalContainsKey$1;
    _.super$JsLinkedHashMap$internalGet = _.internalGet$1;
    _.super$JsLinkedHashMap$internalSet = _.internalSet$2;
    _.super$JsLinkedHashMap$internalRemove = _.internalRemove$1;
    _ = A._BufferingStreamSubscription.prototype;
    _.super$_BufferingStreamSubscription$_add = _._add$1;
    _.super$_BufferingStreamSubscription$_addError = _._addError$2;
    _ = A._HashMap.prototype;
    _.super$_HashMap$_containsKey = _._containsKey$1;
    _.super$_HashMap$_get = _._get$1;
    _.super$_HashMap$_set = _._set$2;
    _ = A.Iterable.prototype;
    _.super$Iterable$where = _.where$1;
    _ = A.Object.prototype;
    _.super$Object$toString = _.toString$0;
    _ = A.Element.prototype;
    _.super$Element$createFragment = _.createFragment$3$treeSanitizer$validator;
    _ = A._SimpleNodeValidator.prototype;
    _.super$_SimpleNodeValidator$allowsAttribute = _.allowsAttribute$3;
    _ = A.JsObject.prototype;
    _.super$JsObject$$index = _.$index;
    _.super$JsObject$$indexSet = _.$indexSet;
    _ = A._JsArray_JsObject_ListMixin.prototype;
    _.super$_JsArray_JsObject_ListMixin$$indexSet = _.$indexSet;
  })();
  (function installTearOffs() {
    var _static_2 = hunkHelpers._static_2,
      _static_1 = hunkHelpers._static_1,
      _static_0 = hunkHelpers._static_0,
      _static = hunkHelpers.installStaticTearOff,
      _instance = hunkHelpers.installInstanceTearOff,
      _instance_2_u = hunkHelpers._instance_2u,
      _instance_1_i = hunkHelpers._instance_1i,
      _instance_0_u = hunkHelpers._instance_0u,
      _instance_1_u = hunkHelpers._instance_1u,
      _instance_0_i = hunkHelpers._instance_0i;
    _static_2(J, "_interceptors_JSArray__compareAny$closure", "JSArray__compareAny", 31);
    _static_1(A, "async__AsyncRun__scheduleImmediateJsOverride$closure", "_AsyncRun__scheduleImmediateJsOverride", 10);
    _static_1(A, "async__AsyncRun__scheduleImmediateWithSetImmediate$closure", "_AsyncRun__scheduleImmediateWithSetImmediate", 10);
    _static_1(A, "async__AsyncRun__scheduleImmediateWithTimer$closure", "_AsyncRun__scheduleImmediateWithTimer", 10);
    _static_0(A, "async___startMicrotaskLoop$closure", "_startMicrotaskLoop", 0);
    _static_1(A, "async___nullDataHandler$closure", "_nullDataHandler", 4);
    _static_2(A, "async___nullErrorHandler$closure", "_nullErrorHandler", 16);
    _static_0(A, "async___nullDoneHandler$closure", "_nullDoneHandler", 0);
    _static(A, "async___rootHandleUncaughtError$closure", 5, null, ["call$5"], ["_rootHandleUncaughtError"], 83, 0);
    _static(A, "async___rootRun$closure", 4, null, ["call$1$4", "call$4"], ["_rootRun", function($self, $parent, zone, f) {
      return A._rootRun($self, $parent, zone, f, type$.dynamic);
    }], 84, 1);
    _static(A, "async___rootRunUnary$closure", 5, null, ["call$2$5", "call$5"], ["_rootRunUnary", function($self, $parent, zone, f, arg) {
      return A._rootRunUnary($self, $parent, zone, f, arg, type$.dynamic, type$.dynamic);
    }], 85, 1);
    _static(A, "async___rootRunBinary$closure", 6, null, ["call$3$6", "call$6"], ["_rootRunBinary", function($self, $parent, zone, f, arg1, arg2) {
      return A._rootRunBinary($self, $parent, zone, f, arg1, arg2, type$.dynamic, type$.dynamic, type$.dynamic);
    }], 86, 1);
    _static(A, "async___rootRegisterCallback$closure", 4, null, ["call$1$4", "call$4"], ["_rootRegisterCallback", function($self, $parent, zone, f) {
      return A._rootRegisterCallback($self, $parent, zone, f, type$.dynamic);
    }], 87, 0);
    _static(A, "async___rootRegisterUnaryCallback$closure", 4, null, ["call$2$4", "call$4"], ["_rootRegisterUnaryCallback", function($self, $parent, zone, f) {
      return A._rootRegisterUnaryCallback($self, $parent, zone, f, type$.dynamic, type$.dynamic);
    }], 88, 0);
    _static(A, "async___rootRegisterBinaryCallback$closure", 4, null, ["call$3$4", "call$4"], ["_rootRegisterBinaryCallback", function($self, $parent, zone, f) {
      return A._rootRegisterBinaryCallback($self, $parent, zone, f, type$.dynamic, type$.dynamic, type$.dynamic);
    }], 89, 0);
    _static(A, "async___rootErrorCallback$closure", 5, null, ["call$5"], ["_rootErrorCallback"], 90, 0);
    _static(A, "async___rootScheduleMicrotask$closure", 4, null, ["call$4"], ["_rootScheduleMicrotask"], 91, 0);
    _static(A, "async___rootCreateTimer$closure", 5, null, ["call$5"], ["_rootCreateTimer"], 92, 0);
    _static(A, "async___rootCreatePeriodicTimer$closure", 5, null, ["call$5"], ["_rootCreatePeriodicTimer"], 93, 0);
    _static(A, "async___rootPrint$closure", 4, null, ["call$4"], ["_rootPrint"], 94, 0);
    _static_1(A, "async___printToZone$closure", "_printToZone", 95);
    _static(A, "async___rootFork$closure", 5, null, ["call$5"], ["_rootFork"], 96, 0);
    _instance(A._Completer.prototype, "get$completeError", 0, 1, function() {
      return [null];
    }, ["call$2", "call$1"], ["completeError$2", "completeError$1"], 15, 0, 0);
    _instance(A._AsyncCompleter.prototype, "get$complete", 1, 0, function() {
      return [null];
    }, ["call$1", "call$0"], ["complete$1", "complete$0"], 34, 0, 0);
    _instance_2_u(A._Future.prototype, "get$_completeError", "_completeError$2", 16);
    var _;
    _instance_1_i(_ = A._StreamController.prototype, "get$add", "add$1", 17);
    _instance(_, "get$addError", 0, 1, function() {
      return [null];
    }, ["call$2", "call$1"], ["addError$2", "addError$1"], 15, 0, 0);
    _instance_0_u(_ = A._ControllerSubscription.prototype, "get$_onPause", "_onPause$0", 0);
    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
    _instance_0_u(_ = A._BufferingStreamSubscription.prototype, "get$_onPause", "_onPause$0", 0);
    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
    _instance_0_u(_ = A._ForwardingStreamSubscription.prototype, "get$_onPause", "_onPause$0", 0);
    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
    _instance_1_u(_, "get$_handleData", "_handleData$1", 17);
    _instance_2_u(_, "get$_handleError", "_handleError$2", 60);
    _instance_0_u(_, "get$_handleDone", "_handleDone$0", 0);
    _static_2(A, "collection___defaultEquals$closure", "_defaultEquals", 12);
    _static_1(A, "collection___defaultHashCode$closure", "_defaultHashCode", 13);
    _static_2(A, "collection_ListMixin__compareAny$closure", "ListMixin__compareAny", 31);
    _static_1(A, "convert___defaultToEncodable$closure", "_defaultToEncodable", 1);
    _static_1(A, "core__identityHashCode$closure", "identityHashCode", 13);
    _static_2(A, "core__identical$closure", "identical", 12);
    _static(A, "html0__Html5NodeValidator__standardAttributeValidator$closure", 4, null, ["call$4"], ["_Html5NodeValidator__standardAttributeValidator"], 14, 0);
    _static(A, "html0__Html5NodeValidator__uriAttributeValidator$closure", 4, null, ["call$4"], ["_Html5NodeValidator__uriAttributeValidator"], 14, 0);
    _instance_0_i(A.Node.prototype, "get$remove", "remove$0", 0);
    _instance_1_i(A.WebSocket.prototype, "get$send", "send$1", 4);
    _static_1(A, "js___convertToJS$closure", "_convertToJS", 27);
    _static_1(A, "js___convertToDart$closure", "_convertToDart", 3);
    _instance_2_u(_ = A.DeepCollectionEquality.prototype, "get$equals", "equals$2", 12);
    _instance_1_i(_, "get$hash", "hash$1", 13);
    _instance_1_u(_, "get$isValidKey", "isValidKey$1", 55);
    _static_2(A, "strongly_connected_components___defaultEquals$closure", "_defaultEquals0", 65);
    _instance_1_u(_ = A.SseClient.prototype, "get$_onIncomingControlMessage", "_onIncomingControlMessage$1", 5);
    _instance_1_u(_, "get$_onIncomingMessage", "_onIncomingMessage$1", 5);
    _instance_0_u(_, "get$_onOutgoingDone", "_onOutgoingDone$0", 0);
    _instance_1_u(_, "get$_onOutgoingMessage", "_onOutgoingMessage$1", 59);
    _instance_1_u(_ = A.RequireRestarter.prototype, "get$_moduleParents", "_moduleParents$1", 76);
    _instance_2_u(_, "get$_moduleTopologicalCompare", "_moduleTopologicalCompare$2", 77);
  })();
  (function inheritance() {
    var _mixin = hunkHelpers.mixin,
      _mixinHard = hunkHelpers.mixinHard,
      _inherit = hunkHelpers.inherit,
      _inheritMany = hunkHelpers.inheritMany;
    _inherit(A.Object, null);
    _inheritMany(A.Object, [A.JS_CONST, J.Interceptor, J.ArrayIterator, A.Iterable, A.CastIterator, A.Closure, A.MapMixin, A.Error, A.SentinelValue, A.ListIterator, A.Iterator, A.EmptyIterator, A.FixedLengthListMixin, A.UnmodifiableListMixin, A._ListBase_Object_ListMixin, A.Symbol, A.MapView, A.ConstantMap, A.JSInvocationMirror, A.TypeErrorDecoder, A.NullThrownFromJavaScriptException, A.ExceptionAndStackTrace, A._StackTrace, A._Required, A.LinkedHashMapCell, A.LinkedHashMapKeyIterator, A.JSSyntaxRegExp, A._MatchImplementation, A._AllMatchesIterator, A.StringMatch, A._StringAllMatchesIterator, A._Cell, A.Rti, A._FunctionParameters, A._Type, A._TimerImpl, A._AsyncAwaitCompleter, A.AsyncError, A._Completer, A._FutureListener, A._Future, A._AsyncCallbackEntry, A.Stream, A.StreamSubscription, A.StreamTransformerBase, A._StreamController, A._SyncStreamControllerDispatch, A._AsyncStreamControllerDispatch, A._BufferingStreamSubscription, A._StreamSinkWrapper, A._DelayedEvent, A._DelayedDone, A._PendingEvents, A._StreamIterator, A._ZoneFunction, A._RunNullaryZoneFunction, A._RunUnaryZoneFunction, A._RunBinaryZoneFunction, A._RegisterNullaryZoneFunction, A._RegisterUnaryZoneFunction, A._RegisterBinaryZoneFunction, A._ZoneSpecification, A._ZoneDelegate, A._Zone, A._HashMapKeyIterator, A.__SetBase_Object_SetMixin, A._HashSetIterator, A._LinkedHashSetCell, A._LinkedHashSetIterator, A.IterableMixin, A.ListMixin, A._UnmodifiableMapMixin, A._ListQueueIterator, A.SetMixin, A._SplayTreeNode, A._SplayTree, A._SplayTreeIterator, A.Codec, A._JsonStringifier, A._Utf8Encoder, A._BigIntImpl, A.DateTime, A.Duration, A.OutOfMemoryError, A.StackOverflowError, A._Exception, A.FormatException, A.IntegerDivisionByZeroException, A.Expando, A.Null, A._StringStackTrace, A.StringBuffer, A._Uri, A.UriData, A._SimpleUri, A.CssStyleDeclarationBase, A.EventStreamProvider, A._Html5NodeValidator, A.ImmutableListMixin, A.NodeValidatorBuilder, A._SimpleNodeValidator, A._SvgNodeValidator, A.FixedSizeListIterator, A._DOMWindowCrossFrame, A._SameOriginUriPolicy, A._ValidatingTreeSanitizer, A._StructuredClone, A._AcceptStructuredClone, A.JsObject, A.NullRejectionException, A._JSRandom, A._Random, A.AsyncMemoizer, A.DelegatingStreamSink, A.CopyOnWriteList, A.BuiltList, A.ListBuilder, A.BuiltListMultimap, A.ListMultimapBuilder, A.BuiltMap, A.MapBuilder, A.BuiltSet, A.SetBuilder, A.BuiltSetMultimap, A.SetMultimapBuilder, A.EnumClass, A.IndentingBuiltValueToStringHelper, A.JsonObject, A.FullType, A.BigIntSerializer, A.BoolSerializer, A.BuiltJsonSerializers, A.BuiltJsonSerializersBuilder, A.BuiltListMultimapSerializer, A.BuiltListSerializer, A.BuiltMapSerializer, A.BuiltSetMultimapSerializer, A.BuiltSetSerializer, A.DateTimeSerializer, A.DoubleSerializer, A.DurationSerializer, A.Int64Serializer, A.IntSerializer, A.JsonObjectSerializer, A.NullSerializer, A.NumSerializer, A.RegExpSerializer, A.StringSerializer, A.UriSerializer, A.DefaultEquality, A.IterableEquality, A.ListEquality, A._UnorderedEquality, A._MapEntry, A.MapEquality, A.DeepCollectionEquality, A.BuildResult, A._$BuildStatusSerializer, A._$BuildResultSerializer, A.BuildResultBuilder, A.ConnectRequest, A._$ConnectRequestSerializer, A.ConnectRequestBuilder, A.DebugEvent, A._$DebugEventSerializer, A.DebugEventBuilder, A.DevToolsRequest, A.DevToolsResponse, A._$DevToolsRequestSerializer, A._$DevToolsResponseSerializer, A.DevToolsRequestBuilder, A.DevToolsResponseBuilder, A.ErrorResponse, A._$ErrorResponseSerializer, A.ErrorResponseBuilder, A.ExtensionRequest, A.ExtensionResponse, A.ExtensionEvent, A.BatchedEvents, A._$ExtensionRequestSerializer, A._$ExtensionResponseSerializer, A._$ExtensionEventSerializer, A._$BatchedEventsSerializer, A.ExtensionRequestBuilder, A.ExtensionResponseBuilder, A.ExtensionEventBuilder, A.BatchedEventsBuilder, A.IsolateExit, A.IsolateStart, A._$IsolateExitSerializer, A._$IsolateStartSerializer, A.IsolateExitBuilder, A.IsolateStartBuilder, A.RegisterEvent, A._$RegisterEventSerializer, A.RegisterEventBuilder, A.RunRequest, A._$RunRequestSerializer, A.SocketClient, A.Int64, A.Level, A.LogRecord, A.Logger, A.Pool, A.PoolResource, A.StreamChannelMixin, A._GuaranteeSink, A.StreamChannelController, A.Uuid, A.WebSocketChannelException, A.LegacyRestarter, A.ReloadingManager, A.HotReloadFailedException, A.RequireRestarter]);
    _inheritMany(J.Interceptor, [J.JSBool, J.JSNull, J.JavaScriptObject, J.JSArray, J.JSNumber, J.JSString, A.NativeByteBuffer, A.NativeTypedData, A.EventTarget, A.AccessibleNodeList, A.Blob, A.Event, A.CssTransformComponent, A.CssRule, A._CssStyleDeclaration_Interceptor_CssStyleDeclarationBase, A.CssStyleValue, A.DataTransferItemList, A.DomException, A.DomImplementation, A._DomRectList_Interceptor_ListMixin, A.DomRectReadOnly, A._DomStringList_Interceptor_ListMixin, A.DomTokenList, A._FileList_Interceptor_ListMixin, A.Gamepad, A.History, A._HtmlCollection_Interceptor_ListMixin, A.ImageData, A.Location, A.MediaList, A._MidiInputMap_Interceptor_MapMixin, A._MidiOutputMap_Interceptor_MapMixin, A.MimeType, A._MimeTypeArray_Interceptor_ListMixin, A._NodeList_Interceptor_ListMixin, A.Plugin, A._PluginArray_Interceptor_ListMixin, A._RtcStatsReport_Interceptor_MapMixin, A.SpeechGrammar, A._SpeechGrammarList_Interceptor_ListMixin, A.SpeechRecognitionResult, A._Storage_Interceptor_MapMixin, A.StyleSheet, A._TextTrackCueList_Interceptor_ListMixin, A.TimeRanges, A.Touch, A._TouchList_Interceptor_ListMixin, A.TrackDefaultList, A.Url, A.__CssRuleList_Interceptor_ListMixin, A.__GamepadList_Interceptor_ListMixin, A.__NamedNodeMap_Interceptor_ListMixin, A.__SpeechRecognitionResultList_Interceptor_ListMixin, A.__StyleSheetList_Interceptor_ListMixin, A.KeyRange, A.Length, A._LengthList_Interceptor_ListMixin, A.Number, A._NumberList_Interceptor_ListMixin, A.PointList, A._StringList_Interceptor_ListMixin, A.Transform, A._TransformList_Interceptor_ListMixin, A.AudioBuffer, A._AudioParamMap_Interceptor_MapMixin]);
    _inheritMany(J.JavaScriptObject, [J.PlainJavaScriptObject, J.UnknownJavaScriptObject, J.JavaScriptFunction, A.Promise, A.RequireLoader, A.JsError, A.JsMap]);
    _inherit(J.JSUnmodifiableArray, J.JSArray);
    _inheritMany(J.JSNumber, [J.JSInt, J.JSNumNotInt]);
    _inheritMany(A.Iterable, [A._CastIterableBase, A.EfficientLengthIterable, A.MappedIterable, A.WhereIterable, A.SkipIterable, A._ConstantMapKeyIterable, A.IterableBase, A._StringAllMatchesIterable]);
    _inheritMany(A._CastIterableBase, [A.CastIterable, A.__CastListBase__CastIterableBase_ListMixin]);
    _inherit(A._EfficientLengthCastIterable, A.CastIterable);
    _inherit(A._CastListBase, A.__CastListBase__CastIterableBase_ListMixin);
    _inheritMany(A.Closure, [A.Closure2Args, A.Closure0Args, A.TearOffClosure, A.initHooks_closure, A.initHooks_closure1, A._AsyncRun__initializeScheduleImmediate_internalCallback, A._AsyncRun__initializeScheduleImmediate_closure, A._awaitOnObject_closure, A._Future__chainForeignFuture_closure, A._Future__propagateToListeners_handleWhenCompleteCallback_closure, A.Stream_length_closure, A.Stream_first_closure0, A._CustomZone_bindUnaryCallback_closure, A._CustomZone_bindUnaryCallbackGuarded_closure, A._RootZone_bindUnaryCallback_closure, A._RootZone_bindUnaryCallbackGuarded_closure, A.runZonedGuarded_closure, A._CustomHashMap_closure, A._LinkedCustomHashMap_closure, A.SplayTreeSet_closure, A._BigIntImpl_hashCode_finish, A.Uri_parseIPv6Address_error, A._Uri__makePath_closure, A._createTables_setChars, A._createTables_setRange, A.Element_Element$html_closure, A.HttpRequest_request_closure, A._EventStreamSubscription_closure, A._EventStreamSubscription_onData_closure, A.NodeValidatorBuilder_allowsElement_closure, A.NodeValidatorBuilder_allowsAttribute_closure, A._SimpleNodeValidator_closure, A._SimpleNodeValidator_closure0, A._TemplatingNodeValidator_closure, A._convertDartToNative_Value_closure, A.JsObject__convertDataTree__convert, A._convertToJS_closure, A._convertToJS_closure0, A._wrapToDart_closure, A._wrapToDart_closure0, A._wrapToDart_closure1, A.promiseToFuture_closure, A.promiseToFuture_closure0, A.BuiltListMultimap_BuiltListMultimap_closure, A.BuiltListMultimap_hashCode_closure, A.ListMultimapBuilder_replace_closure, A.BuiltMap_BuiltMap_closure, A.BuiltMap_hashCode_closure, A.BuiltSet_hashCode_closure, A.BuiltSetMultimap_hashCode_closure, A.SetMultimapBuilder_replace_closure, A.newBuiltValueToStringHelper_closure, A.BuiltListMultimapSerializer_serialize_closure, A.BuiltListMultimapSerializer_deserialize_closure, A.BuiltListSerializer_serialize_closure, A.BuiltListSerializer_deserialize_closure, A.BuiltSetMultimapSerializer_serialize_closure, A.BuiltSetMultimapSerializer_deserialize_closure, A.BuiltSetSerializer_serialize_closure, A.BuiltSetSerializer_deserialize_closure, A.WebSocketClient_stream_closure, A.stronglyConnectedComponents_strongConnect, A.Pool__runOnRelease_closure, A.SseClient_closure0, A.SseClient_closure1, A.generateUuidV4__generateBits, A._GuaranteeSink__addError_closure, A.HtmlWebSocketChannel_closure, A.HtmlWebSocketChannel_closure0, A.HtmlWebSocketChannel_closure1, A.HtmlWebSocketChannel_closure2, A.main__closure, A.main___closure1, A.main__closure1, A.main___closure0, A.main___closure, A.main__closure3, A.main__closure4, A.main__closure5, A.main__closure6, A.LegacyRestarter_restart_closure, A.RequireRestarter__reloadModule_closure0]);
    _inheritMany(A.Closure2Args, [A._CastListBase_sort_closure, A.CastMap_forEach_closure, A.ConstantMap_map_closure, A.Primitives_functionNoSuchMethod_closure, A.JsLinkedHashMap_addAll_closure, A.initHooks_closure0, A._awaitOnObject_closure0, A._wrapJsFunctionForAsync_closure, A._Future__chainForeignFuture_closure0, A._BufferingStreamSubscription_asFuture_closure0, A.LinkedHashMap_LinkedHashMap$from_closure, A.MapBase_mapToString_closure, A._JsonStringifier_writeMap_closure, A._symbolMapToStringMap_closure, A.NoSuchMethodError_toString_closure, A._BigIntImpl_hashCode_combine, A.Uri__parseIPv4Address_error, A.Uri_parseIPv6Address_parseHex, A._createTables_build, A.MidiInputMap_keys_closure, A.MidiOutputMap_keys_closure, A.RtcStatsReport_keys_closure, A.Storage_keys_closure, A._ValidatingTreeSanitizer_sanitizeTree_walk, A._StructuredClone_walk_closure, A._StructuredClone_walk_closure0, A._AcceptStructuredClone_walk_closure, A.convertDartToNative_Dictionary_closure, A.AudioParamMap_keys_closure, A.hashObjects_closure, A.MapBuilder_replace_closure, A.Pool__runOnRelease_closure0, A.generateUuidV4__printDigits, A.generateUuidV4__bitsDigits, A.main__closure0, A.main_closure0, A.toPromise_closure]);
    _inherit(A.CastList, A._CastListBase);
    _inherit(A.MapBase, A.MapMixin);
    _inheritMany(A.MapBase, [A.CastMap, A.JsLinkedHashMap, A._HashMap, A._JsonMap, A._AttributeMap]);
    _inheritMany(A.Error, [A.LateError, A.ReachabilityError, A.NotNullableError, A.TypeError, A.JsNoSuchMethodError, A.UnknownJsTypeError, A.RuntimeError, A.AssertionError, A._Error, A.JsonUnsupportedObjectError, A.NullThrownError, A.ArgumentError, A.NoSuchMethodError, A.UnsupportedError, A.UnimplementedError, A.StateError, A.ConcurrentModificationError, A.CyclicInitializationError, A.BuiltValueNullFieldError, A.BuiltValueNestedFieldError, A.DeserializationError]);
    _inheritMany(A.Closure0Args, [A.nullFuture_closure, A._AsyncRun__scheduleImmediateJsOverride_internalCallback, A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, A._TimerImpl_internalCallback, A._TimerImpl$periodic_closure, A.Future_Future$microtask_closure, A._Future__addListener_closure, A._Future__prependListeners_closure, A._Future__chainForeignFuture_closure1, A._Future__asyncCompleteWithValue_closure, A._Future__chainFuture_closure, A._Future__asyncCompleteError_closure, A._Future__propagateToListeners_handleWhenCompleteCallback, A._Future__propagateToListeners_handleValueCallback, A._Future__propagateToListeners_handleError, A.Stream_length_closure0, A.Stream_first_closure, A._StreamController__subscribe_closure, A._StreamController__recordCancel_complete, A._BufferingStreamSubscription_asFuture_closure, A._BufferingStreamSubscription_asFuture__closure, A._BufferingStreamSubscription__sendError_sendError, A._BufferingStreamSubscription__sendDone_sendDone, A._PendingEvents_schedule_closure, A._cancelAndValue_closure, A._CustomZone_bindCallback_closure, A._CustomZone_bindCallbackGuarded_closure, A._rootHandleError_closure, A._RootZone_bindCallback_closure, A._RootZone_bindCallbackGuarded_closure, A.Serializers_Serializers_closure, A.Serializers_Serializers_closure0, A.Serializers_Serializers_closure1, A.Serializers_Serializers_closure2, A.Serializers_Serializers_closure3, A._$serializers_closure, A.Logger_Logger_closure, A.SseClient_closure, A.SseClient__closure, A.SseClient__onOutgoingMessage_closure, A.GuaranteeChannel_closure, A.GuaranteeChannel__closure, A.HtmlWebSocketChannel__listen_closure, A.main_closure, A.main__closure2, A.RequireRestarter__reload_closure, A.RequireRestarter__reloadModule_closure, A._createScript_closure, A._createScript__closure, A._createScript__closure0]);
    _inheritMany(A.EfficientLengthIterable, [A.ListIterable, A.EmptyIterable, A.LinkedHashMapKeyIterable, A._HashMapKeyIterable]);
    _inheritMany(A.ListIterable, [A.SubListIterable, A.MappedListIterable, A.ReversedListIterable, A.ListQueue, A._JsonMapKeyIterable]);
    _inherit(A.EfficientLengthMappedIterable, A.MappedIterable);
    _inheritMany(A.Iterator, [A.MappedIterator, A.WhereIterator, A.SkipIterator]);
    _inherit(A.EfficientLengthSkipIterable, A.SkipIterable);
    _inherit(A.ListBase, A._ListBase_Object_ListMixin);
    _inheritMany(A.ListBase, [A.UnmodifiableListBase, A._FrozenElementList, A._ChildNodeListLazy]);
    _inherit(A._UnmodifiableMapView_MapView__UnmodifiableMapMixin, A.MapView);
    _inherit(A.UnmodifiableMapView, A._UnmodifiableMapView_MapView__UnmodifiableMapMixin);
    _inherit(A.ConstantMapView, A.UnmodifiableMapView);
    _inherit(A.ConstantStringMap, A.ConstantMap);
    _inherit(A.NullError, A.TypeError);
    _inheritMany(A.TearOffClosure, [A.StaticClosure, A.BoundClosure]);
    _inherit(A._AssertionError, A.AssertionError);
    _inherit(A._AllMatchesIterable, A.IterableBase);
    _inheritMany(A.NativeTypedData, [A.NativeByteData, A.NativeTypedArray]);
    _inheritMany(A.NativeTypedArray, [A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin, A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin]);
    _inherit(A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin, A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin);
    _inherit(A.NativeTypedArrayOfDouble, A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin);
    _inherit(A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin, A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin);
    _inherit(A.NativeTypedArrayOfInt, A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin);
    _inheritMany(A.NativeTypedArrayOfDouble, [A.NativeFloat32List, A.NativeFloat64List]);
    _inheritMany(A.NativeTypedArrayOfInt, [A.NativeInt16List, A.NativeInt32List, A.NativeInt8List, A.NativeUint16List, A.NativeUint32List, A.NativeUint8ClampedList, A.NativeUint8List]);
    _inherit(A._TypeError, A._Error);
    _inheritMany(A._Completer, [A._AsyncCompleter, A._SyncCompleter]);
    _inheritMany(A._StreamController, [A._AsyncStreamController, A._SyncStreamController]);
    _inheritMany(A.Stream, [A._StreamImpl, A._ForwardingStream, A._EventStream]);
    _inherit(A._ControllerStream, A._StreamImpl);
    _inheritMany(A._BufferingStreamSubscription, [A._ControllerSubscription, A._ForwardingStreamSubscription]);
    _inheritMany(A._DelayedEvent, [A._DelayedData, A._DelayedError]);
    _inherit(A._StreamImplEvents, A._PendingEvents);
    _inherit(A._MapStream, A._ForwardingStream);
    _inheritMany(A._Zone, [A._CustomZone, A._RootZone]);
    _inheritMany(A._HashMap, [A._IdentityHashMap, A._CustomHashMap]);
    _inheritMany(A.JsLinkedHashMap, [A._LinkedIdentityHashMap, A._LinkedCustomHashMap]);
    _inherit(A._SetBase, A.__SetBase_Object_SetMixin);
    _inheritMany(A._SetBase, [A._HashSet, A._LinkedHashSet]);
    _inherit(A.UnmodifiableListView, A.UnmodifiableListBase);
    _inherit(A._SplayTreeSetNode, A._SplayTreeNode);
    _inherit(A._SplayTreeKeyIterator, A._SplayTreeIterator);
    _inherit(A._SplayTreeSet__SplayTree_IterableMixin, A._SplayTree);
    _inherit(A._SplayTreeSet__SplayTree_IterableMixin_SetMixin, A._SplayTreeSet__SplayTree_IterableMixin);
    _inherit(A.SplayTreeSet, A._SplayTreeSet__SplayTree_IterableMixin_SetMixin);
    _inheritMany(A.Codec, [A.Base64Codec, A.Encoding, A.JsonCodec]);
    _inherit(A.Converter, A.StreamTransformerBase);
    _inheritMany(A.Converter, [A.Base64Encoder, A.JsonEncoder, A.JsonDecoder, A.Utf8Encoder]);
    _inherit(A.JsonCyclicError, A.JsonUnsupportedObjectError);
    _inherit(A._JsonStringStringifier, A._JsonStringifier);
    _inherit(A.Utf8Codec, A.Encoding);
    _inheritMany(A.ArgumentError, [A.RangeError, A.IndexError]);
    _inherit(A._DataUri, A._Uri);
    _inheritMany(A.EventTarget, [A.Node, A.EventSource, A.FileWriter, A.HttpRequestEventTarget, A.MessagePort, A.SourceBuffer, A._SourceBufferList_EventTarget_ListMixin, A.TextTrack, A.TextTrackCue, A._TextTrackList_EventTarget_ListMixin, A.VideoTrackList, A.WebSocket, A.Window, A.WorkerGlobalScope, A.AudioTrackList, A.BaseAudioContext]);
    _inheritMany(A.Node, [A.Element, A.CharacterData, A.Document, A._Attr]);
    _inheritMany(A.Element, [A.HtmlElement, A.SvgElement]);
    _inheritMany(A.HtmlElement, [A.AnchorElement, A.AreaElement, A.BaseElement, A.BodyElement, A.FormElement, A.ScriptElement, A.SelectElement, A.TableElement, A.TableRowElement, A.TableSectionElement, A.TemplateElement]);
    _inheritMany(A.Event, [A.CloseEvent, A.CustomEvent, A.UIEvent, A.MessageEvent, A.ProgressEvent]);
    _inherit(A.CssPerspective, A.CssTransformComponent);
    _inherit(A.CssStyleDeclaration, A._CssStyleDeclaration_Interceptor_CssStyleDeclarationBase);
    _inheritMany(A.CssStyleValue, [A.CssTransformValue, A.CssUnparsedValue]);
    _inherit(A._DomRectList_Interceptor_ListMixin_ImmutableListMixin, A._DomRectList_Interceptor_ListMixin);
    _inherit(A.DomRectList, A._DomRectList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A._DomStringList_Interceptor_ListMixin_ImmutableListMixin, A._DomStringList_Interceptor_ListMixin);
    _inherit(A.DomStringList, A._DomStringList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A.File, A.Blob);
    _inherit(A._FileList_Interceptor_ListMixin_ImmutableListMixin, A._FileList_Interceptor_ListMixin);
    _inherit(A.FileList, A._FileList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A._HtmlCollection_Interceptor_ListMixin_ImmutableListMixin, A._HtmlCollection_Interceptor_ListMixin);
    _inherit(A.HtmlCollection, A._HtmlCollection_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A.HtmlDocument, A.Document);
    _inherit(A.HttpRequest, A.HttpRequestEventTarget);
    _inherit(A.KeyboardEvent, A.UIEvent);
    _inherit(A.MidiInputMap, A._MidiInputMap_Interceptor_MapMixin);
    _inherit(A.MidiOutputMap, A._MidiOutputMap_Interceptor_MapMixin);
    _inherit(A._MimeTypeArray_Interceptor_ListMixin_ImmutableListMixin, A._MimeTypeArray_Interceptor_ListMixin);
    _inherit(A.MimeTypeArray, A._MimeTypeArray_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A._NodeList_Interceptor_ListMixin_ImmutableListMixin, A._NodeList_Interceptor_ListMixin);
    _inherit(A.NodeList, A._NodeList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A._PluginArray_Interceptor_ListMixin_ImmutableListMixin, A._PluginArray_Interceptor_ListMixin);
    _inherit(A.PluginArray, A._PluginArray_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A.RtcStatsReport, A._RtcStatsReport_Interceptor_MapMixin);
    _inherit(A._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin, A._SourceBufferList_EventTarget_ListMixin);
    _inherit(A.SourceBufferList, A._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin);
    _inherit(A._SpeechGrammarList_Interceptor_ListMixin_ImmutableListMixin, A._SpeechGrammarList_Interceptor_ListMixin);
    _inherit(A.SpeechGrammarList, A._SpeechGrammarList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A.Storage, A._Storage_Interceptor_MapMixin);
    _inherit(A._TextTrackCueList_Interceptor_ListMixin_ImmutableListMixin, A._TextTrackCueList_Interceptor_ListMixin);
    _inherit(A.TextTrackCueList, A._TextTrackCueList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A._TextTrackList_EventTarget_ListMixin_ImmutableListMixin, A._TextTrackList_EventTarget_ListMixin);
    _inherit(A.TextTrackList, A._TextTrackList_EventTarget_ListMixin_ImmutableListMixin);
    _inherit(A._TouchList_Interceptor_ListMixin_ImmutableListMixin, A._TouchList_Interceptor_ListMixin);
    _inherit(A.TouchList, A._TouchList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A.__CssRuleList_Interceptor_ListMixin_ImmutableListMixin, A.__CssRuleList_Interceptor_ListMixin);
    _inherit(A._CssRuleList, A.__CssRuleList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A._DomRect, A.DomRectReadOnly);
    _inherit(A.__GamepadList_Interceptor_ListMixin_ImmutableListMixin, A.__GamepadList_Interceptor_ListMixin);
    _inherit(A._GamepadList, A.__GamepadList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A.__NamedNodeMap_Interceptor_ListMixin_ImmutableListMixin, A.__NamedNodeMap_Interceptor_ListMixin);
    _inherit(A._NamedNodeMap, A.__NamedNodeMap_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A.__SpeechRecognitionResultList_Interceptor_ListMixin_ImmutableListMixin, A.__SpeechRecognitionResultList_Interceptor_ListMixin);
    _inherit(A._SpeechRecognitionResultList, A.__SpeechRecognitionResultList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A.__StyleSheetList_Interceptor_ListMixin_ImmutableListMixin, A.__StyleSheetList_Interceptor_ListMixin);
    _inherit(A._StyleSheetList, A.__StyleSheetList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A._ElementAttributeMap, A._AttributeMap);
    _inherit(A._EventStreamSubscription, A.StreamSubscription);
    _inherit(A._TemplatingNodeValidator, A._SimpleNodeValidator);
    _inherit(A._StructuredCloneDart2Js, A._StructuredClone);
    _inherit(A._AcceptStructuredCloneDart2Js, A._AcceptStructuredClone);
    _inheritMany(A.JsObject, [A.JsFunction, A._JsArray_JsObject_ListMixin]);
    _inherit(A.JsArray, A._JsArray_JsObject_ListMixin);
    _inherit(A._LengthList_Interceptor_ListMixin_ImmutableListMixin, A._LengthList_Interceptor_ListMixin);
    _inherit(A.LengthList, A._LengthList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A._NumberList_Interceptor_ListMixin_ImmutableListMixin, A._NumberList_Interceptor_ListMixin);
    _inherit(A.NumberList, A._NumberList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A.ScriptElement0, A.SvgElement);
    _inherit(A._StringList_Interceptor_ListMixin_ImmutableListMixin, A._StringList_Interceptor_ListMixin);
    _inherit(A.StringList, A._StringList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A._TransformList_Interceptor_ListMixin_ImmutableListMixin, A._TransformList_Interceptor_ListMixin);
    _inherit(A.TransformList, A._TransformList_Interceptor_ListMixin_ImmutableListMixin);
    _inherit(A.AudioParamMap, A._AudioParamMap_Interceptor_MapMixin);
    _inherit(A.OfflineAudioContext, A.BaseAudioContext);
    _inherit(A._BuiltList, A.BuiltList);
    _inherit(A._BuiltListMultimap, A.BuiltListMultimap);
    _inherit(A._BuiltMap, A.BuiltMap);
    _inherit(A._BuiltSet, A.BuiltSet);
    _inherit(A._BuiltSetMultimap, A.BuiltSetMultimap);
    _inheritMany(A.JsonObject, [A.BoolJsonObject, A.ListJsonObject, A.MapJsonObject, A.NumJsonObject, A.StringJsonObject]);
    _inherit(A.SetEquality, A._UnorderedEquality);
    _inherit(A.BuildStatus, A.EnumClass);
    _inherit(A._$BuildResult, A.BuildResult);
    _inherit(A._$ConnectRequest, A.ConnectRequest);
    _inherit(A._$DebugEvent, A.DebugEvent);
    _inherit(A._$DevToolsRequest, A.DevToolsRequest);
    _inherit(A._$DevToolsResponse, A.DevToolsResponse);
    _inherit(A._$ErrorResponse, A.ErrorResponse);
    _inherit(A._$ExtensionRequest, A.ExtensionRequest);
    _inherit(A._$ExtensionResponse, A.ExtensionResponse);
    _inherit(A._$ExtensionEvent, A.ExtensionEvent);
    _inherit(A._$BatchedEvents, A.BatchedEvents);
    _inherit(A._$IsolateExit, A.IsolateExit);
    _inherit(A._$IsolateStart, A.IsolateStart);
    _inherit(A._$RegisterEvent, A.RegisterEvent);
    _inherit(A._$RunRequest, A.RunRequest);
    _inheritMany(A.SocketClient, [A.SseSocketClient, A.WebSocketClient]);
    _inheritMany(A.StreamChannelMixin, [A.SseClient, A.GuaranteeChannel, A.HtmlWebSocketChannel, A.WebSocketChannel]);
    _inherit(A._HtmlWebSocketSink, A.DelegatingStreamSink);
    _mixin(A.UnmodifiableListBase, A.UnmodifiableListMixin);
    _mixin(A.__CastListBase__CastIterableBase_ListMixin, A.ListMixin);
    _mixin(A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin, A.ListMixin);
    _mixin(A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin, A.FixedLengthListMixin);
    _mixin(A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin, A.ListMixin);
    _mixin(A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin, A.FixedLengthListMixin);
    _mixin(A._AsyncStreamController, A._AsyncStreamControllerDispatch);
    _mixin(A._SyncStreamController, A._SyncStreamControllerDispatch);
    _mixin(A._ListBase_Object_ListMixin, A.ListMixin);
    _mixin(A._SplayTreeSet__SplayTree_IterableMixin, A.IterableMixin);
    _mixin(A._SplayTreeSet__SplayTree_IterableMixin_SetMixin, A.SetMixin);
    _mixin(A._UnmodifiableMapView_MapView__UnmodifiableMapMixin, A._UnmodifiableMapMixin);
    _mixin(A.__SetBase_Object_SetMixin, A.SetMixin);
    _mixin(A._CssStyleDeclaration_Interceptor_CssStyleDeclarationBase, A.CssStyleDeclarationBase);
    _mixin(A._DomRectList_Interceptor_ListMixin, A.ListMixin);
    _mixin(A._DomRectList_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._DomStringList_Interceptor_ListMixin, A.ListMixin);
    _mixin(A._DomStringList_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._FileList_Interceptor_ListMixin, A.ListMixin);
    _mixin(A._FileList_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._HtmlCollection_Interceptor_ListMixin, A.ListMixin);
    _mixin(A._HtmlCollection_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._MidiInputMap_Interceptor_MapMixin, A.MapMixin);
    _mixin(A._MidiOutputMap_Interceptor_MapMixin, A.MapMixin);
    _mixin(A._MimeTypeArray_Interceptor_ListMixin, A.ListMixin);
    _mixin(A._MimeTypeArray_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._NodeList_Interceptor_ListMixin, A.ListMixin);
    _mixin(A._NodeList_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._PluginArray_Interceptor_ListMixin, A.ListMixin);
    _mixin(A._PluginArray_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._RtcStatsReport_Interceptor_MapMixin, A.MapMixin);
    _mixin(A._SourceBufferList_EventTarget_ListMixin, A.ListMixin);
    _mixin(A._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._SpeechGrammarList_Interceptor_ListMixin, A.ListMixin);
    _mixin(A._SpeechGrammarList_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._Storage_Interceptor_MapMixin, A.MapMixin);
    _mixin(A._TextTrackCueList_Interceptor_ListMixin, A.ListMixin);
    _mixin(A._TextTrackCueList_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._TextTrackList_EventTarget_ListMixin, A.ListMixin);
    _mixin(A._TextTrackList_EventTarget_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._TouchList_Interceptor_ListMixin, A.ListMixin);
    _mixin(A._TouchList_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A.__CssRuleList_Interceptor_ListMixin, A.ListMixin);
    _mixin(A.__CssRuleList_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A.__GamepadList_Interceptor_ListMixin, A.ListMixin);
    _mixin(A.__GamepadList_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A.__NamedNodeMap_Interceptor_ListMixin, A.ListMixin);
    _mixin(A.__NamedNodeMap_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A.__SpeechRecognitionResultList_Interceptor_ListMixin, A.ListMixin);
    _mixin(A.__SpeechRecognitionResultList_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A.__StyleSheetList_Interceptor_ListMixin, A.ListMixin);
    _mixin(A.__StyleSheetList_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixinHard(A._JsArray_JsObject_ListMixin, A.ListMixin);
    _mixin(A._LengthList_Interceptor_ListMixin, A.ListMixin);
    _mixin(A._LengthList_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._NumberList_Interceptor_ListMixin, A.ListMixin);
    _mixin(A._NumberList_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._StringList_Interceptor_ListMixin, A.ListMixin);
    _mixin(A._StringList_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._TransformList_Interceptor_ListMixin, A.ListMixin);
    _mixin(A._TransformList_Interceptor_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._AudioParamMap_Interceptor_MapMixin, A.MapMixin);
  })();
  var init = {
    typeUniverse: {eC: new Map(), tR: {}, eT: {}, tPV: {}, sEA: []},
    mangledGlobalNames: {int: "int", double: "double", num: "num", String: "String", bool: "bool", Null: "Null", List: "List"},
    mangledNames: {},
    types: ["~()", "@(@)", "Null()", "Object?(@)", "~(@)", "~(Event)", "~(String,@)", "Null(@)", "~(@,@)", "Null(Object,StackTrace)", "~(~())", "bool(@)", "bool(Object?,Object?)", "int(Object?)", "bool(Element,String,String,_Html5NodeValidator)", "~(Object[StackTrace?])", "~(Object,StackTrace)", "~(Object?)", "~(Object?,Object?)", "~(Symbol0,@)", "int(int,int)", "int(int)", "String(String)", "~(Uint8List,String,int)", "Future<Null>()", "bool(NodeValidator)", "bool(String)", "Object?(Object?)", "String(int,int)", "Null(Event)", "ScriptElement*()", "int(@,@)", "~(String,String)", "@(String)", "~([Object?])", "@(@,String)", "Null(~())", "~(Node,Node?)", "Null(@,@)", "@(@,@)", "@(Object?)", "JsFunction(@)", "JsArray<@>(@)", "JsObject(@)", "int(int,@)", "IndentingBuiltValueToStringHelper(String)", "ListBuilder<Object>()", "ListMultimapBuilder<Object,Object>()", "MapBuilder<Object,Object>()", "SetBuilder<Object>()", "SetMultimapBuilder<Object,Object>()", "Null(@,StackTrace)", "~(int,@)", "~(String,int)", "~(String[@])", "bool(Object?)", "ListBuilder<ExtensionEvent*>*()", "String*(@)", "Logger()", "~(String?)", "~(@,StackTrace)", "Uint8List(@,@)", "~(MessageEvent)", "Null(CloseEvent)", "Future<Null>*()", "bool(Object,Object)", "Null(String*,String*)", "DebugEventBuilder*(DebugEventBuilder*)", "Null(String*)", "RegisterEventBuilder*(RegisterEventBuilder*)", "DevToolsRequestBuilder*(DevToolsRequestBuilder*)", "Future<Null>*(String*)", "Null(Event*)", "ConnectRequestBuilder*(ConnectRequestBuilder*)", "Null(Object*,StackTrace*)", "Null(MessageEvent*)", "List<String*>*(String*)", "int*(String*,String*)", "~(JsError*)", "ScriptElement*()*()", "~(Zone,ZoneDelegate,Zone,Object,StackTrace)", "bool(Node)", "Promise<1&>*(String*)", "~(Zone?,ZoneDelegate?,Zone,Object,StackTrace)", "0^(Zone?,ZoneDelegate?,Zone,0^())<Object?>", "0^(Zone?,ZoneDelegate?,Zone,0^(1^),1^)<Object?Object?>", "0^(Zone?,ZoneDelegate?,Zone,0^(1^,2^),1^,2^)<Object?Object?Object?>", "0^()(Zone,ZoneDelegate,Zone,0^())<Object?>", "0^(1^)(Zone,ZoneDelegate,Zone,0^(1^))<Object?Object?>", "0^(1^,2^)(Zone,ZoneDelegate,Zone,0^(1^,2^))<Object?Object?Object?>", "AsyncError?(Zone,ZoneDelegate,Zone,Object,StackTrace?)", "~(Zone?,ZoneDelegate?,Zone,~())", "Timer(Zone,ZoneDelegate,Zone,Duration,~())", "Timer(Zone,ZoneDelegate,Zone,Duration,~(Timer))", "~(Zone,ZoneDelegate,Zone,String)", "~(String)", "Zone(Zone?,ZoneDelegate?,Zone,ZoneSpecification?,Map<Object?,Object?>?)", "~(ProgressEvent)", "_Future<@>(@)"],
    interceptorsByTag: null,
    leafTags: null,
    arrayRti: Symbol("$ti")
  };
  A._Universe_addRules(init.typeUniverse, JSON.parse('{"PlainJavaScriptObject":"JavaScriptObject","UnknownJavaScriptObject":"JavaScriptObject","JavaScriptFunction":"JavaScriptObject","Promise":"JavaScriptObject","JsError":"JavaScriptObject","RequireLoader":"JavaScriptObject","JsMap":"JavaScriptObject","AbortPaymentEvent":"Event","ExtendableEvent":"Event","AudioContext":"BaseAudioContext","AbsoluteOrientationSensor":"EventTarget","OrientationSensor":"EventTarget","Sensor":"EventTarget","AElement":"SvgElement","GraphicsElement":"SvgElement","_ResourceProgressEvent":"ProgressEvent","AudioElement":"HtmlElement","MediaElement":"HtmlElement","ShadowRoot":"Node","DocumentFragment":"Node","XmlDocument":"Document","VttCue":"TextTrackCue","CompositionEvent":"UIEvent","DedicatedWorkerGlobalScope":"WorkerGlobalScope","CDataSection":"CharacterData","Text":"CharacterData","HttpRequestUpload":"HttpRequestEventTarget","HtmlFormControlsCollection":"HtmlCollection","CssCharsetRule":"CssRule","CssStyleSheet":"StyleSheet","JSBool":{"bool":[]},"JSNull":{"Null":[]},"JavaScriptObject":{"JSObject":[],"Promise":["1&"],"JsError":[]},"JSArray":{"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"JSUnmodifiableArray":{"JSArray":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"ArrayIterator":{"Iterator":["1"]},"JSNumber":{"double":[],"num":[],"Comparable":["num"]},"JSInt":{"double":[],"int":[],"num":[],"Comparable":["num"]},"JSNumNotInt":{"double":[],"num":[],"Comparable":["num"]},"JSString":{"String":[],"Comparable":["String"],"Pattern":[]},"_CastIterableBase":{"Iterable":["2"]},"CastIterator":{"Iterator":["2"]},"CastIterable":{"_CastIterableBase":["1","2"],"Iterable":["2"],"Iterable.E":"2"},"_EfficientLengthCastIterable":{"CastIterable":["1","2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"_CastListBase":{"ListMixin":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"]},"CastList":{"_CastListBase":["1","2"],"ListMixin":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListMixin.E":"2","Iterable.E":"2"},"CastMap":{"MapMixin":["3","4"],"Map":["3","4"],"MapMixin.K":"3","MapMixin.V":"4"},"LateError":{"Error":[]},"ReachabilityError":{"Error":[]},"NotNullableError":{"TypeError":[],"Error":[]},"EfficientLengthIterable":{"Iterable":["1"]},"ListIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"SubListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"ListIterator":{"Iterator":["1"]},"MappedIterable":{"Iterable":["2"],"Iterable.E":"2"},"EfficientLengthMappedIterable":{"MappedIterable":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"MappedIterator":{"Iterator":["2"]},"MappedListIterable":{"ListIterable":["2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListIterable.E":"2","Iterable.E":"2"},"WhereIterable":{"Iterable":["1"],"Iterable.E":"1"},"WhereIterator":{"Iterator":["1"]},"SkipIterable":{"Iterable":["1"],"Iterable.E":"1"},"EfficientLengthSkipIterable":{"SkipIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"SkipIterator":{"Iterator":["1"]},"EmptyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"EmptyIterator":{"Iterator":["1"]},"UnmodifiableListBase":{"ListMixin":["1"],"UnmodifiableListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"ReversedListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"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"]},"_ConstantMapKeyIterable":{"Iterable":["1"],"Iterable.E":"1"},"JSInvocationMirror":{"Invocation":[]},"NullError":{"TypeError":[],"Error":[]},"JsNoSuchMethodError":{"Error":[]},"UnknownJsTypeError":{"Error":[]},"_StackTrace":{"StackTrace":[]},"Closure":{"Function":[]},"Closure0Args":{"Function":[]},"Closure2Args":{"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":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"LinkedHashMapKeyIterator":{"Iterator":["1"]},"JSSyntaxRegExp":{"RegExp":[],"Pattern":[]},"_MatchImplementation":{"RegExpMatch":[],"Match":[]},"_AllMatchesIterable":{"Iterable":["RegExpMatch"],"Iterable.E":"RegExpMatch"},"_AllMatchesIterator":{"Iterator":["RegExpMatch"]},"StringMatch":{"Match":[]},"_StringAllMatchesIterable":{"Iterable":["Match"],"Iterable.E":"Match"},"_StringAllMatchesIterator":{"Iterator":["Match"]},"NativeByteBuffer":{"ByteBuffer":[]},"NativeTypedData":{"TypedData":[]},"NativeByteData":{"NativeTypedData":[],"TypedData":[]},"NativeTypedArray":{"JavaScriptIndexingBehavior":["1"],"NativeTypedData":[],"TypedData":[]},"NativeTypedArrayOfDouble":{"ListMixin":["double"],"JavaScriptIndexingBehavior":["double"],"List":["double"],"NativeTypedData":[],"EfficientLengthIterable":["double"],"TypedData":[],"Iterable":["double"],"FixedLengthListMixin":["double"]},"NativeTypedArrayOfInt":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"NativeTypedData":[],"EfficientLengthIterable":["int"],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"]},"NativeFloat32List":{"ListMixin":["double"],"JavaScriptIndexingBehavior":["double"],"List":["double"],"NativeTypedData":[],"EfficientLengthIterable":["double"],"TypedData":[],"Iterable":["double"],"FixedLengthListMixin":["double"],"ListMixin.E":"double"},"NativeFloat64List":{"ListMixin":["double"],"JavaScriptIndexingBehavior":["double"],"List":["double"],"NativeTypedData":[],"EfficientLengthIterable":["double"],"TypedData":[],"Iterable":["double"],"FixedLengthListMixin":["double"],"ListMixin.E":"double"},"NativeInt16List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"NativeTypedData":[],"EfficientLengthIterable":["int"],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeInt32List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"NativeTypedData":[],"EfficientLengthIterable":["int"],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeInt8List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"NativeTypedData":[],"EfficientLengthIterable":["int"],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint16List":{"ListMixin":["int"],"Uint16List":[],"JavaScriptIndexingBehavior":["int"],"List":["int"],"NativeTypedData":[],"EfficientLengthIterable":["int"],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint32List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"NativeTypedData":[],"EfficientLengthIterable":["int"],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint8ClampedList":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"NativeTypedData":[],"EfficientLengthIterable":["int"],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint8List":{"ListMixin":["int"],"Uint8List":[],"JavaScriptIndexingBehavior":["int"],"List":["int"],"NativeTypedData":[],"EfficientLengthIterable":["int"],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"_Type":{"Type":[]},"_Error":{"Error":[]},"_TypeError":{"TypeError":[],"Error":[]},"AsyncError":{"Error":[]},"_Future":{"Future":["1"]},"_TimerImpl":{"Timer":[]},"_AsyncAwaitCompleter":{"Completer":["1"]},"_Completer":{"Completer":["1"]},"_AsyncCompleter":{"_Completer":["1"],"Completer":["1"]},"_SyncCompleter":{"_Completer":["1"],"Completer":["1"]},"StreamTransformerBase":{"StreamTransformer":["1","2"]},"_StreamController":{"StreamController":["1"],"StreamSink":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_AsyncStreamController":{"_AsyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"StreamSink":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_SyncStreamController":{"_SyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"StreamSink":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_ControllerStream":{"_StreamImpl":["1"],"Stream":["1"],"Stream.T":"1"},"_ControllerSubscription":{"_BufferingStreamSubscription":["1"],"StreamSubscription":["1"],"_EventSink":["1"],"_EventDispatch":["1"],"_BufferingStreamSubscription.T":"1"},"_StreamSinkWrapper":{"StreamSink":["1"]},"_BufferingStreamSubscription":{"StreamSubscription":["1"],"_EventSink":["1"],"_EventDispatch":["1"],"_BufferingStreamSubscription.T":"1"},"_StreamImpl":{"Stream":["1"]},"_DelayedData":{"_DelayedEvent":["1"]},"_DelayedError":{"_DelayedEvent":["@"]},"_DelayedDone":{"_DelayedEvent":["@"]},"_StreamImplEvents":{"_PendingEvents":["1"]},"_ForwardingStream":{"Stream":["2"]},"_ForwardingStreamSubscription":{"_BufferingStreamSubscription":["2"],"StreamSubscription":["2"],"_EventSink":["2"],"_EventDispatch":["2"],"_BufferingStreamSubscription.T":"2"},"_MapStream":{"_ForwardingStream":["1","2"],"Stream":["2"],"Stream.T":"2"},"_ZoneSpecification":{"ZoneSpecification":[]},"_ZoneDelegate":{"ZoneDelegate":[]},"_Zone":{"Zone":[]},"_CustomZone":{"_Zone":[],"Zone":[]},"_RootZone":{"_Zone":[],"Zone":[]},"_SplayTreeSetNode":{"_SplayTreeNode":["1","_SplayTreeSetNode<1>"],"_SplayTreeNode.K":"1","_SplayTreeNode.1":"_SplayTreeSetNode<1>"},"_HashMap":{"MapMixin":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapMixin.K":"1","MapMixin.V":"2"},"_IdentityHashMap":{"_HashMap":["1","2"],"MapMixin":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapMixin.K":"1","MapMixin.V":"2"},"_CustomHashMap":{"_HashMap":["1","2"],"MapMixin":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapMixin.K":"1","MapMixin.V":"2"},"_HashMapKeyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_HashMapKeyIterator":{"Iterator":["1"]},"_LinkedIdentityHashMap":{"JsLinkedHashMap":["1","2"],"MapMixin":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapMixin.K":"1","MapMixin.V":"2"},"_LinkedCustomHashMap":{"JsLinkedHashMap":["1","2"],"MapMixin":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapMixin.K":"1","MapMixin.V":"2"},"_HashSet":{"_SetBase":["1"],"SetMixin":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_HashSetIterator":{"Iterator":["1"]},"_LinkedHashSet":{"_SetBase":["1"],"SetMixin":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_LinkedHashSetIterator":{"Iterator":["1"]},"UnmodifiableListView":{"ListMixin":["1"],"UnmodifiableListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListMixin.E":"1","UnmodifiableListMixin.E":"1"},"IterableBase":{"Iterable":["1"]},"ListBase":{"ListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"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"]},"ListQueue":{"ListIterable":["1"],"Queue":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"_ListQueueIterator":{"Iterator":["1"]},"_SetBase":{"SetMixin":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_SplayTreeIterator":{"Iterator":["3"]},"_SplayTreeKeyIterator":{"_SplayTreeIterator":["1","2","1"],"Iterator":["1"],"_SplayTreeIterator.1":"2","_SplayTreeIterator.K":"1"},"SplayTreeSet":{"SetMixin":["1"],"Set":["1"],"IterableMixin":["1"],"EfficientLengthIterable":["1"],"_SplayTree":["1","_SplayTreeSetNode<1>"],"Iterable":["1"],"_SplayTree.K":"1","_SplayTree.1":"_SplayTreeSetNode<1>"},"_JsonMap":{"MapMixin":["String","@"],"Map":["String","@"],"MapMixin.K":"String","MapMixin.V":"@"},"_JsonMapKeyIterable":{"ListIterable":["String"],"EfficientLengthIterable":["String"],"Iterable":["String"],"ListIterable.E":"String","Iterable.E":"String"},"Base64Codec":{"Codec":["List<int>","String"],"Codec.S":"List<int>"},"Base64Encoder":{"Converter":["List<int>","String"],"StreamTransformer":["List<int>","String"]},"Converter":{"StreamTransformer":["1","2"]},"Encoding":{"Codec":["String","List<int>"]},"JsonUnsupportedObjectError":{"Error":[]},"JsonCyclicError":{"Error":[]},"JsonCodec":{"Codec":["Object?","String"],"Codec.S":"Object?"},"JsonEncoder":{"Converter":["Object?","String"],"StreamTransformer":["Object?","String"]},"JsonDecoder":{"Converter":["String","Object?"],"StreamTransformer":["String","Object?"]},"Utf8Codec":{"Codec":["String","List<int>"],"Codec.S":"String"},"Utf8Encoder":{"Converter":["String","List<int>"],"StreamTransformer":["String","List<int>"]},"BigInt":{"Comparable":["BigInt"]},"DateTime":{"Comparable":["DateTime"]},"double":{"num":[],"Comparable":["num"]},"Duration":{"Comparable":["Duration"]},"int":{"num":[],"Comparable":["num"]},"List":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"num":{"Comparable":["num"]},"RegExp":{"Pattern":[]},"RegExpMatch":{"Match":[]},"Set":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"String":{"Comparable":["String"],"Pattern":[]},"_BigIntImpl":{"BigInt":[],"Comparable":["BigInt"]},"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":[]},"IntegerDivisionByZeroException":{"Error":[]},"_StringStackTrace":{"StackTrace":[]},"StringBuffer":{"StringSink":[]},"_Uri":{"Uri":[]},"_SimpleUri":{"Uri":[]},"_DataUri":{"Uri":[]},"CloseEvent":{"Event":[]},"Element":{"Node":[],"EventTarget":[]},"File":{"Blob":[]},"HttpRequest":{"EventTarget":[]},"KeyboardEvent":{"Event":[]},"MessageEvent":{"Event":[]},"Node":{"EventTarget":[]},"ProgressEvent":{"Event":[]},"ScriptElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"SourceBuffer":{"EventTarget":[]},"TextTrack":{"EventTarget":[]},"TextTrackCue":{"EventTarget":[]},"_Html5NodeValidator":{"NodeValidator":[]},"HtmlElement":{"Element":[],"Node":[],"EventTarget":[]},"AnchorElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"AreaElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"BaseElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"BodyElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"CharacterData":{"Node":[],"EventTarget":[]},"CustomEvent":{"Event":[]},"Document":{"Node":[],"EventTarget":[]},"DomRectList":{"ListMixin":["Rectangle<num>"],"ImmutableListMixin":["Rectangle<num>"],"List":["Rectangle<num>"],"JavaScriptIndexingBehavior":["Rectangle<num>"],"EfficientLengthIterable":["Rectangle<num>"],"Iterable":["Rectangle<num>"],"ImmutableListMixin.E":"Rectangle<num>","ListMixin.E":"Rectangle<num>"},"DomRectReadOnly":{"Rectangle":["num"]},"DomStringList":{"ListMixin":["String"],"ImmutableListMixin":["String"],"List":["String"],"JavaScriptIndexingBehavior":["String"],"EfficientLengthIterable":["String"],"Iterable":["String"],"ImmutableListMixin.E":"String","ListMixin.E":"String"},"_FrozenElementList":{"ListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListMixin.E":"1"},"EventSource":{"EventTarget":[]},"FileList":{"ListMixin":["File"],"ImmutableListMixin":["File"],"List":["File"],"JavaScriptIndexingBehavior":["File"],"EfficientLengthIterable":["File"],"Iterable":["File"],"ImmutableListMixin.E":"File","ListMixin.E":"File"},"FileWriter":{"EventTarget":[]},"FormElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"HtmlCollection":{"ListMixin":["Node"],"ImmutableListMixin":["Node"],"List":["Node"],"JavaScriptIndexingBehavior":["Node"],"EfficientLengthIterable":["Node"],"Iterable":["Node"],"ImmutableListMixin.E":"Node","ListMixin.E":"Node"},"HtmlDocument":{"Document":[],"Node":[],"EventTarget":[]},"HttpRequestEventTarget":{"EventTarget":[]},"MessagePort":{"EventTarget":[]},"MidiInputMap":{"MapMixin":["String","@"],"Map":["String","@"],"MapMixin.K":"String","MapMixin.V":"@"},"MidiOutputMap":{"MapMixin":["String","@"],"Map":["String","@"],"MapMixin.K":"String","MapMixin.V":"@"},"MimeTypeArray":{"ListMixin":["MimeType"],"ImmutableListMixin":["MimeType"],"List":["MimeType"],"JavaScriptIndexingBehavior":["MimeType"],"EfficientLengthIterable":["MimeType"],"Iterable":["MimeType"],"ImmutableListMixin.E":"MimeType","ListMixin.E":"MimeType"},"_ChildNodeListLazy":{"ListMixin":["Node"],"List":["Node"],"EfficientLengthIterable":["Node"],"Iterable":["Node"],"ListMixin.E":"Node"},"NodeList":{"ListMixin":["Node"],"ImmutableListMixin":["Node"],"List":["Node"],"JavaScriptIndexingBehavior":["Node"],"EfficientLengthIterable":["Node"],"Iterable":["Node"],"ImmutableListMixin.E":"Node","ListMixin.E":"Node"},"PluginArray":{"ListMixin":["Plugin"],"ImmutableListMixin":["Plugin"],"List":["Plugin"],"JavaScriptIndexingBehavior":["Plugin"],"EfficientLengthIterable":["Plugin"],"Iterable":["Plugin"],"ImmutableListMixin.E":"Plugin","ListMixin.E":"Plugin"},"RtcStatsReport":{"MapMixin":["String","@"],"Map":["String","@"],"MapMixin.K":"String","MapMixin.V":"@"},"SelectElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"SourceBufferList":{"ListMixin":["SourceBuffer"],"ImmutableListMixin":["SourceBuffer"],"List":["SourceBuffer"],"JavaScriptIndexingBehavior":["SourceBuffer"],"EventTarget":[],"EfficientLengthIterable":["SourceBuffer"],"Iterable":["SourceBuffer"],"ImmutableListMixin.E":"SourceBuffer","ListMixin.E":"SourceBuffer"},"SpeechGrammarList":{"ListMixin":["SpeechGrammar"],"ImmutableListMixin":["SpeechGrammar"],"List":["SpeechGrammar"],"JavaScriptIndexingBehavior":["SpeechGrammar"],"EfficientLengthIterable":["SpeechGrammar"],"Iterable":["SpeechGrammar"],"ImmutableListMixin.E":"SpeechGrammar","ListMixin.E":"SpeechGrammar"},"Storage":{"MapMixin":["String","String"],"Map":["String","String"],"MapMixin.K":"String","MapMixin.V":"String"},"TableElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"TableRowElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"TableSectionElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"TemplateElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[]},"TextTrackCueList":{"ListMixin":["TextTrackCue"],"ImmutableListMixin":["TextTrackCue"],"List":["TextTrackCue"],"JavaScriptIndexingBehavior":["TextTrackCue"],"EfficientLengthIterable":["TextTrackCue"],"Iterable":["TextTrackCue"],"ImmutableListMixin.E":"TextTrackCue","ListMixin.E":"TextTrackCue"},"TextTrackList":{"ListMixin":["TextTrack"],"ImmutableListMixin":["TextTrack"],"List":["TextTrack"],"JavaScriptIndexingBehavior":["TextTrack"],"EventTarget":[],"EfficientLengthIterable":["TextTrack"],"Iterable":["TextTrack"],"ImmutableListMixin.E":"TextTrack","ListMixin.E":"TextTrack"},"TouchList":{"ListMixin":["Touch"],"ImmutableListMixin":["Touch"],"List":["Touch"],"JavaScriptIndexingBehavior":["Touch"],"EfficientLengthIterable":["Touch"],"Iterable":["Touch"],"ImmutableListMixin.E":"Touch","ListMixin.E":"Touch"},"UIEvent":{"Event":[]},"VideoTrackList":{"EventTarget":[]},"WebSocket":{"EventTarget":[]},"Window":{"EventTarget":[]},"WorkerGlobalScope":{"EventTarget":[]},"_Attr":{"Node":[],"EventTarget":[]},"_CssRuleList":{"ListMixin":["CssRule"],"ImmutableListMixin":["CssRule"],"List":["CssRule"],"JavaScriptIndexingBehavior":["CssRule"],"EfficientLengthIterable":["CssRule"],"Iterable":["CssRule"],"ImmutableListMixin.E":"CssRule","ListMixin.E":"CssRule"},"_DomRect":{"Rectangle":["num"]},"_GamepadList":{"ListMixin":["Gamepad?"],"ImmutableListMixin":["Gamepad?"],"List":["Gamepad?"],"JavaScriptIndexingBehavior":["Gamepad?"],"EfficientLengthIterable":["Gamepad?"],"Iterable":["Gamepad?"],"ImmutableListMixin.E":"Gamepad?","ListMixin.E":"Gamepad?"},"_NamedNodeMap":{"ListMixin":["Node"],"ImmutableListMixin":["Node"],"List":["Node"],"JavaScriptIndexingBehavior":["Node"],"EfficientLengthIterable":["Node"],"Iterable":["Node"],"ImmutableListMixin.E":"Node","ListMixin.E":"Node"},"_SpeechRecognitionResultList":{"ListMixin":["SpeechRecognitionResult"],"ImmutableListMixin":["SpeechRecognitionResult"],"List":["SpeechRecognitionResult"],"JavaScriptIndexingBehavior":["SpeechRecognitionResult"],"EfficientLengthIterable":["SpeechRecognitionResult"],"Iterable":["SpeechRecognitionResult"],"ImmutableListMixin.E":"SpeechRecognitionResult","ListMixin.E":"SpeechRecognitionResult"},"_StyleSheetList":{"ListMixin":["StyleSheet"],"ImmutableListMixin":["StyleSheet"],"List":["StyleSheet"],"JavaScriptIndexingBehavior":["StyleSheet"],"EfficientLengthIterable":["StyleSheet"],"Iterable":["StyleSheet"],"ImmutableListMixin.E":"StyleSheet","ListMixin.E":"StyleSheet"},"_AttributeMap":{"MapMixin":["String","String"],"Map":["String","String"]},"_ElementAttributeMap":{"MapMixin":["String","String"],"Map":["String","String"],"MapMixin.K":"String","MapMixin.V":"String"},"_EventStream":{"Stream":["1"],"Stream.T":"1"},"_EventStreamSubscription":{"StreamSubscription":["1"]},"NodeValidatorBuilder":{"NodeValidator":[]},"_SimpleNodeValidator":{"NodeValidator":[]},"_TemplatingNodeValidator":{"NodeValidator":[]},"_SvgNodeValidator":{"NodeValidator":[]},"FixedSizeListIterator":{"Iterator":["1"]},"_DOMWindowCrossFrame":{"EventTarget":[]},"_SameOriginUriPolicy":{"UriPolicy":[]},"_ValidatingTreeSanitizer":{"NodeTreeSanitizer":[]},"JsFunction":{"JsObject":[]},"JsArray":{"ListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"JsObject":[],"Iterable":["1"],"ListMixin.E":"1"},"LengthList":{"ListMixin":["Length"],"ImmutableListMixin":["Length"],"List":["Length"],"EfficientLengthIterable":["Length"],"Iterable":["Length"],"ImmutableListMixin.E":"Length","ListMixin.E":"Length"},"NumberList":{"ListMixin":["Number"],"ImmutableListMixin":["Number"],"List":["Number"],"EfficientLengthIterable":["Number"],"Iterable":["Number"],"ImmutableListMixin.E":"Number","ListMixin.E":"Number"},"ScriptElement0":{"SvgElement":[],"Element":[],"Node":[],"EventTarget":[]},"StringList":{"ListMixin":["String"],"ImmutableListMixin":["String"],"List":["String"],"EfficientLengthIterable":["String"],"Iterable":["String"],"ImmutableListMixin.E":"String","ListMixin.E":"String"},"SvgElement":{"Element":[],"Node":[],"EventTarget":[]},"TransformList":{"ListMixin":["Transform"],"ImmutableListMixin":["Transform"],"List":["Transform"],"EfficientLengthIterable":["Transform"],"Iterable":["Transform"],"ImmutableListMixin.E":"Transform","ListMixin.E":"Transform"},"AudioParamMap":{"MapMixin":["String","@"],"Map":["String","@"],"MapMixin.K":"String","MapMixin.V":"@"},"AudioTrackList":{"EventTarget":[]},"BaseAudioContext":{"EventTarget":[]},"OfflineAudioContext":{"EventTarget":[]},"DelegatingStreamSink":{"StreamSink":["1"]},"CopyOnWriteList":{"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"BuiltList":{"Iterable":["1"]},"_BuiltList":{"BuiltList":["1"],"Iterable":["1"]},"_BuiltListMultimap":{"BuiltListMultimap":["1","2"]},"_BuiltMap":{"BuiltMap":["1","2"]},"BuiltSet":{"Iterable":["1"]},"_BuiltSet":{"BuiltSet":["1"],"Iterable":["1"]},"_BuiltSetMultimap":{"BuiltSetMultimap":["1","2"]},"BuiltValueNullFieldError":{"Error":[]},"BuiltValueNestedFieldError":{"Error":[]},"BoolJsonObject":{"JsonObject":[]},"ListJsonObject":{"JsonObject":[]},"MapJsonObject":{"JsonObject":[]},"NumJsonObject":{"JsonObject":[]},"StringJsonObject":{"JsonObject":[]},"DeserializationError":{"Error":[]},"BigIntSerializer":{"PrimitiveSerializer":["BigInt"],"Serializer":["BigInt"]},"BoolSerializer":{"PrimitiveSerializer":["bool"],"Serializer":["bool"]},"BuiltJsonSerializers":{"Serializers":[]},"BuiltListMultimapSerializer":{"StructuredSerializer":["BuiltListMultimap<@,@>"],"Serializer":["BuiltListMultimap<@,@>"]},"BuiltListSerializer":{"StructuredSerializer":["BuiltList<@>"],"Serializer":["BuiltList<@>"]},"BuiltMapSerializer":{"StructuredSerializer":["BuiltMap<@,@>"],"Serializer":["BuiltMap<@,@>"]},"BuiltSetMultimapSerializer":{"StructuredSerializer":["BuiltSetMultimap<@,@>"],"Serializer":["BuiltSetMultimap<@,@>"]},"BuiltSetSerializer":{"StructuredSerializer":["BuiltSet<@>"],"Serializer":["BuiltSet<@>"]},"DateTimeSerializer":{"PrimitiveSerializer":["DateTime"],"Serializer":["DateTime"]},"DoubleSerializer":{"PrimitiveSerializer":["double"],"Serializer":["double"]},"DurationSerializer":{"PrimitiveSerializer":["Duration"],"Serializer":["Duration"]},"Int64Serializer":{"PrimitiveSerializer":["Int64"],"Serializer":["Int64"]},"IntSerializer":{"PrimitiveSerializer":["int"],"Serializer":["int"]},"JsonObjectSerializer":{"PrimitiveSerializer":["JsonObject"],"Serializer":["JsonObject"]},"NullSerializer":{"PrimitiveSerializer":["Null"],"Serializer":["Null"]},"NumSerializer":{"PrimitiveSerializer":["num"],"Serializer":["num"]},"RegExpSerializer":{"PrimitiveSerializer":["RegExp"],"Serializer":["RegExp"]},"StringSerializer":{"PrimitiveSerializer":["String"],"Serializer":["String"]},"UriSerializer":{"PrimitiveSerializer":["Uri"],"Serializer":["Uri"]},"DefaultEquality":{"Equality":["1"]},"IterableEquality":{"Equality":["Iterable<1>"]},"ListEquality":{"Equality":["List<1>"]},"_UnorderedEquality":{"Equality":["2"]},"SetEquality":{"_UnorderedEquality":["1","Set<1>?"],"Equality":["Set<1>?"],"_UnorderedEquality.E":"1","_UnorderedEquality.T":"Set<1>?"},"MapEquality":{"Equality":["Map<1,2>"]},"DeepCollectionEquality":{"Equality":["@"]},"_$BuildStatusSerializer":{"PrimitiveSerializer":["BuildStatus*"],"Serializer":["BuildStatus*"]},"_$BuildResultSerializer":{"StructuredSerializer":["BuildResult*"],"Serializer":["BuildResult*"]},"_$BuildResult":{"BuildResult":[]},"_$ConnectRequestSerializer":{"StructuredSerializer":["ConnectRequest*"],"Serializer":["ConnectRequest*"]},"_$ConnectRequest":{"ConnectRequest":[]},"_$DebugEventSerializer":{"StructuredSerializer":["DebugEvent*"],"Serializer":["DebugEvent*"]},"_$DebugEvent":{"DebugEvent":[]},"_$DevToolsRequestSerializer":{"StructuredSerializer":["DevToolsRequest*"],"Serializer":["DevToolsRequest*"]},"_$DevToolsResponseSerializer":{"StructuredSerializer":["DevToolsResponse*"],"Serializer":["DevToolsResponse*"]},"_$DevToolsRequest":{"DevToolsRequest":[]},"_$DevToolsResponse":{"DevToolsResponse":[]},"_$ErrorResponseSerializer":{"StructuredSerializer":["ErrorResponse*"],"Serializer":["ErrorResponse*"]},"_$ErrorResponse":{"ErrorResponse":[]},"_$ExtensionRequestSerializer":{"StructuredSerializer":["ExtensionRequest*"],"Serializer":["ExtensionRequest*"]},"_$ExtensionResponseSerializer":{"StructuredSerializer":["ExtensionResponse*"],"Serializer":["ExtensionResponse*"]},"_$ExtensionEventSerializer":{"StructuredSerializer":["ExtensionEvent*"],"Serializer":["ExtensionEvent*"]},"_$BatchedEventsSerializer":{"StructuredSerializer":["BatchedEvents*"],"Serializer":["BatchedEvents*"]},"_$ExtensionRequest":{"ExtensionRequest":[]},"_$ExtensionResponse":{"ExtensionResponse":[]},"_$ExtensionEvent":{"ExtensionEvent":[]},"_$BatchedEvents":{"BatchedEvents":[]},"_$IsolateExitSerializer":{"StructuredSerializer":["IsolateExit*"],"Serializer":["IsolateExit*"]},"_$IsolateStartSerializer":{"StructuredSerializer":["IsolateStart*"],"Serializer":["IsolateStart*"]},"_$IsolateExit":{"IsolateExit":[]},"_$IsolateStart":{"IsolateStart":[]},"_$RegisterEventSerializer":{"StructuredSerializer":["RegisterEvent*"],"Serializer":["RegisterEvent*"]},"_$RegisterEvent":{"RegisterEvent":[]},"_$RunRequestSerializer":{"StructuredSerializer":["RunRequest*"],"Serializer":["RunRequest*"]},"_$RunRequest":{"RunRequest":[]},"SseSocketClient":{"SocketClient":[]},"WebSocketClient":{"SocketClient":[]},"Int64":{"Comparable":["Object"]},"Level":{"Comparable":["Level"]},"SseClient":{"StreamChannel":["String?"]},"GuaranteeChannel":{"StreamChannel":["1"]},"_GuaranteeSink":{"StreamSink":["1"]},"StreamChannelMixin":{"StreamChannel":["1"]},"HtmlWebSocketChannel":{"WebSocketChannel":[],"StreamChannel":["@"]},"_HtmlWebSocketSink":{"WebSocketSink":[],"DelegatingStreamSink":["@"],"StreamSink":["@"],"DelegatingStreamSink.T":"@"},"WebSocketChannel":{"StreamChannel":["@"]},"LegacyRestarter":{"Restarter":[]},"RequireRestarter":{"Restarter":[]},"ByteData":{"TypedData":[]},"Int8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Uint8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Uint8ClampedList":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Int16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Uint16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Int32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Uint32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Float32List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"],"TypedData":[]},"Float64List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"],"TypedData":[]}}'));
  A._Universe_addErasedTypes(init.typeUniverse, JSON.parse('{"UnmodifiableListBase":1,"__CastListBase__CastIterableBase_ListMixin":2,"NativeTypedArray":1,"StreamTransformerBase":2,"IterableBase":1,"ListBase":1,"MapBase":2,"_ListBase_Object_ListMixin":1,"_SplayTreeSet__SplayTree_IterableMixin":1,"_SplayTreeSet__SplayTree_IterableMixin_SetMixin":1,"__SetBase_Object_SetMixin":1,"MapEntry":2,"_JsArray_JsObject_ListMixin":1,"StreamChannelMixin":1}'));
  var string$ = {
    Error_: "Error handler must accept one Object or one Object and a StackTrace as arguments, and return a value of the returned future's type",
    Expand: "Expandos are not allowed on strings, numbers, booleans or null",
    _null_: "`null` encountered as the result from expression with type `Never`.",
    max_mu: "max must be in range 0 < max \u2264 2^32, was ",
    serial: "serializer must be StructuredSerializer or PrimitiveSerializer"
  };
  var type$ = (function rtii() {
    var findType = A.findType;
    return {
      AsyncError: findType("AsyncError"),
      BaseElement: findType("BaseElement"),
      BigInt: findType("BigInt"),
      Blob: findType("Blob"),
      BodyElement: findType("BodyElement"),
      BuiltListMultimap_dynamic_dynamic: findType("BuiltListMultimap<@,@>"),
      BuiltList_dynamic: findType("BuiltList<@>"),
      BuiltMap_dynamic_dynamic: findType("BuiltMap<@,@>"),
      BuiltSetMultimap_dynamic_dynamic: findType("BuiltSetMultimap<@,@>"),
      BuiltSet_dynamic: findType("BuiltSet<@>"),
      ByteBuffer: findType("ByteBuffer"),
      CloseEvent: findType("CloseEvent"),
      Comparable_dynamic: findType("Comparable<@>"),
      ConstantMapView_Symbol_dynamic: findType("ConstantMapView<Symbol0,@>"),
      CssRule: findType("CssRule"),
      CustomEvent: findType("CustomEvent"),
      DateTime: findType("DateTime"),
      Document: findType("Document"),
      Duration: findType("Duration"),
      EfficientLengthIterable_dynamic: findType("EfficientLengthIterable<@>"),
      Element: findType("Element"),
      Error: findType("Error"),
      Event: findType("Event"),
      File: findType("File"),
      FileList: findType("FileList"),
      FullType: findType("FullType"),
      Function: findType("Function"),
      Future_dynamic: findType("Future<@>"),
      Future_void: findType("Future<~>"),
      ImageData: findType("ImageData"),
      Int64: findType("Int64"),
      Invocation: findType("Invocation"),
      IterableEquality_dynamic: findType("IterableEquality<@>"),
      Iterable_Node: findType("Iterable<Node>"),
      Iterable_dynamic: findType("Iterable<@>"),
      Iterable_nullable_Object: findType("Iterable<Object?>"),
      JSArray_NodeValidator: findType("JSArray<NodeValidator>"),
      JSArray_Object: findType("JSArray<Object>"),
      JSArray_String: findType("JSArray<String>"),
      JSArray_dynamic: findType("JSArray<@>"),
      JSArray_int: findType("JSArray<int>"),
      JSArray_legacy_FullType: findType("JSArray<FullType*>"),
      JSArray_legacy_Object: findType("JSArray<Object*>"),
      JSArray_legacy_String: findType("JSArray<String*>"),
      JSArray_legacy_Type: findType("JSArray<Type*>"),
      JSArray_legacy_int: findType("JSArray<int*>"),
      JSNull: findType("JSNull"),
      JSObject: findType("JSObject"),
      JavaScriptFunction: findType("JavaScriptFunction"),
      JavaScriptIndexingBehavior_dynamic: findType("JavaScriptIndexingBehavior<@>"),
      JsArray_dynamic: findType("JsArray<@>"),
      JsLinkedHashMap_String_dynamic: findType("JsLinkedHashMap<String,@>"),
      JsLinkedHashMap_Symbol_dynamic: findType("JsLinkedHashMap<Symbol0,@>"),
      JsonObject: findType("JsonObject"),
      KeyRange: findType("KeyRange"),
      Length: findType("Length"),
      Level: findType("Level"),
      ListBuilder_dynamic: findType("ListBuilder<@>"),
      ListBuilder_legacy_ExtensionEvent: findType("ListBuilder<ExtensionEvent*>"),
      ListEquality_dynamic: findType("ListEquality<@>"),
      ListMultimapBuilder_dynamic_dynamic: findType("ListMultimapBuilder<@,@>"),
      List_dynamic: findType("List<@>"),
      List_legacy_ExtensionEvent: findType("List<ExtensionEvent*>"),
      List_nullable_Object: findType("List<Object?>"),
      Logger: findType("Logger"),
      MapBuilder_dynamic_dynamic: findType("MapBuilder<@,@>"),
      MapEquality_dynamic_dynamic: findType("MapEquality<@,@>"),
      Map_dynamic_dynamic: findType("Map<@,@>"),
      Map_of_String_and_nullable_Object: findType("Map<String,Object?>"),
      MappedListIterable_of_legacy_String_and_String: findType("MappedListIterable<String*,String>"),
      MessageEvent: findType("MessageEvent"),
      MessagePort: findType("MessagePort"),
      MimeType: findType("MimeType"),
      NativeByteBuffer: findType("NativeByteBuffer"),
      NativeTypedData: findType("NativeTypedData"),
      NativeUint8List: findType("NativeUint8List"),
      Node: findType("Node"),
      NodeValidator: findType("NodeValidator"),
      Null: findType("Null"),
      Number: findType("Number"),
      Object: findType("Object"),
      Plugin: findType("Plugin"),
      PoolResource: findType("PoolResource"),
      PrimitiveSerializer_dynamic: findType("PrimitiveSerializer<@>"),
      ProgressEvent: findType("ProgressEvent"),
      Rectangle_num: findType("Rectangle<num>"),
      RegExp: findType("RegExp"),
      ReversedListIterable_String: findType("ReversedListIterable<String>"),
      ScriptElement: findType("ScriptElement0"),
      SerializerPlugin: findType("SerializerPlugin"),
      Serializer_dynamic: findType("Serializer<@>"),
      SetBuilder_dynamic: findType("SetBuilder<@>"),
      SetEquality_dynamic: findType("SetEquality<@>"),
      SetMultimapBuilder_dynamic_dynamic: findType("SetMultimapBuilder<@,@>"),
      Set_dynamic: findType("Set<@>"),
      SourceBuffer: findType("SourceBuffer"),
      SpeechGrammar: findType("SpeechGrammar"),
      SpeechRecognitionResult: findType("SpeechRecognitionResult"),
      StackTrace: findType("StackTrace"),
      StreamChannelController_dynamic: findType("StreamChannelController<@>"),
      String: findType("String"),
      String_Function_legacy_String: findType("String(String*)"),
      StructuredSerializer_dynamic: findType("StructuredSerializer<@>"),
      StyleSheet: findType("StyleSheet"),
      SvgElement: findType("SvgElement"),
      Symbol: findType("Symbol0"),
      TemplateElement: findType("TemplateElement"),
      TextTrack: findType("TextTrack"),
      TextTrackCue: findType("TextTrackCue"),
      Timer: findType("Timer"),
      Touch: findType("Touch"),
      Transform: findType("Transform"),
      Type: findType("Type"),
      TypeError: findType("TypeError"),
      TypedData: findType("TypedData"),
      Uint8List: findType("Uint8List"),
      UnknownJavaScriptObject: findType("UnknownJavaScriptObject"),
      UnmodifiableListView_nullable_Object: findType("UnmodifiableListView<Object?>"),
      UnmodifiableMapView_of_String_and_nullable_Object: findType("UnmodifiableMapView<String,Object?>"),
      Uri: findType("Uri"),
      Window: findType("Window"),
      WorkerGlobalScope: findType("WorkerGlobalScope"),
      Zone: findType("Zone"),
      _AsyncCompleter_HttpRequest: findType("_AsyncCompleter<HttpRequest>"),
      _AsyncCompleter_PoolResource: findType("_AsyncCompleter<PoolResource>"),
      _AsyncCompleter_dynamic: findType("_AsyncCompleter<@>"),
      _AsyncCompleter_legacy_bool: findType("_AsyncCompleter<bool*>"),
      _AsyncCompleter_void: findType("_AsyncCompleter<~>"),
      _Attr: findType("_Attr"),
      _BigIntImpl: findType("_BigIntImpl"),
      _BuiltMap_dynamic_dynamic: findType("_BuiltMap<@,@>"),
      _ChildNodeListLazy: findType("_ChildNodeListLazy"),
      _EventStream_legacy_CloseEvent: findType("_EventStream<CloseEvent*>"),
      _EventStream_legacy_Event: findType("_EventStream<Event*>"),
      _FrozenElementList_legacy_Element: findType("_FrozenElementList<Element*>"),
      _Future_HttpRequest: findType("_Future<HttpRequest>"),
      _Future_PoolResource: findType("_Future<PoolResource>"),
      _Future_dynamic: findType("_Future<@>"),
      _Future_int: findType("_Future<int>"),
      _Future_legacy_bool: findType("_Future<bool*>"),
      _Future_void: findType("_Future<~>"),
      _Html5NodeValidator: findType("_Html5NodeValidator"),
      _IdentityHashMap_dynamic_dynamic: findType("_IdentityHashMap<@,@>"),
      _MapEntry: findType("_MapEntry"),
      _StreamControllerAddStreamState_nullable_Object: findType("_StreamControllerAddStreamState<Object?>"),
      _SyncCompleter_PoolResource: findType("_SyncCompleter<PoolResource>"),
      _ZoneFunction_of_void_Function_Zone_ZoneDelegate_Zone_Object_StackTrace: findType("_ZoneFunction<~(Zone,ZoneDelegate,Zone,Object,StackTrace)>"),
      bool: findType("bool"),
      bool_Function_Object: findType("bool(Object)"),
      double: findType("double"),
      dynamic: findType("@"),
      dynamic_Function: findType("@()"),
      dynamic_Function_Object: findType("@(Object)"),
      dynamic_Function_Object_StackTrace: findType("@(Object,StackTrace)"),
      dynamic_Function_dynamic_dynamic: findType("@(@,@)"),
      int: findType("int"),
      legacy_BatchedEvents: findType("BatchedEvents*"),
      legacy_BuildResult: findType("BuildResult*"),
      legacy_BuildStatus: findType("BuildStatus*"),
      legacy_BuiltList_legacy_Object: findType("BuiltList<Object*>*"),
      legacy_Completer_legacy_bool: findType("Completer<bool*>*"),
      legacy_ConnectRequest: findType("ConnectRequest*"),
      legacy_DebugEvent: findType("DebugEvent*"),
      legacy_DevToolsRequest: findType("DevToolsRequest*"),
      legacy_DevToolsResponse: findType("DevToolsResponse*"),
      legacy_Element: findType("Element*"),
      legacy_ErrorResponse: findType("ErrorResponse*"),
      legacy_Event: findType("Event*"),
      legacy_ExtensionEvent: findType("ExtensionEvent*"),
      legacy_ExtensionRequest: findType("ExtensionRequest*"),
      legacy_ExtensionResponse: findType("ExtensionResponse*"),
      legacy_Future_void: findType("Future<~>*"),
      legacy_HtmlElement: findType("HtmlElement*"),
      legacy_IsolateExit: findType("IsolateExit*"),
      legacy_IsolateStart: findType("IsolateStart*"),
      legacy_Iterable_legacy_Object: findType("Iterable<Object*>*"),
      legacy_JsError: findType("JsError*"),
      legacy_JsObject: findType("JsObject*"),
      legacy_KeyboardEvent: findType("KeyboardEvent*"),
      legacy_ListBuilder_legacy_ExtensionEvent: findType("ListBuilder<ExtensionEvent*>*"),
      legacy_List_legacy_String: findType("List<String*>*"),
      legacy_Map_dynamic_dynamic: findType("Map<@,@>*"),
      legacy_Map_of_legacy_String_and_legacy_String: findType("Map<String*,String*>*"),
      legacy_MessageEvent: findType("MessageEvent*"),
      legacy_Never: findType("0&*"),
      legacy_Object: findType("Object*"),
      legacy_ProgressEvent: findType("ProgressEvent*"),
      legacy_Promise_void: findType("Promise<1&>*"),
      legacy_RegisterEvent: findType("RegisterEvent*"),
      legacy_RequireRestarter: findType("RequireRestarter*"),
      legacy_RunRequest: findType("RunRequest*"),
      legacy_SplayTreeSet_legacy_String: findType("SplayTreeSet<String*>*"),
      legacy_StackTrace: findType("StackTrace*"),
      legacy_String: findType("String*"),
      legacy_bool: findType("bool*"),
      legacy_dynamic_Function: findType("@()*"),
      legacy_dynamic_Function_dynamic: findType("@(@)*"),
      legacy_dynamic_Function_void: findType("@(~)*"),
      legacy_int: findType("int*"),
      legacy_legacy_Promise_legacy_bool_Function_legacy_String: findType("Promise<1&>*(String*)*"),
      legacy_void_Function: findType("~()*"),
      legacy_void_Function_2_legacy_String_and_legacy_String: findType("~(String*,String*)*"),
      legacy_void_Function_dynamic: findType("~(@)*"),
      legacy_void_Function_legacy_ConnectRequestBuilder: findType("~(ConnectRequestBuilder*)*"),
      legacy_void_Function_legacy_DebugEventBuilder: findType("~(DebugEventBuilder*)*"),
      legacy_void_Function_legacy_DevToolsRequestBuilder: findType("~(DevToolsRequestBuilder*)*"),
      legacy_void_Function_legacy_IsolateExitBuilder: findType("~(IsolateExitBuilder*)*"),
      legacy_void_Function_legacy_IsolateStartBuilder: findType("~(IsolateStartBuilder*)*"),
      legacy_void_Function_legacy_JsError: findType("~(JsError*)*"),
      legacy_void_Function_legacy_RegisterEventBuilder: findType("~(RegisterEventBuilder*)*"),
      legacy_void_Function_legacy_String: findType("~(String*)*"),
      nullable_Future_Null: findType("Future<Null>?"),
      nullable_Gamepad: findType("Gamepad?"),
      nullable_List_dynamic: findType("List<@>?"),
      nullable_Map_of_nullable_Object_and_nullable_Object: findType("Map<Object?,Object?>?"),
      nullable_Object: findType("Object?"),
      nullable_StackTrace: findType("StackTrace?"),
      nullable_Zone: findType("Zone?"),
      nullable_ZoneDelegate: findType("ZoneDelegate?"),
      nullable_ZoneSpecification: findType("ZoneSpecification?"),
      nullable__DelayedEvent_dynamic: findType("_DelayedEvent<@>?"),
      nullable__FutureListener_dynamic_dynamic: findType("_FutureListener<@,@>?"),
      nullable__LinkedHashSetCell: findType("_LinkedHashSetCell?"),
      nullable_dynamic_Function_Event: findType("@(Event)?"),
      nullable_int_Function_Node_Node: findType("int(Node,Node)?"),
      nullable_nullable_Object_Function_2_nullable_Object_and_nullable_Object: findType("Object?(Object?,Object?)?"),
      nullable_nullable_Object_Function_dynamic: findType("Object?(@)?"),
      nullable_void_Function: findType("~()?"),
      nullable_void_Function_legacy_Event: findType("~(Event*)?"),
      nullable_void_Function_legacy_KeyboardEvent: findType("~(KeyboardEvent*)?"),
      nullable_void_Function_legacy_MessageEvent: findType("~(MessageEvent*)?"),
      nullable_void_Function_legacy_ProgressEvent: findType("~(ProgressEvent*)?"),
      num: findType("num"),
      void: findType("~"),
      void_Function: findType("~()"),
      void_Function_Object: findType("~(Object)"),
      void_Function_Object_StackTrace: findType("~(Object,StackTrace)"),
      void_Function_String_String: findType("~(String,String)"),
      void_Function_String_dynamic: findType("~(String,@)"),
      void_Function_Timer: findType("~(Timer)")
    };
  })();
  (function constants() {
    var makeConstList = hunkHelpers.makeConstList;
    B.AnchorElement_methods = A.AnchorElement.prototype;
    B.BodyElement_methods = A.BodyElement.prototype;
    B.DomImplementation_methods = A.DomImplementation.prototype;
    B.EventSource_methods = A.EventSource.prototype;
    B.HtmlDocument_methods = A.HtmlDocument.prototype;
    B.HttpRequest_methods = A.HttpRequest.prototype;
    B.Interceptor_methods = J.Interceptor.prototype;
    B.JSArray_methods = J.JSArray.prototype;
    B.JSBool_methods = J.JSBool.prototype;
    B.JSInt_methods = J.JSInt.prototype;
    B.JSNumber_methods = J.JSNumber.prototype;
    B.JSString_methods = J.JSString.prototype;
    B.JavaScriptFunction_methods = J.JavaScriptFunction.prototype;
    B.NativeUint8List_methods = A.NativeUint8List.prototype;
    B.NodeList_methods = A.NodeList.prototype;
    B.PlainJavaScriptObject_methods = J.PlainJavaScriptObject.prototype;
    B.TableElement_methods = A.TableElement.prototype;
    B.UnknownJavaScriptObject_methods = J.UnknownJavaScriptObject.prototype;
    B.WebSocket_methods = A.WebSocket.prototype;
    B.Window_methods = A.Window.prototype;
    B.BuildStatus_failed = new A.BuildStatus("failed");
    B.BuildStatus_started = new A.BuildStatus("started");
    B.BuildStatus_succeeded = new A.BuildStatus("succeeded");
    B.C_Base64Encoder = new A.Base64Encoder();
    B.C_Base64Codec = new A.Base64Codec();
    B.C_DefaultEquality = new A.DefaultEquality(A.findType("DefaultEquality<0&*>"));
    B.C_DeepCollectionEquality = new A.DeepCollectionEquality();
    B.C_EmptyIterator = new A.EmptyIterator(A.findType("EmptyIterator<0&*>"));
    B.C_IntegerDivisionByZeroException = new A.IntegerDivisionByZeroException();
    B.C_JS_CONST = function getTagFallback(o) {
  var s = Object.prototype.toString.call(o);
  return s.substring(8, s.length - 1);
};
    B.C_JS_CONST0 = function() {
  var toStringFunction = Object.prototype.toString;
  function getTag(o) {
    var s = toStringFunction.call(o);
    return s.substring(8, s.length - 1);
  }
  function getUnknownTag(object, tag) {
    if (/^HTML[A-Z].*Element$/.test(tag)) {
      var name = toStringFunction.call(object);
      if (name == "[object Object]") return null;
      return "HTMLElement";
    }
  }
  function getUnknownTagGenericBrowser(object, tag) {
    if (self.HTMLElement && object instanceof HTMLElement) return "HTMLElement";
    return getUnknownTag(object, tag);
  }
  function prototypeForTag(tag) {
    if (typeof window == "undefined") return null;
    if (typeof window[tag] == "undefined") return null;
    var constructor = window[tag];
    if (typeof constructor != "function") return null;
    return constructor.prototype;
  }
  function discriminator(tag) { return null; }
  var isBrowser = typeof navigator == "object";
  return {
    getTag: getTag,
    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
    prototypeForTag: prototypeForTag,
    discriminator: discriminator };
};
    B.C_JS_CONST6 = function(getTagFallback) {
  return function(hooks) {
    if (typeof navigator != "object") return hooks;
    var ua = navigator.userAgent;
    if (ua.indexOf("DumpRenderTree") >= 0) return hooks;
    if (ua.indexOf("Chrome") >= 0) {
      function confirm(p) {
        return typeof window == "object" && window[p] && window[p].name == p;
      }
      if (confirm("Window") && confirm("HTMLElement")) return hooks;
    }
    hooks.getTag = getTagFallback;
  };
};
    B.C_JS_CONST1 = function(hooks) {
  if (typeof dartExperimentalFixupGetTag != "function") return hooks;
  hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
};
    B.C_JS_CONST2 = function(hooks) {
  var getTag = hooks.getTag;
  var prototypeForTag = hooks.prototypeForTag;
  function getTagFixed(o) {
    var tag = getTag(o);
    if (tag == "Document") {
      if (!!o.xmlVersion) return "!Document";
      return "!HTMLDocument";
    }
    return tag;
  }
  function prototypeForTagFixed(tag) {
    if (tag == "Document") return null;
    return prototypeForTag(tag);
  }
  hooks.getTag = getTagFixed;
  hooks.prototypeForTag = prototypeForTagFixed;
};
    B.C_JS_CONST5 = function(hooks) {
  var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
  if (userAgent.indexOf("Firefox") == -1) return hooks;
  var getTag = hooks.getTag;
  var quickMap = {
    "BeforeUnloadEvent": "Event",
    "DataTransfer": "Clipboard",
    "GeoGeolocation": "Geolocation",
    "Location": "!Location",
    "WorkerMessageEvent": "MessageEvent",
    "XMLDocument": "!Document"};
  function getTagFirefox(o) {
    var tag = getTag(o);
    return quickMap[tag] || tag;
  }
  hooks.getTag = getTagFirefox;
};
    B.C_JS_CONST4 = function(hooks) {
  var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
  if (userAgent.indexOf("Trident/") == -1) return hooks;
  var getTag = hooks.getTag;
  var quickMap = {
    "BeforeUnloadEvent": "Event",
    "DataTransfer": "Clipboard",
    "HTMLDDElement": "HTMLElement",
    "HTMLDTElement": "HTMLElement",
    "HTMLPhraseElement": "HTMLElement",
    "Position": "Geoposition"
  };
  function getTagIE(o) {
    var tag = getTag(o);
    var newTag = quickMap[tag];
    if (newTag) return newTag;
    if (tag == "Object") {
      if (window.DataView && (o instanceof window.DataView)) return "DataView";
    }
    return tag;
  }
  function prototypeForTagIE(tag) {
    var constructor = window[tag];
    if (constructor == null) return null;
    return constructor.prototype;
  }
  hooks.getTag = getTagIE;
  hooks.prototypeForTag = prototypeForTagIE;
};
    B.C_JS_CONST3 = function(hooks) { return hooks; }
;
    B.C_JsonCodec = new A.JsonCodec();
    B.C_OutOfMemoryError = new A.OutOfMemoryError();
    B.C_SentinelValue = new A.SentinelValue();
    B.C_Utf8Codec = new A.Utf8Codec();
    B.C_Utf8Encoder = new A.Utf8Encoder();
    B.C_Uuid = new A.Uuid();
    B.C__DelayedDone = new A._DelayedDone();
    B.C__JSRandom = new A._JSRandom();
    B.C__Required = new A._Required();
    B.C__RootZone = new A._RootZone();
    B.Duration_0 = new A.Duration(0);
    B.Duration_5000000 = new A.Duration(5000000);
    B.Type_BuiltListMultimap_2Mt = A.typeLiteral("BuiltListMultimap<@,@>");
    B.Type_Object_xQ6 = A.typeLiteral("Object");
    B.List_empty1 = A._setArrayType(makeConstList([]), type$.JSArray_legacy_FullType);
    B.FullType_1MH = new A.FullType(B.Type_Object_xQ6, B.List_empty1, false);
    B.List_a1A = A._setArrayType(makeConstList([B.FullType_1MH, B.FullType_1MH]), type$.JSArray_legacy_FullType);
    B.FullType_4Wf = new A.FullType(B.Type_BuiltListMultimap_2Mt, B.List_a1A, false);
    B.Type_BuiltSet_fcN = A.typeLiteral("BuiltSet<@>");
    B.List_yym = A._setArrayType(makeConstList([B.FullType_1MH]), type$.JSArray_legacy_FullType);
    B.FullType_4e8 = new A.FullType(B.Type_BuiltSet_fcN, B.List_yym, false);
    B.Type_BuildStatus_ahk = A.typeLiteral("BuildStatus");
    B.FullType_FuN = new A.FullType(B.Type_BuildStatus_ahk, B.List_empty1, false);
    B.Type_bool_lhE = A.typeLiteral("bool");
    B.FullType_MtR = new A.FullType(B.Type_bool_lhE, B.List_empty1, false);
    B.Type_BuiltSetMultimap_9Fi = A.typeLiteral("BuiltSetMultimap<@,@>");
    B.FullType_Ofx = new A.FullType(B.Type_BuiltSetMultimap_9Fi, B.List_a1A, false);
    B.Type_BuiltList_iTR = A.typeLiteral("BuiltList<@>");
    B.FullType_eLJ = new A.FullType(B.Type_BuiltList_iTR, B.List_yym, false);
    B.Type_String_k8F = A.typeLiteral("String");
    B.FullType_h8g = new A.FullType(B.Type_String_k8F, B.List_empty1, false);
    B.Type_int_tHn = A.typeLiteral("int");
    B.FullType_kjq = new A.FullType(B.Type_int_tHn, B.List_empty1, false);
    B.FullType_null_List_empty_false = new A.FullType(null, B.List_empty1, false);
    B.Type_ExtensionEvent_gsm = A.typeLiteral("ExtensionEvent");
    B.FullType_Ktb = new A.FullType(B.Type_ExtensionEvent_gsm, B.List_empty1, false);
    B.List_BmO = A._setArrayType(makeConstList([B.FullType_Ktb]), type$.JSArray_legacy_FullType);
    B.FullType_w24 = new A.FullType(B.Type_BuiltList_iTR, B.List_BmO, false);
    B.Type_BuiltMap_qd4 = A.typeLiteral("BuiltMap<@,@>");
    B.FullType_wIv = new A.FullType(B.Type_BuiltMap_qd4, B.List_a1A, false);
    B.JsonDecoder_null = new A.JsonDecoder(null);
    B.JsonEncoder_null = new A.JsonEncoder(null);
    B.Level_INFO_800 = new A.Level("INFO", 800);
    B.Level_SEVERE_1000 = new A.Level("SEVERE", 1000);
    B.Level_WARNING_900 = new A.Level("WARNING", 900);
    B.List_2Vk = A._setArrayType(makeConstList([0, 0, 32776, 33792, 1, 10240, 0, 0]), type$.JSArray_legacy_int);
    B.List_2Zi = A._setArrayType(makeConstList(["*::class", "*::dir", "*::draggable", "*::hidden", "*::id", "*::inert", "*::itemprop", "*::itemref", "*::itemscope", "*::lang", "*::spellcheck", "*::title", "*::translate", "A::accesskey", "A::coords", "A::hreflang", "A::name", "A::shape", "A::tabindex", "A::target", "A::type", "AREA::accesskey", "AREA::alt", "AREA::coords", "AREA::nohref", "AREA::shape", "AREA::tabindex", "AREA::target", "AUDIO::controls", "AUDIO::loop", "AUDIO::mediagroup", "AUDIO::muted", "AUDIO::preload", "BDO::dir", "BODY::alink", "BODY::bgcolor", "BODY::link", "BODY::text", "BODY::vlink", "BR::clear", "BUTTON::accesskey", "BUTTON::disabled", "BUTTON::name", "BUTTON::tabindex", "BUTTON::type", "BUTTON::value", "CANVAS::height", "CANVAS::width", "CAPTION::align", "COL::align", "COL::char", "COL::charoff", "COL::span", "COL::valign", "COL::width", "COLGROUP::align", "COLGROUP::char", "COLGROUP::charoff", "COLGROUP::span", "COLGROUP::valign", "COLGROUP::width", "COMMAND::checked", "COMMAND::command", "COMMAND::disabled", "COMMAND::label", "COMMAND::radiogroup", "COMMAND::type", "DATA::value", "DEL::datetime", "DETAILS::open", "DIR::compact", "DIV::align", "DL::compact", "FIELDSET::disabled", "FONT::color", "FONT::face", "FONT::size", "FORM::accept", "FORM::autocomplete", "FORM::enctype", "FORM::method", "FORM::name", "FORM::novalidate", "FORM::target", "FRAME::name", "H1::align", "H2::align", "H3::align", "H4::align", "H5::align", "H6::align", "HR::align", "HR::noshade", "HR::size", "HR::width", "HTML::version", "IFRAME::align", "IFRAME::frameborder", "IFRAME::height", "IFRAME::marginheight", "IFRAME::marginwidth", "IFRAME::width", "IMG::align", "IMG::alt", "IMG::border", "IMG::height", "IMG::hspace", "IMG::ismap", "IMG::name", "IMG::usemap", "IMG::vspace", "IMG::width", "INPUT::accept", "INPUT::accesskey", "INPUT::align", "INPUT::alt", "INPUT::autocomplete", "INPUT::autofocus", "INPUT::checked", "INPUT::disabled", "INPUT::inputmode", "INPUT::ismap", "INPUT::list", "INPUT::max", "INPUT::maxlength", "INPUT::min", "INPUT::multiple", "INPUT::name", "INPUT::placeholder", "INPUT::readonly", "INPUT::required", "INPUT::size", "INPUT::step", "INPUT::tabindex", "INPUT::type", "INPUT::usemap", "INPUT::value", "INS::datetime", "KEYGEN::disabled", "KEYGEN::keytype", "KEYGEN::name", "LABEL::accesskey", "LABEL::for", "LEGEND::accesskey", "LEGEND::align", "LI::type", "LI::value", "LINK::sizes", "MAP::name", "MENU::compact", "MENU::label", "MENU::type", "METER::high", "METER::low", "METER::max", "METER::min", "METER::value", "OBJECT::typemustmatch", "OL::compact", "OL::reversed", "OL::start", "OL::type", "OPTGROUP::disabled", "OPTGROUP::label", "OPTION::disabled", "OPTION::label", "OPTION::selected", "OPTION::value", "OUTPUT::for", "OUTPUT::name", "P::align", "PRE::width", "PROGRESS::max", "PROGRESS::min", "PROGRESS::value", "SELECT::autocomplete", "SELECT::disabled", "SELECT::multiple", "SELECT::name", "SELECT::required", "SELECT::size", "SELECT::tabindex", "SOURCE::type", "TABLE::align", "TABLE::bgcolor", "TABLE::border", "TABLE::cellpadding", "TABLE::cellspacing", "TABLE::frame", "TABLE::rules", "TABLE::summary", "TABLE::width", "TBODY::align", "TBODY::char", "TBODY::charoff", "TBODY::valign", "TD::abbr", "TD::align", "TD::axis", "TD::bgcolor", "TD::char", "TD::charoff", "TD::colspan", "TD::headers", "TD::height", "TD::nowrap", "TD::rowspan", "TD::scope", "TD::valign", "TD::width", "TEXTAREA::accesskey", "TEXTAREA::autocomplete", "TEXTAREA::cols", "TEXTAREA::disabled", "TEXTAREA::inputmode", "TEXTAREA::name", "TEXTAREA::placeholder", "TEXTAREA::readonly", "TEXTAREA::required", "TEXTAREA::rows", "TEXTAREA::tabindex", "TEXTAREA::wrap", "TFOOT::align", "TFOOT::char", "TFOOT::charoff", "TFOOT::valign", "TH::abbr", "TH::align", "TH::axis", "TH::bgcolor", "TH::char", "TH::charoff", "TH::colspan", "TH::headers", "TH::height", "TH::nowrap", "TH::rowspan", "TH::scope", "TH::valign", "TH::width", "THEAD::align", "THEAD::char", "THEAD::charoff", "THEAD::valign", "TR::align", "TR::bgcolor", "TR::char", "TR::charoff", "TR::valign", "TRACK::default", "TRACK::kind", "TRACK::label", "TRACK::srclang", "UL::compact", "UL::type", "VIDEO::controls", "VIDEO::height", "VIDEO::loop", "VIDEO::mediagroup", "VIDEO::muted", "VIDEO::preload", "VIDEO::width"]), type$.JSArray_legacy_String);
    B.Type_DevToolsResponse_Hhy = A.typeLiteral("DevToolsResponse");
    B.Type__$DevToolsResponse_23h = A.typeLiteral("_$DevToolsResponse");
    B.List_41A = A._setArrayType(makeConstList([B.Type_DevToolsResponse_Hhy, B.Type__$DevToolsResponse_23h]), type$.JSArray_legacy_Type);
    B.Type_RegisterEvent_0zQ = A.typeLiteral("RegisterEvent");
    B.Type__$RegisterEvent_SY6 = A.typeLiteral("_$RegisterEvent");
    B.List_42K = A._setArrayType(makeConstList([B.Type_RegisterEvent_0zQ, B.Type__$RegisterEvent_SY6]), type$.JSArray_legacy_Type);
    B.Type_IsolateStart_0 = A.typeLiteral("IsolateStart");
    B.Type__$IsolateStart_o3b = A.typeLiteral("_$IsolateStart");
    B.List_6TA = A._setArrayType(makeConstList([B.Type_IsolateStart_0, B.Type__$IsolateStart_o3b]), type$.JSArray_legacy_Type);
    B.Type_DevToolsRequest_A0n = A.typeLiteral("DevToolsRequest");
    B.Type__$DevToolsRequest_cDy = A.typeLiteral("_$DevToolsRequest");
    B.List_BCG = A._setArrayType(makeConstList([B.Type_DevToolsRequest_A0n, B.Type__$DevToolsRequest_cDy]), type$.JSArray_legacy_Type);
    B.List_CVk = A._setArrayType(makeConstList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431]), type$.JSArray_legacy_int);
    B.Type_DebugEvent_sSr = A.typeLiteral("DebugEvent");
    B.Type__$DebugEvent_EmR = A.typeLiteral("_$DebugEvent");
    B.List_Cpu = A._setArrayType(makeConstList([B.Type_DebugEvent_sSr, B.Type__$DebugEvent_EmR]), type$.JSArray_legacy_Type);
    B.List_JYB = A._setArrayType(makeConstList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047]), type$.JSArray_legacy_int);
    B.Type_IsolateExit_D1o = A.typeLiteral("IsolateExit");
    B.Type__$IsolateExit_eWg = A.typeLiteral("_$IsolateExit");
    B.List_LT1 = A._setArrayType(makeConstList([B.Type_IsolateExit_D1o, B.Type__$IsolateExit_eWg]), type$.JSArray_legacy_Type);
    B.Type_BuildResult_dEV = A.typeLiteral("BuildResult");
    B.Type__$BuildResult_knt = A.typeLiteral("_$BuildResult");
    B.List_OHe = A._setArrayType(makeConstList([B.Type_BuildResult_dEV, B.Type__$BuildResult_knt]), type$.JSArray_legacy_Type);
    B.List_Type_BuildStatus_ahk = A._setArrayType(makeConstList([B.Type_BuildStatus_ahk]), type$.JSArray_legacy_Type);
    B.List_WrN = A._setArrayType(makeConstList([0, 0, 1048576, 531441, 1048576, 390625, 279936, 823543, 262144, 531441, 1000000, 161051, 248832, 371293, 537824, 759375, 1048576, 83521, 104976, 130321, 160000, 194481, 234256, 279841, 331776, 390625, 456976, 531441, 614656, 707281, 810000, 923521, 1048576, 35937, 39304, 42875, 46656]), type$.JSArray_legacy_int);
    B.List_ego = A._setArrayType(makeConstList(["HEAD", "AREA", "BASE", "BASEFONT", "BR", "COL", "COLGROUP", "EMBED", "FRAME", "FRAMESET", "HR", "IMAGE", "IMG", "INPUT", "ISINDEX", "LINK", "META", "PARAM", "SOURCE", "STYLE", "TITLE", "WBR"]), type$.JSArray_legacy_String);
    B.List_empty0 = A._setArrayType(makeConstList([]), type$.JSArray_dynamic);
    B.List_empty = A._setArrayType(makeConstList([]), type$.JSArray_legacy_String);
    B.Type_ExtensionRequest_BMe = A.typeLiteral("ExtensionRequest");
    B.Type__$ExtensionRequest_1Ej = A.typeLiteral("_$ExtensionRequest");
    B.List_evd = A._setArrayType(makeConstList([B.Type_ExtensionRequest_BMe, B.Type__$ExtensionRequest_1Ej]), type$.JSArray_legacy_Type);
    B.Type_ErrorResponse_Q43 = A.typeLiteral("ErrorResponse");
    B.Type__$ErrorResponse_xV7 = A.typeLiteral("_$ErrorResponse");
    B.List_gQA = A._setArrayType(makeConstList([B.Type_ErrorResponse_Q43, B.Type__$ErrorResponse_xV7]), type$.JSArray_legacy_Type);
    B.List_gRj = A._setArrayType(makeConstList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431]), type$.JSArray_legacy_int);
    B.List_nxB = A._setArrayType(makeConstList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431]), type$.JSArray_legacy_int);
    B.Type__$ExtensionEvent_XOq = A.typeLiteral("_$ExtensionEvent");
    B.List_pnF = A._setArrayType(makeConstList([B.Type_ExtensionEvent_gsm, B.Type__$ExtensionEvent_XOq]), type$.JSArray_legacy_Type);
    B.List_qNA = A._setArrayType(makeConstList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431]), type$.JSArray_legacy_int);
    B.List_qg40 = A._setArrayType(makeConstList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431]), type$.JSArray_legacy_int);
    B.List_qg4 = A._setArrayType(makeConstList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431]), type$.JSArray_legacy_int);
    B.Type_ConnectRequest_UGQ = A.typeLiteral("ConnectRequest");
    B.Type__$ConnectRequest_cJC = A.typeLiteral("_$ConnectRequest");
    B.List_ssp = A._setArrayType(makeConstList([B.Type_ConnectRequest_UGQ, B.Type__$ConnectRequest_cJC]), type$.JSArray_legacy_Type);
    B.Type_ExtensionResponse_CC0 = A.typeLiteral("ExtensionResponse");
    B.Type__$ExtensionResponse_Ddl = A.typeLiteral("_$ExtensionResponse");
    B.List_tQ0 = A._setArrayType(makeConstList([B.Type_ExtensionResponse_CC0, B.Type__$ExtensionResponse_Ddl]), type$.JSArray_legacy_Type);
    B.Type_BatchedEvents_gDG = A.typeLiteral("BatchedEvents");
    B.Type__$BatchedEvents_qxo = A.typeLiteral("_$BatchedEvents");
    B.List_w8N = A._setArrayType(makeConstList([B.Type_BatchedEvents_gDG, B.Type__$BatchedEvents_qxo]), type$.JSArray_legacy_Type);
    B.List_wSV = A._setArrayType(makeConstList(["bind", "if", "ref", "repeat", "syntax"]), type$.JSArray_legacy_String);
    B.Type_RunRequest_Pkw = A.typeLiteral("RunRequest");
    B.Type__$RunRequest_Im4 = A.typeLiteral("_$RunRequest");
    B.List_wsa = A._setArrayType(makeConstList([B.Type_RunRequest_Pkw, B.Type__$RunRequest_Im4]), type$.JSArray_legacy_Type);
    B.List_yrN = A._setArrayType(makeConstList(["A::href", "AREA::href", "BLOCKQUOTE::cite", "BODY::background", "COMMAND::icon", "DEL::cite", "FORM::action", "IMG::src", "INPUT::src", "INS::cite", "Q::cite", "VIDEO::poster"]), type$.JSArray_legacy_String);
    B.List_zgw = A._setArrayType(makeConstList(["d", "D", "\u2202", "\xce"]), type$.JSArray_legacy_String);
    B.Map_empty = new A.ConstantStringMap(0, {}, B.List_empty0, A.findType("ConstantStringMap<@,@>"));
    B.List_empty2 = A._setArrayType(makeConstList([]), A.findType("JSArray<Symbol0*>"));
    B.Map_empty0 = new A.ConstantStringMap(0, {}, B.List_empty2, A.findType("ConstantStringMap<Symbol0*,@>"));
    B.Symbol_call = new A.Symbol("call");
    B.Type_BigInt_8OV = A.typeLiteral("BigInt");
    B.Type_BoolJsonObject_8HQ = A.typeLiteral("BoolJsonObject");
    B.Type_ByteBuffer_RkP = A.typeLiteral("ByteBuffer");
    B.Type_ByteData_zNC = A.typeLiteral("ByteData");
    B.Type_DateTime_8AS = A.typeLiteral("DateTime");
    B.Type_Duration_SnA = A.typeLiteral("Duration");
    B.Type_Float32List_LB7 = A.typeLiteral("Float32List");
    B.Type_Float64List_LB7 = A.typeLiteral("Float64List");
    B.Type_Int16List_uXf = A.typeLiteral("Int16List");
    B.Type_Int32List_O50 = A.typeLiteral("Int32List");
    B.Type_Int64_gc6 = A.typeLiteral("Int64");
    B.Type_Int8List_ekJ = A.typeLiteral("Int8List");
    B.Type_JSObject_8k0 = A.typeLiteral("JSObject");
    B.Type_JsonObject_gyf = A.typeLiteral("JsonObject");
    B.Type_ListJsonObject_yPV = A.typeLiteral("ListJsonObject");
    B.Type_MapJsonObject_bBG = A.typeLiteral("MapJsonObject");
    B.Type_Null_Yyn = A.typeLiteral("Null");
    B.Type_NumJsonObject_H9C = A.typeLiteral("NumJsonObject");
    B.Type_RegExp_Eeh = A.typeLiteral("RegExp");
    B.Type_StringJsonObject_GAC = A.typeLiteral("StringJsonObject");
    B.Type_Uint16List_2bx = A.typeLiteral("Uint16List");
    B.Type_Uint32List_2bx = A.typeLiteral("Uint32List");
    B.Type_Uint8ClampedList_Jik = A.typeLiteral("Uint8ClampedList");
    B.Type_Uint8List_WLA = A.typeLiteral("Uint8List");
    B.Type_Uri_EFX = A.typeLiteral("Uri");
    B.Type_double_K1J = A.typeLiteral("double");
    B.Type_num_cv7 = A.typeLiteral("num");
    B._RegisterBinaryZoneFunction_kGu = new A._RegisterBinaryZoneFunction(B.C__RootZone, A.async___rootRegisterBinaryCallback$closure());
    B._RegisterNullaryZoneFunction__RootZone__rootRegisterCallback = new A._RegisterNullaryZoneFunction(B.C__RootZone, A.async___rootRegisterCallback$closure());
    B._RegisterUnaryZoneFunction_Bqo = new A._RegisterUnaryZoneFunction(B.C__RootZone, A.async___rootRegisterUnaryCallback$closure());
    B._RunBinaryZoneFunction__RootZone__rootRunBinary = new A._RunBinaryZoneFunction(B.C__RootZone, A.async___rootRunBinary$closure());
    B._RunNullaryZoneFunction__RootZone__rootRun = new A._RunNullaryZoneFunction(B.C__RootZone, A.async___rootRun$closure());
    B._RunUnaryZoneFunction__RootZone__rootRunUnary = new A._RunUnaryZoneFunction(B.C__RootZone, A.async___rootRunUnary$closure());
    B._StringStackTrace_3uE = new A._StringStackTrace("");
    B._ZoneFunction_3bB = new A._ZoneFunction(B.C__RootZone, A.async___rootCreatePeriodicTimer$closure(), A.findType("_ZoneFunction<Timer*(Zone*,ZoneDelegate*,Zone*,Duration*,~(Timer*)*)*>"));
    B._ZoneFunction_NMc = new A._ZoneFunction(B.C__RootZone, A.async___rootHandleUncaughtError$closure(), A.findType("_ZoneFunction<~(Zone*,ZoneDelegate*,Zone*,Object*,StackTrace*)*>"));
    B._ZoneFunction__RootZone__rootCreateTimer = new A._ZoneFunction(B.C__RootZone, A.async___rootCreateTimer$closure(), A.findType("_ZoneFunction<Timer*(Zone*,ZoneDelegate*,Zone*,Duration*,~()*)*>"));
    B._ZoneFunction__RootZone__rootErrorCallback = new A._ZoneFunction(B.C__RootZone, A.async___rootErrorCallback$closure(), A.findType("_ZoneFunction<AsyncError?(Zone*,ZoneDelegate*,Zone*,Object*,StackTrace?)*>"));
    B._ZoneFunction__RootZone__rootFork = new A._ZoneFunction(B.C__RootZone, A.async___rootFork$closure(), A.findType("_ZoneFunction<Zone*(Zone*,ZoneDelegate*,Zone*,ZoneSpecification?,Map<Object?,Object?>?)*>"));
    B._ZoneFunction__RootZone__rootPrint = new A._ZoneFunction(B.C__RootZone, A.async___rootPrint$closure(), A.findType("_ZoneFunction<~(Zone*,ZoneDelegate*,Zone*,String*)*>"));
    B._ZoneFunction__RootZone__rootScheduleMicrotask = new A._ZoneFunction(B.C__RootZone, A.async___rootScheduleMicrotask$closure(), A.findType("_ZoneFunction<~(Zone*,ZoneDelegate*,Zone*,~()*)*>"));
    B._ZoneSpecification_ALf = new A._ZoneSpecification(null, null, null, null, null, null, null, null, null, null, null, null, null);
  })();
  (function staticFields() {
    $._JS_INTEROP_INTERCEPTOR_TAG = null;
    $.printToZone = null;
    $.Primitives__identityHashCodeProperty = null;
    $.BoundClosure__receiverFieldNameCache = null;
    $.BoundClosure__interceptorFieldNameCache = null;
    $.getTagFunction = null;
    $.alternateTagFunction = null;
    $.prototypeForTagFunction = null;
    $.dispatchRecordsForInstanceTags = null;
    $.interceptorsForUncacheableTags = null;
    $.initNativeDispatchFlag = null;
    $._nextCallback = null;
    $._lastCallback = null;
    $._lastPriorityCallback = null;
    $._isInCallbackLoop = false;
    $.Zone__current = B.C__RootZone;
    $._RootZone__rootDelegate = null;
    $._toStringVisiting = A._setArrayType([], type$.JSArray_Object);
    $._BigIntImpl__lastDividendDigits = null;
    $._BigIntImpl__lastDividendUsed = null;
    $._BigIntImpl__lastDivisorDigits = null;
    $._BigIntImpl__lastDivisorUsed = null;
    $._BigIntImpl____lastQuoRemDigits = A._Cell$named("_lastQuoRemDigits");
    $._BigIntImpl____lastQuoRemUsed = A._Cell$named("_lastQuoRemUsed");
    $._BigIntImpl____lastRemUsed = A._Cell$named("_lastRemUsed");
    $._BigIntImpl____lastRem_nsh = A._Cell$named("_lastRem_nsh");
    $.Element__parseDocument = null;
    $.Element__parseRange = null;
    $.Element__defaultValidator = null;
    $.Element__defaultSanitizer = null;
    $._Html5NodeValidator__attributeValidators = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.Function);
    $._indentingBuiltValueToStringHelperIndent = 0;
    $.LogRecord__nextNumber = 0;
    $.Logger__loggers = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.Logger);
    $._lastKnownDigests = null;
  })();
  (function lazyInitializers() {
    var _lazyFinal = hunkHelpers.lazyFinal,
      _lazy = hunkHelpers.lazy,
      _lazyOld = hunkHelpers.lazyOld;
    _lazyFinal($, "DART_CLOSURE_PROPERTY_NAME", "$get$DART_CLOSURE_PROPERTY_NAME", () => A.getIsolateAffinityTag("_$dart_dartClosure"));
    _lazyFinal($, "nullFuture", "$get$nullFuture", () => B.C__RootZone.run$1$1(new A.nullFuture_closure(), A.findType("Future<Null>")));
    _lazyFinal($, "TypeErrorDecoder_noSuchMethodPattern", "$get$TypeErrorDecoder_noSuchMethodPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokeCallErrorOn({
      toString: function() {
        return "$receiver$";
      }
    })));
    _lazyFinal($, "TypeErrorDecoder_notClosurePattern", "$get$TypeErrorDecoder_notClosurePattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokeCallErrorOn({$method$: null,
      toString: function() {
        return "$receiver$";
      }
    })));
    _lazyFinal($, "TypeErrorDecoder_nullCallPattern", "$get$TypeErrorDecoder_nullCallPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokeCallErrorOn(null)));
    _lazyFinal($, "TypeErrorDecoder_nullLiteralCallPattern", "$get$TypeErrorDecoder_nullLiteralCallPattern", () => A.TypeErrorDecoder_extractPattern(function() {
      var $argumentsExpr$ = "$arguments$";
      try {
        null.$method$($argumentsExpr$);
      } catch (e) {
        return e.message;
      }
    }()));
    _lazyFinal($, "TypeErrorDecoder_undefinedCallPattern", "$get$TypeErrorDecoder_undefinedCallPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokeCallErrorOn(void 0)));
    _lazyFinal($, "TypeErrorDecoder_undefinedLiteralCallPattern", "$get$TypeErrorDecoder_undefinedLiteralCallPattern", () => A.TypeErrorDecoder_extractPattern(function() {
      var $argumentsExpr$ = "$arguments$";
      try {
        (void 0).$method$($argumentsExpr$);
      } catch (e) {
        return e.message;
      }
    }()));
    _lazyFinal($, "TypeErrorDecoder_nullPropertyPattern", "$get$TypeErrorDecoder_nullPropertyPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokePropertyErrorOn(null)));
    _lazyFinal($, "TypeErrorDecoder_nullLiteralPropertyPattern", "$get$TypeErrorDecoder_nullLiteralPropertyPattern", () => A.TypeErrorDecoder_extractPattern(function() {
      try {
        null.$method$;
      } catch (e) {
        return e.message;
      }
    }()));
    _lazyFinal($, "TypeErrorDecoder_undefinedPropertyPattern", "$get$TypeErrorDecoder_undefinedPropertyPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokePropertyErrorOn(void 0)));
    _lazyFinal($, "TypeErrorDecoder_undefinedLiteralPropertyPattern", "$get$TypeErrorDecoder_undefinedLiteralPropertyPattern", () => A.TypeErrorDecoder_extractPattern(function() {
      try {
        (void 0).$method$;
      } catch (e) {
        return e.message;
      }
    }()));
    _lazyFinal($, "_AsyncRun__scheduleImmediateClosure", "$get$_AsyncRun__scheduleImmediateClosure", () => A._AsyncRun__initializeScheduleImmediate());
    _lazyFinal($, "Future__nullFuture", "$get$Future__nullFuture", () => A.findType("_Future<Null>")._as($.$get$nullFuture()));
    _lazyFinal($, "_RootZone__rootMap", "$get$_RootZone__rootMap", () => {
      var t1 = type$.dynamic;
      return A.HashMap_HashMap(null, null, null, t1, t1);
    });
    _lazyFinal($, "_Base64Decoder__inverseAlphabet", "$get$_Base64Decoder__inverseAlphabet", () => A.NativeInt8List__create1(A._ensureNativeList(A._setArrayType([-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -2, -2, -2, 62, -2, 62, -2, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, -1, -2, -2, -2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, 63, -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2], type$.JSArray_int))));
    _lazyFinal($, "_Uri__needsNoEncoding", "$get$_Uri__needsNoEncoding", () => A.RegExp_RegExp("^[\\-\\.0-9A-Z_a-z~]*$", true, false));
    _lazy($, "_hasErrorStackProperty", "$get$_hasErrorStackProperty", () => new Error().stack != void 0);
    _lazyFinal($, "_BigIntImpl_zero", "$get$_BigIntImpl_zero", () => A._BigIntImpl__BigIntImpl$_fromInt(0));
    _lazyFinal($, "_BigIntImpl_one", "$get$_BigIntImpl_one", () => A._BigIntImpl__BigIntImpl$_fromInt(1));
    _lazyFinal($, "_BigIntImpl__minusOne", "$get$_BigIntImpl__minusOne", () => $.$get$_BigIntImpl_one().$negate(0));
    _lazyFinal($, "_BigIntImpl__bigInt10000", "$get$_BigIntImpl__bigInt10000", () => A._BigIntImpl__BigIntImpl$_fromInt(10000));
    _lazy($, "_BigIntImpl__parseRE", "$get$_BigIntImpl__parseRE", () => A.RegExp_RegExp("^\\s*([+-]?)((0x[a-f0-9]+)|(\\d+)|([a-z0-9]+))\\s*$", false, false));
    _lazyFinal($, "_hashSeed", "$get$_hashSeed", () => A.objectHashCode(B.Type_Object_xQ6));
    _lazyFinal($, "_scannerTables", "$get$_scannerTables", () => A._createTables());
    _lazyFinal($, "_Html5NodeValidator__allowedElements", "$get$_Html5NodeValidator__allowedElements", () => A.LinkedHashSet_LinkedHashSet$from(["A", "ABBR", "ACRONYM", "ADDRESS", "AREA", "ARTICLE", "ASIDE", "AUDIO", "B", "BDI", "BDO", "BIG", "BLOCKQUOTE", "BR", "BUTTON", "CANVAS", "CAPTION", "CENTER", "CITE", "CODE", "COL", "COLGROUP", "COMMAND", "DATA", "DATALIST", "DD", "DEL", "DETAILS", "DFN", "DIR", "DIV", "DL", "DT", "EM", "FIELDSET", "FIGCAPTION", "FIGURE", "FONT", "FOOTER", "FORM", "H1", "H2", "H3", "H4", "H5", "H6", "HEADER", "HGROUP", "HR", "I", "IFRAME", "IMG", "INPUT", "INS", "KBD", "LABEL", "LEGEND", "LI", "MAP", "MARK", "MENU", "METER", "NAV", "NOBR", "OL", "OPTGROUP", "OPTION", "OUTPUT", "P", "PRE", "PROGRESS", "Q", "S", "SAMP", "SECTION", "SELECT", "SMALL", "SOURCE", "SPAN", "STRIKE", "STRONG", "SUB", "SUMMARY", "SUP", "TABLE", "TBODY", "TD", "TEXTAREA", "TFOOT", "TH", "THEAD", "TIME", "TR", "TRACK", "TT", "U", "UL", "VAR", "VIDEO", "WBR"], type$.String));
    _lazyFinal($, "_context", "$get$_context", () => A._castToJsObject(A._wrapToDart(self)));
    _lazyFinal($, "_DART_OBJECT_PROPERTY_NAME", "$get$_DART_OBJECT_PROPERTY_NAME", () => A.getIsolateAffinityTag("_$dart_dartObject"));
    _lazyFinal($, "_dartProxyCtor", "$get$_dartProxyCtor", () => function DartObject(o) {
      this.o = o;
    });
    _lazyFinal($, "isSoundMode", "$get$isSoundMode", () => !A.findType("List<int>")._is(A._setArrayType([], A.findType("JSArray<int?>"))));
    _lazy($, "newBuiltValueToStringHelper", "$get$newBuiltValueToStringHelper", () => new A.newBuiltValueToStringHelper_closure());
    _lazyFinal($, "_runtimeType", "$get$_runtimeType", () => A.getRuntimeType(A.RegExp_RegExp("", true, false)));
    _lazyOld($, "_$buildStatusSerializer", "$get$_$buildStatusSerializer", () => new A._$BuildStatusSerializer());
    _lazyOld($, "_$buildResultSerializer", "$get$_$buildResultSerializer", () => new A._$BuildResultSerializer());
    _lazyOld($, "_$connectRequestSerializer", "$get$_$connectRequestSerializer", () => new A._$ConnectRequestSerializer());
    _lazyOld($, "_$debugEventSerializer", "$get$_$debugEventSerializer", () => new A._$DebugEventSerializer());
    _lazyOld($, "_$devToolsRequestSerializer", "$get$_$devToolsRequestSerializer", () => new A._$DevToolsRequestSerializer());
    _lazyOld($, "_$devToolsResponseSerializer", "$get$_$devToolsResponseSerializer", () => new A._$DevToolsResponseSerializer());
    _lazyOld($, "_$errorResponseSerializer", "$get$_$errorResponseSerializer", () => new A._$ErrorResponseSerializer());
    _lazyOld($, "_$extensionRequestSerializer", "$get$_$extensionRequestSerializer", () => new A._$ExtensionRequestSerializer());
    _lazyOld($, "_$extensionResponseSerializer", "$get$_$extensionResponseSerializer", () => new A._$ExtensionResponseSerializer());
    _lazyOld($, "_$extensionEventSerializer", "$get$_$extensionEventSerializer", () => new A._$ExtensionEventSerializer());
    _lazyOld($, "_$batchedEventsSerializer", "$get$_$batchedEventsSerializer", () => new A._$BatchedEventsSerializer());
    _lazyOld($, "_$isolateExitSerializer", "$get$_$isolateExitSerializer", () => new A._$IsolateExitSerializer());
    _lazyOld($, "_$isolateStartSerializer", "$get$_$isolateStartSerializer", () => new A._$IsolateStartSerializer());
    _lazyOld($, "_$registerEventSerializer", "$get$_$registerEventSerializer", () => new A._$RegisterEventSerializer());
    _lazyOld($, "_$runRequestSerializer", "$get$_$runRequestSerializer", () => new A._$RunRequestSerializer());
    _lazyOld($, "serializers", "$get$serializers", () => $.$get$_$serializers());
    _lazyOld($, "_$serializers", "$get$_$serializers", () => {
      var t1 = A.Serializers_Serializers();
      t1 = A.BuiltJsonSerializersBuilder$_(t1._typeToSerializer.toBuilder$0(), t1._wireNameToSerializer.toBuilder$0(), t1._typeNameToSerializer.toBuilder$0(), t1.builderFactories.toBuilder$0(), t1.serializerPlugins.toBuilder$0());
      t1.add$1(0, $.$get$_$batchedEventsSerializer());
      t1.add$1(0, $.$get$_$buildResultSerializer());
      t1.add$1(0, $.$get$_$buildStatusSerializer());
      t1.add$1(0, $.$get$_$connectRequestSerializer());
      t1.add$1(0, $.$get$_$debugEventSerializer());
      t1.add$1(0, $.$get$_$devToolsRequestSerializer());
      t1.add$1(0, $.$get$_$devToolsResponseSerializer());
      t1.add$1(0, $.$get$_$errorResponseSerializer());
      t1.add$1(0, $.$get$_$extensionEventSerializer());
      t1.add$1(0, $.$get$_$extensionRequestSerializer());
      t1.add$1(0, $.$get$_$extensionResponseSerializer());
      t1.add$1(0, $.$get$_$isolateExitSerializer());
      t1.add$1(0, $.$get$_$isolateStartSerializer());
      t1.add$1(0, $.$get$_$registerEventSerializer());
      t1.add$1(0, $.$get$_$runRequestSerializer());
      t1.addBuilderFactory$2(B.FullType_w24, new A._$serializers_closure());
      return t1.build$0();
    });
    _lazyFinal($, "Logger_root", "$get$Logger_root", () => A.Logger_Logger(""));
    _lazyFinal($, "_requestPool", "$get$_requestPool", () => {
      var t4,
        t1 = A.findType("Completer<PoolResource>"),
        t2 = A.ListQueue$(t1),
        t3 = A.ListQueue$(type$.void_Function);
      t1 = A.ListQueue$(t1);
      t4 = A.Completer_Completer(type$.dynamic);
      return new A.Pool(t2, t3, t1, 1000, new A.AsyncMemoizer(t4, A.findType("AsyncMemoizer<@>")));
    });
    _lazyFinal($, "Uuid__byteToHex", "$get$Uuid__byteToHex", () => {
      var i,
        _list = J.JSArray_JSArray$allocateGrowable(256, type$.String);
      for (i = 0; i < 256; ++i)
        _list[i] = B.JSString_methods.padLeft$2(B.JSInt_methods.toRadixString$1(i, 16), 2, "0");
      return _list;
    });
    _lazyFinal($, "Uuid__stateExpando", "$get$Uuid__stateExpando", () => new A.Expando(new WeakMap(), A.findType("Expando<Map<String,@>>")));
    _lazyFinal($, "UuidUtil__random", "$get$UuidUtil__random", () => A.Random_Random(null));
    _lazyOld($, "_createScript", "$get$_createScript", () => new A._createScript_closure().call$0());
    _lazyOld($, "_noncePattern", "$get$_noncePattern", () => A.RegExp_RegExp("^[\\w+/_-]+[=]{0,2}$", true, false));
  })();
  (function nativeSupport() {
    !function() {
      var intern = function(s) {
        var o = {};
        o[s] = 1;
        return Object.keys(hunkHelpers.convertToFastObject(o))[0];
      };
      init.getIsolateTag = function(name) {
        return intern("___dart_" + name + init.isolateTag);
      };
      var tableProperty = "___dart_isolate_tags_";
      var usedProperties = Object[tableProperty] || (Object[tableProperty] = Object.create(null));
      var rootProperty = "_ZxYxX";
      for (var i = 0;; i++) {
        var property = intern(rootProperty + "_" + i + "_");
        if (!(property in usedProperties)) {
          usedProperties[property] = 1;
          init.isolateTag = property;
          break;
        }
      }
      init.dispatchPropertyName = init.getIsolateTag("dispatch_record");
    }();
    hunkHelpers.setOrUpdateInterceptorsByTag({AnimationEffectReadOnly: J.Interceptor, AnimationEffectTiming: J.Interceptor, AnimationEffectTimingReadOnly: J.Interceptor, AnimationTimeline: J.Interceptor, AnimationWorkletGlobalScope: J.Interceptor, AuthenticatorAssertionResponse: J.Interceptor, AuthenticatorAttestationResponse: J.Interceptor, AuthenticatorResponse: J.Interceptor, BackgroundFetchFetch: J.Interceptor, BackgroundFetchManager: J.Interceptor, BackgroundFetchSettledFetch: J.Interceptor, BarProp: J.Interceptor, BarcodeDetector: J.Interceptor, BluetoothRemoteGATTDescriptor: J.Interceptor, Body: J.Interceptor, BudgetState: J.Interceptor, CacheStorage: J.Interceptor, CanvasGradient: J.Interceptor, CanvasPattern: J.Interceptor, CanvasRenderingContext2D: J.Interceptor, Client: J.Interceptor, Clients: J.Interceptor, CookieStore: J.Interceptor, Coordinates: J.Interceptor, Credential: J.Interceptor, CredentialUserData: J.Interceptor, CredentialsContainer: J.Interceptor, Crypto: J.Interceptor, CryptoKey: J.Interceptor, CSS: J.Interceptor, CSSVariableReferenceValue: J.Interceptor, CustomElementRegistry: J.Interceptor, DataTransfer: J.Interceptor, DataTransferItem: J.Interceptor, DeprecatedStorageInfo: J.Interceptor, DeprecatedStorageQuota: J.Interceptor, DeprecationReport: J.Interceptor, DetectedBarcode: J.Interceptor, DetectedFace: J.Interceptor, DetectedText: J.Interceptor, DeviceAcceleration: J.Interceptor, DeviceRotationRate: J.Interceptor, DirectoryEntry: J.Interceptor, DirectoryReader: J.Interceptor, DocumentOrShadowRoot: J.Interceptor, DocumentTimeline: J.Interceptor, DOMError: J.Interceptor, Iterator: J.Interceptor, DOMMatrix: J.Interceptor, DOMMatrixReadOnly: J.Interceptor, DOMParser: J.Interceptor, DOMPoint: J.Interceptor, DOMPointReadOnly: J.Interceptor, DOMQuad: J.Interceptor, DOMStringMap: J.Interceptor, Entry: J.Interceptor, External: J.Interceptor, FaceDetector: J.Interceptor, FederatedCredential: J.Interceptor, FileEntry: J.Interceptor, DOMFileSystem: J.Interceptor, FontFace: J.Interceptor, FontFaceSource: J.Interceptor, FormData: J.Interceptor, GamepadButton: J.Interceptor, GamepadPose: J.Interceptor, Geolocation: J.Interceptor, Position: J.Interceptor, GeolocationPosition: J.Interceptor, Headers: J.Interceptor, HTMLHyperlinkElementUtils: J.Interceptor, IdleDeadline: J.Interceptor, ImageBitmap: J.Interceptor, ImageBitmapRenderingContext: J.Interceptor, ImageCapture: J.Interceptor, InputDeviceCapabilities: J.Interceptor, IntersectionObserver: J.Interceptor, IntersectionObserverEntry: J.Interceptor, InterventionReport: J.Interceptor, KeyframeEffect: J.Interceptor, KeyframeEffectReadOnly: J.Interceptor, MediaCapabilities: J.Interceptor, MediaCapabilitiesInfo: J.Interceptor, MediaDeviceInfo: J.Interceptor, MediaError: J.Interceptor, MediaKeyStatusMap: J.Interceptor, MediaKeySystemAccess: J.Interceptor, MediaKeys: J.Interceptor, MediaKeysPolicy: J.Interceptor, MediaMetadata: J.Interceptor, MediaSession: J.Interceptor, MediaSettingsRange: J.Interceptor, MemoryInfo: J.Interceptor, MessageChannel: J.Interceptor, Metadata: J.Interceptor, MutationObserver: J.Interceptor, WebKitMutationObserver: J.Interceptor, MutationRecord: J.Interceptor, NavigationPreloadManager: J.Interceptor, Navigator: J.Interceptor, NavigatorAutomationInformation: J.Interceptor, NavigatorConcurrentHardware: J.Interceptor, NavigatorCookies: J.Interceptor, NavigatorUserMediaError: J.Interceptor, NodeFilter: J.Interceptor, NodeIterator: J.Interceptor, NonDocumentTypeChildNode: J.Interceptor, NonElementParentNode: J.Interceptor, NoncedElement: J.Interceptor, OffscreenCanvasRenderingContext2D: J.Interceptor, OverconstrainedError: J.Interceptor, PaintRenderingContext2D: J.Interceptor, PaintSize: J.Interceptor, PaintWorkletGlobalScope: J.Interceptor, PasswordCredential: J.Interceptor, Path2D: J.Interceptor, PaymentAddress: J.Interceptor, PaymentInstruments: J.Interceptor, PaymentManager: J.Interceptor, PaymentResponse: J.Interceptor, PerformanceEntry: J.Interceptor, PerformanceLongTaskTiming: J.Interceptor, PerformanceMark: J.Interceptor, PerformanceMeasure: J.Interceptor, PerformanceNavigation: J.Interceptor, PerformanceNavigationTiming: J.Interceptor, PerformanceObserver: J.Interceptor, PerformanceObserverEntryList: J.Interceptor, PerformancePaintTiming: J.Interceptor, PerformanceResourceTiming: J.Interceptor, PerformanceServerTiming: J.Interceptor, PerformanceTiming: J.Interceptor, Permissions: J.Interceptor, PhotoCapabilities: J.Interceptor, PositionError: J.Interceptor, GeolocationPositionError: J.Interceptor, Presentation: J.Interceptor, PresentationReceiver: J.Interceptor, PublicKeyCredential: J.Interceptor, PushManager: J.Interceptor, PushMessageData: J.Interceptor, PushSubscription: J.Interceptor, PushSubscriptionOptions: J.Interceptor, Range: J.Interceptor, RelatedApplication: J.Interceptor, ReportBody: J.Interceptor, ReportingObserver: J.Interceptor, ResizeObserver: J.Interceptor, ResizeObserverEntry: J.Interceptor, RTCCertificate: J.Interceptor, RTCIceCandidate: J.Interceptor, mozRTCIceCandidate: J.Interceptor, RTCLegacyStatsReport: J.Interceptor, RTCRtpContributingSource: J.Interceptor, RTCRtpReceiver: J.Interceptor, RTCRtpSender: J.Interceptor, RTCSessionDescription: J.Interceptor, mozRTCSessionDescription: J.Interceptor, RTCStatsResponse: J.Interceptor, Screen: J.Interceptor, ScrollState: J.Interceptor, ScrollTimeline: J.Interceptor, Selection: J.Interceptor, SharedArrayBuffer: J.Interceptor, SpeechRecognitionAlternative: J.Interceptor, SpeechSynthesisVoice: J.Interceptor, StaticRange: J.Interceptor, StorageManager: J.Interceptor, StyleMedia: J.Interceptor, StylePropertyMap: J.Interceptor, StylePropertyMapReadonly: J.Interceptor, SyncManager: J.Interceptor, TaskAttributionTiming: J.Interceptor, TextDetector: J.Interceptor, TextMetrics: J.Interceptor, TrackDefault: J.Interceptor, TreeWalker: J.Interceptor, TrustedHTML: J.Interceptor, TrustedScriptURL: J.Interceptor, TrustedURL: J.Interceptor, UnderlyingSourceBase: J.Interceptor, URLSearchParams: J.Interceptor, VRCoordinateSystem: J.Interceptor, VRDisplayCapabilities: J.Interceptor, VREyeParameters: J.Interceptor, VRFrameData: J.Interceptor, VRFrameOfReference: J.Interceptor, VRPose: J.Interceptor, VRStageBounds: J.Interceptor, VRStageBoundsPoint: J.Interceptor, VRStageParameters: J.Interceptor, ValidityState: J.Interceptor, VideoPlaybackQuality: J.Interceptor, VideoTrack: J.Interceptor, VTTRegion: J.Interceptor, WindowClient: J.Interceptor, WorkletAnimation: J.Interceptor, WorkletGlobalScope: J.Interceptor, XPathEvaluator: J.Interceptor, XPathExpression: J.Interceptor, XPathNSResolver: J.Interceptor, XPathResult: J.Interceptor, XMLSerializer: J.Interceptor, XSLTProcessor: J.Interceptor, Bluetooth: J.Interceptor, BluetoothCharacteristicProperties: J.Interceptor, BluetoothRemoteGATTServer: J.Interceptor, BluetoothRemoteGATTService: J.Interceptor, BluetoothUUID: J.Interceptor, BudgetService: J.Interceptor, Cache: J.Interceptor, DOMFileSystemSync: J.Interceptor, DirectoryEntrySync: J.Interceptor, DirectoryReaderSync: J.Interceptor, EntrySync: J.Interceptor, FileEntrySync: J.Interceptor, FileReaderSync: J.Interceptor, FileWriterSync: J.Interceptor, HTMLAllCollection: J.Interceptor, Mojo: J.Interceptor, MojoHandle: J.Interceptor, MojoWatcher: J.Interceptor, NFC: J.Interceptor, PagePopupController: J.Interceptor, Report: J.Interceptor, Request: J.Interceptor, Response: J.Interceptor, SubtleCrypto: J.Interceptor, USBAlternateInterface: J.Interceptor, USBConfiguration: J.Interceptor, USBDevice: J.Interceptor, USBEndpoint: J.Interceptor, USBInTransferResult: J.Interceptor, USBInterface: J.Interceptor, USBIsochronousInTransferPacket: J.Interceptor, USBIsochronousInTransferResult: J.Interceptor, USBIsochronousOutTransferPacket: J.Interceptor, USBIsochronousOutTransferResult: J.Interceptor, USBOutTransferResult: J.Interceptor, WorkerLocation: J.Interceptor, WorkerNavigator: J.Interceptor, Worklet: J.Interceptor, IDBCursor: J.Interceptor, IDBCursorWithValue: J.Interceptor, IDBFactory: J.Interceptor, IDBIndex: J.Interceptor, IDBObjectStore: J.Interceptor, IDBObservation: J.Interceptor, IDBObserver: J.Interceptor, IDBObserverChanges: J.Interceptor, SVGAngle: J.Interceptor, SVGAnimatedAngle: J.Interceptor, SVGAnimatedBoolean: J.Interceptor, SVGAnimatedEnumeration: J.Interceptor, SVGAnimatedInteger: J.Interceptor, SVGAnimatedLength: J.Interceptor, SVGAnimatedLengthList: J.Interceptor, SVGAnimatedNumber: J.Interceptor, SVGAnimatedNumberList: J.Interceptor, SVGAnimatedPreserveAspectRatio: J.Interceptor, SVGAnimatedRect: J.Interceptor, SVGAnimatedString: J.Interceptor, SVGAnimatedTransformList: J.Interceptor, SVGMatrix: J.Interceptor, SVGPoint: J.Interceptor, SVGPreserveAspectRatio: J.Interceptor, SVGRect: J.Interceptor, SVGUnitTypes: J.Interceptor, AudioListener: J.Interceptor, AudioParam: J.Interceptor, AudioTrack: J.Interceptor, AudioWorkletGlobalScope: J.Interceptor, AudioWorkletProcessor: J.Interceptor, PeriodicWave: J.Interceptor, WebGLActiveInfo: J.Interceptor, ANGLEInstancedArrays: J.Interceptor, ANGLE_instanced_arrays: J.Interceptor, WebGLBuffer: J.Interceptor, WebGLCanvas: J.Interceptor, WebGLColorBufferFloat: J.Interceptor, WebGLCompressedTextureASTC: J.Interceptor, WebGLCompressedTextureATC: J.Interceptor, WEBGL_compressed_texture_atc: J.Interceptor, WebGLCompressedTextureETC1: J.Interceptor, WEBGL_compressed_texture_etc1: J.Interceptor, WebGLCompressedTextureETC: J.Interceptor, WebGLCompressedTexturePVRTC: J.Interceptor, WEBGL_compressed_texture_pvrtc: J.Interceptor, WebGLCompressedTextureS3TC: J.Interceptor, WEBGL_compressed_texture_s3tc: J.Interceptor, WebGLCompressedTextureS3TCsRGB: J.Interceptor, WebGLDebugRendererInfo: J.Interceptor, WEBGL_debug_renderer_info: J.Interceptor, WebGLDebugShaders: J.Interceptor, WEBGL_debug_shaders: J.Interceptor, WebGLDepthTexture: J.Interceptor, WEBGL_depth_texture: J.Interceptor, WebGLDrawBuffers: J.Interceptor, WEBGL_draw_buffers: J.Interceptor, EXTsRGB: J.Interceptor, EXT_sRGB: J.Interceptor, EXTBlendMinMax: J.Interceptor, EXT_blend_minmax: J.Interceptor, EXTColorBufferFloat: J.Interceptor, EXTColorBufferHalfFloat: J.Interceptor, EXTDisjointTimerQuery: J.Interceptor, EXTDisjointTimerQueryWebGL2: J.Interceptor, EXTFragDepth: J.Interceptor, EXT_frag_depth: J.Interceptor, EXTShaderTextureLOD: J.Interceptor, EXT_shader_texture_lod: J.Interceptor, EXTTextureFilterAnisotropic: J.Interceptor, EXT_texture_filter_anisotropic: J.Interceptor, WebGLFramebuffer: J.Interceptor, WebGLGetBufferSubDataAsync: J.Interceptor, WebGLLoseContext: J.Interceptor, WebGLExtensionLoseContext: J.Interceptor, WEBGL_lose_context: J.Interceptor, OESElementIndexUint: J.Interceptor, OES_element_index_uint: J.Interceptor, OESStandardDerivatives: J.Interceptor, OES_standard_derivatives: J.Interceptor, OESTextureFloat: J.Interceptor, OES_texture_float: J.Interceptor, OESTextureFloatLinear: J.Interceptor, OES_texture_float_linear: J.Interceptor, OESTextureHalfFloat: J.Interceptor, OES_texture_half_float: J.Interceptor, OESTextureHalfFloatLinear: J.Interceptor, OES_texture_half_float_linear: J.Interceptor, OESVertexArrayObject: J.Interceptor, OES_vertex_array_object: J.Interceptor, WebGLProgram: J.Interceptor, WebGLQuery: J.Interceptor, WebGLRenderbuffer: J.Interceptor, WebGLRenderingContext: J.Interceptor, WebGL2RenderingContext: J.Interceptor, WebGLSampler: J.Interceptor, WebGLShader: J.Interceptor, WebGLShaderPrecisionFormat: J.Interceptor, WebGLSync: J.Interceptor, WebGLTexture: J.Interceptor, WebGLTimerQueryEXT: J.Interceptor, WebGLTransformFeedback: J.Interceptor, WebGLUniformLocation: J.Interceptor, WebGLVertexArrayObject: J.Interceptor, WebGLVertexArrayObjectOES: J.Interceptor, WebGL: J.Interceptor, WebGL2RenderingContextBase: J.Interceptor, ArrayBuffer: A.NativeByteBuffer, ArrayBufferView: A.NativeTypedData, DataView: A.NativeByteData, Float32Array: A.NativeFloat32List, Float64Array: A.NativeFloat64List, Int16Array: A.NativeInt16List, Int32Array: A.NativeInt32List, Int8Array: A.NativeInt8List, Uint16Array: A.NativeUint16List, Uint32Array: A.NativeUint32List, Uint8ClampedArray: A.NativeUint8ClampedList, CanvasPixelArray: A.NativeUint8ClampedList, Uint8Array: A.NativeUint8List, HTMLAudioElement: A.HtmlElement, HTMLBRElement: A.HtmlElement, HTMLButtonElement: A.HtmlElement, HTMLCanvasElement: A.HtmlElement, HTMLContentElement: A.HtmlElement, HTMLDListElement: A.HtmlElement, HTMLDataElement: A.HtmlElement, HTMLDataListElement: A.HtmlElement, HTMLDetailsElement: A.HtmlElement, HTMLDialogElement: A.HtmlElement, HTMLDivElement: A.HtmlElement, HTMLEmbedElement: A.HtmlElement, HTMLFieldSetElement: A.HtmlElement, HTMLHRElement: A.HtmlElement, HTMLHeadElement: A.HtmlElement, HTMLHeadingElement: A.HtmlElement, HTMLHtmlElement: A.HtmlElement, HTMLIFrameElement: A.HtmlElement, HTMLImageElement: A.HtmlElement, HTMLInputElement: A.HtmlElement, HTMLLIElement: A.HtmlElement, HTMLLabelElement: A.HtmlElement, HTMLLegendElement: A.HtmlElement, HTMLLinkElement: A.HtmlElement, HTMLMapElement: A.HtmlElement, HTMLMediaElement: A.HtmlElement, HTMLMenuElement: A.HtmlElement, HTMLMetaElement: A.HtmlElement, HTMLMeterElement: A.HtmlElement, HTMLModElement: A.HtmlElement, HTMLOListElement: A.HtmlElement, HTMLObjectElement: A.HtmlElement, HTMLOptGroupElement: A.HtmlElement, HTMLOptionElement: A.HtmlElement, HTMLOutputElement: A.HtmlElement, HTMLParagraphElement: A.HtmlElement, HTMLParamElement: A.HtmlElement, HTMLPictureElement: A.HtmlElement, HTMLPreElement: A.HtmlElement, HTMLProgressElement: A.HtmlElement, HTMLQuoteElement: A.HtmlElement, HTMLShadowElement: A.HtmlElement, HTMLSlotElement: A.HtmlElement, HTMLSourceElement: A.HtmlElement, HTMLSpanElement: A.HtmlElement, HTMLStyleElement: A.HtmlElement, HTMLTableCaptionElement: A.HtmlElement, HTMLTableCellElement: A.HtmlElement, HTMLTableDataCellElement: A.HtmlElement, HTMLTableHeaderCellElement: A.HtmlElement, HTMLTableColElement: A.HtmlElement, HTMLTextAreaElement: A.HtmlElement, HTMLTimeElement: A.HtmlElement, HTMLTitleElement: A.HtmlElement, HTMLTrackElement: A.HtmlElement, HTMLUListElement: A.HtmlElement, HTMLUnknownElement: A.HtmlElement, HTMLVideoElement: A.HtmlElement, HTMLDirectoryElement: A.HtmlElement, HTMLFontElement: A.HtmlElement, HTMLFrameElement: A.HtmlElement, HTMLFrameSetElement: A.HtmlElement, HTMLMarqueeElement: A.HtmlElement, HTMLElement: A.HtmlElement, AccessibleNodeList: A.AccessibleNodeList, HTMLAnchorElement: A.AnchorElement, HTMLAreaElement: A.AreaElement, HTMLBaseElement: A.BaseElement, Blob: A.Blob, HTMLBodyElement: A.BodyElement, CDATASection: A.CharacterData, CharacterData: A.CharacterData, Comment: A.CharacterData, ProcessingInstruction: A.CharacterData, Text: A.CharacterData, CloseEvent: A.CloseEvent, CSSPerspective: A.CssPerspective, CSSCharsetRule: A.CssRule, CSSConditionRule: A.CssRule, CSSFontFaceRule: A.CssRule, CSSGroupingRule: A.CssRule, CSSImportRule: A.CssRule, CSSKeyframeRule: A.CssRule, MozCSSKeyframeRule: A.CssRule, WebKitCSSKeyframeRule: A.CssRule, CSSKeyframesRule: A.CssRule, MozCSSKeyframesRule: A.CssRule, WebKitCSSKeyframesRule: A.CssRule, CSSMediaRule: A.CssRule, CSSNamespaceRule: A.CssRule, CSSPageRule: A.CssRule, CSSRule: A.CssRule, CSSStyleRule: A.CssRule, CSSSupportsRule: A.CssRule, CSSViewportRule: A.CssRule, CSSStyleDeclaration: A.CssStyleDeclaration, MSStyleCSSProperties: A.CssStyleDeclaration, CSS2Properties: A.CssStyleDeclaration, CSSImageValue: A.CssStyleValue, CSSKeywordValue: A.CssStyleValue, CSSNumericValue: A.CssStyleValue, CSSPositionValue: A.CssStyleValue, CSSResourceValue: A.CssStyleValue, CSSUnitValue: A.CssStyleValue, CSSURLImageValue: A.CssStyleValue, CSSStyleValue: A.CssStyleValue, CSSMatrixComponent: A.CssTransformComponent, CSSRotation: A.CssTransformComponent, CSSScale: A.CssTransformComponent, CSSSkew: A.CssTransformComponent, CSSTranslation: A.CssTransformComponent, CSSTransformComponent: A.CssTransformComponent, CSSTransformValue: A.CssTransformValue, CSSUnparsedValue: A.CssUnparsedValue, CustomEvent: A.CustomEvent, DataTransferItemList: A.DataTransferItemList, XMLDocument: A.Document, Document: A.Document, DOMException: A.DomException, DOMImplementation: A.DomImplementation, ClientRectList: A.DomRectList, DOMRectList: A.DomRectList, DOMRectReadOnly: A.DomRectReadOnly, DOMStringList: A.DomStringList, DOMTokenList: A.DomTokenList, Element: A.Element, AbortPaymentEvent: A.Event, AnimationEvent: A.Event, AnimationPlaybackEvent: A.Event, ApplicationCacheErrorEvent: A.Event, BackgroundFetchClickEvent: A.Event, BackgroundFetchEvent: A.Event, BackgroundFetchFailEvent: A.Event, BackgroundFetchedEvent: A.Event, BeforeInstallPromptEvent: A.Event, BeforeUnloadEvent: A.Event, BlobEvent: A.Event, CanMakePaymentEvent: A.Event, ClipboardEvent: A.Event, DeviceMotionEvent: A.Event, DeviceOrientationEvent: A.Event, ErrorEvent: A.Event, ExtendableEvent: A.Event, ExtendableMessageEvent: A.Event, FetchEvent: A.Event, FontFaceSetLoadEvent: A.Event, ForeignFetchEvent: A.Event, GamepadEvent: A.Event, HashChangeEvent: A.Event, InstallEvent: A.Event, MediaEncryptedEvent: A.Event, MediaKeyMessageEvent: A.Event, MediaQueryListEvent: A.Event, MediaStreamEvent: A.Event, MediaStreamTrackEvent: A.Event, MIDIConnectionEvent: A.Event, MIDIMessageEvent: A.Event, MutationEvent: A.Event, NotificationEvent: A.Event, PageTransitionEvent: A.Event, PaymentRequestEvent: A.Event, PaymentRequestUpdateEvent: A.Event, PopStateEvent: A.Event, PresentationConnectionAvailableEvent: A.Event, PresentationConnectionCloseEvent: A.Event, PromiseRejectionEvent: A.Event, PushEvent: A.Event, RTCDataChannelEvent: A.Event, RTCDTMFToneChangeEvent: A.Event, RTCPeerConnectionIceEvent: A.Event, RTCTrackEvent: A.Event, SecurityPolicyViolationEvent: A.Event, SensorErrorEvent: A.Event, SpeechRecognitionError: A.Event, SpeechRecognitionEvent: A.Event, SpeechSynthesisEvent: A.Event, StorageEvent: A.Event, SyncEvent: A.Event, TrackEvent: A.Event, TransitionEvent: A.Event, WebKitTransitionEvent: A.Event, VRDeviceEvent: A.Event, VRDisplayEvent: A.Event, VRSessionEvent: A.Event, MojoInterfaceRequestEvent: A.Event, USBConnectionEvent: A.Event, IDBVersionChangeEvent: A.Event, AudioProcessingEvent: A.Event, OfflineAudioCompletionEvent: A.Event, WebGLContextEvent: A.Event, Event: A.Event, InputEvent: A.Event, SubmitEvent: A.Event, EventSource: A.EventSource, AbsoluteOrientationSensor: A.EventTarget, Accelerometer: A.EventTarget, AccessibleNode: A.EventTarget, AmbientLightSensor: A.EventTarget, Animation: A.EventTarget, ApplicationCache: A.EventTarget, DOMApplicationCache: A.EventTarget, OfflineResourceList: A.EventTarget, BackgroundFetchRegistration: A.EventTarget, BatteryManager: A.EventTarget, BroadcastChannel: A.EventTarget, CanvasCaptureMediaStreamTrack: A.EventTarget, FileReader: A.EventTarget, FontFaceSet: A.EventTarget, Gyroscope: A.EventTarget, LinearAccelerationSensor: A.EventTarget, Magnetometer: A.EventTarget, MediaDevices: A.EventTarget, MediaKeySession: A.EventTarget, MediaQueryList: A.EventTarget, MediaRecorder: A.EventTarget, MediaSource: A.EventTarget, MediaStream: A.EventTarget, MediaStreamTrack: A.EventTarget, MIDIAccess: A.EventTarget, MIDIInput: A.EventTarget, MIDIOutput: A.EventTarget, MIDIPort: A.EventTarget, NetworkInformation: A.EventTarget, Notification: A.EventTarget, OffscreenCanvas: A.EventTarget, OrientationSensor: A.EventTarget, PaymentRequest: A.EventTarget, Performance: A.EventTarget, PermissionStatus: A.EventTarget, PresentationAvailability: A.EventTarget, PresentationConnection: A.EventTarget, PresentationConnectionList: A.EventTarget, PresentationRequest: A.EventTarget, RelativeOrientationSensor: A.EventTarget, RemotePlayback: A.EventTarget, RTCDataChannel: A.EventTarget, DataChannel: A.EventTarget, RTCDTMFSender: A.EventTarget, RTCPeerConnection: A.EventTarget, webkitRTCPeerConnection: A.EventTarget, mozRTCPeerConnection: A.EventTarget, ScreenOrientation: A.EventTarget, Sensor: A.EventTarget, ServiceWorker: A.EventTarget, ServiceWorkerContainer: A.EventTarget, ServiceWorkerRegistration: A.EventTarget, SharedWorker: A.EventTarget, SpeechRecognition: A.EventTarget, SpeechSynthesis: A.EventTarget, SpeechSynthesisUtterance: A.EventTarget, VR: A.EventTarget, VRDevice: A.EventTarget, VRDisplay: A.EventTarget, VRSession: A.EventTarget, VisualViewport: A.EventTarget, Worker: A.EventTarget, WorkerPerformance: A.EventTarget, BluetoothDevice: A.EventTarget, BluetoothRemoteGATTCharacteristic: A.EventTarget, Clipboard: A.EventTarget, MojoInterfaceInterceptor: A.EventTarget, USB: A.EventTarget, IDBDatabase: A.EventTarget, IDBOpenDBRequest: A.EventTarget, IDBVersionChangeRequest: A.EventTarget, IDBRequest: A.EventTarget, IDBTransaction: A.EventTarget, AnalyserNode: A.EventTarget, RealtimeAnalyserNode: A.EventTarget, AudioBufferSourceNode: A.EventTarget, AudioDestinationNode: A.EventTarget, AudioNode: A.EventTarget, AudioScheduledSourceNode: A.EventTarget, AudioWorkletNode: A.EventTarget, BiquadFilterNode: A.EventTarget, ChannelMergerNode: A.EventTarget, AudioChannelMerger: A.EventTarget, ChannelSplitterNode: A.EventTarget, AudioChannelSplitter: A.EventTarget, ConstantSourceNode: A.EventTarget, ConvolverNode: A.EventTarget, DelayNode: A.EventTarget, DynamicsCompressorNode: A.EventTarget, GainNode: A.EventTarget, AudioGainNode: A.EventTarget, IIRFilterNode: A.EventTarget, MediaElementAudioSourceNode: A.EventTarget, MediaStreamAudioDestinationNode: A.EventTarget, MediaStreamAudioSourceNode: A.EventTarget, OscillatorNode: A.EventTarget, Oscillator: A.EventTarget, PannerNode: A.EventTarget, AudioPannerNode: A.EventTarget, webkitAudioPannerNode: A.EventTarget, ScriptProcessorNode: A.EventTarget, JavaScriptAudioNode: A.EventTarget, StereoPannerNode: A.EventTarget, WaveShaperNode: A.EventTarget, EventTarget: A.EventTarget, File: A.File, FileList: A.FileList, FileWriter: A.FileWriter, HTMLFormElement: A.FormElement, Gamepad: A.Gamepad, History: A.History, HTMLCollection: A.HtmlCollection, HTMLFormControlsCollection: A.HtmlCollection, HTMLOptionsCollection: A.HtmlCollection, HTMLDocument: A.HtmlDocument, XMLHttpRequest: A.HttpRequest, XMLHttpRequestUpload: A.HttpRequestEventTarget, XMLHttpRequestEventTarget: A.HttpRequestEventTarget, ImageData: A.ImageData, KeyboardEvent: A.KeyboardEvent, Location: A.Location, MediaList: A.MediaList, MessageEvent: A.MessageEvent, MessagePort: A.MessagePort, MIDIInputMap: A.MidiInputMap, MIDIOutputMap: A.MidiOutputMap, MimeType: A.MimeType, MimeTypeArray: A.MimeTypeArray, DocumentFragment: A.Node, ShadowRoot: A.Node, DocumentType: A.Node, Node: A.Node, NodeList: A.NodeList, RadioNodeList: A.NodeList, Plugin: A.Plugin, PluginArray: A.PluginArray, ProgressEvent: A.ProgressEvent, ResourceProgressEvent: A.ProgressEvent, RTCStatsReport: A.RtcStatsReport, HTMLScriptElement: A.ScriptElement, HTMLSelectElement: A.SelectElement, SourceBuffer: A.SourceBuffer, SourceBufferList: A.SourceBufferList, SpeechGrammar: A.SpeechGrammar, SpeechGrammarList: A.SpeechGrammarList, SpeechRecognitionResult: A.SpeechRecognitionResult, Storage: A.Storage, CSSStyleSheet: A.StyleSheet, StyleSheet: A.StyleSheet, HTMLTableElement: A.TableElement, HTMLTableRowElement: A.TableRowElement, HTMLTableSectionElement: A.TableSectionElement, HTMLTemplateElement: A.TemplateElement, TextTrack: A.TextTrack, TextTrackCue: A.TextTrackCue, VTTCue: A.TextTrackCue, TextTrackCueList: A.TextTrackCueList, TextTrackList: A.TextTrackList, TimeRanges: A.TimeRanges, Touch: A.Touch, TouchList: A.TouchList, TrackDefaultList: A.TrackDefaultList, CompositionEvent: A.UIEvent, FocusEvent: A.UIEvent, MouseEvent: A.UIEvent, DragEvent: A.UIEvent, PointerEvent: A.UIEvent, TextEvent: A.UIEvent, TouchEvent: A.UIEvent, WheelEvent: A.UIEvent, UIEvent: A.UIEvent, URL: A.Url, VideoTrackList: A.VideoTrackList, WebSocket: A.WebSocket, Window: A.Window, DOMWindow: A.Window, DedicatedWorkerGlobalScope: A.WorkerGlobalScope, ServiceWorkerGlobalScope: A.WorkerGlobalScope, SharedWorkerGlobalScope: A.WorkerGlobalScope, WorkerGlobalScope: A.WorkerGlobalScope, Attr: A._Attr, CSSRuleList: A._CssRuleList, ClientRect: A._DomRect, DOMRect: A._DomRect, GamepadList: A._GamepadList, NamedNodeMap: A._NamedNodeMap, MozNamedAttrMap: A._NamedNodeMap, SpeechRecognitionResultList: A._SpeechRecognitionResultList, StyleSheetList: A._StyleSheetList, IDBKeyRange: A.KeyRange, SVGLength: A.Length, SVGLengthList: A.LengthList, SVGNumber: A.Number, SVGNumberList: A.NumberList, SVGPointList: A.PointList, SVGScriptElement: A.ScriptElement0, SVGStringList: A.StringList, SVGAElement: A.SvgElement, SVGAnimateElement: A.SvgElement, SVGAnimateMotionElement: A.SvgElement, SVGAnimateTransformElement: A.SvgElement, SVGAnimationElement: A.SvgElement, SVGCircleElement: A.SvgElement, SVGClipPathElement: A.SvgElement, SVGDefsElement: A.SvgElement, SVGDescElement: A.SvgElement, SVGDiscardElement: A.SvgElement, SVGEllipseElement: A.SvgElement, SVGFEBlendElement: A.SvgElement, SVGFEColorMatrixElement: A.SvgElement, SVGFEComponentTransferElement: A.SvgElement, SVGFECompositeElement: A.SvgElement, SVGFEConvolveMatrixElement: A.SvgElement, SVGFEDiffuseLightingElement: A.SvgElement, SVGFEDisplacementMapElement: A.SvgElement, SVGFEDistantLightElement: A.SvgElement, SVGFEFloodElement: A.SvgElement, SVGFEFuncAElement: A.SvgElement, SVGFEFuncBElement: A.SvgElement, SVGFEFuncGElement: A.SvgElement, SVGFEFuncRElement: A.SvgElement, SVGFEGaussianBlurElement: A.SvgElement, SVGFEImageElement: A.SvgElement, SVGFEMergeElement: A.SvgElement, SVGFEMergeNodeElement: A.SvgElement, SVGFEMorphologyElement: A.SvgElement, SVGFEOffsetElement: A.SvgElement, SVGFEPointLightElement: A.SvgElement, SVGFESpecularLightingElement: A.SvgElement, SVGFESpotLightElement: A.SvgElement, SVGFETileElement: A.SvgElement, SVGFETurbulenceElement: A.SvgElement, SVGFilterElement: A.SvgElement, SVGForeignObjectElement: A.SvgElement, SVGGElement: A.SvgElement, SVGGeometryElement: A.SvgElement, SVGGraphicsElement: A.SvgElement, SVGImageElement: A.SvgElement, SVGLineElement: A.SvgElement, SVGLinearGradientElement: A.SvgElement, SVGMarkerElement: A.SvgElement, SVGMaskElement: A.SvgElement, SVGMetadataElement: A.SvgElement, SVGPathElement: A.SvgElement, SVGPatternElement: A.SvgElement, SVGPolygonElement: A.SvgElement, SVGPolylineElement: A.SvgElement, SVGRadialGradientElement: A.SvgElement, SVGRectElement: A.SvgElement, SVGSetElement: A.SvgElement, SVGStopElement: A.SvgElement, SVGStyleElement: A.SvgElement, SVGSVGElement: A.SvgElement, SVGSwitchElement: A.SvgElement, SVGSymbolElement: A.SvgElement, SVGTSpanElement: A.SvgElement, SVGTextContentElement: A.SvgElement, SVGTextElement: A.SvgElement, SVGTextPathElement: A.SvgElement, SVGTextPositioningElement: A.SvgElement, SVGTitleElement: A.SvgElement, SVGUseElement: A.SvgElement, SVGViewElement: A.SvgElement, SVGGradientElement: A.SvgElement, SVGComponentTransferFunctionElement: A.SvgElement, SVGFEDropShadowElement: A.SvgElement, SVGMPathElement: A.SvgElement, SVGElement: A.SvgElement, SVGTransform: A.Transform, SVGTransformList: A.TransformList, AudioBuffer: A.AudioBuffer, AudioParamMap: A.AudioParamMap, AudioTrackList: A.AudioTrackList, AudioContext: A.BaseAudioContext, webkitAudioContext: A.BaseAudioContext, BaseAudioContext: A.BaseAudioContext, OfflineAudioContext: A.OfflineAudioContext});
    hunkHelpers.setOrUpdateLeafTags({AnimationEffectReadOnly: true, AnimationEffectTiming: true, AnimationEffectTimingReadOnly: true, AnimationTimeline: true, AnimationWorkletGlobalScope: true, AuthenticatorAssertionResponse: true, AuthenticatorAttestationResponse: true, AuthenticatorResponse: true, BackgroundFetchFetch: true, BackgroundFetchManager: true, BackgroundFetchSettledFetch: true, BarProp: true, BarcodeDetector: true, BluetoothRemoteGATTDescriptor: true, Body: true, BudgetState: true, CacheStorage: true, CanvasGradient: true, CanvasPattern: true, CanvasRenderingContext2D: true, Client: true, Clients: true, CookieStore: true, Coordinates: true, Credential: true, CredentialUserData: true, CredentialsContainer: true, Crypto: true, CryptoKey: true, CSS: true, CSSVariableReferenceValue: true, CustomElementRegistry: true, DataTransfer: true, DataTransferItem: true, DeprecatedStorageInfo: true, DeprecatedStorageQuota: true, DeprecationReport: true, DetectedBarcode: true, DetectedFace: true, DetectedText: true, DeviceAcceleration: true, DeviceRotationRate: true, DirectoryEntry: true, DirectoryReader: true, DocumentOrShadowRoot: true, DocumentTimeline: true, DOMError: true, Iterator: true, DOMMatrix: true, DOMMatrixReadOnly: true, DOMParser: true, DOMPoint: true, DOMPointReadOnly: true, DOMQuad: true, DOMStringMap: true, Entry: true, External: true, FaceDetector: true, FederatedCredential: true, FileEntry: true, DOMFileSystem: true, FontFace: true, FontFaceSource: true, FormData: true, GamepadButton: true, GamepadPose: true, Geolocation: true, Position: true, GeolocationPosition: true, Headers: true, HTMLHyperlinkElementUtils: true, IdleDeadline: true, ImageBitmap: true, ImageBitmapRenderingContext: true, ImageCapture: true, InputDeviceCapabilities: true, IntersectionObserver: true, IntersectionObserverEntry: true, InterventionReport: true, KeyframeEffect: true, KeyframeEffectReadOnly: true, MediaCapabilities: true, MediaCapabilitiesInfo: true, MediaDeviceInfo: true, MediaError: true, MediaKeyStatusMap: true, MediaKeySystemAccess: true, MediaKeys: true, MediaKeysPolicy: true, MediaMetadata: true, MediaSession: true, MediaSettingsRange: true, MemoryInfo: true, MessageChannel: true, Metadata: true, MutationObserver: true, WebKitMutationObserver: true, MutationRecord: true, NavigationPreloadManager: true, Navigator: true, NavigatorAutomationInformation: true, NavigatorConcurrentHardware: true, NavigatorCookies: true, NavigatorUserMediaError: true, NodeFilter: true, NodeIterator: true, NonDocumentTypeChildNode: true, NonElementParentNode: true, NoncedElement: true, OffscreenCanvasRenderingContext2D: true, OverconstrainedError: true, PaintRenderingContext2D: true, PaintSize: true, PaintWorkletGlobalScope: true, PasswordCredential: true, Path2D: true, PaymentAddress: true, PaymentInstruments: true, PaymentManager: true, PaymentResponse: true, PerformanceEntry: true, PerformanceLongTaskTiming: true, PerformanceMark: true, PerformanceMeasure: true, PerformanceNavigation: true, PerformanceNavigationTiming: true, PerformanceObserver: true, PerformanceObserverEntryList: true, PerformancePaintTiming: true, PerformanceResourceTiming: true, PerformanceServerTiming: true, PerformanceTiming: true, Permissions: true, PhotoCapabilities: true, PositionError: true, GeolocationPositionError: true, Presentation: true, PresentationReceiver: true, PublicKeyCredential: true, PushManager: true, PushMessageData: true, PushSubscription: true, PushSubscriptionOptions: true, Range: true, RelatedApplication: true, ReportBody: true, ReportingObserver: true, ResizeObserver: true, ResizeObserverEntry: true, RTCCertificate: true, RTCIceCandidate: true, mozRTCIceCandidate: true, RTCLegacyStatsReport: true, RTCRtpContributingSource: true, RTCRtpReceiver: true, RTCRtpSender: true, RTCSessionDescription: true, mozRTCSessionDescription: true, RTCStatsResponse: true, Screen: true, ScrollState: true, ScrollTimeline: true, Selection: true, SharedArrayBuffer: true, SpeechRecognitionAlternative: true, SpeechSynthesisVoice: true, StaticRange: true, StorageManager: true, StyleMedia: true, StylePropertyMap: true, StylePropertyMapReadonly: true, SyncManager: true, TaskAttributionTiming: true, TextDetector: true, TextMetrics: true, TrackDefault: true, TreeWalker: true, TrustedHTML: true, TrustedScriptURL: true, TrustedURL: true, UnderlyingSourceBase: true, URLSearchParams: true, VRCoordinateSystem: true, VRDisplayCapabilities: true, VREyeParameters: true, VRFrameData: true, VRFrameOfReference: true, VRPose: true, VRStageBounds: true, VRStageBoundsPoint: true, VRStageParameters: true, ValidityState: true, VideoPlaybackQuality: true, VideoTrack: true, VTTRegion: true, WindowClient: true, WorkletAnimation: true, WorkletGlobalScope: true, XPathEvaluator: true, XPathExpression: true, XPathNSResolver: true, XPathResult: true, XMLSerializer: true, XSLTProcessor: true, Bluetooth: true, BluetoothCharacteristicProperties: true, BluetoothRemoteGATTServer: true, BluetoothRemoteGATTService: true, BluetoothUUID: true, BudgetService: true, Cache: true, DOMFileSystemSync: true, DirectoryEntrySync: true, DirectoryReaderSync: true, EntrySync: true, FileEntrySync: true, FileReaderSync: true, FileWriterSync: true, HTMLAllCollection: true, Mojo: true, MojoHandle: true, MojoWatcher: true, NFC: true, PagePopupController: true, Report: true, Request: true, Response: true, SubtleCrypto: true, USBAlternateInterface: true, USBConfiguration: true, USBDevice: true, USBEndpoint: true, USBInTransferResult: true, USBInterface: true, USBIsochronousInTransferPacket: true, USBIsochronousInTransferResult: true, USBIsochronousOutTransferPacket: true, USBIsochronousOutTransferResult: true, USBOutTransferResult: true, WorkerLocation: true, WorkerNavigator: true, Worklet: true, IDBCursor: true, IDBCursorWithValue: true, IDBFactory: true, IDBIndex: true, IDBObjectStore: true, IDBObservation: true, IDBObserver: true, IDBObserverChanges: true, SVGAngle: true, SVGAnimatedAngle: true, SVGAnimatedBoolean: true, SVGAnimatedEnumeration: true, SVGAnimatedInteger: true, SVGAnimatedLength: true, SVGAnimatedLengthList: true, SVGAnimatedNumber: true, SVGAnimatedNumberList: true, SVGAnimatedPreserveAspectRatio: true, SVGAnimatedRect: true, SVGAnimatedString: true, SVGAnimatedTransformList: true, SVGMatrix: true, SVGPoint: true, SVGPreserveAspectRatio: true, SVGRect: true, SVGUnitTypes: true, AudioListener: true, AudioParam: true, AudioTrack: true, AudioWorkletGlobalScope: true, AudioWorkletProcessor: true, PeriodicWave: true, WebGLActiveInfo: true, ANGLEInstancedArrays: true, ANGLE_instanced_arrays: true, WebGLBuffer: true, WebGLCanvas: true, WebGLColorBufferFloat: true, WebGLCompressedTextureASTC: true, WebGLCompressedTextureATC: true, WEBGL_compressed_texture_atc: true, WebGLCompressedTextureETC1: true, WEBGL_compressed_texture_etc1: true, WebGLCompressedTextureETC: true, WebGLCompressedTexturePVRTC: true, WEBGL_compressed_texture_pvrtc: true, WebGLCompressedTextureS3TC: true, WEBGL_compressed_texture_s3tc: true, WebGLCompressedTextureS3TCsRGB: true, WebGLDebugRendererInfo: true, WEBGL_debug_renderer_info: true, WebGLDebugShaders: true, WEBGL_debug_shaders: true, WebGLDepthTexture: true, WEBGL_depth_texture: true, WebGLDrawBuffers: true, WEBGL_draw_buffers: true, EXTsRGB: true, EXT_sRGB: true, EXTBlendMinMax: true, EXT_blend_minmax: true, EXTColorBufferFloat: true, EXTColorBufferHalfFloat: true, EXTDisjointTimerQuery: true, EXTDisjointTimerQueryWebGL2: true, EXTFragDepth: true, EXT_frag_depth: true, EXTShaderTextureLOD: true, EXT_shader_texture_lod: true, EXTTextureFilterAnisotropic: true, EXT_texture_filter_anisotropic: true, WebGLFramebuffer: true, WebGLGetBufferSubDataAsync: true, WebGLLoseContext: true, WebGLExtensionLoseContext: true, WEBGL_lose_context: true, OESElementIndexUint: true, OES_element_index_uint: true, OESStandardDerivatives: true, OES_standard_derivatives: true, OESTextureFloat: true, OES_texture_float: true, OESTextureFloatLinear: true, OES_texture_float_linear: true, OESTextureHalfFloat: true, OES_texture_half_float: true, OESTextureHalfFloatLinear: true, OES_texture_half_float_linear: true, OESVertexArrayObject: true, OES_vertex_array_object: true, WebGLProgram: true, WebGLQuery: true, WebGLRenderbuffer: true, WebGLRenderingContext: true, WebGL2RenderingContext: true, WebGLSampler: true, WebGLShader: true, WebGLShaderPrecisionFormat: true, WebGLSync: true, WebGLTexture: true, WebGLTimerQueryEXT: true, WebGLTransformFeedback: true, WebGLUniformLocation: true, WebGLVertexArrayObject: true, WebGLVertexArrayObjectOES: true, WebGL: true, WebGL2RenderingContextBase: true, ArrayBuffer: true, ArrayBufferView: false, DataView: true, Float32Array: true, Float64Array: true, Int16Array: true, Int32Array: true, Int8Array: true, Uint16Array: true, Uint32Array: true, Uint8ClampedArray: true, CanvasPixelArray: true, Uint8Array: false, HTMLAudioElement: true, HTMLBRElement: true, HTMLButtonElement: true, HTMLCanvasElement: true, HTMLContentElement: true, HTMLDListElement: true, HTMLDataElement: true, HTMLDataListElement: true, HTMLDetailsElement: true, HTMLDialogElement: true, HTMLDivElement: true, HTMLEmbedElement: true, HTMLFieldSetElement: true, HTMLHRElement: true, HTMLHeadElement: true, HTMLHeadingElement: true, HTMLHtmlElement: true, HTMLIFrameElement: true, HTMLImageElement: true, HTMLInputElement: true, HTMLLIElement: true, HTMLLabelElement: true, HTMLLegendElement: true, HTMLLinkElement: true, HTMLMapElement: true, HTMLMediaElement: true, HTMLMenuElement: true, HTMLMetaElement: true, HTMLMeterElement: true, HTMLModElement: true, HTMLOListElement: true, HTMLObjectElement: true, HTMLOptGroupElement: true, HTMLOptionElement: true, HTMLOutputElement: true, HTMLParagraphElement: true, HTMLParamElement: true, HTMLPictureElement: true, HTMLPreElement: true, HTMLProgressElement: true, HTMLQuoteElement: true, HTMLShadowElement: true, HTMLSlotElement: true, HTMLSourceElement: true, HTMLSpanElement: true, HTMLStyleElement: true, HTMLTableCaptionElement: true, HTMLTableCellElement: true, HTMLTableDataCellElement: true, HTMLTableHeaderCellElement: true, HTMLTableColElement: true, HTMLTextAreaElement: true, HTMLTimeElement: true, HTMLTitleElement: true, HTMLTrackElement: true, HTMLUListElement: true, HTMLUnknownElement: true, HTMLVideoElement: true, HTMLDirectoryElement: true, HTMLFontElement: true, HTMLFrameElement: true, HTMLFrameSetElement: true, HTMLMarqueeElement: true, HTMLElement: false, AccessibleNodeList: true, HTMLAnchorElement: true, HTMLAreaElement: true, HTMLBaseElement: true, Blob: false, HTMLBodyElement: true, CDATASection: true, CharacterData: true, Comment: true, ProcessingInstruction: true, Text: true, CloseEvent: true, CSSPerspective: true, CSSCharsetRule: true, CSSConditionRule: true, CSSFontFaceRule: true, CSSGroupingRule: true, CSSImportRule: true, CSSKeyframeRule: true, MozCSSKeyframeRule: true, WebKitCSSKeyframeRule: true, CSSKeyframesRule: true, MozCSSKeyframesRule: true, WebKitCSSKeyframesRule: true, CSSMediaRule: true, CSSNamespaceRule: true, CSSPageRule: true, CSSRule: true, CSSStyleRule: true, CSSSupportsRule: true, CSSViewportRule: true, CSSStyleDeclaration: true, MSStyleCSSProperties: true, CSS2Properties: true, CSSImageValue: true, CSSKeywordValue: true, CSSNumericValue: true, CSSPositionValue: true, CSSResourceValue: true, CSSUnitValue: true, CSSURLImageValue: true, CSSStyleValue: false, CSSMatrixComponent: true, CSSRotation: true, CSSScale: true, CSSSkew: true, CSSTranslation: true, CSSTransformComponent: false, CSSTransformValue: true, CSSUnparsedValue: true, CustomEvent: true, DataTransferItemList: true, XMLDocument: true, Document: false, DOMException: true, DOMImplementation: true, ClientRectList: true, DOMRectList: true, DOMRectReadOnly: false, DOMStringList: true, DOMTokenList: true, Element: false, AbortPaymentEvent: true, AnimationEvent: true, AnimationPlaybackEvent: true, ApplicationCacheErrorEvent: true, BackgroundFetchClickEvent: true, BackgroundFetchEvent: true, BackgroundFetchFailEvent: true, BackgroundFetchedEvent: true, BeforeInstallPromptEvent: true, BeforeUnloadEvent: true, BlobEvent: true, CanMakePaymentEvent: true, ClipboardEvent: true, DeviceMotionEvent: true, DeviceOrientationEvent: true, ErrorEvent: true, ExtendableEvent: true, ExtendableMessageEvent: true, FetchEvent: true, FontFaceSetLoadEvent: true, ForeignFetchEvent: true, GamepadEvent: true, HashChangeEvent: true, InstallEvent: true, MediaEncryptedEvent: true, MediaKeyMessageEvent: true, MediaQueryListEvent: true, MediaStreamEvent: true, MediaStreamTrackEvent: true, MIDIConnectionEvent: true, MIDIMessageEvent: true, MutationEvent: true, NotificationEvent: true, PageTransitionEvent: true, PaymentRequestEvent: true, PaymentRequestUpdateEvent: true, PopStateEvent: true, PresentationConnectionAvailableEvent: true, PresentationConnectionCloseEvent: true, PromiseRejectionEvent: true, PushEvent: true, RTCDataChannelEvent: true, RTCDTMFToneChangeEvent: true, RTCPeerConnectionIceEvent: true, RTCTrackEvent: true, SecurityPolicyViolationEvent: true, SensorErrorEvent: true, SpeechRecognitionError: true, SpeechRecognitionEvent: true, SpeechSynthesisEvent: true, StorageEvent: true, SyncEvent: true, TrackEvent: true, TransitionEvent: true, WebKitTransitionEvent: true, VRDeviceEvent: true, VRDisplayEvent: true, VRSessionEvent: true, MojoInterfaceRequestEvent: true, USBConnectionEvent: true, IDBVersionChangeEvent: true, AudioProcessingEvent: true, OfflineAudioCompletionEvent: true, WebGLContextEvent: true, Event: false, InputEvent: false, SubmitEvent: false, EventSource: true, AbsoluteOrientationSensor: true, Accelerometer: true, AccessibleNode: true, AmbientLightSensor: true, Animation: true, ApplicationCache: true, DOMApplicationCache: true, OfflineResourceList: true, BackgroundFetchRegistration: true, BatteryManager: true, BroadcastChannel: true, CanvasCaptureMediaStreamTrack: true, FileReader: true, FontFaceSet: true, Gyroscope: true, LinearAccelerationSensor: true, Magnetometer: true, MediaDevices: true, MediaKeySession: true, MediaQueryList: true, MediaRecorder: true, MediaSource: true, MediaStream: true, MediaStreamTrack: true, MIDIAccess: true, MIDIInput: true, MIDIOutput: true, MIDIPort: true, NetworkInformation: true, Notification: true, OffscreenCanvas: true, OrientationSensor: true, PaymentRequest: true, Performance: true, PermissionStatus: true, PresentationAvailability: true, PresentationConnection: true, PresentationConnectionList: true, PresentationRequest: true, RelativeOrientationSensor: true, RemotePlayback: true, RTCDataChannel: true, DataChannel: true, RTCDTMFSender: true, RTCPeerConnection: true, webkitRTCPeerConnection: true, mozRTCPeerConnection: true, ScreenOrientation: true, Sensor: true, ServiceWorker: true, ServiceWorkerContainer: true, ServiceWorkerRegistration: true, SharedWorker: true, SpeechRecognition: true, SpeechSynthesis: true, SpeechSynthesisUtterance: true, VR: true, VRDevice: true, VRDisplay: true, VRSession: true, VisualViewport: true, Worker: true, WorkerPerformance: true, BluetoothDevice: true, BluetoothRemoteGATTCharacteristic: true, Clipboard: true, MojoInterfaceInterceptor: true, USB: true, IDBDatabase: true, IDBOpenDBRequest: true, IDBVersionChangeRequest: true, IDBRequest: true, IDBTransaction: true, AnalyserNode: true, RealtimeAnalyserNode: true, AudioBufferSourceNode: true, AudioDestinationNode: true, AudioNode: true, AudioScheduledSourceNode: true, AudioWorkletNode: true, BiquadFilterNode: true, ChannelMergerNode: true, AudioChannelMerger: true, ChannelSplitterNode: true, AudioChannelSplitter: true, ConstantSourceNode: true, ConvolverNode: true, DelayNode: true, DynamicsCompressorNode: true, GainNode: true, AudioGainNode: true, IIRFilterNode: true, MediaElementAudioSourceNode: true, MediaStreamAudioDestinationNode: true, MediaStreamAudioSourceNode: true, OscillatorNode: true, Oscillator: true, PannerNode: true, AudioPannerNode: true, webkitAudioPannerNode: true, ScriptProcessorNode: true, JavaScriptAudioNode: true, StereoPannerNode: true, WaveShaperNode: true, EventTarget: false, File: true, FileList: true, FileWriter: true, HTMLFormElement: true, Gamepad: true, History: true, HTMLCollection: true, HTMLFormControlsCollection: true, HTMLOptionsCollection: true, HTMLDocument: true, XMLHttpRequest: true, XMLHttpRequestUpload: true, XMLHttpRequestEventTarget: false, ImageData: true, KeyboardEvent: true, Location: true, MediaList: true, MessageEvent: true, MessagePort: true, MIDIInputMap: true, MIDIOutputMap: true, MimeType: true, MimeTypeArray: true, DocumentFragment: true, ShadowRoot: true, DocumentType: true, Node: false, NodeList: true, RadioNodeList: true, Plugin: true, PluginArray: true, ProgressEvent: true, ResourceProgressEvent: true, RTCStatsReport: true, HTMLScriptElement: true, HTMLSelectElement: true, SourceBuffer: true, SourceBufferList: true, SpeechGrammar: true, SpeechGrammarList: true, SpeechRecognitionResult: true, Storage: true, CSSStyleSheet: true, StyleSheet: true, HTMLTableElement: true, HTMLTableRowElement: true, HTMLTableSectionElement: true, HTMLTemplateElement: true, TextTrack: true, TextTrackCue: true, VTTCue: true, TextTrackCueList: true, TextTrackList: true, TimeRanges: true, Touch: true, TouchList: true, TrackDefaultList: true, CompositionEvent: true, FocusEvent: true, MouseEvent: true, DragEvent: true, PointerEvent: true, TextEvent: true, TouchEvent: true, WheelEvent: true, UIEvent: false, URL: true, VideoTrackList: true, WebSocket: true, Window: true, DOMWindow: true, DedicatedWorkerGlobalScope: true, ServiceWorkerGlobalScope: true, SharedWorkerGlobalScope: true, WorkerGlobalScope: true, Attr: true, CSSRuleList: true, ClientRect: true, DOMRect: true, GamepadList: true, NamedNodeMap: true, MozNamedAttrMap: true, SpeechRecognitionResultList: true, StyleSheetList: true, IDBKeyRange: true, SVGLength: true, SVGLengthList: true, SVGNumber: true, SVGNumberList: true, SVGPointList: true, SVGScriptElement: true, SVGStringList: true, SVGAElement: true, SVGAnimateElement: true, SVGAnimateMotionElement: true, SVGAnimateTransformElement: true, SVGAnimationElement: true, SVGCircleElement: true, SVGClipPathElement: true, SVGDefsElement: true, SVGDescElement: true, SVGDiscardElement: true, SVGEllipseElement: true, SVGFEBlendElement: true, SVGFEColorMatrixElement: true, SVGFEComponentTransferElement: true, SVGFECompositeElement: true, SVGFEConvolveMatrixElement: true, SVGFEDiffuseLightingElement: true, SVGFEDisplacementMapElement: true, SVGFEDistantLightElement: true, SVGFEFloodElement: true, SVGFEFuncAElement: true, SVGFEFuncBElement: true, SVGFEFuncGElement: true, SVGFEFuncRElement: true, SVGFEGaussianBlurElement: true, SVGFEImageElement: true, SVGFEMergeElement: true, SVGFEMergeNodeElement: true, SVGFEMorphologyElement: true, SVGFEOffsetElement: true, SVGFEPointLightElement: true, SVGFESpecularLightingElement: true, SVGFESpotLightElement: true, SVGFETileElement: true, SVGFETurbulenceElement: true, SVGFilterElement: true, SVGForeignObjectElement: true, SVGGElement: true, SVGGeometryElement: true, SVGGraphicsElement: true, SVGImageElement: true, SVGLineElement: true, SVGLinearGradientElement: true, SVGMarkerElement: true, SVGMaskElement: true, SVGMetadataElement: true, SVGPathElement: true, SVGPatternElement: true, SVGPolygonElement: true, SVGPolylineElement: true, SVGRadialGradientElement: true, SVGRectElement: true, SVGSetElement: true, SVGStopElement: true, SVGStyleElement: true, SVGSVGElement: true, SVGSwitchElement: true, SVGSymbolElement: true, SVGTSpanElement: true, SVGTextContentElement: true, SVGTextElement: true, SVGTextPathElement: true, SVGTextPositioningElement: true, SVGTitleElement: true, SVGUseElement: true, SVGViewElement: true, SVGGradientElement: true, SVGComponentTransferFunctionElement: true, SVGFEDropShadowElement: true, SVGMPathElement: true, SVGElement: false, SVGTransform: true, SVGTransformList: true, AudioBuffer: true, AudioParamMap: true, AudioTrackList: true, AudioContext: true, webkitAudioContext: true, BaseAudioContext: false, OfflineAudioContext: true});
    A.NativeTypedArray.$nativeSuperclassTag = "ArrayBufferView";
    A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin.$nativeSuperclassTag = "ArrayBufferView";
    A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin.$nativeSuperclassTag = "ArrayBufferView";
    A.NativeTypedArrayOfDouble.$nativeSuperclassTag = "ArrayBufferView";
    A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin.$nativeSuperclassTag = "ArrayBufferView";
    A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin.$nativeSuperclassTag = "ArrayBufferView";
    A.NativeTypedArrayOfInt.$nativeSuperclassTag = "ArrayBufferView";
    A._SourceBufferList_EventTarget_ListMixin.$nativeSuperclassTag = "EventTarget";
    A._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin.$nativeSuperclassTag = "EventTarget";
    A._TextTrackList_EventTarget_ListMixin.$nativeSuperclassTag = "EventTarget";
    A._TextTrackList_EventTarget_ListMixin_ImmutableListMixin.$nativeSuperclassTag = "EventTarget";
  })();
  Function.prototype.call$1 = function(a) {
    return this(a);
  };
  Function.prototype.call$2 = function(a, b) {
    return this(a, b);
  };
  Function.prototype.call$0 = function() {
    return this();
  };
  Function.prototype.call$3 = function(a, b, c) {
    return this(a, b, c);
  };
  Function.prototype.call$1$1 = function(a) {
    return this(a);
  };
  Function.prototype.call$3$3 = function(a, b, c) {
    return this(a, b, c);
  };
  Function.prototype.call$5 = function(a, b, c, d, e) {
    return this(a, b, c, d, e);
  };
  Function.prototype.call$4 = function(a, b, c, d) {
    return this(a, b, c, d);
  };
  Function.prototype.call$3$6 = function(a, b, c, d, e, f) {
    return this(a, b, c, d, e, f);
  };
  Function.prototype.call$1$4 = function(a, b, c, d) {
    return this(a, b, c, d);
  };
  Function.prototype.call$2$1 = function(a) {
    return this(a);
  };
  Function.prototype.call$2$5 = function(a, b, c, d, e) {
    return this(a, b, c, d, e);
  };
  Function.prototype.call$2$4 = function(a, b, c, d) {
    return this(a, b, c, d);
  };
  Function.prototype.call$3$1 = function(a) {
    return this(a);
  };
  Function.prototype.call$3$4 = function(a, b, c, d) {
    return this(a, b, c, d);
  };
  Function.prototype.call$1$2 = function(a, b) {
    return this(a, b);
  };
  Function.prototype.call$2$2 = function(a, b) {
    return this(a, b);
  };
  Function.prototype.call$2$3 = function(a, b, c) {
    return this(a, b, c);
  };
  Function.prototype.call$2$0 = function() {
    return this();
  };
  Function.prototype.call$1$0 = function() {
    return this();
  };
  convertAllToFastObject(holders);
  convertToFastObject($);
  (function(callback) {
    if (typeof document === "undefined") {
      callback(null);
      return;
    }
    if (typeof document.currentScript != "undefined") {
      callback(document.currentScript);
      return;
    }
    var scripts = document.scripts;
    function onLoad(event) {
      for (var i = 0; i < scripts.length; ++i)
        scripts[i].removeEventListener("load", onLoad, false);
      callback(event.target);
    }
    for (var i = 0; i < scripts.length; ++i)
      scripts[i].addEventListener("load", onLoad, false);
  })(function(currentScript) {
    init.currentScript = currentScript;
    var callMain = A.main;
    if (typeof dartMainRunner === "function")
      dartMainRunner(callMain, []);
    else
      callMain([]);
  });
})();
