#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_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_9, constant buf1& x_6, thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  tint_array_wrapper data = {};
  int x_40_phi = 0;
  int x_52_phi = 0;
  x_40_phi = 0;
  while (true) {
    int x_41 = 0;
    int const x_40 = x_40_phi;
    if ((x_40 < 10)) {
    } else {
      break;
    }
    {
      float const x_48 = x_9.injectionSwitch.y;
      data.arr[x_40] = (float(as_type<int>((as_type<uint>(10) - as_type<uint>(x_40)))) * x_48);
      x_41 = as_type<int>((as_type<uint>(x_40) + as_type<uint>(1)));
      x_40_phi = x_41;
    }
  }
  x_52_phi = 0;
  while (true) {
    int x_53 = 0;
    int x_59_phi = 0;
    int const x_52 = x_52_phi;
    if ((x_52 < 9)) {
    } else {
      break;
    }
    x_59_phi = 0;
    while (true) {
      bool x_82 = false;
      bool x_83 = false;
      int x_60 = 0;
      bool x_84_phi = false;
      int const x_59 = x_59_phi;
      if ((x_59 < 10)) {
      } else {
        break;
      }
      if ((x_59 < as_type<int>((as_type<uint>(x_52) + as_type<uint>(1))))) {
        {
          x_60 = as_type<int>((as_type<uint>(x_59) + as_type<uint>(1)));
          x_59_phi = x_60;
        }
        continue;
      }
      int const x_69_save = x_52;
      float const x_70 = data.arr[x_69_save];
      int const x_71_save = x_59;
      float const x_72 = data.arr[x_71_save];
      float const x_74 = (*(tint_symbol_3)).y;
      float const x_76 = x_6.resolution.y;
      if ((x_74 < (x_76 * 0.5f))) {
        x_82 = (x_70 > x_72);
        x_84_phi = x_82;
      } else {
        x_83 = (x_70 < x_72);
        x_84_phi = x_83;
      }
      bool const x_84 = x_84_phi;
      if (x_84) {
        float const x_87 = data.arr[x_69_save];
        float const x_88 = data.arr[x_71_save];
        data.arr[x_69_save] = x_88;
        data.arr[x_71_save] = x_87;
      }
      {
        x_60 = as_type<int>((as_type<uint>(x_59) + as_type<uint>(1)));
        x_59_phi = x_60;
      }
    }
    {
      x_53 = as_type<int>((as_type<uint>(x_52) + as_type<uint>(1)));
      x_52_phi = x_53;
    }
  }
  float const x_90 = (*(tint_symbol_3)).x;
  float const x_92 = x_6.resolution.x;
  if ((x_90 < (x_92 * 0.5f))) {
    float const x_99 = data.arr[0];
    float const x_102 = data.arr[5];
    float const x_105 = data.arr[9];
    *(tint_symbol_4) = float4((x_99 * 0.100000001f), (x_102 * 0.100000001f), (x_105 * 0.100000001f), 1.0f);
  } else {
    float const x_109 = data.arr[5];
    float const x_112 = data.arr[9];
    float const x_115 = data.arr[0];
    *(tint_symbol_4) = float4((x_109 * 0.100000001f), (x_112 * 0.100000001f), (x_115 * 0.100000001f), 1.0f);
  }
  return;
}

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

fragment tint_symbol_1 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;
  main_out const inner_result = tint_symbol_inner(x_9, x_6, gl_FragCoord_param, &(tint_symbol_7), &(tint_symbol_8));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

