type Arr = [[stride(16)]] array<i32, 6>;

[[block]]
struct buf1 {
  x_GLF_uniform_int_values : Arr;
};

type Arr_1 = [[stride(16)]] array<f32, 1>;

[[block]]
struct buf0 {
  x_GLF_uniform_float_values : Arr_1;
};

var<private> x_GLF_color : vec4<f32>;

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

var<private> gl_FragCoord : vec4<f32>;

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

fn main_1() {
  var data : array<i32, 5>;
  var a : i32;
  var i : i32;
  var j : i32;
  var i_1 : i32;
  let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
  let x_48 : i32 = x_6.x_GLF_uniform_int_values[5];
  let x_51 : i32 = x_6.x_GLF_uniform_int_values[5];
  let x_54 : i32 = x_6.x_GLF_uniform_int_values[0];
  x_GLF_color = vec4<f32>(f32(x_45), f32(x_48), f32(x_51), f32(x_54));
  let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
  let x_60 : i32 = x_6.x_GLF_uniform_int_values[2];
  let x_62 : i32 = x_6.x_GLF_uniform_int_values[3];
  let x_64 : i32 = x_6.x_GLF_uniform_int_values[4];
  let x_66 : i32 = x_6.x_GLF_uniform_int_values[0];
  data = array<i32, 5>(x_58, x_60, x_62, x_64, x_66);
  let x_69 : i32 = x_6.x_GLF_uniform_int_values[5];
  a = x_69;
  loop {
    let x_74 : i32 = a;
    let x_76 : i32 = x_6.x_GLF_uniform_int_values[0];
    if ((x_74 < x_76)) {
    } else {
      break;
    }
    let x_80 : i32 = x_6.x_GLF_uniform_int_values[5];
    i = x_80;
    loop {
      let x_85 : i32 = i;
      let x_87 : i32 = x_6.x_GLF_uniform_int_values[1];
      if ((x_85 < x_87)) {
      } else {
        break;
      }
      let x_90 : i32 = i;
      j = x_90;
      loop {
        let x_95 : i32 = j;
        let x_97 : i32 = x_6.x_GLF_uniform_int_values[1];
        if ((x_95 < x_97)) {
        } else {
          break;
        }
        let x_100 : i32 = i;
        let x_102 : i32 = data[x_100];
        let x_103 : i32 = j;
        let x_105 : i32 = data[x_103];
        if ((x_102 < x_105)) {
          let x_110 : i32 = x_6.x_GLF_uniform_int_values[5];
          let x_111 : f32 = f32(x_110);
          x_GLF_color = vec4<f32>(x_111, x_111, x_111, x_111);
        }

        continuing {
          let x_113 : i32 = j;
          j = (x_113 + 1);
        }
      }

      continuing {
        let x_115 : i32 = i;
        i = (x_115 + 1);
      }
    }

    continuing {
      let x_117 : i32 = a;
      a = (x_117 + 1);
    }
  }
  loop {
    let x_124 : f32 = gl_FragCoord.x;
    let x_126 : f32 = x_12.x_GLF_uniform_float_values[0];
    if ((x_124 < x_126)) {
    } else {
      break;
    }
    let x_130 : i32 = x_6.x_GLF_uniform_int_values[5];
    i_1 = x_130;
    loop {
      let x_135 : i32 = i_1;
      let x_137 : i32 = x_6.x_GLF_uniform_int_values[0];
      if ((x_135 < x_137)) {
      } else {
        break;
      }
      let x_141 : i32 = x_6.x_GLF_uniform_int_values[5];
      let x_142 : f32 = f32(x_141);
      x_GLF_color = vec4<f32>(x_142, x_142, x_142, x_142);

      continuing {
        let x_144 : i32 = i_1;
        i_1 = (x_144 + 1);
      }
    }
  }
  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);
}
