#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[2];
};
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_6, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
  *(tint_symbol_4) = 0;
  while (true) {
    int const x_30 = *(tint_symbol_4);
    if ((x_30 < 100)) {
    } else {
      break;
    }
    int const x_33 = *(tint_symbol_4);
    *(tint_symbol_4) = as_type<int>((as_type<uint>(x_33) + as_type<uint>(1)));
    int const x_35 = *(tint_symbol_4);
    int const x_36 = *(tint_symbol_4);
    if ((as_type<int>((as_type<uint>(x_35) * as_type<uint>(x_36))) > 10)) {
      break;
    }
  }
  int const x_41 = *(tint_symbol_4);
  if ((x_41 == 4)) {
    int const x_47 = x_6.x_GLF_uniform_int_values.arr[0].el;
    int const x_50 = x_6.x_GLF_uniform_int_values.arr[1].el;
    int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
    int const x_56 = x_6.x_GLF_uniform_int_values.arr[0].el;
    *(tint_symbol_5) = float4(float(x_47), float(x_50), float(x_53), float(x_56));
  } else {
    int const x_60 = x_6.x_GLF_uniform_int_values.arr[1].el;
    float const x_61 = float(x_60);
    *(tint_symbol_5) = float4(x_61, x_61, x_61, x_61);
  }
  return;
}

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

