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%>
    : super core::Object::•()
    ;
}
class B extends self::A<core::String> {
  synthetic constructor •() → self::B
    : super self::A::•()
    ;
}
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%>
    : super self::B::•()
    ;
}
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%>
    : self::D::foo = tt as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<self::D::P%, self::D::Q%>, super self::C::•()
    ;
  method foo2(dynamic y) → dynamic {
    if(y is{ForNonNullableByDefault} self::A<self::D::P%>) {
      core::print("21");
    }
    if(y is{ForNonNullableByDefault} self::C<dynamic, self::D::Q%, core::List<self::D::P%>>) {
      core::print("22");
    }
    this.{self::D::foo} = y as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<self::D::P%, self::D::Q%>;
  }
  method foo3<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic>(dynamic z) → dynamic {
    if(z is{ForNonNullableByDefault} self::A<self::D::foo3::T1%>) {
      core::print("31");
    }
    if(z is{ForNonNullableByDefault} self::C<core::Map<self::D::foo3::T1%, self::D::P%>, core::List<self::D::foo3::T2%>, self::D::Q%>) {
      core::print("32");
    }
    return (z as{ForNonNullableByDefault} core::Map<self::D::foo3::T2%, self::D::Q%>).{core::Map::values}{core::Iterable<self::D::Q%>};
  }
  method foo4(dynamic w) → core::Map<self::D::P%, self::D::Q%> {
    core::List<core::Map<self::D::P%, self::D::Q%>> list = <core::Map<self::D::P%, self::D::Q%>>[w as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<self::D::P%, self::D::Q%>];
    return w as{TypeError,ForDynamic,ForNonNullableByDefault} 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>
    return throw "";
  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%>
    : super core::Object::•()
    ;
  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%>
    : super core::Object::•()
    ;
  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%>
    : super self::G::•()
    ;
  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 {
  if(x is{ForNonNullableByDefault} self::B) {
    core::print("11");
  }
  if(x is{ForNonNullableByDefault} self::C<core::int, core::Object, dynamic>) {
    core::print("12");
  }
  return x as{ForNonNullableByDefault} self::A<core::int>;
}
static method foo5(dynamic x) → void {
  self::globalVar = x as{TypeError,ForDynamic,ForNonNullableByDefault} core::List<core::Iterable<dynamic>>;
}
static method main() → dynamic {}
