// The Dart Project Fuzz Tester (1.2).
// Program generated as:
//   dart dartfuzz.dart --seed 3608420507

bool var0 = false;
bool var1 = false;
int var2 = -49;
double var3 = double.maxFinite;
String var4 = '5Cw)';
List<int> var5 = [ 8589934591 ];
Map<int, String> var6 = { 0 : '\u2665', 1 : '7\u{1f600}\u{1f600}t\u2665s', 2 : '\u2665&)I', 3 : 'G\u2665\u{1f600}e' };

List<int> foo0(List<int> par1, int par2, int par3) {
  var6 ??= var6;
  var4 ??= '';
  par1 = var5;
  return [ -94 ];
}

int foo1(Map<int, String> par1, bool par2) {
  print((-((((var4 == (var4).toLowerCase()) ? false : par2) ? (-(double.nan)) : (var1 ? (((false ? true : var1) ? (par2 ? ((-((double.maxFinite + var3)))).roundToDouble() : (-(var3))) : var3)).abs() : var3)))));
  { List<int> loc0 = [ 95 ];
    return var2;
  }
}

String foo2() {
  var3 += (true ? ((var3).remainder((var1 ? (-(0.20648281590433248)) : double.maxFinite)) + double.maxFinite) : (var3 * var3));
  var2 %= (var2--);
  var6 = var6;
  return (var1 ? (false ? (((!(true)) || false) ? var4 : ((var6).isEmpty ? var4 : 'I#')) : var4) : 'XLH+c\u2665\u2665');
}

class X0  {

  String fld0_0 = '\u2665';

  String foo0_0() {
    if (((({ 0 : 'e\u{1f600}mw', 1 : 'XZPq', 2 : '2l', 3 : 'EI' } ?? { 0 : '1fG', 1 : 'LV\u2665s\u{1f600}s\u2665', 2 : '\u{1f600}#', 3 : 'V' }) ?? { 0 : 'Z6' })).isNotEmpty) {
      var4 ??= var4;
    } else {
      if ((var5 == ((var1 ? ((!((false ? var1 : (!((true && (var0 ? (false ? (false ? false : var1) : true) : var1))))))) ? var0 : var1) : false) ? ((([ -9223372030412324863, 21, -97 ] + var5) ?? ([ -9223372034707292160, -16, 6 ] + var5)) + ([ 83, -52, 18 ]).sublist((++var2))) : ((var1 ? var5 : var5)).sublist(foo1(var6, true))))) {
        { int loc0 = (var2--);
          if (false) {
            fld0_0 ??= '\u26655JnN';
            { Map<int, String> loc1 = var6;
              return var4;
            }
          }
        }
      }
    }
    return '1f';
  }

  void run() {
    if ((foo0([ -23, -74, 8589934591 ], (true ? (-(-9223372030412324863)) : var2), (var0 ? var2 : foo1({ 0 : 'kU0', 1 : '\u{1f600}', 2 : '\u2665M' }, (var1 && (var2).isEven)))) == [ 81, -9223372030412324865, 56, 62 ])) {
      var6 ??= { 0 : '\u{1f600}\u{1f600}D\u26652', 1 : 'yJb\u26657+' };
      return;
    } else {
      return;
    }
  }
}

class X1 extends X0 {

  double fld1_0 = 0.6358731486904787;

  bool foo1_0() {
    { List<int> loc0 = (foo0(var5, (var1 ? foo1({ 0 : '\u26657@MJF', 1 : 'J' }, true) : (~((--var2)))), ([ 6442450945 ]).removeLast()) + foo0([ 58 ], (-(var2)), (var2++)));
      print(foo0([ 69 ], 97, 63));
      var5 = (((var5).sublist(var2)).sublist(var2)).sublist(((-(var3))).toInt());
    }
    var1 = (!(var0));
    print((!(((-(double.infinity)) != double.minPositive))));
    return var0;
  }

  List<int> foo1_1(bool par1, double par2, int par3) {
    print(foo2());
    fld1_0 = (-(double.infinity));
    var0 = (([ -9223372036854775808, -19 ]).remove(foo1(var6, ((-((par3++))) < var2))) ? (var4 == 'Z72') : var1);
    return foo0(foo0((foo0(([ 14, -79 ] ?? var5), (-(par3)), ((true ? true : (!(var1))) ? (var0 ? (-73 * par3) : 53) : 66)) + (var1 ? var5 : [ 17 ])), ((true ? var1 : (par1 ? (!(false)) : par1)) ? par3 : var2), foo1(var6, true)), foo1({ 0 : '1okmvo', 1 : 'Cyn', 2 : 'Iq\u{1f600}' }, (!((!(foo1_0()))))), (par1 ? (~((foo1_0() ? (--var2) : -1))) : (par1 ? var2 : 74)));
  }

