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

  import "org-dartlang-test:///lib2.dart";

  @#C7
  class Y extends dart.ffi::Struct {
    synthetic constructor •() → lib::Y
      : super dart.ffi::Struct::•()
      ;
    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
      ;
    @#C8
    get y1() → dart.core::int
      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
    @#C8
    set y1(dart.core::int #externalFieldValue) → void
      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue);
    @#C8
    get y2() → dart.core::int
      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
    @#C8
    set y2(dart.core::int #externalFieldValue) → void
      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue);
    @#C13
    get y3() → dart.core::int
      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
    @#C13
    set y3(dart.core::int #externalFieldValue) → void
      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue);
    @#C18
    static get #sizeOf() → dart.core::int*
      return (#C21).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
  }
}
library from "org-dartlang-test:///lib2.dart" as lib2 {
additionalExports = (ffi::nullptr,
  ffi::unsized,
  ffi::sizeOf,
  ffi::Dart_NativeMessageHandler,
  ffi::Allocator,
  ffi::AllocatorAlloc,
  ffi::Array,
  ffi::ArrayArray,
  ffi::DartRepresentationOf,
  ffi::Dart_CObject,
  ffi::Double,
  ffi::DoubleArray,
  ffi::DoublePointer,
  ffi::DynamicLibrary,
  ffi::DynamicLibraryExtension,
  ffi::Float,
  ffi::FloatArray,
  ffi::FloatPointer,
  ffi::Handle,
  ffi::Int16,
  ffi::Int16Array,
  ffi::Int16Pointer,
  ffi::Int32,
  ffi::Int32Array,
  ffi::Int32Pointer,
  ffi::Int64,
  ffi::Int64Array,
  ffi::Int64Pointer,
  ffi::Int8,
  ffi::Int8Array,
  ffi::Int8Pointer,
  ffi::IntPtr,
  ffi::IntPtrArray,
  ffi::IntPtrPointer,
  ffi::NativeApi,
  ffi::NativeFunction,
  ffi::NativeFunctionPointer,
  ffi::NativePort,
  ffi::NativeType,
  ffi::Opaque,
  ffi::Packed,
  ffi::Pointer,
  ffi::PointerArray,
  ffi::PointerPointer,
  ffi::Struct,
  ffi::StructArray,
  ffi::StructPointer,
  ffi::Uint16,
  ffi::Uint16Array,
  ffi::Uint16Pointer,
  ffi::Uint32,
  ffi::Uint32Array,
  ffi::Uint32Pointer,
  ffi::Uint64,
  ffi::Uint64Array,
  ffi::Uint64Pointer,
  ffi::Uint8,
  ffi::Uint8Array,
  ffi::Uint8Pointer,
  ffi::Union,
  ffi::UnionArray,
  ffi::UnionPointer,
  ffi::Unsized,
  ffi::Void)

  export "org-dartlang-test:///lib3.dart";

}
library from "org-dartlang-test:///lib3.dart" as lib3 {
additionalExports = (ffi::nullptr,
  ffi::unsized,
  ffi::sizeOf,
  ffi::Dart_NativeMessageHandler,
  ffi::Allocator,
  ffi::AllocatorAlloc,
  ffi::Array,
  ffi::ArrayArray,
  ffi::DartRepresentationOf,
  ffi::Dart_CObject,
  ffi::Double,
  ffi::DoubleArray,
  ffi::DoublePointer,
  ffi::DynamicLibrary,
  ffi::DynamicLibraryExtension,
  ffi::Float,
  ffi::FloatArray,
  ffi::FloatPointer,
  ffi::Handle,
  ffi::Int16,
  ffi::Int16Array,
  ffi::Int16Pointer,
  ffi::Int32,
  ffi::Int32Array,
  ffi::Int32Pointer,
  ffi::Int64,
  ffi::Int64Array,
  ffi::Int64Pointer,
  ffi::Int8,
  ffi::Int8Array,
  ffi::Int8Pointer,
  ffi::IntPtr,
  ffi::IntPtrArray,
  ffi::IntPtrPointer,
  ffi::NativeApi,
  ffi::NativeFunction,
  ffi::NativeFunctionPointer,
  ffi::NativePort,
  ffi::NativeType,
  ffi::Opaque,
  ffi::Packed,
  ffi::Pointer,
  ffi::PointerArray,
  ffi::PointerPointer,
  ffi::Struct,
  ffi::StructArray,
  ffi::StructPointer,
  ffi::Uint16,
  ffi::Uint16Array,
  ffi::Uint16Pointer,
  ffi::Uint32,
  ffi::Uint32Array,
  ffi::Uint32Pointer,
  ffi::Uint64,
  ffi::Uint64Array,
  ffi::Uint64Pointer,
  ffi::Uint8,
  ffi::Uint8Array,
  ffi::Uint8Pointer,
  ffi::Union,
  ffi::UnionArray,
  ffi::UnionPointer,
  ffi::Unsized,
  ffi::Void)

  export "dart:ffi";

}
library from "org-dartlang-test:///main.dart" as main {

  import "dart:ffi";
  import "org-dartlang-test:///lib.dart";

  @#C25
  class X extends dart.ffi::Struct {
    synthetic constructor •() → main::X
      : super dart.ffi::Struct::•()
      ;
    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
      ;
    get x1() → lib::Y
      return new lib::Y::#fromTypedDataBase( block {
        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object};
        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}{dart.typed_data::ByteBuffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}, (#C21).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}){([dart.core::int, dart.core::int?]) → dart.typed_data::Uint8List});
    set x1(lib::Y #externalFieldValue) → void
      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9, (#C21).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
    get x2() → lib::Y
      return new lib::Y::#fromTypedDataBase( block {
        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object};
        dart.core::int #offset = (#C21).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}{dart.typed_data::ByteBuffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}, (#C21).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}){([dart.core::int, dart.core::int?]) → dart.typed_data::Uint8List});
    set x2(lib::Y #externalFieldValue) → void
      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C21).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9, (#C21).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
    @#C8
    get x3() → dart.core::int
      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C28).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
    @#C8
    set x3(dart.core::int #externalFieldValue) → void
      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C28).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue);
    @#C18
    static get #sizeOf() → dart.core::int*
      return (#C31).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
  }
}
constants  {
  #C1 = "vm:ffi:struct-fields"
  #C2 = TypeLiteralConstant(dart.ffi::Uint8)
  #C3 = TypeLiteralConstant(dart.ffi::Uint64)
  #C4 = <dart.core::Type>[#C2, #C2, #C3]
  #C5 = null
  #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
  #C7 = dart.core::pragma {name:#C1, options:#C6}
  #C8 = dart.ffi::Uint8 {}
  #C9 = 0
  #C10 = <dart.core::int*>[#C9, #C9, #C9]
  #C11 = 1
  #C12 = <dart.core::int*>[#C11, #C11, #C11]
  #C13 = dart.ffi::Uint64 {}
  #C14 = 8
  #C15 = 4
  #C16 = <dart.core::int*>[#C14, #C15, #C14]
  #C17 = "vm:prefer-inline"
  #C18 = dart.core::pragma {name:#C17, options:#C5}
  #C19 = 16
  #C20 = 12
  #C21 = <dart.core::int*>[#C19, #C20, #C19]
  #C22 = TypeLiteralConstant(lib::Y)
  #C23 = <dart.core::Type>[#C22, #C22, #C2]
  #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
  #C25 = dart.core::pragma {name:#C1, options:#C24}
  #C26 = 32
  #C27 = 24
  #C28 = <dart.core::int*>[#C26, #C27, #C26]
  #C29 = 40
  #C30 = 28
  #C31 = <dart.core::int*>[#C29, #C30, #C29]
}
