#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 resolution;
};
struct buf1 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
  float result = 0.0f;
  int i = 0;
  result = -0.5f;
  i = 1;
  while (true) {
    int const x_144 = i;
    if ((x_144 < 800)) {
    } else {
      break;
    }
    int const x_147 = i;
    if (((x_147 % 32) == 0)) {
      float const x_153 = result;
      result = (x_153 + 0.400000006f);
    } else {
      int const x_155 = i;
      float const x_157 = *(thirty_two);
      if ((fmod(float(x_155), rint(x_157)) <= 0.01f)) {
        float const x_163 = result;
        result = (x_163 + 100.0f);
      }
    }
    int const x_165 = i;
    float const x_167 = *(limit);
    if ((float(x_165) >= x_167)) {
      float const x_171 = result;
      return x_171;
    }
    {
      int const x_172 = i;
      i = (x_172 + 1);
    }
  }
  float const x_174 = result;
  return x_174;
}

void main_1(constant buf0& x_13, constant buf1& x_19, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float3 c = 0.0f;
  float thirty_two_1 = 0.0f;
  float param = 0.0f;
  float param_1 = 0.0f;
  float param_2 = 0.0f;
  float param_3 = 0.0f;
  float3 x_61 = 0.0f;
  int i_1 = 0;
  float j = 0.0f;
  c = float3(7.0f, 8.0f, 9.0f);
  float const x_63 = x_13.resolution.x;
  thirty_two_1 = rint((x_63 / 8.0f));
  float const x_67 = (*(tint_symbol_5)).x;
  param = x_67;
  float const x_68 = thirty_two_1;
  param_1 = x_68;
  float const x_69 = compute_value_f1_f1_(&(param), &(param_1));
  c.x = x_69;
  float const x_72 = (*(tint_symbol_5)).y;
  param_2 = x_72;
  float const x_73 = thirty_two_1;
  param_3 = x_73;
  float const x_74 = compute_value_f1_f1_(&(param_2), &(param_3));
  c.y = x_74;
  float const x_77 = c.x;
  if (true) {
    float3 const x_81 = c;
    x_61 = x_81;
  } else {
    float3 const x_82 = c;
    float const x_84 = x_19.injectionSwitch.x;
    x_61 = (x_82 * x_84);
  }
  float const x_87 = x_61.y;
  c.z = (x_77 + x_87);
  i_1 = 0;
  while (true) {
    int const x_94 = i_1;
    if ((x_94 < 3)) {
    } else {
      break;
    }
    int const x_97 = i_1;
    float const x_99 = c[x_97];
    if ((x_99 >= 1.0f)) {
      int const x_103 = i_1;
      int const x_104 = i_1;
      float const x_106 = c[x_104];
      int const x_107 = i_1;
      float const x_109 = c[x_107];
      c[x_103] = (x_106 * x_109);
    }
    j = 0.0f;
    while (true) {
      float const x_117 = x_19.injectionSwitch.x;
      float const x_119 = x_19.injectionSwitch.y;
      if ((x_117 > x_119)) {
      } else {
        break;
      }
      float const x_122 = j;
      float const x_124 = x_19.injectionSwitch.x;
      if ((x_122 >= x_124)) {
        break;
      }
      float const x_128 = j;
      j = (x_128 + 1.0f);
    }
    {
      int const x_130 = i_1;
      i_1 = (x_130 + 1);
    }
  }
  float3 const x_132 = c;
  float3 const x_134 = normalize(fabs(x_132));
  *(tint_symbol_6) = float4(x_134.x, x_134.y, x_134.z, 1.0f);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]], constant buf1& x_19 [[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_13, x_19, &(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;
}