  void run() {
    super.run();
    if ((false ? var0 : ({ 0 : 'SVw', 1 : '\u266576Q', 2 : '\u2665b&E' }).containsValue(var4))) {
      return;
    }
  }
}

class X2 extends X1 {

  String fld2_0 = '';
  Map<int, String> fld2_1 = { 0 : '\u{1f600}\u2665F8', 1 : '\u{1f600}Kd', 2 : 'CW6e@d' };
  Map<int, String> fld2_2 = { 0 : 'MM3Ogd\u{1f600}', 1 : 'D', 2 : 'I\u{1f600}2kH4\u{1f600}' };

  List<int>? foo2_0(String par1, double par2, int par3) {
    var6 ??= ({ 0 : 'hVMi', 1 : '', 2 : 'S' } ?? { 0 : '9c\u{1f600}\u{1f600}\u{1f600}dW', 1 : 'g(Fu\u{1f600}bX', 2 : 'Pi2Z\u{1f600}', 3 : 'O\u2665' });
    for (int loc0 = 0; loc0 < 84; loc0++) {
      return (((!((!(var1)))) ? false : false) ? var5 : (false ? var5 : [ -9223372030412324864 ]));
    }
  }

  bool foo2_1(int par1, String par2) {
    { double loc0 = var3;
      fld2_2 = { 0 : 'mWycw' };
      var0 = true;
    }
    return (var1 ? ((par1++) != foo1(fld2_1, (!(false)))) : true);
  }

  Map<int, String> foo2_2() {
    { String loc0 = 'Am 3x';
      return fld2_1;
    }
  }

  double? foo2_3(List<int> par1) {
    var6 = foo2_2();
    if (var1) {
      print({ 0 : 'K\u{1f600}\u{1f600}\u2665\u{1f600}', 1 : 'lh34LP' });
      print('im\u2665');
      { String loc0 = (var1 ? ('y\u2665E4UQQ' + ('Q0J2  y').substring(-78)) : foo2());
        { bool loc1 = (((-(-92))).isOdd && (!((!(false)))));
          print(var3);
          if ((var2).isEven) {
            var3 /= 0.536905815119827;
            var2 |= (++var2);
            { double loc2 = var3;
              { int loc3 = foo1({ 0 : 'G(', 1 : '\u{1f600}&a9t', 2 : '\u{1f600}TF', 3 : '\u2665m-' }, true);
                var4 ??= (loc0).substring(((((par1 ?? [ -9223372034707292159, 44, -1, 2147483648 ])).remove((false ? -9223372032559808511 : (((++loc3) ~/ (2147483649 | 54))).ceil())) || false) ? (~((loc3++))) : (foo1(fld2_1, (var6 == { 0 : '', 1 : 'KP8' })) >> 50)));
                if ((true != ((!(loc1)) ? ((-(40)) >= -32) : foo2_1(9223372034707292159, (foo2_2()).remove((((-((loc3).abs())) ~/ 42)).toSigned(-27))!)))) {
                  if (loc1) {
                    return loc2;
                  }
                }
              }
            }
          }
        }
      }
    }
  }

  void run() {
    super.run();
    fld2_2 ??= (var1 ? fld2_2 : { 0 : 'M ', 1 : 'zG', 2 : 'c' });
    if (((foo2_1(var2, var4) ? ((false ? ((var1 || (true && foo2_1(9223372032559808512, var4))) ? var5 : var5) : ([ -52 ]).sublist((true ? 24 : var2)))).remove(9223372036854775807) : false) && var0)) {
      for (int loc0 = 0; loc0 < 57; loc0++) {
        var5 ??= (([ 26, 82, -9223372032559808512 ]).sublist((-22 >> 27)) + var5);
        var6 ??= fld2_2;
        fld2_0 ??= foo2();
        for (int loc1 = 0; loc1 < 67; loc1++) {
          for (int loc2 = 0; loc2 < 31; loc2++) {
            var4 = foo2();
            { bool loc3 = foo2_1((-(((!(var0)) ? foo1(fld2_2, true) : foo1((foo2_1((false ? ([ -74, -49, -79, 2 ]).length : 9223372034707292161), 'y') ? ({ 0 : '\u{1f600}Jf', 1 : 'NF' } ?? { 0 : '1 y\u{1f600}\u26659' }) : { 0 : '6MO\u2665A\u{1f600})', 1 : 'p\u{1f600}\u{1f600}6J', 2 : 'sg)' }), var0)))), fld2_0);
              var5 ??= var5;
              for (int loc4 = 0; loc4 < 78; loc4++) {
                return;
              }
            }
          }
        }
      }
    }
  }
}

