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

extension type ET1(core::int id) {
  abstract extension-type-member representation-field get id() → core::int;
  constructor c0 = self::ET1|constructor#c0;
  constructor tearoff c0 = self::ET1|constructor#_#c0#tearOff;
  constructor c1 = self::ET1|constructor#c1;
  constructor tearoff c1 = self::ET1|constructor#_#c1#tearOff;
  constructor c2 = self::ET1|constructor#c2;
  constructor tearoff c2 = self::ET1|constructor#_#c2#tearOff;
  constructor c3 = self::ET1|constructor#c3;
  constructor tearoff c3 = self::ET1|constructor#_#c3#tearOff;
  constructor c4 = self::ET1|constructor#c4;
  constructor tearoff c4 = self::ET1|constructor#_#c4#tearOff;
  constructor c5 = self::ET1|constructor#c5;
  constructor tearoff c5 = self::ET1|constructor#_#c5#tearOff;
  constructor c6 = self::ET1|constructor#c6;
  constructor tearoff c6 = self::ET1|constructor#_#c6#tearOff;
  static redirecting-factory f1 = self::ET1|constructor#f1;
  static redirecting-factory tearoff f1 = self::ET1|constructor#_#f1#tearOff;
  static factory f2 = self::ET1|constructor#f2;
  static factory tearoff f2 = self::ET1|constructor#_#f2#tearOff;
}
static extension-type-member method ET1|constructor#c0(core::int id) → self::ET1% /* erasure=core::int, declared=! */ {
  lowered final self::ET1% /* erasure=core::int, declared=! */ #this = id;
  return #this;
}
static extension-type-member method ET1|constructor#_#c0#tearOff(core::int id) → self::ET1% /* erasure=core::int, declared=! */
  return self::ET1|constructor#c0(id);
static extension-type-member method ET1|constructor#c1() → self::ET1% /* erasure=core::int, declared=! */ {
  lowered final self::ET1% /* erasure=core::int, declared=! */ #this;
  #this = self::ET1|constructor#c0(0);
  return #this;
}
static extension-type-member method ET1|constructor#_#c1#tearOff() → self::ET1% /* erasure=core::int, declared=! */
  return self::ET1|constructor#c1();
static extension-type-member method ET1|constructor#c2(core::int id) → self::ET1% /* erasure=core::int, declared=! */ {
  lowered final self::ET1% /* erasure=core::int, declared=! */ #this = id;
  return #this;
}
static extension-type-member method ET1|constructor#_#c2#tearOff(core::int id) → self::ET1% /* erasure=core::int, declared=! */
  return self::ET1|constructor#c2(id);
static extension-type-member method ET1|constructor#c3(core::int a, core::int b) → self::ET1% /* erasure=core::int, declared=! */ {
  lowered final self::ET1% /* erasure=core::int, declared=! */ #this = a.{core::num::+}(b){(core::num) → core::int};
  return #this;
}
static extension-type-member method ET1|constructor#_#c3#tearOff(core::int a, core::int b) → self::ET1% /* erasure=core::int, declared=! */
  return self::ET1|constructor#c3(a, b);
static extension-type-member method ET1|constructor#c4(core::int a, [core::int b = #C1]) → self::ET1% /* erasure=core::int, declared=! */ {
  lowered final self::ET1% /* erasure=core::int, declared=! */ #this = a.{core::num::+}(b){(core::num) → core::int};
  return #this;
}
static extension-type-member method ET1|constructor#_#c4#tearOff(core::int a, [core::int b = #C1]) → self::ET1% /* erasure=core::int, declared=! */
  return self::ET1|constructor#c4(a, b);
static extension-type-member method ET1|constructor#c5(core::int a, {core::int b = #C2}) → self::ET1% /* erasure=core::int, declared=! */ {
  lowered final self::ET1% /* erasure=core::int, declared=! */ #this = a.{core::num::+}(b){(core::num) → core::int};
  return #this;
}
static extension-type-member method ET1|constructor#_#c5#tearOff(core::int a, {core::int b = #C2}) → self::ET1% /* erasure=core::int, declared=! */
  return self::ET1|constructor#c5(a, b: b);
static extension-type-member method ET1|constructor#c6(core::int a, {required core::int b}) → self::ET1% /* erasure=core::int, declared=! */ {
  lowered final self::ET1% /* erasure=core::int, declared=! */ #this = a.{core::num::+}(b){(core::num) → core::int};
  return #this;
}
static extension-type-member method ET1|constructor#_#c6#tearOff(core::int a, {required core::int b}) → self::ET1% /* erasure=core::int, declared=! */
  return self::ET1|constructor#c6(a, b: b);
static extension-type-member method ET1|constructor#f1() → self::ET1% /* erasure=core::int, declared=! */ /* redirection-target: self::ET1|constructor#c1 */
  return self::ET1|constructor#c1();
static extension-type-member method ET1|constructor#_#f1#tearOff() → self::ET1% /* erasure=core::int, declared=! */
  return self::ET1|constructor#c1();
static extension-type-member method ET1|constructor#f2(core::int v) → self::ET1% /* erasure=core::int, declared=! */
  return self::ET1|constructor#c2(v);
static extension-type-member method ET1|constructor#_#f2#tearOff(core::int v) → self::ET1% /* erasure=core::int, declared=! */
  return self::ET1|constructor#f2(v);

constants  {
  #C1 = 1
  #C2 = 2
}
