#include <metal_stdlib>

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

void main_1(constant buf0& x_9, constant buf1& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  tint_array_wrapper data = {};
  int x_41_phi = 0;
  int x_53_phi = 0;
  x_41_phi = 0;
  while (true) {
    int x_42 = 0;
    int const x_41 = x_41_phi;
    if ((x_41 < 10)) {
    } else {
      break;
    }
    {
      float const x_49 = x_9.injectionSwitch.y;
      data.arr[x_41] = (float(as_type<int>((as_type<uint>(10) - as_type<uint>(x_41)))) * x_49);
      x_42 = as_type<int>((as_type<uint>(x_41) + as_type<uint>(1)));
      x_41_phi = x_42;
    }
  }
  x_53_phi = 0;
  while (true) {
    int x_54 = 0;
    int x_60_phi = 0;
    int const x_53 = x_53_phi;
    if ((x_53 < 9)) {
    } else {
      break;
    }
    x_60_phi = 0;
    while (true) {
      bool x_83 = false;
      bool x_84 = false;
      int x_61 = 0;
      bool x_85_phi = false;
      int const x_60 = x_60_phi;
      if ((x_60 < 10)) {
      } else {
        break;
      }
      if ((x_60 < as_type<int>((as_type<uint>(x_53) + as_type<uint>(1))))) {
        {
          x_61 = as_type<int>((as_type<uint>(x_60) + as_type<uint>(1)));
          x_60_phi = x_61;
        }
        continue;
      }
      int const x_70_save = x_53;
      float const x_71 = data.arr[x_70_save];
      int const x_72_save = x_60;
      float const x_73 = data.arr[x_72_save];
      float const x_75 = (*(tint_symbol_5)).y;
      float const x_77 = x_6.resolution.y;
      if ((x_75 < (x_77 * 0.5f))) {
        x_83 = (x_71 > x_73);
        x_85_phi = x_83;
      } else {
        x_84 = (x_71 < x_73);
        x_85_phi = x_84;
      }
      bool const x_85 = x_85_phi;
      if (x_85) {
        float const x_88 = data.arr[x_70_save];
        float const x_89 = data.arr[x_72_save];
        data.arr[x_70_save] = x_89;
        data.arr[x_72_save] = x_88;
      }
      {
        x_61 = as_type<int>((as_type<uint>(x_60) + as_type<uint>(1)));
        x_60_phi = x_61;
      }
    }
    {
      x_54 = as_type<int>((as_type<uint>(x_53) + as_type<uint>(1)));
      x_53_phi = x_54;
    }
  }
  float const x_91 = (*(tint_symbol_5)).x;
  float const x_93 = x_6.resolution.x;
  if ((x_91 < (x_93 * 0.5f))) {
    float const x_100 = data.arr[0];
    float const x_103 = data.arr[5];
    float const x_106 = data.arr[9];
    *(tint_symbol_6) = float4((x_100 * 0.100000001f), (x_103 * 0.100000001f), (x_106 * 0.100000001f), 1.0f);
  } else {
    float const x_110 = data.arr[5];
    float const x_113 = data.arr[9];
    float const x_116 = data.arr[0];
    *(tint_symbol_6) = float4((x_110 * 0.100000001f), (x_113 * 0.100000001f), (x_116 * 0.100000001f), 1.0f);
  }
  return;
}

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

