#include <metal_stdlib>

using namespace metal;

int tint_unary_minus(const int v) {
  return select(-v, v, v == -2147483648);
}

struct buf0 {
  /* 0x0000 */ packed_float2 resolution;
};
struct tint_array_wrapper {
  float4 arr[16];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_6, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
  tint_array_wrapper indexable = {};
  int2 x_77 = 0;
  int2 x_110 = 0;
  int x_116 = 0;
  int2 x_77_phi = 0;
  int x_80_phi = 0;
  int2 x_111_phi = 0;
  int2 x_113_phi = 0;
  float4 const x_56 = *(tint_symbol_6);
  float2 const x_59 = x_6.resolution;
  float2 const x_60 = (float2(x_56.x, x_56.y) / x_59);
  int const x_63 = int((x_60.x * 8.0f));
  int const x_66 = int((x_60.y * 8.0f));
  int2 const x_75 = int2(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(((x_63 & 5) | (x_66 & 10))) * as_type<uint>(8)))) + as_type<uint>(((x_66 & 5) | (x_63 & 10))))), 0);
  x_77_phi = x_75;
  x_80_phi = 0;
  while (true) {
    int2 x_91 = 0;
    int2 x_99 = 0;
    int x_81 = 0;
    int2 x_92_phi = 0;
    int2 x_100_phi = 0;
    x_77 = x_77_phi;
    int const x_80 = x_80_phi;
    if ((x_80 < 100)) {
    } else {
      break;
    }
    x_92_phi = x_77;
    if ((x_77.x > 0)) {
      x_91 = x_77;
      x_91.y = as_type<int>((as_type<uint>(x_77.y) - as_type<uint>(1)));
      x_92_phi = x_91;
    }
    int2 const x_92 = x_92_phi;
    x_100_phi = x_92;
    if ((x_92.x < 0)) {
      x_99 = x_92;
      x_99.y = as_type<int>((as_type<uint>(x_92.y) + as_type<uint>(1)));
      x_100_phi = x_99;
    }
    int2 const x_100 = x_100_phi;
    int2 x_78_1 = x_100;
    x_78_1.x = as_type<int>((as_type<uint>(x_100.x) + as_type<uint>((x_100.y / 2))));
    int2 const x_78 = x_78_1;
    {
      x_81 = as_type<int>((as_type<uint>(x_80) + as_type<uint>(1)));
      x_77_phi = x_78;
      x_80_phi = x_81;
    }
  }
  int const x_105 = x_77.x;
  x_111_phi = x_77;
  if ((x_105 < 0)) {
    x_110 = int2(0, 0);
    x_110.x = tint_unary_minus(x_105);
    x_111_phi = x_110;
  }
  int2 const x_111 = x_111_phi;
  x_113_phi = x_111;
  while (true) {
    int2 x_114 = 0;
    int2 const x_113 = x_113_phi;
    x_116 = x_113.x;
    if ((x_116 > 15)) {
    } else {
      break;
    }
    {
      x_114 = int2(0, 0);
      x_114.x = as_type<int>(as_type<int>((as_type<uint>(x_116) - as_type<uint>(as_type<int>(16)))));
      x_113_phi = x_114;
    }
  }
  tint_array_wrapper const tint_symbol_4 = {.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_4;
  float4 const x_121 = indexable.arr[x_116];
  *(tint_symbol_7) = x_121;
  return;
}

fragment tint_symbol_2 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;
  tint_symbol_8 = gl_FragCoord_param;
  main_1(x_6, &(tint_symbol_8), &(tint_symbol_9));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_5;
}

