#include <metal_stdlib>

using namespace metal;
uint2 tint_insert_bits(uint2 v, uint2 n, uint offset, uint count) {
  uint const s = min(offset, 32u);
  uint const e = min(32u, (s + count));
  return insert_bits(v, n, s, (e - s));
}

uint2 insertBits_3c7ba5() {
  uint2 arg_0 = uint2(1u);
  uint2 arg_1 = uint2(1u);
  uint arg_2 = 1u;
  uint arg_3 = 1u;
  uint2 res = tint_insert_bits(arg_0, arg_1, arg_2, arg_3);
  return res;
}

fragment void fragment_main(device uint2* tint_symbol_1 [[buffer(0)]]) {
  *(tint_symbol_1) = insertBits_3c7ba5();
  return;
}

kernel void compute_main(device uint2* tint_symbol_2 [[buffer(0)]]) {
  *(tint_symbol_2) = insertBits_3c7ba5();
  return;
}

struct VertexOutput {
  float4 pos;
  uint2 prevent_dce;
};

struct tint_symbol {
  uint2 prevent_dce [[user(locn0)]] [[flat]];
  float4 pos [[position]];
};

VertexOutput vertex_main_inner() {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  out.prevent_dce = insertBits_3c7ba5();
  return out;
}

vertex tint_symbol vertex_main() {
  VertexOutput const inner_result = vertex_main_inner();
  tint_symbol wrapper_result = {};
  wrapper_result.pos = inner_result.pos;
  wrapper_result.prevent_dce = inner_result.prevent_dce;
  return wrapper_result;
}

