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

class A1 extends core::Object {
  synthetic constructor •() → self::A1*
    : super core::Object::•()
    ;
}
class B1<T extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → self::B1<self::B1::T*>*
    : super core::Object::•()
    ;
}
extension A2 on self::A1* {
  method method1 = self::A2|method1;
  tearoff method1 = self::A2|get#method1;
  method method2 = self::A2|method2;
  tearoff method2 = self::A2|get#method2;
  method method3 = self::A2|method3;
  tearoff method3 = self::A2|get#method3;
  method method4 = self::A2|method4;
  tearoff method4 = self::A2|get#method4;
}
extension B2<T extends core::Object* = dynamic> on self::B1<T*>* {
  method method1 = self::B2|method1;
  tearoff method1 = self::B2|get#method1;
  method method2 = self::B2|method2;
  tearoff method2 = self::B2|get#method2;
}
static method A2|method1(final self::A1* #this) → self::A1* {
  return #this;
}
static method A2|get#method1(final self::A1* #this) → () →* self::A1*
  return () → self::A1* => self::A2|method1(#this);
static method A2|method2<T extends core::Object* = dynamic>(final self::A1* #this, self::A2|method2::T* o) → self::A1* {
  core::print(o);
  return #this;
}
static method A2|get#method2(final self::A1* #this) → <T extends core::Object* = dynamic>(T*) →* self::A1*
  return <T extends core::Object* = dynamic>(T* o) → self::A1* => self::A2|method2<T*>(#this, o);
static method A2|method3<T extends core::Object* = dynamic>(final self::A1* #this = #C1, [self::A2|method3::T* o = #C1]) → self::A1* {
  core::print(o);
  return #this;
}
static method A2|get#method3(final self::A1* #this) → <T extends core::Object* = dynamic>([T*]) →* self::A1*
  return <T extends core::Object* = dynamic>([T* o = #C1]) → self::A1* => self::A2|method3<T*>(#this, o);
static method A2|method4<T extends core::Object* = dynamic>(final self::A1* #this = #C1, {self::A2|method4::T* o = #C1}) → self::A1* {
  core::print(o);
  return #this;
}
static method A2|get#method4(final self::A1* #this) → <T extends core::Object* = dynamic>({o: T*}) →* self::A1*
  return <T extends core::Object* = dynamic>({T* o = #C1}) → self::A1* => self::A2|method4<T*>(#this, o: o);
static method B2|method1<T extends core::Object* = dynamic>(final self::B1<self::B2|method1::T*>* #this) → self::B1<self::B2|method1::T*>* {
  return #this;
}
static method B2|get#method1<T extends core::Object* = dynamic>(final self::B1<self::B2|get#method1::T*>* #this) → () →* self::B1<self::B2|get#method1::T*>*
  return () → self::B1<self::B2|get#method1::T*>* => self::B2|method1<self::B2|get#method1::T*>(#this);
static method B2|method2<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(final self::B1<self::B2|method2::T*>* #this, self::B2|method2::S* o) → self::B1<self::B2|method2::T*>* {
  core::print(o);
  return #this;
}
static method B2|get#method2<T extends core::Object* = dynamic>(final self::B1<self::B2|get#method2::T*>* #this) → <S extends core::Object* = dynamic>(S*) →* self::B1<self::B2|get#method2::T*>*
  return <S extends core::Object* = dynamic>(S* o) → self::B1<self::B2|get#method2::T*>* => self::B2|method2<self::B2|get#method2::T*, S*>(#this, o);
static method main() → dynamic {}

constants  {
  #C1 = null
}
