library /*isNonNullableByDefault*/;
import self as self;
import "mixin_from_opt_in_out_in_lib1.dart" as mix;
import "mixin_from_opt_in_out_in_lib2.dart" as mix2;
import "dart:core" as core;

import "org-dartlang-testcase:///mixin_from_opt_in_out_in_lib1.dart";
import "org-dartlang-testcase:///mixin_from_opt_in_out_in_lib2.dart";

class DiB0 extends mix::C0 implements mix2::B {
  synthetic constructor •() → self::DiB0
    : super mix::C0::•()
    ;
  abstract member-signature get a() → core::List<(core::int) → core::int>;
  abstract member-signature set a(core::List<(core::int) → core::int> _) → void;
  abstract member-signature method m((core::int) → core::int x) → (core::int) → core::int;
  abstract member-signature get _identityHashCode() → core::int;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool;
  abstract member-signature get hashCode() → core::int;
  abstract member-signature method toString() → core::String;
  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type;
}
class DiBq0 extends mix::C0 implements mix2::Bq {
  synthetic constructor •() → self::DiBq0
    : super mix::C0::•()
    ;
  abstract member-signature get a() → core::List<(core::int?) → core::int?>;
  abstract member-signature set a(core::List<(core::int?) → core::int?> _) → void;
  abstract member-signature method m((core::int?) → core::int? x) → (core::int?) → core::int?;
  abstract member-signature get _identityHashCode() → core::int;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool;
  abstract member-signature get hashCode() → core::int;
  abstract member-signature method toString() → core::String;
  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type;
}
abstract class _DwB0&C0&B extends mix::C0 implements mix2::B /*isAnonymousMixin,isEliminatedMixin*/  {
  synthetic constructor •() → self::_DwB0&C0&B
    : super mix::C0::•()
    ;
  abstract member-signature get _identityHashCode() → core::int;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool;
  abstract member-signature get hashCode() → core::int;
  abstract member-signature method toString() → core::String;
  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type;
  get /* from org-dartlang-testcase:///mixin_from_opt_in_out_in_lib2.dart */ a() → core::List<(core::int) → core::int>
    return <(core::int) → core::int>[];
  set /* from org-dartlang-testcase:///mixin_from_opt_in_out_in_lib2.dart */ a(core::List<(core::int) → core::int> _) → void {}
  method /* from org-dartlang-testcase:///mixin_from_opt_in_out_in_lib2.dart */ m((core::int) → core::int x) → (core::int) → core::int
    return x;
}
class DwB0 extends self::_DwB0&C0&B {
  synthetic constructor •() → self::DwB0
    : super self::_DwB0&C0&B::•()
    ;
}
abstract class _DwBq0&C0&Bq extends mix::C0 implements mix2::Bq /*isAnonymousMixin,isEliminatedMixin*/  {
  synthetic constructor •() → self::_DwBq0&C0&Bq
    : super mix::C0::•()
    ;
  abstract member-signature get _identityHashCode() → core::int;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool;
  abstract member-signature get hashCode() → core::int;
  abstract member-signature method toString() → core::String;
  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type;
  get /* from org-dartlang-testcase:///mixin_from_opt_in_out_in_lib2.dart */ a() → core::List<(core::int?) → core::int?>
    return <(core::int?) → core::int?>[];
  set /* from org-dartlang-testcase:///mixin_from_opt_in_out_in_lib2.dart */ a(core::List<(core::int?) → core::int?> _) → void {}
  method /* from org-dartlang-testcase:///mixin_from_opt_in_out_in_lib2.dart */ m((core::int?) → core::int? x) → (core::int?) → core::int?
    return x;
}
class DwBq0 extends self::_DwBq0&C0&Bq {
  synthetic constructor •() → self::DwBq0
    : super self::_DwBq0&C0&Bq::•()
    ;
}
class DiB3 extends mix::C3 implements mix2::B {
  synthetic constructor •() → self::DiB3
    : super mix::C3::•()
    ;
  abstract member-signature get a() → core::List<(core::int) → core::int>;
  abstract member-signature set a(core::List<(core::int) → core::int> _) → void;
  abstract member-signature method m((core::int) → core::int x) → (core::int) → core::int;
  abstract member-signature get _identityHashCode() → core::int;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool;
  abstract member-signature get hashCode() → core::int;
  abstract member-signature method toString() → core::String;
  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type;
}
class DiBq3 extends mix::C3 implements mix2::Bq {
  synthetic constructor •() → self::DiBq3
    : super mix::C3::•()
    ;
  abstract member-signature get a() → core::List<(core::int?) → core::int?>;
  abstract member-signature set a(core::List<(core::int?) → core::int?> _) → void;
  abstract member-signature method m((core::int?) → core::int? x) → (core::int?) → core::int?;
  abstract member-signature get _identityHashCode() → core::int;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool;
  abstract member-signature get hashCode() → core::int;
  abstract member-signature method toString() → core::String;
  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type;
}
abstract class _DwB3&C3&B extends mix::C3 implements mix2::B /*isAnonymousMixin,isEliminatedMixin*/  {
  synthetic constructor •() → self::_DwB3&C3&B
    : super mix::C3::•()
    ;
  abstract member-signature get _identityHashCode() → core::int;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool;
  abstract member-signature get hashCode() → core::int;
  abstract member-signature method toString() → core::String;
  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type;
  get /* from org-dartlang-testcase:///mixin_from_opt_in_out_in_lib2.dart */ a() → core::List<(core::int) → core::int>
    return <(core::int) → core::int>[];
  set /* from org-dartlang-testcase:///mixin_from_opt_in_out_in_lib2.dart */ a(core::List<(core::int) → core::int> _) → void {}
  method /* from org-dartlang-testcase:///mixin_from_opt_in_out_in_lib2.dart */ m((core::int) → core::int x) → (core::int) → core::int
    return x;
}
class DwB3 extends self::_DwB3&C3&B {
  synthetic constructor •() → self::DwB3
    : super self::_DwB3&C3&B::•()
    ;
}
abstract class _DwBq3&C3&Bq extends mix::C3 implements mix2::Bq /*isAnonymousMixin,isEliminatedMixin*/  {
  synthetic constructor •() → self::_DwBq3&C3&Bq
    : super mix::C3::•()
    ;
  abstract member-signature get _identityHashCode() → core::int;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool;
  abstract member-signature get hashCode() → core::int;
  abstract member-signature method toString() → core::String;
  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type;
  get /* from org-dartlang-testcase:///mixin_from_opt_in_out_in_lib2.dart */ a() → core::List<(core::int?) → core::int?>
    return <(core::int?) → core::int?>[];
  set /* from org-dartlang-testcase:///mixin_from_opt_in_out_in_lib2.dart */ a(core::List<(core::int?) → core::int?> _) → void {}
  method /* from org-dartlang-testcase:///mixin_from_opt_in_out_in_lib2.dart */ m((core::int?) → core::int? x) → (core::int?) → core::int?
    return x;
}
class DwBq3 extends self::_DwBq3&C3&Bq {
  synthetic constructor •() → self::DwBq3
    : super self::_DwBq3&C3&Bq::•()
    ;
}
static method main() → dynamic {}

