#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)]];
};

int func_(constant buf0& x_7) {
  int loop_count = 0;
  int x_38_phi = 0;
  loop_count = 0;
  x_38_phi = 0;
  while (true) {
    int x_39 = 0;
    int x_45_phi = 0;
    int const x_38 = x_38_phi;
    int const x_43 = as_type<int>((as_type<uint>(x_38) + as_type<uint>(1)));
    loop_count = x_43;
    x_45_phi = x_43;
    while (true) {
      int const x_45 = x_45_phi;
      x_39 = as_type<int>((as_type<uint>(x_45) + as_type<uint>(1)));
      loop_count = x_39;
      float const x_50 = x_7.injectionSwitch.x;
      float const x_52 = x_7.injectionSwitch.y;
      if ((x_50 < x_52)) {
        return 1;
      }
      float const x_57 = x_7.injectionSwitch.x;
      float const x_59 = x_7.injectionSwitch.y;
      if ((x_57 < x_59)) {
        break;
      }
      {
        x_45_phi = x_39;
        if ((x_39 < 100)) {
        } else {
          break;
        }
      }
    }
    {
      x_38_phi = x_39;
      if ((x_39 < 100)) {
      } else {
        break;
      }
    }
  }
  return 0;
}

void main_1(constant buf0& x_7, thread float4* const tint_symbol_3) {
  int const x_31 = func_(x_7);
  if ((x_31 == 1)) {
    *(tint_symbol_3) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_3) = float4(1.0f, 1.0f, 1.0f, 1.0f);
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_7, thread float4* const tint_symbol_4) {
  main_1(x_7, 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_7 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_7, &(tint_symbol_5));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

