#include <metal_stdlib>

using namespace metal;
struct main_out {
  float4 outColor_1;
  float gl_FragDepth_1;
};
struct tint_symbol_1 {
  float4 outColor_1 [[color(0)]];
  float gl_FragDepth_1 [[depth(any)]];
};

void main_1(thread float4* const tint_symbol_3, thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
  *(tint_symbol_3) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  float const x_20 = (*(tint_symbol_4)).z;
  *(tint_symbol_5) = x_20;
  return;
}

main_out tint_symbol_inner(float4 gl_FragCoord_param, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7, thread float* const tint_symbol_8) {
  *(tint_symbol_6) = gl_FragCoord_param;
  main_1(tint_symbol_7, tint_symbol_6, tint_symbol_8);
  main_out const tint_symbol_2 = {.outColor_1=*(tint_symbol_7), .gl_FragDepth_1=*(tint_symbol_8)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(float4 gl_FragCoord_param [[position]]) {
  thread float4 tint_symbol_9 = 0.0f;
  thread float4 tint_symbol_10 = 0.0f;
  thread float tint_symbol_11 = 0.0f;
  main_out const inner_result = tint_symbol_inner(gl_FragCoord_param, &(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.outColor_1 = inner_result.outColor_1;
  wrapper_result.gl_FragDepth_1 = inner_result.gl_FragDepth_1;
  return wrapper_result;
}

