#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_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_7, constant buf1& x_11, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float a = 0.0f;
  float b = 0.0f;
  int i = 0;
  int i_1 = 0;
  int i_2 = 0;
  int i_3 = 0;
  int i_4 = 0;
  int i_5 = 0;
  int i_6 = 0;
  int i_7 = 0;
  int i_8 = 0;
  int i_9 = 0;
  int i_10 = 0;
  float const x_104 = x_7.x_GLF_uniform_float_values.arr[0].el;
  a = x_104;
  float const x_106 = x_7.x_GLF_uniform_float_values.arr[1].el;
  b = x_106;
  int const x_24 = x_11.x_GLF_uniform_int_values.arr[1].el;
  i = x_24;
  while (true) {
    int const x_25 = i;
    int const x_26 = x_11.x_GLF_uniform_int_values.arr[0].el;
    if ((x_25 < x_26)) {
    } else {
      break;
    }
    int const x_27 = x_11.x_GLF_uniform_int_values.arr[1].el;
    i_1 = x_27;
    while (true) {
      int const x_28 = i_1;
      int const x_29 = x_11.x_GLF_uniform_int_values.arr[0].el;
      if ((x_28 < x_29)) {
      } else {
        break;
      }
      int const x_30 = x_11.x_GLF_uniform_int_values.arr[1].el;
      i_2 = x_30;
      while (true) {
        int const x_31 = i_2;
        int const x_32 = x_11.x_GLF_uniform_int_values.arr[0].el;
        if ((x_31 < x_32)) {
        } else {
          break;
        }
        int const x_33 = x_11.x_GLF_uniform_int_values.arr[2].el;
        i_3 = x_33;
        while (true) {
          int const x_34 = i_3;
          int const x_35 = x_11.x_GLF_uniform_int_values.arr[0].el;
          if ((x_34 < x_35)) {
          } else {
            break;
          }
          int const x_36 = x_11.x_GLF_uniform_int_values.arr[2].el;
          i_4 = x_36;
          while (true) {
            int const x_37 = i_4;
            int const x_38 = x_11.x_GLF_uniform_int_values.arr[0].el;
            if ((x_37 < x_38)) {
            } else {
              break;
            }
            int const x_39 = x_11.x_GLF_uniform_int_values.arr[1].el;
            i_5 = x_39;
            while (true) {
              int const x_40 = i_5;
              int const x_41 = x_11.x_GLF_uniform_int_values.arr[0].el;
              if ((x_40 < x_41)) {
              } else {
                break;
              }
              int const x_42 = x_11.x_GLF_uniform_int_values.arr[1].el;
              i_6 = x_42;
              while (true) {
                int const x_43 = i_6;
                int const x_44 = x_11.x_GLF_uniform_int_values.arr[0].el;
                if ((x_43 < x_44)) {
                } else {
                  break;
                }
                int const x_45 = x_11.x_GLF_uniform_int_values.arr[1].el;
                i_7 = x_45;
                while (true) {
                  int const x_46 = i_7;
                  int const x_47 = x_11.x_GLF_uniform_int_values.arr[0].el;
                  if ((x_46 < x_47)) {
                  } else {
                    break;
                  }
                  int const x_48 = x_11.x_GLF_uniform_int_values.arr[1].el;
                  i_8 = x_48;
                  while (true) {
                    int const x_49 = i_8;
                    int const x_50 = x_11.x_GLF_uniform_int_values.arr[0].el;
                    if ((x_49 < x_50)) {
                    } else {
                      break;
                    }
                    int const x_51 = x_11.x_GLF_uniform_int_values.arr[1].el;
                    i_9 = x_51;
                    while (true) {
                      int const x_52 = i_9;
                      int const x_53 = x_11.x_GLF_uniform_int_values.arr[0].el;
                      if ((x_52 < x_53)) {
                      } else {
                        break;
                      }
                      int const x_54 = x_11.x_GLF_uniform_int_values.arr[1].el;
                      i_10 = x_54;
                      while (true) {
                        int const x_55 = i_10;
                        int const x_56 = x_11.x_GLF_uniform_int_values.arr[0].el;
                        if ((x_55 < x_56)) {
                        } else {
                          break;
                        }
                        float const x_196 = x_7.x_GLF_uniform_float_values.arr[1].el;
                        a = x_196;
                        float const x_198 = (*(tint_symbol_5)).y;
                        float const x_200 = x_7.x_GLF_uniform_float_values.arr[1].el;
                        if ((x_198 > x_200)) {
                          break;
                        }
                        {
                          int const x_57 = i_10;
                          i_10 = (x_57 + 1);
                        }
                      }
                      {
                        int const x_59 = i_9;
                        i_9 = (x_59 + 1);
                      }
                    }
                    {
                      int const x_61 = i_8;
                      i_8 = (x_61 + 1);
                    }
                  }
                  {
                    int const x_63 = i_7;
                    i_7 = (x_63 + 1);
                  }
                }
                {
                  int const x_65 = i_6;
                  i_6 = (x_65 + 1);
                }
              }
              {
                int const x_67 = i_5;
                i_5 = (x_67 + 1);
              }
            }
            {
              int const x_69 = i_4;
              i_4 = (x_69 + 1);
            }
          }
          {
            int const x_71 = i_3;
            i_3 = (x_71 + 1);
          }
        }
        {
          int const x_73 = i_2;
          i_2 = (x_73 + 1);
        }
      }
      {
        int const x_75 = i_1;
        i_1 = (x_75 + 1);
      }
    }
    float const x_204 = b;
    b = (x_204 + 1.0f);
    {
      int const x_77 = i;
      i = (x_77 + 1);
    }
  }
  float const x_206 = b;
  float const x_207 = a;
  float const x_208 = a;
  float const x_209 = b;
  *(tint_symbol_6) = float4(x_206, x_207, x_208, x_209);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]], constant buf1& x_11 [[buffer(1)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_7, x_11, &(tint_symbol_7), &(tint_symbol_8));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

