#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[2];
};
struct buf0 {
  /* 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 buf1 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
};
struct tint_array_wrapper_2 {
  float2 arr[3];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

float2 func_(constant buf0& x_7) {
  float2 v = 0.0f;
  int a = 0;
  tint_array_wrapper_2 indexable = {};
  float const x_67 = x_7.x_GLF_uniform_float_values.arr[0].el;
  v.y = x_67;
  a = 2;
  float const x_70 = x_7.x_GLF_uniform_float_values.arr[1].el;
  float const x_73 = x_7.x_GLF_uniform_float_values.arr[1].el;
  float2 const x_75 = v;
  int const x_77 = a;
  tint_array_wrapper_2 const tint_symbol_2 = {.arr={float2(x_70, x_70), float2(x_73, x_73), x_75}};
  indexable = tint_symbol_2;
  float2 const x_79 = indexable.arr[x_77];
  return x_79;
}

void main_1(constant buf0& x_7, constant buf1& x_11, thread float4* const tint_symbol_4) {
  float2 const x_40 = func_(x_7);
  float const x_43 = x_7.x_GLF_uniform_float_values.arr[0].el;
  if ((x_40.y == x_43)) {
    int const x_49 = x_11.x_GLF_uniform_int_values.arr[0].el;
    int const x_52 = x_11.x_GLF_uniform_int_values.arr[1].el;
    int const x_55 = x_11.x_GLF_uniform_int_values.arr[1].el;
    int const x_58 = x_11.x_GLF_uniform_int_values.arr[0].el;
    *(tint_symbol_4) = float4(float(x_49), float(x_52), float(x_55), float(x_58));
  } else {
    int const x_62 = x_11.x_GLF_uniform_int_values.arr[1].el;
    float const x_63 = float(x_62);
    *(tint_symbol_4) = float4(x_63, x_63, x_63, x_63);
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_7, constant buf1& x_11, thread float4* const tint_symbol_5) {
  main_1(x_7, x_11, tint_symbol_5);
  main_out const tint_symbol_3 = {.x_GLF_color_1=*(tint_symbol_5)};
  return tint_symbol_3;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]], constant buf1& x_11 [[buffer(1)]]) {
  thread float4 tint_symbol_6 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_7, x_11, &(tint_symbol_6));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