library;
import self as mix;
import "mixin_from_opt_in_out_in_lib2.dart" as mix2;
import "dart:core" as core;

import "org-dartlang-testcase:///mixin_from_opt_in_out_in_lib2.dart";

class C0 extends mix2::B {
  synthetic constructor •() → mix::C0*
    : super mix2::B::•()
    ;
  abstract member-signature get a() → core::List<(core::int*) →* core::int*>*;
  abstract member-signature set a(core::List<(core::int*) →* core::int*>* _) → void;
  abstract member-signature method m((core::int*) →* core::int* x) → (core::int*) →* core::int*;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
class C3 extends mix2::Bq {
  synthetic constructor •() → mix::C3*
    : super mix2::Bq::•()
    ;
  abstract member-signature get a() → core::List<(core::int*) →* core::int*>*;
  abstract member-signature set a(core::List<(core::int*) →* core::int*>* _) → void;
  abstract member-signature method m((core::int*) →* core::int* x) → (core::int*) →* core::int*;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}

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

class B extends core::Object {
  synthetic constructor •() → mix2::B
    : super core::Object::•()
    ;
  get a() → core::List<(core::int) → core::int>
    return <(core::int) → core::int>[];
  set a(core::List<(core::int) → core::int> _) → void {}
  method m((core::int) → core::int x) → (core::int) → core::int
    return x;
}
class Bq extends core::Object {
  synthetic constructor •() → mix2::Bq
    : super core::Object::•()
    ;
  get a() → core::List<(core::int?) → core::int?>
    return <(core::int?) → core::int?>[];
  set a(core::List<(core::int?) → core::int?> _) → void {}
  method m((core::int?) → core::int? x) → (core::int?) → core::int?
    return x;
}
