[[block]]
struct buf0 {
  resolution : vec2<f32>;
};

[[block]]
struct buf1 {
  injectionSwitch : vec2<f32>;
};

[[group(0), binding(0)]] var<uniform> x_13 : buf0;

var<private> gl_FragCoord : vec4<f32>;

[[group(0), binding(1)]] var<uniform> x_19 : buf1;

var<private> x_GLF_color : vec4<f32>;

fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
  var result : f32;
  var i : i32;
  result = -0.5;
  i = 1;
  loop {
    let x_144 : i32 = i;
    if ((x_144 < 800)) {
    } else {
      break;
    }
    let x_147 : i32 = i;
    if (((x_147 % 32) == 0)) {
      let x_153 : f32 = result;
      result = (x_153 + 0.400000006);
    } else {
      let x_155 : i32 = i;
      let x_157 : f32 = *(thirty_two);
      if (((f32(x_155) - (round(x_157) * floor((f32(x_155) / round(x_157))))) <= 0.01)) {
        let x_163 : f32 = result;
        result = (x_163 + 100.0);
      }
    }
    let x_165 : i32 = i;
    let x_167 : f32 = *(limit);
    if ((f32(x_165) >= x_167)) {
      let x_171 : f32 = result;
      return x_171;
    }

    continuing {
      let x_172 : i32 = i;
      i = (x_172 + 1);
    }
  }
  let x_174 : f32 = result;
  return x_174;
}

fn main_1() {
  var c : vec3<f32>;
  var thirty_two_1 : f32;
  var param : f32;
  var param_1 : f32;
  var param_2 : f32;
  var param_3 : f32;
  var x_61 : vec3<f32>;
  var i_1 : i32;
  var j : f32;
  c = vec3<f32>(7.0, 8.0, 9.0);
  let x_63 : f32 = x_13.resolution.x;
  thirty_two_1 = round((x_63 / 8.0));
  let x_67 : f32 = gl_FragCoord.x;
  param = x_67;
  let x_68 : f32 = thirty_two_1;
  param_1 = x_68;
  let x_69 : f32 = compute_value_f1_f1_(&(param), &(param_1));
  c.x = x_69;
  let x_72 : f32 = gl_FragCoord.y;
  param_2 = x_72;
  let x_73 : f32 = thirty_two_1;
  param_3 = x_73;
  let x_74 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
  c.y = x_74;
  let x_77 : f32 = c.x;
  if (true) {
    let x_81 : vec3<f32> = c;
    x_61 = x_81;
  } else {
    let x_82 : vec3<f32> = c;
    let x_84 : f32 = x_19.injectionSwitch.x;
    x_61 = (x_82 * x_84);
  }
  let x_87 : f32 = x_61.y;
  c.z = (x_77 + x_87);
  i_1 = 0;
  loop {
    let x_94 : i32 = i_1;
    if ((x_94 < 3)) {
    } else {
      break;
    }
    let x_97 : i32 = i_1;
    let x_99 : f32 = c[x_97];
    if ((x_99 >= 1.0)) {
      let x_103 : i32 = i_1;
      let x_104 : i32 = i_1;
      let x_106 : f32 = c[x_104];
      let x_107 : i32 = i_1;
      let x_109 : f32 = c[x_107];
      c[x_103] = (x_106 * x_109);
    }
    j = 0.0;
    loop {
      let x_117 : f32 = x_19.injectionSwitch.x;
      let x_119 : f32 = x_19.injectionSwitch.y;
      if ((x_117 > x_119)) {
      } else {
        break;
      }
      let x_122 : f32 = j;
      let x_124 : f32 = x_19.injectionSwitch.x;
      if ((x_122 >= x_124)) {
        break;
      }
      let x_128 : f32 = j;
      j = (x_128 + 1.0);
    }

    continuing {
      let x_130 : i32 = i_1;
      i_1 = (x_130 + 1);
    }
  }
  let x_132 : vec3<f32> = c;
  let x_134 : vec3<f32> = normalize(abs(x_132));
  x_GLF_color = vec4<f32>(x_134.x, x_134.y, x_134.z, 1.0);
  return;
}

struct main_out {
  [[location(0)]]
  x_GLF_color_1 : vec4<f32>;
};

[[stage(fragment)]]
fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
  gl_FragCoord = gl_FragCoord_param;
  main_1();
  return main_out(x_GLF_color);
}
