#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[4];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
};
struct tint_array_wrapper_1 {
  int arr[2];
};
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_6, thread float4* const tint_symbol_5) {
  int i = 0;
  tint_array_wrapper_1 a = {};
  int const x_32 = x_6.x_GLF_uniform_int_values.arr[2].el;
  i = x_32;
  while (true) {
    int const x_37 = i;
    int const x_39 = x_6.x_GLF_uniform_int_values.arr[0].el;
    if ((x_37 < x_39)) {
    } else {
      break;
    }
    int const x_43 = x_6.x_GLF_uniform_int_values.arr[1].el;
    int const x_44 = i;
    int const x_46 = x_6.x_GLF_uniform_int_values.arr[3].el;
    tint_array_wrapper_1 const tint_symbol_3 = {.arr={x_43, ((int2(x_44, x_44) % int2(3, x_46))).y}};
    a = tint_symbol_3;
    {
      int const x_52 = i;
      i = (x_52 + 1);
    }
  }
  int const x_55 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_57 = a.arr[x_55];
  int const x_60 = x_6.x_GLF_uniform_int_values.arr[1].el;
  int const x_63 = x_6.x_GLF_uniform_int_values.arr[1].el;
  int const x_66 = x_6.x_GLF_uniform_int_values.arr[2].el;
  int const x_68 = a.arr[x_66];
  *(tint_symbol_5) = float4(float(x_57), float(x_60), float(x_63), float(x_68));
  return;
}

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

