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

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_4) {
  int const x_31 = func_(x_7);
  if ((x_31 == 1)) {
    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
  }
  return;
}

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

