#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[3];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element_1 arr[2];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper_1 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 buf1& x_6, constant buf0& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  int2 v = 0;
  float const x_39 = (*(tint_symbol_5)).y;
  float const x_41 = x_6.x_GLF_uniform_float_values.arr[0].el;
  if ((x_39 < x_41)) {
    int const x_47 = x_8.x_GLF_uniform_int_values.arr[0].el;
    float const x_48 = float(x_47);
    *(tint_symbol_6) = float4(x_48, x_48, x_48, x_48);
  } else {
    float4 const x_50 = *(tint_symbol_5);
    float const x_53 = x_6.x_GLF_uniform_float_values.arr[1].el;
    float const x_55 = x_6.x_GLF_uniform_float_values.arr[0].el;
    float const x_59 = x_6.x_GLF_uniform_float_values.arr[2].el;
    v = int2(((float2(x_50.x, x_50.y) - float2(x_53, x_55)) * x_59));
    float const x_63 = x_6.x_GLF_uniform_float_values.arr[1].el;
    int const x_65 = v.y;
    int const x_67 = x_8.x_GLF_uniform_int_values.arr[1].el;
    int const x_70 = x_8.x_GLF_uniform_int_values.arr[1].el;
    int const x_74 = v.x;
    int const x_76 = x_8.x_GLF_uniform_int_values.arr[1].el;
    float const x_80 = x_6.x_GLF_uniform_float_values.arr[1].el;
    *(tint_symbol_6) = float4(x_63, float((as_type<int>((as_type<uint>(x_65) - as_type<uint>(x_67))) & x_70)), float((x_74 & x_76)), x_80);
  }
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_6 [[buffer(1)]], constant buf0& x_8 [[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, x_8, &(tint_symbol_7), &(tint_symbol_8));
  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;
}

