#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_1 {
  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 = as_type<int>((as_type<uint>(x_172) + as_type<uint>(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_3, thread float4* const tint_symbol_4) {
  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_3)).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_3)).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 = as_type<int>((as_type<uint>(x_130) + as_type<uint>(1)));
    }
  }
  float3 const x_132 = c;
  float3 const x_134 = normalize(fabs(x_132));
  *(tint_symbol_4) = float4(x_134.x, x_134.y, x_134.z, 1.0f);
  return;
}

main_out tint_symbol_inner(constant buf0& x_13, constant buf1& x_19, float4 gl_FragCoord_param, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  *(tint_symbol_5) = gl_FragCoord_param;
  main_1(x_13, x_19, tint_symbol_5, tint_symbol_6);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_6)};
  return tint_symbol_2;
}

fragment tint_symbol_1 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;
  main_out const inner_result = tint_symbol_inner(x_13, x_19, gl_FragCoord_param, &(tint_symbol_7), &(tint_symbol_8));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

