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

abstract class Base extends core::Object {
  synthetic constructor •() → self::Base*
    : super core::Object::•()
    ;
}
abstract class MixinA<T extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → self::MixinA<self::MixinA::T*>*
    : super core::Object::•()
    ;
  abstract method method(core::Object* t) → self::MixinA::T*;
}
abstract class _Class&Base&MixinA extends self::Base implements self::MixinA<dynamic> /*isAnonymousMixin,isEliminatedMixin*/  {
  synthetic constructor •() → self::_Class&Base&MixinA*
    : super self::Base::•()
    ;
  abstract method method(core::Object* t) → dynamic;
}
abstract class Class extends self::_Class&Base&MixinA {
  synthetic constructor •() → self::Class*
    : super self::_Class&Base&MixinA::•()
    ;
  method method(core::Object* t) → dynamic {}
}
abstract class YamlNode extends core::Object {
  synthetic constructor •() → self::YamlNode*
    : super core::Object::•()
    ;
}
abstract class Map<K extends core::Object* = dynamic, V extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → self::Map<self::Map::K*, self::Map::V*>*
    : super core::Object::•()
    ;
  abstract operator [](core::Object* key) → self::Map::V*;
}
abstract class MapMixin<K extends core::Object* = dynamic, V extends core::Object* = dynamic> extends core::Object implements self::Map<self::MapMixin::K*, self::MapMixin::V*> {
  synthetic constructor •() → self::MapMixin<self::MapMixin::K*, self::MapMixin::V*>*
    : super core::Object::•()
    ;
  abstract operator [](core::Object* key) → self::MapMixin::V*;
}
abstract class UnmodifiableMapMixin<K extends core::Object* = dynamic, V extends core::Object* = dynamic> extends core::Object implements self::Map<self::UnmodifiableMapMixin::K*, self::UnmodifiableMapMixin::V*> {
  synthetic constructor •() → self::UnmodifiableMapMixin<self::UnmodifiableMapMixin::K*, self::UnmodifiableMapMixin::V*>*
    : super core::Object::•()
    ;
}
abstract class _YamlMap&YamlNode&MapMixin extends self::YamlNode implements self::MapMixin<dynamic, dynamic> /*isAnonymousMixin,isEliminatedMixin*/  {
  synthetic constructor •() → self::_YamlMap&YamlNode&MapMixin*
    : super self::YamlNode::•()
    ;
  abstract operator [](core::Object* key) → dynamic;
}
abstract class _YamlMap&YamlNode&MapMixin&UnmodifiableMapMixin extends self::_YamlMap&YamlNode&MapMixin implements self::UnmodifiableMapMixin<dynamic, dynamic> /*isAnonymousMixin,isEliminatedMixin*/  {
  synthetic constructor •() → self::_YamlMap&YamlNode&MapMixin&UnmodifiableMapMixin*
    : super self::_YamlMap&YamlNode&MapMixin::•()
    ;
}
class YamlMap extends self::_YamlMap&YamlNode&MapMixin&UnmodifiableMapMixin {
  synthetic constructor •() → self::YamlMap*
    : super self::_YamlMap&YamlNode&MapMixin&UnmodifiableMapMixin::•()
    ;
  operator [](core::Object* key) → dynamic {}
}
static method main() → dynamic {}
