#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[3];
};
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)]];
};

int func_(constant buf0& x_7, thread int* const tint_symbol_4) {
  while (true) {
    int const x_72 = *(tint_symbol_4);
    if ((x_72 < 100)) {
    } else {
      break;
    }
    int const x_75 = *(tint_symbol_4);
    *(tint_symbol_4) = (x_75 + 1);
    int const x_78 = x_7.x_GLF_uniform_int_values.arr[0].el;
    return x_78;
  }
  int const x_80 = x_7.x_GLF_uniform_int_values.arr[2].el;
  return x_80;
}

void main_1(constant buf0& x_7, thread int* const tint_symbol_5, thread float4* const tint_symbol_6) {
  int a = 0;
  *(tint_symbol_5) = 0;
  while (true) {
    int const x_35 = *(tint_symbol_5);
    *(tint_symbol_5) = (x_35 + 1);
    if (false) {
      return;
    }
    {
      int const x_39 = *(tint_symbol_5);
      if ((true & (x_39 < 100))) {
      } else {
        break;
      }
    }
  }
  int const x_42 = func_(x_7, tint_symbol_5);
  a = x_42;
  int const x_43 = a;
  int const x_45 = x_7.x_GLF_uniform_int_values.arr[2].el;
  if ((x_43 == x_45)) {
    int const x_51 = x_7.x_GLF_uniform_int_values.arr[0].el;
    int const x_54 = x_7.x_GLF_uniform_int_values.arr[1].el;
    int const x_57 = x_7.x_GLF_uniform_int_values.arr[1].el;
    int const x_60 = x_7.x_GLF_uniform_int_values.arr[0].el;
    *(tint_symbol_6) = float4(float(x_51), float(x_54), float(x_57), float(x_60));
  } else {
    int const x_64 = x_7.x_GLF_uniform_int_values.arr[1].el;
    float const x_65 = float(x_64);
    *(tint_symbol_6) = float4(x_65, x_65, x_65, x_65);
  }
  return;
}

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

