// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
//
// VMOptions=--deterministic
//
// Regression test, reduced case found by DartFuzz that crashed DBC register
// allocator (https://github.com/dart-lang/sdk/issues/36977).

// @dart = 2.9

// [NNBD non-migrated]: This test contains dozens and dozens of static errors
// under NNBD. Migrating the test to fix those errors significantly changes the
// code under test in ways that are likely to invalidate it.

import 'dart:async';
import 'dart:cli';
import 'dart:collection';
import 'dart:convert';
import 'dart:core';
import 'dart:io';
import 'dart:isolate';
import 'dart:math';
import 'dart:typed_data';

double var0 = 0.9297828201722298;
bool var1 = false;
int var2 = -99;
double var3 = 0.26752130449990763;
String var4 = 'OJG';
List<int> var5 = [0, -92, 49, 96];
Set<int> var6 = {29, 9223372036854775807, 75};
Map<int, String> var7 = {
  56: '\u{1f600}D',
  35: '62',
  13: '',
  14: '5k1\u{1f600}\u{1f600}'
};

double foo0(String par1) {
  throw ({
        51: MapBase.mapToString(var7),
        9: '-Io',
        65: ((var2 * var5[-77])).toRadixString(
            ((false ? false : (true ? var1 : (!((!(var1))))))
                ? (--var2)
                : (-(-16)))),
        61: ''
      } ??
      var7);
}

int foo1(Set<int> par1, Set<int> par2) {
  return Int32x4.zxzy;
}

String foo2() {
  {
    int loc0 = 58;
    while (--loc0 > 0) {
      switch ((~((~((-((~(foo1((false ? var6 : var6), {
        (~(-84)),
        ((var1 ? var5[(loc0 + (var2--))] : -77) >>
            ((var1 ? var2 : ((-(var2)) - loc0)) +
                foo1(
                    {
                      -8,
                      19,
                      (true ? var2 : 70),
                      39,
                      loc0,
                      Int32x4.wxyw,
                      var5[var5[Int32x4.wzxz]],
                      -12
                    },
                    (var6 ??
                        {
                          var5[(var1 ? var5[loc0] : var2)],
                          var5[(loc0--)],
                          loc0
                        })))),
        ((Int32x4.yzzw % loc0) % -87),
        Int32x4.wxyz,
        Float32x4.wzxz
      })))))))))) {
        case 3666713542:
          {
            var4 = (true
                ? var4
                : String.fromCharCode((var1
                    ? ((true ? true : true) ? var5[(var2++)] : var2)
                    : (((((false ? (true ? false : true) : false) ? 52 : var2) -
                                foo1(var6, var6)) ~/
                            var2) ^
                        loc0))));
          }
          break;
        case 3666713543:
          {
            var5 = [(Float32x4.xzyw << (Int32x4.zywz * var2))];
          }
          break;
      }
    }
  }
  return 'hLw';
}

class X0 {
  bool fld0_0 = true;

