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

class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  method call(core::String s) → core::String
    return "${s}${s}";
}
class B<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::B<self::B::T%>
    : super core::Object::•()
    ;
  method call(covariant-by-class self::B::T% t) → self::B::T%
    return t;
}
class C extends core::Object {
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
  method call<T extends core::Object? = dynamic>(self::C::call::T% t) → self::C::call::T%
    return t;
}
static method test() → dynamic {
  self::A a = new self::A::•();
  core::List<core::String> list1 = core::_GrowableList::_literal3<core::String>("a", "b", "c").{core::Iterable::map}<core::String>(a.{self::A::call}{(core::String) → core::String}){((core::String) → core::String) → core::Iterable<core::String>}.{core::Iterable::toList}(){({growable: core::bool}) → core::List<core::String>};
  core::List<core::String> list2 = core::_GrowableList::_literal3<core::String>("a", "b", "c").{core::Iterable::map}<core::String>(let final self::A #t1 = a in #t1 == null ?{(core::String) → core::String} null : #t1.{self::A::call}{(core::String) → core::String}){((core::String) → core::String) → core::Iterable<core::String>}.{core::Iterable::toList}(){({growable: core::bool}) → core::List<core::String>};
  self::B<core::String> b = new self::B::•<core::String>();
  core::List<core::String> list3 = core::_GrowableList::_literal3<core::String>("a", "b", "c").{core::Iterable::map}<core::String>(b.{self::B::call}{(core::String) → core::String} as{TypeError,CovarianceCheck} (core::String) → core::String){((core::String) → core::String) → core::Iterable<core::String>}.{core::Iterable::toList}(){({growable: core::bool}) → core::List<core::String>};
  core::List<core::String> list4 = core::_GrowableList::_literal3<core::String>("a", "b", "c").{core::Iterable::map}<core::String>(let final self::B<core::String> #t2 = b in #t2 == null ?{(core::String) → core::String} null : #t2.{self::B::call}{(core::String) → core::String}){((core::String) → core::String) → core::Iterable<core::String>}.{core::Iterable::toList}(){({growable: core::bool}) → core::List<core::String>};
  self::C c = new self::C::•();
  core::List<core::String> list5 = core::_GrowableList::_literal3<core::String>("a", "b", "c").{core::Iterable::map}<core::String>(c.{self::C::call}{<T extends core::Object? = dynamic>(T%) → T%}<core::String>){((core::String) → core::String) → core::Iterable<core::String>}.{core::Iterable::toList}(){({growable: core::bool}) → core::List<core::String>};
  core::List<core::String> list6 = core::_GrowableList::_literal3<core::String>("a", "b", "c").{core::Iterable::map}<core::String>((let final self::C #t3 = c in #t3 == null ?{<T extends core::Object? = dynamic>(T%) → T%} null : #t3.{self::C::call}{<T extends core::Object? = dynamic>(T%) → T%})<core::String>){((core::String) → core::String) → core::Iterable<core::String>}.{core::Iterable::toList}(){({growable: core::bool}) → core::List<core::String>};
}
static method main() → dynamic {}
