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

void main_1(constant buf0& x_9, thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  float x_43 = 0.0f;
  float x_44 = 0.0f;
  float x_45 = 0.0f;
  int x_46 = 0;
  int zero = 0;
  float2 param = 0.0f;
  float2 temp = 0.0f;
  float4 const x_47 = *(tint_symbol_3);
  param = float2(x_47.x, x_47.y);
  while (true) {
    float const x_54 = param.y;
    if ((x_54 < 50.0f)) {
      float const x_60 = x_9.injectionSwitch.y;
      x_44 = x_60;
    } else {
      x_44 = 0.0f;
    }
    float const x_61 = x_44;
    x_43 = x_61;
    float const x_63 = (*(tint_symbol_3)).y;
    float const x_65 = select(0.0f, 1.0f, (x_63 < 50.0f));
    x_45 = x_65;
    if (((x_61 - x_65) < 1.0f)) {
      x_46 = 0;
      break;
    }
    x_46 = 1;
    break;
    {
      if (false) {
      } else {
        break;
      }
    }
  }
  int const x_70 = x_46;
  zero = x_70;
  if ((x_70 == 1)) {
    return;
  }
  *(tint_symbol_4) = float4(0.0f, 1.0f, 1.0f, 1.0f);
  float const x_75 = (*(tint_symbol_3)).x;
  float const x_77 = x_9.injectionSwitch.x;
  if ((x_75 >= x_77)) {
    float const x_82 = (*(tint_symbol_3)).y;
    if ((x_82 >= 0.0f)) {
      float const x_87 = x_9.injectionSwitch.y;
      (*(tint_symbol_4)).x = x_87;
    }
  }
  float const x_90 = (*(tint_symbol_3)).y;
  if ((x_90 >= 0.0f)) {
    float const x_95 = x_9.injectionSwitch.x;
    (*(tint_symbol_4)).y = x_95;
  }
  float4 const x_97 = *(tint_symbol_3);
  float2 const x_98 = float2(x_97.x, x_97.y);
  float2 const x_101 = float2(x_98.x, x_98.y);
  temp = x_101;
  if ((x_101.y >= 0.0f)) {
    float const x_107 = x_9.injectionSwitch.x;
    (*(tint_symbol_4)).z = x_107;
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_9, float4 gl_FragCoord_param, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  *(tint_symbol_5) = gl_FragCoord_param;
  main_1(x_9, 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(float4 gl_FragCoord_param [[position]], constant buf0& x_9 [[buffer(0)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_9, gl_FragCoord_param, &(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;
}

int alwaysZero_vf2_(constant buf0& x_9, thread float2* const coord, thread float4* const tint_symbol_9) {
  float a = 0.0f;
  float x_110 = 0.0f;
  float b = 0.0f;
  float const x_112 = (*(coord)).y;
  if ((x_112 < 50.0f)) {
    float const x_118 = x_9.injectionSwitch.y;
    x_110 = x_118;
  } else {
    x_110 = 0.0f;
  }
  float const x_119 = x_110;
  a = x_119;
  float const x_121 = (*(tint_symbol_9)).y;
  float const x_123 = select(0.0f, 1.0f, (x_121 < 50.0f));
  b = x_123;
  if (((x_119 - x_123) < 1.0f)) {
    return 0;
  }
  return 1;
}

