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

class I1<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::I1<self::I1::X%, self::I1::Y%>
    ;
}
class I2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic, Z extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::I2<self::I2::X%, self::I2::Y%, self::I2::Z%>
    ;
}
class A extends core::Object {
  synthetic constructor •() → self::A
    ;
}
class B extends self::A implements self::I1<core::int, core::int> {
  synthetic constructor •() → self::B
    ;
  method methodB() → void
    ;
  method methodB2() → void
    ;
  get getterB() → core::int
    ;
  set setterB(core::int value) → void
    ;
  operator *(self::B other) → self::B
    ;
}
class C extends self::B {
  synthetic constructor •() → self::C
    ;
}
class D extends self::C implements self::I2<core::int, core::int, core::int> {
  synthetic constructor •() → self::D
    ;
  method methodD() → void
    ;
  get getterD() → core::int
    ;
  set setterD(core::int value) → void
    ;
  operator +(self::D other) → self::D
    ;
}
extension type E on self::D show-types self::I2<core::int, core::int, core::int>, self::C show-methods self::D::methodD show-getters self::D::methodD, self::D::getterD show-setters self::D::setterD show-operators self::D::+ hide-types self::I1<core::int, core::int>, self::A hide-methods self::B::methodB2, self::B::methodB hide-getters self::B::methodB2, self::B::methodB, self::B::getterB hide-setters self::B::setterB hide-operators self::B::* {
}
static method main() → dynamic
  ;
