#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_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 int* const tint_symbol_4, thread float4* const tint_symbol_5) {
  int a = 0;
  *(tint_symbol_4) = 0;
  while (true) {
    int const x_8 = *(tint_symbol_4);
    float const x_46 = x_6.injectionSwitch.x;
    if ((x_8 < int((x_46 + 2.0f)))) {
    } else {
      break;
    }
    int const x_9 = *(tint_symbol_4);
    *(tint_symbol_4) = as_type<int>((as_type<uint>(x_9) + as_type<uint>(1)));
  }
  int const x_11 = *(tint_symbol_4);
  a = x_11;
  while (true) {
    int const x_12 = *(tint_symbol_4);
    float const x_56 = x_6.injectionSwitch.y;
    if ((x_12 < int(x_56))) {
    } else {
      break;
    }
    int const x_13 = *(tint_symbol_4);
    *(tint_symbol_4) = as_type<int>((as_type<uint>(x_13) + as_type<uint>(1)));
  }
  int const x_15 = a;
  a = x_15;
  int const x_16 = a;
  if ((x_16 == 2)) {
    *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
  thread int tint_symbol_6 = 0;
  thread float4 tint_symbol_7 = 0.0f;
  main_1(x_6, &(tint_symbol_6), &(tint_symbol_7));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_3;
}

