#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float2 injectionSwitch;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

int performPartition_(constant buf0& x_6, thread float4* const tint_symbol_3) {
  int GLF_live0i = 0;
  int i = 0;
  int x_11 = 0;
  int x_10_phi = 0;
  *(tint_symbol_3) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  x_10_phi = 0;
  while (true) {
    int x_11_phi = 0;
    int const x_10 = x_10_phi;
    bool x_42 = false;
    float const x_41 = x_6.injectionSwitch.y;
    x_42 = (x_41 < 0.0f);
    if (x_42) {
      x_11_phi = x_10;
      {
        x_11 = x_11_phi;
        x_10_phi = x_11;
        if (false) {
        } else {
          break;
        }
      }
      continue;
    } else {
      GLF_live0i = 0;
      while (true) {
        bool const x_47 = (0 < 1);
        if (x_42) {
          break;
        }
        return 1;
      }
      if (x_42) {
        while (true) {
          return 1;
        }
        return 0;
      }
      x_11_phi = x_10;
      {
        x_11 = x_11_phi;
        x_10_phi = x_11;
        if (false) {
        } else {
          break;
        }
      }
      continue;
    }
    x_11_phi = 0;
    {
      x_11 = x_11_phi;
      x_10_phi = x_11;
      if (false) {
      } else {
        break;
      }
    }
  }
  return x_11;
}

void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
  int const x_9 = performPartition_(x_6, tint_symbol_4);
  return;
}

main_out tint_symbol_inner(constant buf0& x_6, thread float4* const tint_symbol_5) {
  main_1(x_6, tint_symbol_5);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_5)};
  return tint_symbol_2;
}

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

