library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/mix_in_int.dart:7:7: Error: 'int' is restricted and can't be extended or implemented.
// class C = A with int;
//       ^
//
// pkg/front_end/testcases/general/mix_in_int.dart:7:7: Error: The non-abstract class 'C' is missing implementations for these members:
//  - int.&
//  - int.<<
//  - int.>>
//  - int.^
//  - int.abs
//  - int.bitLength
//  - int.ceil
//  - int.ceilToDouble
//  - int.floor
//  - int.floorToDouble
//  - int.gcd
//  - int.isEven
//  - int.isOdd
//  - int.modInverse
//  - int.modPow
//  - int.round
//  - int.roundToDouble
//  - int.sign
//  - int.toRadixString
//  - int.toSigned
//  - int.toUnsigned
//  - int.truncate
//  - int.truncateToDouble
//  - int.unary-
//  - int.|
//  - int.~
//  - num.%
//  - num.*
//  - num.+
//  - num.-
//  - num./
//  - num.<
//  - num.<=
//  - num.>
//  - num.>=
//  - num.clamp
//  - num.compareTo
//  - num.isFinite
//  - num.isInfinite
//  - num.isNaN
//  - num.isNegative
//  - num.remainder
//  - num.toDouble
//  - num.toInt
//  - num.toStringAsExponential
//  - num.toStringAsFixed
//  - num.toStringAsPrecision
//  - num.~/
// Try to either
//  - provide an implementation,
//  - inherit an implementation from a superclass or mixin,
//  - mark the class as abstract, or
//  - provide a 'noSuchMethod' implementation.
//
// class C = A with int;
//       ^
// sdk/lib/core/int.dart:58:16: Context: '' is defined here.
//   int operator &(int other);
//                ^
// sdk/lib/core/int.dart:106:16: Context: 'int.<<' is defined here.
//   int operator <<(int shiftAmount);
//                ^^
// sdk/lib/core/int.dart:117:16: Context: 'int.>>' is defined here.
//   int operator >>(int shiftAmount);
//                ^^
// sdk/lib/core/int.dart:82:16: Context: 'int.^' is defined here.
//   int operator ^(int other);
//                ^
// sdk/lib/core/int.dart:247:7: Context: 'int.abs' is defined here.
//   int abs();
//       ^^^
// sdk/lib/core/int.dart:180:11: Context: 'int.bitLength' is defined here.
//   int get bitLength;
//           ^^^^^^^^^
// sdk/lib/core/int.dart:264:7: Context: 'int.ceil' is defined here.
//   int ceil();
//       ^^^^
// sdk/lib/core/int.dart:276:10: Context: 'int.ceilToDouble' is defined here.
//   double ceilToDouble();
//          ^^^^^^^^^^^^
// sdk/lib/core/int.dart:261:7: Context: 'int.floor' is defined here.
//   int floor();
//       ^^^^^
// sdk/lib/core/int.dart:273:10: Context: 'int.floorToDouble' is defined here.
//   double floorToDouble();
//          ^^^^^^^^^^^^^
// sdk/lib/core/int.dart:150:7: Context: 'int.gcd' is defined here.
//   int gcd(int other);
//       ^^^
// sdk/lib/core/int.dart:153:12: Context: 'int.isEven' is defined here.
//   bool get isEven;
//            ^^^^^^
// sdk/lib/core/int.dart:156:12: Context: 'int.isOdd' is defined here.
//   bool get isOdd;
//            ^^^^^
// sdk/lib/core/int.dart:135:7: Context: 'int.modInverse' is defined here.
//   int modInverse(int modulus);
//       ^^^^^^^^^^
// sdk/lib/core/int.dart:125:7: Context: 'int.modPow' is defined here.
//   int modPow(int exponent, int modulus);
//       ^^^^^^
// sdk/lib/core/int.dart:258:7: Context: 'int.round' is defined here.
//   int round();
//       ^^^^^
// sdk/lib/core/int.dart:270:10: Context: 'int.roundToDouble' is defined here.
//   double roundToDouble();
//          ^^^^^^^^^^^^^
// sdk/lib/core/int.dart:255:11: Context: 'int.sign' is defined here.
//   int get sign;
//           ^^^^
// sdk/lib/core/int.dart:298:10: Context: 'int.toRadixString' is defined here.
//   String toRadixString(int radix);
//          ^^^^^^^^^^^^^
// sdk/lib/core/int.dart:232:7: Context: 'int.toSigned' is defined here.
//   int toSigned(int width);
//       ^^^^^^^^
// sdk/lib/core/int.dart:203:7: Context: 'int.toUnsigned' is defined here.
//   int toUnsigned(int width);
//       ^^^^^^^^^^
// sdk/lib/core/int.dart:267:7: Context: 'int.truncate' is defined here.
//   int truncate();
//       ^^^^^^^^
// sdk/lib/core/int.dart:279:10: Context: 'int.truncateToDouble' is defined here.
//   double truncateToDouble();
//          ^^^^^^^^^^^^^^^^
// sdk/lib/core/int.dart:240:16: Context: 'int.unary-' is defined here.
//   int operator -();
//                ^^^^^...
// sdk/lib/core/int.dart:70:16: Context: 'int.|' is defined here.
//   int operator |(int other);
//                ^
// sdk/lib/core/int.dart:92:16: Context: 'int.~' is defined here.
//   int operator ~();
//                ^
// sdk/lib/core/num.dart:131:16: Context: 'num.%' is defined here.
//   num operator %(num other);
//                ^
// sdk/lib/core/num.dart:114:16: Context: 'num.*' is defined here.
//   num operator *(num other);
//                ^
// sdk/lib/core/num.dart:108:16: Context: 'num.+' is defined here.
//   num operator +(num other);
//                ^
// sdk/lib/core/num.dart:111:16: Context: 'num.-' is defined here.
//   num operator -(num other);
//                ^
// sdk/lib/core/num.dart:134:19: Context: 'num./' is defined here.
//   double operator /(num other);
//                   ^
// sdk/lib/core/num.dart:160:17: Context: 'num.<' is defined here.
//   bool operator <(num other);
//                 ^
// sdk/lib/core/num.dart:163:17: Context: 'num.<=' is defined here.
//   bool operator <=(num other);
//                 ^^
// sdk/lib/core/num.dart:166:17: Context: 'num.>' is defined here.
//   bool operator >(num other);
//                 ^
// sdk/lib/core/num.dart:169:17: Context: 'num.>=' is defined here.
//   bool operator >=(num other);
//                 ^^
// sdk/lib/core/num.dart:328:7: Context: 'num.clamp' is defined here.
//   num clamp(num lowerLimit, num upperLimit);
//       ^^^^^
// sdk/lib/core/num.dart:105:7: Context: 'num.compareTo' is defined here.
//   int compareTo(num other);
//       ^^^^^^^^^
// sdk/lib/core/num.dart:193:12: Context: 'num.isFinite' is defined here.
//   bool get isFinite;
//            ^^^^^^^^
// sdk/lib/core/num.dart:185:12: Context: 'num.isInfinite' is defined here.
//   bool get isInfinite;
//            ^^^^^^^^^^
// sdk/lib/core/num.dart:172:12: Context: 'num.isNaN' is defined here.
//   bool get isNaN;
//            ^^^^^
// sdk/lib/core/num.dart:179:12: Context: 'num.isNegative' is defined here.
//   bool get isNegative;
//            ^^^^^^^^^^
// sdk/lib/core/num.dart:157:7: Context: 'num.remainder' is defined here.
//   num remainder(num other);
//       ^^^^^^^^^
// sdk/lib/core/num.dart:340:10: Context: 'num.toDouble' is defined here.
//   double toDouble();
//          ^^^^^^^^
// sdk/lib/core/num.dart:331:7: Context: 'num.toInt' is defined here.
//   int toInt();
//       ^^^^^
// sdk/lib/core/num.dart:388:10: Context: 'num.toStringAsExponential' is defined here.
//   String toStringAsExponential([int? fractionDigits]);
//          ^^^^^^^^^^^^^^^^^^^^^
// sdk/lib/core/num.dart:366:10: Context: 'num.toStringAsFixed' is defined here.
//   String toStringAsFixed(int fractionDigits);
//          ^^^^^^^^^^^^^^^
// sdk/lib/core/num.dart:408:10: Context: 'num.toStringAsPrecision' is defined here.
//   String toStringAsPrecision(int precision);
//          ^^^^^^^^^^^^^^^^^^^
// sdk/lib/core/num.dart:145:16: Context: 'num.~/' is defined here.
//   int operator ~/(num other);
//                ^^
//
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;
import "dart:typed_data" as typ;

