#version 310 es
precision mediump float;

layout(location = 0) out vec4 x_GLF_color_1_1;
struct strided_arr {
  int el;
};

struct buf0 {
  strided_arr x_GLF_uniform_int_values[3];
};

layout(binding = 0) uniform buf0_1 {
  strided_arr x_GLF_uniform_int_values[3];
} x_6;

vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
void main_1() {
  int i = 0;
  vec4 v = vec4(0.0f, 0.0f, 0.0f, 0.0f);
  int x_30 = x_6.x_GLF_uniform_int_values[1].el;
  i = x_30;
  while (true) {
    int x_35 = i;
    int x_37 = x_6.x_GLF_uniform_int_values[2].el;
    if ((x_35 < x_37)) {
    } else {
      break;
    }
    v = unpackUnorm4x8(100u);
    float x_42 = v.x;
    if ((int(x_42) > i)) {
      int x_49 = x_6.x_GLF_uniform_int_values[1].el;
      float x_50 = float(x_49);
      x_GLF_color = vec4(x_50, x_50, x_50, x_50);
      return;
    }
    {
      i = (i + 1);
    }
  }
  int x_55 = x_6.x_GLF_uniform_int_values[0].el;
  int x_58 = x_6.x_GLF_uniform_int_values[1].el;
  int x_61 = x_6.x_GLF_uniform_int_values[1].el;
  int x_64 = x_6.x_GLF_uniform_int_values[0].el;
  x_GLF_color = vec4(float(x_55), float(x_58), float(x_61), float(x_64));
  return;
}

struct main_out {
  vec4 x_GLF_color_1;
};

main_out tint_symbol() {
  main_1();
  main_out tint_symbol_1 = main_out(x_GLF_color);
  return tint_symbol_1;
}

void main() {
  main_out inner_result = tint_symbol();
  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
  return;
}
