main = <No Member>;
library from "org-dartlang-test:///main.dart" as main {

  import "dart:core";
  import "package:package1/lib1_a.dart";

  static method main() → dynamic {
    lib::lib1();
  }
}
library from "package:package1/lib1_a.dart" as lib2 {
additionalExports = (lib::la,
  lib::lib1)

  import "package:package3/lib3.dart" as lib3;
  export "package:package1/lib1_b.dart";

  static method lib1a() → dynamic {
    lib3::lib3();
  }
}
library from "package:package1/lib1_b.dart" as lib {

  import "package:package2/lib2.dart" as lib2;

  static method lib1() → dynamic {
    return lib::la(null);
  }
  static method la(lib22::Foo* f) → dynamic {
    return 42;
  }
}
library from "package:package2/lib2.dart" as lib22 {

  class Foo extends dart.core::Object {
    static field dart.core::int* y = 42;
    synthetic constructor •() → lib22::Foo*
      : super dart.core::Object::•()
      ;
    abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfTrue
    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOfFalse
    abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
    abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
    abstract member-signature method toString() → dart.core::String*; -> dart.core::Object::toString
    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
    abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
  }
  static field dart.core::int* f = 42;
}
library from "package:package3/lib3.dart" as lib3 {

  static method lib3() → dynamic {
    dart.core::print("lib3");
  }
}
