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

class A<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::A<self::A::T%>
    ;
}
class B extends self::A<core::String> {
  synthetic constructor •() → self::B
    ;
}
class C<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic, T3 extends core::Object? = dynamic> extends self::B {
  synthetic constructor •() → self::C<self::C::T1%, self::C::T2%, self::C::T3%>
    ;
}
class D<P extends core::Object? = dynamic, Q extends core::Object? = dynamic> extends self::C<core::int, self::D::Q%, self::D::P%> {
  covariant-by-class field core::Map<self::D::P%, self::D::Q%> foo;
  constructor •(dynamic tt) → self::D<self::D::P%, self::D::Q%>
    ;
  method foo2(dynamic y) → dynamic
    ;
  method foo3<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic>(dynamic z) → dynamic
    ;
  method foo4(dynamic w) → core::Map<self::D::P%, self::D::Q%>
    ;
}
class E<P extends core::String> extends core::Object {
  static factory •<P extends core::String>() → self::E<self::E::•::P>
    ;
  method foo6<covariant-by-class T extends self::E::P, U extends core::List<self::E::foo6::T> = core::List<self::E::P>>(core::Map<self::E::foo6::T, self::E::foo6::U> map) → void
    ;
}
abstract class F<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::F<self::F::T%>
    ;
  abstract method foo7<covariant-by-class Q extends self::F::T%>(self::F::foo7::Q% a, covariant-by-declaration core::num b, covariant-by-class self::F::T% c) → void;
  abstract method foo8<covariant-by-class Q extends self::F::T%>(self::F::foo8::Q% a, covariant-by-declaration core::num b, covariant-by-class self::F::T% c) → void;
}
class G<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::G<self::G::T%>
    ;
  method foo7<covariant-by-class Q extends self::G::T%>(self::G::foo7::Q% a, core::int b, covariant-by-class self::G::T% c) → void
    ;
}
class H<T extends core::Object? = dynamic> extends self::G<self::H::T%> implements self::F<self::H::T%> {
  synthetic constructor •() → self::H<self::H::T%>
    ;
  method foo8<covariant-by-class Q extends self::H::T%>(self::H::foo8::Q% a, covariant-by-declaration core::int b, covariant-by-class self::H::T% c) → void
    ;
  forwarding-stub method foo7<covariant-by-class Q extends self::H::T%>(self::H::foo7::Q% a, covariant-by-declaration core::num b, covariant-by-class self::H::T% c) → void
    return super.{self::G::foo7}<self::H::foo7::Q%>(a, b as core::int, c);
}
late static field core::List<core::Iterable<dynamic>> globalVar;
static method foo1(dynamic x) → dynamic
  ;
static method foo5(dynamic x) → void
  ;
static method main() → dynamic
  ;
