#include <metal_stdlib>

using namespace metal;
int3 tint_clamp(int3 e, int3 low, int3 high) {
  return min(max(e, low), high);
}

int3 clamp_5f0819() {
  int3 arg_0 = int3(1);
  int3 arg_1 = int3(1);
  int3 arg_2 = int3(1);
  int3 res = tint_clamp(arg_0, arg_1, arg_2);
  return res;
}

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

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

struct VertexOutput {
  float4 pos;
  int3 prevent_dce;
};

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

VertexOutput vertex_main_inner() {
  VertexOutput out = {};
  out.pos = float4(0.0f);
  out.prevent_dce = clamp_5f0819();
  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;
}

