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

class B<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → self::B<self::B::X*, self::B::Y*>*
    ;
}
class C<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
    ;
}
class D<X extends self::B<self::D::X, self::D::Y>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y>* = self::C<dynamic, dynamic>*> extends core::Object {
  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
    ;
}
class E<X extends self::B<self::E::X, self::E::Y>* = self::B<dynamic, dynamic>*, Y extends () →* self::E::X* = () →* dynamic> extends core::Object {
  synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
    ;
}
class F<X extends () →* self::F::X = () →* dynamic> extends core::Object {
  synthetic constructor •() → self::F<self::F::X*>*
    ;
}
static field core::List<self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*>* ld;
static field core::Map<self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*>* md;
static field core::List<self::E<self::B<dynamic, dynamic>*, () →* dynamic>*>* le;
static field core::Map<self::E<self::B<dynamic, dynamic>*, () →* dynamic>*, self::E<self::B<dynamic, dynamic>*, () →* dynamic>*>* me;
static field core::List<self::F<() →* dynamic>*>* lf;
static field core::Map<self::F<() →* dynamic>*, self::F<() →* dynamic>*>* mf;
static method main() → dynamic
  ;
