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

import "dart:async";

class C<T extends core::Object? = dynamic> extends core::Object {
  field FutureOr<dynamic>? _#C#field1 = null;
  field core::bool _#C#field1#isSet = false;
  field FutureOr<dynamic>? _#C#field2 = null;
  field core::bool _#C#field2#isSet = false;
  generic-covariant-impl field FutureOr<self::C::T%>? _#C#field3 = null;
  field core::bool _#C#field3#isSet = false;
  generic-covariant-impl field FutureOr<self::C::T?>? _#C#field4 = null;
  field core::bool _#C#field4#isSet = false;
  generic-covariant-impl field FutureOr<self::C::T?>? _#C#field5 = null;
  field core::bool _#C#field5#isSet = false;
  synthetic constructor •() → self::C<self::C::T%>
    : super core::Object::•()
    ;
  get field1() → FutureOr<dynamic>
    return this.{self::C::_#C#field1#isSet} ?{FutureOr<dynamic>} this.{self::C::_#C#field1} : throw new _in::LateError::fieldNI("field1");
  set field1(FutureOr<dynamic>#t1) → void {
    this.{self::C::_#C#field1#isSet} = true;
    this.{self::C::_#C#field1} = #t1;
  }
  get field2() → FutureOr<dynamic>?
    return this.{self::C::_#C#field2#isSet} ?{FutureOr<dynamic>?} this.{self::C::_#C#field2} : throw new _in::LateError::fieldNI("field2");
  set field2(FutureOr<dynamic>? #t2) → void {
    this.{self::C::_#C#field2#isSet} = true;
    this.{self::C::_#C#field2} = #t2;
  }
  get field3() → FutureOr<self::C::T%>
    return this.{self::C::_#C#field3#isSet} ?{FutureOr<self::C::T%>} let final FutureOr<self::C::T%>? #t3 = this.{self::C::_#C#field3} in #t3{FutureOr<self::C::T%>} : throw new _in::LateError::fieldNI("field3");
  set field3(generic-covariant-impl FutureOr<self::C::T%>#t4) → void {
    this.{self::C::_#C#field3#isSet} = true;
    this.{self::C::_#C#field3} = #t4;
  }
  get field4() → FutureOr<self::C::T?>
    return this.{self::C::_#C#field4#isSet} ?{FutureOr<self::C::T?>} this.{self::C::_#C#field4} : throw new _in::LateError::fieldNI("field4");
  set field4(generic-covariant-impl FutureOr<self::C::T?>#t5) → void {
    this.{self::C::_#C#field4#isSet} = true;
    this.{self::C::_#C#field4} = #t5;
  }
  get field5() → FutureOr<self::C::T?>?
    return this.{self::C::_#C#field5#isSet} ?{FutureOr<self::C::T?>?} this.{self::C::_#C#field5} : throw new _in::LateError::fieldNI("field5");
  set field5(generic-covariant-impl FutureOr<self::C::T?>? #t6) → void {
    this.{self::C::_#C#field5#isSet} = true;
    this.{self::C::_#C#field5} = #t6;
  }
  method method() → dynamic {
    lowered FutureOr<dynamic>? #local1;
    lowered core::bool #local1#isSet = false;
    function #local1#get() → FutureOr<dynamic>
      return #local1#isSet ?{FutureOr<dynamic>} #local1 : throw new _in::LateError::localNI("local1");
    function #local1#set(FutureOr<dynamic>#t7) → dynamic {
      #local1#isSet = true;
      return #local1 = #t7;
    }
    lowered FutureOr<dynamic>? #local2;
    lowered core::bool #local2#isSet = false;
    function #local2#get() → FutureOr<dynamic>?
      return #local2#isSet ?{FutureOr<dynamic>?} #local2 : throw new _in::LateError::localNI("local2");
    function #local2#set(FutureOr<dynamic>? #t8) → dynamic {
      #local2#isSet = true;
      return #local2 = #t8;
    }
    lowered FutureOr<self::C::T%>? #local3;
    lowered core::bool #local3#isSet = false;
    function #local3#get() → FutureOr<self::C::T%>
      return #local3#isSet ?{FutureOr<self::C::T%>} #local3{FutureOr<self::C::T%>} : throw new _in::LateError::localNI("local3");
    function #local3#set(FutureOr<self::C::T%>#t9) → dynamic {
      #local3#isSet = true;
      return #local3 = #t9;
    }
    lowered FutureOr<self::C::T?>? #local4;
    lowered core::bool #local4#isSet = false;
    function #local4#get() → FutureOr<self::C::T?>
      return #local4#isSet ?{FutureOr<self::C::T?>} #local4 : throw new _in::LateError::localNI("local4");
    function #local4#set(FutureOr<self::C::T?>#t10) → dynamic {
      #local4#isSet = true;
      return #local4 = #t10;
    }
    lowered FutureOr<self::C::T?>? #local5;
    lowered core::bool #local5#isSet = false;
    function #local5#get() → FutureOr<self::C::T?>?
      return #local5#isSet ?{FutureOr<self::C::T?>?} #local5 : throw new _in::LateError::localNI("local5");
    function #local5#set(FutureOr<self::C::T?>? #t11) → dynamic {
      #local5#isSet = true;
      return #local5 = #t11;
    }
  }
}
static field FutureOr<dynamic>? _#field1 = null;
static field core::bool _#field1#isSet = false;
static field FutureOr<dynamic>? _#field2 = null;
static field core::bool _#field2#isSet = false;
static field FutureOr<dynamic>? _#field3 = null;
static field core::bool _#field3#isSet = false;
static field FutureOr<core::int>? _#field4 = null;
static field core::bool _#field4#isSet = false;
static field FutureOr<core::int?>? _#field5 = null;
static field core::bool _#field5#isSet = false;
static field FutureOr<core::int?>? _#field6 = null;
static field core::bool _#field6#isSet = false;
static method method1() → FutureOr<dynamic>
  return null;
static method method2() → FutureOr<dynamic>?
  return null;
static method method3() → FutureOr<dynamic>
  return null;
static method method4() → FutureOr<core::int>
  return 0;
static method method5() → FutureOr<core::int?>
  return null;
static method method6() → FutureOr<core::int?>?
  return null;
static get field1() → FutureOr<dynamic> {
  if(!self::_#field1#isSet) {
    self::_#field1 = self::method1();
    self::_#field1#isSet = true;
  }
  return self::_#field1;
}
static set field1(FutureOr<dynamic>#t12) → void {
  self::_#field1#isSet = true;
  self::_#field1 = #t12;
}
static get field2() → FutureOr<dynamic>? {
  if(!self::_#field2#isSet) {
    self::_#field2 = self::method2();
    self::_#field2#isSet = true;
  }
  return self::_#field2;
}
static set field2(FutureOr<dynamic>? #t13) → void {
  self::_#field2#isSet = true;
  self::_#field2 = #t13;
}
static get field3() → FutureOr<dynamic> {
  if(!self::_#field3#isSet) {
    self::_#field3 = self::method3();
    self::_#field3#isSet = true;
  }
  return self::_#field3;
}
static set field3(FutureOr<dynamic>#t14) → void {
  self::_#field3#isSet = true;
  self::_#field3 = #t14;
}
static get field4() → FutureOr<core::int>
  return let final FutureOr<core::int>? #t15 = self::_#field4 in #t15.==(null) ?{FutureOr<core::int>} self::_#field4 = self::method4() : #t15{FutureOr<core::int>};
static set field4(FutureOr<core::int>#t16) → void
  self::_#field4 = #t16;
static get field5() → FutureOr<core::int?> {
  if(!self::_#field5#isSet) {
    self::_#field5 = self::method5();
    self::_#field5#isSet = true;
  }
  return self::_#field5;
}
static set field5(FutureOr<core::int?>#t17) → void {
  self::_#field5#isSet = true;
  self::_#field5 = #t17;
}
static get field6() → FutureOr<core::int?>? {
  if(!self::_#field6#isSet) {
    self::_#field6 = self::method6();
    self::_#field6#isSet = true;
  }
  return self::_#field6;
}
static set field6(FutureOr<core::int?>? #t18) → void {
  self::_#field6#isSet = true;
  self::_#field6 = #t18;
}
static method main() → dynamic {}
