library;
import self as self;
import "dart:core" as core;

class I<X extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → self::I<self::I::X*>*
    : super core::Object::•()
    ;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
class M0<T extends core::Object* = dynamic> extends self::I<self::M0::T*> {
  synthetic constructor •() → self::M0<self::M0::T*>*
    : super self::I::•()
    ;
}
class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
  synthetic constructor •() → self::M1<self::M1::T*>*
    : super self::I::•()
    ;
}
abstract class _A&M0&M1 extends self::M0<core::int*> implements self::M1<core::int*> /*isAnonymousMixin,isEliminatedMixin*/  {
  synthetic constructor •() → self::_A&M0&M1*
    : super self::M0::•()
    ;
}
class A extends self::_A&M0&M1 {
  synthetic constructor •() → self::A*
    : super self::_A&M0&M1::•()
    ;
}
static method main() → dynamic {}
