#include <metal_stdlib>

using namespace metal;
struct tint_array_wrapper {
  int arr[2];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(thread float4* const tint_symbol_5) {
  int a = 0;
  int b = 0;
  int i = 0;
  int i_1 = 0;
  int i_2 = 0;
  tint_array_wrapper indexable = {};
  a = 0;
  b = 1;
  *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  i = 0;
  while (true) {
    int const x_38 = i;
    if ((x_38 < 10)) {
    } else {
      break;
    }
    int const x_41 = i;
    if ((x_41 > 1)) {
      int const x_45 = a;
      a = (x_45 + 1);
      if (false) {
        i_1 = 0;
        while (true) {
          int const x_53 = i_1;
          if ((x_53 < 10)) {
          } else {
            break;
          }
          return;
        }
      }
    }
    {
      int const x_56 = i;
      i = (x_56 + 1);
    }
  }
  i_2 = 0;
  while (true) {
    int const x_62 = i_2;
    if ((x_62 < 10)) {
    } else {
      break;
    }
    int const x_65 = b;
    tint_array_wrapper const tint_symbol_3 = {.arr={1, 2}};
    indexable = tint_symbol_3;
    int const x_67 = indexable.arr[x_65];
    int const x_68 = a;
    a = (x_68 + x_67);
    {
      int const x_70 = i_2;
      i_2 = (x_70 + 1);
    }
  }
  int const x_72 = a;
  if ((x_72 == 28)) {
    *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  }
  return;
}

fragment tint_symbol_1 tint_symbol() {
  thread float4 tint_symbol_6 = 0.0f;
  main_1(&(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;
}

