#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[2];
};
struct buf2 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element_1 arr[1];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
};
struct tint_padded_array_element_2 {
  /* 0x0000 */ uint el;
  /* 0x0004 */ int8_t tint_pad_2[12];
};
struct tint_array_wrapper_2 {
  /* 0x0000 */ tint_padded_array_element_2 arr[1];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper_2 x_GLF_uniform_uint_values;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf2& x_8, constant buf0& x_10, constant buf1& x_12, thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  uint a = 0u;
  int b = 0;
  a = 0u;
  int const x_41 = x_8.x_GLF_uniform_int_values.arr[1].el;
  b = x_41;
  float const x_43 = (*(tint_symbol_3)).x;
  float const x_45 = x_10.x_GLF_uniform_float_values.arr[0].el;
  if ((x_43 < x_45)) {
    uint const x_50 = x_12.x_GLF_uniform_uint_values.arr[0].el;
    uint const x_51 = a;
    b = as_type<int>((x_50 % x_51));
  }
  int const x_54 = b;
  int const x_56 = x_8.x_GLF_uniform_int_values.arr[1].el;
  if ((x_54 == x_56)) {
    int const x_62 = x_8.x_GLF_uniform_int_values.arr[1].el;
    int const x_65 = x_8.x_GLF_uniform_int_values.arr[0].el;
    int const x_68 = x_8.x_GLF_uniform_int_values.arr[0].el;
    int const x_71 = x_8.x_GLF_uniform_int_values.arr[1].el;
    *(tint_symbol_4) = float4(float(x_62), float(x_65), float(x_68), float(x_71));
  } else {
    int const x_75 = x_8.x_GLF_uniform_int_values.arr[0].el;
    float const x_76 = float(x_75);
    *(tint_symbol_4) = float4(x_76, x_76, x_76, x_76);
  }
  return;
}

main_out tint_symbol_inner(constant buf2& x_8, constant buf0& x_10, constant buf1& x_12, 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_8, x_10, x_12, 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 buf2& x_8 [[buffer(0)]], constant buf0& x_10 [[buffer(1)]], constant buf1& x_12 [[buffer(2)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_8, x_10, x_12, 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;
}

