#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) {
  tint_array_wrapper data = {};
  int x_40 = 0;
  int x_40_phi = 0;
  int x_11_phi = 0;
  int const x_7 = data.arr[1];
  int const x_10 = select(1, 2, (1 < x_7));
  x_40_phi = 1;
  x_11_phi = x_10;
  while (true) {
    int x_54 = 0;
    int x_41 = 0;
    int x_41_phi = 0;
    x_40 = x_40_phi;
    int const x_11 = x_11_phi;
    if ((x_11 < 3)) {
    } else {
      break;
    }
    int x_54_phi = 0;
    int const x_8 = (x_11 + 1);
    float const x_47 = x_6.injectionSwitch.x;
    x_54_phi = x_40;
    switch(int(x_47)) {
      case 78: {
        *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
        /* fallthrough */
      }
      case 19: {
        x_54_phi = as_type<int>((x_40 + as_type<int>(1)));
        /* fallthrough */
      }
      case 23:
      case 38: {
        x_54 = x_54_phi;
        x_41_phi = x_54;
        {
          x_41 = x_41_phi;
          x_40_phi = x_41;
          x_11_phi = x_8;
        }
        continue;
        break;
      }
      default: {
        x_41_phi = x_40;
        {
          x_41 = x_41_phi;
          x_40_phi = x_41;
          x_11_phi = x_8;
        }
        continue;
        break;
      }
    }
    x_41_phi = 0;
    {
      x_41 = x_41_phi;
      x_40_phi = x_41;
      x_11_phi = x_8;
    }
  }
  data.arr[x_40] = 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;
}

