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

class Super extends core::Object {
  synthetic constructor •() → self::Super
    ;
  method method(core::num a) → void
    ;
  operator [](core::num a) → core::num
    ;
  operator []=(core::num a, core::num b) → void
    ;
  set setter(core::num a) → void
    ;
}
class Super1 extends core::Object {
  synthetic constructor •() → self::Super1
    ;
  operator [](core::num a) → core::num?
    ;
  operator []=(core::num a, core::num b) → void
    ;
}
class Class extends self::Super {
  synthetic constructor •() → self::Class
    ;
  forwarding-stub forwarding-semi-stub method /* signature-type: (core::int) → void */ method(covariant-by-declaration core::num a) → void
    return super.{self::Super::method}(a);
  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int) → core::num */ [](covariant-by-declaration core::num a) → core::num
    return super.{self::Super::[]}(a);
  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int, core::int) → void */ []=(covariant-by-declaration core::num a, covariant-by-declaration core::num b) → void
    return super.{self::Super::[]=}(a, b);
  forwarding-stub forwarding-semi-stub set /* signature-type: (core::int) → void */ setter(covariant-by-declaration core::num a) → void
    return super.{self::Super::setter} = a;
}
class Class1 extends self::Super1 {
  synthetic constructor •() → self::Class1
    ;
  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int) → core::num? */ [](covariant-by-declaration core::num a) → core::num?
    return super.{self::Super1::[]}(a);
  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int, core::int) → void */ []=(covariant-by-declaration core::num a, covariant-by-declaration core::num b) → void
    return super.{self::Super1::[]=}(a, b);
}
class Subclass extends self::Class {
  synthetic constructor •() → self::Subclass
    ;
  method method(covariant-by-declaration core::int a) → void
    ;
  operator [](covariant-by-declaration core::int a) → core::num
    ;
  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void
    ;
  set setter(covariant-by-declaration core::int a) → void
    ;
}
class Subclass1 extends self::Class1 {
  synthetic constructor •() → self::Subclass1
    ;
  operator [](covariant-by-declaration core::int a) → core::num?
    ;
  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void
    ;
}
abstract class Mixin extends self::Class /*isMixinDeclaration*/  {
  method method(covariant-by-declaration core::int a) → void
    ;
  operator [](covariant-by-declaration core::int a) → core::num
    ;
  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void
    ;
  set setter(covariant-by-declaration core::int a) → void
    ;
}
abstract class Mixin1 extends self::Class1 /*isMixinDeclaration*/  {
  operator []=(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → void
    ;
}
