#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float2 injectionSwitch;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_6, thread float4* const tint_symbol_3) {
  int i = 0;
  float const x_51 = x_6.injectionSwitch.x;
  i = int(x_51);
  int const x_8 = i;
  switch(x_8) {
    case 0: {
      while (true) {
        int const x_9 = i;
        i = as_type<int>((as_type<uint>(x_9) + as_type<uint>(1)));
        int const x_11 = i;
        switch(x_11) {
          case 2: {
            int const x_12 = i;
            i = as_type<int>((as_type<uint>(x_12) + as_type<uint>(5)));
            break;
          }
          case 1: {
            {
              int const x_16 = i;
              if ((x_16 > 200)) {
              } else {
                break;
              }
            }
            continue;
            break;
          }
          default: {
            int const x_14 = i;
            i = as_type<int>((as_type<uint>(x_14) + as_type<uint>(7)));
            break;
          }
        }
        {
          int const x_16 = i;
          if ((x_16 > 200)) {
          } else {
            break;
          }
        }
      }
      int const x_17 = i;
      if ((x_17 > 100)) {
        int const x_18 = i;
        i = as_type<int>((as_type<uint>(x_18) - as_type<uint>(2)));
        break;
      }
      /* fallthrough */
    }
    default: {
      int const x_20 = i;
      i = as_type<int>((as_type<uint>(x_20) - as_type<uint>(3)));
      break;
    }
  }
  int const x_22 = i;
  if ((x_22 == -2)) {
    *(tint_symbol_3) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_3) = float4(0.0f, 0.0f, 0.0f, 1.0f);
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_6, thread float4* const tint_symbol_4) {
  main_1(x_6, tint_symbol_4);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_4)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_6, &(tint_symbol_5));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