class A extends core::Object {
  synthetic constructor •() → self::A*
    : super core::Object::•()
    ;
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ toString() → core::String*; -> core::Object::toString
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
}
class C extends self::A implements core::int /*isEliminatedMixin*/  {
  static const field core::List<core::int> _PARSE_LIMITS = #C82 /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */;
  static const field core::int _maxInt64 = #C83 /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */;
  static const field core::int _minInt64 = #C84 /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */;
  static const field core::List<core::int> _int64UnsignedOverflowLimits = #C86 /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */;
  static const field core::List<core::int> _int64UnsignedSmiOverflowLimits = #C89 /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */;
  static final field typ::Int64List _int64OverflowLimits = typ::Int64List::•((#C82).{core::List::length}.{core::num::*}(2))/*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */;
  synthetic constructor •() → self::C*
    : super self::A::•()
    ;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart */ _addFromInteger(core::int* other) → core::num*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C90, 0, #C91, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C93))) as{TypeError,ForDynamic} core::num*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart */ _subFromInteger(core::int* other) → core::num*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C94, 0, #C91, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C93))) as{TypeError,ForDynamic} core::num*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart */ _mulFromInteger(core::int* other) → core::num*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C95, 0, #C91, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C93))) as{TypeError,ForDynamic} core::num*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart */ _truncDivFromInteger(core::int* other) → core::int*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C96, 0, #C91, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C93))) as{TypeError,ForDynamic} core::int*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart */ _moduloFromInteger(core::int* other) → core::num*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C97, 0, #C91, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C93))) as{TypeError,ForDynamic} core::num*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart */ _remainderFromInteger(core::int* other) → core::num*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C98, 0, #C91, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C93))) as{TypeError,ForDynamic} core::num*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart */ _greaterThanFromInteger(core::int* other) → core::bool*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C99, 0, #C91, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C93))) as{TypeError,ForDynamic} core::bool*;
  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/core_patch.dart */ _equalToInteger(core::int* other) → core::bool*
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C100, 0, #C91, core::List::unmodifiable<dynamic>(<dynamic>[other]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C93))) as{TypeError,ForDynamic} core::bool*;
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ compareTo(generic-covariant-impl core::num* other) → core::int*; -> core::num::compareTo
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ +(core::num* other) → core::num*; -> core::num::+
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ -(core::num* other) → core::num*; -> core::num::-
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ *(core::num* other) → core::num*; -> core::num::*
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ %(core::num* other) → core::num*; -> core::num::%
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ /(core::num* other) → core::double*; -> core::num::/
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ ~/(core::num* other) → core::int*; -> core::num::~/
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ remainder(core::num* other) → core::num*; -> core::num::remainder
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ <(core::num* other) → core::bool*; -> core::num::<
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ <=(core::num* other) → core::bool*; -> core::num::<=
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ >(core::num* other) → core::bool*; -> core::num::>
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ >=(core::num* other) → core::bool*; -> core::num::>=
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ isNaN() → core::bool*; -> core::num::isNaN
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ isNegative() → core::bool*; -> core::num::isNegative
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ isInfinite() → core::bool*; -> core::num::isInfinite
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ isFinite() → core::bool*; -> core::num::isFinite
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ clamp(core::num* lowerLimit, core::num* upperLimit) → core::num*; -> core::num::clamp
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ toInt() → core::int*; -> core::num::toInt
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ toDouble() → core::double*; -> core::num::toDouble
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ toStringAsFixed(core::int* fractionDigits) → core::String*; -> core::num::toStringAsFixed
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ toStringAsExponential([core::int* fractionDigits = #C101]) → core::String*; -> core::num::toStringAsExponential
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/core/num.dart */ toStringAsPrecision(core::int* precision) → core::String*; -> core::num::toStringAsPrecision
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _shrFromInteger(core::int other) → core::int;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _bitAndFromSmi(core::_Smi other) → core::int;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _shlFromInteger(core::int other) → core::int;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _bitAndFromInteger(core::int other) → core::int;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _bitOrFromInteger(core::int other) → core::int;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _bitXorFromInteger(core::int other) → core::int;
  static method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _tryParseSmi(core::String str, core::int first, core::int last) → core::int? {
    assert(first.{core::num::<=}(last));
    core::int ix = first;
    core::int sign = 1;
    core::int c = str.{core::String::codeUnitAt}(ix);
    if(c.{core::num::==}(43) || c.{core::num::==}(45)) {
      ix = ix.{core::num::+}(1);
      sign = 44.{core::num::-}(c);
      if(ix.{core::num::>}(last)) {
        return null;
      }
    }
    core::int smiLimit = _in::is64Bit ?{core::int} 18 : 9;
    if(last.{core::num::-}(ix).{core::num::>=}(smiLimit)) {
      return null;
    }
    core::int result = 0;
    for (core::int i = ix; i.{core::num::<=}(last); i = i.{core::num::+}(1)) {
      core::int c = 48.{core::int::^}(str.{core::String::codeUnitAt}(i));
      if(9.{core::num::<}(c)) {
        return null;
      }
      result = 10.{core::num::*}(result).{core::num::+}(c);
    }
    return sign.{core::num::*}(result);
  }
  static method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _parse(core::_StringBase source, core::int? radix, dynamic onError) → core::int {
    core::int end = source.{core::_StringBase::_lastNonWhitespace}().{core::num::+}(1);
    if(end.{core::num::==}(0)) {
      return core::int::_throwFormatException(onError, source, source.{core::_StringBase::length}, radix, null);
    }
    core::int start = source.{core::_StringBase::_firstNonWhitespace}();
    core::int first = source.{core::_StringBase::codeUnitAt}(start);
    core::int sign = 1;
    if(first.{core::num::==}(43) || first.{core::num::==}(45)) {
      sign = 44.{core::num::-}(first);
      start = start.{core::num::+}(1);
      if(start.{core::num::==}(end)) {
        return core::int::_throwFormatException(onError, source, end, radix, null);
      }
      first = source.{core::_StringBase::codeUnitAt}(start);
    }
    if(radix.{core::num::==}(null)) {
      core::int index = start;
      if(first.{core::num::==}(48)) {
        index = index.{core::num::+}(1);
        if(index.{core::num::==}(end))
          return 0;
        first = source.{core::_StringBase::codeUnitAt}(index);
        if(first.{core::int::|}(32).{core::num::==}(120)) {
          index = index.{core::num::+}(1);
          if(index.{core::num::==}(end)) {
            return core::int::_throwFormatException(onError, source, index, null, null);
          }
          return core::int::_parseRadix(source, 16, index, end, sign, sign.{core::num::>}(0), onError);
        }
      }
      radix = 10;
    }
    return core::int::_parseRadix(source, radix{core::int}, start, end, sign, false, onError);
  }
  static method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _kNull(dynamic _) → core::Null?
    return null;
  static method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _throwFormatException(dynamic onError, dynamic source, dynamic index, dynamic radix, dynamic message) → core::int {
    if(!onError.{core::Object::==}(null))
      return onError.call(source) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
    if(!message.{core::Object::==}(null)) {
      throw new core::FormatException::•(message as{TypeError,ForDynamic,ForNonNullableByDefault} core::String, source, index as{TypeError,ForDynamic,ForNonNullableByDefault} core::int?);
    }
    if(radix.{core::Object::==}(null)) {
      throw new core::FormatException::•("Invalid number", source, index as{TypeError,ForDynamic,ForNonNullableByDefault} core::int?);
    }
    throw new core::FormatException::•("Invalid radix-${radix} number", source, index as{TypeError,ForDynamic,ForNonNullableByDefault} core::int?);
  }
  static method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _parseRadix(core::String source, core::int radix, core::int start, core::int end, core::int sign, core::bool allowU64, dynamic onError) → core::int {
    core::int tableIndex = radix.{core::num::-}(2).{core::num::*}(4).{core::num::+}(_in::is64Bit ?{core::int} 2 : 0);
    core::int blockSize = (#C82).{core::List::[]}(tableIndex);
    core::int length = end.{core::num::-}(start);
    if(length.{core::num::<=}(blockSize)) {
      core::int? smi = core::int::_parseBlock(source, radix, start, end);
      if(smi.{core::num::==}(null)) {
        return core::int::_throwFormatException(onError, source, start, radix, null);
      }
      return sign.{core::num::*}(smi{core::int});
    }
    core::int smallBlockSize = length;
    while (smallBlockSize.{core::num::>=}(blockSize))
      smallBlockSize = smallBlockSize.{core::num::-}(blockSize);
    core::int result = 0;
    if(smallBlockSize.{core::num::>}(0)) {
      core::int blockEnd = start.{core::num::+}(smallBlockSize);
      core::int? smi = core::int::_parseBlock(source, radix, start, blockEnd);
      if(smi.{core::num::==}(null)) {
        return core::int::_throwFormatException(onError, source, start, radix, null);
      }
      result = sign.{core::num::*}(smi{core::int});
      start = blockEnd;
    }
    core::int multiplier = (#C82).{core::List::[]}(tableIndex.{core::num::+}(1));
    core::int positiveOverflowLimit = 0;
    core::int negativeOverflowLimit = 0;
    tableIndex = tableIndex.{core::int::<<}(1);
    positiveOverflowLimit = core::int::_int64OverflowLimits.{core::List::[]}(tableIndex);
    if(positiveOverflowLimit.{core::num::==}(0)) {
      positiveOverflowLimit = core::int::_initInt64OverflowLimits(tableIndex, multiplier);
    }
    negativeOverflowLimit = core::int::_int64OverflowLimits.{core::List::[]}(tableIndex.{core::num::+}(1));
    core::int blockEnd = start.{core::num::+}(blockSize);
    do {
      core::int? smi = core::int::_parseBlock(source, radix, start, blockEnd);
      if(smi.{core::num::==}(null)) {
        return core::int::_throwFormatException(onError, source, start, radix, null);
      }
      if(result.{core::num::>=}(positiveOverflowLimit)) {
        if(result.{core::num::>}(positiveOverflowLimit) || smi{core::int}.{core::num::>}(core::int::_int64OverflowLimits.{core::List::[]}(tableIndex.{core::num::+}(2)))) {
          core::int X = _in::is64Bit ?{core::int} 1 : 0;
          if(allowU64 && !(result.{core::num::>=}((#C86).{core::List::[]}(X)) && (result.{core::num::>}((#C86).{core::List::[]}(X)) || smi{core::int}.{core::num::>}((#C89).{core::List::[]}(X)))) && blockEnd.{core::num::+}(blockSize).{core::num::>}(end)) {
            return result.{core::num::*}(multiplier).{core::num::+}(smi{core::int});
          }
          return core::int::_throwFormatException(onError, source, null, radix, "Positive input exceeds the limit of integer");
        }
      }
      else
        if(result.{core::num::<=}(negativeOverflowLimit)) {
          if(result.{core::num::<}(negativeOverflowLimit) || smi{core::int}.{core::num::>}(core::int::_int64OverflowLimits.{core::List::[]}(tableIndex.{core::num::+}(3)))) {
            return core::int::_throwFormatException(onError, source, null, radix, "Negative input exceeds the limit of integer");
          }
        }
      result = result.{core::num::*}(multiplier).{core::num::+}(sign.{core::num::*}(smi{core::int}));
      start = blockEnd;
      blockEnd = start.{core::num::+}(blockSize);
    }
    while (blockEnd.{core::num::<=}(end))
    return result;
  }
  static method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _parseBlock(core::String source, core::int radix, core::int start, core::int end) → core::_Smi? {
    core::_Smi result = _in::unsafeCast<core::_Smi>(0);
    if(radix.{core::num::<=}(10)) {
      for (core::int i = start; i.{core::num::<}(end); i = i.{core::num::+}(1)) {
        core::int digit = source.{core::String::codeUnitAt}(i).{core::int::^}(48);
        if(digit.{core::num::>=}(radix))
          return null;
        result = radix.{core::num::*}(result).{core::num::+}(digit) as{ForNonNullableByDefault} core::_Smi;
      }
    }
    else {
      for (core::int i = start; i.{core::num::<}(end); i = i.{core::num::+}(1)) {
        core::int char = source.{core::String::codeUnitAt}(i);
        core::int digit = char.{core::int::^}(48);
        if(digit.{core::num::>}(9)) {
          digit = char.{core::int::|}(32).{core::num::-}(97.{core::num::-}(10));
          if(digit.{core::num::<}(10) || digit.{core::num::>=}(radix))
            return null;
        }
        result = radix.{core::num::*}(result).{core::num::+}(digit) as{ForNonNullableByDefault} core::_Smi;
      }
    }
    return result;
  }
  static method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ _initInt64OverflowLimits(core::int tableIndex, core::int multiplier) → core::int {
    core::int::_int64OverflowLimits.{core::List::[]=}(tableIndex, (#C83).{core::num::~/}(multiplier));
    core::int::_int64OverflowLimits.{core::List::[]=}(tableIndex.{core::num::+}(1), (#C84).{core::num::~/}(multiplier));
    core::int::_int64OverflowLimits.{core::List::[]=}(tableIndex.{core::num::+}(2), _in::unsafeCast<core::int>((#C83).{core::num::remainder}(multiplier)));
    core::int::_int64OverflowLimits.{core::List::[]=}(tableIndex.{core::num::+}(3), _in::unsafeCast<core::int>((#C84).{core::num::remainder}(multiplier)).{core::int::unary-}());
    return core::int::_int64OverflowLimits.{core::List::[]}(tableIndex);
  }
  abstract operator /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ &(core::int other) → core::int;
  abstract operator /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ |(core::int other) → core::int;
  abstract operator /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ ^(core::int other) → core::int;
  abstract operator /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ ~() → core::int;
  abstract operator /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ <<(core::int shiftAmount) → core::int;
  abstract operator /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ >>(core::int shiftAmount) → core::int;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ modPow(core::int exponent, core::int modulus) → core::int;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ modInverse(core::int modulus) → core::int;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ gcd(core::int other) → core::int;
  abstract get /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ isEven() → core::bool;
  abstract get /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ isOdd() → core::bool;
  abstract get /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ bitLength() → core::int;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ toUnsigned(core::int width) → core::int;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ toSigned(core::int width) → core::int;
  abstract operator /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ unary-() → core::int;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ abs() → core::int;
  abstract get /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ sign() → core::int;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ round() → core::int;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ floor() → core::int;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ ceil() → core::int;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ truncate() → core::int;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ roundToDouble() → core::double;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ floorToDouble() → core::double;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ ceilToDouble() → core::double;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ truncateToDouble() → core::double;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ toString() → core::String;
  abstract method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/core/int.dart */ toRadixString(core::int radix) → core::String;
  @#C102
  static method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ parse(core::String source, {core::int? radix = #C101, (core::String) →? core::int onError = #C101}) → core::int {
    if(source.{core::String::==}(null))
      throw new core::ArgumentError::•("The source must not be null");
    if(source.{core::String::isEmpty}) {
      return core::int::_throwFormatException(onError, source, 0, radix, null);
    }
    if(radix.{core::num::==}(null) || radix{core::int}.{core::num::==}(10)) {
      core::int? result = core::int::_tryParseSmi(source, 0, source.{core::String::length}.{core::num::-}(1));
      if(!result.{core::num::==}(null))
        return result{core::int};
    }
    else
      if(radix{core::int}.{core::num::<}(2) || radix{core::int}.{core::num::>}(36)) {
        throw new core::RangeError::•("Radix ${radix{core::int}} not in range 2..36");
      }
    return core::int::_parse(_in::unsafeCast<core::_StringBase>(source), radix, onError);
  }
  @#C102
  static method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart */ tryParse(core::String source, {core::int? radix = #C101}) → core::int? {
    if(source.{core::String::==}(null))
      throw new core::ArgumentError::•("The source must not be null");
    if(source.{core::String::isEmpty})
      return null;
    if(radix.{core::num::==}(null) || radix{core::int}.{core::num::==}(10)) {
      core::int? result = core::int::_tryParseSmi(source, 0, source.{core::String::length}.{core::num::-}(1));
      if(!result.{core::num::==}(null))
        return result{core::int};
    }
    else
      if(radix{core::int}.{core::num::<}(2) || radix{core::int}.{core::num::>}(36)) {
        throw new core::RangeError::•("Radix ${radix{core::int}} not in range 2..36");
      }
    try {
      return core::int::_parse(_in::unsafeCast<core::_StringBase>(source), radix, #C103);
    }
    on core::Object catch(final core::Object e) {
      return null;
    }
  }
}
static method main() → dynamic {}

constants  {
  #C1 = 30
  #C2 = 1073741824
  #C3 = 62
  #C4 = 4611686018427387904
  #C5 = 18
  #C6 = 387420489
  #C7 = 39
  #C8 = 4052555153018976267
  #C9 = 15
  #C10 = 1152921504606846976
  #C11 = 12
  #C12 = 244140625
  #C13 = 26
  #C14 = 1490116119384765625
  #C15 = 11
  #C16 = 362797056
  #C17 = 23
  #C18 = 789730223053602816
  #C19 = 10
  #C20 = 282475249
  #C21 = 22
  #C22 = 3909821048582988049
  #C23 = 20
  #C24 = 9
  #C25 = 19
  #C26 = 1350851717672992089
  #C27 = 1000000000
  #C28 = 1000000000000000000
  #C29 = 8
  #C30 = 214358881
  #C31 = 17
  #C32 = 505447028499293771
  #C33 = 429981696
  #C34 = 2218611106740436992
  #C35 = 815730721
  #C36 = 16
  #C37 = 665416609183179841
  #C38 = 7
  #C39 = 105413504
  #C40 = 2177953337809371136
  #C41 = 170859375
  #C42 = 437893890380859375
  #C43 = 268435456
  #C44 = 410338673
  #C45 = 2862423051509815793
  #C46 = 612220032
  #C47 = 14
  #C48 = 374813367582081024
  #C49 = 893871739
  #C50 = 799006685782884121
  #C51 = 6
  #C52 = 64000000
  #C53 = 1638400000000000000
  #C54 = 85766121
  #C55 = 3243919932521508681
  #C56 = 113379904
  #C57 = 13
  #C58 = 282810057883082752
  #C59 = 148035889
  #C60 = 504036361936467383
  #C61 = 191102976
  #C62 = 876488338465357824
  #C63 = 308915776
  #C64 = 2481152873203736576
  #C65 = 481890304
  #C66 = 232218265089212416
  #C67 = 594823321
  #C68 = 353814783205469041
  #C69 = 729000000
  #C70 = 531441000000000000
  #C71 = 887503681
  #C72 = 787662783788549761
  #C73 = 5
  #C74 = 39135393
  #C75 = 1667889514952984961
  #C76 = 45435424
  #C77 = 2386420683693101056
  #C78 = 52521875
  #C79 = 3379220508056640625
  #C80 = 60466176
  #C81 = 131621703842267136
  #C82 = <core::int>[#C1, #C2, #C3, #C4, #C5, #C6, #C7, #C8, #C9, #C2, #C1, #C10, #C11, #C12, #C13, #C14, #C15, #C16, #C17, #C18, #C19, #C20, #C21, #C22, #C19, #C2, #C23, #C10, #C24, #C6, #C25, #C26, #C24, #C27, #C5, #C28, #C29, #C30, #C31, #C32, #C29, #C33, #C31, #C34, #C29, #C35, #C36, #C37, #C38, #C39, #C36, #C40, #C38, #C41, #C9, #C42, #C38, #C43, #C9, #C10, #C38, #C44, #C9, #C45, #C38, #C46, #C47, #C48, #C38, #C49, #C47, #C50, #C51, #C52, #C47, #C53, #C51, #C54, #C47, #C55, #C51, #C56, #C57, #C58, #C51, #C59, #C57, #C60, #C51, #C61, #C57, #C62, #C51, #C12, #C57, #C14, #C51, #C63, #C57, #C64, #C51, #C6, #C57, #C8, #C51, #C65, #C11, #C66, #C51, #C67, #C11, #C68, #C51, #C69, #C11, #C70, #C51, #C71, #C11, #C72, #C51, #C2, #C11, #C10, #C73, #C74, #C11, #C75, #C73, #C76, #C11, #C77, #C73, #C78, #C11, #C79, #C73, #C80, #C15, #C81]
  #C83 = 9223372036854775807
  #C84 = -9223372036854775808
  #C85 = 68719476735
  #C86 = <core::int>[#C85, #C9]
  #C87 = 268435455
  #C88 = 1152921504606846975
  #C89 = <core::int>[#C87, #C88]
  #C90 = #org-dartlang-testcase:///mix_in_int.dart::_addFromInteger
  #C91 = <core::Type*>[]
  #C92 = <dynamic>[]
  #C93 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C92}
  #C94 = #org-dartlang-testcase:///mix_in_int.dart::_subFromInteger
  #C95 = #org-dartlang-testcase:///mix_in_int.dart::_mulFromInteger
  #C96 = #org-dartlang-testcase:///mix_in_int.dart::_truncDivFromInteger
  #C97 = #org-dartlang-testcase:///mix_in_int.dart::_moduloFromInteger
  #C98 = #org-dartlang-testcase:///mix_in_int.dart::_remainderFromInteger
  #C99 = #org-dartlang-testcase:///mix_in_int.dart::_greaterThanFromInteger
  #C100 = #org-dartlang-testcase:///mix_in_int.dart::_equalToInteger
  #C101 = null
  #C102 = _in::_Patch {}
  #C103 = tearoff core::int::_kNull
}

Extra constant evaluation status:
Evaluated: MethodInvocation @ org-dartlang-sdk:///sdk/lib/_internal/vm/lib/integers_patch.dart:222:41 -> IntConstant(87)
Extra constant evaluation: evaluated: 565, effectively constant: 1
