#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 resolution;
};
struct tint_array_wrapper {
  float4 arr[16];
};
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_4, thread float4* const tint_symbol_5) {
  tint_array_wrapper indexable = {};
  int x_65 = 0;
  int x_65_phi = 0;
  int x_68_phi = 0;
  float4 const x_51 = *(tint_symbol_4);
  float2 const x_54 = x_6.resolution;
  float2 const x_57 = floor(((float2(x_51.x, x_51.y) / x_54) * 8.0f));
  int const x_63 = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(int(x_57.x)) * as_type<uint>(8)))) + as_type<uint>(int(x_57.y))));
  x_65_phi = 0;
  x_68_phi = x_63;
  while (true) {
    int x_79 = 0;
    int x_80 = 0;
    int x_69_phi = 0;
    x_65 = x_65_phi;
    int const x_68 = x_68_phi;
    if ((x_68 > 1)) {
    } else {
      break;
    }
    if (((x_68 & 1) == 1)) {
      x_79 = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(3) * as_type<uint>(x_68)))) + as_type<uint>(1)));
      x_69_phi = x_79;
    } else {
      x_80 = (x_68 / 2);
      x_69_phi = x_80;
    }
    int const x_69 = x_69_phi;
    {
      x_65_phi = as_type<int>(as_type<int>((as_type<uint>(x_65) + as_type<uint>(as_type<int>(1)))));
      x_68_phi = x_69;
    }
  }
  tint_array_wrapper const tint_symbol_2 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
  indexable = tint_symbol_2;
  float4 const x_83 = indexable.arr[as_type<int>((x_65 % 16))];
  *(tint_symbol_5) = x_83;
  return;
}

main_out tint_symbol_inner(constant buf0& x_6, float4 gl_FragCoord_param, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
  *(tint_symbol_6) = gl_FragCoord_param;
  main_1(x_6, tint_symbol_6, tint_symbol_7);
  main_out const tint_symbol_3 = {.x_GLF_color_1=*(tint_symbol_7)};
  return tint_symbol_3;
}

fragment tint_symbol_1 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
  thread float4 tint_symbol_8 = 0.0f;
  thread float4 tint_symbol_9 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_6, gl_FragCoord_param, &(tint_symbol_8), &(tint_symbol_9));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

