#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ 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)]];
};

int GLF_live6search_(thread tint_array_wrapper* const tint_symbol_3) {
  int GLF_live6index = 0;
  int GLF_live6currentNode = 0;
  GLF_live6index = 0;
  while (true) {
    if (true) {
    } else {
      break;
    }
    int const x_10 = GLF_live6index;
    int const x_11 = (*(tint_symbol_3)).arr[x_10];
    GLF_live6currentNode = x_11;
    int const x_12 = GLF_live6currentNode;
    if ((x_12 != 1)) {
      return 1;
    }
    GLF_live6index = 1;
  }
  return 1;
}

void main_1(constant buf0& x_9, thread tint_array_wrapper* const tint_symbol_4, thread float4* const tint_symbol_5) {
  float const x_40 = x_9.injectionSwitch.x;
  if ((x_40 > 1.0f)) {
    int const x_13 = GLF_live6search_(tint_symbol_4);
  }
  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  return;
}

main_out tint_symbol_inner(constant buf0& x_9, thread tint_array_wrapper* const tint_symbol_6, thread float4* const tint_symbol_7) {
  main_1(x_9, tint_symbol_6, tint_symbol_7);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_7)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_9 [[buffer(0)]]) {
  thread tint_array_wrapper tint_symbol_8 = {};
  thread float4 tint_symbol_9 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_9, &(tint_symbol_8), &(tint_symbol_9));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

