package metro

import 

func rotate_right( uint64,  uint) uint64 {
	return ( >> ) | ( << (64 - ))
}

func ( []byte,  uint64) (uint64, uint64) {

	const (
		 = 0xC83A91E1
		 = 0x8648DBDB
		 = 0x7BDEC03B
		 = 0x2F5870A5
	)

	 := 

	var  [4]uint64

	[0] = ( - ) * 
	[1] = ( + ) * 

	if len() >= 32 {
		[2] = ( + ) * 
		[3] = ( - ) * 

		for len() >= 32 {
			[0] += binary.LittleEndian.Uint64() * 
			 = [8:]
			[0] = rotate_right([0], 29) + [2]
			[1] += binary.LittleEndian.Uint64() * 
			 = [8:]
			[1] = rotate_right([1], 29) + [3]
			[2] += binary.LittleEndian.Uint64() * 
			 = [8:]
			[2] = rotate_right([2], 29) + [0]
			[3] += binary.LittleEndian.Uint64() * 
			 = [8:]
			[3] = rotate_right([3], 29) + [1]
		}

		[2] ^= rotate_right((([0]+[3])*)+[1], 21) * 
		[3] ^= rotate_right((([1]+[2])*)+[0], 21) * 
		[0] ^= rotate_right((([0]+[2])*)+[3], 21) * 
		[1] ^= rotate_right((([1]+[3])*)+[2], 21) * 
	}

	if len() >= 16 {
		[0] += binary.LittleEndian.Uint64() * 
		 = [8:]
		[0] = rotate_right([0], 33) * 
		[1] += binary.LittleEndian.Uint64() * 
		 = [8:]
		[1] = rotate_right([1], 33) * 
		[0] ^= rotate_right(([0]*)+[1], 45) * 
		[1] ^= rotate_right(([1]*)+[0], 45) * 
	}

	if len() >= 8 {
		[0] += binary.LittleEndian.Uint64() * 
		 = [8:]
		[0] = rotate_right([0], 33) * 
		[0] ^= rotate_right(([0]*)+[1], 27) * 
	}

	if len() >= 4 {
		[1] += uint64(binary.LittleEndian.Uint32()) * 
		 = [4:]
		[1] = rotate_right([1], 33) * 
		[1] ^= rotate_right(([1]*)+[0], 46) * 
	}

	if len() >= 2 {
		[0] += uint64(binary.LittleEndian.Uint16()) * 
		 = [2:]
		[0] = rotate_right([0], 33) * 
		[0] ^= rotate_right(([0]*)+[1], 22) * 
	}

	if len() >= 1 {
		[1] += uint64([0]) * 
		[1] = rotate_right([1], 33) * 
		[1] ^= rotate_right(([1]*)+[0], 58) * 
	}

	[0] += rotate_right(([0]*)+[1], 13)
	[1] += rotate_right(([1]*)+[0], 37)
	[0] += rotate_right(([0]*)+[1], 13)
	[1] += rotate_right(([1]*)+[0], 37)

	return [0], [1]
}