#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[6];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
};
struct tint_array_wrapper_1 {
  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_6, thread float4* const tint_symbol_5) {
  tint_array_wrapper_1 arr = {};
  int index = 0;
  bool x_76 = false;
  bool x_86 = false;
  bool x_77_phi = false;
  bool x_87_phi = false;
  int const x_33 = x_6.x_GLF_uniform_int_values.arr[3].el;
  int const x_35 = x_6.x_GLF_uniform_int_values.arr[5].el;
  int const x_37 = x_6.x_GLF_uniform_int_values.arr[2].el;
  tint_array_wrapper_1 const tint_symbol_3 = {.arr={x_33, x_35, x_37}};
  arr = tint_symbol_3;
  index = 1;
  while (true) {
    bool x_51 = false;
    bool x_52_phi = false;
    x_52_phi = true;
    if (true) {
      int const x_46 = x_6.x_GLF_uniform_int_values.arr[0].el;
      int const x_48 = index;
      x_51 = !(((x_46 == 1) && (x_48 <= 1)));
      x_52_phi = x_51;
    }
    bool const x_52 = x_52_phi;
    if (!(x_52)) {
    } else {
      break;
    }
    int const x_55 = index;
    int const x_56_save = x_55;
    int const x_57 = arr.arr[x_56_save];
    arr.arr[x_56_save] = as_type<int>((as_type<uint>(x_57) + as_type<uint>(1)));
    int const x_59 = index;
    index = as_type<int>((as_type<uint>(x_59) + as_type<uint>(1)));
  }
  int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
  int const x_64 = arr.arr[x_62];
  int const x_66 = x_6.x_GLF_uniform_int_values.arr[3].el;
  bool const x_67 = (x_64 == x_66);
  x_77_phi = x_67;
  if (x_67) {
    int const x_71 = x_6.x_GLF_uniform_int_values.arr[0].el;
    int const x_73 = arr.arr[x_71];
    int const x_75 = x_6.x_GLF_uniform_int_values.arr[4].el;
    x_76 = (x_73 == x_75);
    x_77_phi = x_76;
  }
  bool const x_77 = x_77_phi;
  x_87_phi = x_77;
  if (x_77) {
    int const x_81 = x_6.x_GLF_uniform_int_values.arr[3].el;
    int const x_83 = arr.arr[x_81];
    int const x_85 = x_6.x_GLF_uniform_int_values.arr[2].el;
    x_86 = (x_83 == x_85);
    x_87_phi = x_86;
  }
  bool const x_87 = x_87_phi;
  if (x_87) {
    int const x_92 = x_6.x_GLF_uniform_int_values.arr[0].el;
    int const x_95 = x_6.x_GLF_uniform_int_values.arr[1].el;
    int const x_98 = x_6.x_GLF_uniform_int_values.arr[1].el;
    int const x_101 = x_6.x_GLF_uniform_int_values.arr[0].el;
    *(tint_symbol_5) = float4(float(x_92), float(x_95), float(x_98), float(x_101));
  } else {
    int const x_105 = x_6.x_GLF_uniform_int_values.arr[1].el;
    float const x_106 = float(x_105);
    *(tint_symbol_5) = float4(x_106, x_106, x_106, x_106);
  }
  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;
}