  Set<int> foo0_0(Map<int, String> par1, int par2) {
    try {
      if ((var5 != var5)) {
        throw 0.2119336645634784;
      }
    } catch (exception, stackTrace) {
      if (fld0_0) {
        print({
          ((Float32x4.xzzx %
                  ((-(30)) *
                      foo1(
                          var6,
                          ({
                                (par2++),
                                foo1({
                                  var5[-83],
                                  (true ? -58 : foo1(var6, var6)),
                                  par2,
                                  (var5[-49] - 46),
                                  var2,
                                  var5[76],
                                  73
                                }, (var6).difference(var6)),
                                (((false ? var5[49] : 6442450943) > -98)
                                    ? -92
                                    : var5[7]),
                                -93,
                                var5[var5[27]],
                                var5[-5],
                                (-(((var1 ? false : true) ? var5[-87] : par2)))
                              } ??
                              {FileSystemEvent.modify, 31, var2})))) +
              var2),
          (((++par2)).isEven
              ? foo1(
                  ((var6).toSet()).intersection((var1
                      ? var6
                      : (true
                          ? (var6 ??
                              {
                                foo1({
                                  (45 ^ -59),
                                  var2,
                                  -94,
                                  Int32x4.yyzw,
                                  var2,
                                  44,
                                  var5[foo1(var6, (var6 ?? {-91, var2}))]
                                }, var6),
                                ((++par2) % 70),
                                88
                              })
                          : var6))),
                  ({
                        -85,
                        (var2++),
                        (++par2),
                        45,
                        par2,
                        (--par2),
                        (var5[par2] ??
                            (-((~(foo1(var6, {
                              foo1(
                                  ({
                                        (var2 -
                                            (FileSystemEntity.isFileSync(
                                                    'd)\u{1f600}+Sm')
                                                ? (false ? 22 : var2)
                                                : -15)),
                                        var5[var2],
                                        par2,
                                        var5[(foo1(
                                                var6,
                                                ({
                                                      var2,
                                                      (~(-9223372030412324863)),
                                                      (var2++),
                                                      -18
                                                    } ??
                                                    var6)) &
                                            Int32x4.yxwx)],
                                        (fld0_0
                                            ? (~((-(-50))))
                                            : foo1({
                                                foo1({-92, var5[81]}, var6),
                                                var2,
                                                76,
                                                var5[(false
                                                    ? (true
                                                        ? var2
                                                        : var5[Float32x4.yzxx])
                                                    : var5[var5[var2]])],
                                                Duration.minutesPerHour,
                                                34
                                              }, var6)),
                                        -72
                                      } ??
                                      var6),
                                  {25, Float32x4.wwww})
                            })))))),
                        (par2--)
                      } ??
                      var6))
              : (-((SecurityContext.alpnSupported
                  ? Float32x4.zwyz
                  : foo1({
                      14,
                      var5[var2],
                      (~(39)),
                      93,
                      Float32x4.xyxx,
                      (-(var5[(-65 << -28)])),
                      24,
                      (~(-64))
                    }, {
                      -31,
                      (foo1(var6, {
                            Float32x4.zzyx,
                            96,
                            Float32x4.yyxw,
                            var2,
                            par2
                          }) +
                          Int32x4.wzyy),
                      (~(52)),
                      -13,
                      par2,
                      -83,
                      ZLibOption.defaultMemLevel,
                      (var2++)
                    })))))
        });
      }
    } finally {
      for (int loc0 = 0; loc0 < 90; loc0++) {
        if (false) {
          var5 ??= [(~((++par2)))];
          var0 += ((0.08377494829959586 - (-(var3))) *
              (-(((true ? (var0 + 0.8491470957055424) : var0) /
                  ((!(var1))
                      ? var0
                      : (var0 *
                          ((([
                                        -67,
                                        6442450943,
                                        -95,
                                        var5[par2],
                                        -30,
                                        6442450945,
                                        loc0
                                      ] ??
                                      [
                                        (true ? 6442450943 : 16),
                                        var5[var5[1]],
                                        var2,
                                        Float32x4.xwzy,
                                        par2,
                                        var5[28],
                                        Int32x4.xxwx,
                                        var5[-23]
                                      ]) !=
                                  [var5[var5[(--par2)]], Int32x4.yzxy])
                              ? var3
                              : 0.9197172211286759)))))));
        } else {
          print((var4).codeUnits);
        }
      }
      var7 ??= {
        9: (var7[(((!(fld0_0)) ? -27 : (Float32x4.xyzz).round()) ^
                ((~(54)) +
                    foo1({
                      var2,
                      28,
                      -9223372028264841217,
                      (par2--),
                      (++par2),
                      -1,
                      (-(var5[var2]))
                    }, var6)))])
            .padLeft(68, (0.0875980111263257).toStringAsPrecision((++par2))),
        88: (foo2() ?? '1rcZ'),
        32: 'NeAEG',
        5: ('\u{1f600}n)V\u2665#').replaceRange(
            (-(-1)),
            (-(par2)),
            ((((!((var1 || (true ? var1 : (var7).isEmpty)))) ? var1 : false) &&
                    (var7).isEmpty)
                ? ((false ? false : var1) ? '!Tlx)' : par1[6442450943])
                : var4)),
        13: var7[(((!(((par1[-27] ?? 'AcM') != 'Gb')))
                ? true
                : (var6 ==
                    ({
                          13,
                          96,
                          var5[Int32x4.zxyw],
                          -41,
                          ((fld0_0 || true) ? var5[-45] : var5[95]),
                          (--par2),
                          -37
                        } ??
                        {
                          8589934591,
                          ((--var2) ??
                              (var2 *
                                  ((!(var1))
                                      ? var5[Float32x4.yxxx]
                                      : (var2++)))),
                          (var5[var5[Float32x4.wwzz]] * -30),
                          Int32x4.xzzw,
                          (-((~(22)))),
                          15
                        })))
            ? (fld0_0
                ? var2
                : foo1({
                    var5[-9223372028264841217],
                    foo1(
                        {
                          -82,
                          var5[Float32x4.zzyx],
                          par2,
                          (~(var5[par2])),
                          (par2++),
                          63
                        },
                        (false
                            ? {
                                0,
                                Uint16List.bytesPerElement,
                                -41,
                                8,
                                Int32x4.xxyz,
                                RawSocketOption.levelSocket
                              }
                            : var6)),
                    foo1({var5[(~(-47))], (-(-46))},
                        ({var5[2], (-(-28))} ?? var6)),
                    (par2--),
                    foo1(({var5[-69], 52}).difference(var6),
                        {25, (-(var5[9223372034707292159])), 52}),
                    (var2++),
                    Int32x4.ywyz,
                    (FileSystemEntity.isWatchSupported ? (++par2) : var2)
                  }, {
                    Float32x4.wxzx,
                    var2,
                    par2,
                    var5[var2],
                    par2,
                    var2
                  }))
            : (++par2))]
      };
    }
    return var6;
  }

