-
-
Save digitalsanity/8c89d4c340a91b5b38a4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* OpenSimplex Noise in C# | |
* Ported from https://gist.github.com/KdotJPG/b1270127455a94ac5d19 | |
* and heavily refactored to improve performance. The main difference is that once the | |
* bit flags are determined, the result is pulled from a lookup table, saving the time | |
* used deciphering the bit flags again. */ | |
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Runtime.CompilerServices; | |
namespace NoiseTest | |
{ | |
public class OpenSimplexNoise | |
{ | |
private const double STRETCH_2D = -0.211324865405187; //(1/Math.sqrt(2+1)-1)/2; | |
private const double STRETCH_3D = -1.0 / 6.0; //(1/Math.sqrt(3+1)-1)/3; | |
private const double STRETCH_4D = -0.138196601125011; //(1/Math.sqrt(4+1)-1)/4; | |
private const double SQUISH_2D = 0.366025403784439; //(Math.sqrt(2+1)-1)/2; | |
private const double SQUISH_3D = 1.0 / 3.0; //(Math.sqrt(3+1)-1)/3; | |
private const double SQUISH_4D = 0.309016994374947; //(Math.sqrt(4+1)-1)/4; | |
private const double NORM_2D = 1.0 / 47.0; | |
private const double NORM_3D = 1.0 / 103.0; | |
private const double NORM_4D = 1.0 / 30.0; | |
private byte[] perm; | |
private byte[] perm2D; | |
private byte[] perm3D; | |
private byte[] perm4D; | |
private static double[] gradients2D = new double[] | |
{ | |
5, 2, 2, 5, | |
-5, 2, -2, 5, | |
5, -2, 2, -5, | |
-5, -2, -2, -5, | |
}; | |
private static double[] gradients3D = | |
{ | |
-11, 4, 4, -4, 11, 4, -4, 4, 11, | |
11, 4, 4, 4, 11, 4, 4, 4, 11, | |
-11, -4, 4, -4, -11, 4, -4, -4, 11, | |
11, -4, 4, 4, -11, 4, 4, -4, 11, | |
-11, 4, -4, -4, 11, -4, -4, 4, -11, | |
11, 4, -4, 4, 11, -4, 4, 4, -11, | |
-11, -4, -4, -4, -11, -4, -4, -4, -11, | |
11, -4, -4, 4, -11, -4, 4, -4, -11, | |
}; | |
private static double[] gradients4D = | |
{ | |
3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, | |
-3, 1, 1, 1, -1, 3, 1, 1, -1, 1, 3, 1, -1, 1, 1, 3, | |
3, -1, 1, 1, 1, -3, 1, 1, 1, -1, 3, 1, 1, -1, 1, 3, | |
-3, -1, 1, 1, -1, -3, 1, 1, -1, -1, 3, 1, -1, -1, 1, 3, | |
3, 1, -1, 1, 1, 3, -1, 1, 1, 1, -3, 1, 1, 1, -1, 3, | |
-3, 1, -1, 1, -1, 3, -1, 1, -1, 1, -3, 1, -1, 1, -1, 3, | |
3, -1, -1, 1, 1, -3, -1, 1, 1, -1, -3, 1, 1, -1, -1, 3, | |
-3, -1, -1, 1, -1, -3, -1, 1, -1, -1, -3, 1, -1, -1, -1, 3, | |
3, 1, 1, -1, 1, 3, 1, -1, 1, 1, 3, -1, 1, 1, 1, -3, | |
-3, 1, 1, -1, -1, 3, 1, -1, -1, 1, 3, -1, -1, 1, 1, -3, | |
3, -1, 1, -1, 1, -3, 1, -1, 1, -1, 3, -1, 1, -1, 1, -3, | |
-3, -1, 1, -1, -1, -3, 1, -1, -1, -1, 3, -1, -1, -1, 1, -3, | |
3, 1, -1, -1, 1, 3, -1, -1, 1, 1, -3, -1, 1, 1, -1, -3, | |
-3, 1, -1, -1, -1, 3, -1, -1, -1, 1, -3, -1, -1, 1, -1, -3, | |
3, -1, -1, -1, 1, -3, -1, -1, 1, -1, -3, -1, 1, -1, -1, -3, | |
-3, -1, -1, -1, -1, -3, -1, -1, -1, -1, -3, -1, -1, -1, -1, -3, | |
}; | |
private static Contribution2[][] contributions2D; | |
private static Contribution3[][] contributions3D; | |
private static Contribution4[][] contributions4D; | |
static OpenSimplexNoise() | |
{ | |
var base2D = new int[][] | |
{ | |
new int[] { 1, 1, 0, 1, 0, 1, 0, 0, 0 }, | |
new int[] { 1, 1, 0, 1, 0, 1, 2, 1, 1 } | |
}; | |
var permutations2D = new int[][] | |
{ | |
new int[] { 0, 0, 1, -1, 0, -1, 1, 2, 1, 1 }, | |
new int[] { 1, 2, 2, 0, 2, 0, 2, 0, 0, 0 } | |
}; | |
contributions2D = new Contribution2[base2D.Length][]; | |
for (int i = 0; i < base2D.Length; i++) | |
{ | |
var permutations = permutations2D[i]; | |
var set = base2D[permutations[0]]; | |
var contributions = new Contribution2[permutations.Length / 3]; | |
for (int j = 1; j < permutations.Length; j += 3) | |
{ | |
Contribution2 previous = null, current = null; | |
for (int k = 0; k < set.Length; k += 3) | |
{ | |
current = new Contribution2(set[k], set[k + 1], set[k + 2]); | |
if (previous == null) | |
{ | |
contributions[j / 3] = current; | |
} | |
else | |
{ | |
previous.Next = current; | |
} | |
previous = current; | |
} | |
current.Next = new Contribution2(permutations[j], permutations[j + 1], permutations[j + 2]); | |
} | |
contributions2D[i] = contributions; | |
} | |
var base3D = new int[][] | |
{ | |
new int[] { 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1 }, | |
new int[] { 2, 1, 1, 0, 2, 1, 0, 1, 2, 0, 1, 1, 3, 1, 1, 1 }, | |
new int[] { 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 2, 1, 1, 0, 2, 1, 0, 1, 2, 0, 1, 1 } | |
}; | |
var permutations3D = new int[][] | |
{ | |
new int[] { 0 ,0, -1, 0, 0, 0, 0, -1, -1, 0, 1, -1, 0, 0, 1, 0, -1, 0, -1, 1, 0, 0, 0, 1, -1, 0, 1, 1, 0, 0, 1, 1, -1, 0, -1, 0, 1, 0, 0, -1, 1, 0, 1, -1, 1, 0, 1, 0, 1, 0, -1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1 }, | |
new int[] { 0 ,2, 0, 0, 0, 1, -1, -1, -1, 2, 1, 0, 0, 1, 1, -1, -1, 2, 0, 1, 0, 1, -1, 1, -1, 2, 1, 1, 0, 1, 1, 1, -1, 2, 0, 0, 1, 1, -1, -1, 1, 2, 1, 0, 1, 1, 1, -1, 1, 2, 0, 1, 1, 1, -1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1 }, | |
new int[] { 1 ,3, 0, 0, 0, 3, 0, 0, 0, 3, 2, 0, 0, 3, 1, 0, 0, 3, 0, 2, 0, 3, 0, 1, 0, 3, 2, 1, 0, 3, 1, 2, 0, 3, 0, 0, 1, 3, 0, 0, 2, 3, 2, 0, 1, 3, 1, 0, 2, 3, 0, 2, 1, 3, 0, 1, 2, 3, 2, 1, 1, 3, 1, 2, 2 }, | |
new int[] { 1 ,1, 0, 0, 0, 2, 0, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0, 1, 0, 1, 0, 2, 0, 2, 0, 1, 1, 1, 0, 2, 2, 2, 0, 1, 0, 0, 1, 2, 0, 0, 2, 1, 1, 0, 1, 2, 2, 0, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2 }, | |
new int[] { 2 ,0, 0, 0, 0, 1, -1, 1, 1, 0, 0, 0, 0, 1, 1, -1, 1, 0, 0, 0, 0, 1, -1, 1, 1, 0, 0, 0, 0, 1, 1, 1, -1, 3, 1, 1, 1, 2, 0, 0, 2, 3, 1, 1, 1, 2, 2, 0, 0, 3, 1, 1, 1, 2, 0, 2, 0, 3, 1, 1, 1, 2, 2, 0, 0 }, | |
new int[] { 2 ,1, -1, 1, 1, 2, 0, 0, 2, 1, -1, 1, 1, 2, 2, 0, 0, 1, -1, 1, 1, 2, 0, 2, 0, 1, -1, 1, 1, 2, 2, 0, 0, 1, 1, -1, 1, 2, 0, 0, 2, 1, 1, -1, 1, 2, 2, 0, 0, 1, 1, -1, 1, 2, 0, 2, 0, 1, 1, -1, 1, 2, 2, 0, 0, 1, -1, 1, 1, 2, 0, 0, 2, 1, -1, 1, 1, 2, 2, 0, 0, 1, -1, 1, 1, 2, 0, 2, 0, 1, -1, 1, 1, 2, 2, 0, 0, 1, 1, 1, -1, 2, 0, 0, 2, 1, 1, 1, -1, 2, 2, 0, 0, 1, 1, 1, -1, 2, 0, 2, 0, 1, 1, 1, -1, 2, 2, 0, 0 } | |
}; | |
contributions3D = new Contribution3[permutations3D.Length][]; | |
for (int i = 0; i < permutations3D.Length; i++) | |
{ | |
var permutations = permutations3D[i]; | |
var set = base3D[permutations[0]]; | |
var contributions = new Contribution3[permutations.Length / 8]; | |
for (int j = 1; j < permutations.Length; j += 8) | |
{ | |
Contribution3 previous = null, current = null; | |
for (int k = 0; k < set.Length; k += 4) | |
{ | |
current = new Contribution3(set[k], set[k + 1], set[k + 2], set[k + 3]); | |
if (previous == null) | |
{ | |
contributions[j / 8] = current; | |
} | |
else | |
{ | |
previous.Next = current; | |
} | |
previous = current; | |
} | |
current.Next = new Contribution3(permutations[j], permutations[j + 1], permutations[j + 2], permutations[j + 3]); | |
current.Next.Next = new Contribution3(permutations[j + 4], permutations[j + 5], permutations[j + 6], permutations[j + 7]); | |
} | |
contributions3D[i] = contributions; | |
} | |
var base4D = new int[][] | |
{ | |
new int[] { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1 }, | |
new int[] { 3, 1, 1, 1, 0, 3, 1, 1, 0, 1, 3, 1, 0, 1, 1, 3, 0, 1, 1, 1, 4, 1, 1, 1, 1 }, | |
new int[] { 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 2, 1, 1, 0, 0, 2, 1, 0, 1, 0, 2, 1, 0, 0, 1, 2, 0, 1, 1, 0, 2, 0, 1, 0, 1, 2, 0, 0, 1, 1 }, | |
new int[] { 3, 1, 1, 1, 0, 3, 1, 1, 0, 1, 3, 1, 0, 1, 1, 3, 0, 1, 1, 1, 2, 1, 1, 0, 0, 2, 1, 0, 1, 0, 2, 1, 0, 0, 1, 2, 0, 1, 1, 0, 2, 0, 1, 0, 1, 2, 0, 0, 1, 1 } | |
}; | |
var permutations4D = new int[][] | |
{ | |
new int[] { 0 ,0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, -1, 0, 1, -1, 0, 0, 0, 1, 0, -1, 0, 0, 1, 0, 0, -1, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, 0, 1, 1, -1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, -1, 0, -1, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0, 1, -1, 0, 1, -1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, -1, 0, -1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, -1, 0, -1, 0, 0, 1, 0, 0, -1, 0, 1, 0, 0, 0, -1, 1, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, 0, 1, 0, 0, 1, 0, -1, 1, 0, 1, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, -1, 0, 1, 1, 0, 0, -1, 1, 1, 0, 0, 0, 1, 1, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, -1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1 }, | |
new int[] { 0 ,2, 0, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 1, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 0, 1, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 1, 1, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 0, 0, 1, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 1, 0, 1, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 0, 1, 1, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 1, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 0, 1, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 1, 1, 0, 1, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 1, 0, 1, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 0, 1, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, | |
new int[] { 1 ,4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4, 2, 0, 0, 0, 4, 1, 0, 0, 0, 4, 1, 0, 0, 0, 4, 0, 2, 0, 0, 4, 0, 1, 0, 0, 4, 0, 1, 0, 0, 4, 2, 1, 0, 0, 4, 1, 2, 0, 0, 4, 1, 1, 0, 0, 4, 0, 0, 2, 0, 4, 0, 0, 1, 0, 4, 0, 0, 1, 0, 4, 2, 0, 1, 0, 4, 1, 0, 2, 0, 4, 1, 0, 1, 0, 4, 0, 2, 1, 0, 4, 0, 1, 2, 0, 4, 0, 1, 1, 0, 4, 2, 1, 1, 0, 4, 1, 2, 1, 0, 4, 1, 1, 2, 0, 4, 0, 0, 0, 1, 4, 0, 0, 0, 1, 4, 0, 0, 0, 2, 4, 2, 0, 0, 1, 4, 1, 0, 0, 1, 4, 1, 0, 0, 2, 4, 0, 2, 0, 1, 4, 0, 1, 0, 1, 4, 0, 1, 0, 2, 4, 2, 1, 0, 1, 4, 1, 2, 0, 1, 4, 1, 1, 0, 2, 4, 0, 0, 2, 1, 4, 0, 0, 1, 1, 4, 0, 0, 1, 2, 4, 2, 0, 1, 1, 4, 1, 0, 2, 1, 4, 1, 0, 1, 2, 4, 0, 2, 1, 1, 4, 0, 1, 2, 1, 4, 0, 1, 1, 2, 4, 2, 1, 1, 1, 4, 1, 2, 1, 1, 4, 1, 1, 2, 2 }, | |
new int[] { 1 ,2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 1, 0, 0, 0, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 0, 1, 0, 0, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, 1, 1, 0, 0, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, 0, 0, 1, 0, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, 1, 0, 1, 0, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, 0, 1, 1, 0, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, 1, 1, 1, 0, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, 0, 0, 0, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, 1, 0, 0, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, 0, 1, 0, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, 1, 1, 0, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, 0, 0, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, 1, 0, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, 0, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, 1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2 }, | |
new int[] { 2 ,3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 0, 0, 0, 2, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 0, 0, 0, 2, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 0, 0, 0, 2, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 0, 0, 0, 2, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 0, 0, 0, 2, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 0, 0, 0, 2, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 0, 0, 0, 2, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 0, 0, 0, 2, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 0, 0, 0, 2, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 0, 0, 0, 2, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 0, 0, 0, 2, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 0, 0, 0, 2, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 0, 0, 0, 2, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 0, 0, 0, 2, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 0, 0, 0, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 0, 0, 2, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 0, 2, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 0, 2, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 0, 2, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 0, 2, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 0, 2, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 0, 2, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 0, 2, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 0, 2, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 0, 2, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 0, 2, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 0, 2, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 0, 2, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 0, 2, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 0, 2, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 2, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 0, 0, 2, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 0, 0, 2, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 0, 0, 2, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 0, 0, 2, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 0, 0, 2, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 0, 0, 2, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 0, 0, 2, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 0, 0, 2, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 0, 0, 2, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 0, 0, 2, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 0, 0, 2, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 0, 0, 2, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 0, 0, 2, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 0, 0, 2, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 0, 2, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 0, 2, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 0, 2, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 0, 2, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 0, 2, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 0, 2, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 0, 2, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 0, 2, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 0, 2, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 0, 2, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 0, 2, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 0, 2, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 0, 2, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 0, 2, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 0, 2, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 2, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 0, 0, 0, 2, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 0, 0, 0, 2, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 0, 0, 0, 2, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 0, 0, 0, 2, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 0, 0, 0, 2, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 0, 0, 0, 2, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 0, 0, 0, 2, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 0, 0, 0, 2, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 0, 0, 0, 2, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 0, 0, 0, 2, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 0, 0, 0, 2, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 0, 0, 0, 2, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 0, 0, 0, 2, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 0, 0, 0, 2, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 0, 0, 0, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 0, 0, 2, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 0, 2, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 0, 2, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 0, 2, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 0, 2, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 0, 2, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 0, 2, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 0, 2, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 0, 2, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 0, 2, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 0, 2, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 0, 2, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 0, 2, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 0, 2, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 0, 2, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 2, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 0, 0, 2, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 0, 0, 2, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 0, 0, 2, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 0, 0, 2, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 0, 0, 2, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 0, 0, 2, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 0, 0, 2, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 0, 0, 2, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 0, 0, 2, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 0, 0, 2, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 0, 0, 2, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 0, 0, 2, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 0, 0, 2, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 0, 0, 2, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 0, 2, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 0, 2, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 0, 2, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 0, 2, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 0, 2, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 0, 2, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 0, 2, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 0, 2, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 0, 2, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 0, 2, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 0, 2, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 0, 2, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 0, 2, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 0, 2, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 0, 2, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 0, 2, 0, 0, 3, 0, 0, 0, 0, 2, -1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 0, 2, 1, 1, -1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 0, 2, -1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 0, 2, 1, -1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 0, 2, -1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 0, 2, 1, 1, 1, -1, 2, 2, 0, 0, 0, 3, 0, 0, 0, 1, 2, -1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 0, 1, 2, 1, -1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 0, 1, 2, -1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 0, 1, 2, 1, 1, -1, 1, 2, 2, 0, 0, 0, 3, 0, 0, 1, 1, 2, -1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 1, 2, 1, -1, 1, 1, 2, 2, 0, 0, 0, 3, 0, 1, 1, 1, 2, -1, 1, 1, 1, 2, 2, 0, 0, 0, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 0, 0, 0 }, | |
new int[] { 2 ,1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 0, 0, 0, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 0, 0, 0, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 0, 0, 0, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 0, 0, 0, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 0, 0, 0, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 0, 0, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 0, 0, 0, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 0, 0, 0, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 0, 0, 0, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }, | |
new int[] { 2 ,1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 0, 0, 0, 2, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 0, 0, 0, 2, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 0, 0, 0, 2, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 0, 0, 0, 2, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 0, 0, 0, 2, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 0, 0, 0, 2, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 0, 0, 0, 2, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 0, 0, 0, 2, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 0, 0, 0, 2, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 0, 0, 0, 2, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 0, 0, 0, 2, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 2, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 0, 2, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 0, 2, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 0, 2, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 0, 2, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 0, 2, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 0, 2, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 0, 2, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 0, 2, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 0, 2, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 0, 2, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 0, 2, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 0, 2, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 0, 2, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 0, 2, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 2, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 0, 0, 2, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 0, 0, 2, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 0, 0, 2, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 0, 0, 2, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 0, 0, 2, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 0, 0, 2, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 0, 0, 2, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 0, 0, 2, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 0, 0, 2, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 0, 0, 2, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 0, 0, 2, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 0, 0, 2, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 0, 0, 2, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 0, 0, 2, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 0, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 2, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 0, 2, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 0, 2, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 0, 2, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 0, 2, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 0, 2, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 0, 2, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 0, 2, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 0, 2, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 0, 2, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 0, 2, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 0, 2, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 0, 2, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 0, 2, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 0, 2, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 2, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 0, 0, 0, 2, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 0, 0, 0, 2, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 0, 0, 0, 2, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 0, 0, 0, 2, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 0, 0, 0, 2, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 0, 0, 0, 2, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 0, 0, 0, 2, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 0, 0, 0, 2, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 0, 0, 0, 2, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 0, 0, 0, 2, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 0, 0, 0, 2, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 2, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 0, 2, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 0, 2, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 0, 2, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 0, 2, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 0, 2, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 0, 2, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 0, 2, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 0, 2, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 0, 2, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 0, 2, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 0, 2, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 0, 2, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 0, 2, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 0, 2, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 2, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 0, 0, 2, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 0, 0, 2, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 0, 0, 2, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 0, 0, 2, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 0, 0, 2, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 0, 0, 2, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 0, 0, 2, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 0, 0, 2, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 0, 0, 2, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 0, 0, 2, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 0, 0, 2, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 0, 0, 2, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 0, 0, 2, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 0, 0, 2, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 0, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 2, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 0, 2, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 0, 2, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 0, 2, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 0, 2, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 0, 2, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 0, 2, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 0, 2, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 0, 2, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 0, 2, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 0, 2, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 0, 2, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 0, 2, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 0, 2, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 0, 2, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 0, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 2, 0, 0, 1, -1, 0, 0, 0, 1, 0, -1, -1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 0, 1, 1, 0, -1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 0, 1, 0, 1, -1, -1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 0, 1, 1, 1, 0, -1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 0, 1, 0, -1, 1, -1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 0, 1, 1, 0, 1, -1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 0, 1, 0, 1, 1, -1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, -1, 2, 2, 0, 0, 0, 1, -1, 0, 0, 1, 1, 0, -1, -1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 0, 1, 1, 1, 0, -1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 0, 1, 1, 0, 1, -1, 1, 2, 2, 0, 0, 0, 1, 1, 1, -1, 1, 1, 1, 1, 0, 1, 2, 2, 0, 0, 0, 1, -1, 0, 1, 1, 1, 0, -1, 1, 1, 2, 2, 0, 0, 0, 1, 1, -1, 1, 1, 1, 1, 0, 1, 1, 2, 2, 0, 0, 0, 1, -1, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0 }, | |
new int[] { 3 ,1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, -1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, -1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, -1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, -1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, -1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, -1, 1, 1, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 2, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 0, 1, 0, 2, 0, 0, 2, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1, 1, 0, 1, 0, 0, 2, 0, 2, 0, 0, 2, 1, 1, 1, -1, 1, 1, 0, 0, 0, 2, 2, 0, 0, 0, 2, 1, 1, 1, -1 }, | |
new int[] { 3 ,3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 1, 1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 4, 1, 1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 4, 1, 1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 4, 1, 1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 4, 1, 1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 4, 1, 1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 4, 1, 1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 4, 1, 1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 4, 1, 1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 4, 1, 1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 4, 1, 1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 4, 1, 1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 4, 1, 1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 4, 1, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 4, 1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 4, 1, 1, 1, 1 }, | |
new int[] { 3 ,3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, 1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, -1, 1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, -1, 1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, 1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, -1, 1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, -1, 1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, -1, 1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, -1, 1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, -1, 1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, -1, 1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, -1, 1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, -1, 1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, -1, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, -1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, -1, 1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 1, -1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, 1, -1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, 1, -1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, 1, -1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, 1, -1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, 1, -1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, 1, -1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, 1, -1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, 1, -1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, 1, -1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, 1, -1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, 1, -1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, 1, -1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, 1, -1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1, -1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, 1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, -1, 1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, -1, 1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, 1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, -1, 1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, -1, 1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, -1, 1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, -1, 1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, -1, 1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, -1, 1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, -1, 1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, -1, 1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, -1, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, -1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, -1, 1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 1, 1, -1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, 1, -1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, 1, 1, -1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, 1, 1, -1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, 1, 1, -1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, 1, 1, -1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, 1, 1, -1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, 1, 1, -1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, 1, 1, -1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, 1, 1, -1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, 1, 1, -1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, 1, 1, -1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, 1, 1, -1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, 1, 1, -1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, 1, 1, -1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1, 1, -1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, 1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, -1, 1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, -1, 1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, 1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, -1, 1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, -1, 1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, -1, 1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, -1, 1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, -1, 1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, -1, 1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, -1, 1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, -1, 1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, -1, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, -1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, -1, 1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 1, -1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, 1, -1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, 1, -1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, 1, -1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, 1, -1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, 1, -1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, 1, -1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, 1, -1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, 1, -1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, 1, -1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, 1, -1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, 1, -1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, 1, -1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, 1, -1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1, -1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, 1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, -1, 1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, -1, 1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, 1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, -1, 1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, -1, 1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, -1, 1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, -1, 1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, -1, 1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, -1, 1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, -1, 1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, -1, 1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, -1, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, -1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, -1, 1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 1, 1, 1, -1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, 1, 1, -1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, 1, 1, 1, -1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, 1, 1, 1, -1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, 1, 1, 1, -1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, 1, 1, 1, -1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, 1, 1, 1, -1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, 1, 1, 1, -1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, 1, 1, 1, -1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, 1, 1, 1, -1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, 1, 1, 1, -1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, 1, 1, 1, -1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, 1, 1, 1, -1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, 1, 1, 1, -1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, 1, 1, 1, -1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1, 1, 1, -1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, 1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, -1, 1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, -1, 1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, 1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, -1, 1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, -1, 1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, -1, 1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, -1, 1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, -1, 1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, -1, 1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, -1, 1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, -1, 1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, -1, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, -1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, -1, 1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 1, -1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, 1, -1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, 1, -1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, 1, -1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, 1, -1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, 1, -1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, 1, -1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, 1, -1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, 1, -1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, 1, -1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, 1, -1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, 1, -1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, 1, -1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, 1, -1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1, -1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, 1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, -1, 1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, -1, 1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, 1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, -1, 1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, -1, 1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, -1, 1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, -1, 1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, -1, 1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, -1, 1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, -1, 1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, -1, 1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, -1, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, -1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, -1, 1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 1, 1, -1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, 1, -1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, 1, 1, -1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, 1, 1, -1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, 1, 1, -1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, 1, 1, -1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, 1, 1, -1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, 1, 1, -1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, 1, 1, -1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, 1, 1, -1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, 1, 1, -1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, 1, 1, -1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, 1, 1, -1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, 1, 1, -1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, 1, 1, -1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1, 1, -1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, 1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, -1, 1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, -1, 1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, 1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, -1, 1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, -1, 1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, -1, 1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, -1, 1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, -1, 1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, -1, 1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, -1, 1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, -1, 1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, -1, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, -1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, -1, 1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 1, -1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, -1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, 1, -1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, 1, -1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, 1, -1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, 1, -1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, 1, -1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, 1, -1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, 1, -1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, 1, -1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, 1, -1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, 1, -1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, 1, -1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, 1, -1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, 1, -1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1, -1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, -1, 1, 1, 1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, -1, 1, 1, 1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, -1, 1, 1, 1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, -1, 1, 1, 1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, -1, 1, 1, 1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, -1, 1, 1, 1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, -1, 1, 1, 1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, -1, 1, 1, 1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, -1, 1, 1, 1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, -1, 1, 1, 1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, -1, 1, 1, 1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, -1, 1, 1, 1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, -1, 1, 1, 1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, -1, 1, 1, 1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, -1, 1, 1, 1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, -1, 1, 1, 1, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 1, 1, 1, -1, 3, 2, 0, 0, 0, 3, 1, 0, 0, 0, 2, 1, 1, 1, -1, 3, 0, 2, 0, 0, 3, 0, 1, 0, 0, 2, 1, 1, 1, -1, 3, 2, 1, 0, 0, 3, 1, 2, 0, 0, 2, 1, 1, 1, -1, 3, 0, 0, 2, 0, 3, 0, 0, 1, 0, 2, 1, 1, 1, -1, 3, 2, 0, 1, 0, 3, 1, 0, 2, 0, 2, 1, 1, 1, -1, 3, 0, 2, 1, 0, 3, 0, 1, 2, 0, 2, 1, 1, 1, -1, 3, 2, 1, 1, 0, 3, 1, 2, 2, 0, 2, 1, 1, 1, -1, 3, 0, 0, 0, 1, 3, 0, 0, 0, 2, 2, 1, 1, 1, -1, 3, 2, 0, 0, 1, 3, 1, 0, 0, 2, 2, 1, 1, 1, -1, 3, 0, 2, 0, 1, 3, 0, 1, 0, 2, 2, 1, 1, 1, -1, 3, 2, 1, 0, 1, 3, 1, 2, 0, 2, 2, 1, 1, 1, -1, 3, 0, 0, 2, 1, 3, 0, 0, 1, 2, 2, 1, 1, 1, -1, 3, 2, 0, 1, 1, 3, 1, 0, 2, 2, 2, 1, 1, 1, -1, 3, 0, 2, 1, 1, 3, 0, 1, 2, 2, 2, 1, 1, 1, -1, 3, 2, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1, 1, 1, -1 } | |
}; | |
contributions4D = new Contribution4[permutations4D.Length][]; | |
for (int i = 0; i < permutations4D.Length; i++) | |
{ | |
var permutations = permutations4D[i]; | |
var set = base4D[permutations[0]]; | |
var contributions = new Contribution4[permutations.Length / 15]; | |
for (int j = 1; j < permutations.Length; j += 15) | |
{ | |
Contribution4 previous = null, current = null; | |
for (int k = 0; k < set.Length; k += 5) | |
{ | |
current = new Contribution4(set[k], set[k + 1], set[k + 2], set[k + 3], set[k + 4]); | |
if (previous == null) | |
{ | |
contributions[j / 15] = current; | |
} | |
else | |
{ | |
previous.Next = current; | |
} | |
previous = current; | |
} | |
current.Next = new Contribution4(permutations[j], permutations[j + 1], permutations[j + 2], permutations[j + 3], permutations[j + 4]); | |
current.Next.Next = new Contribution4(permutations[j + 5], permutations[j + 6], permutations[j + 7], permutations[j + 8], permutations[j + 9]); | |
current.Next.Next.Next = new Contribution4(permutations[j + 10], permutations[j + 11], permutations[j + 12], permutations[j + 13], permutations[j + 14]); | |
} | |
contributions4D[i] = contributions; | |
} | |
} | |
[MethodImpl(MethodImplOptions.AggressiveInlining)] | |
private static int FastFloor(double x) | |
{ | |
var xi = (int)x; | |
return x < xi ? xi - 1 : xi; | |
} | |
public OpenSimplexNoise() | |
: this(DateTime.Now.Ticks) | |
{ | |
} | |
public OpenSimplexNoise(long seed) | |
{ | |
perm = new byte[256]; | |
perm2D = new byte[256]; | |
perm3D = new byte[256]; | |
perm4D = new byte[256]; | |
var source = new byte[256]; | |
for (int i = 0; i < 256; i++) | |
{ | |
source[i] = (byte)i; | |
} | |
seed = seed * 6364136223846793005L + 1442695040888963407L; | |
seed = seed * 6364136223846793005L + 1442695040888963407L; | |
seed = seed * 6364136223846793005L + 1442695040888963407L; | |
for (int i = 255; i >= 0; i--) | |
{ | |
seed = seed * 6364136223846793005L + 1442695040888963407L; | |
int r = (int)((seed + 31) % (i + 1)); | |
if (r < 0) | |
{ | |
r += (i + 1); | |
} | |
perm[i] = source[r]; | |
perm2D[i] = (byte)(perm[i] & 0x0E); | |
perm3D[i] = (byte)((perm[i] % 24) * 3); | |
perm4D[i] = (byte)(perm[i] & 0xFC); | |
source[r] = source[i]; | |
} | |
} | |
public double Evaluate(double x, double y) | |
{ | |
var stretchOffset = (x + y) * STRETCH_2D; | |
var xs = x + stretchOffset; | |
var ys = y + stretchOffset; | |
var xsb = FastFloor(xs); | |
var ysb = FastFloor(ys); | |
var squishOffset = (xsb + ysb) * SQUISH_2D; | |
var xb = xsb + squishOffset; | |
var yb = ysb + squishOffset; | |
var dx0 = x - xb; | |
var dy0 = y - yb; | |
var xins = xs - xsb; | |
var yins = ys - ysb; | |
Contribution2 c; | |
var inSum = xins + yins; | |
if (inSum <= 1) | |
{ | |
var zins = 1 - inSum; | |
if (zins > xins || zins > yins) | |
{ | |
if (xins > yins) | |
{ | |
c = contributions2D[0][0]; | |
} | |
else | |
{ | |
c = contributions2D[0][1]; | |
} | |
} | |
else | |
{ | |
c = contributions2D[0][2]; | |
} | |
} | |
else | |
{ | |
var zins = 2 - inSum; | |
if (zins < xins || zins < yins) | |
{ | |
if (xins > yins) | |
{ | |
c = contributions2D[1][0]; | |
} | |
else | |
{ | |
c = contributions2D[1][1]; | |
} | |
} | |
else | |
{ | |
c = contributions2D[1][2]; | |
} | |
} | |
var value = 0.0; | |
while (c != null) | |
{ | |
var dx = dx0 + c.dx; | |
var dy = dy0 + c.dy; | |
var attn = 2 - dx * dx - dy * dy; | |
if (attn > 0) | |
{ | |
var px = xsb + c.xsb; | |
var py = ysb + c.ysb; | |
var i = perm2D[(perm[px & 0xFF] + py) & 0xFF]; | |
var valuePart = gradients2D[i] * dx + gradients2D[i + 1] * dy; | |
attn *= attn; | |
value += attn * attn * valuePart; | |
} | |
c = c.Next; | |
} | |
return value * NORM_2D; | |
} | |
public double Evaluate(double x, double y, double z) | |
{ | |
var stretchOffset = (x + y + z) * STRETCH_3D; | |
var xs = x + stretchOffset; | |
var ys = y + stretchOffset; | |
var zs = z + stretchOffset; | |
var xsb = FastFloor(xs); | |
var ysb = FastFloor(ys); | |
var zsb = FastFloor(zs); | |
var squishOffset = (xsb + ysb + zsb) * SQUISH_3D; | |
var xb = xsb + squishOffset; | |
var yb = ysb + squishOffset; | |
var zb = zsb + squishOffset; | |
var dx0 = x - xb; | |
var dy0 = y - yb; | |
var dz0 = z - zb; | |
var xins = xs - xsb; | |
var yins = ys - ysb; | |
var zins = zs - zsb; | |
Contribution3 c; | |
var inSum = xins + yins + zins; | |
if (inSum <= 1) | |
{ | |
var aPoint = 0x01; | |
var aScore = xins; | |
var bPoint = 0x02; | |
var bScore = yins; | |
if (aScore >= bScore && zins > bScore) | |
{ | |
bScore = zins; | |
bPoint = 0x04; | |
} | |
else if (aScore < bScore && zins > aScore) | |
{ | |
aScore = zins; | |
aPoint = 0x04; | |
} | |
var wins = 1 - inSum; | |
if (wins > aScore || wins > bScore) | |
{ | |
c = contributions3D[0][bScore > aScore ? bPoint : aPoint]; | |
} | |
else | |
{ | |
c = contributions3D[1][aPoint | bPoint]; | |
} | |
} | |
else if (inSum >= 2) | |
{ | |
var aPoint = 0x06; | |
var aScore = xins; | |
var bPoint = 0x05; | |
var bScore = yins; | |
if (aScore <= bScore && zins < bScore) | |
{ | |
bScore = zins; | |
bPoint = 0x03; | |
} | |
else if (aScore > bScore && zins < aScore) | |
{ | |
aScore = zins; | |
aPoint = 0x03; | |
} | |
var wins = 3 - inSum; | |
if (wins < aScore || wins < bScore) | |
{ | |
c = contributions3D[2][bScore < aScore ? bPoint : aPoint]; | |
} | |
else | |
{ | |
c = contributions3D[3][aPoint & bPoint]; | |
} | |
} | |
else | |
{ | |
byte aPoint; | |
bool aIsFurtherSide; | |
byte bPoint; | |
bool bIsFurtherSide; | |
var p1 = xins + yins; | |
if (p1 > 1) | |
{ | |
p1 = p1 - 1; | |
aPoint = 0x03; | |
aIsFurtherSide = true; | |
} | |
else | |
{ | |
p1 = 1 - p1; | |
aPoint = 0x04; | |
aIsFurtherSide = false; | |
} | |
var p2 = xins + zins; | |
if (p2 > 1) | |
{ | |
p2 = p2 - 1; | |
bPoint = 0x05; | |
bIsFurtherSide = true; | |
} | |
else | |
{ | |
p2 = 1 - p2; | |
bPoint = 0x02; | |
bIsFurtherSide = false; | |
} | |
var p3 = yins + zins; | |
if (p3 > 1) | |
{ | |
p3 = p3 - 1; | |
if (p1 <= p2 && p1 < p3) | |
{ | |
aPoint = 0x06; | |
aIsFurtherSide = true; | |
} | |
else if (p1 > p2 && p2 < p3) | |
{ | |
bPoint = 0x06; | |
bIsFurtherSide = true; | |
} | |
} | |
else | |
{ | |
p3 = 1 - p3; | |
if (p1 <= p2 && p1 < p3) | |
{ | |
aPoint = 0x01; | |
aIsFurtherSide = false; | |
} | |
else if (p1 > p2 && p2 < p3) | |
{ | |
bPoint = 0x01; | |
bIsFurtherSide = false; | |
} | |
} | |
if (aIsFurtherSide == bIsFurtherSide) | |
{ | |
c = contributions3D[4][aIsFurtherSide ? ((aPoint & bPoint) & 0x03) | 0x4 : (aPoint | bPoint) & 0x03]; | |
} | |
else | |
{ | |
if (aIsFurtherSide) | |
{ | |
c = contributions3D[5][((aPoint & 0x03) << 2) | (bPoint & 0x03)]; | |
} | |
else | |
{ | |
c = contributions3D[5][((bPoint & 0x03) << 2) | (aPoint & 0x03)]; | |
} | |
} | |
} | |
var value = 0.0; | |
while (c != null) | |
{ | |
var dx = dx0 + c.dx; | |
var dy = dy0 + c.dy; | |
var dz = dz0 + c.dz; | |
var attn = 2 - dx * dx - dy * dy - dz * dz; | |
if (attn > 0) | |
{ | |
var px = xsb + c.xsb; | |
var py = ysb + c.ysb; | |
var pz = zsb + c.zsb; | |
var i = perm3D[(perm[(perm[px & 0xFF] + py) & 0xFF] + pz) & 0xFF]; | |
var valuePart = gradients3D[i] * dx + gradients3D[i + 1] * dy + gradients3D[i + 2] * dz; | |
attn *= attn; | |
value += attn * attn * valuePart; | |
} | |
c = c.Next; | |
} | |
return value * NORM_3D; | |
} | |
public double Evaluate(double x, double y, double z, double w) | |
{ | |
var stretchOffset = (x + y + z + w) * STRETCH_4D; | |
var xs = x + stretchOffset; | |
var ys = y + stretchOffset; | |
var zs = z + stretchOffset; | |
var ws = w + stretchOffset; | |
var xsb = FastFloor(xs); | |
var ysb = FastFloor(ys); | |
var zsb = FastFloor(zs); | |
var wsb = FastFloor(ws); | |
var squishOffset = (xsb + ysb + zsb + wsb) * SQUISH_4D; | |
var xb = xsb + squishOffset; | |
var yb = ysb + squishOffset; | |
var zb = zsb + squishOffset; | |
var wb = wsb + squishOffset; | |
var dx0 = x - xb; | |
var dy0 = y - yb; | |
var dz0 = z - zb; | |
var dw0 = w - wb; | |
var xins = xs - xsb; | |
var yins = ys - ysb; | |
var zins = zs - zsb; | |
var wins = ws - wsb; | |
double aScore, bScore; | |
int aPoint, bPoint; | |
Contribution4 c; | |
var inSum = xins + yins + zins + wins; | |
if (inSum <= 1) | |
{ | |
aPoint = 0x01; | |
aScore = xins; | |
bPoint = 0x02; | |
bScore = yins; | |
if (aScore >= bScore && zins > bScore) | |
{ | |
bScore = zins; | |
bPoint = 0x04; | |
} | |
else if (aScore < bScore && zins > aScore) | |
{ | |
aScore = zins; | |
aPoint = 0x04; | |
} | |
if (aScore >= bScore && wins > bScore) | |
{ | |
bScore = wins; | |
bPoint = 0x08; | |
} | |
else if (aScore < bScore && wins > aScore) | |
{ | |
aScore = wins; | |
aPoint = 0x08; | |
} | |
var uins = 1 - inSum; | |
if (uins > aScore || uins > bScore) | |
{ | |
c = contributions4D[0][bScore > aScore ? bPoint : aPoint]; | |
} | |
else | |
{ | |
c = contributions4D[1][aPoint | bPoint]; | |
} | |
} | |
else if (inSum >= 3) | |
{ | |
aPoint = 0x0E; | |
aScore = xins; | |
bPoint = 0x0D; | |
bScore = yins; | |
if (aScore <= bScore && zins < bScore) | |
{ | |
bScore = zins; | |
bPoint = 0x0B; | |
} | |
else if (aScore > bScore && zins < aScore) | |
{ | |
aScore = zins; | |
aPoint = 0x0B; | |
} | |
if (aScore <= bScore && wins < bScore) | |
{ | |
bScore = wins; | |
bPoint = 0x07; | |
} | |
else if (aScore > bScore && wins < aScore) | |
{ | |
aScore = wins; | |
aPoint = 0x07; | |
} | |
var uins = 4 - inSum; | |
if (uins < aScore || uins < bScore) | |
{ | |
c = contributions4D[2][bScore < aScore ? bPoint : aPoint]; | |
} | |
else | |
{ | |
c = contributions4D[3][aPoint & bPoint]; | |
} | |
} | |
else if (inSum <= 2) | |
{ | |
var aIsBiggerSide = true; | |
var bIsBiggerSide = true; | |
if (xins + yins > zins + wins) | |
{ | |
aScore = xins + yins; | |
aPoint = 0x03; | |
} | |
else | |
{ | |
aScore = zins + wins; | |
aPoint = 0x0C; | |
} | |
if (xins + zins > yins + wins) | |
{ | |
bScore = xins + zins; | |
bPoint = 0x05; | |
} | |
else | |
{ | |
bScore = yins + wins; | |
bPoint = 0x0A; | |
} | |
if (xins + wins > yins + zins) | |
{ | |
var score = xins + wins; | |
if (aScore >= bScore && score > bScore) | |
{ | |
bScore = score; | |
bPoint = 0x09; | |
} | |
else if (aScore < bScore && score > aScore) | |
{ | |
aScore = score; | |
aPoint = 0x09; | |
} | |
} | |
else | |
{ | |
var score = yins + zins; | |
if (aScore >= bScore && score > bScore) | |
{ | |
bScore = score; | |
bPoint = 0x06; | |
} | |
else if (aScore < bScore && score > aScore) | |
{ | |
aScore = score; | |
aPoint = 0x06; | |
} | |
} | |
var p1 = 2 - inSum + xins; | |
if (aScore >= bScore && p1 > bScore) | |
{ | |
bScore = p1; | |
bPoint = 0x01; | |
bIsBiggerSide = false; | |
} | |
else if (aScore < bScore && p1 > aScore) | |
{ | |
aScore = p1; | |
aPoint = 0x01; | |
aIsBiggerSide = false; | |
} | |
var p2 = 2 - inSum + yins; | |
if (aScore >= bScore && p2 > bScore) | |
{ | |
bScore = p2; | |
bPoint = 0x02; | |
bIsBiggerSide = false; | |
} | |
else if (aScore < bScore && p2 > aScore) | |
{ | |
aScore = p2; | |
aPoint = 0x02; | |
aIsBiggerSide = false; | |
} | |
var p3 = 2 - inSum + zins; | |
if (aScore >= bScore && p3 > bScore) | |
{ | |
bScore = p3; | |
bPoint = 0x04; | |
bIsBiggerSide = false; | |
} | |
else if (aScore < bScore && p3 > aScore) | |
{ | |
aScore = p3; | |
aPoint = 0x04; | |
aIsBiggerSide = false; | |
} | |
var p4 = 2 - inSum + wins; | |
if (aScore >= bScore && p4 > bScore) | |
{ | |
bScore = p4; | |
bPoint = 0x08; | |
bIsBiggerSide = false; | |
} | |
else if (aScore < bScore && p4 > aScore) | |
{ | |
aScore = p4; | |
aPoint = 0x08; | |
aIsBiggerSide = false; | |
} | |
if (aIsBiggerSide == bIsBiggerSide) | |
{ | |
if (aIsBiggerSide) | |
{ | |
c = contributions4D[4][((aPoint | bPoint) & 0x0F) | ((aPoint & bPoint) << 4)]; | |
} | |
else | |
{ | |
c = contributions4D[5][aPoint | bPoint]; | |
} | |
} | |
else | |
{ | |
if (aIsBiggerSide) | |
{ | |
c = contributions4D[6][(aPoint & 0x0F) | (bPoint << 4)]; | |
} | |
else | |
{ | |
c = contributions4D[6][(bPoint & 0x0F) | (aPoint << 4)]; | |
} | |
} | |
} | |
else | |
{ | |
var aIsBiggerSide = true; | |
var bIsBiggerSide = true; | |
if (xins + yins < zins + wins) | |
{ | |
aScore = xins + yins; | |
aPoint = 0x0C; | |
} | |
else | |
{ | |
aScore = zins + wins; | |
aPoint = 0x03; | |
} | |
if (xins + zins < yins + wins) | |
{ | |
bScore = xins + zins; | |
bPoint = 0x0A; | |
} | |
else | |
{ | |
bScore = yins + wins; | |
bPoint = 0x05; | |
} | |
if (xins + wins < yins + zins) | |
{ | |
var score = xins + wins; | |
if (aScore <= bScore && score < bScore) | |
{ | |
bScore = score; | |
bPoint = 0x06; | |
} | |
else if (aScore > bScore && score < aScore) | |
{ | |
aScore = score; | |
aPoint = 0x06; | |
} | |
} | |
else | |
{ | |
var score = yins + zins; | |
if (aScore <= bScore && score < bScore) | |
{ | |
bScore = score; | |
bPoint = 0x09; | |
} | |
else if (aScore > bScore && score < aScore) | |
{ | |
aScore = score; | |
aPoint = 0x09; | |
} | |
} | |
var p1 = 3 - inSum + xins; | |
if (aScore <= bScore && p1 < bScore) | |
{ | |
bScore = p1; | |
bPoint = 0x0E; | |
bIsBiggerSide = false; | |
} | |
else if (aScore > bScore && p1 < aScore) | |
{ | |
aScore = p1; | |
aPoint = 0x0E; | |
aIsBiggerSide = false; | |
} | |
var p2 = 3 - inSum + yins; | |
if (aScore <= bScore && p2 < bScore) | |
{ | |
bScore = p2; | |
bPoint = 0x0D; | |
bIsBiggerSide = false; | |
} | |
else if (aScore > bScore && p2 < aScore) | |
{ | |
aScore = p2; | |
aPoint = 0x0D; | |
aIsBiggerSide = false; | |
} | |
var p3 = 3 - inSum + zins; | |
if (aScore <= bScore && p3 < bScore) | |
{ | |
bScore = p3; | |
bPoint = 0x0B; | |
bIsBiggerSide = false; | |
} | |
else if (aScore > bScore && p3 < aScore) | |
{ | |
aScore = p3; | |
aPoint = 0x0B; | |
aIsBiggerSide = false; | |
} | |
var p4 = 3 - inSum + wins; | |
if (aScore <= bScore && p4 < bScore) | |
{ | |
bScore = p4; | |
bPoint = 0x07; | |
bIsBiggerSide = false; | |
} | |
else if (aScore > bScore && p4 < aScore) | |
{ | |
aScore = p4; | |
aPoint = 0x07; | |
aIsBiggerSide = false; | |
} | |
if (aIsBiggerSide == bIsBiggerSide) | |
{ | |
if (aIsBiggerSide) | |
{ | |
c = contributions4D[7][((aPoint & bPoint) & 0x0F) | ((aPoint | bPoint) << 4)]; | |
} | |
else | |
{ | |
c = contributions4D[8][aPoint & bPoint]; | |
} | |
} | |
else | |
{ | |
if (aIsBiggerSide) | |
{ | |
c = contributions4D[9][(aPoint & 0x0F) | (bPoint << 4)]; | |
} | |
else | |
{ | |
c = contributions4D[9][(bPoint & 0x0F) | (aPoint << 4)]; | |
} | |
} | |
} | |
var value = 0.0; | |
while (c != null) | |
{ | |
var dx = dx0 + c.dx; | |
var dy = dy0 + c.dy; | |
var dz = dz0 + c.dz; | |
var dw = dw0 + c.dw; | |
var attn = 2 - dx * dx - dy * dy - dz * dz - dw * dw; | |
if (attn > 0) | |
{ | |
var px = xsb + c.xsb; | |
var py = ysb + c.ysb; | |
var pz = zsb + c.zsb; | |
var pw = wsb + c.wsb; | |
var i = perm4D[(perm[(perm[(perm[px & 0xFF] + py) & 0xFF] + pz) & 0xFF] + pw) & 0xFF]; | |
var valuePart = gradients4D[i] * dx + gradients4D[i + 1] * dy + gradients4D[i + 2] * dz + gradients4D[i + 3] * dw; | |
attn *= attn; | |
value += attn * attn * valuePart; | |
} | |
c = c.Next; | |
} | |
return value * NORM_4D; | |
} | |
private class Contribution2 | |
{ | |
public double dx, dy; | |
public int xsb, ysb; | |
public Contribution2 Next; | |
public Contribution2(double multiplier, int xsb, int ysb) | |
{ | |
dx = -xsb - multiplier * SQUISH_2D; | |
dy = -ysb - multiplier * SQUISH_2D; | |
this.xsb = xsb; | |
this.ysb = ysb; | |
} | |
} | |
private class Contribution3 | |
{ | |
public double dx, dy, dz; | |
public int xsb, ysb, zsb; | |
public Contribution3 Next; | |
public Contribution3(double multiplier, int xsb, int ysb, int zsb) | |
{ | |
dx = -xsb - multiplier * SQUISH_3D; | |
dy = -ysb - multiplier * SQUISH_3D; | |
dz = -zsb - multiplier * SQUISH_3D; | |
this.xsb = xsb; | |
this.ysb = ysb; | |
this.zsb = zsb; | |
} | |
} | |
private class Contribution4 | |
{ | |
public double dx, dy, dz, dw; | |
public int xsb, ysb, zsb, wsb; | |
public Contribution4 Next; | |
public Contribution4(double multiplier, int xsb, int ysb, int zsb, int wsb) | |
{ | |
dx = -xsb - multiplier * SQUISH_4D; | |
dy = -ysb - multiplier * SQUISH_4D; | |
dz = -zsb - multiplier * SQUISH_4D; | |
dw = -wsb - multiplier * SQUISH_4D; | |
this.xsb = xsb; | |
this.ysb = ysb; | |
this.zsb = zsb; | |
this.wsb = wsb; | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment