#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ float 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_float_values;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element_1 arr[3];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper_1 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, constant buf1& x_11, thread float4* const tint_symbol_4) {
  float a = 0.0f;
  float b = 0.0f;
  float c = 0.0f;
  int i = 0;
  float const x_35 = x_6.x_GLF_uniform_float_values.arr[1].el;
  a = x_35;
  float const x_37 = x_6.x_GLF_uniform_float_values.arr[1].el;
  b = x_37;
  float const x_39 = x_6.x_GLF_uniform_float_values.arr[1].el;
  c = x_39;
  int const x_41 = x_11.x_GLF_uniform_int_values.arr[1].el;
  i = x_41;
  while (true) {
    int const x_46 = i;
    int const x_48 = x_11.x_GLF_uniform_int_values.arr[0].el;
    if ((x_46 < x_48)) {
    } else {
      break;
    }
    int const x_51 = i;
    int const x_53 = x_11.x_GLF_uniform_int_values.arr[2].el;
    if ((x_51 == x_53)) {
      float const x_57 = a;
      float const x_60 = x_6.x_GLF_uniform_float_values.arr[1].el;
      b = (dfdx(x_57) + x_60);
    }
    float const x_62 = a;
    c = dfdx(x_62);
    float const x_64 = c;
    float const x_65 = b;
    a = (x_64 / x_65);
    {
      int const x_67 = i;
      i = as_type<int>((as_type<uint>(x_67) + as_type<uint>(1)));
    }
  }
  float const x_69 = a;
  float const x_71 = x_6.x_GLF_uniform_float_values.arr[0].el;
  if ((x_69 == x_71)) {
    int const x_77 = x_11.x_GLF_uniform_int_values.arr[2].el;
    int const x_80 = x_11.x_GLF_uniform_int_values.arr[1].el;
    int const x_83 = x_11.x_GLF_uniform_int_values.arr[1].el;
    int const x_86 = x_11.x_GLF_uniform_int_values.arr[2].el;
    *(tint_symbol_4) = float4(float(x_77), float(x_80), float(x_83), float(x_86));
  } else {
    int const x_90 = x_11.x_GLF_uniform_int_values.arr[1].el;
    float const x_91 = float(x_90);
    *(tint_symbol_4) = float4(x_91, x_91, x_91, x_91);
  }
  return;
}

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