  Map<int, String> foo0_1(double par1) {
    fld0_0 = (0.8454395181150425).isInfinite;
    return {
      86: var4,
      59: ((((par1 ?? 0.45641338431576617)).toStringAsExponential(
                  (foo1({51, 35, (var1 ? (~(var2)) : -35)}, var6) ^
                      Int32x4.xwzx)))
              .trimLeft() +
          'FX')
    };
  }

  void run() {
    {
      int loc0 = 2;
      while (--loc0 > 0) {
        var2 %= (fld0_0 ? var2 : -26);
      }
    }
    try {
      switch ((true
          ? (~((var1 ? 40 : foo1((var6).difference(var6), {77}))))
          : (92 ?? Float32x4.zxxx))) {
        case 583336190:
          {
            var7 = (foo0_1(((2 ^ var2)).truncateToDouble()) ??
                ((FileSystemEntity.isFileSync('J u') && false)
                    ? ({
                          96: 'PRN',
                          26: 'rayc(',
                          91: '',
                          69: 'NG',
                          78: 'B7',
                          53: 'KOQzI',
                          85: 'ZuksL'
                        } ??
                        var7)
                    : var7));
          }
          break;
        case 583336197:
          {
            var7 = (((--var2) != (~(((var2--) ~/ (++var2)))))
                ? ((true ? Map.from(Map.of(var7)) : var7) ?? var7)
                : foo0_1(0.48262288106096063));
          }
          break;
      }
      for (int loc0 = 0; loc0 < 8; loc0++) {
        /*
         * Multi-line
         * comment.
         */
        {
          int loc1 = 22;
          while (--loc1 > 0) {
            var6 ??= var6;
            var7[(FileSystemEntity.isWatchSupported
                ? foo1(
                    (foo0_0({49: '7asVc2S', 12: 'x\u2665\u{1f600}tI'}, loc0))
                        .difference(((!(true))
                            ? foo0_0({
                                24: 'kB9',
                                87: 'vIEqX@r',
                                36: '5u',
                                34: 'M8\u{1f600}Og\u2665',
                                73: '-bMA\u{1f600}N',
                                39: 'F((\u{1f600}Y',
                                54: 'FHp!'
                              }, 4294967297)
                            : var6)),
                    foo0_0({
                      95: '!sL',
                      30: '\u2665',
                      51: 'E+jWt\u{1f600}',
                      78: 'cCr#k',
                      56: ')P-a'
                    }, -19))
                : 76)] = (var4 + 'n\u2665\u{1f600}j');
          }
        }
      }
    } catch (exception, stackTrace) {
      var3 ??= ((!(true))
          ? foo0(var7[(false
              ? foo1(
                  ((foo0_0({
                            60: 'Nt2h',
                            48: 'gWolH9',
                            42: ')',
                            15: 'n!YW\u2665',
                            79: '7E\u{1f600}'
                          }, 37) ??
                          {19}) ??
                      var6),
                  {-17, 4294967297, -94, -63})
              : (var2--))])
          : ((-(double.nan)) / 0.7833677975390729));
    }
  }
}

main() {
  new X0().run();
}
