#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 float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  int loop_count = 0;
  loop_count = 0;
  float const x_33 = x_7.injectionSwitch.x;
  float const x_35 = x_7.injectionSwitch.y;
  bool const x_36 = (x_33 > x_35);
  if (x_36) {
    return;
  }
  float const x_40 = (*(tint_symbol_5)).x;
  bool const x_41 = (x_40 < 0.0f);
  while (true) {
    int const x_43 = loop_count;
    if ((x_43 < 100)) {
    } else {
      break;
    }
    if (x_36) {
      break;
    }
    if (x_36) {
      *(tint_symbol_6) = float4(1.0f, 1.0f, 1.0f, 1.0f);
    } else {
      if (x_41) {
        return;
      }
    }
    if (x_36) {
      *(tint_symbol_6) = float4(1.0f, 1.0f, 1.0f, 1.0f);
    } else {
      *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
    }
    if (x_36) {
      return;
    }
    if (x_41) {
      while (true) {
        int const x_63 = loop_count;
        if ((x_63 < 100)) {
        } else {
          break;
        }
        {
          int const x_67 = loop_count;
          loop_count = (x_67 + 1);
        }
      }
    }
    {
      int const x_69 = loop_count;
      loop_count = (x_69 + 1);
    }
  }
  int const x_71 = loop_count;
  if ((x_71 >= 100)) {
    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_6) = float4(1.0f, 1.0f, 1.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_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

