#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ int one;
};
struct tint_array_wrapper {
  int arr[3];
};
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_8, thread float4* const tint_symbol_4) {
  tint_array_wrapper a = {};
  int b = 0;
  int c = 0;
  a.arr[0] = 1;
  a.arr[1] = 2;
  a.arr[2] = 3;
  b = 0;
  int const x_38 = x_8.one;
  int const x_40 = a.arr[x_38];
  c = x_40;
  int const x_41 = c;
  if ((x_41 > 1)) {
    *(tint_symbol_4) = float4(0.0f, 1.0f, 1.0f, 0.0f);
    int const x_45 = b;
    b = as_type<int>((as_type<uint>(x_45) + as_type<uint>(1)));
  }
  int const x_47 = b;
  int const x_48 = as_type<int>((as_type<uint>(x_47) + as_type<uint>(1)));
  b = x_48;
  int const x_50_save = clamp(x_48, 0, 2);
  int const x_51 = a.arr[x_50_save];
  a.arr[x_50_save] = as_type<int>((as_type<uint>(x_51) + as_type<uint>(1)));
  int const x_54 = a.arr[2];
  if ((x_54 == 4)) {
    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  }
  return;
}

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

