#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float4 r;
};

void main_1(const constant buf0* const tint_symbol_3, thread float4* const tint_symbol_4) {
  float f = 0.0f;
  float4 v = 0.0f;
  f = determinant(float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f)));
  float const x_33 = f;
  float const x_35 = f;
  float const x_37 = f;
  float const x_39 = f;
  v = float4(sin(x_33), cos(x_35), exp2(x_37), log(x_39));
  float4 const x_42 = v;
  float4 const x_44 = (*(tint_symbol_3)).r;
  if ((distance(x_42, x_44) < 0.100000001f)) {
    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_4) = float4(0.0f);
  }
  return;
}

struct main_out {
  float4 x_GLF_color_1;
};

struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

main_out tint_symbol_inner(const constant buf0* const tint_symbol_5, thread float4* const tint_symbol_6) {
  main_1(tint_symbol_5, tint_symbol_6);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_6)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(const constant buf0* tint_symbol_7 [[buffer(0)]]) {
  thread float4 tint_symbol_8 = 0.0f;
  main_out const inner_result = tint_symbol_inner(tint_symbol_7, &(tint_symbol_8));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

