#include <metal_stdlib>

using namespace metal;
struct BST {
  int data;
  int leftIndex;
  int rightIndex;
};
struct tint_array_wrapper {
  int arr[10];
};
struct QuicksortObject {
  tint_array_wrapper numbers;
};
struct buf0 {
  /* 0x0000 */ float2 injectionSwitch;
};
struct tint_array_wrapper_1 {
  BST arr[10];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void makeTreeNode_struct_BST_i1_i1_i11_i1_(thread BST* const node, thread int* const data) {
  int const x_208 = *(data);
  (*(node)).data = x_208;
  (*(node)).leftIndex = -1;
  (*(node)).rightIndex = -1;
  return;
}

void insert_i1_i1_(thread int* const treeIndex, thread int* const data_1, thread tint_array_wrapper_1* const tint_symbol_3) {
  int baseIndex = 0;
  BST param = {};
  int param_1 = 0;
  BST param_2 = {};
  int param_3 = 0;
  baseIndex = 0;
  while (true) {
    int const x_217 = baseIndex;
    int const x_218 = *(treeIndex);
    if ((x_217 <= x_218)) {
    } else {
      break;
    }
    int const x_221 = *(data_1);
    int const x_222 = baseIndex;
    int const x_224 = (*(tint_symbol_3)).arr[x_222].data;
    if ((x_221 <= x_224)) {
      int const x_229 = baseIndex;
      int const x_231 = (*(tint_symbol_3)).arr[x_229].leftIndex;
      if ((x_231 == -1)) {
        int const x_236 = baseIndex;
        int const x_237 = *(treeIndex);
        (*(tint_symbol_3)).arr[x_236].leftIndex = x_237;
        int const x_239 = *(treeIndex);
        BST const x_241 = (*(tint_symbol_3)).arr[x_239];
        param = x_241;
        int const x_242 = *(data_1);
        param_1 = x_242;
        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
        BST const x_244 = param;
        (*(tint_symbol_3)).arr[x_239] = x_244;
        return;
      } else {
        int const x_246 = baseIndex;
        int const x_248 = (*(tint_symbol_3)).arr[x_246].leftIndex;
        baseIndex = x_248;
        continue;
      }
      return;
    } else {
      int const x_249 = baseIndex;
      int const x_251 = (*(tint_symbol_3)).arr[x_249].rightIndex;
      if ((x_251 == -1)) {
        int const x_256 = baseIndex;
        int const x_257 = *(treeIndex);
        (*(tint_symbol_3)).arr[x_256].rightIndex = x_257;
        int const x_259 = *(treeIndex);
        BST const x_261 = (*(tint_symbol_3)).arr[x_259];
        param_2 = x_261;
        int const x_262 = *(data_1);
        param_3 = x_262;
        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
        BST const x_264 = param_2;
        (*(tint_symbol_3)).arr[x_259] = x_264;
        return;
      } else {
        int const x_266 = baseIndex;
        int const x_268 = (*(tint_symbol_3)).arr[x_266].rightIndex;
        baseIndex = x_268;
        continue;
      }
      return;
    }
    return;
  }
  return;
}

int identity_i1_(thread int* const a, thread QuicksortObject* const tint_symbol_4) {
  int const x_202 = *(a);
  int const x_203 = *(a);
  (*(tint_symbol_4)).numbers.arr[x_202] = x_203;
  int const x_206 = (*(tint_symbol_4)).numbers.arr[2];
  return x_206;
}

int search_i1_(thread int* const target, thread tint_array_wrapper_1* const tint_symbol_5) {
  int index = 0;
  BST currentNode = {};
  int x_270 = 0;
  index = 0;
  while (true) {
    int const x_275 = index;
    if ((x_275 != -1)) {
    } else {
      break;
    }
    int const x_278 = index;
    BST const x_280 = (*(tint_symbol_5)).arr[x_278];
    currentNode = x_280;
    int const x_282 = currentNode.data;
    int const x_283 = *(target);
    if ((x_282 == x_283)) {
      int const x_287 = *(target);
      return x_287;
    }
    int const x_288 = *(target);
    int const x_290 = currentNode.data;
    if ((x_288 > x_290)) {
      int const x_296 = currentNode.rightIndex;
      x_270 = x_296;
    } else {
      int const x_298 = currentNode.leftIndex;
      x_270 = x_298;
    }
    int const x_299 = x_270;
    index = x_299;
  }
  return -1;
}

void main_1(constant buf0& x_50, thread tint_array_wrapper_1* const tint_symbol_6, thread QuicksortObject* const tint_symbol_7, thread float4* const tint_symbol_8) {
  int treeIndex_1 = 0;
  BST param_4 = {};
  int param_5 = 0;
  int param_6 = 0;
  int param_7 = 0;
  int param_8 = 0;
  int param_9 = 0;
  int param_10 = 0;
  int param_11 = 0;
  int param_12 = 0;
  int param_13 = 0;
  int param_14 = 0;
  int param_15 = 0;
  int param_16 = 0;
  int param_17 = 0;
  int param_18 = 0;
  int param_19 = 0;
  int param_20 = 0;
  int param_21 = 0;
  int param_22 = 0;
  int param_23 = 0;
  int pp = 0;
  int looplimiter0 = 0;
  int i = 0;
  int param_24 = 0;
  int count = 0;
  int i_1 = 0;
  int result = 0;
  int param_25 = 0;
  treeIndex_1 = 0;
  BST const x_101 = (*(tint_symbol_6)).arr[0];
  param_4 = x_101;
  param_5 = 9;
  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
  BST const x_103 = param_4;
  (*(tint_symbol_6)).arr[0] = x_103;
  int const x_105 = treeIndex_1;
  treeIndex_1 = as_type<int>((as_type<uint>(x_105) + as_type<uint>(1)));
  int const x_107 = treeIndex_1;
  param_6 = x_107;
  param_7 = 5;
  insert_i1_i1_(&(param_6), &(param_7), tint_symbol_6);
  int const x_109 = treeIndex_1;
  treeIndex_1 = as_type<int>((as_type<uint>(x_109) + as_type<uint>(1)));
  int const x_111 = treeIndex_1;
  param_8 = x_111;
  param_9 = 12;
  insert_i1_i1_(&(param_8), &(param_9), tint_symbol_6);
  int const x_113 = treeIndex_1;
  treeIndex_1 = as_type<int>((as_type<uint>(x_113) + as_type<uint>(1)));
  int const x_115 = treeIndex_1;
  param_10 = x_115;
  param_11 = 15;
  insert_i1_i1_(&(param_10), &(param_11), tint_symbol_6);
  int const x_117 = treeIndex_1;
  treeIndex_1 = as_type<int>((as_type<uint>(x_117) + as_type<uint>(1)));
  int const x_119 = treeIndex_1;
  param_12 = x_119;
  param_13 = 7;
  insert_i1_i1_(&(param_12), &(param_13), tint_symbol_6);
  int const x_121 = treeIndex_1;
  treeIndex_1 = as_type<int>((as_type<uint>(x_121) + as_type<uint>(1)));
  int const x_123 = treeIndex_1;
  param_14 = x_123;
  param_15 = 8;
  insert_i1_i1_(&(param_14), &(param_15), tint_symbol_6);
  int const x_125 = treeIndex_1;
  treeIndex_1 = as_type<int>((as_type<uint>(x_125) + as_type<uint>(1)));
  int const x_127 = treeIndex_1;
  param_16 = x_127;
  param_17 = 2;
  insert_i1_i1_(&(param_16), &(param_17), tint_symbol_6);
  int const x_129 = treeIndex_1;
  treeIndex_1 = as_type<int>((as_type<uint>(x_129) + as_type<uint>(1)));
  int const x_131 = treeIndex_1;
  param_18 = x_131;
  param_19 = 6;
  insert_i1_i1_(&(param_18), &(param_19), tint_symbol_6);
  int const x_133 = treeIndex_1;
  treeIndex_1 = as_type<int>((as_type<uint>(x_133) + as_type<uint>(1)));
  int const x_135 = treeIndex_1;
  param_20 = x_135;
  param_21 = 17;
  insert_i1_i1_(&(param_20), &(param_21), tint_symbol_6);
  int const x_137 = treeIndex_1;
  treeIndex_1 = as_type<int>((as_type<uint>(x_137) + as_type<uint>(1)));
  int const x_139 = treeIndex_1;
  param_22 = x_139;
  param_23 = 13;
  insert_i1_i1_(&(param_22), &(param_23), tint_symbol_6);
  pp = 0;
  looplimiter0 = 0;
  i = 0;
  while (true) {
    int const x_145 = i;
    if ((x_145 < 10000)) {
    } else {
      break;
    }
    int const x_148 = looplimiter0;
    float const x_150 = x_50.injectionSwitch.y;
    if ((x_148 >= int(x_150))) {
      float const x_156 = x_50.injectionSwitch.y;
      param_24 = as_type<int>((as_type<uint>(1) + as_type<uint>(int(x_156))));
      int const x_159 = identity_i1_(&(param_24), tint_symbol_7);
      pp = x_159;
      break;
    }
    int const x_160 = looplimiter0;
    looplimiter0 = as_type<int>((as_type<uint>(x_160) + as_type<uint>(1)));
    {
      int const x_162 = i;
      i = as_type<int>((as_type<uint>(x_162) + as_type<uint>(1)));
    }
  }
  int const x_164 = pp;
  if ((x_164 != 2)) {
    return;
  }
  count = 0;
  i_1 = 0;
  while (true) {
    int const x_172 = i_1;
    if ((x_172 < 20)) {
    } else {
      break;
    }
    int const x_175 = i_1;
    param_25 = x_175;
    int const x_176 = search_i1_(&(param_25), tint_symbol_6);
    result = x_176;
    int const x_177 = i_1;
    switch(x_177) {
      case 2:
      case 5:
      case 6:
      case 7:
      case 8:
      case 9:
      case 12:
      case 13:
      case 15:
      case 17: {
        int const x_187 = result;
        int const x_188 = i_1;
        if ((x_187 == x_188)) {
          int const x_192 = count;
          count = as_type<int>((as_type<uint>(x_192) + as_type<uint>(1)));
        }
        break;
      }
      default: {
        int const x_181 = result;
        if ((x_181 == -1)) {
          int const x_185 = count;
          count = as_type<int>((as_type<uint>(x_185) + as_type<uint>(1)));
        }
        break;
      }
    }
    {
      int const x_194 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_194) + as_type<uint>(1)));
    }
  }
  int const x_196 = count;
  if ((x_196 == 20)) {
    *(tint_symbol_8) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_8) = float4(0.0f, 0.0f, 1.0f, 1.0f);
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_50, thread tint_array_wrapper_1* const tint_symbol_9, thread QuicksortObject* const tint_symbol_10, thread float4* const tint_symbol_11) {
  main_1(x_50, tint_symbol_9, tint_symbol_10, tint_symbol_11);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_11)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_50 [[buffer(0)]]) {
  thread tint_array_wrapper_1 tint_symbol_12 = {};
  thread QuicksortObject tint_symbol_13 = {};
  thread float4 tint_symbol_14 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_50, &(tint_symbol_12), &(tint_symbol_13), &(tint_symbol_14));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

