#include <metal_stdlib>

using namespace metal;
struct tint_array_wrapper {
  int arr[1];
};
struct tmp_struct {
  tint_array_wrapper nmb;
};
struct buf0 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
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_11, thread float4* const tint_symbol_6) {
  tint_array_wrapper x_24 = {};
  bool x_68 = false;
  int x_17 = 0;
  int x_18 = 0;
  int x_19 = 0;
  int x_20 = 0;
  bool x_69 = false;
  float tmp_float = 0.0f;
  float3 color = 0.0f;
  while (true) {
    int x_25 = 0;
    float3 x_101 = 0.0f;
    bool x_79_phi = false;
    int x_26_phi = 0;
    float const x_75 = x_11.injectionSwitch.y;
    tmp_float = x_75;
    float3 const x_76 = float3(x_75, x_75, x_75);
    color = x_76;
    tint_array_wrapper const tint_symbol_3 = {.arr={0}};
    tmp_struct const tint_symbol_4 = {.nmb=tint_symbol_3};
    x_24 = tint_symbol_4.nmb;
    x_68 = false;
    x_79_phi = false;
    while (true) {
      int x_21_phi = 0;
      int x_25_phi = 0;
      bool x_93_phi = false;
      bool const x_79 = x_79_phi;
      x_18 = 1;
      x_21_phi = 1;
      while (true) {
        int const x_21 = x_21_phi;
        x_25_phi = 0;
        x_93_phi = x_79;
        if ((x_21 > 10)) {
        } else {
          break;
        }
        int const x_22 = (x_21 - 1);
        x_19 = x_22;
        int const x_23 = x_24.arr[x_22];
        if ((x_23 == 1)) {
          x_68 = true;
          x_17 = 1;
          x_25_phi = 1;
          x_93_phi = true;
          break;
        }
        x_18 = x_22;
        {
          x_21_phi = x_22;
        }
      }
      x_25 = x_25_phi;
      bool const x_93 = x_93_phi;
      x_26_phi = x_25;
      if (x_93) {
        break;
      }
      x_68 = true;
      x_17 = -1;
      x_26_phi = -1;
      break;
      {
        x_79_phi = false;
      }
    }
    int const x_26 = x_26_phi;
    x_20 = x_26;
    if ((x_26 == -1)) {
      discard_fragment();
    } else {
      *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
      float2 const x_100 = (float2(x_76.y, x_76.z) + float2(1.0f, 1.0f));
      x_101 = float3(x_76.x, x_100.x, x_100.y);
      color = x_101;
      float const x_103 = x_11.injectionSwitch.x;
      if ((x_103 > 1.0f)) {
        x_69 = true;
        break;
      }
    }
    *(tint_symbol_6) = float4(x_101.x, x_101.y, x_101.z, 1.0f);
    x_69 = true;
    break;
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_11 [[buffer(0)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  main_1(x_11, &(tint_symbol_7));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
  tint_symbol_1 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_5;
}

int binarySearch_struct_tmp_struct_i1_1_1_(thread tmp_struct* const obj) {
  bool x_112 = false;
  int x_16 = 0;
  int one = 0;
  int zero = 0;
  int x_27 = 0;
  bool x_114_phi = false;
  int x_28_phi = 0;
  x_114_phi = false;
  while (true) {
    int x_15_phi = 0;
    int x_27_phi = 0;
    bool x_128_phi = false;
    bool const x_114 = x_114_phi;
    one = 1;
    x_15_phi = 1;
    while (true) {
      int const x_15 = x_15_phi;
      x_27_phi = 0;
      x_128_phi = x_114;
      if ((x_15 > 10)) {
      } else {
        break;
      }
      int const x_13 = (x_15 - 1);
      zero = x_13;
      int const x_14 = (*(obj)).nmb.arr[x_13];
      if ((x_14 == 1)) {
        x_112 = true;
        x_16 = 1;
        x_27_phi = 1;
        x_128_phi = true;
        break;
      }
      one = x_13;
      {
        x_15_phi = x_13;
      }
    }
    x_27 = x_27_phi;
    bool const x_128 = x_128_phi;
    x_28_phi = x_27;
    if (x_128) {
      break;
    }
    x_112 = true;
    x_16 = -1;
    x_28_phi = -1;
    break;
    {
      x_114_phi = false;
    }
  }
  int const x_28 = x_28_phi;
  return x_28;
}

