#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 = (x_67 + 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;
}

