#include <metal_stdlib>

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

void main_1(constant buf0& x_7, thread float* const tint_symbol_5, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
  float lv = 0.0f;
  float x_43 = 0.0f;
  int GLF_live5r = 0;
  int GLF_live5_looplimiter6 = 0;
  float const x_45 = x_7.injectionSwitch.y;
  if ((1.0f > x_45)) {
    float const x_50 = *(tint_symbol_5);
    x_43 = fabs(x_50);
  } else {
    x_43 = 260.0f;
  }
  float const x_52 = x_43;
  lv = x_52;
  float const x_53 = lv;
  if ((int(x_53) < 250)) {
    float const x_58 = lv;
    if ((int(x_58) < 180)) {
      float const x_64 = lv;
      float const x_65 = clamp(x_64, 1.0f, 1.0f);
    } else {
      float const x_67 = (*(tint_symbol_6)).y;
      if ((x_67 < 0.0f)) {
        float const x_71 = lv;
        if ((int(x_71) < 210)) {
          while (true) {
            {
              if (true) {
              } else {
                break;
              }
            }
          }
        }
        GLF_live5r = 0;
        while (true) {
          if (true) {
          } else {
            break;
          }
          int const x_11 = GLF_live5_looplimiter6;
          if ((x_11 >= 6)) {
            break;
          }
          int const x_12 = GLF_live5_looplimiter6;
          GLF_live5_looplimiter6 = as_type<int>((as_type<uint>(x_12) + as_type<uint>(1)));
        }
      }
    }
  }
  *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
  thread float4 tint_symbol_8 = 0.0f;
  thread float tint_symbol_9 = 0.0f;
  thread float4 tint_symbol_10 = 0.0f;
  tint_symbol_8 = gl_FragCoord_param;
  main_1(x_7, &(tint_symbol_9), &(tint_symbol_8), &(tint_symbol_10));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_10};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

