uint64_t x, w1, s;

uint msws() {
   x *= x; 
   x += (w1 += s); 
   return uint(x = (x >> 32u) | (x << 32u));

}

void init_msws(uint64_t seed) {
	x = 0u; w1 = 0u;
	s = (((uint64_t(1890726812u) << 32u) | seed) << 1u) | uint64_t(1u);

	msws(); msws();
}

#define randNext() msws()
#define randNext2() uvec2(msws(), msws())
#define randNext3() uvec3(randNext2(), msws())
#define randNext4() uvec4(randNext3(), msws())

#define randNextF() (float(randNext() & 0x00ffffffu) / float(0x00ffffff))
#define randNextF2() square(float(randNext() & 0x00ffffffu) / float(0x00ffffff))
#define randNext2F() (vec2(randNext2() & 0x00ffffffu) / float(0x00ffffff))
#define randNext3F() (vec3(randNext3() & 0x00ffffffu) / float(0x00ffffff))
#define randNext4F() (vec4(randNext4() & 0x00ffffffu) / float(0x00ffffff))