#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
struct tint_array_wrapper {
  float2 arr[17];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

float func_(constant buf0& x_7, thread float4* const tint_symbol_5) {
  int x = 0;
  float const x_99 = (*(tint_symbol_5)).x;
  if ((x_99 < 1.0f)) {
    return 5.0f;
  }
  float const x_104 = x_7.injectionSwitch.x;
  float const x_106 = x_7.injectionSwitch.y;
  if ((x_104 > x_106)) {
    return 1.0f;
  }
  float const x_111 = x_7.injectionSwitch.x;
  x = int(x_111);
  float const x_114 = x_7.injectionSwitch.x;
  int const x_118 = x;
  x = (x_118 + (int(clamp(x_114, 0.0f, 1.0f)) * 3));
  int const x_120 = x;
  return (5.0f + float(x_120));
}

void main_1(constant buf0& x_7, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
  int i = 0;
  int j = 0;
  tint_array_wrapper data = {};
  i = 0;
  while (true) {
    int const x_48 = i;
    float const x_50 = x_7.injectionSwitch.x;
    if ((x_48 < (4 + int(x_50)))) {
    } else {
      break;
    }
    float const x_56 = (*(tint_symbol_6)).x;
    if ((x_56 >= 0.0f)) {
      j = 0;
      while (true) {
        bool x_81 = false;
        bool x_82_phi = false;
        int const x_64 = j;
        if ((x_64 < 4)) {
        } else {
          break;
        }
        int const x_67 = j;
        int const x_69 = i;
        float const x_71 = func_(x_7, tint_symbol_6);
        data.arr[((4 * x_67) + x_69)].x = x_71;
        float const x_74 = data.arr[0].x;
        bool const x_75 = (x_74 == 5.0f);
        x_82_phi = x_75;
        if (!(x_75)) {
          float const x_80 = data.arr[15].x;
          x_81 = (x_80 == 5.0f);
          x_82_phi = x_81;
        }
        bool const x_82 = x_82_phi;
        if (x_82) {
          *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
        } else {
          *(tint_symbol_7) = float4(0.0f, 0.0f, 0.0f, 0.0f);
        }
        float const x_87 = x_7.injectionSwitch.x;
        float const x_89 = x_7.injectionSwitch.y;
        if ((x_87 > x_89)) {
          return;
        }
        {
          int const x_93 = j;
          j = (x_93 + 1);
        }
      }
    }
    {
      int const x_95 = i;
      i = (x_95 + 1);
    }
  }
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
  thread float4 tint_symbol_8 = 0.0f;
  thread float4 tint_symbol_9 = 0.0f;
  tint_symbol_8 = gl_FragCoord_param;
  main_1(x_7, &(tint_symbol_8), &(tint_symbol_9));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