class X3 extends X2 {

  List<int> fld3_0 = [ -4, -4, -79, 34 ];

  bool foo3_0(int par1, List<int> par2) {
    return (((var1 ? 60 : var2)).isOdd ? ((var1 ? fld3_0 : par2)).remove(foo1(var6, (var1 != var0))) : (false ? false : (('GB').substring((++var2))).endsWith(('p\u{1f600}f1u\u2665' ?? 'L\u2665OY!ui'))));
  }

  int foo3_1(List<int> par1, int par2, bool par3) {
    if (true) {
      return par2;
    }
  }

  List<int>? foo3_2(List<int> par1, List<int> par2) {
    for (int loc0 = 0; loc0 < 68; loc0++) {
      { String loc1 = foo2();
        var2 -= (~((false ? (~((false ? loc0 : -9223372034707292161))) : (var2--))));
        for (int loc2 = 0; loc2 < 95; loc2++) {
          var3 ??= ((false ? var3 : (-(var3))) * (var3 ?? ((-(double.negativeInfinity))).remainder((var3 * double.nan))));
          if ((loc1).endsWith('')) {
            print((((!(foo3_0(-47, par2))) ? par1 : ([ 2, -52, -9223372032559808512, 2147483649 ] + par2))).removeLast());
            var2 -= foo3_1((foo0((foo0(((var0 ? [ -4294967295, -95, -22, 27 ] : [ 38 ]) + [ 2147483647 ]), (var3).truncate(), var2) ?? par1), (~(loc0)), 53)).sublist((--loc0)), ((loc2++) ?? ((!((false || var0))) ? (69 + (47 & (foo0([ 24, -98, 2147483647, -48 ], loc0, 47)).indexOf(37))) : (var4).compareTo((var1 ? loc1 : loc1)))), (foo3_0((var2 + (~(loc2))), foo0(([ 20, 13 ] + par2), loc0, var2)) && (loc1).isNotEmpty));
            for (int loc3 = 0; loc3 < 62; loc3++) {
              for (int loc4 = 0; loc4 < 61; loc4++) {
                return fld3_0;
              }
            }
          }
        }
      }
    }
  }

  bool? foo3_3(List<int> par1, Map<int, String> par2, Map<int, String> par3) {
    for (int loc0 = 0; loc0 < 16; loc0++) {
      if (foo3_0((-((var0 ? 8589934591 : 65))), foo3_2(fld3_0, (fld3_0).sublist((true ? (0.23821360229648214).toInt() : var2)))!)) {
        par1 ??= (((var4 == '&Tze') ? ([ -27, 23, -40 ] != par1) : true) ? [ 23, 21, 4294967295 ] : fld3_0);
        print((par2 ?? { 0 : '\u{1f600}\u2665\u{1f600}Jpj&', 1 : '', 2 : '', 3 : '' }));
        var4 = var4;
        var1 = (((~(((++loc0) ?? loc0)))).isEven == false);
      }
      for (int loc1 = 0; loc1 < 93; loc1++) {
        var4 = 'gngT';
        return (foo3_0(((((var3 * (loc1).ceilToDouble()) - ((0.6230577340230226 > var3) ? (var3 - var3) : double.maxFinite)) - double.nan)).ceil(), [ 0 ]) ? ((!(var0)) && foo3_0((-(-59)), [ 8, 1, 12, -9223372030412324863 ])) : foo3_0(foo3_1(foo3_2([ 2, -33, -72 ], [ 30, 58, 0 ])!, loc1, (!(var1))), var5));
      }
    }
  }

  void run() {
    super.run();
    var1 = (var6).containsKey((var0 ? (30).floor() : (~((++var2)))));
  }
}

main() {
  try {
    new X3().run();
  } catch (e) {
    print('throws');
  } finally {
    print('$var0\n$var1\n$var2\n$var3\n$var4\n$var5\n$var6\n');
  }
}
