#include <metal_stdlib>

using namespace metal;
struct doesNotMatter {
  /* 0x0000 */ int global_seed;
  /* 0x0004 */ int data[1];
};
struct buf1 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};

void main_1(constant buf1& x_10, device doesNotMatter& x_7, thread uint3* const tint_symbol_1) {
  int lid = 0;
  int val = 0;
  int i = 0;
  uint const x_40 = (*(tint_symbol_1)).x;
  lid = as_type<int>(x_40);
  int const x_43 = x_7.global_seed;
  val = x_43;
  i = 0;
  while (true) {
    int const x_48 = i;
    if ((x_48 < 2)) {
    } else {
      break;
    }
    int const x_51 = lid;
    if ((x_51 > 0)) {
      int const x_55 = lid;
      int const x_58 = x_7.data[as_type<int>((as_type<uint>(x_55) - as_type<uint>(1)))];
      int const x_59 = val;
      val = as_type<int>((as_type<uint>(x_59) + as_type<uint>(x_58)));
      float const x_62 = x_10.injectionSwitch.x;
      if ((x_62 > 100.0f)) {
        break;
      }
    }
    threadgroup_barrier(mem_flags::mem_threadgroup);
    {
      int const x_66 = i;
      i = as_type<int>((as_type<uint>(x_66) + as_type<uint>(1)));
    }
  }
  int const x_68 = lid;
  if ((x_68 == 0)) {
    x_7.data[0] = 42;
  }
  return;
}

void tint_symbol_inner(constant buf1& x_10, device doesNotMatter& x_7, uint3 gl_LocalInvocationID_param, thread uint3* const tint_symbol_2) {
  *(tint_symbol_2) = gl_LocalInvocationID_param;
  main_1(x_10, x_7, tint_symbol_2);
}

kernel void tint_symbol(uint3 gl_LocalInvocationID_param [[thread_position_in_threadgroup]], constant buf1& x_10 [[buffer(0)]], device doesNotMatter& x_7 [[buffer(1)]]) {
  thread uint3 tint_symbol_3 = 0u;
  tint_symbol_inner(x_10, x_7, gl_LocalInvocationID_param, &(tint_symbol_3));
  return;
}

