struct strided_arr {
  @size(16)
  el : i32,
}

type Arr = array<strided_arr, 2u>;

struct buf0 {
  x_GLF_uniform_int_values : Arr,
}

struct strided_arr_1 {
  @size(16)
  el : f32,
}

type Arr_1 = array<strided_arr_1, 2u>;

struct buf1 {
  x_GLF_uniform_float_values : Arr_1,
}

var<private> x_GLF_color : vec4<f32>;

@group(0) @binding(0) var<uniform> x_8 : buf0;

var<private> gl_FragCoord : vec4<f32>;

@group(0) @binding(1) var<uniform> x_10 : buf1;

fn f1_f1_(a : ptr<function, f32>) -> f32 {
  let x_100 : f32 = *(a);
  return dpdx(x_100);
}

fn main_1() {
  var v2 : vec4<f32>;
  var a_1 : f32;
  var x_40 : f32;
  var param : f32;
  let x_42 : i32 = x_8.x_GLF_uniform_int_values[0].el;
  let x_45 : i32 = x_8.x_GLF_uniform_int_values[1].el;
  let x_48 : i32 = x_8.x_GLF_uniform_int_values[1].el;
  let x_51 : i32 = x_8.x_GLF_uniform_int_values[0].el;
  x_GLF_color = vec4<f32>(f32(x_42), f32(x_45), f32(x_48), f32(x_51));
  let x_55 : f32 = gl_FragCoord.x;
  let x_57 : f32 = x_10.x_GLF_uniform_float_values[1].el;
  if ((x_55 < x_57)) {
    let x_62 : f32 = v2.x;
    if (!((x_62 < 1.0))) {
      let x_68 : f32 = x_10.x_GLF_uniform_float_values[1].el;
      let x_70 : f32 = x_10.x_GLF_uniform_float_values[1].el;
      let x_72 : f32 = x_10.x_GLF_uniform_float_values[0].el;
      if ((x_70 > x_72)) {
        let x_78 : f32 = x_10.x_GLF_uniform_float_values[0].el;
        param = x_78;
        let x_79 : f32 = f1_f1_(&(param));
        x_40 = x_79;
      } else {
        let x_81 : f32 = x_10.x_GLF_uniform_float_values[0].el;
        x_40 = x_81;
      }
      let x_82 : f32 = x_40;
      a_1 = (x_68 / x_82);
      let x_85 : f32 = x_10.x_GLF_uniform_float_values[0].el;
      let x_88 : f32 = x_10.x_GLF_uniform_float_values[0].el;
      let x_90 : f32 = a_1;
      let x_92 : vec3<f32> = mix(vec3<f32>(x_85, x_85, x_85), vec3<f32>(x_88, x_88, x_88), vec3<f32>(x_90, x_90, x_90));
      let x_94 : f32 = x_10.x_GLF_uniform_float_values[1].el;
      x_GLF_color = vec4<f32>(x_92.x, x_92.y, x_92.z, x_94);
    }
  }
  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);
}
