#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_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_3)).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_3)).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_4) = 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_4) = float4((x_110 * 0.100000001f), (x_113 * 0.100000001f), (x_116 * 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;
}

