#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
struct tint_array_wrapper {
  int arr[10];
};
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_4) {
  int k = 0;
  int GLF_dead0j = 0;
  tint_array_wrapper donor_replacementGLF_dead0stack = {};
  int donor_replacementGLF_dead0top = 0;
  int x_54 = 0;
  float4 matrix_b = 0.0f;
  int b = 0;
  k = 0;
  while (true) {
    int const x_12 = k;
    if ((x_12 < 4)) {
    } else {
      break;
    }
    float const x_62 = x_6.injectionSwitch.y;
    if ((0.0f > x_62)) {
      GLF_dead0j = 1;
      while (true) {
        int const x_13 = donor_replacementGLF_dead0stack.arr[0];
        if ((1 <= x_13)) {
        } else {
          break;
        }
      }
      int const x_14 = donor_replacementGLF_dead0top;
      int const x_15 = donor_replacementGLF_dead0top;
      if (((x_14 >= 0) && (x_15 < 9))) {
        int const x_16 = donor_replacementGLF_dead0top;
        int const x_17 = as_type<int>((as_type<uint>(x_16) + as_type<uint>(1)));
        donor_replacementGLF_dead0top = x_17;
        x_54 = x_17;
      } else {
        x_54 = 0;
      }
      int const x_18 = x_54;
      donor_replacementGLF_dead0stack.arr[x_18] = 1;
    }
    matrix_b = float4(0.0f, 0.0f, 0.0f, 0.0f);
    b = 3;
    while (true) {
      int const x_19 = b;
      if ((x_19 >= 0)) {
      } else {
        break;
      }
      int const x_20 = b;
      int const x_21 = b;
      float const x_87 = matrix_b[x_21];
      matrix_b[x_20] = (x_87 - 1.0f);
      {
        int const x_22 = b;
        b = as_type<int>((as_type<uint>(x_22) - as_type<uint>(1)));
      }
    }
    {
      int const x_24 = k;
      k = as_type<int>((as_type<uint>(x_24) + as_type<uint>(1)));
    }
  }
  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(x_6, &(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;
}

