#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ int one;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

float4 func_(constant buf0& x_6) {
  int const x_48 = x_6.one;
  if ((x_48 == 1)) {
    return float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    return float4(0.0f, 0.0f, 0.0f, 0.0f);
  }
  return float4(0.0f, 0.0f, 0.0f, 0.0f);
}

void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
  int i = 0;
  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  i = 0;
  while (true) {
    int const x_33 = i;
    int const x_35 = x_6.one;
    if ((x_33 <= x_35)) {
    } else {
      break;
    }
    int const x_38 = i;
    switch(x_38) {
      case 1: {
        float4 const x_43 = func_(x_6);
        *(tint_symbol_4) = x_43;
        /* fallthrough */
      }
      default: {
        /* fallthrough */
      }
      case 0: {
        (*(tint_symbol_4)).y = 0.0f;
        break;
      }
    }
    {
      int const x_44 = i;
      i = as_type<int>((as_type<uint>(x_44) + as_type<uint>(1)));
    }
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(x_6, &(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;
}

