#include <metal_stdlib>

using namespace metal;
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

float4 func_(thread float4* const tint_symbol_3) {
  float x = 0.0f;
  x = 1.0f;
  float const x_30 = (*(tint_symbol_3)).x;
  if ((x_30 < 0.0f)) {
    x = 0.5f;
  }
  float const x_34 = x;
  return float4(x_34, 0.0f, 0.0f, 1.0f);
}

void main_1(thread float4* const tint_symbol_4, thread float4* const tint_symbol_5) {
  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  while (true) {
    float4 const x_26 = func_(tint_symbol_5);
    *(tint_symbol_4) = x_26;
    if (false) {
    } else {
      break;
    }
  }
  return;
}

main_out tint_symbol_inner(float4 gl_FragCoord_param, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
  *(tint_symbol_6) = gl_FragCoord_param;
  main_1(tint_symbol_7, tint_symbol_6);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_7)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(float4 gl_FragCoord_param [[position]]) {
  thread float4 tint_symbol_8 = 0.0f;
  thread float4 tint_symbol_9 = 0.0f;
  main_out const inner_result = tint_symbol_inner(gl_FragCoord_param, &(tint_symbol_8), &(tint_symbol_9));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

