#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ uint one;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
  uint a = 0u;
  uint b = 0u;
  uint c = 0u;
  uint d = 0u;
  uint e = 0u;
  uint f = 0u;
  uint const x_41 = x_6.one;
  a = ((77u + x_41) >> 32u);
  uint const x_45 = x_6.one;
  b = ((3243u + x_45) >> 33u);
  uint const x_49 = x_6.one;
  c = ((23u + x_49) >> 345u);
  uint const x_53 = x_6.one;
  d = ((2395u + x_53) << 32u);
  uint const x_57 = x_6.one;
  e = ((290485u + x_57) << 33u);
  uint const x_61 = x_6.one;
  f = ((44321u + x_61) << 345u);
  uint const x_64 = a;
  if ((x_64 != 1u)) {
    a = 1u;
  }
  uint const x_68 = b;
  if ((x_68 != 0u)) {
    b = 0u;
  }
  uint const x_72 = c;
  if ((x_72 != 1u)) {
    c = 1u;
  }
  uint const x_76 = d;
  if ((x_76 != 0u)) {
    d = 0u;
  }
  uint const x_80 = e;
  if ((x_80 != 1u)) {
    e = 1u;
  }
  uint const x_84 = f;
  if ((x_84 != 0u)) {
    f = 0u;
  }
  uint const x_88 = a;
  uint const x_90 = b;
  uint const x_93 = c;
  uint const x_96 = d;
  uint const x_99 = e;
  uint const x_102 = f;
  if (((((((x_88 == 1u) & (x_90 == 0u)) & (x_93 == 1u)) & (x_96 == 0u)) & (x_99 == 1u)) & (x_102 == 0u))) {
    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(x_6, &(tint_symbol_5));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_3;
}

