#version 310 es
precision mediump float;

layout(location = 0) flat out int loc0_1;
struct VertexOutput {
  vec4 pos;
  int loc0;
};

VertexOutput foo(float x) {
  VertexOutput tint_symbol = VertexOutput(vec4(x, x, x, 1.0f), 42);
  return tint_symbol;
}

VertexOutput vert_main1() {
  return foo(0.5f);
}

void main() {
  VertexOutput inner_result = vert_main1();
  gl_Position = inner_result.pos;
  loc0_1 = inner_result.loc0;
  gl_Position.y = -(gl_Position.y);
  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
  return;
}
#version 310 es
precision mediump float;

layout(location = 0) flat out int loc0_1;
struct VertexOutput {
  vec4 pos;
  int loc0;
};

VertexOutput foo(float x) {
  VertexOutput tint_symbol = VertexOutput(vec4(x, x, x, 1.0f), 42);
  return tint_symbol;
}

VertexOutput vert_main2() {
  return foo(0.25f);
}

void main() {
  VertexOutput inner_result = vert_main2();
  gl_Position = inner_result.pos;
  loc0_1 = inner_result.loc0;
  gl_Position.y = -(gl_Position.y);
  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
  return;
}
