#include <metal_stdlib>

using namespace metal;
struct tint_array_wrapper {
  int arr[9];
};
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 func_i1_(thread int* const x, thread float4* const tint_symbol_3) {
  int a = 0;
  tint_array_wrapper data = {};
  tint_array_wrapper_1 temp = {};
  int i = 0;
  bool x_95 = false;
  bool x_96_phi = false;
  a = 0;
  data.arr[0] = 5;
  while (true) {
    int const x_56 = a;
    int const x_57 = *(x);
    if ((x_56 <= x_57)) {
    } else {
      break;
    }
    int const x_60 = a;
    if ((x_60 <= 10)) {
      int const x_64 = a;
      int const x_66 = a;
      int const x_69 = data.arr[min(x_66, 0)];
      temp.arr[min(x_64, 1)] = x_69;
      int const x_71 = a;
      a = as_type<int>((as_type<uint>(x_71) + as_type<uint>(1)));
    }
  }
  i = 0;
  while (true) {
    int const x_77 = i;
    if ((x_77 < 2)) {
    } else {
      break;
    }
    int const x_80 = i;
    int const x_82 = temp.arr[0];
    int const x_83 = i;
    data.arr[x_80] = as_type<int>((as_type<uint>(x_82) + as_type<uint>(x_83)));
    {
      int const x_86 = i;
      i = as_type<int>((as_type<uint>(x_86) + as_type<uint>(1)));
    }
  }
  int const x_89 = data.arr[0];
  bool const x_90 = (x_89 == 5);
  x_96_phi = x_90;
  if (x_90) {
    int const x_94 = data.arr[1];
    x_95 = (x_94 == 6);
    x_96_phi = x_95;
  }
  bool const x_96 = x_96_phi;
  if (x_96) {
    *(tint_symbol_3) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_3) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  }
  return;
}

void main_1(thread float4* const tint_symbol_4) {
  int i_1 = 0;
  int param = 0;
  i_1 = 1;
  while (true) {
    int const x_43 = i_1;
    if ((x_43 < 6)) {
    } else {
      break;
    }
    int const x_46 = i_1;
    param = x_46;
    func_i1_(&(param), tint_symbol_4);
    {
      int const x_48 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_48) + as_type<uint>(1)));
    }
  }
  return;
}

main_out tint_symbol_inner(thread float4* const tint_symbol_5) {
  main_1(tint_symbol_5);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_5)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol() {
  thread float4 tint_symbol_6 = 0.0f;
  main_out const inner_result = tint_symbol_inner(&(tint_symbol_6));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

