#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[3];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  int i = 0;
  int const x_31 = x_6.x_GLF_uniform_int_values.arr[0].el;
  int const x_34 = x_6.x_GLF_uniform_int_values.arr[1].el;
  int const x_37 = x_6.x_GLF_uniform_int_values.arr[1].el;
  int const x_40 = x_6.x_GLF_uniform_int_values.arr[0].el;
  *(tint_symbol_5) = float4(float(x_31), float(x_34), float(x_37), float(x_40));
  float const x_44 = (*(tint_symbol_6)).y;
  if ((x_44 < 0.0f)) {
    int const x_49 = x_6.x_GLF_uniform_int_values.arr[1].el;
    float const x_50 = float(x_49);
    *(tint_symbol_5) = float4(x_50, x_50, x_50, x_50);
  }
  int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
  i = x_53;
  while (true) {
    int const x_58 = i;
    int const x_60 = x_6.x_GLF_uniform_int_values.arr[2].el;
    if ((x_58 < x_60)) {
    } else {
      break;
    }
    float const x_64 = (*(tint_symbol_6)).x;
    if ((x_64 > 0.0f)) {
      float const x_69 = (*(tint_symbol_6)).y;
      if ((x_69 < 0.0f)) {
        int const x_74 = x_6.x_GLF_uniform_int_values.arr[1].el;
        float const x_75 = float(x_74);
        *(tint_symbol_5) = float4(x_75, x_75, x_75, x_75);
        break;
      }
    }
    float const x_78 = (*(tint_symbol_6)).x;
    if ((x_78 > 0.0f)) {
      float const x_83 = (*(tint_symbol_6)).y;
      if ((x_83 < 0.0f)) {
        int const x_88 = x_6.x_GLF_uniform_int_values.arr[1].el;
        float const x_89 = float(x_88);
        *(tint_symbol_5) = float4(x_89, x_89, x_89, x_89);
      }
    }
    {
      int const x_91 = i;
      i = (x_91 + 1);
    }
  }
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_6, &(tint_symbol_8), &(tint_symbol_7));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

