#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[6];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
};
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_5, thread float4* const tint_symbol_3) {
  int x_36 = 0;
  bool x_74 = false;
  float4 x_33_phi = 0.0f;
  int x_36_phi = 0;
  int x_38_phi = 0;
  bool x_75_phi = false;
  int const x_29 = x_5.x_GLF_uniform_int_values.arr[0].el;
  int const x_31 = x_5.x_GLF_uniform_int_values.arr[1].el;
  x_33_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
  x_36_phi = x_29;
  x_38_phi = x_31;
  while (true) {
    float4 x_53 = 0.0f;
    int x_39 = 0;
    float4 x_34_phi = 0.0f;
    int x_62_phi = 0;
    float4 const x_33 = x_33_phi;
    x_36 = x_36_phi;
    int const x_38 = x_38_phi;
    int const x_41 = x_5.x_GLF_uniform_int_values.arr[4].el;
    if ((x_38 < x_41)) {
    } else {
      break;
    }
    float4 x_53_phi = 0.0f;
    int x_56_phi = 0;
    switch(0u) {
      default: {
        int const x_48 = x_5.x_GLF_uniform_int_values.arr[3].el;
        if ((x_38 > x_48)) {
          x_34_phi = x_33;
          x_62_phi = 2;
          break;
        }
        x_53_phi = x_33;
        x_56_phi = x_29;
        while (true) {
          float4 x_54 = 0.0f;
          int x_57 = 0;
          x_53 = x_53_phi;
          int const x_56 = x_56_phi;
          if ((x_56 < x_41)) {
          } else {
            break;
          }
          {
            float const x_61 = float(as_type<int>((as_type<uint>(x_38) + as_type<uint>(x_56))));
            x_54 = float4(x_61, x_61, x_61, x_61);
            x_57 = as_type<int>((as_type<uint>(x_56) + as_type<uint>(1)));
            x_53_phi = x_54;
            x_56_phi = x_57;
          }
        }
        *(tint_symbol_3) = x_53;
        x_34_phi = x_53;
        x_62_phi = x_31;
        break;
      }
    }
    float4 const x_34 = x_34_phi;
    int const x_62 = x_62_phi;
    {
      x_39 = as_type<int>((as_type<uint>(x_38) + as_type<uint>(1)));
      x_33_phi = x_34;
      x_36_phi = as_type<int>(as_type<int>((as_type<uint>(x_36) + as_type<uint>(as_type<int>(x_62)))));
      x_38_phi = x_39;
    }
  }
  float4 const x_63 = *(tint_symbol_3);
  int const x_65 = x_5.x_GLF_uniform_int_values.arr[2].el;
  float const x_66 = float(x_65);
  bool const x_69 = all((x_63 == float4(x_66, x_66, x_66, x_66)));
  x_75_phi = x_69;
  if (x_69) {
    int const x_73 = x_5.x_GLF_uniform_int_values.arr[5].el;
    x_74 = (x_36 == as_type<int>(x_73));
    x_75_phi = x_74;
  }
  bool const x_75 = x_75_phi;
  if (x_75) {
    float const x_79 = float(x_31);
    float const x_80 = float(x_29);
    *(tint_symbol_3) = float4(x_79, x_80, x_80, x_79);
  } else {
    float const x_82 = float(x_29);
    *(tint_symbol_3) = float4(x_82, x_82, x_82, x_82);
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_5, thread float4* const tint_symbol_4) {
  main_1(x_5, tint_symbol_4);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_4)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_5, &(tint_symbol_5));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

