#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 int* const tint_symbol_3, thread float4* const tint_symbol_4) {
  int a = 0;
  *(tint_symbol_3) = 0;
  while (true) {
    int const x_8 = *(tint_symbol_3);
    float const x_46 = x_6.injectionSwitch.x;
    if ((x_8 < int((x_46 + 2.0f)))) {
    } else {
      break;
    }
    int const x_9 = *(tint_symbol_3);
    *(tint_symbol_3) = as_type<int>((as_type<uint>(x_9) + as_type<uint>(1)));
  }
  int const x_11 = *(tint_symbol_3);
  a = x_11;
  while (true) {
    int const x_12 = *(tint_symbol_3);
    float const x_56 = x_6.injectionSwitch.y;
    if ((x_12 < int(x_56))) {
    } else {
      break;
    }
    int const x_13 = *(tint_symbol_3);
    *(tint_symbol_3) = 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_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  }
  return;
}

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

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

