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

import "dart:async";

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