library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

typedef DA1 = self::A;
typedef DA2<unrelated X extends core::num> = self::A;
typedef DB1 = self::B<core::String>;
typedef DB2<X extends core::num> = self::B<X>;
typedef DB3<X extends core::num, unrelated Y extends core::String> = self::B<X>;
class A extends core::Object {
  synthetic constructor •() → self::A
    ;
  static method _#new#tearOff() → self::A
    return new self::A::•();
}
class B<X extends core::Object? = dynamic> extends core::Object {
  field core::int field1;
  field core::String field2;
  constructor _(core::int field1, core::String field2) → self::B<self::B::X%>
    ;
  constructor •() → self::B<self::B::X%>
    ;
  constructor foo(core::int field1) → self::B<self::B::X%>
    ;
  static method _#_#tearOff<X extends core::Object? = dynamic>(core::int field1, core::String field2) → self::B<self::B::_#_#tearOff::X%>
    return new self::B::_<self::B::_#_#tearOff::X%>(field1, field2);
  static method _#new#tearOff<X extends core::Object? = dynamic>() → self::B<self::B::_#new#tearOff::X%>
    return new self::B::•<self::B::_#new#tearOff::X%>();
  static method _#foo#tearOff<X extends core::Object? = dynamic>(core::int field1) → self::B<self::B::_#foo#tearOff::X%>
    return new self::B::foo<self::B::_#foo#tearOff::X%>(field1);
  static factory bar<X extends core::Object? = dynamic>(core::int i, core::String j) → self::B<self::B::bar::X%>
    ;
  static method _#bar#tearOff<X extends core::Object? = dynamic>(core::int i, core::String j) → self::B<self::B::_#bar#tearOff::X%>
    return self::B::bar<self::B::_#bar#tearOff::X%>(i, j);
}
static final field core::bool inSoundMode;
static method main() → dynamic
  ;
static method expect(dynamic expected, dynamic actual) → dynamic
  ;
static method throws(() → dynamic f, {has-declared-initializer core::bool inSoundModeOnly}) → dynamic
  ;
static method _#DA2#new#tearOff<unrelated X extends core::num>() → self::A
  return new self::A::•();
static method _#DB2#_#tearOff<X extends core::num>(core::int field1, core::String field2) → self::B<self::_#DB2#_#tearOff::X>
  return new self::B::_<self::_#DB2#_#tearOff::X>(field1, field2);
static method _#DB2#new#tearOff<X extends core::num>() → self::B<self::_#DB2#new#tearOff::X>
  return new self::B::•<self::_#DB2#new#tearOff::X>();
static method _#DB2#foo#tearOff<X extends core::num>(core::int field1) → self::B<self::_#DB2#foo#tearOff::X>
  return new self::B::foo<self::_#DB2#foo#tearOff::X>(field1);
static method _#DB2#bar#tearOff<X extends core::num>(core::int i, core::String j) → self::B<self::_#DB2#bar#tearOff::X>
  return self::B::bar<self::_#DB2#bar#tearOff::X>(i, j);
static method _#DB3#_#tearOff<X extends core::num, unrelated Y extends core::String>(core::int field1, core::String field2) → self::B<self::_#DB3#_#tearOff::X>
  return new self::B::_<self::_#DB3#_#tearOff::X>(field1, field2);
static method _#DB3#new#tearOff<X extends core::num, unrelated Y extends core::String>() → self::B<self::_#DB3#new#tearOff::X>
  return new self::B::•<self::_#DB3#new#tearOff::X>();
static method _#DB3#foo#tearOff<X extends core::num, unrelated Y extends core::String>(core::int field1) → self::B<self::_#DB3#foo#tearOff::X>
  return new self::B::foo<self::_#DB3#foo#tearOff::X>(field1);
static method _#DB3#bar#tearOff<X extends core::num, unrelated Y extends core::String>(core::int i, core::String j) → self::B<self::_#DB3#bar#tearOff::X>
  return self::B::bar<self::_#DB3#bar#tearOff::X>(i, j);
